ทำไม“ cp -R --reflink = always” ทำการคัดลอกมาตรฐานในระบบไฟล์ btrfs?


12

Btrfs รองรับการคัดลอกเมื่อเขียน ฉันพยายามใช้คุณสมบัตินั้นเพื่อโคลนไดเรกทอรี:

cp -R --reflink=always foo_directory foo_directory.mirror

ฉันคาดว่าคำสั่งจะเสร็จสิ้นเกือบจะในทันที (เหมือนกbtrfs subvolume snapshot) แต่cpดูเหมือนว่าคำสั่งจะทำสำเนามาตรฐานช้า

ตามหน้า man, ฉันคาดว่า--reflink=alwaysจะบังคับใช้ Copy-On-Write:

เมื่อระบุ --reflink [= always] ให้ทำสำเนาแบบ Lightweight ซึ่งบล็อกข้อมูลจะถูกคัดลอกเฉพาะเมื่อมีการแก้ไข หากไม่สามารถทำสำเนาได้หรือหาก --reflink = auto ถูกระบุให้ถอยกลับไปเป็นสำเนามาตรฐาน

คำถาม:

  • คุณรู้ไหมว่าทำไม--reflink=alwaysไม่ทำงาน
  • ฉันควรใช้ตัวเลือกใด (หรือคำสั่งอื่น) แทน?

คำตอบ:


20

cp --reflink=alwaysทำงานได้อย่างถูกต้องแน่นอน หากไม่ใช่คุณจะได้รับข้อผิดพลาด โดยการออกแบบที่แตกต่างกันและ--reflink=always --reflink=autoข้อผิดพลาดจะมีลักษณะเช่นนี้:

# Filesystem that does not support the feature at all
cp: failed to clone `xx' from `yy': Inappropriate ioctl for device

# Filesystem that does support it, but copy across filesystems
cp: failed to clone `xx' from `yy': Invalid cross-device link

คุณกำลังคัดลอกโครงสร้างไดเรกทอรีที่มีไฟล์ขนาดเล็กจำนวนมากหรือไม่ ในกรณีที่ยังคงมีการสร้างทุกไดเรกทอรีและเปิดและปิดทุกไฟล์จึงจะยังคงใช้เวลาไม่เหมือนcp btrfs subvolume snapshotนั่นน่าจะอธิบายเวลาที่ใช้ในการดำเนินการ


3
ใช่มันมีไฟล์จำนวนมากส่วนใหญ่เป็นไฟล์ข้อความขนาดเล็ก ฉันไม่ทราบว่า cp ยังคงต้องดำเนินการทุกไฟล์ ขอบคุณนั่นเป็นส่วนที่ฉันไม่เข้าใจ ฉันคิดว่าในกรณีการใช้งานของฉันมันจะดีกว่าที่จะสร้างภาพรวมที่เขียนได้
Philipp Claßen

1
ใช่ถ้าคุณสามารถสร้างสแนปชอตได้ cp --reflink=alwaysยังคงมีประโยชน์เมื่อสิ่งที่คุณพยายามโคลนไม่ใช่รูทย่อยของ subvolume เนื่องจากbtrfs subvolume snapshotทำงานเฉพาะกับ subvolume ไม่ใช่ในส่วนย่อยของ subvolume
Celada
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.