리눅스 RAID 복구 방법(mdadm)


리눅스 RAID 복구 방법(mdadm) 리눅스 시스템에서 mdadm 명령어를 사용하여 RAID Array를 복구하는 방법을 설명드립니다. RAID는 데이터 보호와 성능 향상을 위해 자주 사용되는 기술입니다.

RAID 으로 구성된 Array 에서 디스크 교체등에 대한 자료는 쉽게 찾을 수 있지만 RAID 장애 시 복구하는 자료가 많이 없어서 복구를 시도했던 내용을 정리하였습니다.

RAID 복구 전 준비 작업

RAID를 복구하기 위해서는 가능한 디스크를 꼭 백업을 해주시기 바랍니다. 저는 디스크를 백업할 수 있는 용량이 아니였습니다. 따라서 클라우드 서버에서 서버와 볼륨을 생성하여 RAID 복구 상황을 재현하였고, 최대한 사전에 복구 작업을 진행하려고 하였습니다. 클라우드 서비스는 아래의 서비스를 사용하였습니다.

https://www.nepirity.com

클라우드 서버에서 서버와 스토리지(디스크 볼륨)을 동적으로 생성할 수 있는 기능을 제공합니다. 그리고 볼륨 연결 관리, 복제, 스냅샷 등의 관리 기능을 제공합니다.

RAID 장애 상황

NVMe 디스크 3개를 RAID 5 으로 구성하여 스토리지 서버를 구축 후 사용하다 디스크가 1개가 손상되어, 교체를 하였습니다. 이후 신규 디스크 추가(/dev/nvme2n1)하였고, 아래의 명령어를 사용하여 RAID에 교체 디스크를 추가하였습니다.

