TL;DR

  • mbr-raw 이미지에서 루트 파티션만 추출하고 gzip으로 압축하면 Linode 호환 Guix 이미지를 만들 수 있으며, 맞춤형 운영체제 설정과 부팅 프로필 변경이 필요함.
  • 맞춤형 Guix 설정은 가상 디스크 초기 램 디스크 지원, 루트 파일 시스템 확장, 공개 키 기반 SSH, 비밀번호 없는 sudo, 부팅 파일 배치, DHCP 기반 IPv4·IPv6 주소 할당을 포함함.
  • Guix의 기본 파일 시스템 크기 조정 서비스가 작동하지 않아 부팅 시 resize2fs를 실행하는 사용자 지정 서비스를 구성함.
  • 생성한 이미지를 업로드한 뒤 Linode 프로필에서 커널을 GRUB 2로 선택하고 파일 시스템·부팅 도우미 기능을 끄면 부팅할 수 있음.
  • SSH를 통한 guix deploy로 이후 운영체제 업데이트를 수행할 수 있으며, 관련 절차를 Guix Cookbook에도 반영하는 방안을 언급함.

Guix 이미지를 Linode에 배포하기

  • DigitalOcean에서 Linode로 이전하는 이유 중 하나로 DigitalOcean이 Omarchy에 300만 달러를 기부한 일을 듦. Omarchy를 파시스트를 위한 엉터리 배포판이라고 비판하며, 자유·오픈소스 소프트웨어 개발 자금 조달은 어렵고 소규모 보조금 기관의 지원을 두고 경쟁하는 정직한 프로젝트보다 코딩을 더는 하지 않는 사람이 훨씬 많은 돈을 받는 상황을 꼬집음.
  • Guix Cookbook의 기존 안내는 Linode 기본 Debian 이미지에서 시작해 Guix 시스템으로 전환하는 방식임. 데브옵스 업무를 했던 경험에 비추어 이 방식이 만족스럽지 않아, 바로 사용할 수 있는 Guix 이미지를 만들어 Linode에 올리는 방법을 마련함.
  • 이미지에 포함한 기능은 다음과 같음.
  • 초기 램 디스크에서 가상 디스크 사용
  • 루트(/)와 스왑에 올바른 장치 마운트
  • 부팅 시 Linode 볼륨 전체를 사용하도록 루트 파일 시스템 크기 조정. Guix 기본 resize-file-system-service가 작동하지 않아 사용자 지정 서비스가 필요함
  • 공개 키를 인식하는 SSH 서버 실행
  • 이후 guix deploy를 사용할 수 있도록 비밀번호 없는 sudo 설정
  • Linode가 인식하는 위치에 부트로더 파일 설치
  • DHCP로 IPv4뿐 아니라 IPv6 주소도 획득
  • 운영체제 설정은 dthompson linode 모듈에서 기본 서비스와 Linode용 운영체제를 정의함. 사용자의 공개 키와 Guix 서명 키를 로컬 파일에서 불러오고, 확장 파일 시스템을 부팅 시 늘리는 resize2fs Shepherd 서비스를 등록함.
  • 기본 서비스 구성에는 하드웨어 주소 기반 SLAAC를 사용하는 dhcpcd, 비밀번호 인증을 끄고 지정한 공개 키를 허용하는 OpenSSH, /dev/sda 대상의 파일 시스템 크기 조정 서비스, nftables가 포함됨. Guix 서비스의 인증 키 목록에는 로컬 서명 키와 기본 인증 키를 합쳐 넣음.
  • 운영체제는 en_US.utf8 로케일, America/New_York 시간대, linode 호스트 이름을 사용함. dave 사용자를 만들고 wheel 그룹에 포함하며, 해당 그룹에는 비밀번호 없이 모든 명령을 실행할 수 있는 sudo 권한을 부여함.
  • 초기 램 디스크 모듈에 virtio_scsi를 추가하고, ext4 루트 파일 시스템을 /dev/sda에 연결하며 /dev/sdb를 스왑 장치로 지정함. GRUB 설치 과정에서는 부팅 디렉터리에 폰트를 복사하고 GRUB 라이브러리 파일을 배치하며, 대상 장치는 /dev/sda임.
  • 설정 코드는 [Git 저장소](링크가 제공되지 않음)에서도 찾을 수 있다고 안내함.

디스크 이미지 생성 및 업로드

  • 운영체제 설정을 실제 디스크 이미지로 만들 때 Guix의 mbr-raw 이미지 유형을 사용함. Linode에 올릴 이미지는 gzip 압축이 필요함.
  • guix system image -L . --image-type=mbr-raw dthompson/linode.scm 명령으로 원시 디스크 이미지를 생성함. mbr-raw 결과물에는 마스터 부트 레코드와 MBR 뒤 여유 공간에 설치된 GRUB도 들어가지만, Linode에 필요한 것은 루트 파티션만 포함하는 이미지임.
  • Guix 이미지에서 루트 파티션은 디스크 시작점으로부터 1,048,576바이트 떨어져 있으므로 dd로 해당 부분을 건너뜀. 기본값보다 빠르게 처리하도록 128K 블록 크기를 사용하며, 128K 블록 8개가 1,048,576바이트에 해당함. conv=sync,noerror 옵션을 적용한 결과를 gzip으로 압축해 linode-base.gz 파일로 저장함.

Linode 인스턴스 부팅

  • 이미지를 생성해 업로드한 뒤 새 Linode 인스턴스를 실행할 수 있지만, 기본 설정 프로필은 작동하지 않아 인스턴스가 커널 패닉을 일으킴.
  • 서버를 중지하고 설정 프로필의 부팅 설정에서 커널 선택 드롭다운을 열어 GRUB 2를 선택함. 모든 파일 시스템·부팅 도우미 스위치를 끈 뒤 저장하고 서버를 부팅함.
  • 부팅 이후 SSH를 통해 guix deploy를 사용해 운영체제를 업데이트할 수 있음.

Guix Cookbook 안내

  • 개선된 절차를 Guix Cookbook에 반영하는 것이 좋을 수 있지만, 당장은 그럴 여력이 없다고 밝히며 이 블로그 글이 그동안 도움이 되기를 바람.