다음을 통해 공유


Hyper-V 드라이버 관련 오류로 인한 Linux 가상 머신 부팅 및 네트워크 문제 해결

적용 대상: ✔️ Linux VM

Azure는 Hyper-V 하이퍼바이저에서 실행되고 Linux 시스템에는 특정 Hyper-V 커널 모듈이 Azure에서 실행되어야 합니다. 이러한 커널 모듈은 Hyper-V 및 Azure용 Linux LIS(Integration Services) 드라이버에 번들로 제공됩니다. Microsoft는 이를 업스트림 Linux 커널에 직접 제공합니다.

이 문서에서는 하나 이상의 비활성화된 Hyper-V 드라이버로 인해 Linux VM(가상 머신) 부팅 및 네트워킹 문제가 발생할 수 있는 여러 조건에 대해 설명합니다.

필수 조건

Linux VM에서 직렬 콘솔 이 활성화되고 작동하는지 확인합니다.

누락된 Hyper-V 드라이버 문제를 식별하는 방법

Hyper-V 드라이버 누락으로 인해 VM이 부팅되지 않는지 확인하려면 Azure CLI 또는 Azure Portal을 사용하여 부팅 진단 창 또는 직렬 콘솔 창에서 VM의 직렬 콘솔 로그를 확인합니다. 오류의 샘플 출력은 아래의 해당 섹션에 표시됩니다.

문제 해결 전

시나리오 1: 네트워크 Hyper-V 드라이버가 비활성화되고 시나리오 2: NIC mac 주소가 변경되거나 일치하지 않는 문제를 해결하려면 Linux VM에 대한 직렬 콘솔 액세스가 필요합니다.

직렬 콘솔 액세스 권한이 없는 경우 오프라인 접근 방식에 따라 복구 가상 머신에서 문제가 있는 OS 디스크의 내용에 액세스합니다. 오프라인 접근 방식에는 Azure CLI 또는 Azure Cloud Shell 에 액세스해야 합니다.

시나리오 3 문제 해결 : 다른 Hyper-V 드라이버를 사용할 수 없도록 설정하면 오프라인 접근 방식만 이 문제를 해결할 수 있습니다.

시나리오 1: 네트워크 Hyper-V 드라이버를 사용할 수 없습니다.

네트워킹 서비스를 사용할 수 없으므로 가상 머신에 대한 SSH(셸 프로토콜)를 보호할 수 없지만 Azure Portal에서 직렬 콘솔을 통해 로그인할 수 있습니다. Azure Portal의 부팅 진단 창에 직렬 콘솔 또는 최신 직렬 로그에 다음과 같은 유형의 오류가 표시됩니다.

 cloud-init[807]: Cloud-init v. 19.4 running 'init-local' at Tue, xx Aug 20XX 20:41:53 +0000. Up 5.83 seconds.
 cloud-init[807]: 20XX-08-XX 20:41:54,231 - stages.py[WARNING]: Failed to rename devices: [nic not present] Cannot rename mac=xx:xx:xx:xx:xx:xx to eth0, not available.
[  OK  ] Started Initial cloud-init job (pre-networking).
----
[FAILED] Failed to start LSB: Bring up/down networking.
See 'systemctl status network.service' for details.

또는

 cloud-init[799]: 2022-XX-XX 19:04:06,267 - azure.py[WARNING]: Interface not found for DHCP
 cloud-init[799]: 2022-XX-XX 19:04:07,269 - azure.py[WARNING]: Interface not found for DHCP
 cloud-init[799]: 2022-XX-XX 19:04:10,274 - azure.py[WARNING]: Interface not found for DHCP
 cloud-init[799]: 2022-XX-2XX 19:04:10,277 - azure.py[WARNING]: IMDS network metadata has incomplete configuration: None

