Ubuntu 挂载数据盘 & Docker数据存储
在Ubuntu这样的Linux操作系统中,多个磁盘是通过文件系统的挂载点以及特定的设备文件名来区分的。每个磁盘和磁盘分区都会被赋予一个唯一的设备文件名,通常位于/dev
目录下。下面是一些关键点帮助理解Ubuntu中如何区分多个磁盘:
1. 设备文件名
- 硬盘驱动器:通常,硬盘驱动器会被命名为
/dev/sda
、/dev/sdb
等,其中/dev/sda
通常是第一个连接的硬盘,/dev/sdb
是第二个,依此类推。如果是使用NVMe接口的SSD,它们的设备名会是/dev/nvme0n1
、/dev/nvme1n1
等。 - 分区:硬盘上的分区会在硬盘的设备文件名后面加上一个数字来表示。例如,
/dev/sda1
代表/dev/sda
硬盘上的第一个分区,/dev/sda2
是第二个分区,依此类推。
2. UUID
每个分区还有一个唯一的UUID(Universally Unique Identifier),这提供了另一种方式来区分和引用磁盘分区,而不依赖于它们的设备文件名,这在自动挂载磁盘时特别有用。可以通过blkid
命令查看所有磁盘分区的UUID。
3. 挂载点
挂载点是文件系统中的一个位置,系统通过这个位置访问挂载在这个点上的磁盘分区的内容。例如,根文件系统挂载在/
,额外的磁盘或分区可能挂载在/mnt/data
、/media/username/diskname
等位置。你可以通过mount
命令查看当前的挂载情况,或者查看/etc/fstab
文件来看看有哪些磁盘分区是在系统启动时自动挂载的。
4. 使用lsblk
和fdisk
命令
lsblk
命令列出了所有可用的存储设备及其分区,以及挂载点等信息,是查看系统中磁盘和分区情况的一个非常有用的工具。fdisk
(例如sudo fdisk -l
)命令也提供了磁盘分区的详细信息,但它更多用于分区操作。blkid
命令来查看分区实际使用的文件系统类型
root@kvm-muta:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 61.9M 1 loop /snap/core20/1434
loop1 7:1 0 79.9M 1 loop /snap/lxd/22923
loop2 7:2 0 44.7M 1 loop /snap/snapd/15534
sr0 11:0 1 388K 0 rom
vda 252:0 0 50G 0 disk
├─vda1 252:1 0 49.9G 0 part /
├─vda14 252:14 0 4M 0 part
└─vda15 252:15 0 106M 0 part /boot/efi
vdb 252:16 0 90G 0 disk
└─vdb1 252:17 0 90G 0 part
root@kvm-muta:~# sudo blkid
/dev/vdb1: UUID="1511cf57-a511-47a2-a2ec-de6eb128eebe" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="000529d5-01"
/dev/sr0: BLOCK_SIZE="2048" UUID="2024-05-22-09-26-44-00" LABEL="cidata" TYPE="iso9660"
/dev/vda15: LABEL_FATBOOT="UEFI" LABEL="UEFI" UUID="E0AB-332A" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="bd61ce9d-671d-43d7-809c-2976ab205ce9"
/dev/vda1: LABEL="cloudimg-rootfs" UUID="2a6b8daa-1d70-43b6-84e1-8d987d9f1411" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e58420d6-3a2a-4d04-9f8a-8931390c10fc"
/dev/loop1: TYPE="squashfs"
/dev/loop2: TYPE="squashfs"
/dev/loop0: TYPE="squashfs"
/dev/vda14: PARTUUID="a980d4b4-bd79-46f1-8fa2-ffa6545d4356"
以下是按照想要的挂载点名称(假设为/mnt/second_disk_90g
)进行操作示例
创建新的挂载点
- 创建挂载点目录:
sudo mkdir -p /mnt/second_disk_90g
这一步创建了一个新的目录,用作/dev/vdb1
分区的挂载点。
修改/etc/fstab
以实现自动挂载
- 编辑
/etc/fstab
文件:
首先,为了安全起见,备份/etc/fstab
文件:
sudo cp /etc/fstab /etc/fstab.backup
接着,编辑/etc/fstab
文件。这里以vi
为例:
sudo vi /etc/fstab
- 添加挂载配置:
在/etc/fstab
文件的末尾,添加以下行:
UUID=1511cf57-a511-47a2-a2ec-de6eb128eebe /mnt/second_disk_90g ext4 defaults 0 2
这里,UUID=1511cf57-a511-47a2-a2ec-de6eb128eebe
是之前通过blkid
命令获得的/dev/vdb1
分区的UUID,/mnt/second_disk_90g
是您创建的挂载点目录,ext4
是文件系统类型,defaults
表示默认的挂载选项,0 2
是用于dump
和fsck
的优先级设置。
保存并关闭/etc/fstab
文件。
挂载分区
- 挂载所有未挂载的分区:
sudo mount -a
这个命令会根据/etc/fstab
文件的配置,尝试挂载所有未挂载的文件系统,包括刚刚添加的/dev/vdb1
分区。
验证挂载
- 检查挂载是否成功:
lsblk
或者:
mount | grep second_disk_90g
如果一切正常,能看到/dev/vdb1
现在挂载在/mnt/second_disk_90g
上。这样就成功地以一种直观的方式命名了挂载点,同时通过/etc/fstab
确保了它在系统启动时自动挂载。
root@kvm-muta:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 61.9M 1 loop /snap/core20/1434
loop1 7:1 0 79.9M 1 loop /snap/lxd/22923
loop2 7:2 0 44.7M 1 loop /snap/snapd/15534
sr0 11:0 1 388K 0 rom
vda 252:0 0 50G 0 disk
├─vda1 252:1 0 49.9G 0 part /
├─vda14 252:14 0 4M 0 part
└─vda15 252:15 0 106M 0 part /boot/efi
vdb 252:16 0 90G 0 disk
└─vdb1 252:17 0 90G 0 part /mnt/second_disk_90g
Docker中特定的容器数据存储
若要将docker中特定的容器或数据卷存储在新挂载的磁盘上可以通过配置容器的卷(Volumes)或绑定挂载(Bind Mounts)来实现。这样可以为特定的容器选择数据存储位置,而不需要更改Docker的全局数据存储配置。
使用数据卷
Docker卷(Volumes)是由Docker管理的存储空间,最适合完全由Docker管理的数据或需要在容器之间共享的数据。要将数据存储在新挂载的磁盘上,可以在该磁盘上创建一个或多个目录,然后在启动容器时指定使用这些目录作为卷。
例如,如果想要为一个新的MySQL容器在/mnt/second_disk_90g
上创建一个数据卷,可以这样做:
- 在新挂载的磁盘上创建一个目录用于MySQL数据:
sudo mkdir -p /mnt/second_disk_90g/mysql_data
- 使用
docker run
命令启动MySQL容器,并将刚刚创建的目录挂载为卷:
docker run -d \
--name my_mysql \
-v /mnt/second_disk_90g/mysql_data:/var/lib/mysql \
mysql
这个命令会启动一个新的MySQL容器,-v /mnt/second_disk_90g/mysql_data:/var/lib/mysql
部分告诉Docker将主机上的/mnt/second_disk_90g/mysql_data
目录挂载到容器内的/var/lib/mysql
目录。
使用绑定挂载
绑定挂载(Bind Mounts)允许将主机上的任意目录或文件系统挂载到容器中。这对于需要容器访问特定文件或目录的情况非常有用。
使用绑定挂载的步骤与使用数据卷类似,不同之处在于指定路径时,直接使用主机上的路径。
例如,如果想要让容器使用/mnt/second_disk_90g/app_data
作为数据目录:
- 创建目标目录:
sudo mkdir -p /mnt/second_disk_90g/app_data
- 启动容器时,使用该目录作为绑定挂载点:
docker run -d \
--name my_app \
-v /mnt/second_disk_90g/app_data:/usr/src/app/data \
my_app_image
这样,/mnt/second_disk_90g/app_data
目录就会挂载到容器的/usr/src/app/data
路径。
小结
通过以上方法,可以灵活地为特定容器指定数据存储位置,而无需迁移整个Docker的数据目录。这种方式为管理容器数据提供了更大的灵活性和控制。