Linode에 Guix 이미지 배포하기
Guix Cookbook의 Debian 이미지 변환 방식 대신, Guix 시스템 이미지를 직접 만들어 Linode에 올리는 절차를 설명합니다. 가상 디스크와 부팅 설정, 파일 시스템 확장, 네트워크·SSH 구성을 맞추고 `guix deploy`로 운영체제를 관리합니다.
Linode에서 Guix를 실행하려면 기존 안내처럼 Debian 이미지로 서버를 만든 뒤 Guix 시스템으로 바꿀 수도 있지만, 글쓴이는 처음부터 바로 배포할 수 있는 Guix 디스크 이미지를 만드는 방법을 정리합니다. 구성에는 부팅 과정에서 필요한 장치와 Linode의 네트워크 동작, 이미지 형식에 맞춘 부트로더 설치가 함께 들어갑니다.
운영체제 구성
Guix 운영체제 설정에서 initrd 모듈에 virtio_scsi를 추가합니다. Linode의 가상 디스크를 초기 RAM 디스크 단계에서 인식하기 위해서입니다. 루트 파일 시스템은 /dev/sda의 ext4 파티션에 연결하고, 스왑은 /dev/sdb를 사용합니다.
부팅 뒤 루트 파일 시스템이 Linode 볼륨 전체 공간을 쓰도록 resize2fs를 실행하는 Shepherd 서비스를 별도로 정의합니다. Guix의 resize-file-system-service는 이 환경의 장치 구성과 맞지 않아 사용할 수 없었다고 설명합니다. 서비스는 사용자 프로세스가 시작된 뒤 지정한 장치에 resize2fs를 실행합니다.
네트워크는 dhcpcd 서비스로 설정합니다. Linode의 IPv6 주소는 SLAAC로 할당되므로, 기본값인 private 대신 hwaddr를 지정해야 IPv6를 받을 수 있습니다. SSH는 공개키 인증만 허용하고 비밀번호 인증은 끕니다. 또한 wheel 그룹에는 비밀번호 없이 sudo를 사용할 권한을 줍니다. 이후 원격에서 guix deploy를 실행할 때 필요한 설정입니다. 방화벽은 nftables 서비스를 사용하며, Guix 데몬에는 다른 Guix 머신이 저장소 항목을 전송할 때 확인할 서명 키를 등록합니다.
이미지 생성과 변환
이미지는 guix system image에 mbr-raw 형식을 지정해 만듭니다. 다만 이 형식에는 MBR과 GRUB 설치 영역이 포함되며, 글쓴이가 확인한 Linode 업로드 이미지에는 루트 파티션만 필요합니다. Guix 이미지에서 루트 파티션은 시작 지점으로부터 1,048,576바이트 떨어져 있습니다. 셸 스크립트는 dd의 블록 크기를 128 KiB로 지정하고 skip=8을 적용해 앞부분을 건너뜁니다. 이어서 결과를 gzip으로 압축합니다. Linode는 업로드 이미지를 gzip 형식으로 요구합니다.
부트로더 설치도 기본 동작과 다르게 구성합니다. 기본 설정처럼 부팅 장치에 grub-install을 실행하지 않고, GRUB 글꼴과 모듈을 루트 파일 시스템의 /boot에 복사합니다. 글에서는 Linode 환경에서 기본 설치 방식이 동작하지 않아 디스크 이미지 생성 시 Guix가 사용하는 방식에 맞췄다고 설명합니다.
Linode에서 부팅
이미지를 업로드해 인스턴스를 만든 뒤에는 기본 설정 프로필로 부팅할 수 없습니다. 글쓴이는 서버를 중지하고 Boot Settings에서 커널을 GRUB 2로 선택한 다음, 파일 시스템 및 부팅 관련 헬퍼 옵션을 모두 끕니다. 설정을 저장하고 다시 부팅하면 SSH로 접속해 guix deploy를 사용한 운영체제 업데이트를 진행할 수 있습니다. 글은 이 과정을 Guix Cookbook에 추가하는 편이 좋겠다고 언급하지만, 별도의 문서 수정 계획은 밝히지 않습니다.
원문: 개인 블로그 / 번역·요약: Trawling