Skip to content

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-timelineenable (ถ่ายทุกชั่วโมง)ปิด (@ เปลี่ยนเฉพาะตอน 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 ไม่เปลี่ยนไม่เคยถูกเขียน = ยืนยันว่าว่างเปล่า ปลอดภัยที่จะใช้

คำถามชวนคิด

  1. ถ้าเปิด timeline แต่ลืมเปิด cleanup ไป 6 เดือน พื้นที่ดิสก์จะหายไปเพราะอะไร (เบาะแส: copy-on-write กับ kernel ที่อัพเดททุกสัปดาห์)
  2. snapper status บอกว่าไฟล์ใน /etc ถูกแก้ระหว่าง pre/post ของการลงแพ็กเกจหนึ่ง ทั้งที่แพ็กเกจนั้นไม่มีไฟล์ใน /etc คุณจะสืบหาว่าใครแก้อย่างไร
  3. snapshot ของ @ ไม่รวม @home ข้อดีนี้กลายเป็นข้อเสียในสถานการณ์ไหน และควรป้องกัน @home ด้วยวิธีอะไรแทน