Synology, QNAP, TrueNAS 없이 최소 ZFS NAS 구축하기 (2024)

2 hours ago 2
  • GUI가 필요 없는 기본 NAS라면 ZFS 데이터셋을 만들고 Samba로 공유하는 조합만으로 충분히 단순한 네트워크 스토리지를 구성할 수 있음
  • 예시 환경은 Debian 12 Bookworm, OpenZFS zfs-2.1.1, RAIDZ1, ECC RDIMM 16GB RAM, 4×4TB NVMe SSD이며 암호화와 백업 전략은 범위에서 제외됨
  • ZFS는 풀과 파일시스템 구성을 디스크에 저장하므로 OS가 망가져도 다른 머신에서 zfs import로 데이터를 다시 가져올 수 있음
  • 디스크는 /dev/nvme1 같은 순서 의존 이름보다 /dev/disk/by-id 또는 /etc/zfs/vdev_id.conf의 별칭으로 지정하는 편이 안전함
  • 실제 네트워크 공유는 Samba가 담당하며, 일반 문서 공유와 macOS Time Machine 공유를 docs, backups 데이터셋으로 나눠 구성함

직접 만드는 최소 NAS의 범위

  • 목표는 Synology, QNAP, TrueNAS 같은 풀 기능 NAS 제품 없이 기본 NAS를 직접 구성하는 것임
  • 예시 구성은 다음 범위로 제한됨
    • RAID 레벨: RAIDZ1, 1개 드라이브 장애 허용
    • 운영체제: Debian 12 Bookworm
    • 암호화: 없음
    • ZFS 구현: OpenZFS, zfs-2.1.1
    • CPU: 4코어, 저렴한 Xeon 서버 CPU 사용 가능
    • RAM: ECC RDIMM RAM 16GB
    • 스토리지: 4×4TB NVMe SSD
    • 백업: 다루지 않으며 별도 구성이 필요함
  • TrueNAS는 풀 기능의 엔터프라이즈급 소프트웨어 스위트에 가까워, 필요한 기능이 단순할수록 제공 기능과 요구사항 사이의 불일치가 커짐
  • 직접 구성하면 시스템의 각 요소를 이해할 수 있고, 또 다른 소프트웨어 스위트에 의존하지 않아도 됨

ZFS가 디스크에 보관하는 구성 정보

  • ZFS 파일시스템은 자기완결적이라 호스트 OS가 손상돼도 디스크가 멀쩡하면 데이터를 되찾을 수 있음
  • 새 머신이나 새 OS에 디스크를 연결하고 zfs 도구를 설치한 뒤 zfs import를 실행하면 기존 풀을 가져올 수 있음
  • ZFS의 구성과 세부 정보는 디스크 자체에 저장됨
    • 예를 들어 6개 디스크로 RAIDZ2를 구성했다면, 디스크들을 ZFS 도구가 설치된 새 머신으로 옮긴 뒤 zfs import만 실행해도 RAIDZ2로 표시됨
  • 호스트 OS나 머신에 문제가 생겨도 디스크가 손상되지 않았다면 데이터는 유지됨

디스크 식별과 별칭 구성

  • Linux 머신에서 디스크 목록은 lsblk -d -o TRAN,NAME,TYPE,MODEL,SERIAL,SIZE로 확인함
  • 예시에서는 Samsung SSD 990 PRO 4TB NVMe 드라이브 4개를 사용함
  • 각 디스크는 /dev/disk/by-id 아래에서 ID와 /dev/nvme... 장치명으로 연결된 심볼릭 링크를 가짐
  • /etc/zfs/vdev_id.conf에 별칭을 정의하면 긴 디스크 ID를 짧은 이름으로 매핑할 수 있음
alias nvme0 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX alias nvme1 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX alias nvme2 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX alias nvme3 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
  • udevadm trigger를 실행하거나 재부팅하면 별칭이 적용됨
  • 적용 여부는 ls -lh /dev/disk/by-vdev로 확인할 수 있음
  • Alias mapping은 선택 사항이며, zpool 생성 시 전체 /dev/disk/by-id/... 경로를 직접 써도 됨
  • /dev/nvme1, /dev/nvme2 같은 장치명은 새 드라이브를 장착할 때 순서가 보장되지 않으므로 피해야 함
  • /etc/zfs/vdev_id.conf는 zpool 생성 편의를 위한 설정이며, OS가 손상돼 이 파일을 잃어도 ZFS 풀 자체에는 문제가 없음

