有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之外的所有entires。 结果是附加的grub.cfg。 它现在将/ dev / sda2列为唯一的OS选项。 对于每个条目,grub.cfg都将根UUID设置为/ boot。

grub.cfg: http ://pastebin.com/Dkdxian4
fstab(两者): http : //pastebin.com/3sUabYRY

我知道grub2都是自动生成的菜单和爵士乐,但是我如何才能完全掌握所有这些并手动添加entires(我不会长时间保持这种安装,所以不用担心内核更新)


我拍了一下bilndly复制/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] [] ? printk+0x2d/0x2f [ 3.408338] [] panic+0x5c/0x151 [ 3.408388] [] forget_original_parent+0x1e4/0x1f0 [ 3.408440] [] ? perf_cgroup_attach_task+0x20/0x20 [ 3.408489] [] exit_notify+0x13/0x140 [ 3.408536] [] do_exit+0x1ad/0x3a8 [ 3.408585] [] ? tty_write+0x228/0x228 [ 3.408632] [] sys_exit+0x18/0x28 [ 3.408680] [] 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上的包内容和linux-image-3.0.0.15-通用列表/boot/vmlinuz-3.0.0-15-generic的am64版本作为文件,因此我运行了以下内容:

 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 Kernel非常相似,因为它是一个32位可执行文件,在需要时可以切换到64位模式。 那么问题是为什么我收到关于“Exec格式错误”的错误?

然而, 这篇文章似乎表明来自内核恐慌的runaway loop modprobe表明这确实是32/64位问题。 Grub必须有一些方法告诉内核比特长度,也许它在/ boot中的相关文件中,明天就会查看。


快速更新:
32位和64位内核的散列方式不同,但文件报告它们都是x86。

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

所以我需要确定如何将内核安装到除/ boot之外的其他地方,以便两个内核不会互相破坏…

(未经测试)解决方案:
只在/ boot上为一个分区挂载/ dev / sda1,为其他分区保留/ boot。 内核不会互相破坏,然后grub不会混淆为什么有两个操作系统而是一个内核。