Azure 이미징을 위한 Linux 준비

적용 대상: ✔️ Linux VM ✔️ 유연한 확장 집합

Azure 플랫폼 SLA(서비스 수준 계약)는 보증된 배포판 중 하나를 사용하는 경우에만 Linux 운영 체제를 실행하는 VM(가상 머신)에 적용됩니다. 보증 배포의 경우 Azure Marketplace 미리 구성된 Linux 이미지를 제공합니다. 자세한 내용은 다음을 참조하세요:

Azure 실행되는 다른 모든 배포판(커뮤니티 지원 배포 및 보증되지 않은 배포 포함)에는 몇 가지 필수 구성 요소가 있습니다.

이 문서에서는 Azure Linux 배포를 실행하기 위한 일반적인 지침에 중점을 둡니다. 모든 배포가 다르기 때문에 이 문서는 포괄적일 수 없습니다. 이 문서에서 설명하는 모든 조건을 충족하더라도 제대로 실행되도록 Linux 시스템을 크게 조정해야 할 수 있습니다.

일반 Linux 설치 참고 사항

  • Azure Hyper-V VHDX(가상 하드 디스크) 형식을 지원하지 않습니다. Azure는 고정 VHD만 지원합니다. Hyper-V Manager 또는 Convert-VHD cmdlet을 사용하여 디스크를 VHD 형식으로 변환할 수 있습니다. VirtualBox를 사용하는 경우 디스크를 만들 때 기본값(동적으로 할당됨)이 아닌 고정 크기를 선택합니다.

  • Azure Gen1(BIOS 부팅) 및 Gen2(UEFI 부팅) 가상 머신을 지원합니다.

  • 커널에서 VFAT(가상 파일 할당 테이블) 커널 모듈을 사용하도록 설정해야 합니다.

  • VHD에 허용되는 최대 크기는 1,023GB입니다.

  • Linux 시스템을 설치할 때는 LVM(논리 볼륨 관리자) 대신 표준 파티션을 사용하는 것이 좋습니다. LVM은 많은 설치의 기본값입니다.

    표준 파티션을 사용하면 특히 OS 디스크가 문제 해결을 위해 동일한 다른 VM에 연결된 경우 복제된 VM과 LVM 이름 충돌을 방지할 수 있습니다. 데이터 디스크에서 LVM 또는 RAID 를 사용할 수 있습니다.

  • UDF(사용자 정의 함수) 파일 시스템 탑재를 위한 커널 지원이 필요합니다. Azure 처음 부팅할 때 프로비저닝 구성은 게스트에 연결된 UDF 형식 미디어를 통해 Linux VM에 전달됩니다. Azure Linux 에이전트는 UDF 파일 시스템을 탑재하여 구성을 읽고 VM을 프로비전해야 합니다.

  • 2.6.37 이전의 Linux 커널 버전은 VM 크기가 더 큰 Hyper-V NUMA(Non-Uniform Memory Access)를 지원하지 않습니다. 이 문제는 주로 업스트림 Red Hat 2.6.32 커널을 사용하는 이전 배포에 영향을 줍니다. RHEL(Red Hat Enterprise Linux) 6.6(커널-2.6.32-504)에서 수정되었습니다.

    2.6.37보다 오래된 사용자 지정 커널 또는 2.6.32-504보다 오래된 RHEL 기반 커널을 실행하는 시스템은 numa=off의 커널 명령줄에서 부팅 매개 변수 를 설정해야 합니다. 자세한 내용은 Red Hat KB 436883을 참조하세요.

  • OS 디스크에서 스왑 파티션을 구성하지 마세요. 이 문서의 뒷부분에서 설명한 대로 임시 리소스 디스크에 스왑 파일을 만들도록 Linux 에이전트를 구성할 수 있습니다.

  • Azure 모든 VHD는 가상 크기가 1MB(1024 x 1024바이트)에 맞춰야 합니다. 원시 디스크에서 VHD로 변환하는 경우 이 문서의 뒷부분에 설명된 대로 변환하기 전에 원시 디스크 크기가 1MB의 배수인지 확인합니다.

  • 최신 배포 버전, 패키지 및 소프트웨어를 사용합니다.

  • 사용자 및 시스템 계정, 공개 키, 중요한 데이터, 불필요한 소프트웨어 및 애플리케이션을 제거합니다.

메모

Cloud-init 버전 21.2 이상은 UDF 요구 사항을 제거합니다. 그러나 모듈을 udf 사용하도록 설정하지 않으면 프로비전하는 동안 CD-ROM 탑재되지 않으므로 사용자 지정 데이터가 적용되지 않습니다. 해결 방법은 사용자 데이터를 적용하는 것입니다. 그러나 사용자 지정 데이터와 달리 사용자 데이터는 암호화되지 않습니다. 자세한 내용은 cloud-init 설명서의 사용자 데이터 형식 을 참조하세요.

