Azure에서 이미징을 위한 Linux 준비

주의

이 문서에서는 EOL(수명 종료) 상태에 가까워진 Linux 배포판인 CentOS를 참조하세요. 이에 따라 사용 및 계획을 고려하세요. 자세한 내용은 CentOS 수명 종료 지침을 참조 하세요.

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

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

커뮤니티에서 지원되는 배포판과 보증되지 않은 배포판을 포함하여 Azure에서 실행되는 다른 모든 배포판에는 몇 가지 사전 요구 사항이 있습니다.

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

일반 Linux 설치 참고 사항

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

  • Azure는 1세대(BIOS 부팅) 및 2세대(UEFI 부팅) 가상 머신을 지원합니다.

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

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

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

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

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

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

    2.6.37보다 오래된 사용자 지정 커널 또는 2.6.32-504보다 오래된 RHEL 기반 커널을 실행하는 시스템의 경우 grub.conf의 커널 명령줄에서 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 이미지를 다시 빌드하는 메커니즘은 배포에 따라 달라질 수 있습니다. 적절한 절차에 대해서는 배포판의 설명서를 참조하거나 고객 지원팀에 문의하세요. 다음은 mkinitrd 유틸리티를 사용하여 initrd를 다시 빌드하는 예제입니다.

  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 관리자 콘솔 또는 Resize-VHD PowerShell cmdlet을 사용하여 VM 크기를 조정합니다. Windows 환경에서 실행하지 않는 경우 qemu-img를 사용하여 VHD를 변환하고(필요한 경우) 크기를 조정하는 것이 좋습니다.

참고 항목

QEMU 버전 2.2.1 이상의 경우 VHD 형식이 잘못 지정되는 qemu-img의 알려진 버그가 있습니다. 이 문제는 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 통합 서비스) 드라이버는 업스트림 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)는 waagent 패키지와 충돌하도록 NetworkManager를 구성합니다. 이러한 경우 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의 프로비전을 해제할 때 비울 수 있습니다. 다음 블록은 이 스왑을 구성하는 방법을 보여줍니다.

    Azure Linux 에이전트를 선택한 경우 /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-auto/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 파일을 만듭니다.

    sudo echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' >> /etc/systemd/system.conf
    sudo cat > /etc/cloud/cloud.cfg.d/00-azure-swap.cfg << EOF
    #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
      

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

    2. 탑재 구성

      sudo 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 데이터 원본 구성

      sudo echo "Allow only Azure datasource, disable fetching network setting via IMDS"
      sudo cat > /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg <<EOF
      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 로깅 구성

      sudo echo "Add console log file"
      sudo cat >> /etc/cloud/cloud.cfg.d/05_logging.cfg <<EOF
      
      # 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. 다음 명령을 실행하여 가상 머신의 프로비전을 해제합니다.

    주의

    특정 가상 머신을 마이그레이션하고 일반화된 이미지를 만들지 않으려면 프로비전 해제 단계를 건너뜁니다. 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. 가상 머신을 종료하고 Azure에 VHD를 업로드합니다.

다음 단계

Azure CLI를 사용하여 사용자 지정 디스크에서 Linux VM 만들기