ฉันจะหลีกเลี่ยงข้อความ“ เรียกใช้ fsck ด้วยตนเอง” ในขณะที่อนุญาตให้ทดลองกับการเปลี่ยนแปลงเวลาของระบบได้อย่างไร


18

ฉันกำลังทำงานกับระบบที่เราต้องการอนุญาตให้ผู้ใช้เล่นกับวันที่และเวลาหากพวกเขาต้องการและการรีบูตอาจเกิดขึ้นโดยพลการ นี่เป็นเรื่องปกติยกเว้นสิ่งหนึ่ง: หากมีเวลามากข้ามไปข้างหลังข้อผิดพลาดต่อไปนี้จะปรากฏขึ้นเมื่อรีบูต:

Checking filesystems
IMAGE2: Superblock last mount time (Tue Mar  1 17:32:48 2011,
        now = Thu Feb 24 17:34:29 2011) is in the future.

IMAGE2: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
        (i.e., without -a or -p options)

*** An error occurred during the file system check.
*** Dropping you to a shell; the system will reboot
*** when you leave the shell.

…จากนั้นบูทแฮงค์กำลังรออินพุตคอนโซลของผู้ใช้และแม้เมื่อได้รับการเข้าถึงคอนโซลแล้วก็ต้องใช้รหัสผ่านรูทเพื่อดำเนินการต่อ

นี่เป็นสิ่งที่ดีกว่าอุดมคติ มีวิธีใดที่จะข้ามการตรวจสอบหรือบังคับให้การตรวจสอบเกิดขึ้นโดยอัตโนมัติเมื่อรีบูต?

Google ได้ให้ความช่วยเหลือเฉพาะที่จำเป็นต้องเรียกใช้ fsck ด้วยตนเองหาก / เมื่อถูกโจมตีซึ่งไม่ใช่สิ่งที่ฉันตามมา การรัน fsck ด้วยตนเองหลังจากตั้งเวลาไม่ทำงานเนื่องจากระบบไฟล์ยังคงติดตั้งอยู่ที่จุดนั้นและการปิดใช้งาน fsck ทั้งหมดนั้นน้อยกว่าอุดมคติ

ฉันใช้ RedHat 6

อัปเดต : โซลูชันที่ฉันจะใช้ในปัจจุบันคือการแฮ็ก fstab เพื่อปิดใช้งานการตรวจสอบ fsck เมื่อรีบูต ฉันพยายามแก้ไขเวลาเมานต์ล่าสุดของดิสก์ที่ใช้debugfsซึ่งใช้งานได้ดีกับไดรฟ์ ext3 แต่ดูเหมือนจะล้มเหลวอย่างไม่ต่อเนื่องใน ext4

คำตอบ:


15

ฉันจะแนะนำการแฮ็กe2fsckเพื่อปิดการใช้งานการตรวจสอบเฉพาะสำหรับเวลาเมาต์ครั้งสุดท้ายหรือเวลาเขียนครั้งสุดท้ายในอนาคต เหล่านี้จะถูกกำหนดไว้ในproblem.c / problem.hและใช้ในsuper.c แต่ในการมองผมค้นพบว่า E2fsprogs 1.41.10 เพิ่มตัวเลือกใหม่ที่จะ/etc/e2fsck.confเรียกว่าbroken_system_clock สิ่งนี้ดูเหมือนจะเป็นสิ่งที่คุณต้องการอย่างแน่นอนและเนื่องจากคุณใช้ Red Hat Enterprise Linux 6 คุณควรมี 1.41.12 ซึ่งรวมถึงตัวเลือกนี้ จากหน้าคน:

   broken_system_clock
          The e2fsck(8) program has some hueristics that assume  that  the
          system clock is correct.  In addition, many system programs make
          similar assumptions.  For example, the UUID library  depends  on
          time  not going backwards in order for it to be able to make its
          guarantees about issuing universally unique ID’s.  Systems  with
          broken  system clocks, are well, broken.  However, broken system
          clocks, particularly in embedded systems, do exist.  E2fsck will
          attempt  to  use  hueristics to determine if the time can no tbe
          trusted; and to skip time-based checks if this is true.  If this
          boolean  is set to true, then e2fsck will always assume that the
          system clock can not be trusted.

