เกิดข้อผิดพลาดระหว่างการเริ่มต้นบนคอมพิวเตอร์องค์กรล่าสุด


63

หลังจากอัปเดตล่าสุดบางอย่างคอมพิวเตอร์ของฉันจะไม่บูทอีกต่อไป! นี่คือสิ่งที่ฉันสามารถตรวจสอบได้:

  • นี่เป็นคอมพิวเตอร์ล่าสุดที่ให้ฉันโดย บริษัท ไอที มันมี Intel CPU ล่าสุด (รุ่น Skylake)
  • คอมพิวเตอร์ใช้งาน Ubuntu 16.04
  • คอมพิวเตอร์บูตอย่างถูกต้องครั้งล่าสุดในเดือนมีนาคม ปัญหาน่าจะเกิดจากการอัพเดทซอฟต์แวร์หรือบั๊กฮาร์ดแวร์
  • ฉันมีคอมพิวเตอร์เครื่องอื่นที่ใช้ 16.04 ซึ่งมีซอฟต์แวร์เดียวกันกับที่ติดตั้ง (ฉันใช้apt-clone) และมันใช้งานได้ดี มันมีฮาร์ดแวร์ที่แตกต่างกัน (เช่น amd64 แต่ CPU ที่แตกต่าง, GPU ที่แตกต่างกัน ฯลฯ )
  • เคอร์เนลเริ่มทำงาน initrd ทำงานได้อย่างถูกต้อง เมื่อฉันบู๊ตด้วยหน้าจอเริ่มต้นในโหมดกราฟิกฉันจะได้รับพร้อมท์ให้ใส่รหัสผ่านสำหรับโวลต์ dm-crypt ของฉันและสิ่งสุดท้ายที่ฉันเห็นคือมันติดตั้งเรียบร้อยแล้ว
  • แฮงค์เกิดขึ้นก่อนที่ฉันจะได้รับพรอมต์การเข้าสู่ระบบ เมื่อคอมพิวเตอร์แฮงค์มันเป็นการแฮงค์อย่างหนัก แม้Alt+ SysRqไม่ตอบสนอง เห็นได้ชัดว่า CPU ถูกตรึงที่ 100% เนื่องจากแฟน ๆ เปิดการระเบิดเต็มรูปแบบ
  • ฉันยังมีเคอร์เนลที่ฉันใช้อยู่ก่อนที่จะรีบูตเครื่อง เมื่อฉันเลือกเคอร์เนลนี้ในเมนูด้วงฉันจะได้รับการล็อคเดียวกัน ดังนั้นดูเหมือนว่านี่เป็นข้อผิดพลาดเคอร์เนลที่มีอยู่แล้วซึ่งได้รับการกระตุ้นจากสิ่งอื่น - แต่อะไรนะ?
  • หากฉันปิดหน้าจอสแปลช (ลบออกsplashจากlinuxบรรทัดคำสั่งในด้วง) ฉันจะเห็นจำนวนบริการที่เริ่มต้นจากนั้นจะล็อคขึ้น
  • ฉันจะได้รูทเชลล์โดยการเพิ่มinit=/bin/shไปยังlinuxบรรทัดคำสั่งในด้วง ฉันยังสามารถรับเพิ่มเติมโดยเพิ่ม

    systemd.unit=basic.target systemd.shell
    

    สิ่งนี้สตาร์ทเซอร์วิสจำนวนหนึ่งและรันรูทเชลล์บน tty9

  • ถ้าฉันวิ่งsystemctl start multi-user.targetจากรูทเชลล์นั้นคอมพิวเตอร์จะล็อค ดังนั้นจึงน่าจะเป็นปัญหาที่เกิดจากหนึ่งในบริการเหล่านี้
  • ฉันวิ่งsystemctl list-dependencies multi-user.targetไปดูว่าบริการเริ่มต้นอะไร ฉันเริ่มการพึ่งพาที่ระบุไว้ด้วยตนเองทีละรายการและทุกอย่างเริ่มต้นได้ดี

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


