우분투 무인 설치 — ISO를 건드리지 않고 cloud-init으로

우분투 무인 설치라고 하면 보통 ISO를 뜯어고치는 그림부터 떠올립니다. 그런데 우분투 공식 문서가 권하는 방법은 다릅니다 — 설치 ISO는 그대로 두고, 답안지가 담긴 작은 ISO를 두 번째 CD로 붙이는 것입니다. cloud-init의 NoCloud 방식입니다.

이 랩에서 Ubuntu Server 24.04를 이 방식으로 설치하며 확인한 절차와, 실제로 걸렸던 함정 두 개를 정리합니다.

1. 구조 — 답안지 파일 두 개면 된다

준비물은 텍스트 파일 두 개입니다. 설치기가 물어볼 질문에 미리 답을 적어두는 user-data, 그리고 인스턴스 이름표인 meta-data.

# user-data — 이 랩에서 실제로 쓴 파일의 앞부분
#cloud-config
autoinstall:
  version: 1
  locale: en_US.UTF-8
  keyboard:
    layout: us
  ...

# meta-data — 두 줄이면 충분
instance-id: cap-ubuntu-001
local-hostname: cap-ubuntu

답을 적지 않은 질문은 기본값으로 넘어갑니다. 우분투 문서도 “설치 미디어를 수정하지 않고 구성을 전달하는 방법으로 NoCloud를 권장”한다고 명시합니다. [문서확인]

2. 답안지 ISO 만들기 — 라벨이 전부다

두 파일을 볼륨 라벨이 CIDATA 인 ISO로 굽고, VM의 두 번째 CD-ROM에 붙이면 끝입니다. 설치기가 부팅하면서 그 라벨을 찾아 답안지를 읽어 갑니다.

# 리눅스/맥이라면 한 줄
$ genisoimage -output seed.iso -volid CIDATA -joliet -rock user-data meta-data

# Windows 는 내장 IMAPI2 로도 가능 - 부팅용이 아닌 데이터 ISO라서다

여기가 이 방식의 좋은 점입니다. 답안지 ISO는 부팅 이미지가 아니라 그냥 데이터 디스크라 아무 도구로나 구울 수 있습니다. 설치 ISO 자체를 고치려 들면 GRUB 부트 이미지 문제로 도구를 심하게 가립니다(뒤에서 설명).

3. ⭐ 함정 1 — #cloud-config 는 파일의 첫 바이트여야 한다

user-data 의 첫 줄 #cloud-config 는 주석이 아니라 형식 선언이고, 파일의 첫 바이트부터 시작해야 합니다. Windows 편집기가 붙이는 UTF-8 BOM(보이지 않는 3바이트)이 앞에 있으면 인식에 실패하고, 답안지가 통째로 무시됩니다 — 에러 없이 그냥 대화형 설치가 시작되니 원인을 찾기 어렵습니다. 줄 끝도 LF로 저장해야 안전합니다.

# BOM 여부는 첫 3바이트로 확인한다
$ head -c 3 user-data | xxd
00000000: 2363 6c                                  #cl     <-- 정상
00000000: efbb bf                                  ...     <-- BOM. 지워야 한다

4. ⭐ 함정 2 — “Continue with autoinstall?” 확인 프롬프트

답안지를 제대로 붙여도, 설치기는 디스크를 지우기 전에 콘솔에서 한 번 묻습니다.

Continue with autoinstall? (yes|no)

실수로 아무 디스크나 밀어버리지 않게 하는 안전장치입니다. 콘솔에서 yes 한 번 칠 수 있으면 여기까지로 충분하고, 실무에서도 대부분 이 지점에서 멈추는 게 낫습니다.

키 입력 0회의 완전 무인이 필요하면 커널 파라미터 autoinstall 을 부팅 항목에 넣어야 하고, 그건 설치 ISO의 grub.cfg 를 고쳐 다시 굽는 일이 됩니다. 여기서 도구가 갈립니다 — 이 랩에서 직접 확인한 결과입니다.

도구우분투 설치 ISO 재작성이유
Windows oscdimg불가-boot-info-table 기능이 없다. 구워도 GRUB이 자기 위치를 못 찾아 커서만 깜빡인다
Windows IMAPI2❌ 불가Rock Ridge 미지원
xorriso가능-boot_image any replay 가 원본의 부트 구조를 그대로 재현한다

원본 ISO의 부트 레코드를 읽어보면 이유가 보입니다 — El Torito img opts : boot-info-table grub2-boot-info. 부트 이미지 안에 볼륨 위치를 심는 방식이라, 이걸 재현 못 하는 도구로 구우면 부팅이 조용히 실패합니다.

정리

단계핵심
답안지 작성user-data(#cloud-config + autoinstall) + meta-data 두 파일
전달라벨 CIDATA 데이터 ISO로 구워 두 번째 CD에. 설치 ISO는 손대지 않는다
안 먹을 때 1순위#cloud-config 앞의 BOM. 에러 없이 대화형으로 넘어가면 이것부터
yes 프롬프트안전장치. 완전 무인이 꼭 필요할 때만 autoinstall 커널 파라미터 + xorriso 재작성

이렇게 세운 우분투로 겪은 다음 이야기들 — 설치 직후 디스크 절반이 비어 보이는 LVM 기본값 문제, 그리고 이 VM을 NFS 클라이언트로 쓴 마운트 거부 사건이 있습니다.

참고 문서Providing autoinstall configuration (Ubuntu 공식 문서)

댓글 남기기