GRUBはUbuntuおよびArch Linuxインストールのカーネル/ initramfsを混同します


9

私は、Ubuntu(現在16.04)とWindows 7をデュアルブートするマシンを使用していて、UbuntuのGRUBをブートローダーとして使用しています。

公式のインストール手順に従って、Arch Linuxを3番目のOSとして追加しました。Ubuntuで制御されているものを使用したかったため、ArchからGRUBをインストールしませんでした。指示にはmkinitcpio -p linux、おそらく説明したように実行したいくつかのブートファイルを生成するコマンドが含まれていました。

ここで、デフォルトのエントリを介してGRUBからUbuntuを起動しようとすると、次の不愉快なエラーが表示されます(画面の写真で申し訳ありません)。

エラーメッセージ

の出力がuname -a示すように、これはArchカーネルを起動しようとしています/dev/sda6が、Ubuntuルートパーティションです。

UbuntuをロードできるようにするにAdvanced options for Ubuntuは、いずれかのUbuntu, with Linux 4.4.0-*エントリに移動して選択する必要がありますが、Archを正しくロードするエントリが見つかりませんでした。

sudo update-grubUbuntuから実行しても(update-grub実行grub-mkconfig -o /boot/grub/grub.cfgしてgrub2構成ファイルを生成するためのスタブです。」)、何も変更されません。grub-customizerこれまでのところ、このツールを修正しても役に立たなかった。

このGRUBの混乱の原因は何ですか?各Linuxバージョンが正しいカーネルと正しいパーティションから起動するように修正するにはどうすればよいですか?

Ubuntuの/ bootがマウントされた状態でArchを愚かにインストールしたようですが、おそらくそこにブートファイルが置かれています。

私は、Ubuntuのブートローダーを再びまっすぐにして、後でArchのクリーンインストールを行うために、Arch関連のすべてのものを消去することに問題はありません。


アップデート(Ask Ubuntuチャットでのサポートについて@terdonに感謝):

こちらが私/boot/grub/grub.cfgです。

すべてのLinuxエントリは、Ubuntuのルートである/ dev / sda6パーティションをポイントしているようです。

$ 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からGRUB構成を更新しようとしました:

$ 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からMBRにGRUBを再インストールしようとしました:

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

ちなみにこれらはインストールされているUbuntuカーネルパッケージです。私はdpkg-reconfigureそれらをすべて試しましたが、問題に影響はありませんでした。

$ 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

私はまた、Ubuntu initramfsを再生成しようとしました:

$ 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

私のパーティションレイアウト:

Ubuntuシステムから確認。ラベルは自分自身を説明する必要があります。

$ 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メニュー構造:

GRUBメインページ

Ubuntuの詳細オプション:
UbuntuのGRUB詳細オプション

Archの詳細オプション:
ArchのGRUB詳細オプション


私の/bootディレクトリ:

$ 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と4.2.0カーネルはUbuntuで、Archは4.5.0カーネルである必要があります。しかし、名前にカーネルバージョンのないファイルが何に属しているかを調べるにはどうすればよいですか?


私のUbuntuルートディレクトリ(除外されたディレクトリ):

$ 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

私のアーチのルートディレクトリには、任意のファイルやリンクが含まれていません。


私はubuntu、windows、arch linuxのトリプルブートで同じ問題を抱えていました。必要に応じて手動でgrubを修正し、arch linuxで起動してからそこからgrubを再構築する必要がありますos-prober。インストールする必要があるかもしれません。その後、これらsudo mkinitcpio -p linuxsudo grub-mkconfig -o /boot/grub/grub.cfg最後に実行しますsudo grub-install /dev/sda
エドワードトーバルズ

ラップトップにさまざまなLinuxディストリビューションをインストールしているとき(古いものを置き換え、ウィンドウには触れないでください)、同じような問題がありました。しかし、私の場合、1。それはUEFIシステムでした。2。複数のLinux OSを保持していませんでした。
登録ユーザー

起動中に、カーネルとinitrdを動的に変更してUbuntuで起動できますか?そうした場合、エラーは何ですか?
SHW 2016

投稿した画面にエラーメッセージが含まれています:Root device mounted successfully, but /sbin/init does not exists。これを調査しましたか?されてinit、本当に不足していますか?もしそうなら、あなたは間違いなくそれをインストールするべきです、代わりにそれが存在するなら、それがなぜ見つからないのかという考えがありますか?
MariusMatutiae 2016年

