GRUB membingungkan kernel / initramfs dari instalasi Ubuntu dan Linux Arch

9

Saya memiliki mesin yang digunakan untuk dual-boot Ubuntu (16,04 saat ini) dan Windows 7, dengan GRUB Ubuntu sebagai boot loader.

Sekarang saya baru saja menambahkan Arch Linux sebagai OS ketiga, mengikuti instruksi instalasi resmi. Saya tidak menginstal GRUB dari Arch karena saya ingin menggunakan yang dikendalikan oleh Ubuntu. Instruksi berisi perintah mkinitcpio -p linuxyang mungkin menghasilkan beberapa file boot yang saya jalankan seperti yang dijelaskan.

Sekarang ketika saya mencoba untuk mem-boot Ubuntu dari GRUB melalui entri default-nya, saya mendapatkan kesalahan yang tidak menyenangkan ini (maaf untuk foto layar):

pesan eror

Sebagai output dari uname -apertunjukan, ia mencoba untuk mem-boot kernel Arch, tetapi /dev/sda6merupakan partisi root Ubuntu.

Saya harus menavigasi ke Advanced options for Ubuntudan memilih salah satu Ubuntu, with Linux 4.4.0-*entri untuk dapat memuat Ubuntu, saya tidak dapat menemukan entri yang akan memuat Arch dengan benar.

Menjalankan sudo update-grubdari Ubuntu ( " update-grubadalah sebuah rintisan untuk menjalankan grub-mkconfig -o /boot/grub/grub.cfguntuk menghasilkan file konfigurasi grub2." ) Tidak mengubah apa pun. The grub-customizeralat yang juga berguna dalam memperbaiki sejauh ini.

Apa yang menyebabkan kebingungan GRUB ini dan bagaimana cara memperbaikinya sehingga setiap versi Linux mem-boot dengan kernel yang benar dan dari partisi yang benar?

Sepertinya saya bodoh menginstal Arch dengan Ubuntu / boot yang terpasang, jadi mungkin menempatkan file boot-nya di sana.

Saya baik-baik saja dengan menghapus semua hal yang berhubungan dengan Arch untuk mendapatkan boot loader Ubuntu langsung lagi dan melakukan instalasi Arch yang bersih nanti.


Pembaruan (terima kasih kepada @terdon untuk dukungannya dalam obrolan Tanya Ubuntu):

Ini milik saya /boot/grub/grub.cfg.

Semua entri Linux tampaknya menunjuk pada partisi / dev / sda6 saya, yang merupakan root Ubuntu:

$ 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

Saya mencoba memperbarui konfigurasi GRUB dari Ubuntu:

$ 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

Saya mencoba menginstal ulang GRUB ke MBR dari Ubuntu:

$ 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.

Mereka adalah paket-paket kernel Ubuntu yang terinstal, saya memang mencoba dpkg-reconfiguresemuanya, tetapi tanpa efek pada masalah:

$ 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

Saya juga mencoba membuat ulang initramfs Ubuntu:

$ 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

Layout partisi saya:

Diperiksa dari sistem Ubuntu. Label harus menjelaskan sendiri.

$ 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]

Struktur menu GRUB saya:

Halaman utama GRUB

Opsi lanjutan untuk Ubuntu:
Opsi lanjutan GRUB untuk Ubuntu

Opsi lanjutan untuk Lengkungan:
Opsi lanjutan GRUB untuk Arch


/bootDirektori saya :

$ 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

Kernel 4.4.0 dan 4.2.0 haruslah Ubuntu, Arch harus memiliki kernel 4.5.0. Tetapi bagaimana saya mencari tahu file mana yang tidak memiliki versi kernel atas namanya?


Direktori root Ubuntu saya (direktori tidak termasuk):

$ 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

Direktori root Arch saya tidak mengandung file atau tautan apa pun.

