วิธีกำหนดต้นเคอร์เนล Linux เพื่อรีบูตเครื่องเมื่อตื่นตระหนก?


13

คุณสามารถวาง "panic = N" บนบรรทัดคำสั่งเคอร์เนลเพื่อให้ระบบรีบูต N วินาทีหลังจากตื่นตระหนก

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


ผ่านระบบย่อย kernel watchdog หรือเปล่า?
Gilles 'หยุดความชั่วร้าย'

config file เป็นไฟล์กำหนดค่า boot (grub) เนื่องจากเป็นพารามิเตอร์ที่เรียกใช้ในเวลา boot และไม่สามารถคาดว่าจะอ่าน grub จากไฟล์ config อื่น ๆ ในขณะที่ระบบไฟล์ไม่ได้ถูกเมาท์
Nikhil Mulley

ฉันคิดว่าคุณต้องการรีบูตเป็นเคอร์เนลอื่นหรือไม่ นั่นจะต้องมีความร่วมมือจาก bootloader และ ณ จุดนั้นคุณจะสามารถส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งได้ bootloaders บางตัวสามารถตั้งค่าให้รีบูทเคอร์เนลที่แตกต่างกันได้หากการบู๊ตล้มเหลว (โดยให้โปรแกรม userland ระบุถึง bootloader ที่บู๊ตสำเร็จ)
Gilles 'หยุดความชั่วร้าย'

ใช่ฉันจะทำการบูทไปยังเคอร์เนลอื่นหรือให้เคอร์เนลเป็นพา ธ rootfs ที่ต่างออกไป มีตัวแปรในการกำหนดค่า bootloader ที่ได้รับการเปลี่ยนแปลงเมื่อ userspace บู๊ตสำเร็จ ถ้ามันไม่เปลี่ยนมันก็รู้ว่าจะลองอะไรที่ต่างออกไป ฉันหวังว่าจะมีอะไรมากกว่าแค่บรรทัดคำสั่งเคอร์เนลสำหรับสิ่งนี้เนื่องจากการกำหนดค่า bootloader สามารถแก้ไขได้โดย userspace Linux หากมีปัญหาเป็นไปได้ว่าผู้ใช้พื้นที่เริ่มเขียนแล้วอุปกรณ์ปิด; และมีการกำหนดค่าเริ่มต้นทางเลือกสำหรับสิ่งนั้น ฉันยังคงมองหาสิ่งที่แข็งแกร่งที่สุดที่ฉันจะได้รับ
Shawn J. Goff

คำตอบ:


2

ดูเหมือนจะไม่มีตัวเลือกการกำหนดค่าเช่นนั้น การหมดเวลาเริ่มต้นคือ 0 ซึ่งเป็นไปตามhttp://www.mjmwired.net/kernel/Documentation/kernel-parameters.txt#1898คือ "รอตลอดไป"

ตัวเลือกถูกกำหนดไว้ในkernel / panic.cคุณสามารถเขียนโปรแกรมแก้ไขที่ตั้งค่าเริ่มต้นเป็นสิ่งที่แตกต่าง

หากต้องการ hardcode การรีบูตหลังจาก 3 วินาทีให้เปลี่ยน:

int panic_timeout;

ถึง:

int panic_timeout = 3;

มันเป็นคำแนะนำที่ไม่ดีสำหรับคนจรจัดที่มีแหล่งข้อมูลเมื่อมีกลไกพิเศษ: unix.stackexchange.com/a/517364/6622
poige

19

จากman proc:

proc / sys / kernel / / ความตื่นตระหนก

ไฟล์นี้ให้การเข้าถึงการอ่าน / เขียนตัวแปรเคอร์เนล panic_timeout หากนี่เป็นศูนย์เคอร์เนลจะวนซ้ำในความตื่นตระหนก ถ้าไม่ใช่ศูนย์มันบ่งชี้ว่าเคอร์เนลควร autoreboot หลังจากจำนวนวินาทีนี้ เมื่อคุณใช้ไดรเวอร์อุปกรณ์เฝ้าระวังซอฟต์แวร์การตั้งค่าที่แนะนำคือ 60


