grub2で32ビットと64ビットのUbuntuを起動する

grub2で32ビットと64ビットのUbuntuを起動する

私は次のようなシステムをインストールしました:

ubuntu@ubuntu:~$ ls -l /dev/disk/by-label/
total 0
lrwxrwxrwx 1 root root 10 2012-01-22 18:49 Boot -> ../../sda1
lrwxrwxrwx 1 root root 10 2012-01-22 18:49 ubuntu32 -> ../../sda2
lrwxrwxrwx 1 root root 10 2012-01-22 18:28 ubuntu64 -> ../../sda3
lrwxrwxrwx 1 root root 10 2012-01-22 18:49 Home -> ../../sda5

ubuntu@ubuntu:~$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 2012-01-22 20:55 3582d70f-f4a5-484c-b14c-45cd740346b9 -> ../../sda1
lrwxrwxrwx 1 root root 10 2012-01-22 20:55 741182a8-3f15-4dfd-994d-654c8a57a9e4 -> ../../sda2
lrwxrwxrwx 1 root root 10 2012-01-22 20:55 1c415472-a770-4d76-be9f-27b8c1408e2a -> ../../sda3
lrwxrwxrwx 1 root root 10 2012-01-22 20:55 3515d523-72a2-4e04-b7da-cb6a1fd572ef -> ../../sda5
lrwxrwxrwx 1 root root 10 2012-01-22 20:55 f1f1cd7e-30cb-44e7-9ef6-986a589e0045 -> ../../sda6

それぞれのドライバーのパフォーマンスをテストできるように、32 ビットと 64 ビットを別々にする必要があります。ホーム ディレクトリは共有され、Ubuntu の各バージョンは他のバージョンの下に /ubuntuXX としてマウントされます。/boot は両方で /dev/sda1 も指します。

ubuntu32 から実行するとsudo update-grub正常に動作しますが、ubuntu64 の起動時にエラーが発生します。init失敗します。これはビット タイプが間違っているためだと思います。grub の OS プローブはビットを認識するべきではないでしょうか。これら 2 つを適切に起動するにはどうすればよいのでしょうか。


ライブ ディスクから grub-customizer を実行し、ルートとして /dev/sda3 を選択し、2 番目のステップですべてのパーティションを選択し、OS-Prober と memtest 以外のエントリをすべて削除しました。その結果、添付の grub.cfg ができました。これで、/dev/sda2 が唯一の OS オプションとしてリストされます。grub.cfg では、すべてのエントリのルート UUID が /boot に設定されています。

grub.cfg:http://pastebin.com/Dkdxian4
fstab (両方):http://pastebin.com/3sUabYRY

grub2 はすべて自動生成され、メニューなどもすべて自動生成されることは知っていますが、どうすればそれをすべて削除して手動でエントリを追加できるのでしょうか (このインストールを長く維持するつもりはないので、カーネルの更新については心配ありません)


エントリをビルドで複製しようとしました/dev/sda2が、調整しても/dev/sda3うまくいきませんでした。ただし、最初の試みと同じエラーが発生しました(カーネルパニックの直前の行ですrun-init)。

grub.cfg の更新された部分:http://pastebin.com/DvfBhrBF

(null)
Begin: Running /scripts/local-bottom ... done.
done.
Begin: Running /scripts/init-bottom: ... done.
[    3.402989] request_module: runaway loop modprobe binfmt-464c
run-init: /sbin/init: Exec format error
[    3.406303] Kernel panic - not syncing: Attempted to kill init!
[    3.406394] Pid: 1, comm: run-init Not tainted 3.0.0-15-generic #25-Ubuntu
[    3.408290] [<c151a922>] ? printk+0x2d/0x2f
[    3.408338] [<c151a800>] panic+0x5c/0x151
[    3.408388] [<c104b564>] forget_original_parent+0x1e4/0x1f0
[    3.408440] [<c10d3a48>] ? perf_cgroup_attach_task+0x20/0x20
[    3.408489] [<c104b583>] exit_notify+0x13/0x140
[    3.408536] [<c104bd8d>] do_exit+0x1ad/0x3a8
[    3.408585] [<c1313850>] ? tty_write+0x228/0x228
[    3.408632] [<c104c098>] sys_exit+0x18/0x28
[    3.408680] [<c152e424>] syscall_call+0x7/0xb

これは /boot ディレクトリにあるカーネル イメージに関係しているのではないかと考え始めています。


わかりました。パーティションの 1 つが 32 ビットで、もう 1 つが 64 ビットであるという事実が原因であることが分かりました。

図 1: /boot/grub/grub.cfg からの出力:

