> For the complete documentation index, see [llms.txt](https://bob-mcd-team.gitbook.io/uefi/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bob-mcd-team.gitbook.io/uefi/uefi-development/boot-option/19.use-bcfg.md).

# 19. bcfg 명령어를 사용한 부팅 옵션 수정

이번 장에서는 NVRAM 변수(BIOS 설정), 즉 부팅 사이에 지속되는 변수에 대해 설명한다.

이전에 OVMF 빌드로 생성된 파일이 있다.

```
$ ls -l Build/OvmfX64/RELEASE_GCC5/FV/OVMF*
-rw-rw-r-- 1 ubuntu ubuntu 3653632 11월 23 17:51 Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd
-rw-rw-r-- 1 ubuntu ubuntu 4194304 11월 24 10:23 Build/OvmfX64/RELEASE_GCC5/FV/OVMF.fd
-rw-rw-r-- 1 ubuntu ubuntu  540672 11월 23 21:10 Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd
```

* `OVMF_CODE.fd` - code image (read-only)
* `OVMF_VARS.fd` - NVRAM variables image (read-write)
* `OVMF.fd` - combined image (`OVMF_CODE.fd` + `OVMF_VARS.fd`)

위 파일들을 이용해서 QEMU를 실행하는 2가지 방법이 있다.

`OVMF.fd` 파일 하나만 사용하는 방법

```
$ qemu-system-x86_64 -drive if=pflash,format=raw,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF.fd \
                     ...
```

`OVMF_CODE.fd` 와 `OVMF_VARS.fd` 를 사용한 방법

```
$ qemu-system-x86_64 -drive if=pflash,format=raw,readonly,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd \
                     -drive if=pflash,format=raw,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \
                     ...
```

이전에는 짧게 `OVMF.fd` 파일만을 이용해서 진행했지만, 여기서는 NVRAM 변수를 수정할 것이기 때문에 초기 상태로 되돌릴 수 있도록`OVMF_NVRAM.fd` 파일을 복사하여 진행한다.

먼저 이전에 OVMF에 `HelloWorld` 애플리케이션을 넣었기 때문에 OVMF 패키지부터 초기 상태로 되돌린다.

```
$ git restore OvmfPkg
$ build --platform=OvmfPkg/OvmfPkgX64.dsc --arch=X64 --buildtarget=RELEASE --tagname=GCC5
```

OVMF를 초기 상태로 빌드하였기 때문에 이제 `OVMF_VARS.fd`를 복사한 후 복사한 파일을 사용하여 QEMU를 실행한다.

```
$ cp Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd ../
$ qemu-system-x86_64 -drive if=pflash,format=raw,readonly,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd \
                     -drive if=pflash,format=raw,file=../OVMF_VARS.fd \
                     -drive format=raw,file=fat:rw:~/UEFI_disk \
                     -nographic \
                     -net none
```

부팅 변수를 변경하기 전에 `bcfg boot dump` 명령어를 통해 확인한다.

```
Shell> bcfg boot dump
Option: 00. Variable: Boot0000
  Desc    - UiApp
  DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331)
  OVMF_VARS.fdiOptional- N
Option: 01. Variable: Boot0001
  Desc    - UEFI QEMU DVD-ROM QM00003
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- Y
Option: 02. Variable: Boot0002
  Desc    - UEFI QEMU HARDDISK QM00001
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- Y
Option: 03. Variable: Boot0003
  Desc    - EFI Internal Shell
  DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
  Optional- N
```

부팅 옵션을 표시하는 것 외에도 `bcfg` 명령은 부팅 옵션을 추가/제거하거나 순서를 변경할 수 있다.

도움말은 아래 명령을 통해 확인할 수 있다.

```
bcfg -? -b
```

이제 부팅 옵션에 `Interactive.efi` 를 추가한다.

```
Shell> fs0:
FS0:\> bcfg boot add 4 InteractiveApp.efi "Interactive app"
Target = 0004.
bcfg: Add Boot0004 as 4
```

정상적으로 추가됐는지 확인하기 위해 다시 부팅 옵션을 확인한다.

```
FS0:\> bcfg boot dump
Option: 00. Variable: Boot0000
  Desc    - UiApp
  DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331)
  Optional- N
Option: 01. Variable: Boot0001
  Desc    - UEFI QEMU DVD-ROM QM00003
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- Y
Option: 02. Variable: Boot0002
  Desc    - UEFI QEMU HARDDISK QM00001
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- Y
Option: 03. Variable: Boot0003
  Desc    - EFI Internal Shell
  DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
  Optional- N
Option: 04. Variable: Boot0004
  Desc    - Interactive app
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi
  Optional- N
```

부팅 옵션을 확인했을 때도 추가가 된 것을 볼 수 있었고 부팅 매니저를 통해서도 확인이 가능하다.

<figure><img src="/files/9G0ZK7oigFw4N9stz9es" alt=""><figcaption><p>Boot Manager에 추가된 화면</p></figcaption></figure>

해당 부팅 옵션은 `OVMF_VARS.fd`를 변경하지 않으면 QEMU를 다시 시작해도 계속해서 나타난다.

애플리케이션을 첫 번째 부팅 소스로 설정하는 것도 가능하다.

```
Shell> bcfg boot mv 4 0
```

다시 부팅 옵션을 확인하면 맨 아래에 있었던 `Interactive app`이 맨 위로 옮겨진 것을 볼 수 있다.

```
Shell> bcfg boot dump
Option: 00. Variable: Boot0004
  Desc    - Interactive app
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi
  Optional- N
Option: 01. Variable: Boot0000
  Desc    - UiApp
  DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331)
  Optional- N
Option: 02. Variable: Boot0001
  Desc    - UEFI QEMU DVD-ROM QM00003
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- Y
Option: 03. Variable: Boot0002
  Desc    - UEFI QEMU HARDDISK QM00001
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- Y
Option: 04. Variable: Boot0003
  Desc    - EFI Internal Shell
  DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
  Optional- N
```

`EFI Internal Shell`을 통해 `reset` 명령을 입력하여 재부팅 되면 `Interactive app`을 먼저 통과한 후 BIOS로 진입하는 모습을 볼 수 있다.

<figure><img src="/files/mv9vMhpEDWty9HrHQHjc" alt=""><figcaption><p>Interactive app이 가장 먼저 실행</p></figcaption></figure>

`EFI Internal Shell`을 통해 해당 부팅 옵션을 삭제할 수도 있다.

```
Shell> bcfg boot rm 0
```

```
Shell> bcfg boot dump
Option: 00. Variable: Boot0004
  Desc    - Interactive app
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi
  Optional- N
Option: 01. Variable: Boot0000
  Desc    - UiApp
  DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331)
  Optional- N
Option: 02. Variable: Boot0001
  Desc    - UEFI QEMU DVD-ROM QM00003
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- Y
Option: 03. Variable: Boot0002
  Desc    - UEFI QEMU HARDDISK QM00001
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- Y
Option: 04. Variable: Boot0003
  Desc    - EFI Internal Shell
  DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
  Optional- N

Shell> bcfg boot rm 0

Shell> bcfg boot dump
Option: 00. Variable: Boot0000
  Desc    - UiApp
  DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331)
  Optional- N
Option: 01. Variable: Boot0001
  Desc    - UEFI QEMU DVD-ROM QM00003
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- Y
Option: 02. Variable: Boot0002
  Desc    - UEFI QEMU HARDDISK QM00001
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- Y
Option: 03. Variable: Boot0003
  Desc    - EFI Internal Shell
  DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
  Optional- N
```
