RHEL 기초 #6 파일 시스템 기본 — XFS, mount, /etc/fstab
#5에서 권한을 설정한 파일은 결국 파일시스템 위에 살고, 그 파일시스템은 블록 장치 (디스크) 위에 만들어져 트리 어딘가에 마운트돼 있습니다. 이번 글은 그 한 층을 정리합니다. 새 디스크를 한 장 붙여 데이터 디렉터리로 마운트하는 흐름까지 한 번에 갑니다.
RHEL 기초 시리즈에서 이번 글의 위치:
- #1 RHEL이란 — Fedora에서 RHEL까지, 그리고 AlmaLinux와 Rocky Linux
- #2 셋업 — RHEL 9 설치, Subscription Manager, 첫 로그인
- #3 dnf와 패키지 관리 — repo, modules, AppStream
- #4 systemd 입문 — 서비스, target, journalctl
- #5 사용자/그룹/권한 — UID/GID, sudo, ACL
- #6 파일 시스템 기본 — XFS, mount, /etc/fstab ← 이번 글
- #7 기본 보안 — firewalld, SSH 하드닝
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의 차이 #
| 항목 | XFS | ext4 |
|---|---|---|
| RHEL 기본 | ✅ (RHEL 7+) | RHEL 6 시절 기본 |
| 큰 파일 / 큰 볼륨 | 매우 강함 (페타바이트) | 좋음 (수십 TB) |
| 작은 파일 많이 / 빈번한 메타데이터 변경 | 보통 | 살짝 유리 |
축소 (resize 줄이기) | 불가능 | 가능 |
확장 (resize 늘리기) | 가능 (xfs_growfs) | 가능 (resize2fs) |
| 스냅샷 | LVM 위에서 (외부) | LVM 위에서 (외부) |
가장 자주 언급되는 차이는 축소 불가라는 점입니다. XFS는 한 번 잡은 크기를 줄일 수 없습니다. 늘리기는 가능합니다. 운영에서는 크게 문제가 되지 않는 경우가 많지만, 알아두는 편이 좋습니다.
그 외에 만나는 fs — btrfs는 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 -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 -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 둘 다 잘 다룹니다.
$ 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
#
$ 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) 마운트 포인트 만들고 임시 마운트 #
$ 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은 부팅 시 자동 마운트할 파일시스템 목록.
$ sudo blkid /dev/vdb1
/dev/vdb1: UUID="abc12345-67de-89fa-bcde-1234567890ab" TYPE="xfs" PARTUUID="..."UUID를 복사해 /etc/fstab에 한 줄 추가합니다.
UUID=abc12345-67de-89fa-bcde-1234567890ab /data xfs defaults 0 0여섯 컬럼:
| # | 의미 |
|---|---|
| 1 | 장치 — UUID 권장 (디바이스 이름은 부팅마다 바뀔 수 있음) |
| 2 | 마운트 포인트 |
| 3 | 파일시스템 종류 |
| 4 | 옵션 — defaults, noatime, nofail 등 |
| 5 | dump 백업 여부 (거의 항상 0) |
| 6 | fsck 순서 — /는 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의 자주 쓰는 옵션
#
| 옵션 | 의미 |
|---|---|
defaults | rw, suid, dev, exec, auto, nouser, async (기본 묶음) |
noatime | 파일 읽을 때 access time 안 갱신 — 성능 ↑, 권장 |
nofail | 부팅 시 실패해도 그냥 진행 (데이터 디스크에) |
ro / rw | 읽기 전용 / 읽기,쓰기 |
noexec | 그 안의 바이너리 실행 금지 — /tmp 같은 곳에 보안용 |
nosuid | SUID 비트 무시 — 보안용 |
nodev | 디바이스 파일 무시 — 보안용 |
_netdev | 네트워크 파일시스템 (NFS, iSCSI) — 네트워크가 떠야 마운트 |
운영에서는 defaults,noatime,nofail 정도가 데이터 디스크의 표준 조합. 보안 신경 쓰는 환경은 nosuid,nodev,noexec까지 추가.
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.0Giswap 파일 추가 #
파티션 공간이 없을 때 파일을 swap으로 만들 수 있습니다. 임시 / 추가 swap에 자주 씁니다.
$ 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에:
/swapfile none swap sw 0 0swappiness
#
커널이 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은 물리 디스크와 파일시스템 사이의 추상화 층 입니다.
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 /path | swap 상태 / 끄기 |
mkswap / swapon | swap 만들고 켜기 |
xfs_growfs /mnt / resize2fs /dev/X | 확장 (LV 키운 후) |
정리 #
이번 글에서 잡은 그림:
- RHEL 9의 기본 fs는 XFS. 큰 볼륨에 강하지만 축소 불가
lsblk(블록 트리) /df(마운트된 fs 사용량) /du(디렉터리별) — 디스크 진단의 3 종 세트- 새 디스크 추가 흐름: 인식 →
parted→mkfs.xfs→mount→/etc/fstab등록 →mount -a검증 /etc/fstab은 UUID로 등록 (디바이스 이름은 변동 가능). 데이터 디스크엔nofail- swap은 파티션 또는 파일로. **
swappiness**는 서버에서 보통 10~30 - 운영에선 LVM 위에 파일시스템 올리는 게 표준 — 확장 / 스냅샷이 가능 (중급 #2)
다음 — 보안의 기본 #
파일시스템이 잡히면 그 위에 데이터가 살고, 데이터에 외부에서 접근하는 통로가 방화벽과 SSH 입니다. 마지막 글이자 이 시리즈의 수렴점입니다.
#7 기본 보안 — firewalld, SSH 하드닝에서는 RHEL의 방화벽 추상화 firewalld의 zone 모델, firewall-cmd 명령군(영구 vs 임시), 자주 쓰는 zone/service/port 패턴, 그리고 SSH 하드닝 — 비밀번호 인증 끄기, 키 인증, 루트 로그인 잠금, 포트 변경, sshd_config.d/ 분리 — 까지 한 번에 잡아 시리즈를 마무리합니다.