update-grub 및 grub-install?

update-grub 및 grub-install?

온라인에서 발견된 일부 예에서는 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-installGRUB 변수의 원하는 값을 prefixGRUB의 주요 부분에 직접 삽입하는 기능. 이것내장된 접두사경로를 완전히 지정하거나 아키텍처별 기본값을 사용하여 런타임 시 일부 부분을 결정할 수 있습니다.

레거시 BIOS GRUB의 경우 내장된 접두사는 일반적으로 실제 디스크 지정자를 무시하므로 GRUB가 로드된 동일한 디스크가 사용됩니다. 이 경우 저장된 접두사는 예를 들어 (,msdos1)/grubGRUB가 설치된 디스크의 첫 번째 기본 파티션 시간입니다./boot

UEFI GRUB의 경우 포함된 접두사는 일반적으로 디렉터리만 지정하며, 이는 EFI 시스템 파티션(ESP)의 배포 디렉터리를 참조합니다. 따라서 일반적인 임베딩 접두사는 /EFI/debianor /EFI/redhat또는 유사합니다. 디스크 및 파티션의 기본값은 "UEFI GRUB 바이너리가 로드된 동일한 파티션"입니다.

일부 배포판(예: RHEL)은 UEFI GRUB의 실제 구성을 ESP에 직접 배치합니다. Debian 및 관련 배포판은 일반적으로 좀 더 간접적인 작업을 수행합니다. grub.cfgESP의 미니 파일에는 Linux가 부팅되고 모든 디스크가 마운트된 후 파일에서 실제 구성 파일을 읽도록 GRUB에 지시하는 몇 줄만 포함되어 있습니다 /boot/grub/grub.cfg. 가장 간단하게 이 미니 구성에는 세 줄만 있습니다.

  1. configfile최신 배포판에서 일반적으로 사용되는 실제 GRUB 구성 파일(실행할 명령용)이 포함된 파일 시스템 search과 파일 시스템 UUID를 가리키도록 GRUB 루트를 설정합니다. 이 체계의 가장 오래된 구현은 실제로 고정된 GRUB 파티셔닝 사양을 사용했을 수 있습니다.set root=(hd0,gpt1)
  2. GRUB prefix변수를 설정합니다(보안 부팅이 적용되지 않는 경우 GRUB 모듈 자동 로딩 활성화). 구성을 로드할 파일 시스템이 Linux 루트 파일 시스템인 경우 이 줄은 다음과 같습니다. 별도의 파일 시스템인 경우 이 줄은 다음과 같습니다 set prefix=($root)'/boot/grub'./bootset prefix=($root)'/grub'
  3. configfile $prefix/grub.cfg를 사용하여 실제 GRUB 구성 파일을 읽습니다.

GRUB 구성을 포함하는 파일 시스템이 LVM 논리 볼륨, 암호화된 볼륨 또는 소프트웨어 RAID 세트에 있는 경우 첫 번째 줄은 더 복잡해지고 필요에 따라 추가 줄이 추가될 수도 있습니다.


따라서 레거시 BIOS와 UEFI 모두 grub-install완전히 다른 디스크에서 완전히 다른 GRUB 구성 파일을 읽도록 부트 로더를 업데이트하는 것이 가능합니다. 프로세스의 세부 사항은 완전히 다릅니다.

efibootmgrUEFI를 사용하면 운영 체제 내에서 부팅 장치 선택을 실제로 변경할 수 있습니다 grub-install. 그러나 이것은 grub-install엄청난 킬러입니다. 설치가 모두 UEFI이고 별도의 ESP 파티션이 있는 경우 고유한 UEFI 부팅 변수가 있으며 둘 중 하나를 쉽게 선택하거나 efibootmgrUEFI에서 실제로 부팅할 수 있습니다. 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 구성에서도 마찬가지입니다.

관련 정보