Mengapa saya tidak bisa menentukan root fs saya dengan UUID?

29

Sistem saya melakukan booting OK dengan ini di konfigurasi GRUB 2 saya:

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

Tetapi jika saya ganti /dev/sda2dengan UUID yang sesuai:

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

maka gagal saat boot:

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

UUID tampaknya benar:

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

Mengapa itu tidak berhasil? Apakah karena saya tidak menggunakan initramfs?

Ini adalah x86_64 Gentoo Linux dengan kernel 3.10.7. Saya menggunakan tabel partisi MBR sdadan tabel partisi GUID sdb.

cjm
sumber
unknown-block(0,0)Sepertinya perangkat GRUB bagi saya. Dugaan saya adalah bahwa GRUB tidak dapat menggunakan UUID itu untuk beberapa alasan.
strugee
@ strugee, saya tidak berpikir GRUB mencoba menafsirkan baris perintah kernel sama sekali. (GRUB sedang memuat kernel dari sda1. Saya tidak menunjukkan bagian dari konfigurasi.)
cjm
Saya cenderung setuju. anehnya, perangkat ini terlihat seperti perangkat GRUB dan bukan perangkat UNIX.
strugee
@Gilles, pertanyaannya bukan tentang GRUB. Kebetulan itu bootloader yang saya gunakan. Ini pertanyaan kernel Linux.
cjm
Ini juga bukan pertanyaan tentang kernel - ini adalah pertanyaan tentang init.
mikeserv

Jawaban:

22

Hanya untuk mengklarifikasi UUIDs adalah satu-satunya cara yang dapat diandalkan untuk mengidentifikasi hard drive. Ada dua jenis: UUID, yang disimpan dalam sistem file dan tidak tersedia untuk kernel saat boot, dan PARTUUID, yang disimpan dalam tabel partisi dan IS tersedia pada saat boot. Jadi kamu harus menggunakan

root=PARTUUID=SSSSSSSS-PP

seperti /dev/sd??dapat berubah dengan perangkat yang terpasang / tidak terhubung.

Jangan lupa untuk memanfaatkan angka heksadesimal yang SSSSSSSS-PPAnda dapatkan blkid!

Semakin mudah digunakan

root=LABEL=
root=UUID=

hanya bekerja dengan initramfsyang mengambil pengidentifikasi ini.

Jadi, jika Anda menggunakan non-kosong initramfs, Anda dapat memiliki ketiganya! Dengan kosong initramfs, Anda hanya punya PARTUUID.

Inisiasi
sumber
Pikiran untuk menjelaskan siapa yang menggunakan boot = -argumen itu? Saya baru saja menggunakan baris ini untuk instalasi Archlinuxarm yang tidak memiliki initrd, dan di mana saya tidak dapat menggunakan boot = LABEL atau boot = UUID.
INFITI
1
Anda benar - saya memperbaiki boot ke root, maaf! Semoga ini lebih masuk akal sekarang.
INFITI
1
Pemahaman saya (setelah satu hari di forum archlinuxarm) adalah bahwa tidak ada initrd (atau initramfs, tetapi kernel.org/doc/Documentation/kernel-parameters.txt menyebutnya initrd) di Archlinuxarm. Di Ubuntu dan semacamnya saya memberikan pointer ke initrd, tetapi (untuk pemahaman saya) tidak di Archlinuxarm.
INFITI
1
Diskusi Archlinuxarm tentang NO initrd: archlinuxarm.org/forum/viewtopic.php?f=23&t=6652
ineiti
1
Coba tautan ini . Dan yang ini . Dan mungkin yang ini . initramfs bukan gambar initramfs - yang biasanya merupakan arsip terkompresi yang berisi cpioarsip yang dibongkar kernel /saat boot. initramfs adalah filesystem - selalu merupakan yang pertama di- /mount dan sejak saat itu kernel memanggil init. Anda dapat mengkompilasi konten ke dalam kernel atau membukanya saat boot - itu adalah dua opsi.
mikeserv
16