솔루션 1: 직렬 콘솔을 사용하여 Hyper-V 네트워크 드라이버 사용

  1. VM의 직렬 콘솔에 액세스합니다. 네트워킹이 중단되었지만 로그인 프롬프트는 계속 사용할 수 있습니다.

  2. 올바른 자격 증명을 사용하여 VM에 로그인합니다.

  3. sudo 액세스 권한이 있는 루트 계정 또는 사용자 계정으로 전환합니다.

  4. /etc/modprobe.d 디렉터리로 이동하여 hv_netvsc 드라이버를 사용하지 않도록 설정하는 줄을 찾습니다.

    1. 다음 명령을 실행하여 hv_netvsc 드라이버 및 해당 줄 번호를 사용하지 않도록 설정하는 파일을 식별합니다.

      grep -nr "hv_netvsc" /etc/modprobe.d/
      
    2. 해당 파일을 수정하고 hv_netvsc 항목을 주석 처리하거나 삭제합니다.

      네트워크 드라이버를 사용하지 않도록 설정하는 데 사용할 수 있는 구성 파일 콘텐츠를 보여 주는 스크린샷

      vi /etc/modprobe.d/disable.conf
      

      참고 항목

      • 드라이버를 사용하지 않도록 설정하는 항목은 Microsoft가 아닌 Linux 운영 체제에 의해 정의됩니다.
      • hv_netvsc 드라이버를 사용할 수 없는 해당 파일 이름으로 바꿉 disable.conf 있습니다.
  5. 현재 로드된 커널에 대한 초기 RAMdisk 이미지를 다시 빌드합니다.

    • RHEL/SLES 기반 이미지의 경우

      # dracut -f -v
      
    • Ubuntu/Debian 기반 이미지의 경우

      # mkinitramfs -k -o /boot/initrd.img-$(uname -r)
      
  6. VM을 다시 부팅합니다.

필요한 경우 롤백을 용이하게 하려면 항상 원래 초기 RAMdisk 이미지의 백업을 수행합니다.

  • RHEL 기반 이미지의 경우:

    # cp /boot/initramfs-<kernelVersion>.img /boot/initramfs-<kernelVersion>.img.bak
    
  • SLES 기반 이미지의 경우:

    # cp /boot/initrd-<kernelVersion> /boot/initrd-<kernelVersion>.bak
    
  • Ubuntu/Debian 기반 이미지의 경우:

    # cp /boot/initrd.img-<kernelVersion> /boot/initrd.img-<kernelVersion>.bak
    

해결 방법 2: 오프라인에서 Hyper-V 네트워크 드라이버 사용

  1. az vm repair를 사용하여 복구 VM에서 영향을 받는 OS 디스크의 콘텐츠에 액세스합니다.

  2. chroot 지침에 따라 구조 VM에서 연결된 OS 디스크의 파일 시스템에 탑재하고 크로트합니다.

  3. 영향을 받는 OS 디스크의 콘텐츠에 액세스한 후 솔루션 1의 4단계와 5 단계를 수행합니다. 직렬 콘솔 을 사용하여 Hyper-V 네트워크 드라이버를 사용하도록 설정하여 드라이버를 다시 활성화하고 초기 RAMdisk 이미지를 다시 빌드합니다.

    초기 RAMdisk 이미지를 다시 작성하기 전에 크로트 환경으로 전환합니다. 이미지의 전체 경로를 제공해야 합니다.

  4. 변경 내용이 적용되면 원래 VM과 자동 OS 디스크 교환을 수행하고 명령을 사용하여 시스템을 다시 부팅합니다 az vm repair restore .

시나리오 2: NIC MAC 주소가 변경되거나 일치하지 않음

네트워크 인터페이스 카드 MAC 주소가 변경되거나 OS 구성 내에서 일치하지 않는 경우 네트워킹 서비스를 사용할 수 없기 때문에 VM에 SSH할 수 없습니다. Azure Portal에서 직렬 콘솔을 통해 로그인할 수 있습니다. 시나리오 1: 네트워크 Hyper-V 드라이버가 비활성화된 것과 유사한 오류가 표시됩니다.

