1. 背景信息
在 Linux 系统中,我们可以通过配置 fstab 文件让主机启动时会自动挂载数据盘的文件系统。但是如果 fstab 文件配置不当,那么硬盘挂载顺序变更后,可能会导致主机重启后不能正常运行。本文介绍如何在 fstab 文件中配置 UUID 方式自动挂载数据盘的文件系统,可以解决此类重启异常问题。
fstab 支持使用硬盘分区名(例如/dev/vdb1)或 UUID 标识文件系统,两者的差异如下所示:
在 fstab 中使用分区名标识文件系统,如果硬盘的挂载顺序变更,分区可能不会被正确的挂载(mount)到原来的挂载点。这种情况下可能会影响主机上运行的应用。
在 fstab 中使用 UUID 标识文件系统,如果硬盘的挂载顺序变更,分区仍然可以正确的挂载(mount)到原来的挂载点。因此建议使用 UUID 标识文件系统。
2. 前提条件
硬盘已经进行分区格式化.
3. 操作步骤
3.1 查看硬盘信息
运行以下命令查看主机的硬盘信息:
fdisk -luDisk /dev/sda: 599.6 GB, 599584145408 bytes, 1171062784 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 4096 bytesI/O size (minimum/optimal): 262144 bytes / 262144 bytesDisk label type: dosDisk identifier: 0x0004f49a Device Boot Start End Blocks Id System/dev/sda1 * 2048 2099199 1048576 83 Linux/dev/sda2 2099200 1050675199 524288000 83 Linux/dev/sda3 1050675200 1171062783 60193792 82 Linux swap / Solaris Disk /dev/sdb: 1799.8 GB, 1799792623616 bytes, 3515219968 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 4096 bytesI/O size (minimum/optimal): 262144 bytes / 262144 bytesDisk label type: dosDisk identifier: 0x2d775180 Device Boot Start End Blocks Id System/dev/sdb1 2048 419432447 209715200 83 Linux/dev/sdb2 419432448 1468008447 524288000 83 Linux/dev/sdb3 1468008448 1677723647 104857600 83 Linux/dev/sdb4 1677723648 3515219967 918748160 83 Linux....
运行以下命令查询硬盘盘的 UUID 信息:
blkid/dev/sda1: UUID="63c9ad21-0310-48cf-b0d7-203ee3a5d261" TYPE="xfs"/dev/sda2: UUID="63048acb-74ad-4cd0-a6f8-c7be247a81d8" TYPE="xfs"/dev/sda3: UUID="de9f7e24-08bf-4bb9-a3c6-080d98a5ff44" TYPE="swap"/dev/sdb1: UUID="dac4da80-40d1-46ef-89b5-d2ee24a316de" TYPE="xfs"/dev/sdb2: UUID="cc39d05d-4bfc-48fb-8b08-257073c7b8b4" TYPE="xfs"/dev/sdb3: UUID="de5c9c24-5b11-46ae-ae91-1ae384a46e99" TYPE="ext4"/dev/sdb4: UUID="40bf6bc7-ab36-40b6-855c-b7456e57b48f" TYPE="xfs"/dev/sdc1: UUID="f19af473-626e-4850-9303-8cca0111fd01" TYPE="xfs"
3.2 添加挂载信息
运行以下命令分别创建数据盘的挂载点(示例):
# 创建/dev/vdb1的挂载点/test01:mkdir /test01# 创建/dev/vdc1的挂载点/test02:mkdir /test02
在 fstab 文件中添加挂载信息:
vi /etc/fstab#按 i键进入编辑模式#新增以下挂载信息UUID=59f23670-94c1-42d1-8bb0-209d7854****(0) /test01(1) ext4(2) defaults(3) 0(4) 0(5)UUID=88619b1a-d971-41c2-91d0-3a440fc0**** /test02 xfs defaults 0 0...#修改完成后,按 Esc 键退出编辑模式#输入:wq后,按 Enter 键保存并退出
字段说明
3.3 挂载分区
运行以下命令让/etc/fstab中定义的挂载点生效:
mount -a
3.4 查看分区
执行如下命令查看分区:
df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 126G 0 126G 0% /devtmpfs 126G 0 126G 0% /dev/shmtmpfs 126G 12M 126G 1% /runtmpfs 126G 0 126G 0% /sys/fs/cgroup/dev/sda2 500G 439G 62G 88% //dev/sdc1 500G 125G 375G 25% /var/log/dev/sdb2 500G 37G 464G 8% /registry-data/dev/sdb3 99G 758M 93G 1% /opt/kubernetes/data/dev/sda1 1014M 164M 851M 17% /boot/dev/sdb4 876G 86G 791G 10% /tdc-installer/dev/sdb1 200G 86G 115G 43% /var/lib/docker...4. 总结
配置完成后,您后续如果重启主机,系统将自动挂载数据盘。
5. 自动化脚本
#!/bin/bashfunction print_red() { echo -e "\e[31;1m$1\e[0m"}function print_green() { echo -e "\e[32m$1\e[0m"}function print_bold() { echo -e "\033[1;m$1\033[0m"}# 读取 /etc/fstab 文件while IFS= read -r line; do # 所有非注释、非 UUID 且以 /dev/ 开头的设备 if [[ ! $line =~ ^\s*# && ! $line =~ UUID= && $line =~ /dev/ ]]; then # 获取 device device=$(echo "$line" | awk '{print $1}') # 查找 UUID uuid=$(blkid -o value -s UUID "$device") # 如果 uuid 没有找到,说明 /etc/fstab 存在问题,先修正错误 if [[ ! -n $uuid ]]; then print_red "无法获取设备:$device 的 UUID!" exit 1 fi # 使用 UUID 替换 new_line=$(echo "$line" | sed "s|$device|UUID=$uuid|") # 打印转换后的行 echo "$new_line" else # 其它行原样输出 echo "$line" fidone < /etc/fstab
在 Linux 系统中,我们可以通过配置 fstab 文件让主机启动时会自动挂载数据盘的文件系统。但是如果 fstab 文件配置不当,那么硬盘挂载顺序变更后,可能会导致主机重启后不能正常运行。本文介绍如何在 fstab 文件中配置 UUID 方式自动挂载数据盘的文件系统,可以解决此类重启异常问题。
fstab 支持使用硬盘分区名(例如/dev/vdb1)或 UUID 标识文件系统,两者的差异如下所示:
在 fstab 中使用分区名标识文件系统,如果硬盘的挂载顺序变更,分区可能不会被正确的挂载(mount)到原来的挂载点。这种情况下可能会影响主机上运行的应用。
在 fstab 中使用 UUID 标识文件系统,如果硬盘的挂载顺序变更,分区仍然可以正确的挂载(mount)到原来的挂载点。因此建议使用 UUID 标识文件系统。
2. 前提条件
硬盘已经进行分区格式化.
3. 操作步骤
3.1 查看硬盘信息
运行以下命令查看主机的硬盘信息:
fdisk -luDisk /dev/sda: 599.6 GB, 599584145408 bytes, 1171062784 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 4096 bytesI/O size (minimum/optimal): 262144 bytes / 262144 bytesDisk label type: dosDisk identifier: 0x0004f49a Device Boot Start End Blocks Id System/dev/sda1 * 2048 2099199 1048576 83 Linux/dev/sda2 2099200 1050675199 524288000 83 Linux/dev/sda3 1050675200 1171062783 60193792 82 Linux swap / Solaris Disk /dev/sdb: 1799.8 GB, 1799792623616 bytes, 3515219968 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 4096 bytesI/O size (minimum/optimal): 262144 bytes / 262144 bytesDisk label type: dosDisk identifier: 0x2d775180 Device Boot Start End Blocks Id System/dev/sdb1 2048 419432447 209715200 83 Linux/dev/sdb2 419432448 1468008447 524288000 83 Linux/dev/sdb3 1468008448 1677723647 104857600 83 Linux/dev/sdb4 1677723648 3515219967 918748160 83 Linux....
运行以下命令查询硬盘盘的 UUID 信息:
blkid/dev/sda1: UUID="63c9ad21-0310-48cf-b0d7-203ee3a5d261" TYPE="xfs"/dev/sda2: UUID="63048acb-74ad-4cd0-a6f8-c7be247a81d8" TYPE="xfs"/dev/sda3: UUID="de9f7e24-08bf-4bb9-a3c6-080d98a5ff44" TYPE="swap"/dev/sdb1: UUID="dac4da80-40d1-46ef-89b5-d2ee24a316de" TYPE="xfs"/dev/sdb2: UUID="cc39d05d-4bfc-48fb-8b08-257073c7b8b4" TYPE="xfs"/dev/sdb3: UUID="de5c9c24-5b11-46ae-ae91-1ae384a46e99" TYPE="ext4"/dev/sdb4: UUID="40bf6bc7-ab36-40b6-855c-b7456e57b48f" TYPE="xfs"/dev/sdc1: UUID="f19af473-626e-4850-9303-8cca0111fd01" TYPE="xfs"
3.2 添加挂载信息
运行以下命令分别创建数据盘的挂载点(示例):
# 创建/dev/vdb1的挂载点/test01:mkdir /test01# 创建/dev/vdc1的挂载点/test02:mkdir /test02
在 fstab 文件中添加挂载信息:
vi /etc/fstab#按 i键进入编辑模式#新增以下挂载信息UUID=59f23670-94c1-42d1-8bb0-209d7854****(0) /test01(1) ext4(2) defaults(3) 0(4) 0(5)UUID=88619b1a-d971-41c2-91d0-3a440fc0**** /test02 xfs defaults 0 0...#修改完成后,按 Esc 键退出编辑模式#输入:wq后,按 Enter 键保存并退出
字段说明
序号 |
字段 |
说明 |
---|---|---|
0 | <file system> | 要挂载分区的文件系统。 此处建议使用UUID,可以使用 |
1 | <dir> | 文件系统的挂载位置。 可以自己创建新的挂载位置,例如本文中的/test01和/test02。 |
2 | <type> | 要挂载分区的文件系统类型。 可以使用 |
3 | <options> | 挂载时使用的参数,一般情况下使用defaults参数。如果需要使用多个参数,通过英文逗号(,)分隔,例如defaults,noatime 。对于<options>参数的更多信息,请参见fstab说明。 |
4 | <dump> | dump工具是否对这个文件系统进行备份。
一般情况下没有使用dump工具,可以设置为0。 |
5 | <pass> | fsck检查文件系统的优先级。
一般情况下,可以设置为0。 |
3.3 挂载分区
运行以下命令让/etc/fstab中定义的挂载点生效:
mount -a
3.4 查看分区
执行如下命令查看分区:
df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 126G 0 126G 0% /devtmpfs 126G 0 126G 0% /dev/shmtmpfs 126G 12M 126G 1% /runtmpfs 126G 0 126G 0% /sys/fs/cgroup/dev/sda2 500G 439G 62G 88% //dev/sdc1 500G 125G 375G 25% /var/log/dev/sdb2 500G 37G 464G 8% /registry-data/dev/sdb3 99G 758M 93G 1% /opt/kubernetes/data/dev/sda1 1014M 164M 851M 17% /boot/dev/sdb4 876G 86G 791G 10% /tdc-installer/dev/sdb1 200G 86G 115G 43% /var/lib/docker...4. 总结
配置完成后,您后续如果重启主机,系统将自动挂载数据盘。
5. 自动化脚本
#!/bin/bashfunction print_red() { echo -e "\e[31;1m$1\e[0m"}function print_green() { echo -e "\e[32m$1\e[0m"}function print_bold() { echo -e "\033[1;m$1\033[0m"}# 读取 /etc/fstab 文件while IFS= read -r line; do # 所有非注释、非 UUID 且以 /dev/ 开头的设备 if [[ ! $line =~ ^\s*# && ! $line =~ UUID= && $line =~ /dev/ ]]; then # 获取 device device=$(echo "$line" | awk '{print $1}') # 查找 UUID uuid=$(blkid -o value -s UUID "$device") # 如果 uuid 没有找到,说明 /etc/fstab 存在问题,先修正错误 if [[ ! -n $uuid ]]; then print_red "无法获取设备:$device 的 UUID!" exit 1 fi # 使用 UUID 替换 new_line=$(echo "$line" | sed "s|$device|UUID=$uuid|") # 打印转换后的行 echo "$new_line" else # 其它行原样输出 echo "$line" fidone < /etc/fstab