zpool 생성과 데이터셋 구성

  • 예시는 4개 NVMe로 RAIDZ1 zpool을 만들며, RAID 5처럼 1개 드라이브 장애를 허용함
  • 더 높은 내결함성이 필요하면 RAIDZ2, 즉 RAID 6 구성이 더 회복력이 있음
  • ZFS 설치는 OpenZFS 설치 문서를 참고하며, 예시로 RHEL 9에서는 dnf install zfs처럼 설치함
  • zpool 생성 시 ashift=12 옵션을 권장함
    • 많은 디스크는 호환성 때문에 OS에 512KB 섹터 크기로 보고함
    • Samsung 990 Pro 같은 대용량 디스크는 4KB 또는 8KB 섹터 크기를 가질 수 있음
    • ashift=12는 4KB 섹터 크기를 나타내며 성능을 크게 개선할 수 있음
    • zpool 생성 시점이 이 값을 설정할 마지막 기회임
zpool create -o ashift=12 s16z1 raidz1 nvme0 nvme1 nvme2 nvme3 zpool status s16z1
  • zpool은 디스크 추상화이고, zfs는 파일시스템임
  • zpool create를 실행하면 ZFS 파일시스템도 함께 생성됨
  • zdb | grep ashift로 ashift: 12 설정 여부를 확인할 수 있음
  • 공유 전에 마운트 지점과 압축을 설정함
zfs set mountpoint=/mnt/s16z1 s16z1 zfs set compression=lz4 s16z1
  • 루트 데이터셋 아래에 docs와 backups 데이터셋을 생성함
zfs create s16z1/docs zfs create s16z1/backups
  • docs는 문서용, backups는 Time Machine 백업용으로 사용함
  • ZFS 데이터셋은 단순 폴더보다 많은 기능을 제공함
    • 데이터셋별 속성 관리
    • 암호화
    • 전송과 복제
    • 스냅샷
  • 큰 파일 범주별로 별도 데이터셋을 만드는 편이 좋음
  • 예를 들어 docs만 원격 서버로 백업하고 싶을 때 전체 s16z1 루트 데이터셋을 보내지 않아도 됨

Samba로 공유 계정 만들기

  • 네트워크 파일 공유 방식은 ZFS와 독립적이며, ZFS는 호스트 시스템에 마운트되어 있기만 하면 됨
  • Samba를 설치함
apt install samba
  • Samba 전용 UNIX 사용자 john을 만들고 비밀번호를 설정함
useradd -m john passwd john
  • smbpasswd -a john으로 UNIX 사용자 john을 Samba 사용자와 연결함
  • 접속하는 호스트는 SYS\john으로 공유에 접근할 수 있음
  • pdbedit -L -v john으로 Samba 사용자 등록을 확인할 수 있음
  • Samba 사용자 삭제는 pdbedit -x -u john으로 처리함

일반 공유와 Time Machine 공유

  • /etc/samba/smb.conf를 편집해 docs와 backups 공유를 설정함
[docs] path = /mnt/s16z1/docs browseable = yes read only = no guest ok = no valid users = john create mask = 0755 [backups] path = /mnt/s16z1/backups read only = no guest ok = no inherit acls = yes spotlight = yes fruit:aapl = yes fruit:time machine = yes vfs objects = catia fruit streams_xattr valid users = john
  • docs는 일반 목적의 SMB 공유로 구성됨
  • backups는 macOS Time Machine용 속성을 포함함
    • fruit:aapl = yes
    • fruit:time machine = yes
    • vfs objects = catia fruit streams_xattr
  • macOS에서는 Finder에서 cmd+K를 눌러 smb://10.0.0.6/docs 또는 smb://10.0.0.6/backups 형식으로 마운트함
  • Debian 계열 시스템에서는 smbclient를 설치한 뒤 다음처럼 테스트함
apt install smbclient smbclient -U john //10.0.0.6/docs -c 'ls'
  • smb://10.0.0.6/backups를 마운트하면 macOS에서 Time Machine 공유로 표시됨
  • 마운트 후 macOS의 Settings > General > Time Machine에서 해당 공유를 추가해 Time Machine 백업을 시작할 수 있음

제외된 항목

  • 암호화 구성은 이 절차에 포함되지 않음
  • 백업 전략도 포함되지 않음
  • ZFS 데이터셋 복제 기능은 이후 별도 글에서 확장할 계획임
Read Entire Article