- 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 데이터셋 복제 기능은 이후 별도 글에서 확장할 계획임