GRUB, Ubuntu ve Arch Linux kurulumunun çekirdeklerini / initramlarını karıştırıyor


9

Ubuntu'nun (şu anda 16.04) ve Windows 7'nin Ubuntu'nun GRUB'u önyükleme yükleyicisi olarak çift önyüklemesinde kullanılan bir makinem var.

Şimdi, resmi kurulum talimatlarını izleyerek Arch Linux'u üçüncü işletim sistemi olarak ekledim. Ubuntu tarafından kontrol edileni kullanmak istediğim için Arch'dan GRUB yüklemedim. Talimatlar mkinitcpio -p linuxmuhtemelen açıklandığı gibi çalıştırdığım bazı önyükleme dosyaları üreten bir komut içeriyordu .

Şimdi Ubuntu'yu varsayılan girişiyle GRUB'dan önyüklemeye çalıştığımda, bu hoş olmayan hatayı alıyorum (ekran fotoğrafı için özür dilerim):

hata mesajı

Şovların çıktısı olarak uname -a, Arch çekirdeğini önyüklemeye çalışıyor, ancak /dev/sda6Ubuntu kök bölümüdür.

Ubuntu'yu yüklemek Advanced options for Ubuntuiçin Ubuntu, with Linux 4.4.0-*girişlerden birine gitmem ve seçmem gerekiyor, Arch'ı doğru bir şekilde yükleyecek bir giriş bulamadım.

sudo update-grubUbuntu'dan çalıştırmak ( " grub2 yapılandırma dosyası oluşturmak update-grubiçin çalışan grub-mkconfig -o /boot/grub/grub.cfgbir saplamadır." ) Hiçbir şeyi değiştirmez. grub-customizerAracı da şimdiye kadar bu sabitleme faydasız oldu.

GRUB'un bu karışıklığına neden olan şey nedir ve her Linux sürümünün doğru çekirdekle ve doğru bölümle önyüklenmesi için nasıl düzeltebilirim?

Görünüşe göre Arch'ı Ubuntu'nun / önyüklemesine takılı olarak aptalca kurdum, bu yüzden muhtemelen önyükleme dosyalarını oraya yerleştirdi.

Ubuntu'nun önyükleme yükleyicisini tekrar düz bir şekilde almak ve daha sonra Arch'ın temiz bir kurulumunu yapmak için Arch ile ilgili tüm şeyleri silmekle iyiyim.


