RHEL 기초 #6 파일 시스템 기본 — XFS, mount, /etc/fstab

8 분 소요

#5에서 권한을 설정한 파일은 결국 파일시스템 위에 살고, 그 파일시스템은 블록 장치 (디스크) 위에 만들어져 트리 어딘가에 마운트돼 있습니다. 이번 글은 그 한 층을 정리합니다. 새 디스크를 한 장 붙여 데이터 디렉터리로 마운트하는 흐름까지 한 번에 갑니다.

RHEL 기초 시리즈에서 이번 글의 위치:

XFS — RHEL 9의 기본 #

RHEL 9의 기본 파일시스템은 XFS입니다. (RHEL 7부터 기본이었고, 그전에는 ext4였습니다.)

현재 마운트된 파일시스템 종류
$ findmnt -t xfs,ext4
TARGET   SOURCE                       FSTYPE OPTIONS
/        /dev/mapper/rhel-root        xfs    rw,relatime,attr2,inode64,...
/boot    /dev/vda1                    xfs    rw,relatime,attr2,inode64,...
/home    /dev/mapper/rhel-home        xfs    rw,relatime,attr2,inode64,...

XFS와 ext4의 차이 #

항목XFSext4
RHEL 기본✅ (RHEL 7+)RHEL 6 시절 기본
큰 파일 / 큰 볼륨매우 강함 (페타바이트)좋음 (수십 TB)
작은 파일 많이 / 빈번한 메타데이터 변경보통살짝 유리
축소 (resize 줄이기)불가능가능
확장 (resize 늘리기)가능 (xfs_growfs)가능 (resize2fs)
스냅샷LVM 위에서 (외부)LVM 위에서 (외부)

가장 자주 언급되는 차이는 축소 불가라는 점입니다. XFS는 한 번 잡은 크기를 줄일 수 없습니다. 늘리기는 가능합니다. 운영에서는 크게 문제가 되지 않는 경우가 많지만, 알아두는 편이 좋습니다.

