ความเข้าใจของฉันเกี่ยวกับสแน็ปช็อต LVM คือ: เมื่อบล็อกเปลี่ยนแปลงที่จุดเริ่มต้น บล็อกนั้นจะถูกคัดลอกก่อน (ก่อนการเปลี่ยนแปลง) ไปยังสแน็ปช็อต จากนั้นบล็อกจะเปลี่ยนไปที่จุดเริ่มต้นตามปกติ

ในทางทฤษฎี เมื่อสร้างสแน็ปช็อตขึ้นครั้งแรก สแนปชอตไม่ควรมีสิ่งใดเลย จากนั้นเมื่อการเปลี่ยนแปลงเกิดขึ้นที่จุดเริ่มต้น บล็อกเหล่านี้จะเริ่มเติมสแนปชอต

อย่างไรก็ตาม หากเพื่อวัตถุประสงค์ในการทดสอบ ฉันสร้าง 1G LV ขนาดเล็ก และใส่ไฟล์สองสามไฟล์ลงไป จากนั้นฉันสร้างสแน็ปช็อต 200MB ตามที่คาดไว้ lvs แสดง LSize 200M สำหรับ snap และ 1G สำหรับจุดเริ่มต้น แต่เมื่อฉันเมานต์วอลลุ่มสแน็ปช็อต df จะแสดงด้วยขนาด 1G เมื่อฉันตรวจสอบเนื้อหา ฉันพบว่ามีทุกอย่างในโวลุ่มต้นทาง แม้ว่าไฟล์ต้นฉบับจะไม่มีการเปลี่ยนแปลง

ทำไมถึงเป็นเช่นนี้? ฉันสมมติว่าคำสั่ง "เมานต์" มีเหตุผลบางอย่างในนั้นเพื่อทำการเปรียบเทียบระหว่างต้นทาง LV และสแน็ปช็อต LV ใครสามารถอธิบายวิธีการทำงานนี้ ถ้าฉันดูหมายเลขไอโหนดของไฟล์ในแต่ละโวลุ่ม (ต้นทางและสแน็ป) พวกเขาต่างกัน (ตามที่คาดไว้เพราะแต่ละระบบเป็นระบบไฟล์ที่ไม่ซ้ำกัน) แต่ฉันสมมติว่ามี "พอยน์เตอร์" บางประเภทที่สแนปชอต ใช้เพื่ออ้างอิงบล็อกที่ไม่เปลี่ยนแปลงบนต้นทาง

ตามแนวทางเดียวกันนี้ ฉันคิดว่าหากฉันคัดลอกโลจิคัลวอลุ่มสแน็ปช็อตไปยังตำแหน่งอื่น ฉันจะได้รับชุดย่อยของไฟล์ต้นทาง - เฉพาะไฟล์ที่มีการเปลี่ยนแปลง ... แต่ถ้าฉันเมานต์ระบบไฟล์สแน็ปช็อตในครั้งแรก จากนั้นทำสำเนาระดับระบบไฟล์ (cp) ฉันจะได้ทุกอย่างที่จุดเริ่มต้นเหมือนกับตอนที่สร้างสแน็ปช็อต ถูกต้อง?

answer

สแนปชอต LVM ทำงานโดยเก็บรายการบล็อกที่เปลี่ยนแปลงและเนื้อหาในวอลลุมสแน็ปช็อต ขณะที่ส่งคำขอทั้งหมดเพื่ออ่านข้อมูลที่ไม่เปลี่ยนแปลงไปยังอุปกรณ์บล็อกพื้นฐาน ความฉลาดทั้งหมดนี้สร้างขึ้นใน LVM ในเคอร์เนล และmountไม่มีความรู้ในเรื่องนี้ เท่าที่อะไรใน userspace เป็นห่วงมีสองอุปกรณ์ป้องกันที่มีอยู่ซึ่งทั้งสองมีขนาดเท่ากัน (1G ในตัวอย่างของคุณ) ความจริงที่ว่าอันหนึ่งเป็นโวลุ่มต้นทางของ LVM และอีกอันหนึ่งเป็นสแนปชอตนั้นไม่เกี่ยวข้องกับใครเลย ยกเว้นบิตของระบบ dm (ตัวแมปอุปกรณ์) ที่ต้องจัดการกับสิ่งนั้น

