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. 使用lsblkfdisk命令

  • 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)进行操作示例

创建新的挂载点

  1. 创建挂载点目录
sudo mkdir -p /mnt/second_disk_90g

这一步创建了一个新的目录,用作/dev/vdb1分区的挂载点。

修改/etc/fstab以实现自动挂载

  1. 编辑/etc/fstab文件

首先,为了安全起见,备份/etc/fstab文件:

sudo cp /etc/fstab /etc/fstab.backup

接着,编辑/etc/fstab文件。这里以vi为例:

sudo vi /etc/fstab
  1. 添加挂载配置

/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是用于dumpfsck的优先级设置。

保存并关闭/etc/fstab文件。

挂载分区

  1. 挂载所有未挂载的分区
sudo mount -a

这个命令会根据/etc/fstab文件的配置,尝试挂载所有未挂载的文件系统,包括刚刚添加的/dev/vdb1分区。

验证挂载

  1. 检查挂载是否成功
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上创建一个数据卷,可以这样做:

  1. 在新挂载的磁盘上创建一个目录用于MySQL数据:
   sudo mkdir -p /mnt/second_disk_90g/mysql_data
  1. 使用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作为数据目录:

  1. 创建目标目录:
   sudo mkdir -p /mnt/second_disk_90g/app_data
  1. 启动容器时,使用该目录作为绑定挂载点:
   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的数据目录。这种方式为管理容器数据提供了更大的灵活性和控制。