grub.cfg 생성

grub.cfg 생성
  • GPT 파티션에서 부팅하는 방법은 무엇입니까?
  • 부팅 가능 플래그가 있는 파티션이 필요한 MBR 방식과 같습니까?
  • Linux에서 GPT 파티션을 부팅 가능으로 표시하는 방법은 무엇입니까?

답변1

GPT 파티션에서 부팅하는 방법은 무엇입니까?

Linux 설치 부팅에는 다음을 포함한 여러 단계와 소프트웨어 구성 요소가 포함됩니다.펌웨어초기화, 실행부트 로더, 로드 및 시작리눅스 커널이미지, 다양한 실행시작 스크립트그리고데몬. 이러한 각 단계와 구성 요소에는 다양한 변형과 ​​접근 방식이 있습니다. 예를 들어,애벌레,릴로,시리눅스또는로드린부트 로더로 사용할 수 있지만 시작 스크립트는 전통적인 스크립트일 수 있습니다.초기화-스타일 또는 시스템 구성은 다음과 같은 현대적인 대안을 통해 수행될 수 있습니다.체계화된또는갑자기 나타나다.

부팅에 사용되는 또 다른 인기 있는 프로그램은 다음과 같습니다.재정의UEFI 부팅 관리자발사할 수 있는EFISTUB커널.

그만큼EFI(확장 가능한 펌웨어 인터페이스)시스템 파티션또는ESP다음을 준수하는 컴퓨터에서 사용하는 데이터 저장 장치(일반적으로 하드 디스크 드라이브 또는 솔리드 스테이트 드라이브)의 파티션입니다.통합 확장 가능 펌웨어 인터페이스(UEFI). 컴퓨터가 있을 때부팅됨, UEFI 펌웨어는 ESP에 저장된 파일을 로드하여 설치된 운영 체제 및 다양한 유틸리티를 시작합니다.

ESP에는 다음이 포함됩니다.부트 로더또는커널 이미지설치된 모든 운영 체제에 대해

부팅 가능 플래그가 있는 파티션이 필요한 MBR 방식과 같습니까?

그만큼부팅 플래그고대로부터의 것입니다.MBR파티션은 부팅 가능한 것으로 기록되므로 부트 로더가 있는 위치를 나타낼 수 있습니다. 따라서 귀하의 질문에 '아니요'라고 답하기 위해 부팅 파티션을 부팅 가능으로 표시할 필요가 없습니다.

그만큼전역 고유 식별자(GUID)에 대한EFI시스템 파티션GUID 파티션 테이블(GPT) 계획은C12A7328-F81F-11D2-BA4B-00A0C93EC93B, ID는마스터 부트 레코드(MBR) 파티션 테이블 방식은0xEF.

Linux에서 GPT 파티션을 부팅 가능으로 표시하는 방법은 무엇입니까?

  • ~ 안에gdisk, 유형 코드를 EF00으로 설정합니다. (gdisk는 디스크의 실제 유형 코드로 확장되는 2바이트 유형 코드를 사용합니다. "EF00"은 "C12A7328-F81F-11D2-BA4B-00A0C93EC93B".)
  • ~ 안에GParted또는 헤어지면 "부팅 플래그"를 설정합니다. 그러나 이는 GPT 디스크에서만 작동합니다. 이러한 프로그램을 사용하면 MBR 디스크에 ESP 유형 코드를 설정할 수 없습니다. (EFI 기반 컴퓨터는 일반적으로 GPT 디스크에서 부팅되므로 이는 일반적으로 큰 문제가 아닙니다.)
  • 최신 버전의 Linux에서는fdisk, 파티션 유형은 해당 번호(GPT 디스크의 "EFI 시스템"의 경우 1, MBR 디스크의 경우 0xEF)로 설정하거나 GPT 디스크의 전체 유형 코드를 입력하여 설정합니다.

답변2

부팅 가능 플래그가 있는 파티션이 필요한 MBR 방식과 같습니까?

흠 BIOS가 부팅 실행을 어떻게 넘겨주는지에 대해 간략하게 설명하기 훨씬 전에 말이죠.

  1. Bios는 부팅 매체의 첫 번째 섹터(512바이트)를 읽습니다.
  2. 섹터의 마지막 2바이트가 55 AA이면 해당 섹터를 실행합니다. 이제 바이오스의 책임은 여기서 끝납니다.

잘라낸 440바이트 코드는 MBR(마스터 부트 레코드)로 명명됩니다. 이는 4개의 파티션 테이블 항목에서 부팅 가능한 플래그를 찾는 것입니다. 부팅 가능한 것으로 표시된 일부 파티션에 대해 첫 번째 섹터를 로드하고 부팅 실행 흐름을 이 섹터의 ​​코드로 핸드오버합니다.

GPT를 사용하는 경우에도 소위 보호 MBR이 있다는 호환성 이유로 참고하세요. (GPT는 두 번째 섹터에서 시작됩니다)

따라서 '부팅 가능 플래그'를 관리하는 것은 MBR 코드입니다. 그러나 잘라낸 440바이트 MBR 코드는 변경되거나 다를 수 있습니다. 실제로 GRUB를 설치할 때 그렇습니다. 예를 들어 다음과 같이 GRUB2를 설치합니다.