Komandan Byte
sumber
Saya memiliki masalah yang sama dengan triple boot ubuntu, windows dan arch linux. Anda perlu memperbaiki grub secara manual jika perlu, boot ke linux arch kemudian membangun kembali grub dari sana, Anda mungkin perlu menginstal os-prober. kemudian jalankan ini sudo mkinitcpio -p linuxlalu sudo grub-mkconfig -o /boot/grub/grub.cfgterakhirsudo grub-install /dev/sda
Edward Torvalds
Ketika saya menginstal berbagai distro Linux di laptop saya (sambil mengganti yang lebih lama, menjaga windows tidak tersentuh) Saya punya masalah yang sama. Apa yang saya lakukan hanyalah menghapus folder masing-masing os yang lebih tua dari efi dan melakukan pembaruan grub. Tetapi dalam kasus saya, 1. Itu adalah sistem UEFI 2. Saya tidak menyimpan banyak OS linux.
Pengguna Terdaftar
Saat melakukan boot, bisakah Anda secara dinamis memodifikasi kernel dan initrd untuk mem-boot ke Ubuntu? Jika sudah melakukannya, lalu apa kesalahannya?
SHW
Layar Anda diposting berisi pesan error: Root device mounted successfully, but /sbin/init does not exists. Apakah Anda menyelidiki ini? Apakah initbenar-benar hilang? Jika demikian, Anda harus menginstalnya, jika ada, ada ide mengapa tidak dapat ditemukan?
MariusMatutiae

Jawaban:

5

Saya akhirnya menyelesaikannya dengan nuking partisi Arch dan file bootnya di /bootdirektori Ubuntu saya dari orbit. Ubuntu baik-baik saja lagi sekarang, semua entri GRUB yang tersisa berfungsi lagi.

Berikut daftar yang saya lakukan:

  • Hapus initramfsfile Arch :

    sudo rm /boot/initramfs-linux*
    
  • Hapus vmlinuzfile Arch :

    sudo rm vmlinuz-linux
    
  • Format partisi Arch ( /dev/sda8) menggunakan GParted

  • Perbarui konfigurasi GRUB:

    sudo update-grub
    
  • Reboot dan nikmatilah!

Komandan Byte
sumber
Saya pikir baris pertama kode harus berisi initramfs-linuxtidak...ranfs...
Anwar
1
@Anwar Tentu saja, terima kasih telah memperhatikan. Saya memperbaiki kesalahan ketik.
Byte Commander
1

Memperbaiki grub.cfg dengan tangan (tidak disarankan)

Melihat milikmu grub.cfg

entri Ubuntu rusak (dan beberapa yang berikut juga)

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
}

Dua baris terakhir adalah perintah grub Anda untuk memuat kernel dan initrd, dan saat ini mencari kernel ARCH dan initiramfs. Lebih jauh, ia mencari mereka di bawah /partisi yang diidentifikasi uuid=eee18451-b607-4875-8a88-c9cb6c6544c8yang mungkin atau mungkin tidak meng-host file Ubuntu yang dimaksud.

Anda dapat memperbaikinya dengan:

sudo blkid

untuk mendapatkan uuid dari partisi root ubuntu Anda.

Kemudian ganti dua baris terakhir dengan simlink ke kernel dan gambar initrd terbaru Anda (karena ini adalah cara yang diharapkan ubuntu)

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

Jika ini tidak segera memperbaikinya, beberapa koreksi lainnya mungkin diperlukan. Anda dapat menemukannya dengan "menyalin" salah satu entri yang diuji dan berfungsi, dan saya akan merekomendasikan Anda menggunakan yang paling vanilla (mis. Tidak ada pemula atau parameter kernel lainnya seperti nomodeset yang sedang diteruskan).

Ini harus menjadi kandidat yang baik:

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'

Entri Arch juga rusak, karena mungkin mencari Arch initramfs dan kernel di bawah partisi root Ubuntu. Lokasi default dari mereka adalah di bawah / boot. Sesuaikan dua baris terakhir entri Arch dengan mengoreksi lokasi dan memeriksa bahwa partisi root uuid adalah yang berisi root Arch.