ฉันกำลังมองหาตัวเลือกการกำหนดค่าเคอร์เนลที่นี่ไม่ใช่อะไรจาก userspace โดยเฉพาะอย่างยิ่งถ้าด้วยเหตุผลบางอย่างมันไม่สามารถเมานต์ระบบไฟล์รูท (หรือด้วยเหตุผลอื่น ๆ คือ userspace ไม่เกิดขึ้น) ฉันต้องรีบูท
Shawn J. Goff

@ ShawnJ.Goff หากคุณกังวลเกี่ยวกับพื้นที่ผู้ใช้ที่ไม่ได้เกิดขึ้นแสดงว่าคุณกำลังถามคำถามผิด (คุณต้องการรีบูตแม้ว่าเคอร์เนลจะไม่ตื่นตระหนก) และคำตอบคือรูปแบบของสุนัขเฝ้าบ้านตามคำนิยาม; คุณต้องเปิดใช้งานระบบย่อย watchdog (เรียกการรีบูตหาก/dev/watchdogยังไม่ได้สัมผัสในขณะนี้) Documentation/watchdog/watchdog-api.txtดู
Gilles 'หยุดความชั่วร้าย'

1
ใช่ฉันมีสุนัขเฝ้าบ้าน ฉันแค่ใส่อวนที่ปลอดภัยที่สุดเท่าที่จะทำได้
Shawn J. Goff

มีวิธีใดในการปิดระบบแทนที่จะรีบู๊ต?
Ciro Santilli 事件改造中心法轮功六四事件

@ ShawnJ.Goff บูตโหลดเดอร์รองรับการส่งผ่านพารามิเตอร์นี้นานก่อนที่ผู้ใช้จะถูกบูต อย่างไรก็ตามโปรดดูคำตอบของฉัน: unix.stackexchange.com/a/517364/6622
poige

5

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

sysctlแต่ที่เป็นการตั้งค่าเริ่มต้นรันไทม์นอกจากนี้ยังสามารถปรับเปลี่ยนผ่าน ดังนั้นการอัปเดต/etc/sysctl.confพารามิเตอร์ด้วยการอัปเดตkernel.panic = 3การกำหนดค่าเป็นหลัก


1
ด้วงไม่ได้อยู่ในทุกระบบ คนที่ฉันทำงานด้วยไม่ได้ใช้ด้วง การกำหนดค่า bootloader ของฉันถูกเก็บไว้ในแฟลช
Shawn J. Goff

ใช่ยังสามารถติดตั้งระบบไฟล์และอ่านไฟล์ปรับแต่งเคอร์เนลได้หรือไม่? ถ้าใช่แล้วคุณไป เพราะมันเป็นบูตโหลดเดอร์ซึ่งส่งผ่านพารามิเตอร์เคอร์เนลไปยังเคอร์เนลในขณะที่โหลดเคอร์เนล
Nikhil Mulley

3

kernel.panicเป็นsysctl มีหลายวิธีในการกำหนดค่าเหล่านี้ตัวอย่างเช่นผ่านมีsysctl.d


3

ใน Linux Kernel (ผมเคยเห็นใน 3 ขึ้นไป) .configมีตัวเลือกในเป็น คือพารามิเตอร์และค่าเริ่มต้นCONFIG_PANIC_TIMEOUT 0ในเคอร์เนล Linux รุ่นเหล่านี้คำตอบของ Lekensteyn ก็จะใช้ได้เช่นกัน แต่ตัวแปรนั้นใช้จากสิ่ง.configเดียวเท่านั้น

int panic_timeout = CONFIG_PANIC_TIMEOUT;

1

เคอร์เนล Linux รองรับ CONFIG_CMDLINE_BOOL

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

มีตัวอย่างบางส่วนแม้แต่ใน "portal" นี้เช่น

/superuser/778826/config-cmdline-override-set-but-hardcoded-vga-boot-parameter-ignored



0

สรุปข้อมูลในคำตอบอื่น ๆ ก่อน ค่าถูกกำหนดใน kernel / panic.c และ rw ถึง sysctl มันสามารถส่งผ่านเป็น commanline สำหรับบูต

สิ่งที่เพิ่มเติมผมจะพูดว่าบูต commandline สามารถเป็นค่าเริ่มต้นชุดในระหว่างการรวบรวม

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