ทำไม cp --reflink = auto ไม่ใช่พฤติกรรมเริ่มต้น


31

เหตุใดจึงcp --reflink=autoไม่ใช่พฤติกรรมเริ่มต้น มันอาจก่อให้เกิดอันตรายใด ๆ ที่จะเปิดใช้งานหรือไม่

เป็นไปได้หรือไม่ที่จะเปิดใช้งานในเวลาคอมไพล์ดังนั้นจึงถูกใช้ทั่วทั้งระบบไม่ใช่เฉพาะในเชลล์แบบโต้ตอบ?


4
ใช่เป็นคำถามที่ดี IMHO มันจะเป็นเพียง BTRFS เริ่มเป็นระบบไฟล์ Linux เริ่มต้น
Adam Ryczkowski

คำตอบ:


38

ไม่ใช่ค่าเริ่มต้นเนื่องจากเหตุผลที่ว่าทำไมอาจมีการคัดลอกเพื่อป้องกันความเสียหายของข้อมูล ด้วยเหตุผลด้านประสิทธิภาพคุณอาจต้องการให้การเขียนเกิดขึ้นที่เวลาคัดลอกแทนที่จะใช้กระบวนการที่มีความละเอียดแฝงบางอย่างซึ่งทำงานกับไฟล์ CoW และอาจล่าช้าโดยการเขียนอาจเป็นส่วนต่าง ๆ ของดิสก์เชิงกล โปรดทราบว่าจาก coreutils v8.24 mv จะอ้างอิงตามค่าเริ่มต้นเนื่องจากไม่มีข้อ จำกัด ข้างต้น


8
(อาจถือได้ว่าเป็นคำตอบที่เชื่อถือได้เนื่องจากPádraigเป็นผู้ดูแลแกนกลาง GNU)
Stéphane Chazelas

8
ฉันสงสัยว่าคำตอบนี้ถูกต้องอย่างน้อยใน btrfs หากไฟล์ถูกเขียนไปในภายหลังข้อมูลใหม่จะถูกเขียนไปยังเซกเตอร์ดิสก์ที่แตกต่างกันอยู่แล้วเนื่องจาก btrfs CoW ดังนั้นจึงไม่มีความได้เปรียบในการแฝงที่จะไม่ทำการเชื่อมโยง ไฟล์ที่มีชุด NoDataCoW จะไม่สามารถเชื่อมโยงใหม่ได้ และถ้าคุณต้องการป้องกันความเสียหายของข้อมูลคุณจะต้องคัดลอกไปยังพาร์ติชันที่แตกต่างกันและ reflink ก็จะไม่ทำงาน
JanKanis

3
มีปัญหาเวลาในการตอบสนองเนื่องจาก BTRFS ต้องการค้นหาและจัดสรรพื้นที่ในขณะเขียน สิ่งนี้อาจไม่สามารถใช้งานได้ดังนั้นจึงทำให้เกิดข้อผิดพลาด ENOSPC ในขณะเขียน
Pádraig Brady

1
mv ใช้สำหรับ reflink อะไร?
Macil

1
cross subvolume เปลี่ยนชื่อเป็น btrfs
Pádraig Brady

17

