2-1. GRUB 설치, 수정, recovery mode

markyang92·2022년 1월 26일
0

boot

목록 보기
3/6
post-thumbnail

OS: Ubuntu 20.04.3 LTS
Kernel: Linux 5.13.0-27-generic
Architecture: x86-64


grub

  • UEFI boot system에서, GRUB 위치
    • efi라는 디렉토리를 항상 포함하고 있다.
/boot
├── efi
│   └── EFI
│       ├── BOOT
│       │   └── BOOTAA64.EFI
│       └── ubuntu
│           ├── grubaa64.efi <- 부트로더 파일
│           └── grub.cfg     <- 부트로더 설정 파일
└── grub
     └── grub.cfg            <-  위의 부트로더 설정 파일에 담긴 uuid, root(hd?,gpt?) 를 읽어서 로드함
     └── arm64-efi           
             └── *.mod       <- grub에서 탑재하는 모듈들

  • 실제 boot될때 읽어오는 grub 설정파일은 /boot/grub/grub.cfg 이다.

  • /boot/efi/EFI/ubuntu/grub.cfg: 부트로더 설정 파일

  • /boot/grub/grub.cfg : 실제 boot될 때 읽어오는 grub 설정 파일

  • /boot/grub/arm64-efi(본인 컴 아키텍처): 탑재가능한 grub mod 파일들
  • 당연히 위 파일들 은 직접 건드리지 말고 아래의 /etc/'defaults'/grub 파일을 수정하는 식으로 해야한다.

부팅 커널 버전 설정

  1. /boot/grub/grub.cfg에서 menuentry를 읽어온다.
    $ awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg 

  1. /etc/default/grubGRUB_DEFAULT=saved 설정
$ sudo vi /etc/default/grub

  • GRUB_DEFAULT=0이 아니여야 이 파일이 적용됨

  1. 커널 고르기
    3-1. Advanced options for Ubuntu > Ubuntu, with Linux 5.13.0-25-generic
    5.13.0-25커널을 사용할 것임
    3-2. $ grep submenu /boot/grub/grub.cfg, $ grep gnulinux /boot/grub/grub.cfg
'>' 로 연결
gnulinux-advanced-732910d6-ddae-4a95-ab9e-9f5c9edc555a>gnulinux-5.13.0-25-generic-advanced-732910d6-ddae-4a95-ab9e-9f5c9edc555a

  1. /etc/default/grub에 아래와 같이 설정

  1. sudo update-grub/etc/default/grub 내용을 /boot/grub/grub.cfg에 적용
$ sudo update-grub


grub-set-default

$ grub-set-default [OPTION] MENU_ENTRY
  • /etc/default/grubGRUB_DEFAULT=saved 설정
    • 여튼 GRUB_DEFAULT=0만 아니면 grub.cfg를 /etc/default/grub로서 열 수 있음

recovery mode

reset passwd (recovery mode)





mount -o rw,remount /
ls /home

passwd <username>

grub 수정 파일

/etc/default/grub

  1. /etc/default/grub
  • 이 파일을 수정해야한다.

