GRUB은 Ubuntu 및 Arch Linux 설치의 커널/initramfs를 혼동합니다.

GRUB은 Ubuntu 및 Arch Linux 설치의 커널/initramfs를 혼동합니다.

Ubuntu의 GRUB를 부트로더로 사용하여 Ubuntu(현재 16.04)와 Windows 7을 이중 부팅하는 시스템이 있습니다.

이제 공식 설치 지침을 따르고 Arch Linux를 세 번째 운영 체제로 추가했습니다. Ubuntu 제어 GRUB를 사용하고 싶었기 때문에 Arch에서 GRUB를 설치하지 않았습니다. 지침에는 mkinitcpio -p linux설명된 대로 실행한 일부 부팅 파일을 생성할 수 있는 명령이 포함되어 있습니다.

이제 기본 항목을 통해 GRUB에서 Ubuntu를 부팅하려고 하면 다음과 같은 불쾌한 오류가 발생합니다(화면 사진이 아쉽습니다).

에러 메시지

출력에 표시된 대로 uname -aArch 커널을 부팅하려고 시도하고 있지만 /dev/sda6Ubuntu 루트 파티션입니다.

Advanced options for UbuntuUbuntu를 로드하려면 항목 중 하나로 이동하여 선택해야 하는데 Ubuntu, with Linux 4.4.0-*Arch를 올바르게 로드하는 항목을 찾을 수 없습니다.

sudo update-grub우분투에서 실행(" 생성된 grub2 구성 파일을 실행하기 위한 스텁 update-grub입니다 ."grub-mkconfig -o /boot/grub/grub.cfg) 아무것도 변경되지 않습니다. 지금까지 이 grub-customizer도구는 이 문제를 해결하는 데에도 쓸모가 없었습니다.

GRUB이 이렇게 혼란스러워지는 이유는 무엇입니까? 모든 Linux 버전이 올바른 커널을 사용하고 올바른 파티션에서 부팅되도록 수정하려면 어떻게 해야 합니까?

제가 어리석게도 Arch를 설치하고 Ubuntu의 /boot를 설치한 것 같아서 부팅 파일을 거기에 넣었을 수도 있습니다.

Ubuntu의 부트로더 복원과 관련된 모든 Arch를 삭제하고 나중에 Arch를 다시 설치할 수 있습니다.


업데이트(Ask Ubuntu 채팅 지원에 대해 @terdon에게 감사드립니다):

이 내 꺼야/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

Ubuntu에서 GRUB 구성을 업데이트하려고 합니다.

$ 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

Ubuntu에서 MBR로 GRUB를 다시 설치해 보았습니다.

$ 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

내 파티션 레이아웃:

우분투 시스템에서 확인하세요. 라벨은 설명이 필요해야 합니다.

$ 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]

내 GRUB 메뉴 구조:

GRUB 홈 페이지

Ubuntu의 고급 옵션:
Ubuntu용 GRUB 고급 옵션

Arch의 고급 옵션:
Arch용 GRUB 고급 옵션


/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 커널이 있어야 합니다. 그러나 이름에 커널 버전이 없고 어느 파일에 속하는 파일이 있는지 어떻게 알 수 있습니까?


내 Ubuntu 루트 디렉터리(디렉터리 제외):

$ 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

내 거아치 루트 디렉터리파일이나 링크가 포함되어 있지 않습니다.

답변1

나는 결국 궤도의 Ubuntu 디렉토리 /boot에서 Arch 파티션과 해당 부팅 파일을 삭제하여 문제를 해결했습니다 . 이제 우분투는 다시 정상으로 돌아왔고 나머지 GRUB 항목도 모두 정상으로 돌아왔습니다.

내가 한 일의 목록은 다음과 같습니다.

  • Arch initramfs파일 삭제:

    sudo rm /boot/initramfs-linux*
    
  • Arch vmlinuz파일 삭제:

    sudo rm vmlinuz-linux
    
  • /dev/sda8GParted를 사용하여 Arch 파티션 포맷( )

  • GRUB 구성 업데이트:

    sudo update-grub
    
  • 재부팅하고 즐기십시오!

답변2

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
}

마지막 두 줄은 커널과 initrd를 로드하기 위해 grub이 실행한 명령이며 현재 ARCH 커널과 initiramfs를 찾고 있습니다. 또한 예상되는 Ubuntu 파일을 호스팅할 수도 있고 호스팅하지 않을 수도 있는 /파티션에서 해당 파일을 찾습니다 .uuid=eee18451-b607-4875-8a88-c9cb6c6544c8

다음을 통해 이 문제를 해결할 수 있습니다.

sudo blkid

우분투 루트 파티션의 uuid를 가져옵니다.

그런 다음 마지막 두 줄을 최신 커널 및 initrd 이미지에 대한 simlink로 바꿉니다(이것이 우분투에서 예상하는 방식이기 때문입니다).

linux   /vmlinuz root=UUID=<correct-uuid-ubuntu-partition> ro  
initrd  /initrd.img