Güncellemeler (Ask Ubuntu sohbetindeki desteği için @terdon'a teşekkürler):

İşte benim /boot/grub/grub.cfg.

Tüm Linux girişleri Ubuntu'nun kökü olan / dev / sda6 bölümümü gösteriyor gibi görünüyor:

$ grep ' linux /' /boot/grub/grub.cfg
    linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset

Ubuntu'dan GRUB yapılandırmasını güncellemeye çalıştım:

$ sudo grub-mkconfig -o /boot/grub/grub.cfg 
Generating grub configuration file ...
dpkg: warning: version 'linux' has bad syntax: version number does not start with a digit
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Found linux image: /boot/vmlinuz-4.4.0-21-generic
Found initrd image: /boot/initrd.img-4.4.0-21-generic
Found linux image: /boot/vmlinuz-4.2.0-35-generic
Found initrd image: /boot/initrd.img-4.2.0-35-generic
Found memtest86+ image: /memtest86+.elf
Found memtest86+ image: /memtest86+.bin
Found Windows 7 (loader) on /dev/sda1
Found Arch on /dev/sda8
done

Ubuntu'dan MBR'ye GRUB'u yeniden yüklemeye çalıştım:

$ sudo grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

$ sudo grub-install --recheck /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

Bu arada yüklü Ubuntu çekirdek paketleri dpkg-reconfigure, hepsini denedim , ancak sorun üzerinde herhangi bir etkisi olmadan:

$ dpkg -l linux-image* | grep ^ii
ii  linux-image-4.2.0-35-generic       4.2.0-35.40  amd64        Linux kernel image for version 4.2.0 on 64 bit x86 SMP
ii  linux-image-4.4.0-21-generic       4.4.0-21.37  amd64        Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-extra-4.2.0-35-generic 4.2.0-35.40  amd64        Linux kernel extra modules for version 4.2.0 on 64 bit x86 SMP
ii  linux-image-extra-4.4.0-21-generic 4.4.0-21.37  amd64        Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP

Ayrıca Ubuntu initramflarını yeniden oluşturmaya çalıştım:

$ sudo update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-4.4.0-21-generic
update-initramfs: Generating /boot/initrd.img-4.2.0-35-generic

Bölüm düzenim:

Ubuntu sisteminden kontrol edildi. Etiketler kendilerini açıklamalıdır.

$ lsblk -f /dev/sda
NAME    FSTYPE LABEL       UUID                                 MOUNTPOINT
sda                                                             
├─sda1  ntfs   win7-boot   90DCF3A5DCF3842E                     /win/boot
├─sda2  ntfs   windows7    482C7A572C7A3FCC                     /win/c
├─sda3  ext4   grub-boot   6dbb8633-dadd-4b5e-8d85-b0895fde9dfb /boot
├─sda5  ext4   images      81dc42c4-a161-4ccd-b704-6e5c09298943 /images
├─sda6  ext4   ubuntu-1604 eee18451-b607-4875-8a88-c9cb6c6544c8 /
├─sda7  ext4   ubuntu-home 485b3ef1-7216-4053-b25c-f656d529e8e6 /home
├─sda8  ext4   arch-root   8d281a0c-969c-44cf-ba6a-1d3c7b4be7ec 
├─sda9  ext4   arch-home   32522902-a53d-44c8-90f2-6bbf14c40f1f 
└─sda10 swap   linux-swap  8b05bd9b-bc42-46f6-8c18-50711a3c48b9 [SWAP]

GRUB menü yapım:

GRUB ana sayfası

Ubuntu için gelişmiş seçenekler:
Ubuntu için GRUB gelişmiş seçenekleri

Arch için gelişmiş seçenekler:
Arch için GRUB gelişmiş seçenekleri


Benim /bootdizini:

$ ls -la /boot
total 118480
drwxr-xr-x  4 root root     4096 Apr 24 20:50 .
drwxr-xr-x 28 root root     4096 Apr 24 19:44 ..
-rw-r--r--  1 root root  1313029 Mär 16 01:45 abi-4.2.0-35-generic
-rw-r--r--  1 root root  1239577 Apr 19 00:21 abi-4.4.0-21-generic
-rw-r--r--  1 root root   184888 Mär 16 01:45 config-4.2.0-35-generic
-rw-r--r--  1 root root   189412 Apr 19 00:21 config-4.4.0-21-generic
drwxr-xr-x  6 root root     4096 Apr 26 19:58 grub
-rw-r--r--  1 root root 18598360 Apr 24 20:59 initramfs-linux-fallback.img
-rw-r--r--  1 root root  3516429 Apr 24 20:59 initramfs-linux.img
-rw-r--r--  1 root root 33642388 Apr 24 18:31 initrd.img-4.2.0-35-generic
-rw-r--r--  1 root root 36143341 Apr 24 19:51 initrd.img-4.4.0-21-generic
drwx------  2 root root    16384 Okt 28 17:43 lost+found
-rw-r--r--  1 root root   182704 Jan 28 13:44 memtest86+.bin
-rw-r--r--  1 root root   184380 Jan 28 13:44 memtest86+.elf
-rw-r--r--  1 root root   184840 Jan 28 13:44 memtest86+_multiboot.bin
-rw-------  1 root root  3745312 Mär 16 01:45 System.map-4.2.0-35-generic
-rw-------  1 root root  3853719 Apr 19 00:21 System.map-4.4.0-21-generic
-rw-------  1 root root  6829104 Mär 16 01:45 vmlinuz-4.2.0-35-generic
-rw-------  1 root root  7013968 Apr 19 00:21 vmlinuz-4.4.0-21-generic
-rw-r--r--  1 root root  4435552 Apr 14 19:20 vmlinuz-linux

4.4.0 ve 4.2.0 çekirdekleri Ubuntu, Arch'ın 4.5.0 çekirdeği olmalıdır. Ancak, adında çekirdek sürümü olmayan hangi dosyanın neye ait olduğunu nasıl öğrenebilirim?


Ubuntu kök dizinim (dizinler hariç):

$ ls -la / | grep ^[^d]
total 124
lrwxrwxrwx   1 root      root         32 Apr 24 19:44 initrd.img -> boot/initrd.img-4.4.0-21-generic
lrwxrwxrwx   1 root      root         32 Apr  5 17:45 initrd.img.old -> boot/initrd.img-4.2.0-35-generic
lrwxrwxrwx   1 root      root         29 Apr 24 19:44 vmlinuz -> boot/vmlinuz-4.4.0-21-generic
lrwxrwxrwx   1 root      root         29 Apr  5 17:45 vmlinuz.old -> boot/vmlinuz-4.2.0-35-generic

Benim Arch kök dizini herhangi bir dosya veya bağlantılar içermez.


Ubuntu, windows ve arch linux üçlü önyükleme ile aynı sorun vardı. Gerekirse grub'u manuel olarak düzeltmeniz, arch linux'a önyüklemeniz ve sonra grubunuzu yeniden oluşturmanız gerekir, yüklemeniz gerekebilir os-prober. daha sonra bu çalıştırmak sudo mkinitcpio -p linuxsonra sudo grub-mkconfig -o /boot/grub/grub.cfgson olaraksudo grub-install /dev/sda
Edward Torvalds

Dizüstü bilgisayarıma çeşitli Linux dağıtımları yüklerken (eski olanı değiştirirken, pencerelere dokunmadan) benzer bir sorun yaşadım. Ama benim durumumda, 1. UEFI sistemiydi 2. Birden fazla linux işletim sistemi tutmadım.
Kayıtlı Kullanıcı

Önyükleme yaparken, Ubuntu'ya önyükleme yapmak için çekirdek ve initrd'i dinamik olarak değiştirebilir misiniz? Bunu yaptıysanız, hata nedir?
SHW

Yayınladığınız ekran hata iletisi içerir: Root device mounted successfully, but /sbin/init does not exists. Bunu araştırdın mı? Mı initgerçekten kayıp mı? Öyleyse, kesinlikle yüklemelisiniz, eğer varsa, neden bulunamadığına dair bir fikir var mı?
MariusMatutiae

Yanıtlar:


5

Sonunda Ubuntu'nun /bootdizinindeki Arch bölümünü ve önyükleme dosyalarını yörüngeden çekerek çözdüm . Ubuntu şimdi iyi durumda, kalan tüm GRUB girişleri tekrar çalışıyor.

İşte yaptığım şeylerin bir listesi:

  • Arch'ın initramfsdosyalarını sil :

    sudo rm /boot/initramfs-linux*
    
  • Arch'ın vmlinuzdosyasını sil :

    sudo rm vmlinuz-linux
    
  • /dev/sda8GParted kullanarak Arch bölümünü ( ) biçimlendirin

  • GRUB'un yapılandırmasını güncelleyin:

    sudo update-grub
    
  • Yeniden başlatın ve tadını çıkarın!


Ben ilk kodlu hat içermesi gerektiğini düşünüyorum initramfs-linuxdeğil...ranfs...
Enver

1
@Anwar Tabii ki, dikkat ettiğiniz için teşekkürler. Yazım hatasını düzelttim.
Byte Komutanı

1

Grub.cfg'yi elle sabitleme (önerilmez)

Şuna bakıyorsun grub.cfg

Ubuntu girişi bozuk (ve aşağıdakilerden bazıları da)

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-eee18451-b607-4875-8a88-c9cb6c6544c8' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos3'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos3 --hint-efi=hd0,msdos3 --hint-baremetal=ahci0,msdos3  6dbb8633-dadd-4b5e-8d85-b0895fde9dfb
    else
      search --no-floppy --fs-uuid --set=root 6dbb8633-dadd-4b5e-8d85-b0895fde9dfb
    fi
    linux   /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro  
    initrd  /initramfs-linux.img
}

