최근에 사용한 회사 컴퓨터가 시작 시 충돌이 발생함

최근에 사용한 회사 컴퓨터가 시작 시 충돌이 발생함

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

  • 이것은 회사의 IT 부서에서 나에게 제공한 최신 컴퓨터입니다. 최신 Intel CPU(Skylake 세대)를 탑재하고 있습니다.
  • 컴퓨터는 Ubuntu 16.04를 실행합니다.
  • 마지막으로 컴퓨터가 제대로 부팅된 때는 3월이었습니다. 이 문제는 소프트웨어 업데이트나 하드웨어 오류로 인해 발생할 수 있습니다.
  • 나는 (내가 사용한) 거의 동일한 소프트웨어가 설치된 16.04를 실행하는 다른 컴퓨터를 가지고 apt-clone있으며 훌륭하게 작동합니다. 하드웨어가 다릅니다(amd64도 있지만 CPU, GPU 등이 다름).
  • 커널이 부팅되고 initrd가 제대로 작동합니다. 그래픽 모드에서 스플래시 화면으로 부팅하면 dm-crypt 볼륨의 비밀번호를 묻는 메시지가 표시되고 마지막으로 표시되는 것은 해당 볼륨이 성공적으로 설치되었다는 것입니다.
  • 로그인 프롬프트를 받기 전에 정지 현상이 발생합니다. 컴퓨터가 멈추는 것은 어려운 일입니다. Alt+ 응답 도 없습니다 SysRq. 팬이 최고 속도로 작동하고 있으므로 CPU는 분명히 100%입니다.
  • 재부팅하기 전에 실행 중이던 커널이 아직 남아 있습니다. Grub 메뉴에서 이 커널을 선택할 때 동일한 작동 중지가 발생했습니다. 따라서 이것은 다른 것에 의해 유발된 기존 커널 버그인 것처럼 보입니다. 하지만 무엇입니까?
  • 스플래시 화면을 끄면( Grub의 명령줄 splash에서 linux) 여러 서비스가 시작된 다음 작동이 중지됩니다.
  • init=/bin/shGrub의 명령줄에 추가하여 루트 쉘을 얻을 수 있습니다 linux. 추가하면 더 나아갈 수도 있어요

    systemd.unit=basic.target systemd.shell
    

    그러면 여러 서비스가 시작되고 tty9에서 루트 쉘이 실행됩니다.

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

따라서 이는 일부 소프트웨어에 의해 발생한 하드웨어 오류처럼 보입니다(한 컴퓨터에서는 발생하지만 다른 컴퓨터에서는 발생하지 않기 때문). 그런데 무슨 소프트웨어? 컴퓨터가 너무 멈춰서 로그를 얻을 수 없었습니다. 유용한 콘솔 출력도 얻을 수 없습니다.


유용한 디버깅 기술:

  • Alt+ SysRq:SysRq 매직 키를 사용하면 긴급 재시작과 같은 작업을 수행할 수 있습니다. 매우 낮은 수준에서 커널에 액세스하므로 가장 심각한 충돌을 제외하고는 모두 잘 작동합니다. 제 경우에는 Alt+가 SysRq응답하지 않아 충돌의 심각성을 나타냅니다.
  • Shift시작 매개변수를 수정하려면 전원을 켠 후 몇 초간 길게 누르세요. BIOS가 키보드를 초기화한 후 운영 체제가 시작되기 전에 이 키를 눌러야 합니다. 이것은 만든다애벌레메뉴가 나타납니다.
  • Grub 메뉴에서 eCommand Line을 눌러 메뉴 항목을 편집합니다. Linux 부팅 매개변수를 변경하려면 로 시작하는 줄로 이동합니다 linux. 최신 Ubuntu에서는 "Ubuntu용 고급 옵션"에서 이전 커널을 찾을 수 있습니다. 명령줄을 원하는 대로 변경한 후 Ctrl+ x시작을 누릅니다. 여기서 변경한 사항은 이번 실행에만 적용되며 디스크에 저장되지 않습니다.
  • 명령줄의 몇 가지 유용한 옵션은 다음과 같습니다 linux.
    • quiet nosplash거의 모든 시작 메시지를 숨깁니다. 문제를 진단하는 데 필요한 시작 중에 콘솔에 메시지를 표시하려면 이를 제거하십시오.
    • recovery서비스가 거의 없는 루트 셸을 제공합니다. 루트 비밀번호를 알아야 합니다. "복구 모드" 메뉴 항목이 이 기능을 사용합니다.
    • init=/bin/sh서비스가 전혀 없는 루트 셸을 제공합니다. 정상적인 시작을 재개하려면 를 실행하십시오 exec init. 이 시점에서 init 및 일부 서비스 시작과 같은 systemd 옵션을 전달할 수 있습니다 exec init --unit=basic.target(이것은 로그인 방법을 시작하지 않으므로 다른 콘솔에서 쉘을 실행하는 것이 더 좋습니다). 루트 파일 시스템은 읽기 전용으로 마운트되어 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. tty9로 전환하려면 Alt+를 누르세요 .F9
    • 당신은 또한 볼 수 있습니다Fedora 시스템 프롬프트,아치 리눅스 시작 문제 팁.

답변1

질문

내 문제는 (일부?) Skylake CPU의 최신 Intel 마이크로코드와 최신 Linux 커널 간의 알려진 문제인 것으로 밝혀졌습니다.SSD. 바라보다Ubuntu 버그 #1759920 "intel-microcode 3.20180312.0으로 인해 로그인 화면이 잠깁니다(linux-image-4.13.0-37-generic)."및 동일한 문제와 관련된 기타 여러 오류(예:Ubuntu 버그 #1746806 "sssd가 AWS c5 및 m5 인스턴스와 충돌하여 CPU 100%를 발생시키는 것으로 보입니다."그리고Ubuntu 버그 #1746418 "linux-image-4.13.0-32-generic을 설치한 후 Xorg를 시작할 때 시스템이 정지됩니다.". 다음과 같은 경우 이 오류가 발생할 수 있습니다.

  • 최신 Intel CPU를 사용하고 있습니다. 내가 아는 한 이 오류는 다음에서만 나타납니다.천호CPU.
  • 당신은인텔 마이크로코드패키지가 설치되었습니다. 테스트를 거친 이전 커널로 되돌리는 것은 이전 마이크로코드로만 해당 커널을 실행할 수 있기 때문에 작동하지 않습니다.
  • 사용자 인증을 위해 컴퓨터가 회사 네트워크(일반적으로 LDAP 또는 Active Directory)에 연결되어 있습니다. 오류를 발생시키는 다른 방법이 있지만 다음을 실행하세요.SSD가장 흔한 범인인 것 같습니다. 이라는 보고도 있다.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.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하나씩 나열된 종속성을 실행하고 수동으로 시작했습니다. 이로 인해 충돌이 발생하지 않았습니다.

모든 서비스가 직접 제공되는 것은 아닙니다.체계. 일부는 다음과 같이 관리됩니다.갑자기 나타나다서비스 중 일부는 다음과 같이 관리됩니다.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 kernelhang"에 대한 웹 검색을 통해 다음과 같은 결과를 얻었습니다.https://bugs.launchpad.net/cloud-images/+bug/1746806진단 및 솔루션.

관련 정보