linux /vmlinuz-3.0.0-12-generic root=/dev/sda2
initrd /initrd.img-3.0.0-12-generic

図 2: /ubuntu64/vm* と /ubuntu32/vm* のリスト

me@GAMMA:~$ ls -l /vm*
lrwxrwxrwx 1 root root 29 2012-01-23 20:41 /vmlinuz -> boot/vmlinuz-3.0.0-15-generic
lrwxrwxrwx 1 root root 29 2012-01-22 13:05 /vmlinuz.old -> boot/vmlinuz-3.0.0-12-generic
me@GAMMA:~$ ls -l /ubuntu32/vm*
lrwxrwxrwx 1 root root 29 2012-01-22 12:41 /ubuntu32/vmlinuz -> boot/vmlinuz-3.0.0-15-generic
lrwxrwxrwx 1 root root 29 2012-01-22 12:22 /ubuntu32/vmlinuz.old -> boot/vmlinuz-3.0.0-12-generic

図 3: /boot/vmlinuz-3.0.0-12-generic のマジック ファイル タイプ

/boot/vmlinuz-3.0.0-12-generic: Linux kernel x86 boot executable bzImage, version 3.0.0-12-generic (buildd@creste, RO-rootFS, root_dev 0x801, swap_dev 0x4, Normal VGA
/boot/vmlinuz-3.0.0-15-generic: Linux kernel x86 boot executable bzImage, version 3.0.0-15-generic (buildd@creste, RO-rootFS, root_dev 0x801, swap_dev 0x4, Normal VGA

さて、ここで本物キッカー:

me@GAMMA:~$ sudo find / -name "vmlinuz*"
/boot/vmlinuz-3.0.0-12-generic
/boot/vmlinuz-3.0.0-15-generic
/vmlinuz.old
/vmlinuz
/ubuntu32/vmlinuz.old
/ubuntu32/vmlinuz

私のシステムではこれが唯一のカーネルです。どうしてそんなことが可能なのでしょう? 今は 64 ビットを実行しています ( は 64 ビットであり、64 ビット/dev/sda3である/uname報告されています)。


packages.ubuntu.com でパッケージの内容を確認し、linux-image-3.0.0.15-generic の am64 バージョンが/boot/vmlinuz-3.0.0-15-genericファイルとしてリストされていたので、以下を実行しました。

me@GAMMA:~$ sudo openssl dgst -md5 /boot/vmlinuz-3.0.0-15-generic > ~/3.0.0.15x86
me@GAMMA:~$ sudo apt-get install --reinstall linux-image-3.0.0-15-generic
(Output Omitted)
me@GAMMA:~$ sudo openssl dgst -md5 /boot/vmlinuz-3.0.0-15-generic
MD5(/boot/vmlinuz-3.0.0-15-generic)= f56839a4642eb97e06e5efb0bc74f4dc
me@GAMMA:~$ cat ~/3.0.0.15x86 
MD5(/boot/vmlinuz-3.0.0-15-generic)= f56839a4642eb97e06e5efb0bc74f4dc
me@GAMMA:~$ sudo openssl dgst -md5 /boot/vmlinuz-3.0.0-15-generic > ~/3.0.0.15x86

したがって、Linux カーネルは、必要に応じて 64 ビット モードに切り替わる 32 ビット実行可能ファイルであるという点で、OSX の Mach カーネルと非常によく似た動作をします。では、なぜ「Exec 形式エラー」というエラーが表示されるのでしょうか。

この郵便受けただし、カーネル パニックから、これは確かに 32/64 ビットの問題であることが示されているようですrunaway loop modprobe。GRUB にはカーネルにビット長を伝える何らかの方法があるはずです。おそらく、/boot の関連ファイルにあるでしょう。明日それを調べます。


クイックアップデート:
32 ビット カーネルと 64 ビット カーネルのハッシュは異なりますが、ファイルは両方とも x86 であると報告します。

< MD5(/boot/vmlinuz-3.0.0-15-generic)= f56839a4642eb97e06e5efb0bc74f4dc
 ---
> MD5(/boot/vmlinuz-3.0.0-15-generic)= cee6cd7db9016ee8531be92504ac802b

したがって、2 つのカーネルが互いに上書きされないように、カーネルを /boot 以外の場所にインストールする方法を決定する必要があります...

答え1

(未テスト) 解決方法:
1 つのパーティションの /boot に /dev/sda1 のみをマウントし、他のパーティションの /boot はそのままにしておきます。カーネルは互いに上書きされることはなく、そうすれば、なぜ 2 つの OS があるのに 1 つのカーネルがあるのか​​と grub が混乱することもなくなるでしょう。

関連情報