$ grub-mkconfig

  1. grub-mkconfig 기능
  • grub-mkconfig를 통해 GRUB 환경 설정 파일인 <grub_name>.cfg 파일을 만들 수 있다.
    • /etc/default/grub 참조
    • /etc/grub.d/* 파일들 참조한다.
    • 40_custom, 41_custom 스크립트를 custom setting하여 custom grub를 만들어낸다.

  • grub-mkconfig 명령을 사용한다.
    • 없다면 패키지를 설치한다.
    $ sudo apt install grub-common

  • $ sudo grub-mkconfig -o /boot/grub/grub.cfg 명령
    $ sudo grub-mkconfig -o /boot/grub/grub.cfg
  • /etc/default/grub가 자동으로 input으로 먹힌다.

    여기로 덮어 씌워진다.
  • fedora 에서는 grub2-mkconfig 명령어를 사용할 것!

/etc/grub.d/

  • /etc/grub.d

    /etc/grub.d 설정 디렉터리는 두 가지 옵션, 40_custom41_custom을 제공한다.

  • 40_custom: 편집할 수 있는 스크립트.. 이지만, 아마도 가장 언정성이 떨어질 것.
    패키지 업그레이드가 변경한 부분을 없애버릴 수도 있다.

  • 41_custom: 더 간단하다. GRUB가 시작될 때, custom.cfg를 로딩하는 명령이다.
    만약 이 두 번째 옵션을 선택한다면 설정 파일을 생성할 때, 우리가 변경한 사항들이 나타나지 않을 것이다.

설정 파일을 직접 편집하는 두 가지 옵션은 많이 사용되지 않는다.
우분투는 메모리 테스터 부트 옵션(memtest86+)를 설정에 추가한다.


grub 설치

  • GRUB2의 기본 메인 디렉토리
    • /boot/grub/
    • /etc/grub.d
  • User preference
    • /etc/default/grub 에 저장
  • GRUB2의 메뉴는 /boot/grub/grub.cfg 에 포함된 정보를 빌드한다

1. BIOS/MBR

  • MBR(https://velog.io/@markyang92/disk#mbr) 참고
  • GRUB2의 부트로더 default 설치 위치: 1)MBR 다음, and 2)첫 번째 파티션 이전.
    • 부트로더 정보는 MBR의 embedded area에 반드시 설치할 필요가 없고, bypass 하여 특정 파티션에 지정할 수 있다.
    • 이렇게 함으로써 GRUB 2 파일의 위치는 블록리스트를 사용하여 지정할 수 있지만, 설치 후 터미널을 통해 만들 수 있다. (비추천)

2. BIOS/GPT

  • BIOS 부트 파티션이라는 '작은 파티션'을 생성해 (약 1MB) 부트로더, 부트로더 코드를 위치시킨다.
  • 이 파티션은 gparted와 같은 툴들로 생성할 수 있다.
  • bios_grub 플래그로 식별된다.
  • GPT는 최근 UEFI와 함께 사용되므로, 아래 참고

3. UEFI 부트

  • EFI: BIOS의 심각하게 떨어지는 제한된 성능을 해결하고나 대체된 Extensible Firmware Interface
  • UEFI: 표준 EFI (Unified EFI)
    • 내장 셸 기능과 파티션 테이블을 읽고, 파일 시스템을 다룰 수 있는 기능들을 포함한다.
    • GPT 파티셔닝은 UEFI 표준의 일부이다.
  • UEFI 상의 부트는 파일 시스템 외부에 존재하는 실행 가능한 부트 코드라기 보다는 EFI 시스템 파티션(ESP)이라고 불리는 특별한 파일 시스템이 항상 존재한다.
    • 각 부트로더는 자체의 식별자를 갖고, 그에 상응하는 efi/microsoft, efi/apple, efi/grub와 같은 서브 디렉토리를 보유하고 있다.
    • 부트로더 파일은 .efi확장자를 가지며, 이 서브 디렉토리들 중 하나에 다른 지원 파일들과 같이있다.
    • ESP는 BIOS Boot 파티션과 다르며, 이와 다른 UUID를 가지고 있음!
  • 이전의 부트로더 코드를 ESP에 삽입할 수 없다. 이는 BIOS 인터페이스를 위해 작성된 것이다.
    • 사용자가 UEFI를 위해 작성된 부트 로더를 제공해야한다.
    • e.g. GRUB를 사용할 때 BIOS 버전이 아니라 GRUB의 UEFI 버전을 설치해야한다.
    • 새로운 부트로더를 펌웨어에 '알려야'하며, 아래의 보안 부트에 관해 생각해봐야한다.

$ grub-install

  • GRUB2 차제를 설치하는 명령
  • Package: grub2-common
    • Install Package: $ sudo apt install grub2-common
# grub-install [OPTION...] [OPTION] [INSTALL_DEVICE]

Option:
        --compress=no|xz|gz|lzo
            compress GRUB files [optional]
    
        --dtb=FILE
            embed a specific DTB
        
        -d, --directory=DIR
            use images and modules under DIR [default=/usr/lib/grub/<platform>]
        
        --fonts=FONTS
            install FONTS [default=unicode]
        
        -k, --pubkey=FILE
            embed FILE as public key for signatrue checking
        
        --locale-directory=DIR use translations under DIR
            [default=/usr/share/locale]
    
        --locales=LOCALES
            install only LOCALES [default=all]
       
       --modules=MODULES
              pre-load specified modules MODULES

       --themes=THEMES
              install THEMES [default=starfield]

       -v, --verbose
              print verbose messages.

       --allow-floppy
              make the drive also bootable as floppy (default for fdX devices). May break on some
              BIOSes.

       --boot-directory=DIR
              install GRUB images under the directory DIR/grub instead of the boot/grub directory

       --bootloader-id=ID
              the ID of bootloader. This option is only available on EFI and Macs.

       --core-compress=xz|none|auto
              choose the compression to use for core image

       --disk-module=MODULE
              disk module to use (biosdisk or native). This option  is  only  available  on  BIOS
              target.

       --efi-directory=DIR
              use DIR as the EFI System Partition root.

       --force
              install even if problems are detected

       --force-file-id
              use identifier file even if UUID is available

       --label-bgcolor=COLOR
              use COLOR for label background

       --label-color=COLOR
              use COLOR for label

       --label-font=FILE
              use FILE as font for label

       --macppc-directory=DIR use DIR for PPC MAC install.

       --no-bootsector
              do not install bootsector

       --no-extra-removable
              Do  not  install  bootloader  code to the removable media path. This option is only
              available on EFI.

       --no-nvram
              don't update  the  `boot-device'/`Boot*'  NVRAM  variables.  This  option  is  only
              available on EFI and IEEE1275 targets.

       --no-rs-codes
              Do  not  apply  any reed-solomon codes when embedding core.img. This option is only
              available on x86 BIOS targets.

       --no-uefi-secure-boot
              do not install an image usable with UEFI  Secure  Boot,  even  if  the  system  was
              currently started using it. This option is only available on EFI.

       --product-version=STRING
              use STRING as product version

       --recheck
              delete device map if it already exists

       --removable
              the installation device is removable. This option is only available on EFI.

       -s, --skip-fs-probe
              do not probe for filesystems in DEVICE

       --target=TARGET
              install   GRUB   for   TARGET   platform   [default=i386-pc];   available  targets:
              arm-coreboot,   arm-efi,    arm-uboot,    arm64-efi,    i386-coreboot,    i386-efi,
              i386-ieee1275,   i386-multiboot,   i386-pc,   i386-qemu,   i386-xen,  i386-xen_pvh,
              ia64-efi, mips-arc, mips-qemu_mips, mipsel-arc, mipsel-loongson,  mipsel-qemu_mips,
              powerpc-ieee1275,    riscv32-efi,    riscv64-efi,   sparc64-ieee1275,   x86_64-efi,
              x86_64-xen

       --uefi-secure-boot
              install an image usable with UEFI Secure Boot.  This option is  only  available  on
              EFI and if the grub-efi-amd64-signed package is installed.

       -?, --help
              give this help list

       --usage
              give a short usage message

       -V, --version
              print program version

Mandatory  or  optional  arguments  to long options are also mandatory or optional for any corresponding short options.

INSTALL_DEVICE must be system device  filename.   grub-install  copies  GRUB  images  into boot/grub.  On some platforms, it may also install GRUB into the boot sector.

1. 외부 저장 장치에 GRUB 설치

  • 현재 시스템이 아닌, '외부 저장장치'에 GRUB를 설치하려면, 수동으로 그 장치상의 GRUB 디렉터리를 명시해야한다.
  1. 타겟 장치: /dev/sdc
  2. 루트/부트 파일 시스템: /dev/sdc1
  3. 현재 시스템에 마운트 포인트: /mnt
  • GRUB가 GRUB파일을 찾을 위치: /mnt/boot/grub
$ sudo grub-install --boot-directory=/mnt/boot /dev/sdc

2. UEFI에 GRUB 설치

  • efibootmgr 명령을 사용해, 펌웨어어에 부트 로더를 알려주는 작업을 해야한다.
  • 아래의 명령을 사용하면 자동적으로 UEFI에게 부트로더 위치를 알려준다.
$ sudo grub-install --efi-directory=<efi_dir> --bootloader-id=<name>
  • <efi_dir>: 현재 시스템에서 'UEFI' 디렉터리가 있는 장소다. (보통은 /boot/efi/efi)
    • UEFI 파티션이 때로 /boot/efi에 마운트 되기 때문
    • 부트로더의 식별자: <name>
  • UEFI 부트 로더를 설치할 때 많은 문제들이 발생할 수 있다.
    • e.g., 다른 시스템에 들어가는 디스크에 설치하려고 하면 새로운 해당 시스템의 펌웨어에 그 부트 로더를 알릴 방법이 있어야한다.
      또한 UEFI 보안 부트 문제가 있다.

2-1. UEFI 보안 부트 문제

  • 최근 PC들은 보안 부트 기능을 탑재하는데, 이것이 활성화되면 UEFI의 매커니즘은 부팅을 위해 신뢰할 수 있는 권한으로 디지털 서명이된 부트 로더를 요구한다.
  • MS는 Windows 8을 출하하는 판매자들에게 보안 부트를 사용하도록 요구했다.
  • 서명이 없는 부트로더(대부분의 현재 리눅스 배포판들)를 설치하려고 시도하면 로딩되지 않는다.
  • Windows에 관심 없으면, 이 것을 비활성화하면 된다.
    • 이중 부팅 시스템의 경우 깔끔하게 안 돌아갈 수 있다.
  • 최근 리눅스 배포판들은 서명이된 부트 로더를 제공하고 있다.
  • 일부 해결책들은 GRUB의 전단계에 해당하는 것이고, 어떤 것은 부트로더로부터 커널까지 완전히 서명된 절차를 제공하지만 또 어떤 것은 (일부 efilinux를 근거로하는) 완전히 새로운 부트로더이다.

3. 다른 OS 체인 로딩

  • UEFI는 상대적으로 다른 OS의 로딩을 지원하기 쉽다.
    • EFI 파티션에 다수의 부트 로더를 설치할 수 있다.
    • MBR은 지원하지 않는다.
    • UEFI를 갖추더라도 여전히 MBR 스타일의 부트 로더를 가진 개별적인 파티션들을 보유하고 있을 수도 있다.
  • 이 때, 체인 로딩을 통해 GRUB로 하여금 디스크상의 특정 파티션에 있는 다른 부트로더를 로딩하고 실행하도록 할 수 있다.

체인 로딩을 하려면, GRUB 설정에서 새로운 메뉴를 생성해야 한다. 다음은 디스크의 세 번째 파티션 상에 윈도우즈를 설치하는 것에 대한 예제이다.

menuentry "Windows" {
    insmod chain
    insmod ntfs
    set root=(hd0,3)
    chainloader +1
}
  • chainloader +1: 첫 번째 섹터에 있는 것이 무엇이든, 그것을 로딩하라고 지시하는 것

파일을 직접 로드할 수 도있다. 다음은 io.sys MS-DOS 로더를 로딩하는 설정이다.

menuentry "DOS" {
    insmode chain
    insmod fat
    set root=(hd0,3)
    chainloader /io.sys
}

부팅 시, grub 컨트롤

  • 부팅 시, GRUB 메뉴가 뜨지 않으면, splash 이미지에서 shift 키를 잠시 누르고 있으면, GRUB가 뜬다.

  • 여기서 e키를 누르면, 디폴트 부트 옵션에 대한 부트로더 설정 명령들을 확인한다.

  • GRUB 내부 명령이다.
    GRUB는 '자체 커널'을 보유하고, 동적으로 GRUB 모듈들을 로딩하는 자체 insmod 명령을 갖고 있으며, 리눅스 커널과는 완전히 별개이다.
  • 'GRUB의 root=hd0,gpt2'로 set된다. (GRUB 전용 장치이다)
    • GRUB는 자체 장치 주소 체계를 갖고 있는 것이다. 첫 째로 발견된 디스크를 hd0으로 지정하고 그 뒤부터는 hd1.. 로 지정한다. 즉, hd0은 유동 적이고 모든 파티션에서 UUID를 찾는다.

  • 밑으로 가면
    linux /boot/vmlinuz-5.4.0-66-generic root=UUID ...가 있다.
    • linux='load할 리눅스 커널 이미지 위치', GRUB는 이 이미지 파일을 'GRUB의 root'에서 로드
    • root=UUID.... ro로 rootfs를 UUID로 설정하며, ro 옵션으로 마운트한다.
      • quiet, splash 등 옵션을 줄 수 있다.
      • 당연히 이 'root'는 rootfs의 UUID이다. (/dev/sda2)
    • 이 명령이 커널 매개변수이다. (/proc/cmdline)
    • 루트 커널 매개 변수만이 시스템을 부팅할 때 루트 파일 시스템이 될 것이다.


  • initrd /boot/initrd.img-5.4.0-66-generic
    • 초기 RAM 파일 시스템을 위한 파일을 명시한다.

GRUB cmd

  • Ctrl + c를 누르면, GRUB cmd 라인에 들어갈 수 있다.

  • ls 명령을 입력하면, (proc) (hd0) (hd0,gpt2) (hd0,gpt1) ...
    • proc 디바이스, 파일 시스템과 hd0, gptX라는 suffix가 붙는다. 이는 hd0gpt파티션 테이블을 사용한다는 말이다.

  • ls -l 명령은 좀 더 자세히 보여준다.
  1. Device: proc, Filesystem: procfs
  2. Device: hd0,gpt2, Filesystem: ext*, UUID= (/dev/sdb2)
  3. Device: hd0,gpt1, Filesystem: fat, UUID= (/dev/sda1)

  • root= hd0,gpt2 로 설정되어 있음
  • ls ($root) = root 변수의 자세한 내용
  • ls ($root)/= root 변수내 있는 파일들
    • ls는 GRUB의 ls명령임
  • ls ($root)/boot 에는 커널 이미지가 있다.

  • set 명령을 사용하면, 현재 GRUB의 변수들이 출력된다.

  • prefix 변수에는 $(root)/boot/grub로 셋 되어 있다.
  • GRUB는 이 파일 시스템과 디렉토리에서 그 설정과 보조적 지원에 대해 찾을 것이다.

  • GNU/Linux
  1. grub의 root device를 설정. find /vmlinuz 같은 것으로 찾을 수 있다.
  2. 커널로드
grub> kernel /vmlinuz root=/dev/hda1 [Kernel Parameters]
  1. initrd
grub> initrd /initrd
  1. boot
grub> boot
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글