เทคนิคการดีบักที่มีประโยชน์:

  • Alt+ SysRq: ปุ่ม magic SysRqซึ่งให้คุณทำสิ่งต่างๆเช่นการรีบูตฉุกเฉิน มันเข้าถึงเคอร์เนลในระดับต่ำมากดังนั้นมันจึงทำงานได้ทั้งหมดยกเว้นการล่มที่เลวร้ายที่สุด ในกรณีของฉันAlt+ SysRqไม่ตอบสนองซึ่งแสดงว่าข้อขัดข้องนั้นลึกเพียงใด
  • ในการแก้ไขพารามิเตอร์การบู๊ตให้กดค้างไว้Shiftสองสามวินาทีหลังจากเปิดเครื่อง คุณต้องกดมันหลังจาก BIOS ได้เริ่มต้นคีย์บอร์ด แต่ก่อนที่ระบบปฏิบัติการจะบู๊ต ทำให้เมนูGrubปรากฏขึ้น
  • ที่เมนูด้วงกดeเพื่อแก้ไขบรรทัดคำสั่งสำหรับรายการเมนู linuxในการเปลี่ยนพารามิเตอร์บูตลินุกซ์นำทางไปยังบรรทัดที่เริ่มต้นด้วย บน Ubuntu สมัยใหม่คุณจะพบเมล็ดเก่าภายใต้“ ตัวเลือกขั้นสูงสำหรับ Ubuntu” เมื่อคุณทำการเปลี่ยนแปลงที่ต้องการในบรรทัดคำสั่งแล้วให้กดCtrl+ xเพื่อบูต การเปลี่ยนแปลงใด ๆ ที่คุณทำที่นี่สำหรับการบูตนี้เท่านั้นจะไม่ถูกบันทึกลงในดิสก์
  • ตัวเลือกที่มีประโยชน์บางตัวในlinuxบรรทัดคำสั่ง:
    • quiet nosplashซ่อนข้อความการบูตเกือบทั้งหมด ลบออกเพื่อรับข้อความบนคอนโซลระหว่างการบู๊ตซึ่งจำเป็นต้องมีโอกาสวินิจฉัยปัญหา
    • recoveryให้รูทเชลล์แก่คุณโดยแทบจะไม่มีบริการ คุณจะต้องรู้รหัสผ่านรูท รายการเมนู“ โหมดการกู้คืน” ใช้สิ่งนี้
    • init=/bin/shให้รูทเชลล์แก่คุณโดยไม่มีบริการเลย exec initเพื่อดำเนินการต่อบูตปกติทำงาน คุณสามารถผ่านตัวเลือก systemd ได้ที่จุดนี้เช่นexec init --unit=basic.targetเพื่อเริ่มต้น init และบริการบางอย่าง (โปรดทราบว่านี่ไม่ได้เริ่มต้นวิธีการเข้าสู่ระบบดังนั้นคุณควรให้เชลล์ทำงานบนคอนโซลอื่น) โปรดทราบว่าระบบไฟล์รูทติดตั้งแบบอ่านอย่างเดียว วิ่งmount -o remount,rw /เพื่อให้สามารถเขียนถึงมัน
    • systemd.unit=basic.targetเริ่มชุดบริการขั้นพื้นฐานมาก โปรดทราบว่านี่ไม่รวมวิธีการลงชื่อเข้าใช้! คุณสามารถทำให้สิ่งนี้เป็นค่าเริ่มต้นได้ด้วยการรันsystemctl set-default basic.targetที่พร้อมต์รูท หากต้องการคืนค่าเป้าหมายเริ่มต้นดั้งเดิมให้รันsystemctl set-default graphical.target(หรือsystemctl set-default multi-user.targetสำหรับเซิร์ฟเวอร์ที่ไม่มี GUI)
    • systemd.debug-shellสตาร์ทเชลล์รูทบน tty9 คุณสามารถเปิดใช้งานสิ่งนี้สำหรับการบู๊ตทุกครั้งโดยรันsystemctl enable debug-shellที่พรอมต์รูต อย่าลืมปิดใช้งานสิ่งนี้หลังจากที่คุณแก้ไขปัญหาsystemctl disable debug-shellได้แล้ว กดAlt+ F9เพื่อเปลี่ยนเป็น tty9
    • ดูเพิ่มเติมเคล็ดลับ Fedora systemd , Arch Linux บูตเคล็ดลับปัญหา

คำตอบ:


71

ปัญหา

