ZFS, iSCSI 및 PXE를 사용한 디스크리스 Linux 부팅 시스템 구축

많은 개발자에게 안정적인 게임용 또는 기본 OS와 유연한 개발 환경 사이의 긴장은 지속적인 고민거리입니다. 다양한 툴체인으로 Windows 설치를 "오염"시키는 것을 피하거나 Windows 업데이트가 GRUB 항목을 덮어쓰는 것을 방지하려는 욕구는 흔합니다.

USB 드라이브는 라이브 Linux 환경을 위한 흔히 쓰이는 선택이지만, 쉽게 분실되거나 지워질 수 있습니다. 보다 견고하고 전문적인 솔루션은 디스크리스 부팅입니다. PXE(Preboot Execution Environment), iSCSI 및 ZFS를 활용하면 원격 NAS에서 전체 Linux 설치를 부팅할 수 있으며, 네트워크에 연결된 블록 장치를 로컬 하드 드라이브처럼 취급할 수 있습니다.

The Architecture

이 설정은 서버가 부팅 인프라와 스토리지를 제공하고, 클라이언트(게임용 PC 또는 워크스테이션)가 컴퓨팅 파워를 제공하는 클라이언트‑서버 모델에 기반합니다.

The Server Stack

  • Netboot.xyz: 네트워크를 통해 다양한 운영 체제와 설치 프로그램을 부팅할 수 있는 메뉴 기반 인터페이스를 제공하는 다목적 도구.
  • TFTP (Trivial File Transfer Protocol): 초기 부트로더 바이너리를 클라이언트에 전달하는 데 사용됩니다.
  • DNSMasq: DHCP 서버 역할을 하며, 클라이언트의 아키텍처(BIOS vs. UEFI)에 따라 TFTP 서버로 안내합니다.
  • ZFS ZVol: ZFS 풀 내에 생성된 블록 장치로, 가상 디스크에 대한 원시 스토리지를 제공합니다.
  • iSCSI Target (targetcli): ZFS ZVol을 네트워크를 통한 블록 장치로 내보내어, 클라이언트가 로컬 SCSI 디스크처럼 마운트할 수 있게 합니다.

Implementation Guide

1. Setting Up the Boot Infrastructure

첫 번째 단계는 Debian 기반 서버(예: Proxmox)에 netboot.xyz를 설치하는 것입니다. 여기에는 웹 서버(Apache), TFTP 및 Ansible을 설치해 netboot 자산 배포를 자동화하는 작업이 포함됩니다.

맞춤 부팅 타깃을 지원하려면 .ipxe 스크립트를 만들어야 합니다. 이 스크립트는 클라이언트에게 iSCSI 서버의 IP와 특정 Target IQN을 사용해 sanboot(SCSI 네트워크 부팅)을 시도하도록 지시합니다. 초기 설치 중 부팅이 실패하면(그때는 정상), 스크립트는 Debian 설치 프로그램으로 폴백하도록 구성됩니다.

2. Network Configuration

DHCP 서버(예: DNSMasq를 실행하는 라우터)는 다양한 클라이언트 유형을 처리하도록 설정되어야 합니다. 일반적인 구성은 다음과 같습니다:

  • BIOS Clients: netboot.xyz-undionly.kpxe 로 안내.
  • UEFI Clients: netboot.xyz-snp.efi 로 안내.
  • iPXE Clients: 초기 부트로더가 실행된 후, 이후 요청은 웹 서버에 호스팅된 menu.ipxe 로 리다이렉트됩니다.

3. Storage and iSCSI Configuration

ZFS를 사용해 디스크 이미지 역할을 할 ZVol을 생성할 수 있습니다:

zpool create tank /dev/disk/by-id/${DISK_ID}
zfs create -V 32G tank/debian-disk-12700k

