微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 按挂载点标识分区

当df输出中没有直接引用分区时,我们如何识别Linux中挂载文件系统的分区?

例如,我们系统的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

解决方法:

这一输出具有误导性.
实际上你有两个不同的文件系统挂在/.

rootfs是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来获取mountpoint的设备号,然后在/ 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来获取设备的主要和次要数量/.然后,我们遍历所有已知的块设备,寻找具有相同设备major和minor的设备.
它不漂亮,但基本上/ dev条目有不同的名称,因此我们必须搜索它.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