최근 회사 컴퓨터에서 시작하는 동안 충돌이 발생합니다


63

최근 업데이트 후 컴퓨터가 더 이상 부팅되지 않습니다! 내가 결정할 수있는 것은 다음과 같습니다.

  • 이것은 회사 IT에서 제공 한 최신 컴퓨터입니다. 최신 Intel CPU (Skylake 생성)가 있습니다.
  • 컴퓨터는 Ubuntu 16.04를 실행합니다.
  • 3 월에 컴퓨터가 마지막으로 올바르게 부팅되었습니다. 소프트웨어 업데이트 나 하드웨어 버그로 인해 문제가 발생했을 수 있습니다.
  • 16.04를 실행하는 다른 컴퓨터에 거의 동일한 소프트웨어가 설치되어 있으며 (사용했습니다 apt-clone) 제대로 작동합니다. 그것은 다른 하드웨어 (또한 amd64, 그러나 다른 CPU, 다른 GPU 등)를 가지고 있습니다.
  • 커널이 시작되고 initrd가 올바르게 작동합니다. 그래픽 모드에서 스플래시 화면으로 부팅하면 dm-crypt 볼륨의 암호를 묻는 메시지가 표시되며 마지막으로 표시되는 것은 성공적으로 마운트 된 것입니다.
  • 로그인 프롬프트가 표시되기 전에 중단이 발생합니다. 컴퓨터가 멈 추면 하드 멈춤입니다. Alt+ 조차도 SysRq응답하지 않습니다. 팬이 완전히 폭발하기 때문에 CPU가 100 %로 멈췄습니다.
  • 재부팅하기 전에 여전히 실행중인 커널이 있습니다. Grub 메뉴에서이 커널을 선택하면 동일한 잠금이 발생합니다. 이것은 기존 커널 커널 버그로 보이는데 다른 어떤 것에 의해 발생합니다.
  • 스플래시 화면을 끄면 ( Grub splashlinux명령 줄에서 제거 ) 여러 서비스가 시작된 후 잠 깁니다.
  • Grub init=/bin/shlinux명령 행에 추가 하여 루트 쉘을 얻을 수 있습니다 . 나는 추가하여 더 얻을 수 있습니다

    systemd.unit=basic.target systemd.shell
    

    이것은 많은 서비스를 시작하고 tty9에서 루트 쉘을 실행합니다.

  • systemctl start multi-user.target해당 루트 셸에서 실행 하면 컴퓨터가 잠 깁니다. 따라서 이러한 서비스 중 하나에 의해 문제가 발생했을 수 있습니다.
  • 나는 실행 systemctl list-dependencies multi-user.target서비스를 시작하는 것을 볼 수 있습니다. 나열된 종속성을 하나씩 수동으로 시작했으며 모든 것이 잘 시작되었습니다.

따라서 이것은 일부 소프트웨어에 의해 트리거되는 하드웨어 버그 (하나의 컴퓨터에서는 발생하지만 다른 컴퓨터에서는 발생하지 않기 때문에)처럼 보입니다. 그러나 어떤 소프트웨어? 컴퓨터가 너무 세게 잠기므로 로그를 얻을 수 없습니다. 유용한 콘솔 출력도 얻을 수 없습니다.


