マウントポイントでパーティションを識別する

マウントポイントでパーティションを識別する

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 スクリプトで実行します)。

たとえば、両方とも同じ 20 GB のサイズであるため、が/dev/rootマウントされていることはわかっています/dev/sda1が、スクリプトからこれをどのように識別できるでしょうか?

出力元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 つの異なるファイルシステムがマウントされています/

rootfsinitramfs によって作成されたファイルシステムです。ブートローダがカーネルをロードすると、initramfs をロードして tmpfs ファイルシステムに展開することができます。このファイルシステムはアンマウントできません。initramfs が処理を終えると、実際のルートファイルシステムがその上にマウントされます。

20GB と表示される理由は、dftmpfs ファイルシステムにアクセスできないためです。 がdfファイルシステムを表示しようとすると、まず から現在のマウントのリストを取得します/etc/mtab。 これにより、 を使用して 2 つのマウントが提供されます/。 次に、statfs()各マウントポイントで syscall を実行します。 ただし、現在のルート ファイルシステムは tmpfs initramfs の上にあるため、現在のルート ファイルシステムを 2 回 stat することになります。

さらに、/dev/root実際にはシンボリックリンクです。シェル スクリプトを使用して実際にどこを指しているかを確認するには、 を使用できますreadlink -f /dev/root


更新: この場合は、もう存在しないreadlink -f /dev/rootため動作しません。initramfs は実際のルート ファイルシステムをマウントするものなので、そこに存在していたはずです。しかし、initramfs は埋め込まれているため、もう存在しません。/dev/root/dev/root/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、relink、または /proc/cmdline で root= を探すことで場所を取得できるはずです。

関連情報