Azure でのイメージング用に Linux を準備する

注意事項

この記事では、サービス終了 (EOL) 状態の Linux ディストリビューションである CentOS について説明します。 適宜、使用と計画を検討してください。 詳細については、「CentOS のサポート終了に関するガイダンス」を参照してください。

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

Azure プラットフォーム サービス レベル アグリーメント (SLA) は、動作保証済みディストリビューションのいずれか 1 つを使用する場合にのみ、Linux オペレーティング システムを実行している仮想マシン (VM) に適用されます。 動作保証済みディストリビューションの場合、事前構成済みの Linux イメージが Azure Marketplace で提供されています。 詳細については、以下を参照してください:

コミュニティでサポートされているものや動作保証されていないものなど、Azure で実行されている他のすべてのディストリビューションには、いくつかの前提条件があります。

この記事では、Azure 上で Linux ディストリビューションを実行するための一般的なガイダンスについて、重点的に説明します。 ディストリビューションはそれぞれ異なるため、この記事ですべてを網羅することはできません。 この記事で説明するすべての条件を満たしていても、Linux システムを適切に実行するには、大幅な調整が必要になる場合があります。

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

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

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

  • 仮想ファイル割り当てテーブル (VFAT) カーネル モジュールを、カーネルで有効にする必要があります。

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

  • Linux システムをインストールする場合は、Logical Volume Manager (LVM) ではなく、標準パーティションを使用することをお勧めします。 LVM は、多くのインストールで既定になっています。

    標準パーティションを使用することにより、特に OS ディスクをトラブルシューティングのために別の同じ VM に接続する場合に、LVM 名と複製された VM の競合が回避されます。 LVM または RAID をデータ ディスク上で使用できます。

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

  • 2.6.37 より前の Linux カーネル バージョンは、Hyper-V で大きい VM サイズの Non-Uniform Memory Access (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 を参照してください。

  • OS ディスクにスワップ パーティションを構成しないでください。 この記事で後述するとおり、一時的なリソース ディスク上にスワップ ファイルを作成するように Linux エージェントを構成できます。

  • Azure の VHD の仮想サイズはすべて、1 MB (1024 × 1024 バイト) に整列されている必要があります。 RAW ディスクから VHD に変換するときは、この記事で後述するように、変換前の RAW ディスクのサイズが 1 MB の倍数であることを確認してください。

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

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

Note

cloud-init バージョン 21.2 以降では、UDF の要件がなくなります。 ただし、udf モジュールが有効になっていないと、プロビジョニング中に CD-ROM がマウントされず、カスタム データが適用されません。 これを回避するには、ユーザー データを適用します。 ただし、カスタム データとは異なり、ユーザー データは暗号化されません。 詳しくは、cloud-init のドキュメントの「ユーザー データの形式」をご覧ください。

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

Azure は、Hyper-V ハイパーバイザーで実行されるため、Linux で Azure を実行するには特定のカーネル モジュールが必要です。 Hyper-V 以外で作成された VM を所有している場合、Hyper-V 環境で実行していることが VM で検出されない限り、Linux インストーラーの初期 RAM ディスク (initrd または initramfs) に Hyper-V 用のドライバーが含まれない場合があります。

別の仮想化システム (Virtualbox や KVM など) を使用して Linux イメージを準備する場合は、少なくとも hv_vmbushv_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 バージョン 2.2.1 およびそれ以降の一部のバージョンでは、qemu-img に既知のバグがあり、VHD が適切にフォーマットされません。 この問題は QEMU 2.6 で修正されました。 バージョン 2.2.0 以前を使用するか、バージョン 2.6 以降を使用することをお勧めします。

  1. qemu-imgvbox-manage などのツールを使用して直接 VHD のサイズを変更すると、VHD が起動できなくなる可能性があります。 最初に以下のコードを使用して VHD を RAW ディスク イメージに変換することをお勧めします。

    VM イメージを RAW ディスク イメージとして作成した場合は、このステップをスキップできます。 VM イメージを RAW ディスク イメージとして作成することは、KVM などの一部のハイパーバイザーで既定になっています。

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

    sudo qemu-img resize MyLinuxVM.raw $rounded_size
    
  4. RAW ディスクを固定サイズの 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 用の Linux Integration Services (LIS) ドライバーは、アップストリームの 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 Agent GitHub リポジトリで、最新バージョンの取得、問題の報告、pull request の提出ができます。

以下は、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 エージェントは、サポートされている最小バージョン以上である必要があります。

Note

udf および vfat モジュールが有効になっていることを確認します。 udf モジュールを無効にすると、プロビジョニング エラーが発生します。 vfat モジュールを無効にすると、プロビジョニングと起動の両方のエラーが発生します。 cloud-init バージョン 21.2 以降では、次の両方の条件に当てはまる場合、UDF を必要とせずに VM をプロビジョニングできます。

  • パスワードではなく SSH 公開キーを使用して 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. 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 エージェント ガイドの手順に従って手動でもインストールできます。

    Note

    udf および vfat モジュールが有効になっていることを確認します。 それらを削除または無効化すると、プロビジョニングまたは起動が失敗します。 cloud-init バージョン 21.2 以降では、UDF の要件がなくなります。

    次のコマンドのどれか 1 つを実行して、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-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 を構成するには、次の 2 つのオプションがあります。

    • 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
      

      特定の仮想マシンを移行していて、一般化されたイメージを作成しない場合は、/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. データ ソースを構成します。

      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. 次のコマンドを実行して仮想マシンをプロビジョニング解除します。

    注意事項

    特定の仮想マシンを移行していて、一般化されたイメージを作成しない場合は、プロビジョニング解除のステップをスキップしてください。 コマンド 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 を作成する