ルートfsをUUIDで指定できないのはなぜですか?


29

私のシステムは、GRUB 2の設定でこれで起動します:

linux   /bzImage root=/dev/sda2 init=/usr/lib/systemd/systemd ro

ただし/dev/sda2、対応するUUID に置き換えた場合:

linux   /bzImage root=UUID=666c2eee-193d-42db-a490-4c444342bd4e init=/usr/lib/systemd/systemd ro

その後、起動中に失敗します:

kernel panic - not syncing: VFS: unable to mount root fs on unknown-block(0,0)

UUIDは正しいようです:

# blkid
/dev/sda1: UUID="97ac3744-39de-4d6d-9a81-e3a3ea08a8bb" TYPE="ext2" 
/dev/sda2: UUID="666c2eee-193d-42db-a490-4c444342bd4e" TYPE="ext4" 

なぜ機能しないのですか?initramfsを使用していないからですか?

これは、カーネル3.10.7を備えたx86_64 Gentoo Linuxです。でMBRパーティションテーブルを使用しsda、でGUIDパーティションテーブルを使用していsdbます。


unknown-block(0,0)私にとってGRUBデバイスのように見えます。私の推測では、GRUBは何らかの理由でそのUUIDを使用できないと思われます。
13

@ strugee、GRUBはカーネルコマンドラインをまったく解釈しようとは思わない。(GRUBはカーネルをロードしていますsda1。構成のその部分は表示しませんでした。)
cjm

私は同意する傾向があります。ただし、デバイスがUNIXデバイスではなくGRUBデバイスのように見えるのは奇妙です。
13

@Gilles、質問はGRUBに関するものではありません。それはたまたま私が使用しているブートローダーです。Linuxカーネルの質問です。
cjm

これはカーネルに関する質問でもありません-これはカーネルに関する質問ですinit
mikeserv 14

回答:


22

明確にするUUIDために、カーネルがハードドライブを識別する唯一の信頼できる方法です。2つのタイプがあります。UUIDはファイルシステムに格納され、ブート時にカーネルで使用できません。PARTUUIDはパーティションテーブルに格納され、ブート時に使用できます。だから、使用する必要があります

root=PARTUUID=SSSSSSSS-PP

など/dev/sd??のデバイスに変更することができますが差し込ま/アンプラグ。

取得する16進数を大文字にすることを忘れないでください!SSSSSSSS-PPblkid

より使いやすい

root=LABEL=
root=UUID=

initramfsこれらの識別子を取得するでのみ動作します。

したがって、空initramfsでないを使用する場合、3つすべてを使用できます。空ではinitramfs、あなたは持っているだけPARTUUIDです。


誰がboot = -argumentを使用しているのかを説明したいですか?initrdがなく、boot = LABELもboot = UUIDも使用できないArchlinuxarmインストールにこの行を使用しました。
ineiti

1
そうです-ブートをルートに修正しました、ごめんなさい!それが今より理にかなっていることを願っています。
ineiti

1
私の理解(archlinuxarmのフォーラムでの1日後)は、Archlinuxarmにはinitrd(またはinitramfsですが、kernel.org / doc / Documentation / kernel-parameters.txtはinitrdと呼びます)はないということです。Ubuntuなどでは、initrdへのポインタを提供していますが、(私の理解では)Archlinuxarmではありません。
ineiti

1
no initrdに関するArchlinuxarmの議論:archlinuxarm.org/forum/viewtopic.php?f
23&

1
このリンクを試しください。そしてこれ。そして多分これ。initramfsはinitramfsイメージではありません。これは通常cpio、カーネルが/ブート時に展開するアーカイブを含む圧縮アーカイブです。initramfsはファイルシステムです-常に最初に/マウントされ、そこからカーネルが呼び出しますinit。内容をカーネルにコンパイルするか、ブート時にアンパックできます-これらは2つのオプションです。
mikeserv 14

16

UUIDからブートするために渡す必要があるパラメーターはPARTUUIDです。だからそれはする必要がありますroot=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e

ドキュメントには、なぜ戻ってくるのかが説明されていますunknown-block(0,0)

