Neden root'larımı UUID ile belirtemiyorum?


29

GRUB 2 yapılandırmamda sistemim bu sorunu önlüyor:

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

Ancak /dev/sda2ilgili UUID ile değiştirirsem :

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

daha sonra önyükleme sırasında başarısız olur:

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

UUID doğru gibi görünüyor:

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

Neden çalışmıyor Initramfs kullanmadığım için mi?

Bu, x86_64 Çekirdeği 3.10.7 olan Gentoo Linux. Bir MBR bölümleme tablosu sdave bir GUID bölümleme tablosu kullanıyorum sdb.


unknown-block(0,0)Bana bir GRUB cihazı gibi görünüyor. Tahminime göre GRUB bu UUID'yi bir nedenden dolayı kullanamıyor.
strugee

@ strugee, GRUB'un çekirdek komut satırını yorumlamaya çalıştığını sanmıyorum. (GRUB, çekirdeği yüklüyor sda1. Yapılandırmanın o kısmını göstermedim.)
cjm

Aynı fikirdeyim. Ancak, cihazın bir UNIX cihazı yerine GRUB cihazına benzemesi garip.
strugee

@Gilles, soru GRUB ile ilgili değil. Bu sadece kullanıyorum bootloader olur. Bu bir Linux çekirdeği sorusudur.
cjm

Bu da çekirdekle ilgili bir soru değil - bu da bir soru init.
mikeserv

Yanıtlar:


22

Sadece netleştirmek için UUIDs, çekirdeğin sabit diskleri tanımlaması için tek güvenilir yoldur. İki tür vardır: dosya sisteminde depolanan ve önyükleme sırasında çekirdeğe uygun olmayan UUID ve bölüm tablosunda depolanan ve önyükleme sırasında IS olan PARTUUID. Yani kullanmak zorundasın

root=PARTUUID=SSSSSSSS-PP

olarak /dev/sd??cihazlarla değiştirebilirsiniz takılı / takılı.

Alacağınız onaltılık sayıyı büyük harfle yazmayı unutmayın !SSSSSSSS-PPblkid

Kullanımı daha kolay

root=LABEL=
root=UUID=

sadece initramfsbu tanımlayıcıları alan bir kişi ile çalışın .

Öyleyse, boş olmayan bir ürün kullanıyorsanız initramfs, üçüne de sahip olabilirsiniz! Boşken initramfssadece siz varsınız PARTUUID.


Boot = -argument'ı kimin kullandığını açıklamak için sakıncası var mı? Bu satırı initrd olmayan bir Archlinuxarm kurulumu için kullandım ve boot = LABEL veya boot = UUID kullanamıyorum.
ineiti,

1
Haklısın - botu root olarak düzelttim, üzgünüm! Umarım şimdi daha mantıklı.
ineiti,

1
Anlayışım (archlinuxarm forumlarında bir gün sonra), Archlinuxarm'da initrd (veya initramfs değil), ancak kernel.org/doc/Documentation/kernel-parameters.txt initrd diye çağırıyor. Ubuntu ve ben de initrd için bir işaretçi veriyorum, fakat (benim anladığım kadarıyla) Archlinuxarm'da değil.
ineiti

1
NO initrd hakkında
Archlinuxarm

1
Bu linki dene . Ve bu bir. Ve belki bu . initramfs, initramfs görüntüsü değildir ; bu genellikle cpioçekirdeğin /açılışta paketlediği bir arşiv içeren sıkıştırılmış bir arşivdir . initramfs bir dosya sistemidir - her zaman ilk /monte edilmiş ve o zamandan beri çekirdek çağırır init. İçeriği çekirdeğe derleyebilir veya önyükleme sırasında paketinden çıkarabilirsiniz - bunlar iki seçenek.
mikeserv

16

UUID'den önyüklemeye geçmek zorunda olduğunuz parametre PARTUUID. Öyleyse olmalı root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e.

Belgeler neden geri döndüğünü açıklıyor unknown-block(0,0):

çekirdek-parametreler.txt :

    root = [KNL] Kök dosya sistemi
            İnit / do_mounts.c içindeki name_to_dev_t yorumuna bakın.

init / do_mounts.c :

/ *
 * Bir adı cihaz numarasına dönüştürün. Aşağıdaki değişkenleri kabul ediyoruz:
 *
 * 1) onaltılık cihaz numarası kendini temsil eder
 * 2) / dev / nfs, Root_NFS'yi temsil eder (0xff)
 * 3) / dev / <disk_name> diskin cihaz numarasını gösterir
 * 4) / dev / <disk_name> <decimal> cihaz numarasını gösterir
 * bölüm - cihaz sayısı disk artı bölüm numarası
 * 5) / dev / <disk_name> p <decimal> - yukarıdakiyle aynı, bu form
 * bölümlenmiş diskin disk adı bir basamakta sona erdiğinde kullanılır.
 * 6) PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFF’yi temsil eden
 Bölüm tablosunun sağladığı * benzersiz bölüm kimliği.
 * UUID, bir EFI / GPT UUID olabilir veya bir MSDOS'a atıfta bulunabilir
 * SSSSSSSS-PP formatını kullanan bölüm, burada SSSSSSSS sıfır
 * 32-bit "NT disk imzasının" doldurulmuş hex gösterimi ve PP
 *, 1 tabanlı bölüm numarasının sıfır dolu bir hex gösterimidir.
 * 7) PARTUUID = <UUID> / PARTNROFF = <int> ile ilişkili bir bölüm seçmek için
 * Bilinen benzersiz bir kimliğe sahip bir bölüm.
 *
 * Eğer isim yukarıdaki kategorilere girmediyse, geri dönüyoruz (0,0).
 * block_class bir şeyin disk ismi olup olmadığını kontrol etmek için kullanılır. Eğer disk
 * ad, eğik çizgiler içeriyor, cihaz adı ile değiştirildi.
 * patlama.
 * /

Sondaki son bit, değeri anlayamıyorsa, geri döndüğünü (0,0), dolayısıyla hatanızın olduğunu söylüyor .


1
Bu sadece kısmen doğrudur. Bir bölüm UUID, dosya sisteminin UUID'sinden tamamen farklıdır, bu nedenle PARTUUID=666c2eee-193d-42db-a490-4c444342bd4eçalışmaz. Ancak, kullanabildim PARTUUID=SSSSSSSS-02(burada SSSSSSSS, hata mesajından hemen önce gösterilen NT disk imzasıdır).
cjm

6
Bu yüzden sanırım asıl cevap, çekirdeğin root=UUIDsadece desteklemediğidir root=PARTUUID. Bir dosya sistemi UUID kullanmak istiyorsanız, UUID ile montaj dosya sistemlerini işleyebilecek bir initramfs'a ihtiyacınız olduğunu düşünüyorum.
cjm

@cjm grubbotlarımı oldukça mutlu bir şekilde root=UUID.
terdon

3
@ terdon, initramfs veya initrd'nız olduğuna bahse girerim. (Ayrı bir dosya olmak yerine çekirdeğinize bağlanabilir.)
cjm

4

Bu 5 yaşında bir konu. Ama yine de tam olarak cevaplanmadı. Eksik küçük bir örnek var. İşte burada:

Bu örnekte:

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

... bir GPT bölümü kullanarak. MBR (dos bölümleme) ile PARTUUID'ler daha kısadır, ancak prosedür aynıdır ...

PARTUUID'leri blkid ile alın:

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

Bu, lfs8.1 (WORC 4.12.7) ile ÇALIŞIYOR bilinir. Fakat bence diğer birçok çekirdekle de çalışması gerekir (yaşlılar ve yeniler ...)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.