Son iki satır, çekirdek ve initrd yüklemek için grub tarafından verilen komutunuzdur ve şu anda ARCH çekirdeğini ve initiramf'lerini arıyor. Dahası, bunları , amaçlanan Ubuntu dosyalarını barındırabilecek veya barındıramayacak şekilde /tanımlanan bölümde arar uuid=eee18451-b607-4875-8a88-c9cb6c6544c8.

Bunu şu şekilde düzeltebilirsiniz:

sudo blkid

ubuntu kök bölümünüzü elde etmek için.

Sonra son iki satırı simlink ile en son çekirdek ve initrd görüntülerinize değiştirin (ubuntu'nun olmasını beklediği yol budur)

linux   /vmlinuz root=UUID=<correct-uuid-ubuntu-partition> ro  
initrd  /initrd.img

Bu hemen çözmezse, başka bir düzeltme gerekebilir. Bunları, test edilen ve çalışan girişlerden birini "kopyalayarak" öğrenebilirsiniz ve en vanilyayı kullanmanızı öneriyoruz (örneğin, hiçbir başlangıç ​​veya geçirilen nomodeset gibi başka bir çekirdek parametresi yok).

Bu iyi bir aday olmalı:

menuentry 'Ubuntu, with Linux 4.4.0-21-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-advanced-eee18451-b607-4875-8a88-c9cb6c6544c8'

Arch girişi de benzer şekilde kırılmıştır, çünkü muhtemelen Ubuntu kök bölümü altında Arch initramfs ve çekirdeği arar. Bunların varsayılan konumu / boot altındadır. Konumu düzelterek ve kök bölüm uuidinin Arch kökünü içeren bölüm olup olmadığını kontrol ederek Arch girişinin son iki satırını ayarlayın.

Bir (birkaç) uyarı kelimesi:

Genellikle Ubuntu kullanıcılarının grub.cfgel ile uğraşmaları önerilmez . Kesinlikle bir kopyasını alın ve düzenlemesinde dikkatli olun. Sisteminizin önyüklenemez hale gelme olasılığına hazırlıklı olun (ancak eski cevabımda belirtilen önyükleme prosedürünü kullanarak yeniden diriltebilirsiniz).

Ayrıca, bu sorununuzu bu sefer düzeltebilir, ancak grub menünüzü yeniden doldurmanız gerektiğinde sizi ısırmaya geri dönebilir. Bazı nedenlerden dolayı, ubuntu altında grubun os araştırması, / boot altında Arch çekirdeğinin varlığıyla karıştırılır. Önyükleme-onarım gibi bir yardımcı programın tüm dağıtımlarınızı doğru bir şekilde önyüklenebilir hale getirebileceğini tahmin ediyorum, ancak doğru hatırlarsam sizin için işe yaramadı.

Kalıcı bir düzeltme, kemer çekirdeğinin ve görüntülerin varsayılan / önyüklemeden farklı bir dizine yüklenmesinden oluşabilir. Bu fiddly ve düzgün yapmak için Arch wiki grub girdisine danışmalısınız.

ESKİ CEVAP (Arch'a uzun vadede geçiş yapmayı planlıyorsanız önerilir) İşte yapacağım şey ve bir şekilde birkaç ay önce yaptım.

Git kemer wiki grub sayfa ve bölüm tablosu için ilgili bölümü okumak (muhtemelen UEFI, bu nedenle ESP hakkında okumak ve benzeri vardır).

Manuel olarak Arch içine önyükleme

Bu, denemenizi tavsiye ettiğim son derece biçimlendirici bir deneyim. Arch Linux çekirdeğinizin diskinizde bir yerde olduğunu varsayarsak c, grub isteminde tuşuna basın ve cihaz ve bölümlerin bir listesini görmek için ls yazın (hd0,msdos1),(hd1,gpt1),.... İçeriği görmek için her birini yapabilirsiniz.

Üç şey bulmanız gerekiyor:

  • Arch /kök bölümünüz nerede
  • Arch çekirdeğin nerede vmlinuz
  • Kemerin nerede intiramfs-linux.img

bu üçüne sahip olduktan sonra, buna benzer bir şey istemek için üç komut çalıştırırsınız.

grub> set root=(hd0,1)
grub> linux /vmlinuz root=/dev/sda1
grub> initrd /intiramfs-linux.img
grub> boot

Grub'un bulabileceğine dikkat edin, örn.

grub> find /sbin/init

(bir grup otomatik olarak bulamaz ve çekirdek paniği verir;))

Bütün bunları burada öğrendim , tavsiye ettiğim bir kaynak. Eğer yönetebiliyorsanız, grub düzeltmeye atlayın! Aksi takdirde...

Arch'ı canlı bir anahtardan başlatın! Canlı bir Arch ortamı edinin chrootve ilk kez yaptığınız gibi Arch'a kurulum wiki'sini takip edin .

Grub sabitleme

Arch'ın içinden, ilgili grub paketlerini yükleyin ve özellikle diğer sisteminizi algılamaya os-proberizin vermek grub-installiçin. Buradaki kurulum kılavuzunu dikkatlice izleyin ve grub menüsünden hem en azından hem kemer hem de ubuntu'yu önyükleyebilmelisiniz. Komutların yüklenmesi bunun gibi görünecektir.

** Uyarı ** Bu komutu çalıştırmayın, bunlar örnektir, sisteminize uygun olanları bulmanız gerekir

# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck
# grub-mkconfig -o /boot/grub/grub.cfg

** Eğer hepsi hataysa **

Ne yazık ki, bu sınırlı sayıda bilgi verildiği kadar spesifiktir ve SE gerçekten bu tür sorunlar için bir forum değildir, bu nedenle yararlı kaynaklara atıfta bulunarak "genel" cevabım.

Bunu anlayamıyorsanız, belki de Arch forumlarına uğrayın ve elinizden gelenin en iyisini denediyseniz ve belgeleri önceden okuduysanız, yardım bulabilirsiniz.

Tüm bunları Arch aracılığıyla yapmak benim için temel bir öğrenme deneyimi oldu.


1
Yanıtınız için teşekkürler. İlk olarak, MBR bölümlenmiş diske sahip bir BIOS sistemidir. İkincisi, Ubuntu grub paketini ve yapılandırmasını kullanmak istiyorum, GRUB'u Arch'dan yeniden yüklemek planladığım şey değil. Bunun herhangi bir değişiklik yapacağından da şüpheliyim ... Ve Ubuntu'ya GRUB girişi ile Gelişmiş seçeneklerde bir yere önyükleme yapabilirim. Sorun şu ki, GRUB bir şekilde hangi çekirdeğin veya ilk ramdisk'in veya hangi bölüme hangi sisteme ait olduğunu belirleyemiyor gibi görünüyor.
Byte Komutanı

Esasen, aynı adımlar geçerlidir. grub-install ve grub-mkconfig (yeni bir grub.cfg dosyaları yapar) ubuntu altında da kullanılabilir grub komut vardır. Os-prober'in kullanılabilir olup olmadığını veya benzer bir şeyi kontrol edin (bu, mkconfig'in diğer dosya sistemlerini bulmasına izin verir). Çekirdek görüntülerin doğru yerde olduğunu varsayarsak bu düzeltmeleri düzeltir, yazınızı tekrar okuduğumdan emin değilim. Tüm çekirdeklerin ve .img'nin orada olduğundan emin olmak için / boot bölümünüzü inceleyin. Linux initrd.img dosyanızın üzerine arch initramfs yazmış olabilirsiniz. Ubuntu forumlarına veya askubuntu'ya basın.
Üç Diag