Parameter yang Anda harus lewati untuk mem-boot dari UUID adalah PARTUUID. Seharusnya begitu root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e.

Dokumentasi menjelaskan mengapa ia kembali dengan unknown-block(0,0):

kernel-parameter.txt :

    root = [KNL] Root filesystem
            Lihat komentar name_to_dev_t di init / do_mounts.c.

init / do_mounts.c :

/ *
 * Ubah nama menjadi nomor perangkat. Kami menerima varian berikut:
 *
 * 1) nomor perangkat dalam heksadesimal mewakili dirinya sendiri
 * 2) / dev / nfs mewakili Root_NFS (0xff)
 * 3) / dev / <disk_name> mewakili nomor perangkat disk
 * 4) / dev / <disk_name> <decimal> mewakili nomor perangkat
 * dari partisi - nomor perangkat disk ditambah nomor partisi
 * 5) / dev / <disk_name> p <decimal> - sama seperti di atas, bentuknya adalah
 * Digunakan ketika nama disk dari disk yang dipartisi berakhir pada angka.
 * 6) PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFF mewakili
 * ID unik dari sebuah partisi jika tabel partisi menyediakannya.
 * UUID dapat berupa UUID EFI / GPT, atau merujuk ke MSDOS
 * Partisi menggunakan format SSSSSSSSS-PP, di mana SSSSSSSSS adalah nol-
 * diisi representasi hex dari "tanda tangan disk NT" 32-bit, dan PP
 * adalah representasi hex yang diisi nol dari nomor partisi berbasis 1.
 * 7) PARTUUID = <UUID> / PARTNROFF = <int> untuk memilih partisi yang terkait dengan
 * Partisi dengan id unik yang dikenal.
 *
 * Jika nama tidak termasuk dalam kategori di atas, kami mengembalikan (0,0).
 * block_class digunakan untuk memeriksa apakah ada nama disk. Jika disk
 * nama mengandung garis miring, nama perangkat diganti dengan
 * poni.
 * /

Bit terakhir di akhir mengatakan bahwa jika tidak dapat memahami nilainya, ia kembali (0,0), maka kesalahan Anda.

Patrick
sumber
1
Ini hanya sebagian benar. UUID partisi sama sekali berbeda dengan UUID sistem berkas, jadi PARTUUID=666c2eee-193d-42db-a490-4c444342bd4etidak berfungsi. Namun, saya bisa menggunakan PARTUUID=SSSSSSSS-02(di mana SSSSSSSSS adalah tanda tangan disk NT yang ditampilkan tepat sebelum pesan kesalahan).
cjm
6
Jadi saya kira jawaban sebenarnya adalah bahwa kernel tidak mendukung root=UUID, hanya saja root=PARTUUID. Jika Anda ingin menggunakan sistem file UUID, saya kira Anda memerlukan initramfs yang dapat menangani pemasangan filesystem oleh UUID.
cjm
@ cjm grubsepatu bot saya cukup senang root=UUID.
terdon
3
@terdon, saya yakin Anda memiliki initramf atau initrd. (Ini dapat dihubungkan ke kernel Anda alih-alih menjadi file terpisah.)
cjm
4

Ini adalah utas berusia 5 tahun. Tapi tetap saja itu tidak sepenuhnya dijawab. Ada sedikit contoh yang hilang. Ini dia:

Dalam contoh ini:

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

... menggunakan partisi GPT. Dengan MBR (partisi dos) PARTUUID lebih pendek tetapi prosedurnya sama ...

dapatkan PARTUUID dengan blkid:

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

Ini diketahui BEKERJA dengan lfs8.1 (kernel 4.12.7) Tapi saya pikir ini juga bisa digunakan pada kebanyakan kernel lain (lama dan baru ...)

Michael HG Schmidt
sumber