コミュニティでサポートされているディストリビューションと承認されていないものに関する情報

適用対象: ✔️ Linux VM ✔️ フレキシブルなスケール セット

Azure プラットフォームの SLA は、動作保証済みディストリビューションのいずれか 1 つを使用した場合にのみ、Linux OS を実行する仮想マシンに適用されます。 このような動作保証済みディストリビューションの場合、事前構成済みの Linux イメージが Azure Marketplace で提供されています。

Azure で実行されている他のすべて (Azure Marketplace 以外) のディストリビューションには、さまざまな前提条件があります。 ディストリビューションはそれぞれ異なるため、この記事ですべてを網羅することはできません。 次のすべての条件を満たしていても、正常動作を実現するために、Linux システムを微調整する必要が生じる場合があります。

この記事では、Azure 上で Linux ディストリビューションを実行するための一般的なガイダンスについて、重点的に説明します。

Linux のインストールに関する一般的な注記

  1. Hyper-V 仮想ハード ディスク (VHDX) 形式は Azure ではサポートされていません。サポートされているのは 固定 VHD のみです。 Hyper-V マネージャーまたは Convert-VHD コマンドレットを使用して、ディスクを VHD 形式に変換できます。 VirtualBox を使用する場合は、ディスクの作成時に、既定 (動的に割り当てられるサイズ) ではなく、固定サイズを選択します。

  2. Azure では、Gen1 (BIOS ブート) および Gen2 (UEFI ブート) 仮想マシンがサポートされています。

  3. VHD のサイズの上限は、1,023 GB です。

  4. Linux システムをインストールする場合は、Logical Volume Manager (LVM) (多くのインストールで既定) ではなく標準パーティションを使用することをお勧めします。 標準パーティションを使用することにより、特に OS ディスクをトラブルシューティングのために別の同じ VM に接続する場合に、LVM 名と複製された VM の競合が回避されます。 LVM または RAID をデータ ディスク上で使用できます。

  5. UDF ファイル システムをマウントするためのカーネル サポートが必要です。 Azure での最初の起動時に、ゲストに接続されている UDF でフォーマットされたメディアを使用して、プロビジョニング構成が Linux VM に渡されます。 Azure Linux エージェントは、その構成を読み取り、VM をプロビジョニングする UDF ファイル システムをマウントする必要があります。

  6. 2\.6.37 未満の Linux カーネル バージョンは、HYPER-V で大きい VM サイズの NUMA をサポートできません。 この問題は、主に、アップストリームの Red Hat 2.6.32 カーネルを使用した古いディストリビューションに影響し、Red Hat Enterprise Linux (RHEL) 6.6 (kernel-2.6.32-504) で修正されました。 2\.6.37 より古いカスタム カーネルまたは2.6.32-504 より古い RHEL ベースのカーネルを実行しているシステムでは、grub.conf のカーネル コマンドラインで、ブート パラメーター numa=off を設定する必要があります。 詳細については、Red Hat KB 436883 を参照してください。

  7. OS ディスクにスワップ パーティションを構成しないでください。 次の手順で説明するように、Linux エージェントは、一時的なリソース ディスク上にスワップ ファイルを作成するよう構成できます。

  8. Azure の VHD の仮想サイズはすべて、1 MB (1024 × 1024 バイト) にアラインメントさせる必要があります。 次の手順で説明するように、未フォーマット ディスクから VHD に変換するときに、変換する前の未フォーマット ディスクのサイズが 1 MB の倍数であることを確認する必要があります。

  9. 最新の配布バージョン、パッケージ、およびソフトウェアを使用します。

  10. ユーザーとシステム アカウント、公開キー、機密データ、不要なソフトウェアとアプリケーションを削除します。

Hyper-V を使用しないカーネル モジュールのインストール

Azure は、Hyper-V ハイパーバイザーで実行されるため、Linux で Azure を実行するには特定のカーネル モジュールが必要です。 Hyper-V 以外で作成された VM を所有している場合、Linux インストーラーは、Linux が Hyper-V 環境で実行されていることを VM が検出しない限り、初期 RAM ディスク (initrd または initramfs) に Hyper-V 用のドライバーを含まない場合があります。 別の仮想化システム (VirtualBox、KVM など) を使用して Linux イメージを準備する場合は、少なくとも hv_vmbus と hv_storvsc のカーネル モジュールを初期 RAM ディスクで使用できるように initrd の再構築が必要になる場合があります。 これは、アップ ストリームの Red Hat ディストリビューションに基づくシステムの既知の問題ですが、その他のシステムでも発生する可能性があります。

