이번엔 데이터가 보존되도록 하기 위 RAID를 구성해보는 실습을 해볼 것이다. 실습에 사용했던 디스크들을 wipefs -a로 다 초기화하고 같은 크기(5G)로 나눈 후 타입을 리눅스 레이드로 변경해줘야 구성을 할 수가 있다. RAID 자체는 데이터가 깨지고 난 후에 복구를 할 수 있지는 않지만 그 전에 어느정도 결함을 허용해 디스크의 성능과 안정성을 확보하여 예방하는 효과가 있다.

레이드 구성을 하려면 패키지가 필요해 dnf install mdadm로 깔아야 함. 이걸로 장치를 묶어 하나의 RAID 배열을 만들고 그 RAID 배열을 똑같이 파일시스템 생성 후 마운트하여 사용하면 된다.
파티션을 각 디스크의 파티션의 1번째를 가져와 RAID6을 구성하겠다. 0부터 5까지는 어차피 구성도 간단하고 내용이 길어져 6만 해서 가용성을 보장하는 방식으로 가겠다. 0은 스트라이핑이라 공간 효율성은 좋지만 안정성이 없고 1은 반대로 미러링이라 안정성이 좋지만 효율성이 극히 떨어진다. 5는 1개의 패리티 비트가 분산 저장되어 디스크 하나까지는 장애 허용, 6은 2개라 디스크 2개까지도 장애 허용을 하는 차이가 있다. 여기서는 최소 개수인 4개로 공간 효율이 1과 비슷하게 보이지만 실제로는 더 많은 디스크들이 붙기 때문에 N-2/N 의 효율성을 보장한다.
[root@Alma ~]# mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
[root@Alma ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 sdd1[3] sdc1[2] sdb1[1] sda1[0]
10475520 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]
[=============>.......] resync = 68.7% (3601024/5237760) finish=0.1min speed=200056K/sec
[root@Alma ~]# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Oct 31 18:25:00 2025
Raid Level : raid6
Array Size : 10475520 (9.99 GiB 10.73 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri Oct 31 18:25:27 2025
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : Alma:0 (local to host Alma)
UUID : aeb0bc2f:a3e3c6e0:72928ee9:47e2a67f
Events : 17
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 8 33 2 active sync /dev/sdc1
3 8 49 3 active sync /dev/sdd1
성공적으로 RAID가 구성되면 가상 장치로 mdstat이란 게 생기는데 이걸 읽으면 현재 레이드 상태가 보임. 더 자세히 보고 싶다면 mdadm --detail /dev/md0(레이드) 하면 된다 이 이름은 임의로 알아서 지정해도 상관 없음
RAID는 데이터 가용성을 보장하기 위해 사용하기 때문에 진짜로 보장되나 확인하면 된다. 마찬가지로 mkfs.xfs /dev/md0으로 파일시스템 생성 후 mount /dev/md0 /mnt/fileSystem 마운트 함.
그리고 이상한 더미 파일 하나 넣어놓고 디스크를 고장내본다. mdadm 패키지에서 테스트할 때 쓰라고 만들었는지 일부러 디스크를 고장내는 옵션이 명령어에 있어 이걸로 테스트 해본다.
mdadm --fail 시키면 해당 파티션이 멈추고 remove하면 아예 장치가 RAID 구성 목록에서 빠지게 된다. 근데 어차피 시스템 입장에서 동작 안 하는 건 차이 없다. 아무튼 그래도 2개까지 고장내도 /dev/md0 RAID 장치에 데이터가 그대로인걸 ㅎ확인이 가능하다.
[root@Alma ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : broken raid6 sdc1[1]
10475520 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/1] [_U__]
[root@Alma ~]# mount /dev/md0 /mnt/fileSystem/
mount: /mnt/fileSystem: can't read superblock on /dev/md0.
[root@Alma ~]# mdadm --stop /dev/md0
[root@Alma ~]# mdadm --create --level=6 /dev/md0 --raid-devices=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sda1 appears to be part of a raid array:
level=raid6 devices=4 ctime=Sat Nov 1 00:06:43 2025
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid6 devices=4 ctime=Sat Nov 1 00:06:43 2025
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid6 devices=4 ctime=Sat Nov 1 00:06:43 2025
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid6 devices=4 ctime=Sat Nov 1 00:06:43 2025
Continue creating array [y/N]? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@Alma ~]# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sat Nov 1 00:26:18 2025
Raid Level : raid6
Array Size : 10475520 (9.99 GiB 10.73 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Sat Nov 1 00:26:32 2025
State : clean, resyncing
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Resync Status : 51% complete
Name : Alma:0 (local to host Alma)
UUID : 177054d6:8be639a6:d8e64113:e2cc9c83
Events : 8
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 8 33 2 active sync /dev/sdc1
3 8 49 3 active sync /dev/sdd1
[root@Alma ~]# mount /dev/md0 /mnt/fileSystem/
mount: /mnt/fileSystem: wrong fs type, bad option, bad superblock on /dev/md0, missing codepage or helper program, or other error.
dmesg(1) may have more information after failed mount system call.
하지만 디스크를 3개 깨고 다시 마운트를 시도하면 이와 같이 수퍼블록이 깨져 안 되는 걸 알 수 있음.
이렇게 가용성을 위한 RAID를 구성해도 동시에 3개 이상 깨지면 망가지기 때문에 이에 대한 대책으로 장애 복구 시스템은 별도로 구축해야 한다.
외부 클라우드 저장소 aws의 s3 같은 거를 사용해서 백업 저장소를 따로 두는 방법, 오픈 소스인 miniO 저장소를 서버 내에 두고 별도의 디스크를 백업용으로 붙이는 방법, 여러 가지를 혼합해 이중화, 삼중화를 하는 등도 있을 것이고, 대규모 운영 환경이라면 여러 노드들에 분산 스토리지 클러스터로 DR을 구성할 수도 있겠지만, 여기선 자원이 제한적인 단일 VM이기 때문에 miniO와 R2를 사용해볼 것이다.
[root@Alma ~]# mkdir -p /mnt/backup
[root@Alma ~]# mount /dev/sda2 /mnt/backup/
[root@Alma ~]# vi /etc/fstab
백업용 파티션 /dev/sda2을 선택하고 백업용 마운트 지점을 따로 준비하고 시작한다. 그리고 wget 명령어로 미니오를 직접 다운로드 받아와야 한다. 당연히 상시 유시하기 위해 /etc/fstab에 등록도 해준다.
[root@Alma ~]# wget https://dl.min.io/server/minio/release/linux-amd64/minio
[root@Alma ~]# chmod +x minio
[root@Alma ~]# mv minio /usr/local/bin/
바이너리 실행파일이기 때문에 인식할 수 있게 실행 권한을 부여하고 /usr/local/bin으로 이동시킨다. miniO는 최초 접속 시 로그인 비번이 필요하기 때문에 이걸 환경변수로 지정해줘야 한다. export, .bashrc 등록, /etc/environment 등 취향에 맞게 변수로 등록해주면 된다. 환경 변수는 MINIO_ROOT_USER, MINIO_ROOT_PASSWORD이고 값도 알아서 정하면 된다 인증 시 필요하니까 막 정하진 말자. 안 정하고 실행하면 기본값인 minioadmin : minioadmin로 정해지는데 최초 실행 시 계속 유지하기 위해 그냥 /etc/environment에 등록해줬다.
[root@Alma ~]# firewall-cmd --zone=public --add-port=9000/tcp --permanent
success
[root@Alma ~]# firewall-cmd --zone=public --add-port=9001/tcp --permanent
success
[root@Alma ~]# firewall-cmd --reload
success
[root@Alma ~]# firewall-cmd --list-ports
9000/tcp 9001/tcp
[root@Alma ~]# minio server /mnt/backup/ --console-address ":9001" &
[1] 10037
[root@Alma ~]# MinIO Object Storage Server
Copyright: 2015-2025 MinIO, Inc.
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Version: RELEASE.2025-09-07T16-13-09Z (go1.24.6 linux/amd64)
API: http://172.23.197.89:9000 http://127.0.0.1:9000
RootUser: admin
RootPass: admin1234
WebUI: http://172.23.197.89:9001 http://127.0.0.1:9001
RootUser: admin
RootPass: admin1234
CLI: https://docs.min.io/community/minio-object-store/reference/minio-mc.html#quickstart
$ mc alias set 'myminio' 'http://172.23.197.89:9000' 'admin' 'admin1234'
Docs: https://docs.min.io
방화벽 설정을 안 하면 브라우저에서 접속 자체가 안 되니 먼저 9000, 9001 포트를 뚫어줘야 한다. 그리고 다운받은 minio 서버를 열면 된다. 저장될 디렉터리를 정하고, 웹접근을 할 포트를 지정(9001)해주면 알아서 브라우저에서 9001으로 접근하면 api 포트인 9000에 붙는다. 이후 쉘에서 작업을 해야 하기 때문에 &로 백그라운드 프로세스로 돌리게 하면 됨

이제 여기서 아까 변수로 정한 값을 차례대로 입력하고 로그인 시키면 minio 서버 구성은 끝이다. 다시 터미널로 돌아가서 고장난 RAID를 없애고 파티션을 초기화한 후, 다시 RAID 6를 재구성한다. 이후 mkfs.xfs mount /dev/md6 /mnt/fileSystem까지 똑같이 하고 더미 데이터를 넣고, 다시 데이터를 망치고 복구 테스트를 하면 1차 테스트는 끝
[root@Alma ~]# mdadm --create --level=6 /dev/md6 --raid-devices=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
[root@Alma ~]# mkfs.xfs /dev/md6
meta-data=/dev/md6 isize=512 agcount=16, agsize=163712 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=1
= reflink=1 bigtime=1 inobtcount=1 nrext64=1
= exchange=0
data = bsize=4096 blocks=2618880, imaxpct=25
= sunit=128 swidth=256 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1, parent=0
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@Alma ~]# cp /var/log/hawkey.log /mnt/fileSystem/
[root@Alma ~]# ls -lh /mnt/fileSystem/
total 4.0K
-rw-r--r--. 1 root root 3.2K Nov 1 13:12 hawkey.log
지금 로그 파일이 들어있는 상태에서, minio에 /dev/md6의 스냅샷을 남기면 된다. 이번엔 minio 서버에 백업 스냅샷 생성을 위해 필요한 백업 소프트웨어가 필요하다. 마찬가지로 오픈소스인 restic을 dnf를 사용해 설치하면 된다. 우선 스냅샷을 만들 버킷을 추가해줘야 된다.

