linux给分区注明标签,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条目有不同的名称,因此我们必须搜索它.

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

标签:bash,linux

来源: https://codeday.me/bug/20190815/1660986.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值