온라인에서 발견된 일부 예에서는 grub-install 후에 update-grub을 실행해야 한다고 나와 있습니다. 다른 사람들은 순서를 반대로 합니다. 어느 것이 맞나요?
두 개의 Linux 설치(sda에 하나, sdb에 하나)가 있는 경우 sda 설치에서 update-grub을 실행하면 sda 설치가 부팅 메뉴 상단에 표시됩니다. sdb 설치에서 update-grub을 실행하면 sdb 설치가 메뉴 상단에 표시됩니다.
DEFAULT=0이라고 가정하면 이론적으로 BIOS에서 부팅 장치를 선택하여 운영 체제를 선택할 수 있습니다. "grub-install /dev/sda"는 sda 또는 sdb 버전의 Linux에서 실행되는지 여부에 관계없이 마지막 "update-grub"에 해당하도록 sda 부팅 메뉴를 변경합니까?
답변1
update-grub
, 적어도 Debian 및 유사한 버전(Ubuntu와 같은)에서는 기본적으로 grub-mkconfig
.so GRUB을 생성/업데이트/재생성합니다.구성, 실제 부트로더 자체가 아닌.
실제로 수행하는 작업 은 grub-install
실행 중인 GRUB 버전(레거시 BIOS GRUB 또는 UEFI GRUB)에 따라 다릅니다.
기존 BIOS GRUB를 사용하면 grub-install
마스터 부트 레코드에 포함된 GRUB 섹션이 (재)기록되고 물리적 디스크 블록 번호가 GRUB의 다음 섹션을 읽을 수 있도록 인코딩됩니다. 또한 /boot/grub/grub.cfg
실제 GRUB 구성 파일을 어느 파티션에서 읽을지 결정합니다 ( ). 여기서 중요한 요소는 /boot/grub/device.map
장치 번호가 Linux 디스크 장치에 매핑되는 방법을 GRUB BIOS(및 GRUB)에 알려주는 파일입니다.
UEFI GRUB의 경우 GRUB 부트 로더의 주요 부분은 일반적으로 /boot/efi/EFI/<name of distribution>/grubx64.efi
또는 이와 유사한 EFI 시스템 파티션의 파일로 위치합니다. 이 부트로더 경로 이름은 UEFI 부팅 변수의 시스템 NVRAM(= BIOS 설정이 저장되는 위치)에 저장됩니다. GRUB의 주요 부분은 완전히 독립적일 수도 있고(보안 부팅을 사용하는 경우 반드시 그래야 함) 추가 기능이 GRUB 모듈로 로드될 수도 있으며 일반적으로 해당 부분이 /boot/grub
속한 Linux 배포판의 디렉터리에서 가능합니다.
UEFI 부팅 변수는 시스템이 EFI 시스템 파티션과 그 안에 있는 부트 로더 파일을 찾는 데 사용해야 하는 디스크를 식별합니다. 명령을 사용하여 이러한 변수를 직접 볼 수 있습니다 efibootmgr -v
. 이 옵션을 사용하여 달리 지정 하지 않는 한 이 grub-install
명령은 이러한 변수를 업데이트합니다 .--no-nvram
GRUB가 실행되면 다음으로 결정해야 할 것은 구성 파일을 어디에서 읽어야 하는가입니다.
grub-install
GRUB 변수의 원하는 값을 prefix
GRUB의 주요 부분에 직접 삽입하는 기능. 이것내장된 접두사경로를 완전히 지정하거나 아키텍처별 기본값을 사용하여 런타임 시 일부 부분을 결정할 수 있습니다.
레거시 BIOS GRUB의 경우 내장된 접두사는 일반적으로 실제 디스크 지정자를 무시하므로 GRUB가 로드된 동일한 디스크가 사용됩니다. 이 경우 저장된 접두사는 예를 들어 (,msdos1)/grub
GRUB가 설치된 디스크의 첫 번째 기본 파티션 시간입니다./boot
UEFI GRUB의 경우 포함된 접두사는 일반적으로 디렉터리만 지정하며, 이는 EFI 시스템 파티션(ESP)의 배포 디렉터리를 참조합니다. 따라서 일반적인 임베딩 접두사는 /EFI/debian
or /EFI/redhat
또는 유사합니다. 디스크 및 파티션의 기본값은 "UEFI GRUB 바이너리가 로드된 동일한 파티션"입니다.
일부 배포판(예: RHEL)은 UEFI GRUB의 실제 구성을 ESP에 직접 배치합니다. Debian 및 관련 배포판은 일반적으로 좀 더 간접적인 작업을 수행합니다. grub.cfg
ESP의 미니 파일에는 Linux가 부팅되고 모든 디스크가 마운트된 후 파일에서 실제 구성 파일을 읽도록 GRUB에 지시하는 몇 줄만 포함되어 있습니다 /boot/grub/grub.cfg
. 가장 간단하게 이 미니 구성에는 세 줄만 있습니다.
configfile
최신 배포판에서 일반적으로 사용되는 실제 GRUB 구성 파일(실행할 명령용)이 포함된 파일 시스템search
과 파일 시스템 UUID를 가리키도록 GRUB 루트를 설정합니다. 이 체계의 가장 오래된 구현은 실제로 고정된 GRUB 파티셔닝 사양을 사용했을 수 있습니다.set root=(hd0,gpt1)
- GRUB
prefix
변수를 설정합니다(보안 부팅이 적용되지 않는 경우 GRUB 모듈 자동 로딩 활성화). 구성을 로드할 파일 시스템이 Linux 루트 파일 시스템인 경우 이 줄은 다음과 같습니다. 별도의 파일 시스템인 경우 이 줄은 다음과 같습니다set prefix=($root)'/boot/grub'
./boot
set prefix=($root)'/grub'
configfile $prefix/grub.cfg
를 사용하여 실제 GRUB 구성 파일을 읽습니다.
GRUB 구성을 포함하는 파일 시스템이 LVM 논리 볼륨, 암호화된 볼륨 또는 소프트웨어 RAID 세트에 있는 경우 첫 번째 줄은 더 복잡해지고 필요에 따라 추가 줄이 추가될 수도 있습니다.
따라서 레거시 BIOS와 UEFI 모두 grub-install
완전히 다른 디스크에서 완전히 다른 GRUB 구성 파일을 읽도록 부트 로더를 업데이트하는 것이 가능합니다. 프로세스의 세부 사항은 완전히 다릅니다.
efibootmgr
UEFI를 사용하면 운영 체제 내에서 부팅 장치 선택을 실제로 변경할 수 있습니다 grub-install
. 그러나 이것은 grub-install
엄청난 킬러입니다. 설치가 모두 UEFI이고 별도의 ESP 파티션이 있는 경우 고유한 UEFI 부팅 변수가 있으며 둘 중 하나를 쉽게 선택하거나 efibootmgr
UEFI에서 실제로 부팅할 수 있습니다. BIOS 설정에서 완료됨 .
/boot/grub/device.map
기존 BIOS의 경우 상황이 다소 혼란스럽습니다. 각 설치가 해당 특정 설치 디스크를 hd0
다른 설치 디스크로 식별하는지 확인해야 합니다 hd1
. 그런 다음 각 설치의 자체 디스크에만 부트로더를 쓰는 데 사용합니다 grub-install
. "반대" 디스크에는 쓰지 않습니다. 이렇게 하면 다른 디스크가 완전히 제거되더라도 두 디스크는 완전히 독립적이며 부팅 가능합니다. 원한다면 각 GRUB의 구성 파일에 "역방향" 설치를 부팅할 수 있는 메뉴 항목을 추가할 수 있습니다. 또는 BIOS를 직접 사용하여 부팅 디스크를 선택할 수도 있습니다.
알아야 할 것은 레거시 BIOS의 부팅 순서 선택기는 일반적으로 BIOS에서 부팅할 "첫 번째" 디스크인 디스크를 선택하므로 GRUB는 hd0
항상 "BIOS에서 부팅하기 위해 현재 선택된 디스크"를 참조한다는 것입니다.
/dev/sda
따라서 현재 부팅 중이고(BIOS에서는 로 표시됨 sda
) hd0
해당 디스크의 GRUB 메뉴 항목을 /dev/sdb
부팅 메뉴로 전환하려면 다음과 유사한 명령을 사용할 수 있습니다.
menuentry "Switch to /dev/sdb"
{
# flip the disk mappings and reload configuration
drivemap -s (hd0) (hd1)
set root=<the identifier for sdb's partition that contains grub.cfg>
configfile /boot/grub/grub.cfg # or just /grub/grub.cfg is /boot is a separate partition
}
.../dev/sdb의 GRUB 구성에서도 마찬가지입니다.