업데이트-grub과 grub-install?

업데이트-grub과 grub-install?

온라인에서 발견된 일부 예에서는 grub-install 후에 update-grub을 실행해야 한다고 나와 있습니다. 다른 사람들은 순서를 반대로 합니다. 어느 것이 맞나요?

두 개의 Linux 설치(sda에 하나, sdb에 하나)가 있는 경우 sda 설치에서 update-grub을 실행하면 sda 설치가 부팅 메뉴 상단에 배치됩니다. sdb 설치에서 update-grub을 실행하면 sdb 설치가 메뉴 상단에 배치됩니다.

DEFAULT=0이라고 가정하면 이론적으로 BIOS에서 부팅 장치를 선택하여 OS를 선택할 수 있습니다. "grub-install /dev/sda"는 sda 또는 sdb 버전의 Linux에서 실행되었는지 여부에 관계없이 마지막 "update-grub"에 해당하도록 sda 부팅 메뉴를 변경합니까?

답변1

update-grub, 적어도 Debian 및 Ubuntu와 같은 친척에서는 기본적으로 grub-mkconfig. 따라서 GRUB를 생성/업데이트/재생성합니다.구성, 실제 부트로더 자체가 아닙니다.

실제로 grub-install수행하는 작업은 실행 중인 GRUB 버전(기존 BIOS GRUB 또는 UEFI GRUB)에 따라 달라집니다.

기존 BIOS GRUB를 사용하면 grub-install마스터 부트 레코드에 포함된 GRUB 부분을 (다시) 쓰고 GRUB의 다음 부분을 읽을 위치에서 물리적 디스크 블록 번호를 인코딩합니다. 또한 실제 GRUB 구성 파일( /boot/grub/grub.cfg)을 어느 파티션에서 읽을지 결정합니다 . 여기서 중요한 요소는 /boot/grub/device.mapBIOS(및 GRUB) 장치 번호 지정이 Linux 디스크 장치에 매핑되는 방식을 GRUB에 알려주는 파일입니다.

UEFI GRUB를 사용하면 GRUB 부트로더의 주요 부분이 일반적으로 EFI 시스템 파티션의 파일로 위치하게 됩니다 /boot/efi/EFI/<name of distribution>/grubx64.efi. 이 부트로더 경로 이름은 UEFI 부팅 변수의 시스템 NVRAM(= BIOS 설정이 저장되는 장소)에 저장됩니다. GRUB의 주요 부분은 완전히 독립적일 수 있으며(보안 부팅을 사용하는 경우 반드시 있어야 합니다!) 일반적으로 /boot/grub해당 부분이 속한 Linux 배포판의 디렉터리에서 GRUB 모듈로 추가 기능을 로드할 수 있습니다.

UEFI 부팅 변수는 시스템이 EFI 시스템 파티션과 그 안에 있는 부트로더 파일을 찾는 데 사용해야 하는 디스크를 식별합니다. 명령을 사용하여 이러한 변수를 직접 볼 수 있습니다 efibootmgr -v. 달리 지정하는 옵션을 사용하지 않는 한 명령 grub-install은 해당 변수를 업데이트합니다 .--no-nvram


GRUB가 실행되면 다음으로 결정해야 할 것은 구성 파일을 어디서 읽어야 하는가입니다.

grub-installGRUB prefix변수의 원하는 값을 GRUB의 주요 부분에 직접 삽입하는 기능이 있습니다. 이것내장된 접두사경로를 완전히 지정하거나 아키텍처별 기본값을 사용하여 런타임 시 결정되도록 일부 부분을 남겨둘 수 있습니다.

기존 BIOS GRUB의 경우 내장된 접두사는 일반적으로 실제 디스크 지정자를 제외하므로 GRUB가 로드된 것과 동일한 디스크가 사용됩니다. 이 경우 저장된 접두사는 GRUB가 설치된 디스크의 첫 번째 기본 파티션이 (,msdos1)/grub언제 인지가 됩니다./boot

UEFI GRUB의 경우 포함된 접두사는 일반적으로 디렉터리만 지정한 다음 ESP(EFI 시스템 파티션)의 배포 디렉터리를 참조합니다. 따라서 일반적인 내장 접두사는 /EFI/debian다음과 /EFI/redhat같습니다. 디스크 및 파티션의 기본값은 "UEFI GRUB 바이너리가 로드된 동일한 파티션"입니다.

RHEL과 같은 일부 배포판은 UEFI GRUB의 실제 구성을 ESP에 직접 배치합니다. 데비안 및 관련 배포판은 일반적으로 한 번 더 간접적인 작업을 수행합니다. ESP의 미니 파일에는 Linux가 부팅되고 모든 디스크를 마운트한 후 grub.cfgGRUB가 실제 구성 파일을 읽도록 지시하는 몇 줄만 포함됩니다 . /boot/grub/grub.cfg. 가장 간단하게 이 미니 구성은 단 세 줄로 구성됩니다.

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

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


결과적으로 기존 BIOS와 UEFI를 모두 사용하면 실행을 통해 grub-install부트로더를 업데이트하여 완전히 다른 디스크에 있는 완전히 다른 GRUB 구성 파일을 읽을 수 있습니다. 물론 해당 프로세스의 세부 사항은 완전히 다릅니다.

UEFI를 사용하면 OS 내에서 또는 efibootmgr를 사용하여 부팅 장치 선택을 실제로 변경할 수 있습니다 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 구성에서도 마찬가지입니다.

관련 정보