/dev/sda1에 대한 GRUB 드라이브를 찾을 수 없습니다. 장치 지도를 확인하세요

/dev/sda1에 대한 GRUB 드라이브를 찾을 수 없습니다. 장치 지도를 확인하세요

내 디스크 구성은 다음과 같습니다.

# hlsblk -F
NAME            FSTYPE      FSVER            LABEL       UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
loop0           squashfs    4.0                                                                       0   100% /run/archiso/airootfs
sda                                                                                                            
├─sda1          btrfs                                    0bd3ff02-b7a9-4421-877c-c16d1fdf6a6e                  
└─sda2          crypto_LUKS 2                            f030bc5b-773e-4fea-88d4-36b3e95f7c26                  
  └─x200        LVM2_member LVM2 001                     20xRtS-jPGK-kTIC-YKfA-XDNr-RSPr-CxNcRU                
    ├─x200-swap swap        1                            f6c9ca7d-41a5-4f6b-acc8-fd53e1f4a36e                  
    └─x200-root btrfs                                    f174b77a-c75c-4897-ac31-80aa728004c8                  
sdb             iso9660     Joliet Extension ARCH_202206 2022-06-01-15-35-22-00                                
├─sdb1          iso9660     Joliet Extension ARCH_202206 2022-06-01-15-35-22-00                       0   100% /run/archiso/bootmnt
└─sdb2          vfat

그래서 필요한 모든 파티션을 설치하고 다음과 같이 루트로 지정했습니다.

# swapon /dev/mapper/x200-swap
# mount /dev/mapper/x200-root /mnt
# mount /dev/sda1 /mnt/boot
# arch-chroot  /mnt

grub-install을 사용하여 GRUB를 설치하려고 하면 다음과 같은 메시지가 나타납니다. /usr/bin/grub-probe: error: cannot find a GRUB drive for /dev/sda1. Check your device.map. 이 전체 명령 출력은 이 문서의 끝에 붙여넣어질 것입니다.

grub-mkconfig를 사용할 때 위와 같은 오류가 발생했습니다.

이것은 내 그럽 구성의 머리입니다.

# head /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Arch"
# GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet cryptdevice=UUID=/dev/sda2:cryptlvm root=/dev/disk/by-uuid/f174b77a-c75c-4897-ac31-80aa728004c8"
# GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet cryptdevice=UUID=/dev/sda2:cryptlvm root=/dev/x200/root"
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet cryptdevice=UUID=/dev/sda2:cryptlvm root=/dev/mapper/x200-root"
GRUB_CMDLINE_LINUX=""

이것도 내 fstab이야

# /dev/mapper/x200-root
UUID=f174b77a-c75c-4897-ac31-80aa728004c8   /           btrfs       rw,relatime,ssd,space_cache=v2,subvolid=5,subvol=/  0 0

# /dev/sda1
UUID=0bd3ff02-b7a9-4421-877c-c16d1fdf6a6e   /boot       btrfs       rw,relatime,ssd,space_cache=v2,subvolid=5,subvol=/  0 0

# /dev/mapper/x200-swap
UUID=f6c9ca7d-41a5-4f6b-acc8-fd53e1f4a36e   none        swap        defaults    0 0

BBS의 전체 GRUB 명령 출력.

고쳐 쓰다

sda1을 ext4로 포맷하고 fstab uuid를 업데이트했지만 여전히 오류가 발생했습니다. 오. os-prober도 설치했습니다. 여전히 동일합니다.

답변1

grub 명령의 전체 출력은 두 번째 줄에 제공됩니다.

