วิธีการปิดการใช้งานพฤติกรรมเปลือกฉุกเฉิน agressive systemd?


10

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

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

ฉันรู้ว่า systemd สร้างไฟล์ * .mount จาก / etc / fstab โดยอัตโนมัติและฉันสามารถใช้ตัวเลือก nofail พร้อมไทม์เอาต์ x-systemd.device ขนาดเล็ก (หรือกำหนดไฟล์. mount ที่เกี่ยวข้องด้วยตนเอง) อย่างไรก็ตามมันจะไม่แก้ปัญหาของฉันฉันต้องการทำให้ระบบมีความยืดหยุ่นมากขึ้น "การแก้ไข" fstab ทุกครั้งไม่สะดวกมากและฉันไม่แน่ใจว่ามี "ปัญหา" อื่น ๆ อีกมากที่จะทำให้ระบบของฉันไม่สามารถบูตได้เพราะ นักพัฒนาบางคนคิดว่ามันสำคัญพอ

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


อะไรคือปัญหาที่เกิดขึ้นจริง btw? ฉันตระหนักถึงสอง - ไม่สามารถเข้าสู่ระบบผ่าน ssh และ sulogin ให้การอนุญาตเฉพาะรูทไม่ใช่ผู้ใช้ sudo เพื่อเข้าถึงในโหมดฉุกเฉิน สิ่งเหล่านี้ครอบคลุมความเสียหายที่คุณได้รับหรือไม่?
sourcejedi

จริงๆแล้วระบบจะสามารถเข้าถึงได้มากขึ้นถ้าบริการทั้งสองนั้นจะเริ่มขึ้นใช่ ระบบควรเริ่มต้นทุกอย่างที่สามารถเริ่มต้นได้ดีที่สุดเช่นเดียวกับในยุค SysV เก่า (ข้อผิดพลาดในการเข้าสู่ระบบ 'แทนการเสียชีวิตด้วยความเจ็บปวดโดยเชลล์ฉุกเฉิน) และเริ่มเชลล์ในกรณีที่เกิดข้อผิดพลาดร้ายแรงเท่านั้น
goteguru

คำตอบ:


7

แท้จริงมันเป็นเพียงความล้มเหลวของการเมานต์นั่นคือทั้งหมดที่คุณจะต้องเปลี่ยน

ดังนั้นจดหมายขอของคุณจะตอบคำถามเล็กน้อย สร้างไฟล์ดร็อปอิน:

# /etc/systemd/system/local-fs.target.d/nofail.conf

# Clear OnFailure= (set it to nothing)
[Unit]
OnFailure=

ฉันเชื่อว่าสิ่งนี้จะไม่เพิ่มปัญหาใหม่นอกเหนือไปจาก linux sysvinit ที่ได้รับความเดือดร้อนจากการยอมให้สถานการณ์ความล้มเหลวบางส่วนเกิดขึ้น


อย่างไรก็ตามคุณยังได้ชี้ให้เห็นถึงคำถามว่านานแค่ไหนsystemd ควรรอให้อุปกรณ์บล็อกที่ระบุนั้นพร้อมใช้งาน ฉันไม่เห็นวิธีการกำหนดค่านี้โดยไม่ต้องเปลี่ยนเครื่องกำเนิด fstab โดยรวม https://www.freedesktop.org/software/systemd/man/systemd.generator.html

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

ในทางเทคนิคถ้าการกระจายของคุณมีอยู่ในตัวเองmountallสคริปต์ sysvinit คุณสามารถลอง hooking ว่าใน แต่ที่มีนัยสำคัญจะมีการเปลี่ยนแปลงขั้นตอนการบู๊ต -. เป็นจริงมากขึ้นของส้อม ฉันจะไม่แนะนำวิธีการนั้น


https://unix.stackexchange.com/a/393711/29483

emergency.targetหากคุณค้นหาผ่านไฟล์หน่วยที่มีเพียงไม่กี่วิธีที่มากสำหรับการบูตที่จะถอยกลับไป มันมักจะเมื่อ .mountหน่วยสำหรับระบบไฟล์ในท้องถิ่นล้มเหลวทำให้local-fs.target ล้มเหลว หรือเมื่อ initramfs ของคุณล้มเหลวในการเมาท์ระบบไฟล์รูทหาก initramfs ของคุณใช้ systemd

local-fs.targetOnFailure=emergency.targetมี และมันจะล้มเหลวเนื่องจากยูนิตสำหรับระบบไฟล์โลคัลถูกเพิ่มในรายการต้องของ local-fs.target โดยอัตโนมัติ (เว้นแต่มี DefaultDependencies=no)

$ systemctl show --property Requires local-fs.target
Requires=-.mount home.mount boot.mount boot-efi.mount

2
ฉันคิดว่าฉันควรใส่[Unit]\nOnFailure= nofail.conf ของฉัน ดูเหมือนว่าจะเป็นไปได้ที่จะกำหนดค่าเวลารอใน /etc/systemd/system.conf (ผ่านตัวเลือก DefaultTimeoutStartSec ทั่วไป) ระบบของฉันมักจะเร็วพอ 90s ดูเหมือนว่าจะ overkill อยู่แล้ว การแก้ปัญหานี้ดูเหมือนว่าจะมีแนวโน้ม
goteguru

ในกรณีของฉันฉันจะตั้งค่าOnFailure=ใน/lib/systemd/system/local-fs.targetแทน/etc/systemd(Ubuntu 16.04 บน AWS)
ThiagoAlves

@ThiagoAlves คุณไม่ควรทำเช่นนั้นมันจะถูกเขียนทับในการอัพเกรดระบบ ทำตามคำแนะนำในคำตอบหรือขอคำชี้แจง :-)
sourcejedi

@sourcejedi ฉันลองคำตอบแล้ว แต่มันไม่ได้ผลสำหรับฉัน
ThiagoAlves

1
@ThiagoAlves ขอบคุณสำหรับความคิดเห็นของคุณ ฉันได้ทำคำตอบที่คลุมเครือน้อยลงเพื่อให้เราสามารถชัดเจนเกี่ยวกับว่าเป็นปัญหาหรือไม่ คือฉันสงสัยว่าคุณได้รวมไว้[Unit]ก่อนหน้าOnFailure=นี้หรือไม่
sourcejedi

0

ปิดการติดตั้งอัตโนมัติของระบบไฟล์ใด ๆ ที่ไม่จำเป็นสำหรับการดำเนินการบู๊ตด้วยการเพิ่มnoautoตัวเลือกการเมานท์ลงใน/etc/fstabรายการ:

/dev/sdxy /u01 nfs defaults 0 0

ถึง:

/dev/sdyx /u01 nfs noauto 0 0

จากนั้นติดตั้งระบบไฟล์หลังจากบูตโดยใช้บรรทัดใน/etc/rc.local:

mount /u01

ตัวอย่างนี้ใช้ NFS แต่ก็สามารถใช้ได้กับ LUN ที่นำเข้าจากไฟล์เซิร์ฟเวอร์


1
ใช่ฉันรู้ noauto แต่ถ้าฉันจะเปลี่ยน fstab ทุกครั้ง nofail จะเป็นทางเลือกที่ดีกว่ามาก ขอบคุณอยู่ดี
goteguru

0

ลองนี่สิ

systemctl mask emergency.service
systemctl mask emergency.target

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