Hyper-V 없이 커널 모듈 설치

Azure는 Hyper-V 하이퍼바이저에서 실행되므로 Linux가 Azure에서 실행되려면 특정 커널 모듈이 필요합니다. Hyper-V 외부에서 만든 VM이 있는 경우 VM이 Hyper-V 환경에서 실행 중임을 감지하지 않는 한 Linux 설치 관리자는 초기 RAM 디스크(initrd 또는 initramfs)에 Hyper-V 대한 드라이버를 포함하지 않을 수 있습니다.

다른 가상화 시스템(예: VirtualBox 또는 KVM)을 사용하여 Linux 이미지를 준비하는 경우, 초기 RAM 디스크에서 최소한 hv_vmbushv_storvsc 커널 모듈을 사용할 수 있도록 initrd를 다시 빌드해야 할 수 있습니다. 이 알려진 문제는 업스트림 Red Hat 배포를 기반으로 하는 시스템 및 기타 문제입니다.

initrd 또는 initramfs 이미지를 다시 빌드하는 메커니즘은 배포에 따라 달라질 수 있습니다. 적절한 절차에 대해서는 배포판의 설명서를 참조하거나 고객 지원팀에 문의하세요. 유틸리티를 사용하여 initrd를 다시 빌드하는 한 가지 예는 mkinitrd 다음과 같습니다.

  1. 기존 initrd 이미지를 백업합니다.

    cd /boot
    sudo cp initrd-`uname -r`.img  initrd-`uname -r`.img.bak
    
  2. hv_vmbushv_storvsc 커널 모듈을 사용하여 initrd를 다시 빌드합니다.

    sudo mkinitrd --preload=hv_storvsc --preload=hv_vmbus -v -f initrd-`uname -r`.img `uname -r`
    

VHD 크기 조정

Azure VHD 이미지는 가상 크기가 1MB에 맞춰야 합니다. 일반적으로 Hyper-V 통해 만든 VHD는 올바르게 정렬됩니다. VHD가 올바르게 정렬되지 않은 경우 VHD에서 이미지를 만들려고 할 때 다음 예제와 유사한 오류 메시지가 표시될 수 있습니다.

The VHD http://<mystorageaccount>.blob.core.windows.net/vhds/MyLinuxVM.vhd has an unsupported virtual size of 21475270656 bytes. The size must be a whole number (in MBs).

이 경우 Hyper-V Manager 콘솔 또는 Resize-VHD PowerShell cmdlet을 사용하여 VM의 크기를 조정합니다. Windows 환경에서 실행하지 않는 경우 qemu-img 사용하여(필요한 경우) VHD를 변환하고 크기를 조정하는 것이 좋습니다.

메모

QEMU 버전 2.2.1 및 일부 이후 버전의 qemu-img에 알려진 버그가 있어 형식이 올바르지 않은 VHD가 생성됩니다. 이 문제는 QEMU 2.6에서 해결되었습니다. 버전 2.2.0 이하를 사용하거나 버전 2.6 이상을 사용하는 것이 좋습니다.

  1. qemu-img 또는 vbox-manage 같은 도구를 사용하여 VHD 크기를 직접 조정하면 부팅할 수 없는 VHD가 될 수 있습니다. 먼저 다음 코드를 사용하여 VHD를 원시 디스크 이미지로 변환하는 것이 좋습니다.

    VM 이미지가 원시 디스크 이미지로 만들어진 경우 이 단계를 건너뛸 수 있습니다. VM 이미지를 원시 디스크 이미지로 만드는 것은 KVM과 같은 일부 하이퍼바이저에서 기본값입니다.

    sudo qemu-img convert -f vpc -O raw MyLinuxVM.vhd MyLinuxVM.raw
    
  2. 가상 크기가 1MB에 맞춰지도록 디스크 이미지의 필요한 크기를 계산합니다. 다음 Bash 셸 스크립트를 사용하여 qemu-img info 디스크 이미지의 가상 크기를 확인한 다음, 크기를 다음 1MB로 계산합니다.

    rawdisk="MyLinuxVM.raw"
    vhddisk="MyLinuxVM.vhd"
    
    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "$rawdisk" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    
    rounded_size=$(((($size+$MB-1)/$MB)*$MB))
    
    echo "Rounded Size = $rounded_size"
    
  3. 다음을 사용하여 $rounded_size원시 디스크의 크기를 조정합니다.

    sudo qemu-img resize MyLinuxVM.raw $rounded_size
    
  4. 원시 디스크를 고정 크기 VHD로 다시 변환합니다.

    sudo qemu-img convert -f raw -o subformat=fixed,force_size -O vpc MyLinuxVM.raw MyLinuxVM.vhd
    

    또는 2.6 이전의 QEMU 버전을 사용하여 다음 옵션을 제거합니다 force_size .

    sudo qemu-img convert -f raw -o subformat=fixed -O vpc MyLinuxVM.raw MyLinuxVM.vhd
    