ใช่หน้าคนไม่สามารถสะกดคำว่า "การวิเคราะห์พฤติกรรม" อุ่ย แต่น่าจะเป็นรหัสที่ทำงานต่อไป :)


นั่นดูยอดเยี่ยมบันทึกว่าหน้า man หมายถึงมันมีผลกับ ext2 และ ext3 เท่านั้นและฉันใช้การรวมกันของ ext3 และ ext4 ยังคงฉันจะไปลองตอนนี้เช่นถ้าทำงานก็คือว่าสิ่งที่ฉันกำลังมองหา
me_and

1
มันได้ผล! รวมถึงใน ext4 ขอขอบคุณ!
me_and

1

ฉันสงสัยว่ามีวิธีลบการตรวจสอบนี้เป็นการเฉพาะโดยย่อจากการแก้ไขซอร์สโค้ด การละเว้นข้อผิดพลาดทั้งหมดจาก fsck ฟังดูเป็นอันตรายจะเกิดอะไรขึ้นถ้ามีปัญหาอื่นอีก

ดังนั้นฉันจะแนะนำวิธีแก้ปัญหาต่อไปนี้: เปลี่ยน script boot เพื่อกำหนดวันที่ของระบบเป็นบางเวลาในอนาคต (พูด 2038-01-18 บนเครื่อง 32- บิต) ก่อนที่จะเรียกใช้ fsck และอ่านกลับจากฮาร์ดแวร์ นาฬิกาหลังจากนั้น ( hwclock --hctosysพร้อมตัวเลือกเพิ่มเติมตามต้องการขึ้นอยู่กับฮาร์ดแวร์ของคุณและการใช้ GMT ในนาฬิกาฮาร์ดแวร์)


นี่จะไม่หมายถึงครั้งต่อไปที่จะมีหน้าต่างซึ่งเราสามารถกดบั๊กเดียวกันอีกครั้งได้หรือไม่? นั่นคือเวลาเมานต์ล่าสุดคือ 2038-01-18 ดังนั้นหากเวลาปัจจุบันถูกตั้งค่าเป็นเช่นนั้นก็จะมีสภาพการแข่งขันที่เรา (เท่าที่เกี่ยวข้องกับระบบ) พยายามเมานต์ก่อนการเมานต์ครั้งสุดท้ายอีกครั้ง
me_and

@me_and: ใช่ฉันเกรงว่า kludge ของฉันจะไม่ช่วยผู้ใช้ที่เป็นอันตราย หากนั่นคือสิ่งที่คุณกำลังทำอยู่การแพทช์ fsck ดูเหมือนจะเป็นตัวเลือกที่ดีที่สุด
Gilles 'หยุดความชั่วร้าย'

0

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


การใช้งาน VM นั้นไม่ใช่ตัวเลือกสำหรับเราและในกรณีใด ๆ เพียงแค่เปลี่ยนกลับไปเป็นสแน็ปช็อตหมายความว่าเราจะลบสถานะอื่นทั้งหมดที่ผู้ใช้อาจตั้งค่าไว้
me_and

0

นี่เป็นวิธีแก้ปัญหาที่ใช้งานได้ดีสำหรับฉัน:

สร้าง /etc/e2fsck.conf:

[problems]

# Superblock last mount time is in the future (PR_0_FUTURE_SB_LAST_MOUNT).
0x000031 = {
preen_ok = true
preen_nomessage = true
}

# Superblock last write time is in the future (PR_0_FUTURE_SB_LAST_WRITE).
0x000032 = {
preen_ok = true
preen_nomessage = true
}

เพิ่มเติมเกี่ยวกับการแก้ไขนี้ที่นี่:

http://stillstup.blogspot.com/2010/02/superblock-last-mount-time-is-in-future.html

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