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비트가 별도로 필요합니다. 홈 디렉터리는 공유되고 각 우분투 버전은 다른 버전 아래에 /ubuntuXX로 마운트됩니다. /boot는 또한 둘 다에서 /dev/sda1을 가리킵니다.

ubuntu32에서 실행하면 sudo update-grub정상적으로 실행되지만 ubuntu64를 부팅하면 오류가 발생합니다. init실패하고 잘못된 비트 유형 때문이라고 가정합니다. grub의 OS 프로브는 비트를 인식하면 안 되나요? 이 두 가지를 올바르게 부팅하려면 어떻게 해야 합니까?


라이브 디스크에서 grub-customizer를 실행하고 /dev/sda3을 루트로 선택하고 두 번째 단계에서 모든 파티션을 선택한 다음 OS-Prober 및 memtest를 제외한 모든 전체를 제거했습니다. 결과는 첨부된 grub.cfg입니다. 이제 /dev/sda2가 유일한 OS 옵션으로 나열됩니다. grub.cfg에는 모든 항목에 대해 루트 UUID가 /boot로 설정되어 있습니다.

그럽.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비트를 실행하고 있습니다( 64비트이며 보고합니다 /dev/sda3) /!uname


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 커널은 필요할 때 64비트 모드로 전환하는 32비트 실행 파일이라는 점에서 OSX의 Mach 커널과 매우 유사하게 작동합니다. 그렇다면 "Exec 형식 오류"에 대한 오류가 발생하는 이유는 무엇입니까?

이 게시물runaway loop modprobe그러나 Kernel Panic의 내용은 이것이 실제로 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

(테스트되지 않음) 해결 방법:
한 파티션의 /boot에 /dev/sda1만 마운트하고 다른 파티션의 경우 /boot를 그대로 두십시오. 커널은 서로 충돌하지 않으며 아마도 grub은 왜 두 개의 OS가 있고 하나의 커널이 있는지 혼동하지 않을 것입니다.

관련 정보