Hyper-V 네트워크 드라이버를 사용하는 경우에도 문제가 계속되는 경우 다음 솔루션 중 하나를 사용하여 OS NIC 구성의 유효성을 검사하고 문제를 해결합니다.

해결 방법 1: 직렬 콘솔을 사용하여 NIC MAC 주소 불일치 해결

  1. VM의 직렬 콘솔에 액세스합니다. 네트워킹이 중단되었지만 로그인 프롬프트는 계속 사용할 수 있습니다.

  2. 올바른 자격 증명을 사용하여 VM에 로그인합니다.

  3. sudo 액세스 권한이 있는 루트 계정 또는 사용자 계정으로 전환합니다.

  4. /etc/cloud/cloud.cfg.d 디렉터리로 이동합니다.

  5. Linux 파트너 이미지가 사용되는 것을 고려하면 다음 파일을 열고 편집합니다.

    • RHEL 기반 배포의 경우 91-azure_datasource.cfg 입니다.
    • Debian 및 Ubuntu 기반 배포에 대한 90_dpkg.cfg 입니다.
  6. 매개 변수가 apply_network_config false로 설정된 경우 true로 설정합니다. 아무것도 지정하지 않으면 기본값이 true로 설정됩니다. 이 설정은 다음 재부팅 시 새 MAC 주소가 네트워킹 구성에 적용되도록 합니다.

  7. 일반적으로 NIC MAC 주소는 관리자가 NIC를 삭제하거나 추가하거나 백 엔드에서 NIC를 업데이트하는 경우에만 변경됩니다. cloud-init를 통한 네트워크 구성이 필요하지 apply_network_config 않고 매개 변수를 false로 설정해야 하는 경우 /var/lib/cloud/instance/obj.pkl 파일을 삭제하고 시스템을 다시 부팅합니다.

    # rm /var/lib/cloud/instance/obj.pkl
    
  8. 변경 내용이 적용되면 시스템을 다시 시작합니다.

해결 방법 2: 오프라인에서 NIC MAC 주소 불일치 수정

  1. az vm repair 명령을 사용하여 복구 가상 머신에서 영향을 받는 OS 디스크의 내용에 액세스합니다.
  2. chroot 지침에 따라 구조 VM에서 연결된 OS 디스크의 파일 시스템에 올바르게 탑재하고 크로트합니다.
  3. 영향을 받는 OS 디스크의 복사본 내용에 액세스한 후 솔루션 1의 4~7단계를 수행합니다. 직렬 콘솔을 사용하여 네트워킹을 변경하거나 obj.pkl 파일을 지우면 NIC MAC 주소 불일치를 수정합니다.
  4. 변경 내용이 적용되면 명령을 사용하여 az vm repair restore 원래 VM과 자동 OS 디스크 교환을 수행하고 시스템을 다시 부팅합니다.

시나리오 3: 다른 Hyper-V 드라이버를 사용할 수 없음

다른 Hyper-V 드라이버에 부팅 문제가 발생하는 경우 네트워킹 서비스를 사용할 수 없기 때문에 VM에 SSH할 수 없습니다. 압정 셸에 놓입니다. 이 문제는 Azure Portal에서 직렬 콘솔 을 통해 볼 수 있습니다. Azure Portal의 부팅 진단 창 내에서 직렬 콘솔 또는 최신 직렬 로그에서 다음 오류를 볼 수 있습니다.

 dracut-initqueue[455]: Warning: dracut-initqueue timeout - starting timeout scripts
 dracut-initqueue[455]: Warning: Could not boot.
         Starting Setup Virtual Console...
[  OK  ] Started Setup Virtual Console.
         Starting Dracut Emergency Shell...
Warning: /dev/mapper/rootvg-rootlv does not exist
Generating "/run/initramfs/rdsosreport.txt"
 
Entering emergency mode. Exit the shell to continue.
Type "journalctl" to view system logs.
You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot
after mounting them and attach it to a bug report.
dracut:/#