Linux 커널 요구 사항

Hyper-V 및 Azure 위한 LIS(Linux Integration Services) 드라이버는 업스트림 Linux 커널에 직접 기여됩니다. 최근 Linux 커널 버전(예: 3.x)을 포함하는 많은 배포판에는 이러한 드라이버를 이미 사용할 수 있거나 이러한 드라이버의 백포트 버전에 커널을 제공합니다.

LIS 드라이버는 새로운 수정 및 기능으로 업스트림 커널에서 지속적으로 업데이트되고 있습니다. 가능하면 이러한 수정 및 업데이트를 포함하는 보증 배포 를 실행하는 것이 좋습니다.

RHEL 버전 6.0~6.3 계열을 실행 중인 경우 Hyper-V용 최신 LIS 드라이버를 설치해야 합니다. RHEL 6.4 이상(및 파생 항목)부터 LIS 드라이버는 커널에 이미 포함되어 있으므로 추가 설치 패키지가 필요하지 않습니다.

사용자 지정 커널이 필요한 경우 최근 커널 버전(예: 3.8 이상)을 사용하는 것이 좋습니다. 자체 커널을 유지하는 배포판 또는 공급업체의 경우 LIS 드라이버를 업스트림 커널에서 사용자 지정 커널로 정기적으로 백포트해야 합니다.

비교적 최근 커널 버전을 이미 실행 중인 경우에도 LIS 드라이버의 업스트림 수정 사항을 추적하고 필요에 따라 백포팅하는 것이 좋습니다. LIS 드라이버 원본 파일의 위치는 Linux 커널 원본 트리의 MAINTAINERS 파일에 지정됩니다.

    F:    arch/x86/include/asm/mshyperv.h
    F:    arch/x86/include/uapi/asm/hyperv.h
    F:    arch/x86/kernel/cpu/mshyperv.c
    F:    drivers/hid/hid-hyperv.c
    F:    drivers/hv/
    F:    drivers/input/serio/hyperv-keyboard.c
    F:    drivers/net/hyperv/
    F:    drivers/scsi/storvsc_drv.c
    F:    drivers/video/fbdev/hyperv_fb.c
    F:    include/linux/hyperv.h
    F:    tools/hv/

VM의 활성 커널에는 다음 패치가 포함되어야 합니다. 이 목록은 모든 배포에 대해 완료할 수 없습니다.

Azure Linux 에이전트

Azure Linux 에이전트(waagent)는 Azure Linux 가상 머신을 프로비전합니다. 최신 버전을 가져오거나 문제를 보고하거나 Linux 에이전트 GitHub 리포지토리 끌어오기 요청을 제출할 수 있습니다.

Azure Linux 에이전트를 사용하기 위한 몇 가지 고려 사항은 다음과 같습니다.

  • Linux 에이전트는 Apache 2.0 라이선스에 따라 릴리스됩니다. 많은 배포판은 이미 에이전트에 대한 .rpm 또는 .deb 패키지를 제공합니다. 이러한 패키지를 쉽게 설치하고 업데이트할 수 있습니다.
  • Azure Linux 에이전트에는 Python v2.6 이상이 필요합니다.
  • 에이전트에는 python-pyasn1 모듈이 추가로 필요합니다. 대부분의 배포판은 이 모듈을 설치할 별도의 패키지로 제공합니다.
  • 경우에 따라 Azure Linux 에이전트가 NetworkManager와 호환되지 않을 수 있습니다. 배포판에서 제공하는 많은 패키지(.rpm 또는 .deb)는 NetworkManager가 waagent 패키지와 충돌하도록 설정합니다. 이러한 경우 에이전트는 Linux 에이전트 패키지를 설치할 때 NetworkManager를 제거합니다.
  • Azure Linux 에이전트는 최소 지원 버전 이상이어야 합니다.

메모

