让 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 探测器不应该是位感知的吗?我怎样才能让这两个正确启动。


我从活动磁盘运行 grub-customizer,选择 /dev/sda3 作为 root,在第二步中选择所有分区,然后删除除 OS-Prober 和 memtest 之外的所有条目。结果是附加的 grub.cfg。它现在将 /dev/sda2 列为唯一的 OS 选项。grub.cfg 将每个条目的 root 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 目录中的内核映像有关。


好的,现在我确定这是由于一个分区是 32 位,一个是 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 位系统(/dev/sda3/uname报告为 64 位)!


我检查了 packages.ubuntu.com 上的软件包内容,发现 am64 版本的 linux-image-3.0.0.15-generic 列为/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 内核的行为与 OSX 中的 Mach 内核非常相似,因为它是一个 32 位可执行文件,在需要时会切换到 64 位模式。那么问题是,为什么我会收到“Exec 格式错误”的错误?

这个帖子但是似乎runaway loop modprobe从内核恐慌中可以看出这确实是 32/64 位问题。Grub 一定有某种方式来告诉内核位长,也许它在 /boot 中的关联文件中,明天再研究一下。


快速更新:
32 位和 64 位内核的哈希值不同,但文件报告它们都是 x86。

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

所以我需要确定如何将内核安装到 /boot 以外的其他地方,以便两个内核不会互相干扰......

答案1

(未经测试)解决方案:
只将一个分区的 /dev/sda1 挂载到 /boot 上,另一个分区的 /boot 保持不变。内核不会相互干扰,这样 grub 就不会对为什么有两个操作系统但只有一个内核感到困惑。

相关内容