16. 저장소 관리

16. 저장소 관리

학습 목표

  • LVM(Logical Volume Manager) 구성 및 관리
  • RAID 레벨 이해 및 구성
  • 파일시스템 선택과 최적화
  • LUKS를 통한 디스크 암호화

목차

  1. 스토리지 기초
  2. LVM
  3. RAID
  4. 파일시스템
  5. 디스크 암호화
  6. 모니터링과 유지보수
  7. 연습 문제

1. 스토리지 기초

1.1 스토리지 계층

┌─────────────────────────────────────────────────────────────┐
│                    스토리지 계층 구조                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  애플리케이션                                               │
│       │                                                     │
│       ▼                                                     │
│  ┌─────────────────────────────────────────┐               │
│  │           VFS (Virtual File System)     │               │
│  └─────────────────────────────────────────┘               │
│       │                                                     │
│       ▼                                                     │
│  ┌─────────────────────────────────────────┐               │
│  │    파일시스템 (ext4, XFS, Btrfs)        │               │
│  └─────────────────────────────────────────┘               │
│       │                                                     │
│       ▼                                                     │
│  ┌─────────────────────────────────────────┐               │
│  │    블록 장치 (LVM, RAID, LUKS)          │               │
│  └─────────────────────────────────────────┘               │
│       │                                                     │
│       ▼                                                     │
│  ┌─────────────────────────────────────────┐               │
│  │    디스크 드라이버                       │               │
│  └─────────────────────────────────────────┘               │
│       │                                                     │
│       ▼                                                     │
│  ┌─────────────────────────────────────────┐               │
│  │    물리 디스크 (HDD, SSD, NVMe)         │               │
│  └─────────────────────────────────────────┘               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 디스크 정보 확인

# 블록 장치 목록
lsblk
lsblk -f  # 파일시스템 포함

# 디스크 상세 정보
fdisk -l
parted -l

# SMART 정보 (디스크 건강)
smartctl -a /dev/sda

# 디스크 UUID
blkid

# 디스크 사용량
df -h
df -i  # inode 사용량

1.3 파티션 관리

# fdisk (MBR)
fdisk /dev/sdb
# n - 새 파티션
# d - 파티션 삭제
# p - 파티션 테이블 출력
# w - 저장 후 종료

# parted (GPT 권장)
parted /dev/sdb
(parted) mklabel gpt
(parted) mkpart primary ext4 0% 50%
(parted) mkpart primary ext4 50% 100%
(parted) print
(parted) quit

# gdisk (GPT)
gdisk /dev/sdb

2. LVM

2.1 LVM 개념

┌─────────────────────────────────────────────────────────────┐
│                       LVM 구조                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Logical Volume (LV)                                        │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐                       │
│  │   lv1   │ │   lv2   │ │   lv3   │  ← 파일시스템 생성    │
│  │  (root) │ │  (home) │ │  (data) │                       │
│  └─────────┴─────────┴─────────┘                           │
│           │                                                 │
│           ▼                                                 │
│  Volume Group (VG)                                          │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                       vg0                            │   │
│  │   ← 여러 PV를 하나로 묶음                            │   │
│  └─────────────────────────────────────────────────────┘   │
│           │                                                 │
│           ▼                                                 │
│  Physical Volume (PV)                                       │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐                       │
│  │  /dev/  │ │  /dev/  │ │  /dev/  │  ← 실제 디스크/파티션 │
│  │  sda1   │ │  sdb1   │ │  sdc1   │                       │
│  └─────────┘ └─────────┘ └─────────┘                       │
│                                                             │
│  장점:                                                      │
│  • 동적 볼륨 크기 조절                                      │
│  • 여러 디스크를 하나로 통합                                │
│  • 스냅샷 지원                                              │
│  • 온라인 확장 가능                                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘

2.2 LVM 생성

# 1. Physical Volume (PV) 생성
pvcreate /dev/sdb1
pvcreate /dev/sdc1

# PV 확인
pvs
pvdisplay /dev/sdb1

# 2. Volume Group (VG) 생성
vgcreate vg_data /dev/sdb1 /dev/sdc1

# VG 확인
vgs
vgdisplay vg_data

# 3. Logical Volume (LV) 생성
lvcreate -L 10G -n lv_home vg_data
lvcreate -l 100%FREE -n lv_data vg_data  # 남은 공간 전부

# LV 확인
lvs
lvdisplay /dev/vg_data/lv_home

# 4. 파일시스템 생성 및 마운트
mkfs.ext4 /dev/vg_data/lv_home
mkdir /mnt/home
mount /dev/vg_data/lv_home /mnt/home

# /etc/fstab 추가
echo '/dev/vg_data/lv_home /home ext4 defaults 0 2' >> /etc/fstab

2.3 LVM 확장