grub-install: info: cannot open `/boot/grub/device.map': No such file or directory.

루트로 실행

# grub-mkdevicemap

그런 다음 다시 시도해 보세요.

"로캘" 오류가 많이 발생합니다. 아마도 "locales" 패키지를 설치하는 것도 도움이 될 것입니다...

편집기:EFI

EFI/UEFI를 사용해 보셨나요? 그러면 FAT 파티션이 누락됩니다.

답변2

을 사용하여 GRUB 설치를 시도해 보셨나요 grub-install /dev/sda1?

GRUB는 실제로 BIOS 스타일 부팅 프로세스를 설치할 때 MBR과 MBR과 첫 번째 파티션 사이의 사용되지 않은 공간에 대한 액세스가 필요하므로 다음을 시도해 보십시오 grub-install /dev/sda. 여전히 동일한 오류 메시지가 나타나면 자신만의 /boot/grub/device.map파일을 작성하십시오. 귀하의 경우 해당 내용은 다음과 같을 수 있습니다.

(hd0)    /dev/sda

/dev/disk/by-id/...(이상적으로는 적절한 경로 이름을 대신 사용할 수 있지만 /dev/sda필수는 아닙니다.)

grub-install /dev/sda1sda1GRUB의 부팅 블록을 MBR 대신 파티션의 PBR에 포함하려고 합니다 . 대부분의 파일 시스템에는 고정된 부트 로더 공간이 없기 때문에 GRUB의 부트 블록은 /boot/grub/i386-pc/core.img이전에 물리적 디스크 위치를 가리켜 야 합니다.매우 심각하게 실망설치 모드. GRUB의 최신 버전은 더 이상 이러한 방식으로 GRUB 설치를 지원하지 않을 수 있습니다.

문제는 부트 블록 코드가 너무 작아서 파일 시스템을 이해할 수 없어 GRUB 설치 시 결정된 원본 디스크 블록 번호를 이용해 GRUB 이미지를 읽어야 한다는 점이다. 이렇게 하려면 GRUB 코어 이미지를 디스크의 물리적 위치가 변경되지 않은 위치에 배치해야 합니다. 운영 체제의 관점에서 볼 때 /boot/grub/i386-pc/core.img이는 일반 파일이므로 조각 모음 도구나 스마트 파일 시스템 드라이버가 때때로 해당 파일을 디스크의 다른 물리적 위치로 이동할 수 있습니다. 이로 인해 완전한 부팅 오류가 발생합니다.

GRUB가 MBR 파티션 디스크의 실제 마스터 부트 레코드에 설치되면 MBR과 첫 번째 파티션의 시작 부분 사이의 빈 공간(약 1MB)이 GRUB 코어 이미지에 사용됩니다. 이 위치는 파티션 외부에 있으므로 파일 시스템 드라이버나 조각 모음 도구가 이 위치를 건드릴 수 없습니다. 이는 실제 파일 시스템으로 액세스하는 데 필요한 GRUB 코어 이미지, 파일 시스템 드라이버 및 /boot기타 GRUB 모듈을 포함하기에 충분한 공간입니다. 이를 로드한 후 GRUB는 normal.mod다른 모듈(포함)과 해당 구성 파일을 경로 이름별로 일반 파일로 로드 할 수 있습니다 .


그런데 GPT 파티션 디스크에서 GRUB의 i386-pc 버전을 부팅하려면 파일 시스템 없이 1MB 크기의 "biosboot" 파티션이 필요합니다. 이 파티션은 아래와 같이 GRUB 코어 이미지를 보관하는 데 사용됩니다. 파티션의 이전 MBR 스타일 공간은 이제 GPT 파티션 테이블 구조로 채워집니다.

MBR과 첫 번째 파티션의 시작 부분 사이의 빈 공간은 역사의 유물입니다. 디스크가 여전히 C/H/S 주소 지정을 사용하는 경우 파티션의 시작 부분을 항상 트랙의 첫 번째 섹터에 배치하는 관례가 있었습니다. MBR은 디스크의 첫 번째 블록(C/H/S 주소 0/0/1)이므로 첫 번째 파티션의 가능한 가장 빠른 시작 위치는 C/H/S 0/1/1이며 나머지 트랙 #0(= 실린더 #0, 헤드 #0)은 사용되지 않습니다.

Windows XP 무렵에는 C/H/S 주소 지정이 더 이상 의미가 없고 RAID 어레이, 엔터프라이즈 스토리지 시스템 및 SSD의 데이터 정렬이 중요한 성능 문제가 되었기 때문에 첫 번째 파티션의 시작 규칙이 변경되었습니다. 현재 권장되는 방식은 다음과 같습니다. 디스크의 첫 번째 파티션의 시작 위치는 디스크 시작 부분에서 정확히 1MiB, 즉 LBA 블록 번호 #2048입니다(클래식 512바이트 디스크 블록 가정).

답변3

요약:fdisk는 sda1 파티션 유형을 설정하지 않습니다.

이것이 지금 일어나고 있는 일입니다.

MBR 부팅 부분이 그 중 하나라는 논의 끝에 fdisk가 실제로 디스크의 초기 바이트를 보존하는지 궁금합니다. 그래서 하나를 입력했습니다 fdisk -l /dev/sda. /dev/sda1 유형이 정의되지 않았거나 알 수 없음을 확인하여 을 누르고 tsda1을 Linux로 변경하고 모든 것을 다시 설치했는데 grub-install이 제대로 작동했습니다.

답변4

방금 이 문제를 해결했습니다. 나는 다음 단계를 따랐습니다.

sudo mkdir -p /mnt/broken
sudo mount /dev/sda7 /mnt/broken

OBS: sda7제 루트가 아니고 제 EFI인데 제가 봤을 때 부팅 파일이 없어졌는데 다행히 폴더에 EFI가 압축되어 있어서 압축을 풀고 dev에 설치된 sda7에 cp를 설치하면 작동합니다.

그런 다음 Linux 및 Windows 파티션을 업데이트했는데 그것도 나타났습니다.

어쩌면 Live CD에도 어딘가에 시작 파일이 있을 수 있습니다.

관련 정보