当输出中没有直接引用分区时,我们如何识别文件系统安装在 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= 来获取该位置。