aws s3를 알고, 오브젝트 스토리지를 사용해보신 분들이라면 알겠지만, 거의 모든 오브젝트 스토리지의 표준은 s3를 따르기 때문에 miniO도 예외는 아니다. 여기서도 연동을 위해 환경변수를 추가해줘야 한다.
[root@Alma ~]# vi /etc/environment
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=admin1234
RESTIC_REPOSITORY="s3:http://localhost:9000/raid-data"
AWS_ACCESS_KEY_ID=$MINIO_ROOT_USER
AWS_SECRET_ACCESS_KEY=$MINIO_ROOT_PASSWORD
이후 source /etc/environment로 적용을 하거나 쉘을 잠깐 나갔다 들어오면 된다.
[root@Alma ~]# restic init
enter password for new repository:
enter password again:
created restic repository e9c50ac280 at s3:http://localhost:9000/raid-data
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.
이제 백업을 위해 초기화 후 마운트된 디렉터리를 백업하는 명령어를 실행하고 웹에서 새로고침을 하면 성공적으로 확인이 된다.
처음 restic init 시에 입력하는 패스워드는 minio나 계정과는 별개로 따로 정해야 하는 것이니 잊지 말도록 하자. 명령어로도 확인이 가능하다.
[root@Alma ~]# restic init
enter password for new repository:
enter password again:
created restic repository e9c50ac280 at s3:http://localhost:9000/raid-data
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.
[root@Alma ~]# restic backup /mnt/fileSystem/
enter password for repository:
repository e9c50ac2 opened (version 2, compression level auto)
created new cache in /root/.cache/restic
no parent snapshot found, will read all files
[0:00] 0 index files loaded
Files: 1 new, 0 changed, 0 unmodified
Dirs: 2 new, 0 changed, 0 unmodified
Added to the repository: 4.454 KiB (1.357 KiB stored)
processed 1 files, 3.164 KiB in 0:04
snapshot bb16967d saved

