วิธีการปิดเครื่องเมื่อไม่มี systemd / init (เช่นใช้ init = / bin / bash)


9

poweroffบ่นว่ามันไม่สามารถเชื่อมต่อกับ systemd ผ่าน DBus (แน่นอนมันไม่ได้มีชีวิตอยู่) ฉันsyncตามด้วยการkill $$คิดว่า pid 1 ที่กำลังจะตายจะให้เคอร์เนลไปยัง poweroff แต่นั่นทำให้เคอร์เนลเกิดความตื่นตระหนก จากนั้นฉันก็กดปุ่มเพาเวอร์เพื่อบังคับให้ปิดเครื่อง

อะไรคือวิธีที่เหมาะสมที่สุดในการปิดเครื่องในสถานการณ์นี้


มีหลักฐานโดยนัยที่ไม่แน่นอนของคำถามที่ติดตั้งชุดเครื่องมือ systemd อยู่ เมื่อ "ไม่มี systemd" หมายความว่าไม่มีการติดตั้งชุดเครื่องมือ systemd ซึ่งเป็นวิธีที่ชื่อสามารถอ่านได้คำตอบนั้นค่อนข้างต่างกัน และนั่นอาจคุ้มค่ากับคำถามแยกต่างหากในสิทธิของตนเอง
JdeBP

@JdeBP คุณถูกต้องที่อ่านเฉพาะชื่อเรื่องและไม่สนใจinit=/bin/bashคำใบ้ / นัยมันคลุมเครือหากมีการติดตั้ง systemd หรือไม่ ฉันหมายความว่าไม่มี systemd ทำงานอยู่ ไม่ว่าในกรณีใดที่ไม่มี systemd ที่ใช้งานอยู่ฉันคิดว่า systemd toolset จะไร้ประโยชน์และคำตอบนั้นจะใช้วิธีการอื่นเช่นเดียวกับ sysrq
JoL

คำตอบ:


10

ถอนติดตั้งระบบไฟล์ที่คุณติดตั้ง ระบบไฟล์รูทเป็นกรณีพิเศษ mount / -o remount,roสำหรับนี้คุณจะสามารถใช้ บน Linux umount /ก็เกิดขึ้นกับการทำงานเพราะมันถูกแปลงเป็นคำสั่งเดิมอย่างมีประสิทธิภาพ


ที่กล่าวมาคุณไม่จำเป็นต้องกังวลเกี่ยวกับการเลิกเมานท์มากเกินไปเว้นแต่

  1. คุณได้ติดตั้งระบบไฟล์เก่าเช่น FAT ซึ่งพาร์ติชั่นระบบ EFI ใช้หรือ ext2 ซึ่งไม่ได้ใช้การทำเจอร์นัลหรือเทียบเท่า ด้วยระบบไฟล์ที่ทันสมัยsyncควรจะเพียงพอและระบบไฟล์จะซ่อมแซมตัวเองอย่างรวดเร็วในการบูตครั้งถัดไป
  2. คุณอาจออกจากกระบวนการทำงานที่เขียนไปยังระบบไฟล์และคุณตั้งใจจะปิดมันอย่างหมดจด ในกรณีดังกล่าวมีประโยชน์ในการพยายามเพิ่มระบบไฟล์เนื่องจาก umount อาจล้มเหลวและแสดงข้อผิดพลาดที่ไม่ว่างเพื่อเตือนคุณเกี่ยวกับตัวเขียนที่เหลือ

ด้านบนเป็นส่วนสำคัญ หลังจากนั้นคุณสามารถปิดการใช้งานฮาร์ดแวร์poweroff -fได้อย่างสะดวก reboot -fหรือรีบูตด้วย

มีsystemdเทียบเท่า - เฉพาะของpoweroff -f: systemctl poweroff -f -f. อย่างไรก็ตามpoweroff -fทำสิ่งเดียวกันและsystemdสนับสนุนคำสั่งนี้แม้ว่าจะถูกสร้างขึ้นโดยไม่มีความเข้ากันได้กับ SysV


ในทางเทคนิคแล้วฉันจำได้ว่าฮาร์ดไดรฟ์ USB ของฉันได้รับการบันทึกว่าต้องการ "การลบที่ปลอดภัย" ของ Windows หรือเทียบเท่า แต่ข้อกำหนดนี้ไม่ปลอดภัยสำหรับ powerfail และ Linux ไม่ทำเช่นนี้ในระหว่างการปิดระบบตามปกติ ตีความได้ดีขึ้นว่าคุณไม่ควรเขย่าฮาร์ดไดรฟ์ในขณะที่มันกำลังหมุน - รวมถึงพยายามที่จะถอดปลั๊กออก การปิดเครื่องอย่างสมบูรณ์ควรหยุดการหมุนของไดรฟ์ คุณสามารถได้ยินรู้สึกหรือดูว่ามันไม่หยุด :-)


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

sync()พอเพียงสำหรับ ext2 มันจะบ่นเกี่ยวกับความสกปรก แต่จะไม่ได้รับความเสียหายจริงยกเว้นข้อมูลสรุป ฉันมักจะพิจารณา init = / bin / bash หรือสิ่งที่เทียบเท่าในพื้นที่เพื่อให้เป็นสถานการณ์ฉุกเฉิน
Joshua

