Project

General

Profile

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'로 마운트하세요."`