回答:


5

私はついに、Ubuntuの/bootディレクトリにあるArchパーティションとそのブートファイルをオービットから削除することで解決しました。Ubuntuが再び正常に動作し、残りのすべてのGRUBエントリが再び機能します。

これが私がしたことのリストです:

  • Archのinitramfsファイルを削除します。

    sudo rm /boot/initramfs-linux*
    
  • Archのvmlinuzファイルを削除します。

    sudo rm vmlinuz-linux
    
  • /dev/sda8GPartedを使用してArchパーティションをフォーマット()

  • GRUBの構成を更新します。

    sudo update-grub
    
  • 再起動してお楽しみください!


最初のコード化された行には含まれてinitramfs-linuxいないと思います...ranfs...
Anwar

1
@Anwarもちろん、注意を払ってくれてありがとう。タイプミスを修正しました。
バイトコマンダー

1

手作業でgrub.cfgを修正する(非推奨)

あなたを見て grub.cfg

Ubuntuエントリが壊れている(および次のエントリの一部も同様)

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
}

最後の2行は、カーネルとinitrdをロードするためにgrubが発行したコマンドで、現在ARCHカーネルとinitiramfsを探しています。さらに、目的のUbuntuファイルをホストしている、またはホストしていない可能性がある/によって識別されるinパーティションの下でそれらを探しuuid=eee18451-b607-4875-8a88-c9cb6c6544c8ます。

あなたはこれを修正することができます:

sudo blkid

ubuntuルートパーティションのuuidを取得します。

次に、最後の2行を最新のカーネルとinitrdイメージへのsimlinkに置き換えます(これは、ubuntuが想定している方法であるため)

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

これですぐに修正できない場合は、他の修正が必要になる可能性があります。テスト済みで動作しているエントリの1つを「コピー」することでそれらを見つけることができます。私は、最も一般的なエントリ(たとえば、upstartやnomodesetなどの他のカーネルパラメータが渡されない)を使用することをお勧めします。

これは良い候補です:

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エントリも同様に壊れており、UbuntuルートパーティションでArch initramfsとカーネルを検索している可能性があります。これらのデフォルトの場所は/ bootです。場所を修正し、ルートパーティションのuuidがArchルートを含むものであることを確認して、Archエントリの最後の2行を調整します。

警告の(いくつかの)単語:

Ubuntuユーザーがgrub.cfg手でいじるのは一般に推奨されていません。明確にそれをコピーして、その編集に注意してください。システムが起動できなくなる可能性に備えて準備してください(ただし、以前の回答で説明されている起動手順を使用してシステムを復活させることができます)。

また、今回はこれで問題が解決するかもしれませんが、次にgrubメニューを再入力する必要があるときに戻ってきてしまうかもしれません。何らかの理由で、ubuntuの下でのgrubのosプローブは、/ bootの下のArchカーネルの存在によって混乱します。boot-repairなどのユーティリティですべてのディストリビューションを正しくブート可能にできると思いますが、私が正しく覚えていれば、それはうまくいきませんでした。

永続的な修正の1つは、デフォルトの/ bootとは異なるディレクトリにarchカーネルとイメージをインストールすることです。これは厄介です。適切に行う方法については、Arch wikiのgrubエントリを参照してください。

OLD ANSWER(Archに長期的に切り替える予定がある場合に推奨) これが私がやろうとしていることであり、何とか数か月前に戻ってきました。

arch wiki grubページに移動し、パーティションテーブルの関連セクションを読みます(UEFIである可能性が高いため、ESPなどについて読みます)。

手動でArchを起動する

これは私が試してみることをお勧めする非常に形成的な経験です。Arch Linuxカーネルがディスクのどこかにあると想定してc、grubプロンプトでを押し、lsと入力して、のようなデバイスとパーティションのリストを表示します(hd0,msdos1),(hd1,gpt1),...。それぞれをlsしてコンテンツを表示できます。

あなたは3つのことを見つける必要があります:

  • Arch /ルートパーティションはどこですか
  • Archカーネルはどこにありますか vmlinuz
  • あなたのアーチはどこですか intiramfs-linux.img

これらの3つを所有したら、grub>プロンプトで3つのコマンドを実行して、これと同様のプロンプトを出します。

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

たとえば、grubはfindを実行できることに注意してください。

grub> find /sbin/init

(1つのgrubは自動的に見つけることができず、カーネルパニックを引き起こします;))