# mdadm --add /dev/md0 /dev/nvme2n1p1
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon May 30 21:41:19 2022
Raid Level : raid5
Array Size : 7813770240 (7451.79 GiB 8001.30 GB)
Used Dev Size : 3906885120 (3725.90 GiB 4000.65 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent

Intent Bitmap : Internal

Update Time : Wed Nov 6 20:21:58 2024
State : active, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 512K

Consistency Policy : bitmap

Rebuild Status : 8% complete

Name : storage1:0 (local to host storage1)
UUID : d0b54daf:a72b8583:3a6d4545:b4a39ec4
Events : 5868794

Number Major Minor RaidDevice State
0 259 1 0 active sync /dev/nvme0n1p1
1 259 5 1 active sync /dev/nvme1n1p1
3 259 3 2 spare rebuilding /dev/nvme2n1p1

하지만, 오랜 시간 rebuilding 하는 과정에서 NVMe 디스크가 발열 문제(추정)으로 아래의 이미지 처럼 디스크가 인식이 안되는 상황이 발생했습니다.

스토리지 서버 재부팅 후 디스크는 재인식 될 것이라 생각하여, 재부팅 명령어를 실행하였습니다. 하지만 서버 재부팅 명령어를 실행하였지만, 응답이 없었고 강제로 서버를 재부팅하였습니다.

재부팅 후 RAID 상태는 아래와 같이 변경되 버린 상황입니다. (RAID5으로 구성된 Array 이지만, 표기도 raid0 으로 표기됨)

# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Raid Level : raid0
Total Devices : 3
Persistence : Superblock is persistent

State : inactive
Working Devices : 3

Name : storage1:0 (local to host storage1)
UUID : d0b54daf:a72b8583:3a6d4545:b4a39ec4
Events : 5860896

Number Major Minor RaidDevice

- 259 1 - /dev/nvme0n1p1
- 259 5 - /dev/nvme1n1p1
- 259 3 - /dev/nvme2n1p1

RAID 복구 1차 시도

처음에는 아래의 mdadm 명령어를 용하여 RAID 를 시작하였지만, 실행이 되지 않았습니다. (재부팅 후에는 /dev/nvme0n1, /dev/nvme1n1, /dev/nvme2n1 모두 제대로 인식된 상태임)

# mdadm --run /dev/md0
mdadm: failed to start array /dev/md0: Input/output error
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon May 30 21:41:19 2022
Raid Level : raid5
Used Dev Size : 18446744073709551615
Raid Devices : 3
Total Devices : 2
Persistence : Superblock is persistent

Update Time : Wed Nov 6 03:00:23 2024
State : active, FAILED, Not Started
Active Devices : 1
Working Devices : 2
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 512K

Consistency Policy : unknown

Name : storage1:0 (local to host storage1)
UUID : d0b54daf:a72b8583:3a6d4545:b4a39ec4
Events : 5860896

Number Major Minor RaidDevice State
- 0 0 0 removed
- 0 0 1 removed
- 0 0 2 removed

- 259 1 0 sync /dev/nvme0n1p1
- 259 3 - spare /dev/nvme2n1p1

그리고 아래의 명령어를 사용하여 RAID Array를 정지하였습니다.

# mdadm --stop /dev/md0

RAID 복구 2차 시도

다음 명령어를 사용하여 복구를 시도하였지만, not enough to start the array 라는 에러가 발생하면서 RAID Array 실행에 실패하였습니다.

# mdadm --assemble --scan -v

mdadm: /dev/nvme1n1p1 is identified as a member of /dev/md0, slot 1.
mdadm: /dev/nvme2n1p1 is identified as a member of /dev/md0, slot -1.
mdadm: /dev/nvme0n1p1 is identified as a member of /dev/md0, slot 0.
mdadm: added /dev/nvme1n1p1 to /dev/md0 as 1 (possibly out of date)
mdadm: no uptodate device for slot 2 of /dev/md0
mdadm: added /dev/nvme2n1p1 to /dev/md0 as -1
mdadm: added /dev/nvme0n1p1 to /dev/md0 as 0
mdadm: /dev/md0 assembled from 1 drive and 1 spare - not enough to start the array.

리눅스 RAID 복구 방법(mdadm)

먼저 아래의 명령어를 사용하여, RAID에 추가되었던 장치의 RAID 정보가 있는지 확인하였습니다.

# mdadm --examine /dev/nvme0n1p1

/dev/nvme0n1p1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x1
Array UUID : d0b54daf:a72b8583:3a6d4545:b4a39ec4
Name : storage1:0 (local to host storage1)
Creation Time : Mon May 30 21:41:19 2022
Raid Level : raid5
Raid Devices : 3

Avail Dev Size : 7813770895 (3725.90 GiB 4000.65 GB)
Array Size : 7813770240 (7451.79 GiB 8001.30 GB)
Used Dev Size : 7813770240 (3725.90 GiB 4000.65 GB)
Data Offset : 264192 sectors
Super Offset : 8 sectors
Unused Space : before=264112 sectors, after=655 sectors
State : active
Device UUID : 6d1c616f:fb58a8f2:0058d78d:6e39d96a

Internal Bitmap : 8 sectors from superblock
Update Time : Wed Nov 6 20:14:01 2024
Bad Block Log : 512 entries available at offset 24 sectors
Checksum : 52145296 - correct
Events : 5868573

Layout : left-symmetric
Chunk Size : 512K

Device Role : Active device 0
Array State : AAA ('A' == active, '.' == missing, 'R' == replacing)

Array State 값이 일부 장치는 ‘A'(activte) 값을 유지하였지만, 몇몇 장치의 값은 .(missing) 나타난 장치들이 있어만 다행히도 Raid Level, Raid Devices 정보가 조회 되었습니다.

그리고, RAID5 구성할 때의 사용했던 장치 순서로 아래의 명령어를 실행하였지만, 여전히 RAID 구성에 실패했습니다.

# mdadm -v --assemble /dev/md0 /dev/nvme0n1p1 /dev/nvme1n1p1 /dev/nvme2n1p1
mdadm: looking for devices for /dev/md0
mdadm: /dev/nvme0n1p1 is identified as a member of /dev/md0, slot 0.
mdadm: /dev/nvme1n1p1 is identified as a member of /dev/md0, slot 1.
mdadm: /dev/nvme2n1p1 is identified as a member of /dev/md0, slot -1.
mdadm: added /dev/nvme1n1p1 to /dev/md0 as 1 (possibly out of date)
mdadm: no uptodate device for slot 2 of /dev/md0
mdadm: added /dev/nvme2n1p1 to /dev/md0 as -1
mdadm: added /dev/nvme0n1p1 to /dev/md0 as 0
mdadm: /dev/md0 assembled from 1 drive and 1 spare - not enough to start the array.

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : inactive nvme1n1p1[1](S) nvme2n1p1[3](S) nvme0n1p1[0](S)
11720656342 blocks super 1.2

unused devices: <none>

그리고 마지막으로 아래와 같이 강제 옵션을 추가해서 RAID를 구성하여 실행 하였고, 성공적으로 RAID5 복구하는 성공하였습니다.

# mdadm -v --assemble /dev/md0 /dev/nvme0n1p1 /dev/nvme1n1p1 /dev/nvme2n1p1 --force
리눅스 RAID 복구 방법(mdadm)-2

결론

중요한 데이터를 보관하기때문에 RAID를 구성하여 사용하실 것이라 생각됩니다. 저는 RAID5를 기반으로 스토리저 서버 구축하였고, 여러 개의 LVM으로 구성하여 파티션을 사용하는 상황이여서 복구 작업이 상당히 중요했습니다.

RAID 복구 작업에 조금이나마 도움이 되었으면 좋겠습니다. 도움이 될 수 있는 부분은 댓글 남겨주시면 다른 분들께도 큰 도움이 될 것이라 생각됩니다. LVM 관련된 추가자료는 아래의 페이지를 참고하시면 됩니다.

LVM 설정 구성 예제

( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)