/dev/root が見つからない場合、ルートデバイスをどのように判別しますか?

/dev/root が見つからない場合、ルートデバイスをどのように判別しますか?

私が現在使用しているディストリビューション、Arch Linux ARM では、Linux は初期 RAM ディスクなしで起動されます。つまり、カーネルがルート ファイルシステムのマウント作業をすべて行います。このシステムは SD カードにインストールされ、その上に、そのファイルシステムのデバイス ノードを決定する必要があるスクリプトがあります。このデバイス ノードは、デバイスの起動方法 (すでに実行中の別のデバイスに接続するなど) に応じて変わることがあります。

マウントポイントは で確認できますdf -k --output=target ${0} | sed "1d"。ソースデバイスを特定するには を実行しますdf -k --output=source ${0} | sed "1d"。Arch Linux を起動した場合、最後のコマンドの結果は になります/dev/root存在しない確かに、一部のシステムではudevは実際のルートデバイスへのシンボリックリンクを作成します/dev/rootが、私のシステムではそうしません。できたの内容を確認します/proc/cmdlineが、これはカーネルの稼働時間中は同じままなので、信頼性が低いことを意味します。

を取得したら/dev/root、それが表す実際の基礎ブロック デバイスをどのように判断すればよいでしょうか?

答え1

回答者ここのコメント非常に簡単です。以下を呼び出すだけです:

findmnt -n -o SOURCE /

それが存在する場合findmnt...

答え2

コマンドmountを実行すると次のように表示されます:

mount | sed -n 's|^/dev/\(.*\) on / .*|\1|p'

答え3

私は見つけたこのブログ投稿Linux でルート デバイスとプライマリ ディスクを見つけるのに非常に役立ちます。

lsblkCentOS/RHELで提供されているユーティリティをインストールする必要がありますutil-linux。たとえば、次のようなバリアントにより、ルート デバイスのディスク名が提供されます。

lsblk -oMOUNTPOINT,PKNAME -rn | awk '$1 ~ /^\/$/ { print $2 }'
sda3

findmnt同じパッケージから、実際の基礎となるルートデバイス名が提供されます。

findmnt -oTARGET,SOURCE -rn /
/ /dev/mapper/vg01-lv_root

両方のユーティリティのフラグは、シェル-Pに適した形式で同じ情報を提供します。eval

findmnt -oTARGET,SOURCE -Pn /
TARGET="/" SOURCE="/dev/mapper/vg01-lv_root"

lsblk -oMOUNTPOINT,PKNAME -Pn | grep 'MOUNTPOINT="/"'
MOUNTPOINT="/" PKNAME="sda3"

答え4

stat /デバイスのメジャー/マイナー番号を使用して検査したり、rdevコマンドを使用してこれを自動的に解釈したりすることができます。

関連情報