#!/bin/bash
# 실습 #17 ① — RAID-1 (mirror) 2-disk
# - 미러링: 두 디스크에 동일 데이터. 한 쪽 죽어도 무중단.
# - OS 부팅 디스크의 가장 흔한 RAID 구성.
# - 실 디스크 대신 loop device 2개로 시연 (어느 VM 에서도 동일하게 재현)
set -e

WORK=/tmp/lab_raid1
sudo mkdir -p "$WORK"

cleanup_partial() {
    sudo umount /mnt/raid1 2>/dev/null || true
    sudo mdadm --stop /dev/md1 2>/dev/null || true
    for L in $(sudo losetup -j "$WORK/disk0.img" 2>/dev/null | cut -d: -f1) \
              $(sudo losetup -j "$WORK/disk1.img" 2>/dev/null | cut -d: -f1); do
        sudo losetup -d "$L" 2>/dev/null || true
    done
}
trap cleanup_partial INT TERM

# 1) 200MB 가상 디스크 2개
for i in 0 1; do
    sudo dd if=/dev/zero of="$WORK/disk${i}.img" bs=1M count=200 status=none
done

L0=$(sudo losetup -f --show "$WORK/disk0.img")
L1=$(sudo losetup -f --show "$WORK/disk1.img")
echo "→ loop: $L0 $L1"

# 2) RAID-1 생성 — metadata=1.2 (가장 최신, /boot 외 대부분 OK)
sudo mdadm --create /dev/md1 --metadata=1.2 \
    --level=1 --raid-devices=2 \
    "$L0" "$L1" --run

echo
echo "=== /proc/mdstat ==="
cat /proc/mdstat

# 3) 동기화 완료까지 대기 (200MB 이라 수 초)
echo
echo "=== 초기 sync 대기 ==="
while grep -q "resync" /proc/mdstat; do
    sleep 1
done
cat /proc/mdstat

# 4) 포맷 + 마운트
sudo mkfs.ext4 -F -L raid1lab /dev/md1 >/dev/null
sudo mkdir -p /mnt/raid1
sudo mount /dev/md1 /mnt/raid1
df -h /mnt/raid1

# 5) 데이터 쓰기 + 체크섬 보관
sudo dd if=/dev/urandom of=/mnt/raid1/data.bin bs=1M count=50 status=none
CKSUM=$(sudo sha256sum /mnt/raid1/data.bin | awk '{print $1}')
echo
echo "=== sha256 (기준) ==="
echo "$CKSUM"

# 6) 한쪽 디스크 fail — 가상 장애
echo
echo "=== 디스크 1대 fail 시뮬 ($L0) ==="
sudo mdadm --fail /dev/md1 "$L0"
cat /proc/mdstat
echo "→ [_U] 또는 [U_] 형태 = degraded mode (한쪽 빠짐)"

# 7) degraded 에서도 데이터 정상
echo
echo "=== 한쪽 죽었지만 데이터 정상 (sha256 동일해야 함) ==="
sudo sha256sum /mnt/raid1/data.bin | awk '{print $1}'

# 8) 죽은 디스크 제거 + 다시 추가 → rebuild
sudo mdadm --remove /dev/md1 "$L0"
sudo mdadm --add /dev/md1 "$L0"

echo
echo "=== rebuild 대기 ==="
while grep -q "recovery" /proc/mdstat; do
    sleep 1
done
cat /proc/mdstat
echo "→ [UU] = 양쪽 정상 복귀"

# 9) detail
echo
echo "=== mdadm --detail ==="
sudo mdadm --detail /dev/md1

# 10) 정리
sudo umount /mnt/raid1
sudo mdadm --stop /dev/md1
sudo losetup -d "$L0" "$L1"
echo
echo "정리 완료. 이미지: $WORK/disk{0,1}.img (재실행 시 자동 cleanup)"