sudo grub-install --boot-directory=/mnt/boot --force --target=i386-pc /dev/sdb   -v 

표준 MBR 코드를 자체 코드로 완전히 대체합니다. (해당 코드의 복사본은 /boot/grub/i386-pc/boot.img에서 찾을 수 있습니다.)

결론: -> Grub 코드는 부팅 가능한 플래그를 신경 쓰지 않습니다.

비 EFI GPT 장치에 grub 설치

'비-EFI'란 Bios에 UEFI가 없거나 UEFI가 CSM(호환성 지원 모듈) 모드에서 실행되고 위에서 설명한 전통적인 방식으로 부팅되는 오래된 장치를 의미합니다.

Grub이 '차단 목록'을 통해 설치되면 MBR과 첫 번째 부팅 섹터 사이의 파티션 간격에 자체적으로 설치됩니다. 그러나 GPT를 사용하면 Grub은 파티션 간격 방식을 거부합니다. 대신 코드를 안전하게 설치할 수 있는 작은 파티션을 만들고 싶어합니다.

그래서 이것이 우리가 이것을 사용하여 설정하는 방법입니다.갈라진:

  1. 1MB의 포맷된 파티션을 생성합니다.
  2. 해당 파티션을 'bios-grub'으로 표시하십시오. gparted에서 'bios-grub' 확인란을 활성화하면 GPT 유형이 'BIOS 부팅 파티션'으로 변경됩니다.

또는 다음을 사용할 수 있습니다. gdisk -l /dev/sdb확인하고 ...

sgdisk -t 3:ef02 /dev/sdb ^- 세 번째 파티션을 ef02로 표시 => 'BIOS 부팅 파티션'

... gparted 없이 동일한 작업을 수행합니다. 참고: "ef02"는 'BIOS 부팅 파티션' 또는 GUID의 약자입니다 21686148-6449-6E6F-744E-656564454649.

알았어, 그게 다야. 이제 Grub 설정을 실행할 수 있습니다.

Linux(또는 /boot/grub 파티션)를 /mnt/boot에 마운트하고 실행하세요.

  1. sudo grub-install --boot-directory=/mnt/boot --force --target=i386-pc /dev/sdb   -v 
    

운이 좋으면 모든 일이 잘 진행되고 다음과 같이 표시됩니다.