유용한 디버깅 기술 :

  • Alt+ SysRq: magic SysRq key . 비상 재부팅과 같은 작업을 수행 할 수 있습니다. 커널은 매우 낮은 수준으로 커널에 액세스하므로 최악의 충돌을 제외하고는 모두 작동합니다. 제 경우에는 Alt+ SysRq가 응답하지 않아 충돌이 얼마나 깊이 진행되는지 보여줍니다.
  • 부팅 매개 변수를 수정하려면 Shift전원을 켠 후 몇 초 동안 길게 누릅니다 . BIOS가 키보드를 초기화 한 후, 운영 체제를 부팅하기 전에이 키를 눌러야합니다. 이것은 만드는 삼류의 메뉴가 나타납니다.
  • Grub 메뉴에서을 눌러 e메뉴 항목의 명령 줄을 편집합니다. Linux 부팅 매개 변수를 변경하려면로 시작하는 행으로 이동하십시오 linux. 현대 우분투에서는“우분투 고급 옵션”에 오래된 커널이 있습니다. 명령 행을 원하는대로 변경했으면 Ctrl+ x를 눌러 부팅하십시오. 여기서 변경 한 내용은이 부팅에만 적용되며 디스크에는 저장되지 않습니다.
  • linux명령 행 에 유용한 옵션이 있습니다 .
    • quiet nosplash거의 모든 부팅 메시지를 숨 깁니다. 부팅 중에 콘솔에 메시지를 표시하려면 메시지를 제거하십시오. 문제를 진단 할 가능성이 있습니다.
    • recovery서비스가 거의없는 루트 셸을 제공합니다. 루트 비밀번호를 알아야합니다. "복구 모드"메뉴 항목이이를 사용합니다.
    • init=/bin/sh서비스가 전혀없는 루트 쉘을 제공합니다. 정상 부팅을 재개하려면을 실행하십시오 exec init. 이 시점에서 시스템화 된 옵션을 전달할 수 있습니다. 예 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.targetGUI가없는 서버)를 실행하십시오.
    • systemd.debug-shelltty9에서 루트 쉘을 시작합니다. systemctl enable debug-shell루트 프롬프트에서 실행 하여 모든 부팅에 대해이를 활성화 할 수 있습니다 . 의 문제를 해결 한 후에는이 기능을 비활성화하십시오 systemctl disable debug-shell. Alt+ F9를 눌러 tty9로 전환하십시오.
    • Fedora 시스템 팁 , Arch Linux 부팅 문제 팁을 참조하십시오 .

답변:


71

문제

내 문제는 최신 Intel microcode on (일부?) Skylake CPU와 최신 Linux 커널 사이의 알려진 문제이며 주로 sssd 에 의해 발생합니다 . 참조 우분투 버그 # 1759920 "의 (/ 리눅스 이미지 4.13.0-37 제네릭 W) 로그인 화면에 고정을 야기 3.20180312.0 인텔 - 마이크로" 같은 문제에 대한 것으로, 또한 판명 다른 버그의 번호를 Ubuntu 버그 # 1746806 과 같은 "sssd는 AWS c5 및 m5 인스턴스와 충돌하여 100 % CPU를 발생시키는 것으로 보입니다"Ubuntu 버그 # 1746418 "linux-image-4.13.0-32-generic을 설치 한 후 Xorg를 시작할 때 시스템이 정지됨"과 같은 문제가 있습니다. 다음과 같은 경우이 버그가 발생할 수 있습니다.

  • 최신 Intel CPU가 있습니다. 내가 알 수있는 한,이 버그는 Skylake CPU 에서만 발생 합니다.
  • 당신은이 인텔 - 마이크로 패키지가 설치되어 있어야합니다. 이전의 마이크로 코드로만 커널을 실행했기 때문에 테스트 된 커널로 되돌아 가면 효과가 없었습니다.
  • 컴퓨터가 사용자 인증을 위해 회사 네트워크 (일반적으로 LDAP 또는 Active Directory)에 연결되어 있습니다. 버그를 발생시키는 다른 방법이 있지만 sssd를 실행 하는 것이 가장 일반적인 원인 인 것 같습니다. Xorg 충돌에 대한 보고서도 있습니다 .

이 버그는 2018 년 1 월에 발표 된 스펙터 보안 문제에 대한 완화로 인한 것 입니다. 특정 상황에서 잠금을 발생시키는 일부 커널 코드와 일부 프로세서 마이크로 코드가 호환되지 않습니다 .