A (beberapa) kata peringatan:

Secara umum TIDAK direkomendasikan untuk pengguna Ubuntu untuk mengacaukan dengan grub.cfgtangan. Membuat salinannya dengan hati-hati dan berhati-hati dalam mengeditnya. Bersiaplah untuk kemungkinan bahwa sistem Anda menjadi tidak dapat di-boot (tetapi Anda akan dapat menghidupkannya kembali menggunakan prosedur boot yang diuraikan dalam jawaban lama saya).

Selain itu, saat ini mungkin memperbaiki masalah Anda kali ini, mungkin akan kembali menggigit Anda saat berikutnya Anda harus mengisi kembali menu grub Anda. Untuk beberapa alasan, os probing grub di bawah ubuntu menjadi bingung dengan keberadaan Arch kernel under / boot. Saya kira utilitas seperti boot-repair seharusnya dapat membuat semua distro Anda dapat di-boot dengan benar, tetapi jika saya ingat dengan benar itu tidak bekerja untuk Anda.

Satu perbaikan permanen mungkin terdiri dari menginstal kernel dan gambar arch di direktori yang berbeda dari default / boot. Ini fiddly dan Anda harus berkonsultasi dengan entri grub Arch wiki tentang cara melakukannya dengan benar.

JAWABAN TUA (disarankan jika Anda berencana untuk beralih ke Arch jangka panjang) Inilah yang akan saya lakukan, dan entah bagaimana telah dilakukan beberapa bulan yang lalu.

Pergi ke halaman grub wiki lengkung dan bacalah bagian yang relevan untuk tabel partisi Anda (Anda kemungkinan UEFI, jadi baca tentang ESP dan seterusnya).

Booting ke Arch secara manual

Ini adalah pengalaman yang sangat formatif yang saya sarankan coba. Dengan asumsi kernel Linux Arch Anda berada di suatu tempat di disk Anda, tekan cpada grub prompt dan ketik ls untuk melihat daftar perangkat dan partisi yang terlihat seperti (hd0,msdos1),(hd1,gpt1),.... Anda dapat meminta mereka untuk melihat kontennya.

Anda perlu menemukan tiga hal:

  • Di mana /partisi root Arch Anda
  • Di mana kernel Arch Anda vmlinuz
  • Di mana Arch Anda intiramfs-linux.img

setelah memiliki ketiga ini, Anda akan menjalankan tiga perintah di grub> meminta sesuatu yang mirip dengan ini.

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

Perhatikan bahwa grub dapat menemukan, mis

grub> find /sbin/init

(satu grub tidak dapat menemukan secara otomatis dan membuat Anda panik kernel;))

Semua ini saya pelajari di sini , sumber yang sangat saya rekomendasikan. Jika Anda dapat mengelola, lewati untuk memperbaiki grub! Jika tidak...

Boot Arch dari kunci langsung! Dapatkan lingkungan Arch langsung dan ikuti wiki instalasi chrootke Arch dengan cara yang sama seperti yang Anda lakukan pertama kali.

Memperbaiki grub

Dari dalam Arch, instal paket grub yang relevan, dan khususnya os-proberuntuk memungkinkan grub-installuntuk mendeteksi sistem lain. Ikuti dengan hati-hati panduan instalasi di sana dan Anda harus dapat (setidaknya) mem-boot kedua arch dan ubuntu dari menu grub. Menginstal perintah pada akhirnya akan tampak seperti ini.

** Peringatan ** Jangan menjalankan perintah ini, mereka mencontohkan, Anda perlu mencari yang sesuai dengan sistem Anda

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

** Jika semuanya gagal **

Sayangnya, ini adalah spesifik karena mendapat jumlah info yang terbatas dan SE bukan benar-benar forum untuk masalah seperti itu, maka jawaban "generik" saya merujuk pada sumber daya yang bermanfaat.