그 외에 만나는 fsbtrfs는 RHEL 7에서 기술 프리뷰였다가 RHEL 8부터 공식 deprecated. 사용 금지. Stratis가 대신 들어왔습니다 (중급 #3). 컨테이너 워크로드용으론 overlayfs가 자주 보이는데 그건 도커/Podman의 #4 볼륨과 네트워크에서.

디스크 보기 — lsblk / df / du #

lsblk — 블록 장치 트리 #

블록 장치
$ lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda             252:0    0   40G  0 disk
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0   39G  0 part
  ├─rhel-root   253:0    0   25G  0 lvm  /
  ├─rhel-swap   253:1    0    4G  0 lvm  [SWAP]
  └─rhel-home   253:2    0   10G  0 lvm  /home
vdb             252:16   0   20G  0 disk                ← 새로 붙은 디스크

vda가 시스템 디스크, vdb가 추가로 붙인 빈 디스크입니다 (뒤에서 사용). 가상화 환경에서는 vda / vdb 같은 이름이 흔하고, 베어메탈 / 구식 가상화에선 sda / sdb가 자주 나옵니다.

df — 마운트된 파일시스템의 사용량 #

df
$ df -hT
Filesystem                Type   Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root     xfs     25G   12G   13G  48% /
/dev/vda1                 xfs    974M  254M  720M  27% /boot
/dev/mapper/rhel-home     xfs     10G  1.2G  8.8G  13% /home
tmpfs                     tmpfs  1.8G   12M  1.8G   1% /run

-h가 사람이 읽기 좋은 단위, -T가 파일시스템 종류 표시. 운영에서 디스크 알람이 뜨면 첫 명령으로 자주 칩니다.

du — 디렉터리별 사용량 #

du 자주 쓰는 패턴
$ du -sh /var/log                           # /var/log 의 총합만
$ du -sh /var/* | sort -h                   # /var 안 각 디렉터리 정렬
$ du -sh /var/log/* | sort -h | tail -10    # 큰 것 10 개

/가 가득 찼다는 알람을 받으면 du -sh /*부터 시작해 점점 깊이 들어가는 흐름이 일반적입니다.

새 디스크 한 장 붙여 마운트하기 #

이번 글의 핵심 실습. 위 lsblk에서 본 /dev/vdb 한 장을 통째로 사용해 /data에 마운트해 보겠습니다.

VM에 디스크 추가 — UTM: VM 정지 후 Edit → New → Virtual Drive 추가. VirtualBox: VM Settings → Storage → Controller: SATA → Add Hard Disk.

1) 디스크 인식 확인 #

새 디스크 보이는지
$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda    252:0    0   40G  0 disk
...
vdb    252:16   0   20G  0 disk         ← 빈 디스크

2) 파티션 만들기 — parted 또는 gdisk #

작은 디스크는 통째로 한 파티션으로 가져가도 됩니다. 큰 디스크 (≥ 2TB) 는 GPT가 강제. parted가 GPT/MBR 둘 다 잘 다룹니다.

parted 로 GPT 파티션 한 장
$ sudo parted /dev/vdb mklabel gpt
$ sudo parted /dev/vdb mkpart data xfs 0% 100%
$ sudo parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 21.5GB
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  21.5GB  21.5GB               data

/dev/vdb1 이라는 파티션이 생겼습니다. (vdb + 1)

확인
$ lsblk /dev/vdb
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vdb     252:16   0  20G  0 disk
└─vdb1  252:17   0  20G  0 part

디스크 통째로 (파티션 없이) 파일시스템을 만드는 것도 가능 (mkfs.xfs /dev/vdb 직접). 다만 파티션 테이블이 있는 게 다른 도구에서 인식하기 좋아 권장.

3) 파일시스템 만들기 — mkfs.xfs #

XFS 로 포맷
$ sudo mkfs.xfs /dev/vdb1
meta-data=/dev/vdb1     isize=512    agcount=4, agsize=...
data     =              bsize=4096   blocks=...
naming   =version 2     bsize=4096   ascii-ci=0, ftype=1
log      =internal log  bsize=4096   blocks=...
realtime =none          extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.

ext4로 만들고 싶으면 sudo mkfs.ext4 /dev/vdb1. 출력만 다르고 흐름은 같습니다.

4) 마운트 포인트 만들고 임시 마운트 #

mount
$ sudo mkdir -p /data
$ sudo mount /dev/vdb1 /data
$ df -hT /data
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/vdb1      xfs    20G  175M   20G   1% /data

여기까지 하면 /data가 동작합니다. 하지만 재부팅하면 사라져요 — 임시 마운트일 뿐. 영구 등록이 다음 단계.

5) /etc/fstab에 영구 등록 — UUID로 #

/etc/fstab은 부팅 시 자동 마운트할 파일시스템 목록.

UUID 확인
$ sudo blkid /dev/vdb1
/dev/vdb1: UUID="abc12345-67de-89fa-bcde-1234567890ab" TYPE="xfs" PARTUUID="..."

UUID를 복사해 /etc/fstab에 한 줄 추가합니다.

/etc/fstab — 끝에 추가
UUID=abc12345-67de-89fa-bcde-1234567890ab  /data  xfs  defaults  0  0

여섯 컬럼:

#의미
1장치 — UUID 권장 (디바이스 이름은 부팅마다 바뀔 수 있음)
2마운트 포인트
3파일시스템 종류
4옵션 — defaults, noatime, nofail
5dump 백업 여부 (거의 항상 0)
6fsck 순서 — /는 1, 그 외는 2 또는 0

6) /etc/fstab 검증 — mount -a #

/etc/fstab의 한 줄 오타가 부팅을 막을 수 있어 재부팅 전에 반드시 검증합니다.

검증
$ sudo umount /data                  # 임시 마운트 풀고
$ sudo mount -a                      # /etc/fstab 의 모든 항목을 마운트 시도
$ df -hT /data
/dev/vdb1      xfs    20G  175M   20G   1% /data        ← /etc/fstab 으로 다시 붙음

mount -a가 에러 없이 끝나야 안전. 에러가 나면 한 줄을 수정한 뒤 다시 확인.

함정/etc/fstab이 깨진 채 재부팅하면 부팅 중 마운트 단계에서 멈춰 응급 모드 (emergency.target) 로 들어갑니다. RHEL 9 에선 nofail 옵션을 같이 적으면 그 항목이 실패해도 부팅은 계속 — 데이터 디스크에 권장.

안전한 한 줄
UUID=abc12345-...  /data  xfs  defaults,nofail  0  0

/etc/fstab의 자주 쓰는 옵션 #

옵션의미
defaultsrw, suid, dev, exec, auto, nouser, async (기본 묶음)
noatime파일 읽을 때 access time 안 갱신 — 성능 ↑, 권장
nofail부팅 시 실패해도 그냥 진행 (데이터 디스크에)
ro / rw읽기 전용 / 읽기,쓰기
noexec그 안의 바이너리 실행 금지 — /tmp 같은 곳에 보안용
nosuidSUID 비트 무시 — 보안용
nodev디바이스 파일 무시 — 보안용
_netdev네트워크 파일시스템 (NFS, iSCSI) — 네트워크가 떠야 마운트

운영에서는 defaults,noatime,nofail 정도가 데이터 디스크의 표준 조합. 보안 신경 쓰는 환경은 nosuid,nodev,noexec까지 추가.

swap 운영 #

현재 swap 보기 #

swap 상태
$ swapon --show
NAME                TYPE      SIZE   USED PRIO
/dev/mapper/rhel-swap  partition  4G   12M   -2

$ free -h
               total        used        free     ...
Mem:           3.7Gi       1.2Gi       1.8Gi
Swap:          4.0Gi        12Mi       4.0Gi

swap 파일 추가 #

파티션 공간이 없을 때 파일을 swap으로 만들 수 있습니다. 임시 / 추가 swap에 자주 씁니다.

swap 파일 1GB 만들기
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 status=progress
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ swapon --show
NAME       TYPE  SIZE   USED PRIO
...
/swapfile  file  1024M  0B    -3

영구 등록은 /etc/fstab에:

/etc/fstab
/swapfile  none  swap  sw  0  0

swappiness #

커널이 RAM 대신 swap을 얼마나 적극적으로 쓸지의 값 (0~100). 기본 60.

확인 / 변경
$ cat /proc/sys/vm/swappiness
60

$ sudo sysctl vm.swappiness=10                       # 즉시
$ echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swap.conf  # 영구

서버는 보통 10~30 정도로 낮게 잡습니다. swap으로 자주 빠지면 응답이 느려지므로.

LVM 살짝만 #

#2의 자동 파티셔닝 결과로 LVM (/dev/mapper/rhel-root) 이 잡혔습니다. LVM은 물리 디스크와 파일시스템 사이의 추상화 층 입니다.

LVM 의 모양
   PV (Physical Volume)  ─┐
   PV ────────────────────┤   →  VG (Volume Group)  →  LV (Logical Volume)  →  파일시스템
   PV ────────────────────┘

세 층의 의미:

  • PV — 디스크 / 파티션 한 장을 LVM 용으로 표시
  • VG — PV 들을 묶은 풀
  • LV — VG에서 잘라낸 논리 볼륨. 여기에 파일시스템을 올림

LVM의 진짜 가치는 확장 / 축소 / 스냅샷. /home이 가득 차면 같은 VG에 PV만 추가해 LV를 키울 수 있습니다. 깊이는 중급 #2 LVM에서 본격 다룹니다.

위에서 만든 /dev/vdb1은 LVM 없이 단순 파티션으로 갔지만, 운영에서는 LVM 위에 두는 게 거의 표준입니다.

자주 만나는 함정 #

“재부팅했더니 디스크가 안 붙어 있습니다” #

/etc/fstab 등록을 빼먹은 경우. mount 한 명령은 메모리에만 영향을 주고 재부팅하면 사라집니다. /etc/fstab에 한 줄 + mount -a 검증이 정답.

/etc/fstab 잘못 적어서 부팅이 안 됩니다” #

GRUB 메뉴에서 rescue 모드로 들어가 /etc/fstab을 직접 수정. 또는 nofail 옵션을 미리 적어두는 게 예방. 운영 머신 재부팅 전엔 반드시 mount -a로 검증.

“디바이스 이름이 바뀌었습니다” #

/dev/sda 였던 게 재부팅 후 /dev/sdb로. SATA 슬롯 변경, USB 디스크 순서, 가상화에서 디스크 추가 순서 등. 그래서 UUID로 등록 하는 게 표준입니다. blkid로 UUID 확인 후 /etc/fstab에.

“df와 du의 결과가 달라요” #

df파일시스템 메타데이터 기준, du실제 파일을 따라가며 합산. 누군가 rm으로 지운 파일을 아직 어떤 프로세스가 열어두고 있으면 df는 그걸 사용 중으로 보지만 du는 못 봅니다. lsof | grep deleted로 그런 프로세스를 찾아 재시작.

“XFS를 줄이고 싶습니다” #

XFS는 줄일 수 없습니다. 줄이려면 데이터를 다른 곳에 백업 → 새 작은 파일시스템 만들기 → 복원. 운영 환경에 LVM만 쓰면 LV 자체는 줄일 수 있어도 그 안의 XFS는 못 줄여요.

자주 쓰는 명령 한 표 #

명령하는 일
lsblk [-f]블록 장치 트리 (+ 파일시스템 / UUID)
blkid <device>UUID와 파일시스템 종류
findmnt [-t xfs]마운트 트리
df -hT [path]파일시스템 사용량
du -sh <path> / du -sh /path/* | sort -h디렉터리 사용량
parted /dev/X mklabel gpt / mkpart NAME xfs 0% 100%파티션
mkfs.xfs /dev/X / mkfs.ext4 /dev/X포맷
mount /dev/X /mnt / umount /mnt임시 마운트
mount -a/etc/fstab 모두 시도
swapon --show / swapoff /pathswap 상태 / 끄기
mkswap / swaponswap 만들고 켜기
xfs_growfs /mnt / resize2fs /dev/X확장 (LV 키운 후)

정리 #

이번 글에서 잡은 그림:

  • RHEL 9의 기본 fs는 XFS. 큰 볼륨에 강하지만 축소 불가
  • lsblk (블록 트리) / df (마운트된 fs 사용량) / du (디렉터리별) — 디스크 진단의 3 종 세트
  • 새 디스크 추가 흐름: 인식 → partedmkfs.xfsmount/etc/fstab 등록 → mount -a 검증
  • /etc/fstabUUID로 등록 (디바이스 이름은 변동 가능). 데이터 디스크엔 nofail
  • swap은 파티션 또는 파일로. **swappiness**는 서버에서 보통 10~30
  • 운영에선 LVM 위에 파일시스템 올리는 게 표준 — 확장 / 스냅샷이 가능 (중급 #2)

다음 — 보안의 기본 #

파일시스템이 잡히면 그 위에 데이터가 살고, 데이터에 외부에서 접근하는 통로가 방화벽SSH 입니다. 마지막 글이자 이 시리즈의 수렴점입니다.

#7 기본 보안 — firewalld, SSH 하드닝에서는 RHEL의 방화벽 추상화 firewalld의 zone 모델, firewall-cmd 명령군(영구 vs 임시), 자주 쓰는 zone/service/port 패턴, 그리고 SSH 하드닝 — 비밀번호 인증 끄기, 키 인증, 루트 로그인 잠금, 포트 변경, sshd_config.d/ 분리 — 까지 한 번에 잡아 시리즈를 마무리합니다.

X