왼손잡이해방연대 아지트

사용자 확인중...

일지 857호의 개정판

본문 보기

운영체제는 짧고 찐빠는 길다

예전에 파티션할 때 냈던 찐빠가 부팅 시스템의 훌륭한 안전장치 덕분에 지금까지 잘 굴러오고 있었다는 사실을 알아냈다. 이 파티션은 지금 쓰는 아치리눅스를 설치하기도 더 전인, nixOS를 설치할 때 만든 것인데, 컴퓨터가 한 번 갈아엎이는 기간동안 안 들키고 남아있던 것이다.

문제의 디스크 파티션 상태를 찍어보면 아래와 같다:

$ lsblk -o NAME,SIZE,MOUNTPOINT,PARTTYPENAME -I 259
NAME          SIZE MOUNTPOINT PARTTYPENAME
nvme0n1     931.5G            
├─nvme0n1p1     1G /boot      Linux filesystem
├─nvme0n1p2     4G [SWAP]     Linux filesystem
└─nvme0n1p3 926.5G /          Linux filesystem

마운트 지점을 보면 알 수 있듯 p1이 부트 파티션으로도 불리는 EFI 시스템 파티션(EFI system partition, ESP)이고, p2가 스왑 영역, p3가 루트 파일 시스템이다.

이 파티션은 잘못되었다. 아치위키에 따르면 리눅스에서 필수로 갖춰야 하는 파티션은 다음과 같다:

The following partitions are required for a chosen device:

  • One partition for the root directory /.
  • For booting in UEFI mode: an EFI system partition.

그러니까 부팅 파티션인 p1은 EFI로 표시되어야 정상이다. 예전에 nixOS를 설치하며 정리한 글을 읽어보면 이러한 찐빠의 악취를 느낄 수 있다:

리눅스를 설치할 때는 일반적으로 세 개 파티션을 설정해야 한다 (...) 그렇다. 나는 파티션을 따로 하지 않았다. 아치 리눅스 깔면서 해놨던 파티션을 그대로 썼다ㅋ (...) 자세한 파티션 과정은 매뉴얼을 참조.

이제 보니 운영체제를 두 번 갈 동안 발견되지 않은 007급 버그였다. 오늘 이 버그도 다른 사소한 귀찮음을 해결하려다가 우연히 찾은 것이다. 변명을 하자면 아치위키의 설치 가이드에는 디스크 파티션 하는 명령어가 직접 적혀있지 않고 "파티션 할 때는 fdisk 명령을 쓰면 된다"라고 링크만 걸려있다. fdisk 페이지에 들어가보면 파티션 생성 명령어와 파티션 타입 설정 명령어가 따로 떨어져있다. 아치리눅스를 깔려면 써있는 걸 따라치는 것만으로는 부족한 것이다.... 설치 단계에서 이미 매뉴얼 정도는 읽을 줄 알아야 한다는 걸까? 이러니 저러니 해도 위키의 잘못이라기에는 멋도 모르고 아치를 써보겠다며 덤벼든 내 잘못이기도 하고, 잘못이라기에는 아치 설치라는 과제가 슈퍼유저로 성장하기 위한 훌륭한 시도였다고 스스로 평가하고 있기 때문에 아무도 죄는 없는 것 같다.

이러한 찐빠에도 불구하고 지금까지 부팅이 잘 되었던 이유는 이렇다.

  1. 컴퓨터가 부팅될 때 가장 먼저 실행되는 것은 UEFI라는 펌웨어의 일종이다. UEFI는 디스크에 EFI 파티션이 있다면 그중에서 골라서 부팅을 진행하지만, EFI 파티션이 없다면 각 파티션에서 /EFI/BOOT/BOOTx64.EFI를 찾아서 실행한다.
  2. 내가 사용하는 systemd-boot는 설치될 때 부트로더를 /EFI/systemd/systemd-bootx64.efi에 설치하고 UEFI에 첫번째 엔트리로 등록한다. 같은 파일이 /EFI/BOOT/BOOTx64.EFI에도 설치된다.
  3. EFI와 systemd-boot의 안전장치가 잘 맞물려 아치리눅스가 잘 부팅된다.

이렇게 부팅은 잘 되지만 아쉬운 점은 systemd-boot가 제공하는 bootctl은 먹통이 된다는 점이다. 해결 방법은 간단하다. GPT(GUI 파티션 테이블)에서 EFI 파티션의 타입만 진짜로 EFI라고 써주면 되는 것이다. 일단 fdisk를 실행:

joongwon@freleefty-home:~ % sudo fdisk /dev/nvme0n1

Welcome to fdisk (util-linux 2.41.3).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.

무서운 메시지가 뜨지만 우리는 파티션 타입만 바꿀 거기 때문에 큰 문제는 없다. 한번 더 파티션 번호 확인:

Command (m for help): p

Disk /dev/nvme0n1: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: SHGP31-1000GM-2-KR                      
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 22E458AC-BBFB-4AF1-A6C3-89AC7B4DBF4E

Device            Start        End    Sectors   Size Type
/dev/nvme0n1p1     2048    2099199    2097152     1G Linux filesystem
/dev/nvme0n1p2  2099200   10487807    8388608     4G Linux filesystem
/dev/nvme0n1p3 10487808 1953523711 1943035904 926.5G Linux filesystem

1번이 1G짜리 부트 파티션이다. 1번 파티션의 타입을 EFI System으로 바꿔준다:

Command (m for help): t
Partition number (1-3, default 3): 1
Partition type or alias (type L to list all): L
  1 EFI System                     C12A7328-F81F-11D2-BA4B-00A0C93EC93B
  2 MBR partition scheme           024DEE41-33E7-11D3-9D69-0008C781F39F
  3 Intel Fast Flash               D3BFE2DE-3DAF-11DF-BA40-E3A556D89593
...
Partition type or alias (type L to list all): 1

Changed type of partition 'Linux filesystem' to 'EFI System'.

마지막으로 확인:

Command (m for help): p
Disk /dev/nvme0n1: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: SHGP31-1000GM-2-KR                      
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 22E458AC-BBFB-4AF1-A6C3-89AC7B4DBF4E

Device            Start        End    Sectors   Size Type
/dev/nvme0n1p1     2048    2099199    2097152     1G EFI System
/dev/nvme0n1p2  2099200   10487807    8388608     4G Linux filesystem
/dev/nvme0n1p3 10487808 1953523711 1943035904 926.5G Linux filesystem

저장하고 종료한다:

Command (m for help): w
The partition table has been altered.
Syncing disks.

그러면 이제 bootctl을 쓸 수 있다.

% sudo bootctl update
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/systemd/systemd-bootx64.efi".
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/BOOT/BOOTX64.EFI".
Skipping "/boot/EFI/BOOT/BOOTX64.EFI", same boot loader version in place already.
Created EFI boot entry "Linux Boot Manager".

아주 기분 좋게 UEFI에 부트 엔트리도 생긴 것을 볼 수 있다. 이제 디스크 이름으로 때려맞추기 할 필요가 없어졌다는 뜻이다.