ปรากฎว่าปัญหาของฉันเป็นปัญหาที่รู้จักกันระหว่างไมโครโค้ดรุ่นล่าสุดของอินเทลได้ที่ (บางคน?) Skylake ซีพียูและเมล็ดลินุกซ์ที่ผ่านมาซึ่งจะถูกเรียกโดยส่วนใหญ่sssd ดูข้อบกพร่องของ Ubuntu # 1759920“ intel-microcode 3.20180312.0 ทำให้เกิดการล็อคที่หน้าจอเข้าสู่ระบบ (w / linux-image-4.13.0-37-generic)”และยังมีข้อผิดพลาดอื่น ๆ อีกมากมายที่เกี่ยวข้องกับปัญหาเดียวกัน เช่นUbuntu ข้อผิดพลาด # 1746806“sssd ดูเหมือนจะผิดพลาด c5 AWS และกรณี M5 ทำให้ CPU 100%”และอูบุนตูข้อผิดพลาด # 1746418“ระบบค้างเมื่อเริ่มต้น Xorg หลังจากติดตั้งลินุกซ์ภาพ 4.13.0-32 ทั่วไป” คุณมีโอกาสที่จะพบข้อผิดพลาดนี้หาก:

  • คุณมีซีพียู Intel รุ่นล่าสุด เท่าที่ฉันสามารถบอกได้ข้อผิดพลาดนี้เกิดขึ้นกับซีพียูSkylakeเท่านั้น
  • คุณได้ติดตั้งแพ็คเกจintel-microcode การย้อนกลับไปสู่เคอร์เนลที่ทดสอบมาก่อนหน้านี้ไม่ได้ผลสำหรับฉันเพราะฉันจะรันเคอร์เนลนั้นด้วยไมโครโค้ดก่อนหน้าเท่านั้น
  • คอมพิวเตอร์ของคุณเชื่อมต่อกับเครือข่ายองค์กร (โดยทั่วไปคือ LDAP หรือ Active Directory) สำหรับการตรวจสอบผู้ใช้ แม้ว่าจะมีวิธีอื่นในการทำให้เกิดข้อผิดพลาด แต่การเรียกใช้sssdดูเหมือนจะเป็นผู้ร้ายที่พบได้บ่อยที่สุด นอกจากนี้ยังมีรายงานของXorg crashing

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

วิธีซ่อมแซม

  1. หากคุณไม่สามารถบู๊ตได้ตามปกติคุณจะต้องแก้ไขบรรทัดคำสั่งเคอร์เนลที่พรอมต์ Grub ดูคำถามสำหรับคำอธิบายและวิธีที่เป็นไปได้ในการรับรูทเชลล์
  2. วิธีแก้ปัญหาสำหรับข้อบกพร่องเฉพาะนี้คือการเพิ่มnoibpbพารามิเตอร์ลงในบรรทัดคำสั่งเคอร์เนล ( 1746418/14 , 1759920/56 ) สิ่งนี้จะช่วยให้คุณสามารถบูตได้ตามปกติและทำการซ่อมแซมบางอย่าง
    สิ่งนี้ปิดใช้งานการบรรเทาความเสี่ยงที่ทำให้เกิดปัญหาซึ่งหมายความว่าขณะนี้คอมพิวเตอร์ของคุณเสี่ยงต่อการถูกโจมตี เป็นการโจมตีในพื้นที่นั่นคือผู้โจมตีจำเป็นต้องเรียกใช้รหัสในเครื่องของคุณ แต่การโจมตีเหล่านี้อาจเกิดขึ้นได้เช่นผ่าน JavaScript ในเว็บเบราว์เซอร์
    หากคุณไม่มีวิธีอื่นคุณสามารถทำให้สิ่งนี้ถาวรโดยการเพิ่มnoibpbลงในบรรทัดคำสั่งเคอร์เนลจนกว่าคุณจะได้รับเคอร์เนลคงที่
  3. ใน Ubuntu คาดว่าจะมีการแก้ไขในสัปดาห์ที่ 23 เมษายน 2561สิ่งที่น่าจะเป็นเคอร์เนล 4.4.0-117 และ 4.13.0-39 ในขณะที่ไทเลอร์ฮิกส์ได้ตีพิมพ์เมล็ดทดสอบสำหรับ4.4และ4.13

ฉันวินิจฉัยปัญหาได้อย่างไร