kernel-parameters.txt

    root = [KNL]ルートファイルシステム
            init / do_mounts.cのname_to_dev_tコメントを参照してください。

init / do_mounts.c

/ *
 *名前をデバイス番号に変換します。次のバリアントを受け入れます。
 *
 * 1)16進数のデバイス番号はそれ自体を表します
 * 2)/ dev / nfsはRoot_NFS(0xff)を表します
 * 3)/ dev / <disk_name>はディスクのデバイス番号を表します
 * 4)/ dev / <disk_name> <decimal>はデバイス番号を表します
 *パーティション-ディスクのデバイス番号とパーティション番号
 * 5)/ dev / <disk_name> p <decimal>-上記と同じ、その形式は
 *パーティション化されたディスクのディスク名が数字で終わる場合に使用されます。
 * 6)PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFFは
 *パーティションテーブルが提供する場合、パーティションの一意のID。
 * UUIDはEFI / GPT UUIDであるか、MSDOSを参照する場合があります
 * SSSSSSSS-PP形式を使用したパーティション。SSSSSSSSはゼロです。
 * 32ビットの「NTディスク署名」の16進表記、およびPP
 *は、1から始まるパーティション番号のゼロで埋められた16進表現です。
 * 7)PARTUUID = <UUID> / PARTNROFF = <int>は、関連するパーティションを選択します
 *既知の一意のIDを持つパーティション。
 *
 *名前が上記のカテゴリに該当しない場合、(0,0)を返します。
 * block_classは、何かがディスク名であるかどうかを確認するために使用されます。ディスクが
 *名前にはスラッシュが含まれ、デバイス名にはスラッシュが置き換えられます
 *前髪。
 * /

最後の最後のビットは、値を理解できない場合はを返す(0,0)ため、エラーになることを示しています。


1
これは部分的に正しいだけです。パーティションのUUIDはファイルシステムのUUIDとは完全に異なるため、PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e機能しません。ただし、使用できましたPARTUUID=SSSSSSSS-02(SSSSSSSSは、エラーメッセージの直前に表示されるNTディスク署名です)。
cjm

6
だから、本当の答えはカーネルがサポートしないroot=UUIDだけだと思うroot=PARTUUID。ファイルシステムのUUIDを使用する場合、UUIDによるファイルシステムのマウントを処理できるinitramfsが必要だと思います。
cjm

@cjmで私のgrubブーツはとても幸せroot=UUIDです。
テルドン

3
@ terdon、initramfsまたはinitrdを持っているに違いない。(個別のファイルではなく、カーネルにリンクできます。)
cjm

4

これは5年前のスレッドです。しかし、それはまだ完全に答えられていない私見です。不足している小さな例があります。ここにあります:

この例では:

/dev/sda3 = /
/dev/sda2 = swap

... GPTパーティションを使用します。MBR(dos partition)では、PARTUUIDは短くなりますが、手順は同じです...

blkidでPARTUUIDを取得します。

blkid -s PARTUUID -o value /dev/sda3 # root
77fd7830-faa2-4e99-a48b-337ad9eded28
blkid -s PARTUUID -o value /dev/sda2 # swap
5b63167a-6fd2-4e72-948c-90832372956c

/boot/grub/grub.cfg:

search --no-floppy --part-uuid --set=root 77fd7830-faa2-4e99-a48b-337ad9eded28

menuentry "GNU/Linux, KERNEL 4.12.7-lfs-8.1" {
  linux /boot/vmlinuz-4.12.7-lfs-8.1 root=PARTUUID=77fd7830-faa2-4e99-a48b-337ad9eded28 net.ifnames=0 ipv6.disable=1 ro rootwait rootfstype=ext4
}

/ etc / fstab /:

PARTUUID=77fd7830-faa2-4e99-a48b-337ad9eded28 / ext4 noatime,nodiratime,errors=remount-ro 0 1
PARTUUID=5b63167a-6fd2-4e72-948c-90832372956c swap swap pri=1 0 0

これはlfs8.1(カーネル4.12.7)で動作することが知られていますが、他のほとんどのカーネルでも動作するはずです(古い方と新しい方...)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.