이 ZVol은 targetcli를 통해 내보냅니다. 여기서 중요한 단계는 백스토어 생성, iSCSI 타깃 정의, 그리고 상호 인증(initiator와 target 모두에 대한 사용자명/비밀번호)으로 ACL(Access Control Lists)을 설정해 네트워크 디스크가 무단 클라이언트에 노출되지 않도록 하는 것입니다.

4. Installing the OS

iSCSI 타깃에 Debian을 설치하려면 설치 과정 중 몇 가지 수동 조작이 필요합니다:

  1. Initiator Configuration: 설치 프로그램이 iSCSI 타깃을 자동으로 감지하지 않을 수 있으므로, TTY(Super+F2)로 전환하고 /etc/iscsi/initiatorname.iscsi 파일을 서버에 설정된 IQN과 일치하도록 편집해야 합니다.
  2. Restarting iscsid: iscsid 데몬을 재시작해 새로운 initiator 이름을 인식하도록 합니다.
  3. Target Login: 설치 프로그램으로 돌아가 포털 주소와 인증 정보를 제공해 원격 ZVol을 로컬 디스크로 매핑합니다.

설치가 완료되고 GRUB가 iSCSI 디스크에 설치되면 시스템을 재부팅할 수 있습니다. iPXE 스크립트의 sanboot 명령은 이제 부팅 가능한 OS를 찾아 실행합니다.

Technical Considerations and Trade-offs

Performance and Latency

구현에서 언급했듯이 네트워크 부팅은 로컬 NVMe 스토리지보다 본질적으로 느립니다. RAM 디스크가 OS에 대한 일부 지연을 완화할 수 있지만, 근본적인 병목은 네트워크 속도입니다.

커뮤니티 의견에 따르면, 프로덕션 급 디스크리스 환경에서는 10Gbps Ethernet이 거의 필수입니다. 또한 iSCSI는 네트워크 혼잡에 민감할 수 있습니다. 성능을 최적화하려면 다음을 권장합니다:

  • iSCSI 트래픽 전용 VLAN 사용.
  • 스위치에서 QoS(Quality of Service) 설정을 적용해 스토리지 트래픽 우선순위 지정.
  • iSCSI 대신 NVMe over TCP와 같은 최신 고성능 대안을 탐색.

Stability and Maintenance

이 설정의 주요 장점 중 하나는 OS를 중앙 집중화한다는 점입니다. 부트로더(GRUB)가 원격 드라이브에 존재하므로, 로컬 Windows 업데이트가 Linux 부팅 순서를 깨뜨릴 수 없습니다.

하지만 일부 사용자는 GRUB 대신 rEFInd와 같은 대안을 제안합니다. rEFInd는 단일 텍스트 구성 파일을 사용해 EFI 관리를 단순화하고, 커널 업데이트 시 UEFI 항목 유지 관리 복잡성을 줄여줍니다.

Comparison with Other Methods

iSCSI가 블록 레벨 인터페이스를 제공하는 반면, 다른 개발자들은 디스크리스 부팅을 위해 **NFS (Network File System)**를 선호합니다. NFS는 설정이 더 간단하지만 파일 레벨에서 동작합니다. 게스트 OS가 디스크 파티셔닝 및 파일 시스템(서버가 기본적으로 지원하지 않는 파일 시스템 설치 등)을 완전히 제어해야 할 경우 iSCSI가 일반적으로 더 적합합니다.

"나는 SD 카드만 지원하는 OrangePI 보드용 iSCSI 볼륨을 수년간 운영해 왔습니다. Gigabit Ethernet에서의 성능이 SD 카드보다 훨씬 좋았습니다."

Summary Table: Local vs. Diskless Boot

Feature Local NVMe Diskless (iSCSI/PXE)
Boot Speed Ultra Fast Network Dependent
Isolation Shared Disk/Partition Complete Physical Isolation
Maintenance Manual Partitioning Centralized Image Management
Risk Bootloader Overwrites Network Outage = System Down
Flexibility Fixed Disk Size Dynamic ZVol Resizing

Sources