マウントポイントによるパーティションの識別

マウントポイントによるパーティションの識別

出力にパーティションへの直接参照がない場合、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スクリプトを介してこれを実行したいと思います)。

たとえば、サイズはすべて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によって生成されたファイルシステム。ブートローダがカーネルをロードすると、tmpfsファイルシステムに抽出されたinitramfsをロードできます。ファイルシステムをマウント解除できません。 initramfsが作業を完了したら、その上に実際のルートファイルシステムをマウントするだけです。

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

しかも/dev/root実際にはシンボリックリンクです。シェルスクリプトを使用して実際に指している場所を見つけるにはreadlink -f /dev/root


アップデート:いいですね。この場合、これ以上存在しないreadlink -f /dev/rootため動作しません。/dev/rootinitramfsは実際のルートファイルシステムをマウントするので、/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 =を検索して場所を取得できます。

関連情報