@Joshua ext2 fsck น่าทึ่งมาก แต่ประสิทธิภาพของ fsck ในระบบไฟล์ขนาดใหญ่นั้นแย่กว่าการเล่นซ้ำของเจอร์นัล ในสถานการณ์ฉุกเฉินคุณไม่ต้องการที่จะล่าช้าเนื่องจากการเดินเท้าที่ไม่สะอาด
sourcejedi

คุณรู้fsck.mode=skipใช่มั้ย
Joshua

3
@ โจชัวมีความเกี่ยวข้องทำไม? หากคุณถอนการติดตั้งที่ไม่สะอาดในที่สุดคุณจะต้องซ่อม FS อย่าใช้fsck.mode=skipเพื่อบู๊ตตามปกติหลังจาก unmount ที่ไม่สะอาด!
sourcejedi

5

ฉันจะรันสองคำสั่งด้านล่าง:

echo s > /proc/sysrq-trigger    <= For sync
echo o > /proc/sysrq-trigger    <= For shutdown the system

สมมติว่าเปิดใช้งาน Magic Key ในเคอร์เนล


4

exec initตกลงดังนั้นมันก็เกิดขึ้นกับผมว่าผมมีตัวเลือกในการ จากตรงนั้นฉันอาจจะสามารถทำทีหลังpoweroffได้ ฉันสงสัยว่ามีทางเลือกที่ดีกว่านี้ไหม


@ G-Man จะไม่เริ่มต้นกระบวนการบู๊ตปกติและให้เชลล์ปกติแก่คุณในที่สุด?
muru

2
@muru exec init 0คุณสามารถทำ สิ่งนี้ไม่สามารถใช้ได้กับระบบเริ่มต้นทั้งหมด แต่ระบบเดียวกันจะผ่านลำดับการปิดระบบ
Austin Hemmelgarn

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

1
@Joshua สะดวกดี แต่ถ้าคุณต้องการปลอดภัยที่สุดมันเป็นความคิดที่ดีที่จะตรวจสอบว่ากระบวนการบูทเต็มรูปแบบทำงานได้อย่างไร :-)
sourcejedi

3

อย่างมีประสิทธิภาพคุณต้องการเรียกreboot (2) syscall

คุณสามารถทำสิ่งนี้ได้สองวิธี:

  1. เรียกใช้reboot -fหรือpoweroff -fควรเรียกใช้reboot(2)โดยตรง

  2. ถ้าคุณอยู่ในความเป็นจริงของลินุกซ์ terminal เสมือน (ไม่ GUI จำลอง terminal) โดยการกดCtrl+ +AltDelete

โปรดทราบว่าแป้นพิมพ์ลัดสามารถถูกปิดใช้งานโดยโปรแกรมพื้นที่ผู้ใช้บางโปรแกรม (ปกติจะเป็น init) เมื่อปิดการใช้งานทางลัดจะส่งสัญญาณไปยัง init แทน

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


1

คุณสามารถใช้ปุ่ม Magic SysRq ( https://en.wikipedia.org/wiki/Magic_SysRq_key ) เพื่อปิดเครื่องคอมพิวเตอร์ของคุณ

หากต้องการปิดเครื่องอย่างถูกต้องคุณสามารถใช้สิ่งต่อไปนี้ (อ้างแบบฟอร์ม Wikipedia):

การใช้คีย์ Magic SysRq โดยทั่วไปคือทำการรีบูทอย่างปลอดภัยของคอมพิวเตอร์ Linux ซึ่งมีการล็อคไว้เป็นอย่างอื่น (abbr. REISUB ) สิ่งนี้สามารถป้องกันไม่ให้fsckถูกต้องในการรีบูตและเปิดโอกาสให้บางโปรแกรมในการบันทึกข้อมูลสำรองฉุกเฉินของงานที่ไม่ได้บันทึก [5]   QWERTY (หรือ AZERTY) จำ: " R aising E lephants ฉัน s S o U tterly B Oring", " R eboot อีเวนฉันSตั้งค่าU tterly Broken "หรือคำว่า" BUSIER "อ่านย้อนหลังมักใช้เพื่อจดจำลำดับ SysRq-keys ต่อไปนี้:

  • un Raw (ควบคุมแป้นพิมพ์กลับจาก X)
  • เสื้อErminate (ส่ง SIGTERM กระบวนการทั้งหมดช่วยให้พวกเขาที่จะยุติได้อย่างสง่างาม)
  • k Ill (ส่ง SIGKILL ไปยังกระบวนการทั้งหมดบังคับให้ยุติทันที)
  • Sync (ล้างข้อมูลลงดิสก์)
  • Unmount (ติดตั้งระบบไฟล์ทั้งหมดใหม่อ่านอย่างเดียว)
  • re Boot

แต่แทนที่ B สุดท้ายด้วยO (สำหรับ azerty / qwerty) สำหรับ "power O ff"


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