# VG에 새 디스크 추가
pvcreate /dev/sdd1
vgextend vg_data /dev/sdd1

# LV 확장
lvextend -L +5G /dev/vg_data/lv_home
# 또는 전체 여유 공간 사용
lvextend -l +100%FREE /dev/vg_data/lv_home

# 파일시스템 확장
# ext4
resize2fs /dev/vg_data/lv_home

# XFS (확장만 가능)
xfs_growfs /mnt/home

# 한 번에 LV + 파일시스템 확장
lvextend -r -L +5G /dev/vg_data/lv_home

2.4 LVM 축소

# ⚠️ 주의: 데이터 백업 필수!

# ext4 축소 (언마운트 필요)
umount /mnt/home
e2fsck -f /dev/vg_data/lv_home
resize2fs /dev/vg_data/lv_home 8G
lvreduce -L 8G /dev/vg_data/lv_home
mount /dev/vg_data/lv_home /mnt/home

# XFS는 축소 불가!

2.5 LVM 스냅샷

# 스냅샷 생성
lvcreate -L 1G -s -n snap_home /dev/vg_data/lv_home

# 스냅샷 확인
lvs
lvdisplay /dev/vg_data/snap_home

# 스냅샷 마운트 (복구 전 확인)
mount -o ro /dev/vg_data/snap_home /mnt/snapshot

# 스냅샷에서 복원
lvconvert --merge /dev/vg_data/snap_home
# 재부팅 필요할 수 있음

# 스냅샷 삭제
lvremove /dev/vg_data/snap_home

3. RAID

3.1 RAID 레벨

┌─────────────────────────────────────────────────────────────┐
│                      RAID 레벨 비교                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  RAID 0 (Striping)                                          │
│  ┌─────┬─────┬─────┬─────┐                                 │
│  │ A1  │ A2  │ A3  │ A4  │  장점: 최고 성능               │
│  │ B1  │ B2  │ B3  │ B4  │  단점: 장애 허용 없음          │
│  └─────┴─────┴─────┴─────┘  용량: 100%                    │
│  Disk1 Disk2 Disk3 Disk4                                   │
│                                                             │
│  RAID 1 (Mirroring)                                         │
│  ┌─────┬─────┐                                              │
│  │ A1  │ A1  │  장점: 완벽한 복제                          │
│  │ B1  │ B1  │  단점: 용량 50%                             │
│  └─────┴─────┘  용량: 50%                                  │
│  Disk1 Disk2                                                │
│                                                             │
│  RAID 5 (Striping + Parity)                                 │
│  ┌─────┬─────┬─────┐                                        │
│  │ A1  │ A2  │ Ap  │  장점: 성능 + 장애 허용(1개)         │
│  │ B1  │ Bp  │ B2  │  단점: 쓰기 시 패리티 계산           │
│  │ Cp  │ C1  │ C2  │  용량: (n-1)/n                        │
│  └─────┴─────┴─────┘  최소 3개 디스크                      │
│  Disk1 Disk2 Disk3                                          │
│                                                             │
│  RAID 6 (Double Parity)                                     │
│  ┌─────┬─────┬─────┬─────┐                                 │
│  │ A1  │ A2  │ Ap  │ Aq  │  장점: 2개 디스크 장애 허용    │
│  │ B1  │ Bp  │ Bq  │ B2  │  단점: 더 느린 쓰기            │
│  └─────┴─────┴─────┴─────┘  용량: (n-2)/n                  │
│                                                             │
│  RAID 10 (1+0, Striped Mirrors)                            │
│  ┌─────┬─────┐ ┌─────┬─────┐                               │
│  │ A1  │ A1  │ │ A2  │ A2  │  장점: 성능 + 신뢰성         │
│  │ B1  │ B1  │ │ B2  │ B2  │  단점: 용량 50%              │
│  └─────┴─────┘ └─────┴─────┘  최소 4개 디스크             │
│  Mirror 1      Mirror 2                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

3.2 mdadm으로 RAID 구성

# mdadm 설치
apt install mdadm

# RAID 1 생성
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1

# RAID 5 생성
mdadm --create /dev/md1 --level=5 --raid-devices=3 /dev/sdd1 /dev/sde1 /dev/sdf1

# RAID 10 생성
mdadm --create /dev/md2 --level=10 --raid-devices=4 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1

# RAID 상태 확인
cat /proc/mdstat
mdadm --detail /dev/md0

# 설정 저장
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u

# 파일시스템 생성
mkfs.ext4 /dev/md0
mount /dev/md0 /mnt/raid

3.3 RAID 관리

# 디스크 장애 시뮬레이션
mdadm --manage /dev/md0 --fail /dev/sdb1

# 장애 디스크 제거
mdadm --manage /dev/md0 --remove /dev/sdb1