또는

Gave up waiting for root file system device.  Common problems:
 - Boot args (cat /proc/cmdline)
   - Check rootdelay= (did the system wait long enough?)
 - Missing modules (cat /proc/modules; ls /dev)
ALERT!  UUID=143c811b-9b9c-48f3-b0c8-040f6e65f50aa does not exist.  Dropping to a shell!


BusyBox v1.27.2 (Ubuntu 1:1.27.2-2ubuntu3.4) built-in shell (ash)
Enter 'help' for a list of built-in commands.

(initramfs)

해결 방법: Hyper-V 드라이버 사용

다른 Hyper-V 드라이버가 비활성화되어 VM에 액세스할 수 없는 경우 오프라인 접근 방식을 사용하여 initramfs를 로드할 수 없으므로 드라이버를 다시 사용하도록 설정합니다.

  1. az vm repair 명령을 사용하여 복구 가상 머신에서 문제가 있는 OS 디스크의 내용에 액세스합니다.

  2. 크로엇 지침에 따라 구조 VM에서 연결된 OS 디스크의 파일 시스템에 올바르게 탑재하고 크로트합니다.

  3. chroot 환경에서 /etc/modprobe.d 디렉터리로 이동하여 hv_utils, hv_vmbus, hv_storvsc 또는 hv_netvsc 드라이버를 사용하지 않도록 설정할 수 있는 줄을 찾습니다.

    1. 다음 명령을 실행하여 hv_utils, hv_vmbus, hv_storvsc 또는 hv_netvsc 드라이버와 해당 줄 번호를 사용하지 않도록 설정하는 파일을 식별합니다.

      egrep -nr "hv_utils|hv_vmbus|hv_storvsc|hv_netvsc" /etc/modprobe.d/
      
    2. 해당 파일을 수정하고 hv_utils, hv_vmbus, hv_storvsc 또는 hv_netvsc 항목을 주석으로 처리하거나 삭제합니다. 항목은 가장 일반적으로 다음(또는 둘 다)입니다.

      설치 옵션을 사용하여 커널 모듈/드라이버를 사용하지 않도록 설정하는 데 사용할 수 있는 구성 파일 콘텐츠를 보여 주는 스크린샷

      커널 모듈/드라이버를 사용하지 않도록 설정하는 데 사용할 수 있는 구성 파일 콘텐츠를 보여 주는 스크린샷

      vi /etc/modprobe.d/disable.conf
      

    Important

    • 드라이버를 사용하지 않도록 설정하는 항목은 Microsoft가 아닌 Linux 운영 체제에 의해 정의됩니다.
    • Hyper-V 드라이버를 사용할 수 없는 해당 파일 이름으로 바꿉 disable.conf 습니다.
  4. 현재 로드된 커널에 대한 초기 RAMdisk 이미지를 다시 빌드합니다.

    • RHEL/SLES 기반 이미지의 경우

      # dracut -f -v
      
    • Ubuntu/Debian 기반 이미지의 경우

      # mkinitramfs -k -o /boot/initrd.img-$(uname -r)
      
  5. 변경 내용이 적용되면 명령을 사용하여 az vm repair restore 원래 VM과 자동 OS 디스크 교환을 수행하고 시스템을 다시 부팅합니다.

필요한 경우 롤백을 용이하게 하려면 항상 원래 초기 RAMdisk 이미지의 백업을 수행합니다.

문제가 아직 해결되지 않으면 Azure Linux 가상 머신이 부팅에 실패하고 dracut 긴급 셸 을 입력하여 dracut 문제를 조사합니다.

다음 단계

특정 부팅 오류가 Hyper-V 문제가 아닌 경우 추가 문제 해결 옵션은 Azure Linux Virtual Machines 부팅 오류 문제를 참조하세요.

도움을 요청하십시오.

질문이 있거나 도움이 필요한 경우 지원 요청을 생성하거나Azure 커뮤니티 지원에 문의하세요. Azure 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.