在我们的bash脚本中,我们的代码中有很多地方只需要捕获与操作系统相关的磁盘(运行linux/RHEL系统)
我们使用 Linux 版本7.2/7.5/7.6/7.9
,并且在大多数情况下,机器都有额外的磁盘用于存储数据或数据库服务器,其中包括 TB 大小的磁盘等
通常我们使用以下 cli 来捕获操作系统磁盘
os_disk=` lsblk -l | grep part | awk '{print $1}' | sed s'/[0-9]/ /g' | sort -u | head -1 `
当不存在额外的分区磁盘时,它可以工作,但是当我们有额外的分区磁盘时,如下例所示:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.8T 0 disk /data/sdb
sdb 8:16 0 1.8T 0 disk /data/sdc
sdc 8:32 0 1.8T 0 disk /data/sdd
sdd 8:48 0 1.8T 0 disk /data/sde
sde 8:64 0 1.8T 0 disk
├─sde1 8:65 0 931.3G 0 part
└─sde2 8:66 0 931.7G 0 part
sdf 8:80 0 1.8T 0 disk /data/sdg
sdg 8:96 0 1.8T 0 disk /data/sdh
sdh 8:112 0 1.8T 0 disk /data/sdi
sdi 8:128 0 1.8T 0 disk /data/sdj
sdj 8:144 0 1.8T 0 disk /data/sdk
sdk 8:160 0 1.8T 0 disk /data/sdl
sdl 8:176 0 1.8T 0 disk /data/sdm
sdm 8:192 0 1.8T 0 disk /data/sdn
sdn 8:208 0 1.8T 0 disk /data/sdo
sdo 8:224 0 557.9G 0 disk
├─sdo1 8:225 0 500M 0 part /boot
└─sdo2 8:226 0 557.4G 0 part
├─VGPO-lvm_root 253:0 0 100G 0 lvm /
├─VGPO-lvm_swap 253:1 0 16G 0 lvm [SWAP]
└─VGPO-lvm_var 253:2 0 100G 0 lvm /var
那么我们会得到错误的结果,操作系统磁盘sde
应该得到sdo
os_disk=` lsblk -l | grep part | awk '{print $1}' | sed s'/[0-9]/ /g' | sort -u | head -1 `
echo $os_disk
sde
因此,在这种情况下,当机器可以是虚拟机或物理机时,我们需要找到其他提供操作系统磁盘的方法
答案1
您可以查找包含挂载在系统挂载点上的分区的磁盘,例如 /boot
:
lsblk -ls | awk '$NF == "/boot" { m = 1; next } m && $NF == "disk" { print $1 ; exit}'
这也适用于/
:
lsblk -ls | awk '$NF == "/" { m = 1; next } m && $NF == "disk" { print $1 ; exit}'
这使用 的lsblk
列表模式 ( -l
) 来简化解析,并反转树 ( -s
) 以便父磁盘出现在我们要查找的分区之后。
答案2
你有findmnt
命令吗?我曾经findmnt
在脚本中获取根文件系统的设备:
findmnt -ensP -M /
搜索/etc/fstab
并在我的测试机器上产生:
TARGET="/" SOURCE="/dev/nvme0n1p1" FSTYPE="ext4" OPTIONS="rw,discard,errors=remount-ro,x-systemd.growfs"
这些是“列表”格式的默认输出字段。我的脚本定义了一组自定义输出字段,它还设置了它们的打印顺序:
findmnt -ensP -o SOURCE,TARGET,FSTYPE,SIZE,UUID,LABEL -M /
生产:
SOURCE="/dev/nvme0n1p1" TARGET="/" FSTYPE="ext4" SIZE="39.2G" UUID="1ca031f6-4004-4f8d-a861-532a0158c91f" LABEL=""
findmnt
有很多选项,其中之一是--tree
生成一棵像问题lsblk
输出一样的树。
我上面使用的选项是:
-e
- “评估”某些字段中的值,将它们转换为设备。 (如果没有-e
我的 SOURCE 字段SOURCE="UUID=1ca031f6-4004-4f8d-a861-532a0158c91f"
)
-n
- 输出中没有标题行
-s
- 读取 /etc/fstab (或-m
读取 /etc/mtab)
-P
- 以“Pair”格式输出FIELD="VALUE"
(我发现这更容易在 shell 脚本中解析)
-M
-限制输出到安装在该安装点上的文件系统
还有许多其他选项提供了很大的灵活性。例如,-t ext4
将搜索限制为ext4
文件系统。
最后一点: findmnt
查找有关已安装文件系统的信息(通过/etc/mtab
),或/etc/fstab
(已安装或未安装)中列出的文件系统的信息。它无法找到未安装且不在/etc/fstab
.为此,您需要lsblk
或可能需要旧的blkid
.