Deploy MinIO: Single-Node Multi-Drive
Table of Contents
The procedures on this page cover deploying MinIO in a Single-Node Multi-Drive (SNMD) configuration. SNMD deployments provide drive-level reliability and failover/recovery with performance and scaling limitations imposed by the single node.
For production environments, MinIO strongly recommends using the MinIO Kubernetes Operator to deploy Multi-Node Multi-Drive (MNMD) or “Distributed” Tenants.
Prerequisites
Local JBOD Storage with Sequential Mounts
MinIO strongly recommends direct-attached JBOD arrays with XFS-formatted disks for best performance. Using any other type of backing storage (SAN/NAS, ext4, RAID, LVM) typically results in a reduction in performance, reliability, predictability, and consistency.
Ensure all server drives for which you intend MinIO to use are of the same type (NVMe, SSD, or HDD) with identical capacity (e.g. 12
TB).
MinIO does not distinguish drive types and does not benefit from mixed storage types.
Additionally. MinIO limits the size used per drive to the smallest drive in the deployment.
For example, if the deployment has 15 10TB drives and 1 1TB drive, MinIO limits the per-drive capacity to 1TB.
MinIO requires using expansion notation {x...y}
to denote a sequential series of drives when creating the new deployment, where all nodes in the deployment have an identical set of mounted drives.
MinIO also requires that the ordering of physical drives remain constant across restarts, such that a given mount point always points to the same formatted drive.
MinIO therefore strongly recommends using /etc/fstab
or a similar file-based mount configuration to ensure that drive ordering cannot change after a reboot.
For example:
$ mkfs.xfs /dev/sdb -L DISK1
$ mkfs.xfs /dev/sdc -L DISK2
$ mkfs.xfs /dev/sdd -L DISK3
$ mkfs.xfs /dev/sde -L DISK4
$ nano /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
LABEL=DISK1 /mnt/disk1 xfs defaults,noatime 0 2
LABEL=DISK2 /mnt/disk2 xfs defaults,noatime 0 2
LABEL=DISK3 /mnt/disk3 xfs defaults,noatime 0 2
LABEL=DISK4 /mnt/disk4 xfs defaults,noatime 0 2
You can then specify the entire range of drives using the expansion notation /mnt/disk{1...4}
.
If you want to use a specific subfolder on each drive, specify it as /mnt/disk{1...4}/minio
.
MinIO does not support arbitrary migration of a drive with existing MinIO data to a new mount position, whether intentional or as the result of OS-level behavior.
Network File System Volumes Break Consistency Guarantees
MinIO’s strict read-after-write and list-after-write consistency model requires local drive filesystems.
MinIO cannot provide consistency guarantees if the underlying storage volumes are NFS or a similar network-attached storage volume.
For deployments that require using network-attached storage, use NFSv4 for best results.
Deploy Single-Node Multi-Drive MinIO
The following procedure deploys MinIO consisting of a single MinIO server and a multiple drives or storage volumes.
1) Pull the Latest Stable Image of MinIO
Select the tab for either Podman or Docker to see instructions for pulling the MinIO container image. The instructions include examples for both quay.io and DockerHub:
- quay.io
podman pull quay.io/minio/minio
- DockerHub
podman pull docker://minio/minio
- quay.io
docker pull quay.io/minio/minio
- DockerHub
docker pull docker://minio/minio
2) Create the Environment Variable File
Create an environment variable file at /etc/default/minio
.
For Windows hosts, specify a Windows-style path similar to C:\minio\config
.
The MinIO Server container can use this file as the source of all environment variables.
The following example provides a starting environment file:
# MINIO_ROOT_USER and MINIO_ROOT_PASSWORD sets the root account for the MinIO server.
# This user has unrestricted permissions to perform S3 and administrative API operations on any resource in the deployment.
# Omit to use the default values 'minioadmin:minioadmin'.
# MinIO recommends setting non-default values as a best practice, regardless of environment.
MINIO_ROOT_USER=myminioadmin
MINIO_ROOT_PASSWORD=minio-secret-key-change-me
# MINIO_VOLUMES sets the storage volumes or paths to use for the MinIO server.
# The specified path uses MinIO expansion notation to denote a sequential series of drives between 1 and 4, inclusive.
# All drives or paths included in the expanded drive list must exist *and* be empty or freshly formatted for MinIO to start successfully.
MINIO_VOLUMES="/data-{1...4}"
# MINIO_SERVER_URL sets the hostname of the local machine for use with the MinIO Server.
# MinIO assumes your network control plane can correctly resolve this hostname to the local machine.
# Uncomment the following line and replace the value with the correct hostname for the local machine.
#MINIO_SERVER_URL="http://minio.example.net"
Include any other environment variables as required for your local deployment. ..
3) Create and Run the Container
Select the container management interface of your choice for the relevant command syntax.
Copy the command to a text file for further modification.
podman run -dt \
-p 9000:9000 -p 9090:9090 \
-v PATH1:/data-1 \
-v PATH2:/data-2 \
-v PATH3:/data-3 \
-v PATH4:/data-4 \
-v /etc/default/minio:/etc/config.env \
-e "MINIO_CONFIG_ENV_FILE=/etc/config.env" \
--name "minio_local" \
minio server --console-address ":9090"
Specify any other options to podman run
as necessary for your local environment.
Copy the command to a text file for further modification.
docker run -dt \
-p 9000:9000 -p 9090:9090 \
-v PATH1:/data-1 \
-v PATH2:/data-2 \
-v PATH3:/data-3 \
-v PATH4:/data-4 \
-v /etc/default/minio:/etc/config.env \
-e "MINIO_CONFIG_ENV_FILE=/etc/config.env" \
--name "minio_local" \
minio server --console-address ":9090"
Specify any other options to docker run
as necessary for your local environment.
For running Docker in Rootless mode, you may need to set the following additional Docker CLI options:
- Linux
--user $(id -u):$(id -g)
- directs the container to run as the currently logged in user.- Windows
--security-opt "credentialspec=file://path/to/file.json"
- directs the container to run using a Windows Group Managed Service Account.
The following table describes each line of the command and provides additional configuration instructions:
Line |
Description |
---|---|
podman run -dt docker run -dt |
Directs Podman/Docker to create and start the container as a detached ( |
|
Binds the ports |
|
Binds the storage volume
Include additional |
|
Mounts the environment file created in the previous step to the The MinIO Server uses this environment file for configuration. |
|
Sets a MinIO environment variable pointing to the container-mounted path of the environment file. |
|
Sets a custom name for the container. Omit this value to allow Podman/Docker to automatically generate a container name. You can replace this value to best reflect your requirements. |
|
Starts the MinIO server using the If you modify this value, ensure you set the proper port mapping using the |
4) Validate the Container Status
Run the following command to retrieve logs from the container.
Replace the container name with the value specified to --name
in the previous step.
podman logs minio
The command should return output similar to the following:
Run the following command to retrieve logs from the container.
Replace the container name with the value specified to --name
in the previous step.
docker logs minio
The command should return output similar to the following:
Status: 1 Online, 0 Offline.
API: http://10.0.2.100:9000 http://127.0.0.1:9000
RootUser: myminioadmin
RootPass: minio-secret-key-change-me
Console: http://10.0.2.100:9090 http://127.0.0.1:9090
RootUser: myminioadmin
RootPass: minio-secret-key-change-me
Command-line: https://min.io/docs/minio/linux/reference/minio-mc.html
$ mc alias set myminio http://10.0.2.100:9000 myminioadmin minio-secret-key-change-me
Documentation: https://min.io/docs/minio/container/index.html
Container Networks May Not Be Accessible Outside of the Host
The API
and CONSOLE
blocks may include the network interfaces for the container.
Clients outside of the container network cannot access the MinIO API or Console using these addresses.
External access requires using a network address for the container host machine and assumes the host firewall allows access to the related ports (9000
and 9090
in the examples).
5) Connect to the MinIO Service
You can access the MinIO Web Console by entering http://localhost:9090 in your preferred browser. Any traffic to the MinIO Console port on the local host redirects to the container.
Log in with the MINIO_ROOT_USER
and MINIO_ROOT_PASSWORD
configured in the environment file specified to the container.

You can use the MinIO Console for general administration tasks like Identity and Access Management, Metrics and Log Monitoring, or Server Configuration. Each MinIO server includes its own embedded MinIO Console.
If your local host firewall permits external access to the Console port, other hosts on the same network can access the Console using the IP or hostname for your local host.
You can access the MinIO deployment over a Terminal or Shell using the MinIO Client (mc
).
See MinIO Client Installation Quickstart for instructions on installing mc
.
Create a new alias
corresponding to the MinIO deployment.
Use a hostname or IP address for your local machine along with the S3 API port 9000
to access the MinIO deployment.
Any traffic to that port on the local host redirects to the container.
mc alias set http://localhost:9000 myminioadmin minio-secret-key-change-me
Replace myminioadmin
and minio-secret-key-change-me
with the MINIO_ROOT_USER
and MINIO_ROOT_PASSWORD
values in the environment file specified to the container.
The command should return success if the container is running and accessible at the specified port.
You can then interact with the container using any mc
command.
If your local host firewall permits external access to the MinIO S3 API port, other hosts on the same network can access the MinIO deployment using the IP or hostname for your local host.