현실의 두 위협이 남아 있다. 디스크는 언젠가 고장 나고(단일 장애점), 사용자는 디스크를 무한정 점유할 수 있다. RAID가 앞의 문제를, 쿼터가 뒤의 문제를 푼다.
RAID(Redundant Array of Independent Disks)는 여러 디스크를 묶어 성능·안정성·용량 효율을 절충한다.
레벨
방식
최소 디스크
내결함성(허용 고장)
용량 효율
특징
0
스트라이핑
2
0개 (하나 죽으면 전멸)
100%
가장 빠름, 안전성 없음
1
미러링
2
1개
50%
똑같이 복제, 읽기 빠름
5
스트라이핑+분산 패리티
3
1개
(N-1)/N
패리티 1개분 손실
6
스트라이핑+이중 패리티
4
2개
(N-2)/N
패리티 2개분 손실
10
1+0 (미러+스트라이프)
4
쌍당 1개
50%
빠르고 안전, 비쌈
패리티(parity) 는 "데이터의 XOR 합"이다. 데이터 블록들을 XOR한 값을 패리티로 저장해 두면, 디스크 한 장이 죽었을 때 나머지 데이터와 패리티를 다시 XOR해 잃은 블록을 복원할 수 있다. RAID 5는 패리티를 모든 디스크에 분산 저장하고, RAID 6은 서로 다른 두 패리티를 둬서 두 장이 동시에 죽어도 복구한다. RAID 0과 1은 패리티를 쓰지 않는다.
RAID 5의 용량 효율은 (N-1)/N이다 — 디스크 3장이면 2장분 용량(67%), 패리티가 1장분을 차지한다. RAID 6은 (N-2)/N — 4장이면 2장분(50%). RAID 1과 10은 절반(50%)이 복제본으로 소모된다. RAID 0은 100%지만 안전성이 0이라 단독으로는 데이터 보관용으로 절대 쓰지 않는다. "용량 효율 vs 안전성"의 트레이드오프가 레벨 선택의 본질이다.
⚠️ 함정: 최소 디스크 수가 함정이 되기 쉽다 — RAID 0·1은 2장, RAID 5는 3장, RAID 6·10은 4장. "RAID 5 최소 디스크"를 2로 착각하게 만드는 보기가 흔하다. 패리티 분산을 위해 최소 3장이 필요하다. 또 "RAID 1은 패리티를 쓴다" 같은 틀린 진술도 오답으로 쓰인다 — RAID 1은 단순 복제(미러)라 패리티가 없다.
RAID 10과 RAID 0+1은 다르다. RAID 10(1+0)은 "먼저 미러링한 쌍들을 스트라이핑"이고, RAID 0+1은 "먼저 스트라이프한 세트들을 미러링"이다. 장애 복구 시 RAID 10이 더 견고하다 — RAID 10은 각 미러 쌍에서 한 장씩 죽어도 살아남지만, RAID 0+1은 한 스트라이프 세트가 통째로 깨지면 위험하다. 실무에서 "RAID 10"이라 하면 보통 1+0을 가리킨다.
리눅스는 하드웨어 RAID 컨트롤러 없이도 mdadm으로 소프트웨어 RAID를 만든다. 결과 장치는 /dev/md0, /dev/md1 형태다.
# RAID 5 생성 (디스크 3장)mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1# 상태 확인mdadm --detail /dev/md0 # 배열 상세 (상태, 디스크 역할)cat /proc/mdstat # 모든 md 배열 요약 + 동기화 진행률# 디스크 고장 처리mdadm /dev/md0 --fail /dev/sdb1 # 디스크를 고장(fault)으로 표시mdadm /dev/md0 --remove /dev/sdb1 # 배열에서 제거mdadm /dev/md0 --add /dev/sde1 # 새 디스크 추가 → 자동 재구축(rebuild)# 설정 영구화mdadm --detail --scan >> /etc/mdadm.conf # 배열 정보 저장
--level로 RAID 레벨을, --raid-devices로 디스크 개수를 지정한다. 만든 RAID 장치(/dev/md0)는 일반 블록 장치처럼 mkfs.ext4 /dev/md0로 포맷하고 마운트해서 쓴다. 즉 RAID는 파일시스템 아래 계층이다. LVM과 함께 쓸 때는 보통 RAID 위에 LVM을 올린다(md → PV → VG → LV).
⚠️ 함정: /proc/mdstat는 RAID 상태를 보는 가장 빠른 창이다. 디스크 교체 후 재구축(rebuild)이 진행되면 여기에 진행률 막대와 [UU_] 같은 상태가 표시된다. U=정상, _=결함/재구축 중. "소프트웨어 RAID 상태 확인 파일은?" → /proc/mdstat가 정답.
# 직접 쳐보기 — RAID 관찰 (md 배열이 있을 때)cat /proc/mdstat # 배열 상태/동기화mdadm --detail /dev/md0 # 상세lsblk # 디스크-md 관계 트리
쿼터(quota) 는 사용자나 그룹이 쓸 수 있는 디스크 용량(블록)과 파일 수(inode)에 상한을 거는 메커니즘이다.
공유 서버에서 한 사용자가 디스크를 독식하는 걸 막는다.
한계
의미
soft limit
초과해도 즉시 막지 않고 경고. 유예기간(grace period) 동안 허용
hard limit
절대 상한. 이 이상은 쓰기 자체가 거부됨
쿼터 적용 흐름:
# 1) fstab에 쿼터 옵션 추가 후 재마운트# /dev/sdb1 /home ext4 defaults,usrquota,grpquota 0 2mount -o remount /home# 2) 쿼터 DB 파일 생성(검사)quotacheck -cugm /home # -c 생성 -u 사용자 -g 그룹 -m 강제# 3) 쿼터 활성화quotaon /home # quotaoff로 비활성화# 4) 사용자별 한계 편집 (에디터 열림)edquota -u user1 # user1의 soft/hard 한계 편집edquota -g group1 # 그룹 쿼터 편집edquota -t # 유예기간(grace period) 설정# 5) 확인quota -u user1 # 특정 사용자 사용량/한계repquota /home # 파일시스템 전체 쿼터 보고서
쿼터를 쓰려면 먼저 fstab(또는 mount)에 usrquota/grpquota 옵션을 줘야 한다. 옵션 없이 quotaon만 하면 활성화되지 않는다. 그 다음 quotacheck로 쿼터 DB(aquota.user, aquota.group)를 만들고 quotaon으로 켠다. 순서: fstab옵션 → remount → quotacheck → quotaon → edquota. 이 순서가 시험에 나온다.
soft와 hard의 차이를 명확히. soft limit은 넘어도 유예기간(grace period) 동안은 쓰기가 되지만 경고가 뜨고, 유예기간이 지나면 soft가 hard처럼 작동해 차단된다. hard limit은 유예 없이 즉시 차단한다. "유예기간을 두고 경고만 하는 한계는?" → soft limit.
쿼터는 블록(용량) 한계와 inode(파일 개수) 한계를 따로 건다. edquota로 열면 blocks 칼럼과 inodes 칼럼이 각각 soft/hard로 나뉜다. 즉 "용량은 남아도 파일 개수 쿼터에 걸려" 더 못 만드는 상황도 가능하다. repquota -a로 모든 파일시스템의 쿼터 현황을 한 번에 본다.
# df — 파일시스템 용량df -h # 사람이 읽는 단위(G/M)df -i # inode 사용량df -T # 파일시스템 타입까지# du — 경로별 실제 사용량du -sh /var/log # 디렉터리 총합(summary)du -h --max-depth=1 / # 1단계 하위별 용량du -ah /tmp | sort -rh | head # 큰 것부터# lsblk / blkid — 장치 식별lsblk -f # FSTYPE, UUID, 마운트포인트blkid /dev/sdb1 # UUID와 TYPE# fsck — 무결성 검사 (반드시 언마운트 상태에서!)umount /dev/sdb1fsck /dev/sdb1 # 검사 (대화형 복구)fsck -y /dev/sdb1 # 모든 질문에 yes (자동 복구)fsck -f /dev/sdb1 # 깨끗해 보여도 강제 검사
df와 du의 차이는 헷갈리기 쉽다. df는 파일시스템 메타데이터를 읽어 "FS 전체에 용량이 얼마나 남았나"를 빠르게 보고하고, du는 디렉터리를 직접 순회해 "이 경로가 실제 얼마를 차지하나"를 계산한다. 둘의 합계가 어긋날 때가 있는데(삭제됐지만 프로세스가 연 파일 등), 이 불일치 자체가 진단 단서다.
fsck는 반드시 언마운트(또는 읽기전용) 상태에서 돌려야 한다. 마운트된 채로 검사하면 검사 도중 파일시스템이 변해 오히려 손상시킬 수 있다. 루트 파일시스템은 평소 언마운트가 불가능하므로, 부팅 시점이나 복구 모드에서 검사한다(fstab 6번째 필드의 pass가 이 검사 순서). "마운트된 FS에 fsck 하면?" → 손상 위험.
fsck는 fsck.<타입>(예: fsck.ext4=e2fsck, fsck.xfs)을 호출하는 프론트엔드다. 흥미롭게도 xfs의 fsck.xfs는 아무것도 하지 않는다(즉시 정상 반환) — xfs는 마운트 시 저널 재생으로 일관성을 잡고, 실제 복구는 xfs_repair라는 별도 도구를 쓰기 때문이다. "xfs를 검사·복구하는 도구는?" → xfs_repair.
du로 큰 디렉터리를 찾을 때 du -ah /var | sort -rh | head -20 패턴을 실무에서 흔히 쓴다. 디스크가 가득 찼을 때(df로 확인) → 어디가 범인인지(du로 추적) → 정리하는 흐름은 운영자의 기본기다. 단, du는 디렉터리를 전부 순회하므로 대용량에서는 느릴 수 있다.