# 새 디스크 추가
mdadm --manage /dev/md0 --add /dev/sdk1

# 스페어 디스크 추가
mdadm --manage /dev/md0 --add-spare /dev/sdl1

# 재구성 상태 확인
cat /proc/mdstat
watch -n 1 cat /proc/mdstat

# RAID 중지/시작
mdadm --stop /dev/md0
mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1

3.4 RAID 확장

# RAID 5/6에 디스크 추가
mdadm --grow /dev/md1 --raid-devices=4 --add /dev/sdm1

# 크기 확장 후 파일시스템 확장
mdadm --grow /dev/md1 --size=max
resize2fs /dev/md1

4. 파일시스템

4.1 파일시스템 비교

┌────────────────────────────────────────────────────────────────┐
│                    파일시스템 비교                              │
├──────────────┬──────────────┬──────────────┬──────────────────┤
│              │     ext4     │     XFS      │     Btrfs        │
├──────────────┼──────────────┼──────────────┼──────────────────┤
│ 최대 볼륨    │    1 EB      │    8 EB      │    16 EB         │
│ 최대 파일    │   16 TB      │    8 EB      │    16 EB         │
│ 저널링       │     예       │     예       │     CoW          │
│ 온라인 확장  │     예       │     예       │     예           │
│ 온라인 축소  │     아니오   │    아니오    │     예           │
│ 스냅샷       │   (LVM)      │   (LVM)      │     예 (내장)    │
│ 압축         │     아니오   │    아니오    │     예           │
│ 체크섬       │     메타     │   아니오     │     예 (전체)    │
│ 적합한 용도  │  범용/부팅   │  대용량/DB   │  NAS/스냅샷      │
└──────────────┴──────────────┴──────────────┴──────────────────┘

4.2 ext4 관리

# 생성
mkfs.ext4 /dev/sdb1
mkfs.ext4 -L "DATA" /dev/sdb1  # 레이블 지정

# 옵션으로 생성
mkfs.ext4 -b 4096 -i 16384 -O ^has_journal /dev/sdb1

# 정보 확인
tune2fs -l /dev/sdb1

# 설정 변경
tune2fs -L "NEW_LABEL" /dev/sdb1  # 레이블
tune2fs -c 30 /dev/sdb1           # 마운트 횟수 후 fsck
tune2fs -i 1m /dev/sdb1           # 1달 후 fsck
tune2fs -O ^has_journal /dev/sdb1 # 저널 비활성화

# 파일시스템 검사
e2fsck -f /dev/sdb1
e2fsck -p /dev/sdb1  # 자동 수정

# 조각 모음 (온라인)
e4defrag /dev/sdb1

4.3 XFS 관리

# 생성
mkfs.xfs /dev/sdb1
mkfs.xfs -L "DATA" -f /dev/sdb1

# 정보 확인
xfs_info /dev/sdb1
xfs_info /mnt/data  # 마운트된 경우

# 레이블 변경
xfs_admin -L "NEW_LABEL" /dev/sdb1

# 파일시스템 확장 (온라인)
xfs_growfs /mnt/data

# 파일시스템 검사 (마운트 해제)
xfs_repair /dev/sdb1
xfs_repair -n /dev/sdb1  # 검사만

# 조각 모음 (온라인)
xfs_fsr /mnt/data

4.4 Btrfs 관리

# 생성
mkfs.btrfs /dev/sdb1
mkfs.btrfs -L "DATA" -m raid1 -d raid1 /dev/sdb1 /dev/sdc1

# 정보 확인
btrfs filesystem show
btrfs filesystem df /mnt/btrfs

# 서브볼륨 생성
btrfs subvolume create /mnt/btrfs/subvol1

# 스냅샷
btrfs subvolume snapshot /mnt/btrfs/subvol1 /mnt/btrfs/snap1
btrfs subvolume snapshot -r /mnt/btrfs/subvol1 /mnt/btrfs/snap_ro  # 읽기 전용

# 서브볼륨 목록
btrfs subvolume list /mnt/btrfs

# 스냅샷 삭제
btrfs subvolume delete /mnt/btrfs/snap1

# 압축 활성화
mount -o compress=zstd /dev/sdb1 /mnt/btrfs

# 디스크 추가
btrfs device add /dev/sdd1 /mnt/btrfs
btrfs balance start /mnt/btrfs

# 스크럽 (데이터 무결성 검사)
btrfs scrub start /mnt/btrfs
btrfs scrub status /mnt/btrfs

5. 디스크 암호화

5.1 LUKS 암호화

# LUKS 볼륨 생성
cryptsetup luksFormat /dev/sdb1
# 암호 입력

# LUKS 열기
cryptsetup open /dev/sdb1 encrypted_disk
# /dev/mapper/encrypted_disk 생성됨

