通过挂载点识别分区

通过挂载点识别分区

当输出中没有直接引用分区时,我们如何识别文件系统安装在 Linux 中的哪个分区上df

例如,我们系统的fdisk输出是:

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2550    20478976   83  Linux
/dev/sda2            2550       60736   467378176   83  Linux
/dev/sda3           60736       60801      523264   82  Linux swap / Solaris

的输出df是:

Filesystem      Size  Used Avail Use% Mounted on
rootfs           20G  881M   18G   5% /
/dev/root        20G  881M   18G   5% /
devtmpfs        989M  216K  989M   1% /dev
/dev/sda2       443G  199M  420G   1% /home
tmpfs           990M     0  990M   0% /dev/shm
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named
/dev/root        20G  881M   18G   5% /var/named/chroot/var/named
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.conf
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.rfc1912.zones
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/rndc.key
/dev/root        20G  881M   18G   5% /var/named/chroot/usr/lib64/bind
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.iscdlv.key
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.root.key

从该列表中唯一明显的分区是/dev/sda2;对于其他分区,我们无法看到它们驻留在哪个分区(我们希望通过 bash 脚本来做到这一点)。

例如,我们知道 已/dev/root安装,/dev/sda1因为它们都具有相同的 20GB 大小,但我们如何从脚本中识别这一点?

输出来自ls -l /dev/root /dev/sda1

[root@server etc]# ls -l /dev/root /dev/sda1
ls: cannot access /dev/root: No such file or directory
brw-rw---- 1 root disk 8, 1 May  7 14:16 /dev/sda1

答案1

该输出具有误导性。
实际上,您在 处安装了 2 个不同的文件系统/

rootfs是由 initramfs 创建的文件系统。当引导加载程序加载内核时,它能够加载 initramfs,该 initramfs 会解压到 tmpfs 文件系统中。无法卸载该文件系统。当 initramfs 完成它的工作后,它只是将真正的根文件系统安装在其上。

之所以df显示为 20GB,是因为它无法访问 tmpfs 文件系统。当df显示文件系统时,它首先从 获取当前安装的列表/etc/mtab。这给了它 2 个使用 的安装座/。然后它statfs()在每个安装点上进行系统调用。但由于当前根文件系统位于 tmpfs initramfs 之上,因此它最终会两次统计当前根文件系统。

另外/dev/root实际上是一个符号链接。要使用 shell 脚本找出它真正指向的位置,您可以使用readlink -f /dev/root.


更新:好的,所以在这种情况下readlink -f /dev/root不起作用,因为/dev/root不再存在。因为 initramfs 是挂载你真正的根文件系统的,/dev/root所以它本来就存在于那里。但由于 initramfs 被埋葬了,/dev/root所以不再存在了。

在这种情况下,事情变得更加困难。
您可以做的是使用stat获取安装点的设备号,然后进行搜索/dev

例如,在我的系统上会产生:

$ stat --format '%D' /
fd00

$ stat --format '%02t%02T' /dev/mapper/sys-root
fd00

$ for device in $(blkid -o device); do 
>   [ "$(stat --format '%04D' /)" = "$(stat --format '%02t%02T' "$device")" ] && \
>     echo "$device" && \
>     break
> done
/dev/mapper/sys-root

基本上,它的作用是用来stat获取设备的主要和次要编号/。然后,我们遍历所有已知的块设备,寻找具有相同主要设备和次要设备的块设备。它不太漂亮,但基本上该/dev条目有一个不同的名称,所以我们必须搜索它。

这可以更有效地完成,但我想保持代码简单

答案2

/dev/root 是真实设备的符号链接。您应该能够通过 ls /dev/root、reallink 或在 /proc/cmdline 中查找 root= 来获取该位置。

相关内容