Btrfs 사용하기 » History » Version 1
상혁 손, 2025-10-17 17:27
| 1 | 1 | 상혁 손 | # Btrfs 사용하기1 |
|---|---|---|---|
| 2 | |||
| 3 | #### btrfs는 time-machine과 같은 기능을 제공 |
||
| 4 | |||
| 5 | #### 장점: 원하는 시점으로 file-system을 되돌린다. |
||
| 6 | |||
| 7 | 1. usb를 gpt parted로 만들어서 사용 |
||
| 8 | 2. partition formation은 btrfs가 없으면 linux filesystem으로 설정 |
||
| 9 | 3. USB mount/umount와 setup_btrfs_ssd를 꼭 확인 참조 |
||
| 10 | 4. backup: manage_snapshots.sh |
||
| 11 | 5. restore: restore_snapshots_v5.sh |
||
| 12 | |||
| 13 | #### backup 방법 |
||
| 14 | |||
| 15 | birdhead@birdnotedev:~$ cat manage_snapshots.sh |
||
| 16 | `#!/bin/bash` |
||
| 17 | `# =================================================================` |
||
| 18 | `# Btrfs 스냅샷 관리 스크립트 (UUID 버전)` |
||
| 19 | `# =================================================================` |
||
| 20 | `set -e # 오류 발생 시 즉시 중단` |
||
| 21 | |||
| 22 | `# --- 설정 ---` |
||
| 23 | `DEVICE="UUID=56870639-72c9-4a55-b0d2-81dfe499daa7"` |
||
| 24 | `ADMIN_MOUNT="/mnt/btrfs_admin"` |
||
| 25 | `KEEP_COUNT=4 # 보관할 스냅샷 개수` |
||
| 26 | |||
| 27 | `# --- 스크립트 본문 ---` |
||
| 28 | `echo "스냅샷 생성을 시작합니다..."` |
||
| 29 | |||
| 30 | `# 1. Btrfs 관리를 위해 최상위 루트를 임시 마운트` |
||
| 31 | `sudo mkdir -p "$ADMIN_MOUNT"` |
||
| 32 | `sudo mount -o subvolid=5 "$DEVICE" "$ADMIN_MOUNT"` |
||
| 33 | |||
| 34 | `# 2. 스냅샷 이름과 전체 경로 설정` |
||
| 35 | `SNAPSHOT_NAME="weekly-$(date +%Y-%m-%d_%H-%M-%S)"` |
||
| 36 | `FULL_SNAPSHOT_PATH="$ADMIN_MOUNT/snapshots/$SNAPSHOT_NAME"` |
||
| 37 | |||
| 38 | `echo "[1/3] 새 스냅샷 생성: $SNAPSHOT_NAME"` |
||
| 39 | `# 'work_data' 서브볼륨의 스냅샷을 'snapshots' 서브볼륨 안에 생성` |
||
| 40 | `if ! sudo btrfs subvolume snapshot -r "$ADMIN_MOUNT/work_data" "$FULL_SNAPSHOT_PATH"; then` |
||
| 41 | `echo "오류: 스냅샷 생성 실패."` |
||
| 42 | `sudo umount "$ADMIN_MOUNT"` |
||
| 43 | `exit 1` |
||
| 44 | `fi` |
||
| 45 | |||
| 46 | `echo "[2/3] 오래된 스냅샷 정리..."` |
||
| 47 | `find "$ADMIN_MOUNT/snapshots/" -maxdepth 1 -type d -name "weekly-*" | sort | head -n -"$KEEP_COUNT" | xargs -r sudo btrfs subvolume delete` |
||
| 48 | |||
| 49 | `echo "[3/3] 관리용 임시 마운트 해제"` |
||
| 50 | `sudo umount "$ADMIN_MOUNT"` |
||
| 51 | |||
| 52 | `echo "✅ 스냅샷 작업이 성공적으로 완료되었습니다."` |
||
| 53 | |||
| 54 | #### 복원방법 |
||
| 55 | |||
| 56 | birdhead@birdnotedev:~$ cat restore_snapshots_v5.sh |
||
| 57 | `#!/bin/bash` |
||
| 58 | `# =================================================================` |
||
| 59 | `# Btrfs 스냅샷 복원 스크립트 (최종 완성 v3)` |
||
| 60 | `# =================================================================` |
||
| 61 | `set -e` |
||
| 62 | |||
| 63 | `# --- 설정 ---` |
||
| 64 | `DEVICE="UUID=56870639-72c9-4a55-b0d2-81dfe499daa7"` |
||
| 65 | `ADMIN_MOUNT="/mnt/btrfs_admin"` |
||
| 66 | |||
| 67 | `if [ "$#" -ne 1 ]; then echo "오류: 스냅샷 이름 필요"; exit 1; fi` |
||
| 68 | `SNAPSHOT_NAME=$1` |
||
| 69 | |||
| 70 | `read -p "경고: '$SNAPSHOT_NAME'(으)로 복원합니다. 계속하시겠습니까? (y/n): " confirm` |
||
| 71 | `if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then echo "취소됨"; exit 0; fi` |
||
| 72 | |||
| 73 | `echo "✅ 복원을 시작합니다..."` |
||
| 74 | `set +e` |
||
| 75 | `sudo umount /home/birdhead/usb_work/snapshot 2>/dev/null` |
||
| 76 | `sudo umount /home/birdhead/usb_work 2>/dev/null` |
||
| 77 | `set -e` |
||
| 78 | |||
| 79 | `# 1. 관리자 마운트` |
||
| 80 | `sudo mkdir -p "$ADMIN_MOUNT"` |
||
| 81 | `sudo mount -o subvolid=5 "$DEVICE" "$ADMIN_MOUNT"` |
||
| 82 | |||
| 83 | `# 2. 복원할 스냅샷으로 'restored_temp' 임시 서브볼륨을 먼저 생성` |
||
| 84 | `echo "[1/4] 스냅샷으로 임시 복원 공간을 생성합니다..."` |
||
| 85 | `RESTORE_TEMP_PATH="$ADMIN_MOUNT/restored_temp_$(date +%s)"` |
||
| 86 | `sudo btrfs subvolume snapshot "$ADMIN_MOUNT/snapshots/$SNAPSHOT_NAME" "$RESTORE_TEMP_PATH"` |
||
| 87 | |||
| 88 | `# 3. 새로 만든 임시 공간을 새로운 '기본값'으로 설정` |
||
| 89 | `echo "[2/4] 새로운 공간을 기본값으로 설정합니다..."` |
||
| 90 | `# ★★★ 바로 여기가 수정된 부분입니다! ★★★` |
||
| 91 | `RESTORE_ID=$(sudo btrfs subvolume show "$RESTORE_TEMP_PATH" | grep 'Subvolume ID' | awk '{print $3}')` |
||
| 92 | `sudo btrfs subvolume set-default "$RESTORE_ID" "$ADMIN_MOUNT"` |
||
| 93 | |||
| 94 | `# 4. 이제 구 'work_data'는 더 이상 기본값이 아니므로 안전하게 삭제 가능` |
||
| 95 | `# (이미 수동으로 삭제했지만, 스크립트의 안정성을 위해 코드는 남겨둡니다)` |
||
| 96 | `echo "[3/4] 이전 작업 공간('work_data')을 삭제합니다..."` |
||
| 97 | `if [ -d "$ADMIN_MOUNT/work_data" ]; then` |
||
| 98 | `sudo btrfs property set -ts "$ADMIN_MOUNT/work_data" ro false` |
||
| 99 | `sudo btrfs subvolume delete "$ADMIN_MOUNT/work_data"` |
||
| 100 | `fi` |
||
| 101 | |||
| 102 | `# 5. 임시 이름을 최종 이름 'work_data'로 변경` |
||
| 103 | `echo "[4/4] 복원된 공간의 이름을 'work_data'로 변경합니다..."` |
||
| 104 | `sudo mv "$RESTORE_TEMP_PATH" "$ADMIN_MOUNT/work_data"` |
||
| 105 | |||
| 106 | `sudo umount "$ADMIN_MOUNT"` |
||
| 107 | `echo -e "\n🎉 복원 완료! 'mount_usb_work.sh'로 마운트하세요."` |