เหตุใดจึงcp --reflink=auto
ไม่ใช่พฤติกรรมเริ่มต้น มันอาจก่อให้เกิดอันตรายใด ๆ ที่จะเปิดใช้งานหรือไม่
เป็นไปได้หรือไม่ที่จะเปิดใช้งานในเวลาคอมไพล์ดังนั้นจึงถูกใช้ทั่วทั้งระบบไม่ใช่เฉพาะในเชลล์แบบโต้ตอบ?
เหตุใดจึงcp --reflink=auto
ไม่ใช่พฤติกรรมเริ่มต้น มันอาจก่อให้เกิดอันตรายใด ๆ ที่จะเปิดใช้งานหรือไม่
เป็นไปได้หรือไม่ที่จะเปิดใช้งานในเวลาคอมไพล์ดังนั้นจึงถูกใช้ทั่วทั้งระบบไม่ใช่เฉพาะในเชลล์แบบโต้ตอบ?
คำตอบ:
ไม่ใช่ค่าเริ่มต้นเนื่องจากเหตุผลที่ว่าทำไมอาจมีการคัดลอกเพื่อป้องกันความเสียหายของข้อมูล ด้วยเหตุผลด้านประสิทธิภาพคุณอาจต้องการให้การเขียนเกิดขึ้นที่เวลาคัดลอกแทนที่จะใช้กระบวนการที่มีความละเอียดแฝงบางอย่างซึ่งทำงานกับไฟล์ CoW และอาจล่าช้าโดยการเขียนอาจเป็นส่วนต่าง ๆ ของดิสก์เชิงกล โปรดทราบว่าจาก coreutils v8.24 mv จะอ้างอิงตามค่าเริ่มต้นเนื่องจากไม่มีข้อ จำกัด ข้างต้น
ไม่ทราบว่าทำไมมันไม่ได้เริ่มต้นอาจจะเพื่อที่มันจะทำงานเช่นเดียวกับสาธารณูปโภคคัดลอกอื่น ๆ ( 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;
ปัญหาใหญ่อย่างหนึ่งคือความเป็นไปได้ที่จะใช้พื้นที่ในการทำสำเนาเมื่อคุณเขียน
ด้วยการคัดลอกปกติจากนั้นทันทีที่การคัดลอกเสร็จสมบูรณ์คุณไม่ต้องกังวลกับการเขียนไปยังส่วนที่มีอยู่ของไฟล์ที่ล้มเหลว: พื้นที่ถูกจัดสรรทั้งหมดและจะไม่หายไปจนกว่าคุณจะลบไฟล์ แต่ด้วยการคัดลอก reflink มีความเสี่ยงเสมอว่าในบางสัปดาห์หรือเดือนตามถนนการเขียนไปยังส่วนที่มีอยู่ของไฟล์จะล้มเหลวเนื่องจากมีพื้นที่ไม่เพียงพอในการทำสำเนา
ค้นพบว่าระบบของคุณกำลังทำสำเนา reflink อยู่ด้านหลังของคุณเมื่อการดำเนินการเช่นนั้นล้มเหลวจะเป็นเรื่องที่น่าประหลาดใจ
alias cp='cp --reflink=auto --sparse=always'
ทำให้รู้สึกดีกว่าการแก้ไขรหัส
/bin/cp
และแทนที่ด้วยเชลล์สคริปต์ที่คล้ายกันได้ตลอดเวลา
เหตุผลด้านความทนทานอาจต้องการให้มีการคัดลอกเพื่อป้องกันข้อมูล "การสูญเสีย"
เราไม่รู้ว่าเป็นเหตุผล แต่สิ่งเลวร้ายที่สามารถเกิดขึ้นได้นั้น จำกัด อยู่แค่การทำลายสื่อ อุปกรณ์บล็อกส่วนใหญ่ทั้งหมดจะมีรูปแบบการระบุความเสียหาย (crc) บางรูปแบบหากไม่ได้ส่งต่อการแก้ไขข้อผิดพลาด (พาริตี)
ไม่ใช่เพื่อเหตุผลด้านประสิทธิภาพ
เกิดขึ้นเมื่อวัวเพียงส่วนหนึ่งของ "ลบ" บล็อกเขียนถึง ด้วยความทันสมัย! ดิสก์! อุปกรณ์ขนาดบล็อกของฮาร์ดแวร์เป็นหลายเท่าของ 4k การเปลี่ยนส่วนหนึ่งของ 4k ทำให้ไดรฟ์อ่านทั้ง 4k และเขียนมันออกมาอีกครั้ง แต่เหนือสิ่งอื่นใดเคอร์เนลจะทำสิ่งเดียวกันดังนั้นจะไม่มีการเขียนบางส่วนถึงอุปกรณ์บล็อก SSD หรืออย่างอื่น . เคอร์เนลต้องดำเนินการ CoW ด้วยเหตุผลเดียวกันเว้นแต่ว่าเรามีสำเนาที่เก็บไว้เราไม่สามารถสร้างข้อมูลที่มีอยู่ในส่วนอื่น ๆ ของอุปกรณ์บันทึกสำหรับปลายเรื่องของไฟล์ แต่แล้วจุดคือ ดำริ แต่การแคชสำเนาของไฟล์และการคัดลอกไฟล์นั้นแตกต่างกันไปการดำเนินการในอดีตนั้นมีราคาถูกกว่ามาก
ที่อยู่ของการเขียนนั้นไม่มีสาระสำคัญ แต่โปรดทราบว่า "ส่วนที่ไม่ได้ใช้งานบางส่วนของอุปกรณ์" นั้นมีราคาถูกกว่าการค้นพบมากกว่า "ที่บล็อกของไฟล์อยู่ในขณะนี้"
ความจริงก็คือวิธีการ CoW ใด ๆ ที่ถูกกว่าหรือเท่ากับเพียงแค่อัปเดตอุปกรณ์บล็อก ทีนี้ถ้าเราไม่ได้พูดถึงอุปกรณ์บล็อคมันคงเป็นอีกเรื่องหนึ่ง ... เขียนลงบนเทปที่ไหนสักแห่ง