เหตุใดการปิดเครื่องของฉันหลังจากที่ `` RM 'ไม่ดีบันทึกไฟล์ของฉัน


31

สถานการณ์แบบคลาสสิก: ฉันวิ่งได้ไม่ดีrmและรับรู้ได้ทันทีหลังจากนั้นฉันก็ลบไฟล์ผิด (ไม่มีอะไรสำคัญและฉันมีการสำรองข้อมูลล่าสุดอย่างอดทน แต่ก็น่ารำคาญ)

รู้ว่ากิจกรรมของดิสก์ต่อไปเป็นศัตรูของฉันถ้าฉันต้องการกู้คืนไฟล์ด้วยextundeleteหรือเครื่องมือดังกล่าวฉันก็ขับเคลื่อนเครื่องลงทางกายภาพทันที (เช่นด้วยปุ่มเปิดปิดไม่ใช่ด้วยhaltหรือคำสั่งใด ๆ ) นี่เป็นแล็ปท็อปที่ไม่มีงานสำคัญที่ทำงานอยู่หรือมีอะไรเปิดอยู่ดังนั้นจึงเป็นการทำงานที่ยอมรับได้ (โดยวิธีการที่ฉันได้เรียนรู้ตั้งแต่นั้นมาสิ่งแรกที่ต้องทำในสถานการณ์ดังกล่าวจะประเมินก่อนหากไฟล์ที่หายไปอาจจะยังคงเปิดโดยกระบวนการhttps://unix.stackexchange.com/a/101247 - หากเป็นเช่นนั้นคุณควรกู้คืนด้วยวิธีนี้แทนที่จะปิดเครื่อง)

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

คำถามของฉันคือตอนนี้เพื่อทำความเข้าใจว่ามันเป็นไปได้อย่างไรและอะไรคือความล่าช้าทั่วไปก่อนที่rmจะแพร่กระจายสู่ดิสก์ ฉันรู้ว่าดิสก์ IO ไม่ได้ถูกลบทิ้งทันที แต่มันอยู่ในหน่วยความจำระยะหนึ่ง แต่ฉันคิดว่าดิสก์เจอร์นัลจะทำให้แน่ใจได้อย่างรวดเร็วว่าการดำเนินการที่ค้างอยู่จะไม่สูญหายทั้งหมด https://unix.stackexchange.com/a/78766ดูเหมือนจะบอกกล่าวกับกลไกแยกต่างหากเพื่อล้างหน้าสกปรกและเพื่อล้างการดำเนินการของวารสาร แต่ไม่ได้ให้รายละเอียดที่เพียงพอเกี่ยวกับวิธีที่วารสารจะเกี่ยวข้องกับrmและความล่าช้าที่คาดไว้ก่อนหน้า การดำเนินการจะถูกล้างออก

รายละเอียดเพิ่มเติม: ข้อมูลอยู่ในพาร์ติชัน ext4 ภายในโวลุ่ม LUKS และเมื่อบูตเครื่องสำรองข้อมูลฉันเห็นสิ่งต่อไปนี้ในsyslog:

Sep 24 10:24:58 gamma kernel: [   11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [   11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [   11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)

rmแต่ผมไม่มั่นใจว่ามันจะเกี่ยวข้องกับ

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

คำตอบ:


22

ดูเหมือนคุณจะเข้าใจดีว่าเกิดอะไรขึ้น

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

ระบบแคชทั้งหมดเขียนก่อนที่จะล้างออกไปยังดิสก์ มีหลายตัวเลือกที่ควบคุมพฤติกรรมนี้ตั้งอยู่ทั้งหมดที่มี/proc/sys/vm/dirty_* [ doc เคอร์เนล ] เว้นแต่ว่าแอปพลิเคชันจะดำเนินการ flush อย่างชัดเจนผ่านfsync() [ man 2 fsync ]ข้อมูลจะถูกกำหนดเมื่อมันเก่าเพียงพอหรือเขียนแคชไว้
คำจำกัดความของ "data" ตามที่ใช้ข้างต้นรวมถึงการแก้ไขรายการไดเรกทอรีเพื่อลบไฟล์

ตอนนี้สำหรับวารสารนั่นเป็นหนึ่งในความเข้าใจที่คลาดเคลื่อนของวารสารที่เกิดขึ้น วัตถุประสงค์ของวารสารไม่ใช่เพื่อให้แน่ใจว่าการเปลี่ยนแปลงจะถูกเล่นซ้ำหรือข้อมูลนั้นไม่สูญหาย วัตถุประสงค์ของเจอร์นัลคือเพื่อป้องกันความเสียหายของระบบไฟล์เองไม่ใช่ไฟล์ในนั้น สมุดรายวันประกอบด้วยข้อมูลเกี่ยวกับการเปลี่ยนแปลงที่เกิดขึ้นและไม่ใช่ข้อมูลการเปลี่ยนแปลงทั้งหมด (โดยทั่วไป) รายละเอียดที่แน่นอนขึ้นอยู่กับระบบไฟล์และโหมดเจอร์นัล สำหรับ ext3 / 4 ดูที่ติดตั้งในตัวเลือกdataman 8 mount


หากต้องการตอบคำถามเสริมของคุณว่ามีวิธีการป้องกันการเขียนที่ค้างอยู่หรือไม่โดยไม่ต้องรีบูต:

จากการอ่านอย่างรวดเร็วผ่านซอร์สโค้ดเคอร์เนลดูเหมือนว่าคุณสามารถใช้uคำสั่งmagic sysrq ([ วิกิพีเดีย ], [ เคอร์เนล doc ])เพื่อทำการดำเนินการแบบอ่านอย่างเดียวในการนับใหม่แบบฉุกเฉิน ดูเหมือนว่าสิ่งนี้จะติดตั้งปริมาณทั้งหมดอีกครั้งอ่านอย่างเดียวโดยไม่ต้องทำการซิงค์

จะใช้เพียงแค่กดAlt+ +SysRqu


1
ขอบคุณสำหรับคำตอบนี้! ฉันยังสับสนอยู่เล็กน้อยเกี่ยวกับวารสาร: ฉันควรคิดว่ามันเป็นสิ่งที่เกี่ยวข้องเฉพาะเมื่อการเปลี่ยนแปลงถูกล้างข้อมูลลงดิสก์ดังนั้นการเขียนแคชเป็นกลไกที่เกี่ยวข้องเพียงอย่างเดียวในการประเมินเวลาผ่อนผันก่อนที่rmจะเขียน? กล่าวอีกนัยหนึ่งสิ่งต่าง ๆ ที่เกิดขึ้นกับวารสารเฉพาะเมื่อการเขียนกำลังจะทำ หรือเป็นภาพที่ซับซ้อนกว่านั้น? สำหรับ alt-sysrq-u นี่เป็นแนวคิดที่ค่อนข้างดี คุณมีการอ้างอิงเพื่อให้การอ้างสิทธิ์ "ปรากฏ" หรือไม่ (ดูเหมือนจะไม่ติดตามจากลิงก์ที่คุณให้) ขอบคุณ! :)
a3nm

นอกจากนี้ magic sysrq ยังมีข้อ จำกัด ที่คุณยังไม่สามารถทำได้บนเครื่องระยะไกล
a3nm

3
@ a3nm คุณสามารถใช้ sysrq บนเครื่องระยะไกล echo u > /proc/sysrq-trigger(คุณอาจต้องเปิดใช้งานก่อน)
Paulo Almeida

เจอร์นัลไม่ได้จัดการกับเนื้อหาของไฟล์ (โดยค่าเริ่มต้นมันสามารถเปลี่ยนแปลงได้อย่างสมบูรณ์ journalled) เฉพาะกับเมตาดาต้าระบบแฟ้ม แต่ในกรณีนี้มันสามารถลบไฟล์ได้ในขณะที่เรากำลังจัดการกับการลบรายการไดเรกทอรี ดังนั้นเจอร์นัลต้องแน่ใจว่าไฟล์นั้นมีอยู่ (ที่มีเนื้อหาก่อนหน้านี้โดยถือว่าพวกเขาไม่มีการเปลี่ยนแปลงอื่น ๆ ) หรือไม่
Ángel

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

2

จาก: https://www.kernel.org/doc/Documentation/filesystems/ext4.txt

commit = nrsec (*) Ext4 สามารถบอกให้ซิงค์ข้อมูลทั้งหมดและข้อมูลเมตาได้ทุก 'nrsec' วินาที ค่าเริ่มต้นคือ 5 วินาที ซึ่งหมายความว่าหากคุณสูญเสียพลังงานของคุณคุณจะสูญเสียการทำงานมากถึง 5 วินาทีล่าสุด (ระบบไฟล์ของคุณจะไม่ได้รับความเสียหายเนื่องจากการทำเจอร์นัล) ค่าเริ่มต้นนี้ (หรือค่าต่ำ) จะส่งผลเสียต่อประสิทธิภาพการทำงาน แต่เป็นผลดีต่อความปลอดภัยของข้อมูล การตั้งค่าเป็น 0 จะมีผลเช่นเดียวกับการปล่อยไว้ที่ค่าเริ่มต้น (5 วินาที) การตั้งค่าเป็นค่าที่สูงมากจะช่วยเพิ่มประสิทธิภาพ

ดูที่นี่เกี่ยวกับวิธีล้างพวกเขา: คุณจะล้างบัฟเฟอร์และแคชในระบบ Linux ได้อย่างไร

อ้างจากลิงค์ด้านบน:

หมายเหตุ: ล้างหน่วยความจำในสิ่งที่ไม่จำเป็น (Kernerl 2.6.16 หรือใหม่กว่า) ให้แน่ใจว่าใช้การซิงค์ก่อนเพื่อล้างสิ่งที่มีประโยชน์ออกไปในดิสก์ !!!

To free pagecache:

$ echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

$ echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

$ echo 3 > /proc/sys/vm/drop_caches

ขอบคุณสำหรับคำตอบนี้! อย่างไรก็ตามฉันไม่เข้าใจสิ่งนี้: สำหรับ "การซิงค์" ที่กล่าวถึงcommit=nrsecนี้เป็นสิ่งที่จะเกิดขึ้นหลังจากเคอร์เนลตัดสินใจที่จะล้างการเปลี่ยนแปลงจากหน่วยความจำไปยังดิสก์หรือไม่ หรือการตั้งค่าcommit=1รับประกันว่าการเปลี่ยนแปลงทั้งหมดจะถูกล้างออกหลังจาก 1 วินาทีโดยไม่คำนึงถึงdirty_expire_centisecsและdirty_writeback_centisecsการตั้งค่า?
a3nm

เคอร์เนลจะล้าง (ซิงค์) แคชใด ๆ / บัฟเฟอร์เพื่อแผ่นทุก 1 commit=1วินาที เท่าที่ฉันเข้าใจsyncบังคับให้ทุกอย่างเกิดขึ้นโดยไม่คำนึงถึงการตั้งค่าหน่วยความจำเสมือนแม้ว่ามันจะเกิดขึ้นเร็ว
David

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