โดยพื้นฐานแล้วฉันต้องการfwrite()
n
ไบต์และมีการ< n
เขียนไบต์บนดิสก์จริงหรือสิ่งประดิษฐ์อื่น ๆ ที่ไม่สอดคล้องกันอาจเกิดขึ้น (เช่นภาคที่ถูกเขียนออกมาจากคำสั่ง)
ฉันรู้ว่าฉันสามารถทำได้ในระดับฮาร์ดแวร์ด้วย:
- โลหะเปลือยโดยการดึงสายไฟหรือ
- ด้วยระบบปฏิบัติการเสมือนจริงโดยเพียงแค่ออกการรีเซ็ตผ่านทางไฮเปอร์ไวเซอร์
.. แต่ฉันไม่ชอบเคสด้านบนเพราะ:
- ฉันไม่ต้องการที่จะทำลายฮาร์ดแวร์ของฉันด้วยการสูญเสียพลังงานที่แท้จริง
- การจำลองการสูญเสียพลังงานที่เกิดขึ้นจริงเป็นแบบแมนนวลและ / หรือยากและน่าเกลียดที่จะทำให้เป็นแบบอัตโนมัติ
- การจำลองการสูญเสียพลังงานเวอร์ชวลไลเซชันนั้นดีกว่า แต่ฉันคิดว่ามันน่าจะช้ากว่าที่จะวิ่ง 100 ครั้งกับฐานข้อมูลโดยรอให้บูท VM และน่าเกลียดที่ต้องสร้างตรรกะเพื่อลองเข้าสู่ระบบผ่านทาง SSH อีกครั้งจนกว่า VM จะบูต
.. ดังนั้นฉันกำลังมองหาทางออกที่รวดเร็วและง่ายขึ้นในการสร้างระบบอัตโนมัติ
ฉันมีความคิดเล็กน้อย:
1) ฆ่ากระบวนการด้วย $ kill -9 dbms_pid
สิ่งนี้อาจไม่ทำงานอย่างที่ฉันคิดว่าทุกสิ่งที่ให้ไว้จะfwrite()
ถูกเพิ่มลงในบัฟเฟอร์ของเคอร์เนล (นี่คือการเก็งกำไร) และหลังจากการฆ่าเคอร์เนลอาจเป็นเพียงแค่ล้างบัฟเฟอร์ตามปกติในดิสก์
2) ถอนติดตั้งระบบไฟล์กลางเขียน
ฉันไม่คิดว่าจะยกเลิกการต่อเชื่อมทำงานในขณะที่มีไฟล์เปิดอยู่ในระบบไฟล์
3) ให้ระบบไฟล์อยู่ในอุปกรณ์ลูปแบ็คที่สำรองข้อมูลโดยไฟล์และเพิ่งหยุดเขียนไปยังไฟล์นั้นที่จุดตัดไฟ
ฉันไม่คิดว่าจะมีกลไกสำหรับสิ่งนั้น การเปลี่ยนชื่อไฟล์อาจไม่หยุดการเขียนไปยังระบบไฟล์เนื่องจากไดรเวอร์ลูปแบ็คอาจอ้างอิงถึง inode หรือการอ้างอิงภายในบางอย่าง
การเลิกเมานท์อุปกรณ์ลูปแบ็คอาจมีปัญหาแบบเดียวกันคือไม่สามารถทำได้เมื่อมีคนเปิดไฟล์ไว้
การคัดลอกจาก block-device-as-a ไฟล์สามารถใช้งานได้ (เว้นแต่ว่ามันจะล็อคแบบเอกสิทธิ์เฉพาะบุคคลซึ่งอาจเป็น) แต่เนื่องจากการคัดลอกเนื้อหาไม่ใช่การดำเนินการแบบอะตอมมิกอาจทำให้สิ่งประดิษฐ์ไม่เกี่ยวข้องกับการปิดเครื่อง
4) ให้ระบบไฟล์โฮสต์ที่ด้านบนของ LVM และถ่ายรูปหน้าจอ
นี่อาจเป็นความคิดที่ทำงานได้ดีที่สุดของฉัน การถ่ายภาพระดับเสียงของ LVM เป็นแบบอะตอมและสามารถจำลองการสูญเสียพลังงานได้หรือไม่? ฉันเดาว่าบัฟเฟอร์ที่ไม่ได้ล้างข้อมูล / หน้าไม่ได้ถูกนำมาพิจารณาสำหรับภาพรวม (ซึ่งดีสำหรับการจำลองของฉัน) และฉันหวังว่าจะแนะนำสิ่งประดิษฐ์เดียวกันกับการสูญเสียพลังงานเช่นfwrite()
เนื้อหาถูกเขียนเพียงครึ่งเดียว?
จะมีการเขียนที่ไม่เป็นไปตามคำสั่งหรือหน้าที่เขียนไปยังไดรฟ์ข้อมูล LVM จะถูกนำไปใช้ตามลำดับหรือไม่
คุณมีความคิดอื่น ๆ อีกไหม? คุณคิดอย่างไรเกี่ยวกับตัวเลือก? คุณเห็นด้วยหรือไม่ 4) ความคิดที่ดีที่สุดคืออะไร?
ทำไมฉันถึงทำแบบนี้: โดยพื้นฐานแล้วฉันกำลังพัฒนาฐานข้อมูลที่มีความทนทานฉันต้องการทดสอบโดยการสร้างสคริปต์อัตโนมัติที่จะทำการทดสอบการทรมานรอบใหญ่โดยให้ข้อมูลบันทึกไว้ในขณะที่จำลองการสูญเสียพลังงานกับ อย่างน้อยดิสก์จากนั้นตรวจสอบว่าไม่มีข้อมูลที่ได้รับการยืนยันและฐานข้อมูลสามารถกู้คืนได้อย่างปลอดภัย