[root@Alma ~]# restic snapshots
enter password for repository:
repository e9c50ac2 opened (version 2, compression level auto)
ID Time Host Tags Paths Size
---------------------------------------------------------------------------------
bb16967d 2025-11-01 13:31:38 Alma /mnt/fileSystem 3.164 KiB
---------------------------------------------------------------------------------
1 snapshots
미니오 자체에서도 서버의 상태를 볼 수가 있다. cli 명령어를 위해 미니오 클라이언트를 다운받아야 한다 마찬가지로 wget으로 다운받아 쓴다.
[root@Alma ~]# wget https://dl.min.io/client/mc/release/linux-amd64/mc
[root@Alma ~]# chmod +x mc
[root@Alma ~]# mv mc /usr/local/bin
[root@Alma ~]# mc alias set minio-server http://localhost:9000 admin admin1234
mc: Configuration written to `/root/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/root/.mc/share`.
mc: Initialized share uploads `/root/.mc/share/uploads.json` file.
mc: Initialized share downloads `/root/.mc/share/downloads.json` file.
Added `minio-server` successfully.
[root@Alma ~]# mc ls minio-server
[2025-11-01 13:14:24 KST] 0B raid-data/
[root@Alma ~]# mc ls minio-server/raid-data
[2025-11-01 13:29:50 KST] 155B STANDARD config
[2025-11-01 13:38:38 KST] 0B data/
[2025-11-01 13:38:38 KST] 0B index/
[2025-11-01 13:38:38 KST] 0B keys/
[2025-11-01 13:38:38 KST] 0B snapshots/
맨 처음 서버 구축 시 정해놓은 아디 비번으로 인증을 통해 API를 연동하고 이후 minio를 조작할 수 있다. restic과 비슷하게 현재 정보 확인이 가능하다.
이제 현재 raid 상태를 저장했으니 고장내고 복구해보면 된다.
[root@Alma ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md6 : active raid6 sdd1[3] sdc1[2] sdb1[1] sda1[0]
10475520 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]
unused devices: <none>
[root@Alma ~]# mdadm --fail /dev/md6 /dev/sda1
[root@Alma ~]# mdadm --fail /dev/md6 /dev/sdb1
[root@Alma ~]# mdadm --fail /dev/md6 /dev/sdc1
mdadm: set device faulty failed for /dev/sdc1: Device or resource busy
[root@Alma ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md6 : broken raid6 sdd1[3] sdc1[2](F) sdb1[1](F) sda1[0](F)
10475520 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/1] [___U]
unused devices: <none>
[root@Alma ~]# mdadm --remove /dev/md6 /dev/sda1
mdadm: hot removed /dev/sda1 from /dev/md6
[root@Alma ~]# mdadm --remove /dev/md6 /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md6
[root@Alma ~]# mdadm --remove /dev/md6 /dev/sdc1
mdadm: hot removed /dev/sdc1 from /dev/md6
[root@Alma ~]# umount /dev/md6
[root@Alma ~]# mount /dev/md6 /mnt/fileSystem/
mount: /mnt/fileSystem: can't read superblock on /dev/md6.
dmesg(1) may have more information after failed mount system call.
raid 배열의 장치 4개 중 3개를 고장내고 제거해본다. 그럼 이제 레이드 파일을 볼 수가 없다. 배열이 고장났기에 데이터가 죽게 되는데, 이때 중요한 데이터가 있었으면 안 되니까 미리 그 전 시점을 남겨 데이터를 저장하고 다시 복원시키면 된다.
[root@Alma ~]# mkdir -p /mnt/restore
[root@Alma ~]# restic snapshots
enter password for repository:
repository e9c50ac2 opened (version 2, compression level auto)
ID Time Host Tags Paths Size
---------------------------------------------------------------------------------
bb16967d 2025-11-01 13:31:38 Alma /mnt/fileSystem 3.164 KiB
---------------------------------------------------------------------------------
1 snapshots
[root@Alma ~]# restic restore bb16967d --target /mnt/restore/
enter password for repository:
repository e9c50ac2 opened (version 2, compression level auto)
[0:00] 100.00% 1 / 1 index files loaded
restoring snapshot bb16967d of [/mnt/fileSystem] at 2025-11-01 13:31:38.645384716 +0900 KST by root@Alma to /mnt/restore/
ignoring error for /mnt/fileSystem: xattr.LRemove /mnt/restore/mnt/fileSystem security.selinux: permission denied
Summary: Restored 2 / 3 files/dirs (3.164 KiB / 3.164 KiB) in 0:00
Fatal: There were 1 errors
[root@Alma ~]# ll /mnt/
backup/ fileSystem/ restore/
[root@Alma ~]# ll /mnt/restore/
total 0
drwxr-xr-x. 3 root root 24 Nov 1 12:26 mnt
[root@Alma ~]# ll /mnt/restore/mnt/fileSystem/hawkey.log
-rw-r--r--. 1 root root 3240 Nov 1 13:12 /mnt/restore/mnt/fileSystem/hawkey.log
[root@Alma ~]# head -3 /mnt/restore/mnt/fileSystem/hawkey.log && tail -3 /mnt/restore/mnt/fileSystem/hawkey.log
2025-10-30T00:21:53+0900 INFO === Started libdnf-0.73.1 ===
2025-10-30T00:22:18+0900 INFO === Started libdnf-0.73.1 ===
2025-10-30T00:22:19+0900 INFO === Started libdnf-0.73.1 ===
2025-10-31T19:03:06+0900 INFO === Started libdnf-0.73.1 ===
2025-10-31T19:06:50+0900 INFO === Started libdnf-0.73.1 ===
2025-10-31T19:07:01+0900 INFO === Started libdnf-0.73.1 ===
위는 죽어버린 레이드의 데이터를 죽기 전의 데이터로 복원하는 과정이다. 스냅샷의 목록을 확인한 뒤, 해당하는 위치의 데이터의 ID나 태그를 입력해 복원을 시도한다. 데이터가 복원될 지점도 따로 만들어 거기로 위치를 지정해줬다. 그 결과, 해당 시점의 모든 데이터(/dev/md6의 모든 데이터)가 그대로 생긴걸 알 수 있다.
이로써 단일 환경에서의 백업 테스트를 수행해봤다. 다음으로는 시스템 자체가 장애 발생 시 복구 진행 시나리오를 상정하여 실습을 해볼 예정
'리눅스 > 실습' 카테고리의 다른 글
| 리눅스 실습(3) - 파일시스템 실습(백업 스케쥴링과 이중화) (0) | 2025.11.01 |
|---|---|
| 리눅스 실습(3) - 파일시스템 실습(시스템 백업) (0) | 2025.11.01 |
| 리눅스 실습(3) - 파일시스템 실습(RAID 및 파일시스템 복구) (0) | 2025.10.31 |
| 리눅스 실습(3) - 파일시스템 실습(디스크 장치와 파티션) (0) | 2025.10.31 |
| 리눅스 실습(2) - 계정 관련(소유권, 권한 등) 실습-3 (0) | 2025.10.30 |