이렇게 해도 문제가 즉시 해결되지 않으면 다른 수정이 필요할 수 있습니다. 테스트되고 작동하는 항목 중 하나를 "복사"하여 찾을 수 있습니다. 가장 간단한 항목을 사용하는 것이 좋습니다(예: 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'

Ubuntu 루트 파티션에서 Arch initramfs 및 커널을 찾을 수 있으므로 Arch 항목도 손상되었습니다. 기본 위치는 /boot입니다. 위치를 수정하고 루트 파티션 uuid에 Arch 루트가 포함되어 있는지 확인하여 Arch 항목의 마지막 두 줄을 조정합니다.

한(여러)개의 경고 단어:

일반적으로 Ubuntu 사용자에게는 수동 작업을 권장하지 않습니다 grub.cfg. 반드시 복사하여 주의 깊게 편집하시기 바랍니다. 시스템 부팅에 실패할 경우를 대비하세요(하지만 이전 답변에 설명된 부팅 프로세스를 사용하여 복구할 수 있습니다).

또한 이번에는 문제를 해결할 수 있지만 다음에 grub 메뉴를 다시 채워야 할 때 다시 나타날 수도 있습니다. 어떤 이유로 우분투에서 grub의 운영 체제 감지는 /boot 아래에 Arch 커널이 있기 때문에 혼동됩니다. 시동 복구와 같은 유틸리티를 사용하면 모든 배포판을 부팅 가능하게 만들 수 있을 것 같지만, 기억이 맞다면 작동하지 않을 것입니다.

영구적인 수정에는 기본 /boot가 아닌 다른 디렉토리에 아치 커널과 이미지를 설치하는 것이 포함될 수 있습니다. 이는 지루한 작업이므로 이 작업을 올바르게 수행하는 방법을 알아보려면 Arch wiki의 grub 항목을 참조해야 합니다.

이전 답변(장기적으로 Arch로 전환하려는 경우 권장) 이것이 내가 할 일이다.어쨌든 그것은 몇 달 전에 이루어졌습니다.

이동아치 위키 그럽 페이지파티션 테이블의 관련 부분을 읽어보세요(아마도 UEFI일 것이므로 ESP 등을 읽어보세요).

수동으로 Arch로 부팅

그것은 매우 강력한 경험이었으며 시도해 보는 것이 좋습니다. Arch Linux 커널이 디스크 어딘가에 있다고 가정하고 cgrub 프롬프트에서 ls를 누르고 입력하면 아래와 같이 장치 및 파티션 목록이 표시됩니다 (hd0,msdos1),(hd1,gpt1),.... 내용을 개별적으로 보려면 ls를 사용할 수 있습니다.

다음 세 가지를 알아내야 합니다.

  • /Arch 루트 파티션은 어디에 있습니까?
  • 당신의 아치 커널은 어디에 있나요?vmlinuz
  • 당신의 아치는 어디에 있나요?intiramfs-linux.img

이 세 가지가 있으면 grub>에서 세 가지 명령을 실행하여 이와 유사한 메시지를 표시합니다.

grub> set root=(hd0,1)
grub> linux /vmlinuz root=/dev/sda1
grub> initrd /intiramfs-linux.img
grub> boot

grub은 다음을 찾을 수 있습니다.

grub> find /sbin/init

(grub은 자동으로 찾을 수 없으며 커널 패닉이 발생합니다.)

나는 이것을 모두 배웠다여기, 제가 ​​적극 추천하는 소스입니다. 할 수 있다면, 그럽을 고치는 데 뛰어드세요! 그렇지 않으면...

라이브 키에서 Arch를 실행하세요! 라이브 Arch 환경을 확보하고 chroot처음과 같은 방식으로 Wiki를 Arch에 설치하십시오.

그럽을 고치다

Arch 내에서 특히 다른 시스템을 감지할 os-prober수 있도록 관련 grub 패키지를 설치하십시오 . grub-install설치 가이드를 주의 깊게 따르시면 (적어도) grub 메뉴에서 아치와 우분투를 부팅하실 수 있을 것입니다. 설치 명령은 다음과 같이 표시됩니다.

**경고** 이 명령을 실행하지 마십시오. 이는 단지 예일 뿐이므로 시스템에 적합한 것이 무엇인지 알아내야 합니다.

# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck
# grub-mkconfig -o /boot/grub/grub.cfg

**다른 모든 방법이 실패하는 경우**

불행하게도 이것은 정보의 양이 제한되어 있고 SE는 실제로 이런 종류의 문제에 대한 포럼이 아니기 때문에 "일반적인" 답변은 유용한 리소스를 참조합니다.

알아낼 수 없다면 Arch 포럼을 확인해 보세요. 최선을 다하고 사전에 문서를 읽어 본다면 도움을 찾을 수 있을 것입니다.

아치를 통해 이 모든 일을 하는 것은 나에게 근본적인 학습 경험이었습니다.

답변3

내 솔루션은 더 간단합니다. 터미널을 사용하여 다음을 수행합니다.

sudo rm /boot/grub/grub.cfg
sudo update-grub

추가 질문이 있는 경우 그냥 사용하세요 boot-repair. 무료로 다운로드할 수 있으며 CD 디스크에 구울 수 있을 만큼 작습니다.

관련 정보