grub-install: Info: setting the root device to `hostdisk//dev/sda,gpt6'.
grub-install: Info: saving <556324864,0,512>.
...

따라서 내용이 /boot/grub/i386-pc/core.img1MB의 'BIOS 부팅 파티션'에 직접 복사되어야 합니다. --force그렇지 않으면 grub은 차단 목록을 통한 설치를 거부합니다. 여기서 실패할 경우 설치의 차단 목록 부분에서 다시 시작을 시도하는 바로가기가 있습니다.

grub-bios-setup --verbose --force --directory= /mnt/boot/grub/i386-pc  /dev/sdb

간단히 말해서그럽-바이오스-설정복사할 것이다

/mnt/boot/grub/i386-pc/boot.img -> Sector 0 (MBR)
/mnt/boot/grub/i386-pc/core.img -> Sector 556324864 (BIOS boot partition)

그러나 core.img의 가장 중요한 부분인 '컴파일'은 수행되지 않습니다.

나는 사용한다버추얼박스부팅 프로세스를 테스트하려면:

sudo chmod 666 /dev/sd*
VBoxManage  internalcommands createrawvmdk -filename ~/sdb.vmdk -rawdisk /dev/sdb

이 명령은 전체 물리적 장치를 가상 머신으로 가져오는 데 특히 유용합니다.

<오른쪽 Ctrl> + R은 VM을 다시 시작합니다.

그럽 구조로 '재미'>

도중에 마주치게 될 수도 있으므로 잠시 서두르세요. 좋습니다. 목표는 다음 두 명령을 오류 없이 실행하는 것입니다.

> insmod normal
> normal

set무엇이 설정되어 있는지 확인하는 데 유용합니다. ls어떤 파티션이 있는지 보여줍니다. ls (hd0,2)(hd0,2)의 grub 폴더를 찾은 경우 파티션 #1에 어떤 파일이 있는지 보여 set prefix=(hd0,2)/boot/grub주는 명령입니다. 이제 '일반' 그럽 메뉴로 이동하게 됩니다 insmod normal. normalNormal.mod를 실행하고 나면 언급할 멋진 점이 하나 있습니다:

ls (hd0,<tab>

어떤 파티션이 있는지, 해당 이름은 무엇인지, 사용된 파일 시스템은 무엇인지에 대한 자세한 정보를 제공합니다.

그러나 주제로 돌아갑니다.

grub.cfg로 파티션을 표시하는 방법은 무엇입니까?

이는 grub을 설치할 때 간접적으로 발생합니다. 그 후에는 수정되었으며 변경이 거의 불가능합니다. 어리석은 디자인 결정에 감사드립니다. 좋아요, grub의 잘 설계되지 않은 부분을 더 자세히 살펴보겠습니다.

이 core.img의 키입니다. 해당 목적을 위해 생성한 1MB 파티션에 직접 작성된 grub 설정 중 다음과 비슷할 수 있는 스크립트가 포함되어 있습니다.

set prefix=(hd0,2)/boot/grub
insmod normal
normal

이 스크립트와 grub 파일이 있는 파티션에 액세스하는 데 필요한 모든 파일 시스템 드라이버는 함께 접착되어 core.img로 압축(!!!)됩니다. 압축으로 인해 디스크 편집기를 사용하여 이를 보거나 (hd0,2)를 (hd0,4)로 변경하는 것과 같은 작은 항목을 변경할 수 없거나 필요할 수 있는 이와 유사한 항목을 변경할 수 없습니다. gdisk를 사용하여 GPT 파티션을 정렬하거나 일부 작업을 수행합니다. 다른 변경 사항. 압축을 비활성화할 수 있는 방법도 없습니다(또는 스위치가 있지만 작동하지 않습니다). 또한 해당 스크립트는 자동 생성되므로 좀 더 똑똑하게 만들기 위해 변경할 방법이 없습니다. 예를 들어. 고정된 파티션 번호 대신 search.label을 사용하여 필요한 Grub 파티션을 찾으세요. 부분적으로 할 수 있는 일은 grub 설정을 다시 실행하고 부팅이 제대로 되기를 바라는 것뿐입니다.

참고: 이상하게도 EFI를 사용하면 빠른 사용자 정의가 더 개방적이고 친숙해집니다.

불행히도 저는 여전히 'grub-install'이 어떻게 작동하는지 연구 중입니다. 현재 나는 이상한 일을 하고 있습니다.sda내가 명시적으로 지정하는 동안sdb.

나중에 더 자세히 알게 되면 이 게시물을 편집할 수도 있습니다. 편집: 좋아요, 이제 갑니다. '불가능'을 수행하는 방법은 다음과 같습니다.

nano /mnt/boot/grub/i386-pc/load.cfg

~부터

search.fs_uuid 39ff90d3-00b1-4cb9-8b94-03a7a9053352 root hd0,gpt6 
set prefix=($root)'/mnt/boot/grub'

쓰레기이고 내가 필요한 것이 아닙니다. 나는 그것을 다음과 같이 변경합니다 :

search.fs_label boot root hd0,gpt5 
set prefix=($root)/grub

와, 그게 더 좋아 보이는데. :) ... 이제 'core.img'를 생성합니다... :

grub-mkimage -O i386-pc -o /mnt/boot/grub/i386-pc/core.img  -C none \
    --prefix /grub -c /mnt/boot/grub/i386-pc/load.cfg  \
    ext2 ntfs part_gpt biosdisk search_label normal

참고: 구조 콘솔에서 더 편안하게 사용할 수 있도록 ntfs 외에 'normal' 모듈도 추가했습니다. 이제 탭을 눌러 명령을 완료하고 커서를 위로 아래로 스크롤하여 명령 기록을 스크롤할 수 있습니다. 그리고 앞서 언급했듯이 현재는 --Compression none아무런 효과가 없습니다. Core.img는 항상 xz로 압축됩니다.

... 그리고 디스크에 씁니다.

grub-bios-setup -v -f -d /mnt/boot/grub/i386-pc  /dev/sdb

따라서 시작되는 파티션은 grub.cfg에 작성된 내용과 물론 부팅하도록 선택한 사용자가 무엇인지에 따라 달라집니다.

grub.cfg 생성

Linux 시스템을 /mnt/MINT에 마운트한 후 다음을 실행하십시오.

grub-mkconfig -o /mnt/MINT/boot/grub/grub.cfg

UEFI 지원 추가

준비: Gparted를 사용하여 1MB FAT32 파티션을 추가하세요. 유형을 'ef00 EFI 시스템 파티션'으로 설정합니다. sgdisk -t 11:ef00 /dev/sdb ^-는 11번째 파티션을 ef00 => 'EFI 시스템 파티션'으로 표시합니다.

gdisk -l /dev/sdb결과를 확인하기 위해. 그러나 대부분의 경우 이미 'EFI 시스템 파티션'이 있습니다. 따라서 이 경우에는 추가 항목을 만드는 대신 사용하세요.

'EFI 시스템 파티션'은 나중에 EFI BIOS에 의해 로드 및 실행되는 grubx64.efi를 저장합니다.EFI-Bios는 기본적으로 GPT와 FAT32를 읽는 방법을 알고 있습니다. 이제 마운트하세요

/mnt/boot -> Linux System containing grub.cfg
/mnt/UEFI -> The 'EFI system partition'

이제 grub-install을 실행하세요:

sudo grub-install --boot-directory=/mnt/boot \
        --efi-directory=/mnt/UEFI  --target=x86_64-efi   /dev/sdb   -v 

많이 바뀌지 않았습니다. --force는 더 이상 필요하지 않습니다. 또 다른 --target이 있고 추가 인수가 필요합니다 --efi-directory

관련 정보