RHEL 중급 #3 스토리지 심화 — Stratis, NFS, Samba
#2에서 LVM으로 단일 머신의 디스크 운영을 정리했습니다. 이번 글에서는 그 위에서 동작하는 Stratis, 리눅스 사이의 표준 공유인 NFS, 그리고 Windows와 호환되는 Samba를 다룹니다. 한 머신을 넘어 여러 머신이 같은 데이터를 함께 쓰는 방법을 정리합니다.
RHEL 중급 시리즈에서 이번 글의 위치:
- #1 SELinux 입문 — Enforcing/Permissive, 라벨, 트러블슈팅
- #2 LVM — PV/VG/LV, 스냅샷, 확장
- #3 스토리지 심화 — Stratis, NFS, Samba ← 이번 글
- #4 네트워킹 — NetworkManager (nmcli), bonding, teaming
- #5 로그 관리 — journald, rsyslog, log rotation
- #6 작업 스케줄링 — cron, systemd timer, at
- #7 컨테이너 입문 — Podman/Buildah/Skopeo (Docker와의 차이)
Stratis — LVM의 다음 단계 #
기초 #6에서 짚은 대로 RHEL 8부터 Stratis가 스토리지 관리의 새로운 선택지로 들어왔습니다. Stratis는 새로운 파일시스템이 아니라 LVM과 XFS 위에 얹은 매니저입니다. 두 도구를 직접 다루는 대신 한 명령군(stratis)으로 묶어 thin provisioning과 스냅샷을 일상적으로 쓰게 해줍니다.
사용자 명령: stratis pool create / fs create / snapshot
│
▼
┌───────────────┐
│ stratisd │ ← 데몬
└───────┬───────┘
│
┌─────────┴─────────┐
│ │
▼ ▼
[device-mapper] [thin pool / XFS]
│ │
▼ ▼
물리 디스크 파일시스템Stratis의 목표는 운영자가 thin provisioning과 스냅샷을 일상적으로 다루게 하는 데 있습니다. LVM을 직접 다루면 PV/VG/LV의 세 층을 의식해야 하지만, Stratis는 pool과 filesystem 두 개념만으로 충분합니다.
설치와 활성화 #
$ sudo dnf install -y stratisd stratis-cli
$ sudo systemctl enable --now stratisd
$ sudo stratis daemon version
3.x.xstratisd가 백그라운드 데몬, stratis가 우리가 치는 CLI입니다.
Pool 만들기 #
$ sudo stratis pool create data_pool /dev/vdb /dev/vdc
$ sudo stratis pool list
Name Total / Used / Free Properties
data_pool 30 GiB / 564 MiB / 29.4 GiB Cr,~Ca
$ sudo stratis blockdev list data_pool
Pool Name Device Node Physical Size Tier
data_pool /dev/vdb 20 GiB Data
data_pool /dev/vdc 10 GiB DataLVM의 PV/VG에 해당하는 역할입니다. 하나의 pool에 여러 장의 디스크를 넣을 수 있고, 나중에 더 추가도 가능합니다 (stratis pool add-data).
파일시스템 만들기 #
$ sudo stratis filesystem create data_pool myfs
$ sudo stratis filesystem list
Pool Filesystem Total / Used / Free Created Device
data_pool myfs 1 TiB / 546 MiB / 1023 GiB Apr 18 ... /dev/stratis/data_pool/myfs여기서 흥미로운 점 — fs의 크기가 1 TiB로 보입니다. 실제 pool은 30 GiB인데 어떻게? 이게 thin provisioning입니다. Stratis는 fs를 만들 때 가상 크기를 크게 잡고, 실사용에 따라 pool에서 차감합니다. pool 자체가 가득 찰 때까지 늘어날 수 있습니다.
마운트 #
$ sudo mkdir -p /myfs
$ sudo mount /dev/stratis/data_pool/myfs /myfs
# 실제 /etc/fstab에는 pool UUID helper를 사용합니다.
$ sudo stratis pool list
Name Total / Used / Free Properties
data_pool 30 GiB / 564 MiB / 29.4 GiB Cr,~Ca/dev/stratis/data_pool/myfs /myfs xfs defaults,x-systemd.requires=stratis-fstab-setup@<pool-uuid>.service,x-systemd.after=stratis-fstab-setup@<pool-uuid>.service 0 0Stratis는 부팅 시 마운트를 위해 pool UUID 기준의 systemd helper를 써야 합니다. x-systemd.requires=stratis-fstab-setup@<pool-uuid>.service와 x-systemd.after=stratis-fstab-setup@<pool-uuid>.service를 붙여야 하며, 이 설정이 있어야 부팅 중 마운트가 안정적으로 올라옵니다.
스냅샷 #
$ sudo stratis filesystem snapshot data_pool myfs myfs_snap
$ sudo stratis filesystem list
Pool Filesystem ... Device
data_pool myfs ... /dev/stratis/data_pool/myfs
data_pool myfs_snap ... /dev/stratis/data_pool/myfs_snap스냅샷이 새 fs로 만들어져 즉시 마운트 가능합니다. LVM의 lvcreate -s보다 한결 직관적입니다.
Pool 확장 #
$ sudo stratis pool add-data data_pool /dev/vdd
$ sudo stratis pool list
Name Total / Used / Free ...
data_pool 40 GiB / 1.2 GiB / 38.8 GiBLVM의 vgextend에 해당. fs는 이미 thin이라 자동으로 늘어난 풀을 활용합니다. xfs_growfs를 따로 칠 필요가 없습니다.
Stratis vs LVM 어느 쪽? #
| 역할 | LVM 직접 | Stratis |
|---|---|---|
| 단일 fs / 안정성 우선 | ✅ 운영 표준 | 가능하지만 새 도구 |
| Thin provisioning 일상화 | 가능하지만 복잡 | ✅ 기본값 |
| 스냅샷을 자주 떠야 함 | 가능하지만 절차 많음 | ✅ 한 줄 |
| 복잡한 RAID 구성 | ✅ raid5/6 등 | 미지원 |
| RHEL 9 기본 | ✅ | 별도 설치 |
| 자동화 / Ansible 통합 | ✅ 성숙 | 채택 진행 중 |
운영의 기본 선택은 여전히 LVM. Stratis는 thin / 스냅샷이 일상이 되는 경우(컨테이너 호스트, 가상 머신 디스크 풀, 스토리지 워크스테이션)에서 가치가 큽니다.
2026년 현재 — Stratis 3.x가 안정 단계에 들어섰고, RHEL 9 / 10 양쪽에서 지원합니다. 다만 운영의 다수가 여전히 LVM 직접에 머물러 있습니다. 새 시스템을 설계한다면 워크로드 패턴에 따라 골라요.
NFS — 리눅스 사이의 표준 파일 공유 #
여러 서버가 같은 디렉터리를 함께 보게 하고 싶을 때 가장 자주 쓰는 도구입니다. 한 머신이 디렉터리를 export하면 다른 머신이 그 디렉터리를 mount해서 자기 파일시스템처럼 씁니다.
┌────────────────┐ ┌────────────────┐
│ NFS 서버 │ │ NFS 클라이언트 │
│ (exports) │ │ (mount) │
├────────────────┤ ├────────────────┤
│ /var/nfs/share │ ─── network ─→ │ /mnt/share │
└────────────────┘ └────────────────┘서버 셋업 #
$ sudo dnf install -y nfs-utils
$ sudo systemctl enable --now nfs-server
$ systemctl status nfs-server공유할 디렉터리를 만들고 권한을 풉니다.
$ sudo mkdir -p /var/nfs/share
$ sudo chown nobody:nobody /var/nfs/share
$ sudo chmod 775 /var/nfs/share/etc/exports에 공유 정의를 적습니다.
# 디렉터리 클라이언트(옵션)
/var/nfs/share 192.168.64.0/24(rw,sync,no_subtree_check)
/var/nfs/ro *(ro,sync,no_subtree_check)자주 쓰는 옵션:
| 옵션 | 의미 |
|---|---|
rw / ro | 읽기,쓰기 / 읽기만 |
sync | 동기 쓰기 (안전, 기본) — 비교: async는 빠르지만 위험 |
no_root_squash | 클라이언트의 root를 서버의 root로 매핑 (보안 위험, 거의 안 씀) |
root_squash | 클라이언트의 root를 nobody로 매핑 (기본) |
no_subtree_check | 디렉터리 트리 검증 생략 — 권장 |
변경 후 적용:
$ sudo exportfs -rav
exporting 192.168.64.0/24:/var/nfs/share
exporting *:/var/nfs/ro
$ sudo exportfs -v # 현재 export 목록방화벽 / SELinux #
$ sudo firewall-cmd --permanent --add-service=nfs
$ sudo firewall-cmd --permanent --add-service=mountd
$ sudo firewall-cmd --permanent --add-service=rpc-bind
$ sudo firewall-cmd --reload$ sudo setsebool -P nfs_export_all_rw onNFS는 보통 디렉터리 권한과 /etc/exports가 핵심이고, SELinux는 공유 패턴에 따라 추가 조정이 필요할 수 있습니다. 특정 디렉터리만 export하는 기본 구성은 대체로 별도 설정 없이 동작합니다.
클라이언트에서 마운트 #
$ sudo dnf install -y nfs-utils
$ sudo mkdir -p /mnt/share
$ sudo mount -t nfs 192.168.64.10:/var/nfs/share /mnt/share
$ df -hT /mnt/share
Filesystem Type Size Used Avail Use% Mounted on
192.168.64.10:/var/nfs/share nfs4 20G 175M 20G 1% /mnt/share-t nfs는 자동 감지 시 생략 가능. 영구 마운트는 /etc/fstab:
192.168.64.10:/var/nfs/share /mnt/share nfs defaults,_netdev,nofail 0 0_netdev 옵션이 핵심. 네트워크가 떠 있어야 마운트 시도하라고 systemd에 알려주는 옵션입니다. 안 적으면 부팅 시 네트워크 전에 마운트를 시도해 실패합니다.
autofs — 필요할 때만 마운트 #
여러 NFS 공유를 항상 마운트해두는 건 부담입니다. autofs는 누군가 그 경로에 접근할 때만 자동으로 마운트하고, 일정 시간 안 쓰면 자동 해제합니다.
$ sudo dnf install -y autofs
# /etc/auto.master.d/share.autofs
/mnt/auto /etc/auto.share
# /etc/auto.share
share -fstype=nfs,rw 192.168.64.10:/var/nfs/share
$ sudo systemctl enable --now autofs이러면 /mnt/auto/share에 접근하는 순간 자동으로 NFS 마운트가 일어납니다. 데스크탑 / 다중 서버 환경에서 자주 씁니다.
NFS 버전 #
| 버전 | 특징 |
|---|---|
| NFSv3 | UDP 기반 가능, 무상태(stateless), 옛 시스템 호환 |
| NFSv4 | TCP만, 상태 유지(stateful), 보안 / 성능 개선 (RHEL 9 기본) |
| NFSv4.2 | 최신, 서버 측 복사(copy_file_range), 희소 파일 지원 |
기본은 v4인데, 호환을 위해 v3 클라이언트도 받아들입니다. 명시적으로 강제하려면 mount -o vers=4.2 ....
Samba — Windows와 호환되는 파일 공유 #
NFS는 리눅스 사이에서는 좋지만 Windows 클라이언트는 잘 못 씁니다. Windows의 표준은 SMB / CIFS, 그 리눅스 구현이 Samba입니다.
$ sudo dnf install -y samba samba-client
$ sudo systemctl enable --now smb nmb공유 정의 — /etc/samba/smb.conf
#
[global]
workgroup = WORKGROUP
server string = RHEL 9 Samba
security = user
map to guest = bad user
netbios name = RHEL9LAB
[share]
comment = Shared folder
path = /var/samba/share
browseable = yes
read only = no
guest ok = no
valid users = curtis, alice자주 쓰는 옵션:
| 옵션 | 의미 |
|---|---|
path | 공유할 디렉터리 |
read only | no이면 쓰기 가능 |
guest ok | yes이면 비인증 접근 허용 |
valid users | 접근 허용 사용자 목록 |
browseable | 네트워크 탐색에서 보일지 |
Samba 사용자 만들기 #
Linux 사용자와 Samba 사용자는 별개입니다. Linux 사용자에 매핑된 Samba 비밀번호를 따로 설정해야 합니다.
$ sudo useradd -s /sbin/nologin curtis # 이미 있으면 생략
$ sudo smbpasswd -a curtis
New SMB password: ...
Retype new SMB password: ...
$ sudo pdbedit -L # 등록된 Samba 사용자 목록
curtis:1000:Curtis Kim디렉터리 / SELinux / 방화벽 #
$ sudo mkdir -p /var/samba/share
$ sudo chown -R curtis:curtis /var/samba/share
$ sudo chmod 770 /var/samba/share$ sudo semanage fcontext -a -t samba_share_t "/var/samba/share(/.*)?"
$ sudo restorecon -Rv /var/samba/share
$ sudo setsebool -P samba_export_all_rw on$ sudo firewall-cmd --permanent --add-service=samba
$ sudo firewall-cmd --reload클라이언트에서 접속 #
Windows에서: 탐색기 주소창에 \\<server-ip>\share 입력 → 사용자명 / 비밀번호 입력.
Linux 클라이언트에서: cifs-utils로 마운트.
$ sudo dnf install -y cifs-utils
$ sudo mkdir -p /mnt/smbshare
$ sudo mount -t cifs //192.168.64.10/share /mnt/smbshare \
-o username=curtis,uid=$(id -u),gid=$(id -g)/etc/fstab 영구 등록:
//192.168.64.10/share /mnt/smbshare cifs credentials=/root/.smbcreds,_netdev,nofail 0 0/root/.smbcreds에 자격 정보를 분리 저장(username=curtis / password=...), 모드 600.
testparm으로 설정 검증 #
$ sudo testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE
...
[global]
...
[share]
...문법 오류나 충돌을 즉시 잡아 줍니다. 설정 변경 후엔 항상 testparm 한 번 돌리고 적용합니다.
NFS vs Samba 어느 쪽? #
| 역할 | NFS | Samba |
|---|---|---|
| Linux 끼리 | ✅ 표준 | 가능 |
| Windows 클라이언트 | 제한적 | ✅ 표준 |
| 설정 단순함 | ✅ | 사용자 관리 별도 필요 |
| Active Directory 연동 | 제한적 | ✅ 강력 |
| 성능 (큰 파일) | ✅ | 약간 느림 |
| 권한 / ACL 호환 | UNIX 기준 | Windows ACL 친화 |
운영 가이드는 단순합니다. Linux 끼리는 NFS, Windows 클라이언트가 섞이면 Samba. 둘 다 띄워서 양쪽을 받는 서버도 흔합니다.
AlmaLinux / Rocky 차이 #
이번 글의 모든 명령이 그대로 동작합니다. Stratis는 stratisd와 stratis-cli 패키지로, NFS와 Samba는 RHEL 기본 패키지로 사용할 수 있습니다.
자주 만나는 함정 #
“NFS 클라이언트에서 권한 거부” #
서버의 디렉터리 권한이 잠겨 있거나, exports의 옵션 (ro / root_squash) 때문입니다. 서버에서 ls -ld <dir>와 cat /etc/exports를 함께 보세요.
“stratisd가 안 떠 있는데 부팅이 멈춰요” #
/etc/fstab에 pool UUID용 helper 옵션을 안 적은 경우입니다. 이 옵션이 없으면 systemd가 Stratis 준비 전에 마운트를 시도합니다.
“Samba 접속 시 비밀번호가 틀렸다고 나옵니다” #
smbpasswd -a로 Samba 비밀번호를 따로 설정했는지 확인. 리눅스 비밀번호와 별개입니다.
“방화벽은 열었는데 NFS 마운트 거부” #
mountd / rpc-bind까지 같이 열어야 합니다. firewall-cmd --add-service=nfs만으로는 부족합니다.
“Windows에서 Samba 공유에 빈 사용자명으로 접근하려는데 거부” #
smb.conf에 map to guest = bad user와 공유 정의에 guest ok = yes 둘 다 있어야 게스트 접근이 허용됩니다.
자주 쓰는 명령 한 표 #
| 도구 | 명령 |
|---|---|
| Stratis | stratis pool create / list / add-data |
| Stratis | stratis filesystem create / snapshot / list |
| NFS 서버 | systemctl enable --now nfs-server |
| NFS 서버 | exportfs -rav (exports 적용) |
| NFS 서버 | exportfs -v (현재 export 목록) |
| NFS 클라이언트 | mount -t nfs <server>:<path> <mount> |
| NFS 클라이언트 | showmount -e <server> (서버의 export 목록) |
| Samba | systemctl enable --now smb nmb |
| Samba | testparm (설정 검증) |
| Samba | smbpasswd -a <user> (Samba 사용자 추가) |
| Samba | pdbedit -L (Samba 사용자 목록) |
| CIFS 클라이언트 | mount -t cifs //<server>/<share> <mount> |
정리 #
이번 글에서 다룬 흐름:
- Stratis는 LVM + XFS 위에 얹은 매니저. pool / filesystem 두 개념으로 thin provisioning과 스냅샷을 간단하게 다룰 수 있습니다. 새 워크스테이션이나 컨테이너 호스트에서 특히 유용합니다.
- NFS는 리눅스 사이의 표준. 서버
/etc/exports+exportfs -rav, 클라이언트mount -t nfs._netdev옵션을 잊지 말기. - autofs는 필요할 때만 마운트해 다중 공유 부담을 줄임.
- Samba는 Windows 호환. Linux 사용자와 별개의 Samba 사용자 (
smbpasswd -a)가 필요하고, **testparm**으로 항상 검증. - 운영 가이드 — Linux 끼리는 NFS, Windows가 섞이면 Samba.
다음 — 네트워킹 #
스토리지를 정리했으면, 이제 그 위를 연결하는 네트워크를 볼 차례입니다. RHEL 9의 네트워킹 표준은 NetworkManager입니다.
#4 네트워킹 — NetworkManager (nmcli), bonding, teaming에서는 NetworkManager의 동작 모델, nmcli로 정적 IP / DNS / 게이트웨이를 설정하는 흐름, 두 NIC를 묶어 장애에 대비하는 bonding, 그리고 가상 머신,컨테이너 네트워크의 기반인 bridge까지 정리합니다.