Yazdığım gibi, grub-mkconfig'i zaten boşuna çalıştırdım, ancak eve döndüğümde / boot içindeki mevcut görüntüleri kontrol edeceğim. Ve bazı os-prober komut dosyaları var.
Byte Komutanı

Üzgünüm, kaçırdım. O zaman muhtemelen ubuntu çekirdeğinizin ve initrd'inizin üzerine kemer olanlarla yazdınız. Ubuntu yedek çekirdeğinden yükseltme / güncelleme dizinizi çalıştırarak onları yerleştirebilirsiniz (Bence)
Üç Diag

"Ubuntu için gelişmiş seçenekler" menüsünden hepsini önyükleyebildiğim için Ubuntu çekirdekleri iyi olmalı. Orada yanlış bir şey varsa, sadece varsayılan çekirdeğin bağlantısı olabilir ... Bu akşam kontrol edeceğiz.
Byte Komutanı

0

Benim çözümüm daha basit. Terminali kullanıyorum ve aşağıdakileri yapıyorum:

sudo rm /boot/grub/grub.cfg
sudo update-grub

Başka sorunlarınız varsa, sadece boot-repairbir indirme olan CD diskine yazabilecek kadar küçük kullanın.


OP zaten çalışıyor update-grub. Önyükleme onarımının bu özel soruna yardımcı olması pek olası değildir.
terdon

grub ve bazı önyükleme onarım veya güncelleme işlemleri /boot/grub/grub.cfg dosyasındaki öğelerin ctrrent ve doğru olduğunu varsayar. Ancak, bölüm yeniden biçimlendirmesi gibi değişiklikler yapın, yeni bir UUID alırsınız, bu da sizi grub kurtarmaya sokar> Bununla başa çıkmak için şunu yapın: sudo rm /boot/grub/grub.cfg; sudo güncelleme grubu. Grub.cfg'deki tüm girişler yeni ve güncel olacaktır.
BAD-Boop

Evet, ama yine de OP bunu zaten yaptı ve yardımcı olmadı. Sorunun büyük olduğunu ve kaçırılması kolay ama sudo grub-mkconfig -o /boot/grub/grub.cfgtam orada olduğunu anlıyorum . update-grubçalışan çok basit bir kabuk betiğidir grub-mkconfig -o /boot/grub/grub.cfg . Bunu ile görebilirsiniz cat /usr/sbin/update-grub.
terdon
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.