ここで学んだすべてのことは、私が強くお勧めする情報源です。管理できる場合は、grubの修正に進んでください!さもないと...

ライブキーからArchを起動! ライブArch環境を取得し、インストールWiki chrootをArchに最初と同じ方法でたどります。

グラブ修正

Archの内部から、関連するgrubパッケージをインストールします。特に、他のシステムを検出os-proberできるようにgrub-installします。そこにあるインストールガイドを注意深く実行すると、(少なくとも)grubメニューからarchとubuntuの両方を起動できるはずです。コマンドをインストールすると、次のようになります。

**警告**これらのコマンドは実行しないでください。これらは例示であり、システムに適したものを作成する必要があります

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

**他のすべてが失敗した場合**

残念ながら、これは限られた数の情報が与えられるのと同じくらい具体的であり、SEは実際にはそのような問題のフォーラムではないため、有用なリソースを参照する私の「一般的な」回答です。

あなたがそれを理解できない場合、おそらくArchフォーラムに立ち寄り、そしてあなたが最善を尽くして事前にドキュメントを読んでいるとしたら、助けを見つけるかもしれません。

Archを通じてこれをすべて行うことは、私にとって基本的な学習経験でした。


1
お返事をありがとうございます。まず、MBRパーティションディスクを備えたBIOSシステムです。次に、Ubuntuのgrubパッケージと構成を使用したいのですが、ArchからGRUBを再インストールすることは、私が計画しているものではありません。また、これが変更を加えることはないと思います...そして、詳細オプションのどこかにあるGRUBエントリからUbuntuを起動できます。問題は、GRUBがどういうわけか、どのカーネルや初期RAMディスク、または何がどのパーティションのどのシステムに属しているかを判別できないように見えることです。
バイトコマンダー

基本的に、同じ手順が適用されます。grub-installとgrub-mkconfig(これにより新しいgrub.cfgファイルが作成されます)は、ubuntuでも使用できるgrubコマンドです。os-proberも利用できるか、または同様のものをチェックしてください(これにより、mkconfigが他のファイルシステムを見つけることができます)。これにより、カーネルイメージが適切な場所にあると想定して修正されます。投稿をもう一度読んでください。/ bootパーティションを調べて、すべてのカーネルと.imgが存在することを確認します。Linuxのinitrd.imgをarchのinitramfsで上書きした可能性があります。ubuntuフォーラムまたはaskubuntuにアクセスしてください。
Three Diag

書いたように、grub-mkconfigを実行して無駄になりましたが、帰宅したら/ bootで使用可能なイメージを確認します。そして、いくつかのos-proberスクリプトがあります。
バイトコマンダー

聞き取れませんでした。次に、ubuntuカーネルとinitrdをarchのもので上書きした可能性があります。ubuntuフォールバックカーネルからアップグレード/アップデートシーケンスを実行することで、それらを適切な場所にポップできます(私は思う)
Three Diag

「Ubuntuの詳細オプション」メニューからすべてを起動できるため、Ubuntuカーネルは問題ないはずです。そこで何か問題があれば、それはデフォルトのカーネルへのシンボリックリンクだけかもしれません...今晩それをチェックするつもりです。
バイトコマンダー

0

私の解決策はより簡単です。端末を使用して、次のことを行います。

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

さらに問題が発生した場合boot-repairは、CDに書き込むのに十分なサイズの無料ダウンロードであるを使用してください。


OPはすでに実行されていますupdate-grub。ブート修復がこの特定の問題を解決する可能性はほとんどありません。
terdon

grubと一部のブート修復または更新プロセスは、/ boot / grub / grub.cfgの内容がctrrentであり、正しいと想定しています。ただし、パーティションの再フォーマットなどの変更を行うと、新しいUUIDが取得され、grub-rescueに移動します>これに対処するには、次のようにします。sudo rm /boot/grub/grub.cfg; sudo update-grub。grub.cfgのすべてのエントリが新しく、最新のものになります。
BAD-Boop 2016年

はい、しかし再び、OPは既にこれを行っており、助けにはなりませんでした。質問が大きく、見落としがちsudo grub-mkconfig -o /boot/grub/grub.cfgですが、すぐそこにあります。update-grub実行する非常にシンプルなシェルスクリプトですgrub-mkconfig -o /boot/grub/grub.cfg 。これはで確認できますcat /usr/sbin/update-grub
terdon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.