initrd または initramfs イメージの再構築のためのメカニズムは、ディストリビューションによって異なる場合があります。 適切な手順については、使用しているディストリビューションのドキュメントまたはサポートを参照してください。 次は、 mkinitrd ユーティリティを使用して initrd を再構築する 1 つの例です。

  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 イメージは、1 MB に整列された仮想サイズが必要です。 通常、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 コマンドレットを使用して、VM のサイズを変更できます。 Windows 環境で実行していない場合は、qemu-img を使用して変換し (必要な場合)、VHD のサイズを変更することをお勧めします。

Note

qemu-img のバージョン 2.2.1 以降には VHD が適切にフォーマットされないというバグがあることがわかっています。 この問題は QEMU 2.6 で修正されています。 バージョン 2.2.0 以前またはバージョン 2.6 以降のいずれかの qemu-img を使用することをお勧めします。

  1. qemu-imgvbox-manage などのツールを使用して直接 VHD のサイズを変更すると、VHD が起動できなくなる可能性があります。 最初に VHD を RAW ディスク イメージに変換することをお勧めします。 VM イメージを RAW ディスク イメージとして作成した場合は (KVM などの一部のハイパーバイザーでは既定)、この手順を省略できます。

    qemu-img convert -f vpc -O raw MyLinuxVM.vhd MyLinuxVM.raw
    
  2. 仮想サイズが 1 MB に整列されるように、ディスク イメージの必要なサイズを計算します。 次の Bash シェル スクリプトは qemu-img info を使用してディスク イメージの仮想サイズを決定し、次の 1 MB までサイズを計算します。

    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 を使用して RAW ディスクのサイズを変更します。

    qemu-img resize MyLinuxVM.raw $rounded_size
    
  4. 次に、RAW ディスク を固定サイズの VHD に変換します。

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

    または、2.6 より前の qemu バージョンでは、force_size オプションを削除します。

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

Linux カーネルの要件

Hyper-V および Azure 用の Linux Integration Services (LIS) ドライバーは、アップストリームの Linux カーネルに直接提供されています。 最新の Linux カーネル バージョン (3.x など) を含む多くのディストリビューションでこれらのドライバーが含まれています。含まれていない場合は、これらのドライバーのバックポートされたバージョンがカーネルと共に提供されます。 これらのドライバーは、アップストリームのカーネル内で新しい修正と機能を含んだ形で常に更新されているため、可能な場合は、これらの修正と更新を含む動作保証済みディストリビューションを実行することをお勧めします。

Red Hat Enterprise Linux バージョン 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/

カーネルには次の修正プログラムを含める必要があります。 この一覧はすべてのディストリビューションを完全に網羅するものではありません。

Azure Linux エージェント

Azure Linux エージェントwaagent は Azure で Linux 仮想マシンをプロビジョニングします。 Linux Agent GitHub リポジトリで、最新バージョンの取得、問題の報告、pull request の提出が行うことができます。

  • Linux エージェントは、Apache 2.0 ライセンス下でリリースされています。 数多くのディストリビューションでは、このエージェント用の RPM パッケージや .deb パッケージを既に提供しているため、これらのパッケージを簡単にインストールし、更新できます。
  • Azure Linux エージェントには、Python v2.6 以上が必要です。
  • このエージェントでは、python-pyasn1 モジュールも必要です。 ほとんどのディストリビューションでは、インストール可能な個別のパッケージとしてこのモジュールを提供しています。
  • Azure Linux エージェントは NetworkManager と互換性がない場合があります。 ディストリビューションによって提供される RPM/deb パッケージの多くは、waagent パッケージに対する競合として NetworkManager を構成します。 このような場合、Linux エージェント パッケージをインストールすると NetworkManager はアンインストールされます。
  • Azure Linux エージェントは、サポートされている最小バージョン以上である必要があります。

Note

'udf' モジュールと 'vfat' モジュールが有効になっていることを確認してください。 UDF モジュールを無効にすると、プロビジョニング エラーが発生します。 VFAT モジュールを無効にすると、プロビジョニング エラーと起動エラーの両方が発生します。 Cloud-init 21.2 以降では、1) VM がパスワードではなく SSH 公開キーを使用して作成され、2) カスタム データが指定されていない場合に、UDF 不要で VM をプロビジョニングできます。