ขนาด 200MB ของสแนปชอตคือปริมาณข้อมูลที่เปลี่ยนแปลงซึ่งสแนปชอตสามารถจัดเก็บได้ ก่อนที่สแนปชอตจะแตกออกและกระจายบล็อกของข้อมูลไปทั่วพื้น

หากคุณคัดลอกวอลลุมสแน็ปช็อต ไม่ว่าจะเป็นอุปกรณ์บล็อกหรือคัดลอกไฟล์ภายใน คุณจะได้เนื้อหาทั้งหมดไม่ว่าจะด้วยวิธีใด

ทั้งหมดนี้มาพร้อมกับข้อแม้: คุณสามารถเข้าไปภายในข้อมูลเมตาใน shapshot LV และทำสิ่ง "ขี้ขลาด" เช่น rsync ระดับอุปกรณ์ที่มีประสิทธิภาพสูง ฉันพูดถึงสิ่งนี้เพราะฉันเขียนlvmsyncเพื่อทำสิ่งนี้ทั้งหมด และดูเหมือนว่าคุณอาจจะชอบฟังก์ชันประเภทนี้ จากน้ำเสียงของคำถามของคุณ

สแนปชอตเป็นส่วนหนึ่งของระบบย่อย LVM ซึ่งเป็นบล็อกข้อมูลที่เป็นเลเยอร์นามธรรมที่อยู่ใต้ระบบไฟล์

สแนปชอตเป็นสำเนาฉบับสมบูรณ์ของโวลุ่มต้นฉบับและจะมีขนาดเท่ากันเมื่อคุณเมานต์ ทั้งสองจะเป็น 1 GB

ยกเว้นข้อเท็จจริงที่ว่าสแนปชอตใช้กลอุบาย ดังนั้นคุณไม่จำเป็นต้องคัดลอกทั้ง 1 GB ทั้งหมด อันที่จริงแล้วไม่มีอะไรถูกคัดลอกในขณะที่คุณถ่ายภาพซึ่งเป็นสาเหตุที่ทำให้ทั้งสองรวดเร็วมากและทำไมในตอนแรกจึงแทบจะไม่ใช้พื้นที่เลย

แต่สแน็ปช็อตจะเริ่มคัดลอกข้อมูลเฉพาะเมื่อมีการแก้ไขข้อมูลต้นฉบับเท่านั้น ( copy on write ) แต่จากนั้นจะมีการคัดลอกเฉพาะข้อมูลดั้งเดิมที่"กำลังจะถูกแก้ไข" (บล็อก) และไม่มีอะไรอื่น พื้นที่ 200 MB ของสแน็ปช็อตคือจำนวนพื้นที่ที่คุณสำรองไว้สำหรับสำเนาเหล่านั้น กล่าวอีกนัยหนึ่งคุณสามารถติดตามการแก้ไขมูลค่า 200 MB ในสแนปชอตของคุณ

กลอุบายคือสแนปชอตเริ่มต้นจากการรวบรวมตัวชี้ไปยังบล็อกข้อมูลดั้งเดิม การเปลี่ยนแปลงในโวลุ่มดั้งเดิมทุกครั้งจะทริกเกอร์สำเนาของบล็อกข้อมูลดั้งเดิมนั้นไปยังตาราง COW (ค่อยๆ เติม 200 MB ที่คุณตั้งค่าไว้ต่างหาก) และอัปเดตตัวชี้ตามนั้น เมื่ออ่านสแน็ปช็อต ตัวชี้เหล่านั้นจะถูกติดตาม และข้อมูลที่ไม่ได้แก้ไขจากโวลุ่มดั้งเดิมจะถูกส่งกลับโดยทำตามพอยน์เตอร์ที่นั่น หรือตามตัวชี้ไปยังบล็อกที่คัดลอกในตาราง COW