개요
이 가이드는 /dev/md1(두 파티션 /dev/sda5, /dev/sdb5로 구성)이 degraded(한 디스크 실패) 상태일 때, 어레이 전체 크기를 줄이는 방법을 설명합니다. 예시 시스템에서는 /dev/sda5가 실패했고, 최종 목표는 /dev/md1을 5GB에서 4GB로 줄이는 것입니다.
한 줄 정의
- RAID1: 동일한 데이터를 두 개 이상의 디스크에 복제하는 미러링 방식.
- PV/LV/VG: LVM의 물리 볼륨(PV), 논리 볼륨(LV), 볼륨 그룹(VG).
중요: 이 과정은 데이터 손실 위험이 있으므로 전체 백업 후 진행하세요. 슈퍼블록 초기화(mdadm –zero-superblock)는 매우 중요합니다. 이 단계를 생략하면 이후 부팅 불가 또는 RAID 재구성 문제를 일으킬 수 있습니다.
사전 확인: 현재 상태 확인 예시
아래는 원본 시스템에서 실행한 상태 출력 예시입니다. 실제 환경에서 같은 명령으로 상태를 확인하세요.
cat /proc/mdstat
예시 출력:
server1:~# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb5[1]
4988032 blocks [2/1] [_U]
md0 : active raid1 sda1[0] sdb1[1]
248896 blocks [2/2] [UU]
unused devices:
server1:~#
파일 시스템 및 LVM 상태 확인 예시:
df -h
pvdisplay
vgdisplay
lvdisplay
(원본 출력은 본문 예시를 참조하세요.)
전체 작업 순서(요약)
- 실패한 디스크를 어레이에서 fail/ remove 후 슈퍼블록 초기화
- 복구(Rescue) 환경으로 부팅, 필요한 커널 모듈 로드
- LVM 및 파일시스템 검사/축소: resize2fs → lvreduce
- 불필요한 LV(예: swap)를 삭제(또는 끝에 있는 LV를 축소)
- pvresize로 PV 크기 변경
- mdadm –grow로 RAID 어레이 실제 크기 감소
- pvresize(다시)로 LVM이 새로운 공간을 인식하도록 조정
- LV/FS를 필요에 따라 늘리고 검사
- 실디스크 복원: /dev/sda5 슈퍼블록 초기화 후 어레이에 재추가
- /proc/mdstat로 동기화 검증
아래에서 각 단계를 상세히 설명합니다.
준비 단계: 실패 디스크 제거 및 슈퍼블록 지우기
먼저 실제로 /dev/sda5가 어레이에서 제거되었는지 확인하고 제거합니다.
mdadm --manage /dev/md1 --fail /dev/sda5
mdadm --manage /dev/md1 --remove /dev/sda5
그 다음, /dev/sda5의 md 슈퍼블록을 반드시 초기화합니다. 이 단계가 없으면 나중에 재추가 시 부팅 문제가 발생할 수 있습니다.
mdadm --zero-superblock /dev/sda5
중요: –zero-superblock은 디스크의 md 관련 메타데이터만 지웁니다. 디스크의 일반 파티션 테이블이나 다른 데이터를 지우는 명령이 아니지만, 실행 전 디스크 식별을 반드시 확인하세요.
복구 환경으로 부팅 및 모듈 로드
라이브(복구) 시스템으로 부팅한 뒤, 필요한 모듈을 활성화합니다.
modprobe md
modprobe linear
modprobe multipath
modprobe raid0
modprobe raid1
modprobe raid5
modprobe raid6
modprobe raid10
mdadm 설정 파일 백업 및 스캔으로 md 디바이스 활성화:
cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
mdadm -A --scan
LVM 서비스 시작:
/etc/init.d/lvm start
파일시스템과 LV를 안전하게 변경하기 위해서는 해당 파티션들이 마운트 해제되어 있어야 합니다. 루트의 경우 라이브 시디/USB에서 작업하세요.
파일시스템 검사 및 축소(중요한 순서)
먼저 파일시스템 무결성을 검사합니다.
e2fsck -f /dev/server1/root
원본 예시에서는 PV(/dev/md1) 크기가 5GB였고, 목표는 4GB입니다. LVM 계층 관계를 이해하세요:
- filesystem <= LV
- LV 합계 <= PV
- PV <= md device (RAID)
따라서 안전하게 진행하려면 파일시스템을 먼저 줄여서 LV보다 작게 만든 뒤 LV를 줄이고, PV를 줄이고, 마지막으로 md 크기를 줄입니다.
예시에서는 다음과 같이 진행했습니다 (값은 사례용이며 실제 환경에서는 사용량에 맞춰 결정하세요):
- /dev/server1/root의 파일시스템을 2G로 축소(파일이 모두 들어갈 수 있도록 넉넉히 설정)
resize2fs /dev/server1/root 2G
- LV 자체를 2.5G로 축소
lvreduce -L2.5G /dev/server1/root
경고: lvreduce는 위험합니다. lvreduce 전에 resize2fs로 파일시스템을 LV보다 작게 축소했는지 다시 확인하세요.
끝 쪽(만약 존재) LV 제거 및 PV 축소
예시에서는 swap LV(/dev/server1/swap_1)가 디스크 끝에 있어 이를 삭제했습니다. 모든 경우에 삭제가 필요하지 않습니다. 중요한 것은 PV의 물리적 끝에서부터 공간을 확보해야 한다는 점입니다.
lvremove /dev/server1/swap_1
그 다음 PV(/dev/md1)를 원하는 크기로 설정합니다. 예시에서 PV를 3GB로 설정했습니다:
pvresize --setphysicalvolumesize 3G /dev/md1
RAID 어레이 크기 축소
이제 mdadm으로 어레이 크기를 줄입니다. –size는 KiB 단위로 지정해야 합니다. 4GB = 4 × 1024 × 1024 KiB = 4194304 KiB입니다. 또한 md 블록 단위(기본 64 KiB 등)로 정렬되어야 합니다. mdadm은 내부에서 블록 경계를 체크하므로 –size 값이 64로 나뉘는지 확인하세요.
mdadm --grow /dev/md1 --size=4194304
성공하면 md 장치 크기가 변경됩니다. 주의: 이 작업은 복구 모드에서 수행하는 것이 안전합니다.
PV 재확장 및 LV/FS 복원
mdadm으로 줄인 후, pvresize를 다시 실행하여 LVM이 새로운 디스크 크기를 반영하도록 합니다.
pvresize /dev/md1
그 다음 vgdisplay로 상태를 확인하고, 삭제했던 swap LV를 재생성하거나 root LV를 필요한 만큼 확장합니다. 예시에서는:
lvcreate --name swap_1 -l 66 server1
mkswap /dev/server1/swap_1
그리고 root LV를 남은 PE로 확장:
lvextend -l +317 /dev/server1/root
resize2fs /dev/server1/root
확장 후 파일시스템 검사:
e2fsck -f /dev/server1/root
모든 것이 정상이라면 라이브 환경을 빠져나가 시스템을 정상 부팅합니다.
실패 디스크 복원(옵션)
실제 /dev/sda5를 시스템에 다시 사용하려면 슈퍼블록 초기화 후 어레이에 재추가합니다.
mdadm --zero-superblock /dev/sda5
mdadm -a /dev/md1 /dev/sda5
그런 다음 /proc/mdstat을 확인하여 동기화(progress)가 진행 중인지 확인하세요.
cat /proc/mdstat
점검 및 검증 체크리스트
- 전체 데이터 백업 완료
- /proc/mdstat, pvdisplay, vgdisplay, lvdisplay 출력 캡처
- 실패 디스크에 대해 mdadm –fail, –remove 실행
- 실패 디스크의 md 슈퍼블록을 –zero-superblock로 초기화
- 라이브 환경에서 필요한 모듈 로드 및 mdadm -A –scan 실행
- e2fsck로 FS 무결성 검사
- resize2fs로 파일시스템 축소(안전 마진 확보)
- lvreduce로 LV 축소 (순서 엄수)
- 필요시 끝 LV 제거(lvremove) 또는 축소
- pvresize –setphysicalvolumesize로 PV 축소
- mdadm –grow로 md 장치 크기 조정(크기: KiB, 64단위 정렬 확인)
- pvresize로 LVM 인식 업데이트
- lvextend/resize2fs로 LV/FS 재조정
- e2fsck로 최종 검사
- 정상 부팅 및 md 동기화 확인
롤백/사고 대응(Incident runbook)
- 작업 중 심각한 문제 발생 시 즉시 모든 변경을 중지하고, 가능한 경우 이전 백업에서 복원 준비.
- LV나 PV가 잘못 줄어들어 데이터가 손상됐다면, lvreduce 전에 만든 LV snapshot이나 백업에서 복원.
- mdadm으로 잘못된 디스크를 추가했다면 즉시 –fail로 표기 후 –remove로 제거.
- 부팅 불가시 라이브 환경으로 부팅하여 /etc/fstab 및 initramfs 문제를 점검(특히 UUID 변경 여부).
중요: PV 축소, LV 축소는 되돌리기 어렵습니다. 미리 전체 백업을 권장합니다.
언제 이 방법이 실패하는지 / 한계
- LV가 PV 끝쪽에 걸쳐 있고 끝 방향으로 충분한 공간이 확보되지 않는 경우, 단순 삭제/축소만으로는 해결 불가.
- 암호화된 파티션(LUKS 등)이나 비표준 파일시스템(Btrfs, XFS)은 다른 절차가 필요합니다. XFS는 온라인으로 줄일 수 없으므로 다른 방법 사용.
- RAID 레벨이 degraded 상태에서 –grow –size 감소가 항상 안전한 것은 아닙니다. 메타데이터/정렬을 주의해야 합니다.
대안적 접근
- 백업 후 새 디스크로 전체 재구성: 위험 회피를 위해 가장 안전한 방법.
- LVM을 사용하지 않은 단순 파티션이면 파티션 단위로 재파티셔닝 후 데이터 복사.
역할별 체크리스트
관리자:
- 백업 스냅샷 생성
- 작업 일정 및 유지보수 윈도우 공지 엔지니어:
- 라이브 환경에서 명령 실행, 로그 캡처
- mdadm/pvdisplay 출력 보관 운영팀:
- 서비스 중단 알림 및 복원 시나리오 준비
테스트 케이스 및 수용 기준
- 모든 명령 실행 후 df, lvdisplay, vgdisplay가 기대값을 만족해야 함.
- /proc/mdstat에 디스크 재동기화가 표시되어야 함.
- resize2fs 및 e2fsck가 에러 없이 통과해야 함.
의사결정 흐름(간단한 다이어그램)
flowchart TD
A[디스크 실패 확인] --> B{백업 있나?}
B -- No --> C[즉시 전체 백업]
B -- Yes --> D[실패 디스크 fail/remove 및 --zero-superblock]
D --> E[라이브 환경 부팅 & 모듈 로드]
E --> F[FS 검사'e2fsck']
F --> G[파일시스템 축소 -> LV 축소]
G --> H[PV 축소 -> mdadm --grow'크기 감소']
H --> I[pvresize -> LV/FS 확장 및 검사]
I --> J[정상 부팅 및 md 동기화 확인]
J --> K[작업 완료]
호환성 및 주의사항
- 이 절차는 ext2/3/4 계열 파일시스템을 전제로 합니다. XFS 등은 resize2fs를 지원하지 않습니다.
- mdadm 버전과 커널 RAID 모듈의 버전에 따라 –size 단위와 정렬 규칙이 다를 수 있습니다. 최신 mdadm 매뉴얼을 확인하세요.
- LVM의 물리적 확장/축소는 PE 단위로 작업되므로 pvdisplay의 PE Size를 확인하고 계산하세요.
요약
- 기본 원칙: 파일시스템 <= LV <= PV <= md device.
- 안전한 순서: FS 축소 → LV 축소 → PV 축소 → mdadm으로 md 크기 축소 → pvresize로 LVM 인지 → LV/FS 복원 및 검사.
- 항상 백업을 준비하고, –zero-superblock 단계와 e2fsck 검사를 생략하지 마세요.
중요: 실제 값(크기/PE 수)은 본 예시와 다를 수 있습니다. 각 명령 전에 현재 상태를 확인하고 계산하세요.