Linux システムの一般的な要件

  1. GRUB または GRUB2 のカーネル ブート ラインを変更して次のパラメーターを含め、すべてのコンソール メッセージが最初のシリアル ポートに送信されるようにします。 これらのメッセージは、Azure Support での問題のデバッグに役立ちます。

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

    また、次のパラメーターがある場合、それらを削除することをお勧めします。

    rhgb quiet crashkernel=auto
    

    クラウド環境では、すべてのログをシリアル ポートに送信するため、グラフィカル ブートおよびクワイエット ブートは役立ちません。 必要に応じて crashkernel オプションは構成したままにすることができますが、このパラメーターにより、VM 内の使用可能なメモリ量が 128 MB 以上減少するため、比較的小さなサイズの VM では問題となる可能性がある点に注意してください。

  2. /etc/default/grub の編集を終了したら、次のコマンドを実行して GRUB 構成をリビルドします。

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  3. initrd と initramfs 命令 (Dracut) の両方に Hyper-V モジュールを追加します。

  4. initrd または initramfs をリビルドします。Initramfs

    cp /boot/initramfs-$(uname -r).img /boot/initramfs-[latest kernel version ].img.bak 
    dracut -f -v /boot/initramfs-[latest kernel version ].img  [depending on the version of grub] 
    grub-mkconfig -o /boot/grub/grub.cfg 
    grub2-mkconfig -o /boot/grub2/grub.cfg 
    

    Initrd

    mv /boot/[initrd kernel] /boot/[initrd kernel]-old 
    mkinitrd /boot/initrd.img-[initrd kernel]-generic /boot/[initrd kernel]-generic-old 
    update-initramfs -c -k [initrd kernel] 
    update-grub 
    
  5. SSH サーバーがインストールされており、起動時に開始するように構成されていることを確認します。 この構成が通常の既定です。

  6. Azure Linux エージェントをインストールします。 Azure Linux エージェントは、Azure で Linux イメージをプロビジョニングするために必要です。 多くのディストリビューションでは、このエージェントを RPM または .deb パッケージとして提供しています (パッケージは、通常 WALinuxAgent または walinuxagent と呼ばれます)。 このエージェントは、 Linux エージェント ガイドの手順に従って手動でもインストールできます。

    次のコマンドを実行して、Azure Linux エージェント、cloud-init、その他の必要なユーティリティをインストールします。

    Redhat/Centos

    sudo yum install -y [waagent] 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
    
  7. OS ディスクにスワップ領域を作成しないでください。 Azure Linux エージェントは、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.
    
  8. プロビジョニングを処理するように cloud-init を構成します。

    1. cloud-init に対して waagent を構成します。
      sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=cloud-init/g' /etc/waagent.conf
      sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
      sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
      
      特定の仮想マシンを移行する際に、一般化されたイメージを作成しない場合は、/etc/waagent.conf 構成に Provisioning.Agent=disabled を設定します。
    2. マウントを構成します。
      echo "Adding mounts and disk_setup to init stage"
      sed -i '/ - mounts/d' /etc/cloud/cloud.cfg
      sed -i '/ - disk_setup/d' /etc/cloud/cloud.cfg
      sed -i '/cloud_init_modules/a\\ - mounts' /etc/cloud/cloud.cfg
      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 > /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg <<EOF
      datasource_list: [ Azure ]
      datasource:
         Azure:
           apply_network_config: False
      EOF
      
    4. 既存の swapfile が構成されている場合は削除します。
      if [[ -f /mnt/resource/swapfile ]]; then
      echo "Removing swapfile" #RHEL uses a swapfile by defaul
      swapoff /mnt/resource/swapfile
      rm /mnt/resource/swapfile -f
      fi
      
  9. cloud-init のログを構成します。

    echo "Add console log file"
    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
    
  10. スワップの構成。 オペレーティング システム ディスクにスワップ領域を作成しないでください。 以前は、Azure に仮想マシンがプロビジョニングされた後、仮想マシンに接続されたローカル リソース ディスクを使用して、Azure Linux エージェントによってスワップ領域が自動的に構成されました。 しかし、これは cloud-init によって処理されるようになったので、リソース ディスクをフォーマットしたり、スワップ ファイルを作成したりするために Linux エージェントを使用しないでください。/etc/waagent.conf で次のパラメーターを適切に変更します。

    ResourceDisk.Format=n
    ResourceDisk.EnableSwap=n
    

    スワップのマウント、フォーマット、および作成を行う場合は、次のいずれかを実行できます: 1. VM を作成するたびに、customdata を介して cloud-init 構成としてこれを渡します。 これが推奨される方法です。 2. VM が作成されるたびにこれを実行する、イメージに組み込まれている cloud-init ディレクティブを使用します。

           echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' >> /etc/systemd/system.conf
           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"]
             - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
           EOF
    
         ```
    
    
  11. プロビジョニング解除。

    注意事項

    特定の仮想マシンを移行する際に、一般化されたイメージを作成しない場合は、プロビジョニング解除手順はスキップしてください。 コマンド waagent -force -deprovision+use を実行すると、ソース マシンが使用できなくなります。この手順は一般化されたイメージを作成することのみを目的としています。

    次のコマンドを実行して仮想マシンをプロビジョニング解除します。

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

    Note

    Virtualbox では、waagent -force -deprovision の実行後に次のエラーが表示される場合があります: [Errno 5] Input/output error。 このエラー メッセージは重要ではないため、無視してかまいません。

  12. 仮想マシンをシャットダウンし、Azure に VHD をアップロードします。

次の手順

Azure CLI を使用してカスタム ディスクから Linux VM を作成する