snapper: ตาข่ายนิรภัย
ตั้ง snapper ให้ถ่าย snapshot ได้จริง ก่อนแตะงานเสี่ยง (NVIDIA)
Make snapshots actually work — fixing the T440p mistake
ใช้ทำอะไร (Purpose)
บทเรียนจาก T440p: ลง snap-pac ไว้ เห็นข้อความ Performing snapper ... snapshots ทุกครั้ง แต่ snapper list-configs ว่าง → ไม่เคยถ่ายอะไรเลย
“เห็น hook รัน” ≠ “มี backup” (เหมือนไฟ link กะพริบ ≠ VLAN ตั้งถูก)
ลำดับที่ถูก: snapper + config ก่อน → พิสูจน์ → snap-pac เป็นตัวสุดท้าย
ปัญหา: snapper สร้าง .snapshots ซ้อนใน @
snapper อยากได้: @ ──► .snapshots (ลูกของ @) ❌ rollback แล้ว snapshot ย้ายตาม
ที่เราต้องการ: @ @snapshots ──► /.snapshots ✅ พี่น้อง แยกอิสระเหมือนเก็บ backup config ของ router ไว้ใน flash ของ router ตัวเดียวกัน
ขั้นตอน: เทคนิค 3 ขั้น (Setup)
sudo pacman -S snapper
sudo umount /.snapshots # หลบทางให้ snapper
sudo rmdir /.snapshots # rmdir ลบได้เฉพาะโฟลเดอร์ว่าง = ระบบป้องกันในตัว
sudo snapper -c root create-config /
sudo btrfs subvolume list / # หลักฐาน: .snapshots top level 256 (ซ้อนใน @)
sudo btrfs subvolume delete /.snapshots # ลบตัวที่ snapper สร้าง (ตรวจ ID ให้ถูก ไม่ใช่ 258)
sudo mkdir /.snapshots
sudo mount -a # ทดสอบบรรทัดใน fstab ไปในตัว
findmnt /.snapshots # ต้องเป็น [/@snapshots] subvolid=258
sudo chmod 750 /.snapshots
sudo snapper list-configs # ต้องเห็น root │ /
sudo snapper -c root create -d "base install before nvidia"
sudo snapper list
sudo pacman -S snap-pac # ลงตัวสุดท้าย (ลาก python มาด้วย)ทดสอบว่าใช้ได้ (Verification)
sudo pacman -S linux-headers linux-lts-headers # ของที่ต้องใช้อยู่แล้ว (DKMS)ต้องเห็น pre #3 ก่อนติดตั้ง และ post #4 หลังติดตั้ง
sudo snapper status 3..4 | head -20| สัญลักษณ์ | ความหมาย |
|---|---|
+ | สร้างใหม่ |
- | ลบ |
c | เนื้อหาเปลี่ยน |
c..... /etc/ld.so.cache = ผลข้างเคียงทางอ้อม (library ใหม่ → ldconfig) ที่ดูจากรายการไฟล์ในแพ็กเกจไม่เห็น = timeline แบบ forensic อัตโนมัติ
Timer: timeline vs cleanup
| timer | ค่าเริ่มต้นหลังลง snapper | ตั้งใหม่ |
|---|---|---|
snapper-timeline | enable (ถ่ายทุกชั่วโมง) | ปิด (@ เปลี่ยนเฉพาะตอน pacman ซึ่ง snap-pac ถ่ายให้แล้ว) |
snapper-cleanup | ไม่ enable ⚠️ | เปิด (ไม่งั้น snapshot สะสมจนดิสก์เต็ม) |
systemctl list-timers 'snapper*'
sudo snapper -c root set-config TIMELINE_CREATE=no
sudo systemctl disable --now snapper-timeline.timer
sudo systemctl enable --now snapper-cleanup.timer- cleanup เก็บ pre/post ไว้ 50 อันล่าสุด (
NUMBER_LIMIT=50) - snapshot ที่ถ่ายเองแบบไม่มี Cleanup ไม่ถูกลบอัตโนมัติ
- cleanup ทำงานครั้งแรก 10 นาทีหลังบูต แล้วทุก 1 วัน (เหมาะกับโน้ตบุ๊กที่ปิดบ่อย)
กฎการถ่าย snapshot ด้วยมือ
snap-pac จับได้แค่การเปลี่ยนแปลงที่ผ่าน pacman แก้ไฟล์ระบบด้วยมือ (modprobe.d, udev, PAM, ly enable) → ถ่ายเองทุกครั้ง
sudo snapper -c root create -d "คำอธิบาย"ปัญหาที่เคยเจอ & สิ่งที่ทายผิด (Troubleshooting)
| เหตุการณ์ | ความจริง / บทเรียน |
|---|---|
เจอ subvolume var/lib/portables, var/lib/machines ที่ไม่ได้สร้าง | systemd สร้างเองบน btrfs (container) ว่างเปล่า ปล่อยไว้ได้ |
| ทายว่า post snapshot คือ #9 ได้ #10 | มี timeline snapshot #7 แทรก (18:00:05 ตรงต้นชั่วโมงพอดี) → ค้นพบว่า timeline เปิดอยู่ |
| ทาย checkpoint “nvidia working” = #7 | จริงคือ #8 — ทายผิดเพราะไม่รู้ว่ามีตัวแทรก |
| ทายว่า cleanup รอบแรก 23 ชม. | จริง 2 นาที (OnBootSec=10min) |
gen ของ @snapshots = 10 ไม่เปลี่ยน | ไม่เคยถูกเขียน = ยืนยันว่าว่างเปล่า ปลอดภัยที่จะใช้ |
คำถามชวนคิด
- ถ้าเปิด timeline แต่ลืมเปิด cleanup ไป 6 เดือน พื้นที่ดิสก์จะหายไปเพราะอะไร (เบาะแส: copy-on-write กับ kernel ที่อัพเดททุกสัปดาห์)
- snapper status บอกว่าไฟล์ใน
/etcถูกแก้ระหว่าง pre/post ของการลงแพ็กเกจหนึ่ง ทั้งที่แพ็กเกจนั้นไม่มีไฟล์ใน/etcคุณจะสืบหาว่าใครแก้อย่างไร - snapshot ของ
@ไม่รวม@homeข้อดีนี้กลายเป็นข้อเสียในสถานการณ์ไหน และควรป้องกัน@homeด้วยวิธีอะไรแทน