ฉันพยายามหลายสิ่งหลายอย่าง (ดูคำถาม) และระบุว่าข้อผิดพลาดถูกเรียกที่ไหนสักแห่งระหว่างการเข้าถึงและการเข้าถึงbasic.target multi-user.targetดังนั้นฉันจึงตั้งค่าเริ่มต้น systemd เป้าหมายเป็นbasic.target( systemctl set-default basic.target) และเปิดใช้งานdebug-shellบริการ ( systemctl enable debug-shell) เพื่อรับรูตเชลล์

ฉันวิ่งsystemctl list-dependencies multi-user.targetและเริ่มการอ้างอิงที่ระบุไว้ทีละรายการ สิ่งนี้ไม่ทำให้เกิดการชน

ไม่บริการทั้งหมดที่มีการจัดการโดยตรงsystemd บางคนมีการจัดการเป็นพุ่งพรวดบริการและบางส่วนมีการจัดการเป็นสคริปต์ sysvinit เชลล์สคริปต์ด้านล่างใช้งานได้ทั้งหมด หมายเหตุ: ฉันทดสอบเพียงครั้งเดียวเท่านั้นและมันล้มเหลวด้วยการออกแบบ

#!/bin/sh
wants=$(systemctl show -p Wants multi-user.target | sed 's/^Wants=//' | tr ' ' '\n' | sort)
log=/var/tmp/multi-user-steps-$(date +%Y%m%d-%H%M%S)

log () {
  echo "$* ..." | tee -a "$log"
  sync
  "$@"
  ret=$?
  echo "$* -> $ret" | tee -a "$log"
  sync
  return $ret
}

# systemd services
for service in $wants; do
  log systemctl start $service
  sleep 2
done

# upstart services
for conf in /etc/init/*.conf; do
  service=${conf##*/}; service=${service%.conf}
  log service ${service} start
  sleep 2
done

# sysvinit services
for service in /etc/rc3.d/S*; do
  log ${service} start
  sleep 2
done

sssdคอมพิวเตอร์ของฉันล้มเหลวหลังจากที่เริ่มต้น จากนั้นการค้นหาเว็บบน“ sssd linux kernel hang” พาฉันไปที่https://bugs.launchpad.net/cloud-images/+bug/1746806และเพื่อการวินิจฉัยและการแก้ไข


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

3
@Tonny ไมโครโค้ดแก้ไขข้อบกพร่องอื่น ๆ เช่นนี้รวมถึงปัญหาที่ Intel ไม่เปิดเผย ในขณะที่มันเป็นวิธีการแก้ปัญหาฉันไม่สบายใจที่จะไม่ใช้การอัปเดตไมโครโค้ดยกเว้นว่า Spectre / Meltdown อันหนึ่งดูเหมือนว่าจะได้รับการรีบออกไปเล็กน้อย ฉันเสนอnoipbpส่วนใหญ่เป็นวิธีการบูตเข้าสู่ระบบที่มีผลกระทบ ฉันคิดว่าการแก้ไขที่ดีที่สุดที่นี่คือการอัพเกรดเคอร์เนล
Gilles

ฉันรู้และฉันเห็นด้วย แต่เมล็ดใหม่ยังไม่ได้อยู่ที่นี่และในขณะนี้ฉันชอบระบบที่ทำงานด้วยการบรรเทาผลกระทบส่วนใหญ่ (ยกเว้นไมโครโค้ด) ไปยังระบบที่มีไมโครโค้ด แต่ไม่มีซอฟต์แวร์บรรเทา (ซึ่งครอบคลุมมากกว่าไมโครโค้ด) เลย เกี่ยวกับการอัปเดตไมโครโค้ด: สำหรับ Skylakes ใหม่เหล่านี้ดูเหมือนว่าการแก้ไข Specter / Meltdown เป็นการอัปเดตไมโครโค้ดเพียงครั้งเดียวดังนั้นเราจึงไม่ควรพลาดอย่างมาก สำหรับ CPU รุ่นเก่ามันเป็นอีกเรื่องหนึ่ง มี errata ของ CPU จำนวนมากได้รับการแก้ไขด้วยการอัปเดตไมโครโค้ด และฉันก็คงจะไม่รังเกียจที่จะจากไป
Tonny
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.