# 파일시스템 생성
mkfs.ext4 /dev/mapper/encrypted_disk

# 마운트
mount /dev/mapper/encrypted_disk /mnt/encrypted

# 언마운트 및 닫기
umount /mnt/encrypted
cryptsetup close encrypted_disk

5.2 LUKS 관리

# LUKS 정보
cryptsetup luksDump /dev/sdb1

# 키 추가 (최대 8개)
cryptsetup luksAddKey /dev/sdb1

# 키 제거
cryptsetup luksRemoveKey /dev/sdb1

# 키 파일 사용
dd if=/dev/urandom of=/root/keyfile bs=1024 count=4
chmod 400 /root/keyfile
cryptsetup luksAddKey /dev/sdb1 /root/keyfile

# 키 파일로 열기
cryptsetup open /dev/sdb1 encrypted_disk --key-file /root/keyfile

5.3 부팅 시 자동 마운트

# /etc/crypttab
# <name> <device> <key file> <options>
encrypted_disk /dev/sdb1 /root/keyfile luks

# /etc/fstab
/dev/mapper/encrypted_disk /mnt/encrypted ext4 defaults 0 2

5.4 LUKS + LVM

# 암호화된 PV 생성
cryptsetup luksFormat /dev/sdb1
cryptsetup open /dev/sdb1 crypt_pv

# LVM 구성
pvcreate /dev/mapper/crypt_pv
vgcreate vg_encrypted /dev/mapper/crypt_pv
lvcreate -l 100%FREE -n lv_data vg_encrypted

# 파일시스템
mkfs.ext4 /dev/vg_encrypted/lv_data

6. 모니터링과 유지보수

6.1 디스크 상태 모니터링

# SMART 모니터링
smartctl -H /dev/sda              # 건강 상태
smartctl -a /dev/sda              # 전체 정보
smartctl -t short /dev/sda        # 짧은 테스트
smartctl -l selftest /dev/sda     # 테스트 결과

# smartd 데몬 설정
# /etc/smartd.conf
/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03)
#                             매일 2시 단축테스트 | 토요일 3시 긴 테스트

# I/O 통계
iostat -x 1

# 디스크 대기열
cat /sys/block/sda/queue/nr_requests

6.2 파일시스템 유지보수

# 정기 점검 (ext4)
tune2fs -c 30 /dev/sda1     # 30번 마운트 후 fsck
tune2fs -i 1m /dev/sda1     # 1개월마다 fsck

# 예약 블록 설정 (ext4)
tune2fs -m 1 /dev/sda1      # 1%로 줄임 (기본 5%)

# TRIM (SSD)
fstrim -v /                  # 수동 TRIM
systemctl enable fstrim.timer  # 주기적 TRIM

# 디스크 사용량 분석
du -sh /*
ncdu /

6.3 백업 전략

# dd로 전체 디스크 백업
dd if=/dev/sda of=/backup/sda.img bs=64M status=progress

# 압축 백업
dd if=/dev/sda bs=64M | gzip > /backup/sda.img.gz

# 파티션 복제
dd if=/dev/sda1 of=/dev/sdb1 bs=64M status=progress

# rsync로 파일 백업
rsync -avz --delete /data/ /backup/data/

# LVM 스냅샷으로 일관된 백업
lvcreate -L 1G -s -n snap_backup /dev/vg/lv_data
mount -o ro /dev/vg/snap_backup /mnt/snap
rsync -avz /mnt/snap/ /backup/
umount /mnt/snap
lvremove -f /dev/vg/snap_backup

7. 연습 문제

연습 1: LVM 구성

# 요구사항:
# 1. 2개 디스크로 VG 생성
# 2. 3개 LV 생성 (root 20G, home 50G, data 나머지)
# 3. 각각 ext4, xfs, ext4로 포맷
# 4. fstab에 영구 마운트 설정

# 명령어 작성:

연습 2: RAID 5 구성

# 요구사항:
# 1. 4개 디스크로 RAID 5 구성
# 2. 1개는 스페어로 설정
# 3. 장애 시뮬레이션 및 복구

# 명령어 작성:

연습 3: 암호화된 LVM

# 요구사항:
# 1. LUKS로 디스크 암호화
# 2. 암호화된 볼륨 위에 LVM 구성
# 3. 부팅 시 자동 마운트 (키 파일 사용)

# 설정 파일 및 명령어:

연습 4: Btrfs 스냅샷 관리

# 요구사항:
# 1. Btrfs 볼륨 생성
# 2. 서브볼륨 구조 설계
# 3. 스냅샷 정책 수립 (매일, 매주)
# 4. 스냅샷에서 복원 테스트

# 스크립트 작성:

다음 단계

참고 자료


← 이전: 컨테이너 내부 구조 | 목차

to navigate between lessons