RHEL 중급 #3 스토리지 심화 — Stratis, NFS, Samba

10 분 소요

#2에서 LVM으로 단일 머신의 디스크 운영을 정리했습니다. 이번 글에서는 그 위에서 동작하는 Stratis, 리눅스 사이의 표준 공유인 NFS, 그리고 Windows와 호환되는 Samba를 다룹니다. 한 머신을 넘어 여러 머신이 같은 데이터를 함께 쓰는 방법을 정리합니다.

RHEL 중급 시리즈에서 이번 글의 위치:

Stratis — LVM의 다음 단계 #

기초 #6에서 짚은 대로 RHEL 8부터 Stratis가 스토리지 관리의 새로운 선택지로 들어왔습니다. Stratis는 새로운 파일시스템이 아니라 LVM과 XFS 위에 얹은 매니저입니다. 두 도구를 직접 다루는 대신 한 명령군(stratis)으로 묶어 thin provisioning과 스냅샷을 일상적으로 쓰게 해줍니다.

Stratis가 위에 있는 모양
   사용자 명령:    stratis pool create / fs create / snapshot
                    ┌───────────────┐
                    │   stratisd    │   ← 데몬
                    └───────┬───────┘
                  ┌─────────┴─────────┐
                  │                   │
                  ▼                   ▼
            [device-mapper]      [thin pool / XFS]
                  │                   │
                  ▼                   ▼
              물리 디스크       파일시스템

Stratis의 목표는 운영자가 thin provisioning스냅샷을 일상적으로 다루게 하는 데 있습니다. LVM을 직접 다루면 PV/VG/LV의 세 층을 의식해야 하지만, Stratis는 poolfilesystem 두 개념만으로 충분합니다.

설치와 활성화 #

설치
$ sudo dnf install -y stratisd stratis-cli
$ sudo systemctl enable --now stratisd
$ sudo stratis daemon version
3.x.x

stratisd가 백그라운드 데몬, stratis가 우리가 치는 CLI입니다.

Pool 만들기 #

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          Data

LVM의 PV/VG에 해당하는 역할입니다. 하나의 pool에 여러 장의 디스크를 넣을 수 있고, 나중에 더 추가도 가능합니다 (stratis pool add-data).

파일시스템 만들기 #

fs 생성
$ 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 자체가 가득 찰 때까지 늘어날 수 있습니다.

마운트 #

mount + pool UUID 확인
$ 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
/etc/fstab — Stratis 권장 옵션
/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  0

Stratis는 부팅 시 마운트를 위해 pool UUID 기준의 systemd helper를 써야 합니다. x-systemd.requires=stratis-fstab-setup@<pool-uuid>.servicex-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 GiB

LVM의 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 서버      │                │  NFS 클라이언트 │
   │  (exports)     │                │  (mount)        │
   ├────────────────┤                ├────────────────┤
   │ /var/nfs/share │ ─── network ─→ │ /mnt/share      │
   └────────────────┘                └────────────────┘

서버 셋업 #

NFS 서버 설치 / 활성화
$ 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에 공유 정의를 적습니다.

/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디렉터리 트리 검증 생략 — 권장

변경 후 적용:

exports 다시 읽기
$ sudo exportfs -rav
exporting 192.168.64.0/24:/var/nfs/share
exporting *:/var/nfs/ro

$ sudo exportfs -v       # 현재 export 목록

방화벽 / SELinux #

firewalld
$ 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
SELinux boolean — NFS 디렉터리에 쓰기 허용
$ sudo setsebool -P nfs_export_all_rw on

NFS는 보통 디렉터리 권한과 /etc/exports가 핵심이고, SELinux는 공유 패턴에 따라 추가 조정이 필요할 수 있습니다. 특정 디렉터리만 export하는 기본 구성은 대체로 별도 설정 없이 동작합니다.

클라이언트에서 마운트 #

수동 mount
$ 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:

/etc/fstab — NFS
192.168.64.10:/var/nfs/share  /mnt/share  nfs  defaults,_netdev,nofail  0  0

_netdev 옵션이 핵심. 네트워크가 떠 있어야 마운트 시도하라고 systemd에 알려주는 옵션입니다. 안 적으면 부팅 시 네트워크 전에 마운트를 시도해 실패합니다.

autofs — 필요할 때만 마운트 #

여러 NFS 공유를 항상 마운트해두는 건 부담입니다. autofs는 누군가 그 경로에 접근할 때만 자동으로 마운트하고, 일정 시간 안 쓰면 자동 해제합니다.

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 버전 #

버전특징
NFSv3UDP 기반 가능, 무상태(stateless), 옛 시스템 호환
NFSv4TCP만, 상태 유지(stateful), 보안 / 성능 개선 (RHEL 9 기본)
NFSv4.2최신, 서버 측 복사(copy_file_range), 희소 파일 지원

기본은 v4인데, 호환을 위해 v3 클라이언트도 받아들입니다. 명시적으로 강제하려면 mount -o vers=4.2 ....

Samba — Windows와 호환되는 파일 공유 #

NFS는 리눅스 사이에서는 좋지만 Windows 클라이언트는 잘 못 씁니다. Windows의 표준은 SMB / CIFS, 그 리눅스 구현이 Samba입니다.

Samba 설치
$ sudo dnf install -y samba samba-client
$ sudo systemctl enable --now smb nmb

공유 정의 — /etc/samba/smb.conf #

/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 onlyno이면 쓰기 가능
guest okyes이면 비인증 접근 허용
valid users접근 허용 사용자 목록
browseable네트워크 탐색에서 보일지

Samba 사용자 만들기 #

Linux 사용자와 Samba 사용자는 별개입니다. Linux 사용자에 매핑된 Samba 비밀번호를 따로 설정해야 합니다.

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
SELinux
$ 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
firewalld
$ sudo firewall-cmd --permanent --add-service=samba
$ sudo firewall-cmd --reload

클라이언트에서 접속 #

Windows에서: 탐색기 주소창에 \\<server-ip>\share 입력 → 사용자명 / 비밀번호 입력.

Linux 클라이언트에서: cifs-utils로 마운트.

Linux에서 CIFS mount
$ 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 영구 등록:

/etc/fstab — Samba
//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 어느 쪽? #

역할NFSSamba
Linux 끼리✅ 표준가능
Windows 클라이언트제한적✅ 표준
설정 단순함사용자 관리 별도 필요
Active Directory 연동제한적✅ 강력
성능 (큰 파일)약간 느림
권한 / ACL 호환UNIX 기준Windows ACL 친화

운영 가이드는 단순합니다. Linux 끼리는 NFS, Windows 클라이언트가 섞이면 Samba. 둘 다 띄워서 양쪽을 받는 서버도 흔합니다.

AlmaLinux / Rocky 차이 #

이번 글의 모든 명령이 그대로 동작합니다. Stratis는 stratisdstratis-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.confmap to guest = bad user와 공유 정의에 guest ok = yes 둘 다 있어야 게스트 접근이 허용됩니다.

자주 쓰는 명령 한 표 #

도구명령
Stratisstratis pool create / list / add-data
Stratisstratis 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 목록)
Sambasystemctl enable --now smb nmb
Sambatestparm (설정 검증)
Sambasmbpasswd -a <user> (Samba 사용자 추가)
Sambapdbedit -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까지 정리합니다.

X