ไม่ทราบว่าทำไมมันไม่ได้เริ่มต้นอาจจะเพื่อที่มันจะทำงานเช่นเดียวกับสาธารณูปโภคคัดลอกอื่น ๆ ( rsync, cpio, pax, tar... ) ซึ่งได้รับการสนับสนุนมันไม่มี (หรือเมื่อมีการคัดลอกไฟล์ผ่านอินเตอร์เฟซที่ไม่อนุญาตให้ว่า (เช่น NFS, samba, ฟิวส์เลเยอร์ระบบไฟล์ ... )

ฉันอยู่ในสถานการณ์เดียวกันเมื่อไม่กี่ปีที่ผ่านมาและเมื่อมองไปที่ GNU cp code อย่างรวดเร็วมันก็ยังเหมือนเดิมคุณต้องแก้ไขรหัสเพื่อรับพฤติกรรมเริ่มต้นที่แตกต่างกัน:

--- coreutils-8.21/src/cp.c~    2013-06-22 21:50:26.265639114 +0100
+++ coreutils-8.21/src/cp.c     2013-06-22 21:51:06.880513924 +0100
@@ -775,7 +775,7 @@ cp_option_init (struct cp_options *x)
   x->interactive = I_UNSPECIFIED;
   x->move_mode = false;
   x->one_file_system = false;
-  x->reflink_mode = REFLINK_NEVER;
+  x->reflink_mode = REFLINK_AUTO;

   x->preserve_ownership = false;
   x->preserve_links = false;

4

ปัญหาใหญ่อย่างหนึ่งคือความเป็นไปได้ที่จะใช้พื้นที่ในการทำสำเนาเมื่อคุณเขียน

ด้วยการคัดลอกปกติจากนั้นทันทีที่การคัดลอกเสร็จสมบูรณ์คุณไม่ต้องกังวลกับการเขียนไปยังส่วนที่มีอยู่ของไฟล์ที่ล้มเหลว: พื้นที่ถูกจัดสรรทั้งหมดและจะไม่หายไปจนกว่าคุณจะลบไฟล์ แต่ด้วยการคัดลอก reflink มีความเสี่ยงเสมอว่าในบางสัปดาห์หรือเดือนตามถนนการเขียนไปยังส่วนที่มีอยู่ของไฟล์จะล้มเหลวเนื่องจากมีพื้นที่ไม่เพียงพอในการทำสำเนา

ค้นพบว่าระบบของคุณกำลังทำสำเนา reflink อยู่ด้านหลังของคุณเมื่อการดำเนินการเช่นนั้นล้มเหลวจะเป็นเรื่องที่น่าประหลาดใจ


อย่างน้อยใน btrfs แม้เขียนไปยังส่วนที่จัดสรรไว้แล้วของไฟล์สามารถล้มเหลวด้วย ENOSPC ...
graywolf

2
alias cp='cp --reflink=auto --sparse=always'

ทำให้รู้สึกดีกว่าการแก้ไขรหัส


6
ดูเหมือนว่าคุณจะมองข้ามมันเป็นไปได้ไหมที่จะเปิดใช้งานมันในเวลาคอมไพล์ดังนั้นมันจึงถูกใช้งานทั่วทั้งระบบไม่ใช่เฉพาะกับเชลล์แบบโต้ตอบในคำถามของ OP
Stéphane Chazelas

5
@StephaneChazelas One สามารถเปลี่ยนชื่อ/bin/cpและแทนที่ด้วยเชลล์สคริปต์ที่คล้ายกันได้ตลอดเวลา
goncalopp

0
  1. เหตุผลด้านความทนทานอาจต้องการให้มีการคัดลอกเพื่อป้องกันข้อมูล "การสูญเสีย"

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

  2. ไม่ใช่เพื่อเหตุผลด้านประสิทธิภาพ

    เกิดขึ้นเมื่อวัวเพียงส่วนหนึ่งของ "ลบ" บล็อกเขียนถึง ด้วยความทันสมัย! ดิสก์! อุปกรณ์ขนาดบล็อกของฮาร์ดแวร์เป็นหลายเท่าของ 4k การเปลี่ยนส่วนหนึ่งของ 4k ทำให้ไดรฟ์อ่านทั้ง 4k และเขียนมันออกมาอีกครั้ง แต่เหนือสิ่งอื่นใดเคอร์เนลจะทำสิ่งเดียวกันดังนั้นจะไม่มีการเขียนบางส่วนถึงอุปกรณ์บล็อก SSD หรืออย่างอื่น . เคอร์เนลต้องดำเนินการ CoW ด้วยเหตุผลเดียวกันเว้นแต่ว่าเรามีสำเนาที่เก็บไว้เราไม่สามารถสร้างข้อมูลที่มีอยู่ในส่วนอื่น ๆ ของอุปกรณ์บันทึกสำหรับปลายเรื่องของไฟล์ แต่แล้วจุดคือ ดำริ แต่การแคชสำเนาของไฟล์และการคัดลอกไฟล์นั้นแตกต่างกันไปการดำเนินการในอดีตนั้นมีราคาถูกกว่ามาก

    ที่อยู่ของการเขียนนั้นไม่มีสาระสำคัญ แต่โปรดทราบว่า "ส่วนที่ไม่ได้ใช้งานบางส่วนของอุปกรณ์" นั้นมีราคาถูกกว่าการค้นพบมากกว่า "ที่บล็อกของไฟล์อยู่ในขณะนี้"

ความจริงก็คือวิธีการ CoW ใด ๆ ที่ถูกกว่าหรือเท่ากับเพียงแค่อัปเดตอุปกรณ์บล็อก ทีนี้ถ้าเราไม่ได้พูดถึงอุปกรณ์บล็อคมันคงเป็นอีกเรื่องหนึ่ง ... เขียนลงบนเทปที่ไหนสักแห่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.