udfvfat 모듈이 사용하도록 설정되어 있는지 확인합니다. 모듈을 udf 사용하지 않도록 설정하면 프로비저닝 오류가 발생합니다. 모듈을 vfat 사용하지 않도록 설정하면 프로비전 및 부팅 오류가 모두 발생합니다. Cloud-init 버전 21.2 이상은 두 조건이 모두 있는 경우 UDF를 요구하지 않고 VM을 프로비전할 수 있습니다.

  • 암호가 아닌 SSH 공개 키를 사용하여 VM을 만들었습니다.
  • 사용자 지정 데이터를 제공하지 않았습니다.

일반 Linux 시스템 요구 사항

  1. 다음 매개 변수를 포함하도록 GRUB 또는 GRUB2의 커널 부팅 줄을 수정하면 모든 콘솔 메시지가 첫 번째 직렬 포트로 전송됩니다. 이러한 메시지는 Azure에서 모든 문제를 디버그하는 데 도움이 될 수 있습니다.

    GRUB_CMDLINE_LINUX="rootdelay=300 console=ttyS0 earlyprintk=ttyS0 net.ifnames=0"
    

    또한 다음 매개 변수가 있는 경우 제거하는 것이 좋습니다.

    rhgb quiet crashkernel=auto
    

    그래픽 및 자동 부팅은 모든 로그를 직렬 포트로 보내려는 클라우드 환경에서는 유용하지 않습니다. 필요한 경우 구성된 옵션을 그대로 둘 crashkernel 수 있지만 이 매개 변수는 VM에서 사용 가능한 메모리의 양을 128MB 이상 줄입니다. 사용 가능한 메모리를 줄이면 더 작은 VM 크기에 문제가 있을 수 있습니다.

  2. /etc/default/grub 편집을 완료한 후 다음 명령을 실행하여 GRUB 구성을 다시 빌드합니다.

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  3. dracut 사용하여 initramfs에 대한 Hyper-V 모듈을 추가합니다.

    cd /boot
    sudo cp initramfs-<kernel-version>.img <kernel-version>.img.bak
    sudo dracut -f -v initramfs-<kernel-version>.img <kernel-version> --add-drivers "hv_vmbus hv_netvsc hv_storvsc"
    sudo grub-mkconfig -o /boot/grub/grub.cfg
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    

    mkinitramfs 사용하여 initrd용 Hyper-V 모듈을 추가합니다.

    cd /boot
    sudo cp initrd.img-<kernel-version>  initrd.img-<kernel-version>.bak
    sudo mkinitramfs -o initrd.img-<kernel-version> <kernel-version>  --with=hv_vmbus,hv_netvsc,hv_storvsc
    sudo update-grub
    
  4. SSH 서버가 설치되어 부팅 시 시작되도록 구성되어 있는지 확인합니다. 이 구성은 일반적으로 기본값입니다.

  5. Azure Linux 에이전트를 설치합니다.

    Azure Linux 에이전트는 Azure Linux 이미지를 프로비전하는 데 필요합니다. 많은 배포에서 에이전트를 .rpm 또는 .deb 패키지로 제공합니다. 패키지는 일반적으로 WALinuxAgent 또는 walinuxagent라고 합니다. Azure Linux 에이전트 가이드 단계를 수행하여 에이전트를 수동으로 설치할 수도 있습니다.

    메모

    udfvfat 모듈이 사용하도록 설정되어 있는지 확인합니다. 제거하거나 사용하지 않도록 설정하면 프로비전 또는 부팅 오류가 발생합니다. Cloud-init 버전 21.2 이상은 UDF 요구 사항을 제거합니다.

    다음 명령 중 하나를 실행하여 Azure Linux 에이전트, cloud-init 및 기타 필요한 유틸리티를 설치합니다.

    Red Hat 또는 CentOS에 대해 다음 명령을 사용합니다.

    sudo yum install -y WALinuxAgent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    Ubuntu/Debian에 대해 다음 명령을 사용합니다.

    sudo apt install walinuxagent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    SUSE에 대해 다음 명령을 사용합니다.

    sudo zypper install python-azure-agent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    그런 다음, 모든 배포에서 에이전트 및 cloud-init를 사용하도록 설정합니다.

    sudo systemctl enable waagent.service
    sudo systemctl enable cloud-init.service
    
  6. OS 디스크에 스왑 공간을 만들지 마세요.

    Azure Linux 에이전트 또는 cloud-init를 사용하여 로컬 리소스 디스크를 통해 스왑 공간을 구성할 수 있습니다. 이 리소스 디스크는 Azure 프로비전한 후 VM에 연결됩니다. 로컬 리소스 디스크는 임시 디스크이며 VM 프로비전 해제 시 비워질 수 있습니다. 다음 블록에서는 이 교환을 구성하는 방법을 보여 줍니다.

    Linux 에이전트를 Azure 선택하는 경우 /etc/waagent.conf 다음 매개 변수를 수정합니다.

    ResourceDisk.Format=y
    ResourceDisk.Filesystem=ext4
    ResourceDisk.MountPoint=/mnt/resource
    ResourceDisk.EnableSwap=y
    ResourceDisk.SwapSizeMB=2048    ## NOTE: Set this to your desired size.
    

    cloud-init를 선택하는 경우 프로비저닝을 처리하도록 cloud-init를 구성합니다.

    sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=cloud-init/g' /etc/waagent.conf
    sudo sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
    sudo sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
    

    cloud-init를 구성하여 스왑 공간의 형식을 지정하고 만들려면 다음 두 가지 옵션을 사용할 수 있습니다.

    • customdata를 통해 VM을 생성할 때마다 cloud-init 구성을 전달할 수 있습니다. 이 방법을 권장합니다.
    • 이미지에서 cloud-init 지시문을 사용하여 VM을 만들 때마다 스왑 공간을 구성합니다.

    cloud-init를 사용하여 스왑 공간을 구성하는 .cfg 파일을 만듭니다.

    echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' | sudo tee -a /etc/systemd/system.conf
    cat << EOF | sudo tee /etc/cloud/cloud.cfg.d/00-azure-swap.cfg
    #cloud-config
    # Generated by Azure cloud image build
    disk_setup:
      ephemeral0:
        table_type: mbr
        layout: [66, [33, 82]]
        overwrite: True
    fs_setup:
      - device: ephemeral0.1
        filesystem: ext4
      - device: ephemeral0.2
        filesystem: swap
    mounts:
      - ["ephemeral0.1", "/mnt/resource"]
      - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
    EOF
    
  7. 프로비저닝을 처리하도록 cloud-init를 구성합니다.

    1. cloud-init용 waagent 구성:

      sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=cloud-init/g' /etc/waagent.conf
      sudo sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
      sudo sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
      

      특정 가상 머신을 마이그레이션하고 일반화된 이미지를 만들지 않으려면 Provisioning.Agent=disabled 구성에서 설정합니다.

    2. 마운트 구성

      echo "Adding mounts and disk_setup to init stage"
      sudo sed -i '/ - mounts/d' /etc/cloud/cloud.cfg
      sudo sed -i '/ - disk_setup/d' /etc/cloud/cloud.cfg
      sudo sed -i '/cloud_init_modules/a\\ - mounts' /etc/cloud/cloud.cfg
      sudo sed -i '/cloud_init_modules/a\\ - disk_setup' /etc/cloud/cloud.cfg
      
      
    3. Azure 데이터 원본 구성

      echo "Allow only Azure datasource, disable fetching network setting via IMDS"
      cat << EOF | sudo tee /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg
      datasource_list: [ Azure ]
      datasource:
         Azure:
           apply_network_config: False
      EOF
      
    4. 구성한 경우 기존 스왑 파일을 제거합니다.

      if [[ -f /mnt/resource/swapfile ]]; then
      echo "Removing swapfile" #RHEL uses a swap file by default
      swapoff /mnt/resource/swapfile
      rm /mnt/resource/swapfile -f
      fi
      
    5. cloud-init 로깅 구성:

      echo "Add console log file"
      cat << EOF | sudo tee -a /etc/cloud/cloud.cfg.d/05_logging.cfg
      
      # This tells cloud-init to redirect its stdout and stderr to
      # 'tee -a /var/log/cloud-init-output.log' so the user can see output
      # there without needing to look on the console.
      output: {all: '| tee -a /var/log/cloud-init-output.log'}
      EOF
      
  8. 다음 명령을 실행하여 가상 머신의 프로비전을 해제합니다.

    Caution

    특정 가상 머신을 마이그레이션하고 일반화된 이미지를 만들지 않으려면 프로비전 해제 단계를 건너뜁니다. 명령을 waagent -force -deprovision+user 실행하면 원본 컴퓨터를 사용할 수 없게 됩니다. 이 단계는 일반화된 이미지를 만들기 위한 것입니다.

    sudo rm -f /var/log/waagent.log
    sudo cloud-init clean
    sudo waagent -force -deprovision+user
    sudo rm -f ~/.bash_history
    sudo export HISTSIZE=0
    

    VirtualBox에서 실행 waagent -force -deprovision 한 후 다음과 [Errno 5] Input/output error같은 오류 메시지가 표시될 수 있습니다. 이 오류 메시지는 중요하지 않으며 무시할 수 있습니다.

  9. 가상 머신을 종료한 다음 VHD를 Azure에 업로드합니다.

다음 단계

Azure CLI