1. 背景信息
在 Linux 系统中,我们可以通过配置 fstab 文件让主机启动时会自动挂载数据盘的文件系统。但是如果 fstab 文件配置不当,那么硬盘挂载顺序变更后,可能会导致主机重启后不能正常运行。本文介绍如何在 fstab 文件中配置 UUID 方式自动挂载数据盘的文件系统,可以解决此类重启异常问题。
fstab 支持使用硬盘分区名(例如/dev/vdb1)或 UUID 标识文件系统,两者的差异如下所示:
- 在 fstab 中使用分区名标识文件系统,如果硬盘的挂载顺序变更,分区可能不会被正确的挂载(mount)到原来的挂载点。这种情况下可能会影响主机上运行的应用。
- 在 fstab 中使用 UUID 标识文件系统,如果硬盘的挂载顺序变更,分区仍然可以正确的挂载(mount)到原来的挂载点。因此建议使用 UUID 标识文件系统。
2. 前提条件
硬盘已经进行分区格式化.
3. 操作步骤
3.1 查看硬盘信息
运行以下命令查看主机的硬盘信息:
fdisk -lu
Disk /dev/sda: 599.6 GB, 599584145408 bytes, 1171062784 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 262144 bytes
Disk label type: dos
Disk 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 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 262144 bytes
Disk label type: dos
Disk 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 | \ |
要挂载分区的文件系统。此处建议使用UUID,可以使用 blkid 命令查询分区文件系统的UUID。 |
1 | \ |
文件系统的挂载位置。可以自己创建新的挂载位置,例如本文中的/test01和/test02。 |
2 | \ |
要挂载分区的文件系统类型。可以使用 blkid 命令查询分区的文件系统类型。 |
3 | \ |
挂载时使用的参数,一般情况下使用defaults参数。如果需要使用多个参数,通过英文逗号(,)分隔,例如defaults,noatime 。对于\ |
4 | \ |
dump工具是否对这个文件系统进行备份。0:表示忽略。1:表示进行备份。一般情况下没有使用dump工具,可以设置为0。 |
5 | \ |
fsck检查文件系统的优先级。0:表示不检查文件系统。1:如果需要检查,根目录(/)对应的文件系统设置为1。2:如果需要检查,非根目录对应的其它文件系统设置为2。一般情况下,可以设置为0。 |
3.3 挂载分区
运行以下命令让/etc/fstab中定义的挂载点生效:
mount -a
3.4 查看分区
执行如下命令查看分区:
df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 126G 0 126G 0% /dev
tmpfs 126G 0 126G 0% /dev/shm
tmpfs 126G 12M 126G 1% /run
tmpfs 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/bash
function 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"
fi
done < /etc/fstab