수리하는 방법

  1. 정상적으로 부팅 할 수 없다면 Grub 프롬프트에서 커널 명령 줄을 편집해야합니다. 루트 쉘을 얻는 방법과 가능한 방법은 질문을 참조하십시오.
  2. 이 특정 버그의 해결 방법 noibpb매개 변수를 커널 명령 줄 ( 1746418/14 , 1759920/56 )에 추가하는 것입니다. 이렇게하면 정상적으로 부팅하고 복구를 수행 할 수 있습니다.
    이렇게하면 문제를 일으키는 취약점 완화가 비활성화되어 컴퓨터가 일부 공격에 취약 해집니다. 로컬 공격입니다. 즉 공격자가 컴퓨터에서 코드를 실행해야하지만 이러한 공격은 웹 브라우저의 JavaScript를 통해 수행 될 수 있습니다.
    다른 방법이 noibpb없다면 고정 커널을 얻을 수있을 때까지 커널 명령 행 에 추가 하여 이를 영구적으로 만들 수 있습니다.
  3. 우분투에서는 2018 년 4 월 23 일 주에 커널 4.4.0-117 및 4.13.0-39로 수정 될 예정입니다. 그 동안 Tyler Hicks는 4.44.13 테스트 커널발표했습니다 .

문제를 진단하는 방법

나는 몇 가지를 시도하고 (질문을 보아라) 버그가 도달 basic.target하고 도달하는 사이 어딘가에 발생했다고 결정했다 multi-user.target. 따라서 기본 시스템 대상을 basic.target( systemctl set-default basic.target)으로 설정하고 debug-shell서비스 ( systemctl enable debug-shell)를 활성화하여 루트 셸을 얻었습니다.

systemctl list-dependencies multi-user.target나열된 종속성을 하나씩 수동으로 실행 하고 시작했습니다. 이것은 충돌을 유발하지 않았습니다.

모든 서비스가 systemd에 의해 직접 관리되는 것은 아닙니다 . 일부는 Upstart 서비스로 관리되고 일부는 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 및 진단 및 솔루션으로 연결되었습니다.


나는 이것도 만났다. 인텔-마이크로 코드 패키지를 제거하고 다시 설치되지 않도록 적절한 블랙리스트에 올렸습니다. 문제를 일으키는 마이크로 코드는 CPU에 영구적으로 추가되지 않습니다. 매번 다시로드됩니다. 따라서로드하지 않으면 해결 방법으로도 작동합니다. 이 경우 noipbp가 필요하지 않으며 여전히 완화 조치를 취할 수 있습니다. 필자의 경우이 시스템은 회사 프록시 서버의 추가 보호없이 인터넷에 직접 연결되어 있기 때문에 필연적입니다.
Tonny

3
마이크로 코드는 다른 같은 버그 수정 @Tonny 인텔이 공개되지 않습니다뿐만 아니라 문제. 실제로 솔루션이지만 마이크로 코드 업데이트를 적용하지 않는 것은 불안합니다. Spectre / Meltdown 업데이트는 약간 돌진 된 것 같습니다. 나는 noipbp주로 영향을받는 시스템으로 부팅하는 방법으로 제안 하고 있습니다. 여기서 가장 좋은 해결책은 커널을 업그레이드하는 것입니다.
Gilles

알고 동의합니다. 그러나 새로운 커널은 아직 여기에 있지 않았으며 당분간 마이크로 코드가있는 시스템에 대한 대부분의 완화 (마이크로 코드 제외)가 가능한 작업 시스템을 선호하지만 소프트웨어 완화 (마이크로 코드 이상을 포함하지 않음)는 전혀 없습니다. 마이크로 코드 업데이트와 관련하여 :이 새로운 Skylakes의 경우 Spectre / Meltdown 픽스가 지금까지 유일한 마이크로 코드 업데이트 인 것 같습니다. 구형 CPU의 경우 또 다른 문제입니다. 마이크로 코드 업데이트로 수정 된 CPU 정오표가 많이 있습니다. 그리고 나는 그것들 없이는 정말 싫어합니다.
Tonny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.