Jika Anda tidak bisa mengetahuinya, mungkin mampir di forum Arch, dan asalkan Anda sudah mencoba yang terbaik dan membaca dokumen sebelumnya, Anda mungkin menemukan bantuan.

Melakukan semua ini melalui Arch telah menjadi pengalaman belajar yang mendasar bagi saya.

Tiga Diag
sumber
1
Terimakasih atas tanggapan Anda. Pertama, ini adalah sistem BIOS dengan disk yang dipartisi MBR. Kedua, saya ingin menggunakan paket grub dan konfigurasi dari Ubuntu, menginstal ulang GRUB dari Arch bukan apa yang saya rencanakan. Saya juga ragu bahwa ini akan membuat perubahan ... Dan saya bisa boot ke Ubuntu melalui entri GRUB di suatu tempat di opsi Advanced. Masalahnya adalah bahwa entah bagaimana GRUB tampaknya tidak dapat menentukan kernel atau ramdisk awal atau apa pun yang dimiliki sistem mana pada partisi mana.
Byte Commander
Pada dasarnya, langkah yang sama berlaku. grub-install dan grub-mkconfig (yang menjadikan Anda file grub.cfg baru) adalah perintah grub yang tersedia di ubuntu juga. Periksa apakah os-prober juga tersedia atau hal serupa (ini memungkinkan mkconfig untuk menemukan sistem file lain). Ini memperbaikinya dengan asumsi gambar kernel ada di tempat yang tepat, membaca ulang posting Anda. Saya tidak yakin itu masalahnya. Periksa partisi / boot Anda untuk memastikan semua kernel dan .img ada di sana. Anda mungkin telah menimpa initrd.img linux Anda dengan initramfs arch. Buka forum ubuntu atau askubuntu.
Three Diag
Ketika saya menulis, saya sudah menjalankan grub-mkconfig tetapi tidak berhasil, tetapi saya akan memeriksa gambar yang tersedia di / boot ketika saya kembali ke rumah. Dan ada beberapa skrip os-prober.
Byte Commander
Maaf, ketinggalan itu. Maka Anda mungkin telah menimpa kernel ubuntu Anda dan initrd dengan yang lengkung. Anda dapat menginstalnya dengan menjalankan urutan pemutakhiran / pembaruan dari kernel fallback ubuntu (saya pikir)
Three Diag
Kernel Ubuntu harus baik-baik saja karena saya dapat mem-boot semuanya dari menu "Opsi lanjutan untuk Ubuntu". Jika ada yang salah di sana, itu mungkin hanya symlink ke kernel default ... Akan memeriksa malam ini.
Byte Commander
0

Solusi saya lebih sederhana. Saya menggunakan terminal dan melakukan hal berikut:

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

Jika Anda memiliki masalah lebih lanjut, gunakan saja boot-repair, yang merupakan unduhan gratis, cukup kecil untuk dibakar ke disk CD.

BUR-Boop
sumber
OP sudah berjalan update-grub. Perbaikan-boot sangat tidak mungkin untuk membantu dengan masalah khusus ini.
terdon
grub dan beberapa proses perbaikan atau pembaruan boot mengasumsikan bahwa apa yang ada di /boot/grub/grub.cfg adalah ctrrent dan benar. Tapi lakukan perubahan, seperti pemformatan ulang partisi, Anda mendapatkan UUID baru, yang menempatkan Anda ke grub-rescue> Untuk mengatasinya, lakukan saja ini: sudo rm /boot/grub/grub.cfg; sudo perbarui-grub. Semua entri di grub.cfg akan baru dan terkini.
BAD-Boop
Ya, tapi sekali lagi, OP telah melakukan ini dan itu tidak membantu. Saya menyadari pertanyaannya besar dan mudah untuk dilewatkan tetapi sudo grub-mkconfig -o /boot/grub/grub.cfgada di sana. update-grubadalah skrip shell yang sangat sederhana yang berjalan grub-mkconfig -o /boot/grub/grub.cfg . Anda dapat melihat ini dengan cat /usr/sbin/update-grub.
terdon