Ubuntu(現在16.04)とWindows 7をデュアルブートするマシンを使用していて、UbuntuのGRUBをブートローダーとして使用しています。
公式のインストール手順に従って、Arch Linuxを3番目のOSとして追加しました。 GRUB ArchのGRUB $ ===をインストールしませんでした。Ubuntuが制御するものを使用したかったためです。説明には、説明どおりに実行したブートファイルを生成するコマンドmkinitcpio -p linux
が含まれていました。
GRUBからデフォルトのエントリを介してUbuntuを起動しようとすると、この不快なエラーが表示されます(画面の写真で申し訳ありません)。
uname -a
の出力が示すように、Archカーネルを起動しようとしていますが、/dev/sda6
はUbuntuのルートパーティションです。
Ubuntuをロードするには、Advanced options for Ubuntu
に移動してUbuntu, with Linux 4.4.0-*
エントリの1つを選択する必要がありますが、Archを正しくロードするエントリが見つかりませんでした。
UbuntuからSudo update-grub
を実行しても( "update-grub
はgrub-mkconfig -o /boot/grub/grub.cfg
を実行してgrub2構成ファイルを生成するためのスタブです。")は何も変更しません。 grub-customizer
ツールもこれを修正するのに役に立たなかった。
このGRUBの混乱の原因は何ですか。また、どのように修正して、各Linuxバージョンが正しいカーネルと正しいパーティションから起動するようにしますか?
Ubuntuの/ bootがマウントされた状態でArchを愚かにインストールしたようですが、おそらくそこにブートファイルが置かれています。
私は、Ubuntuのブートローダーを再びまっすぐにして、後でArchのクリーンインストールを行うために、Arch関連のすべてのものを消去することに問題はありません。
これが私の /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
私はGRUB 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
GRUB= UbuntuからMBRに再インストールしようとしました:
$ 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]
/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カーネルである必要があります。しかし、名前にカーネルバージョンが含まれていないファイルがどのファイルに属しているかを調べるにはどうすればよいですか?
$ 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
私Archルートディレクトリにはファイルやリンクが含まれていません。
最後に、ArchパーティションとそのブートファイルをUbuntuの/boot
軌道からのディレクトリ。 Ubuntuは再び正常に動作し、残りのすべてのGRUBエントリが再び機能します。
これが私がしたことのリストです:
Archのinitramfs
ファイルを削除:
Sudo rm /boot/initramfs-linux*
Archのvmlinuz
ファイルを削除:
Sudo rm vmlinuz-linux
Archパーティションをフォーマットします(/dev/sda8
)GPartedの使用
GRUBの構成を更新します。
Sudo update-grub
再起動してお楽しみください!
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を探しています。さらに、/
で識別されるパーティションのuuid=eee18451-b607-4875-8a88-c9cb6c6544c8
の下で、目的のUbuntuファイルをホストしている場合とそうでない場合のあるファイルを探します。
あなたはこれを修正することができます:
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つは、Archカーネルとイメージをデフォルトの/ bootとは異なるディレクトリにインストールすることです。これは厄介です。適切に行う方法については、Arch wikiのgrubエントリを参照してください。
OLD ANSWER(Archに長期的に切り替える予定がある場合に推奨)これが私がやろうとしていること、そして どういうわけか数か月が経ちました)戻る
Arch wiki grub page に移動し、パーティションテーブルの関連セクションを読みます(UEFIである可能性が高いため、ESPなど)をお読みください)。
手動でArchにブートする
これは私が試してみることをお勧めする非常に形成的な経験です。 Arch Linuxカーネルがディスクのどこかにあると仮定して、grubプロンプトでc
を押し、lsと入力して(hd0,msdos1),(hd1,gpt1),...
のようなデバイスとパーティションのリストを表示します。それぞれをlsしてコンテンツを表示できます。
あなたは3つのことを見つける必要があります:
/
ルートパーティションはどこですかvmlinuz
intiramfs-linux.img
これら3つを所有したら、grub> Prompt thisのようなもので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は自動的に見つけることができず、カーネルパニックを引き起こします;))
私が学んだこのすべて here 、私が強くお勧めする情報源です。管理できれば、grubの修正にスキップしてください!さもないと...
ライブキーからArchを起動します!ライブArch環境を取得し、インストールWiki chroot
をArchに実行するのと同じ方法で実行します初めて。
Fixing grub
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を通じてこれをすべて行うことは、私にとって基本的な学習経験でした。
私の解決策はより簡単です。端末を使用して、次のことを行います。
Sudo rm /boot/grub/grub.cfg
Sudo update-grub
さらに問題がある場合は、boot-repair
は無料ダウンロードで、CDディスクに書き込むのに十分な大きさです。