如何查看 Linux 操作系统的硬盘是什么

如何查看 Linux 操作系统的硬盘是什么

在我们的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.

相关内容