Azure 用の Red Hat ベースの仮想マシンの準備

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

この記事では、Azure で使用できるようにするために Red Hat Enterprise Linux (RHEL) 仮想マシン (VM) を準備する方法について説明します。 この記事で説明する RHEL のバージョンは、6.X、7.X、8.X です。 この記事では、Hyper-V、カーネルベースの VM (KVM)、VMware の各ハイパーバイザーの準備について説明します。

Red Hat の Cloud Access プログラムに参加するための資格要件の詳細については、Red Hat Cloud Access Web サイトAzure での RHEL の実行に関するページを参照してください。 RHEL イメージの作成を自動化する方法については、Azure Image Builder に関するページを参照してください。

Note

サポートが終了し (EOL)、Red Hat でサポートされなくなったバージョンに注意してください。 EOL 以降にアップロードされたイメージは、合理的な企業努力の範囲でサポートされます。 詳細については、Red Hat の製品のライフサイクルに関するページを参照してください。

Hyper-V マネージャーは

このセクションでは、Hyper-V マネージャーを使用して、RHEL 6RHEL 7、または RHEL 8 VM を準備する方法について説明します。

前提条件

このセクションは、Red Hat の Web サイトから取得した ISO ファイルの RHEL イメージが仮想ハード ディスク (VHD) にインストール済みであることを前提としています。 Hyper-V マネージャーを使用してオペレーティング システム イメージをインストールする方法の詳細については、Hyper-V の役割のインストールと仮想マシンの構成に関するページを参照してください。

RHEL のインストールに関する注記

  • Azure では、VHDX 形式はサポートされていません。 Azure でサポートされるのは、容量固定の VHD のみです。 Hyper-V マネージャーを使用してディスクを VHD 形式に変換するか、または convert-vhd コマンドレットを使用することができます。 VirtualBox を使用する場合は、ディスクの作成時に、既定の動的割り当てオプションではなく、 [容量固定] を選択します。
  • Azure では、Gen1 (BIOS ブート) および Gen2 (UEFI ブート) VM がサポートされています。
  • VHD のサイズの上限は、1,023 GB です。
  • vfat カーネル モジュールをカーネル内で有効にする必要があります。
  • 論理ボリューム マネージャー (LVM) がサポートされており、Azure VM 内の OS ディスクまたはデータ ディスクで使用できます。 一般的には、LVM ではなく OS ディスクの標準パーティションを使用することをお勧めします。 これにより、特にオペレーティング システム ディスクをトラブルシューティングのために別の同じ VM に接続する必要がある場合に、複製された VM との LVM 名の競合を回避することができます。 詳細については、LVMRAID のドキュメントを参照してください。
  • ユニバーサル ディスク フォーマット (UDF) ファイル システムをマウントするためのカーネル サポートが必要です。 Azure での初回起動時に、ゲストにアタッチされている UDF 形式のメディアにより、プロビジョニング構成が Linux VM に渡されます。 Azure Linux エージェントは、その構成を読み取り、VM をプロビジョニングする UDF ファイル システムをマウントできる必要があります。 この手順を実行しないと、プロビジョニングは失敗します。
  • オペレーティング システム ディスクにスワップ パーティションを構成しないでください。 詳細については、以下の手順を参照してください。
  • Azure の VHD の仮想サイズはすべて、1 MB にアラインメントさせる必要があります。 未フォーマット ディスクから VHD に変換するときに、変換する前の未フォーマット ディスクのサイズが 1 MB の倍数であることを確かめる必要があります。 詳細については、以下の手順を参照してください。 Linux のインストールに関する注記も参照してください。

Note

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

Hyper-V マネージャーを使用した RHEL 6

重要

RHEL 6 のメンテナンス フェーズは、2020 年 11 月 30 日に終了しました。 メンテナンス フェーズが終了すると、延長ライフ フェーズに移行します。 RHEL 6 はフル サポート/メンテナンス フェーズから移行するため、RHEL 7、8、または 9 にアップグレードすることを強くお勧めします。 RHEL 6 を引き続き使用する必要がある場合は、RHEL 延長ライフサイクル サポートのアドオンを追加することをお勧めします。

  1. Hyper-V マネージャーで VM を選択します。

  2. [接続] を選択すると、VM のコンソール ウィンドウが開きます。

  3. RHEL 6 では、NetworkManager が Azure Linux エージェントに干渉する可能性があります。 このパッケージをアンインストールします。

    sudo rpm -e --nodeps NetworkManager
    
  4. /etc/sysconfig/network ファイルを作成または編集して次のテキストを追加します。

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    
  5. /etc/sysconfig/network-scripts/ifcfg-eth0 ファイルを作成または編集して次のテキストを追加します。

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    
  6. udev ルールを移動 (または削除) して、イーサネット インターフェイスの静的ルールが生成されないようにします。 これらの規則により、Azure または Hyper-V で VM を複製する際に問題が発生します。

    警告

    多くの "v5" 以降の VM サイズには高速ネットワークが必要です。 有効になっていない場合、NetworkManager はすべての仮想関数インターフェイスに同じ IP アドレスを割り当てます。 IP アドレスの重複を防ぐには、新しいサイズに移行するときに、この udev ルールを必ず含めてください。

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
    

    Note

    高速ネットワークを使用する場合、udev 規則を使用して、作成される合成インターフェイスをアンマネージドになるように構成する必要があります。 このアクションにより、NetworkManager がプライマリ インターフェイスと同じ IP を合成インターフェイスに割り当てるのを防ぐことができます。

    適用するには:

    sudo cat <<EOF>> /etc/udev/rules.d/68-azure-sriov-nm-unmanaged.rules
    # Accelerated Networking on Azure exposes a new SRIOV interface to the VM.
    # This interface is transparentlybonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
  7. ネットワーク サービスが起動時に確実に開始されるようにします。

    sudo chkconfig network on
    
  8. RHEL リポジトリからパッケージをインストールできるように、Red Hat のサブスクリプションを登録します。

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  9. WALinuxAgent パッケージ WALinuxAgent-<version> が Red Hat extras リポジトリにプッシュされました。 extras リポジトリを有効にします。

    sudo subscription-manager repos --enable=rhel-6-server-extras-rpms
    
  10. Azure 用にさらにカーネル パラメーターを含めるために、GRUB 構成でカーネルのブート行を変更します。 この変更を行うには、テキスト エディターで /boot/grub/menu.lst を開きます。 既定のカーネルに次のパラメーターが含まれていることを確認します。

    console=ttyS0 earlyprintk=ttyS0
    

    このアクションにより、すべてのコンソール メッセージが最初のシリアル ポートに送信され、Azure サポートでの問題のデバッグに役立ちます。

    また、次のパラメーターを削除することをお勧めします。

    rhgb quiet crashkernel=auto
    

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

  11. SSH (Secure Shell) サーバーがインストールされており、起動時に開始するように構成されていることを確認します。通常は、既定でそのように構成されています。 /etc/ssh/sshd_config を変更して、次の行を含めます。

    ClientAliveInterval 180
    
  12. Azure Linux エージェントをインストールします。

    sudo yum install WALinuxAgent
    sudo chkconfig waagent on
    

    手順 3 で NetworkManager および NetworkManager-gnome パッケージをまだ削除していない場合、WALinuxAgent パッケージをインストールすると、これらのパッケージが削除されます。

  13. オペレーティング システム ディスクにスワップ領域を作成しないでください。

    Azure Linux エージェントは、VM が 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 whatever you need it to be.
    
  14. サブスクリプションの登録を解除する (必要な場合):

    sudo subscription-manager unregister
    
  15. VM をプロビジョニング解除し、Azure でのプロビジョニング用に準備します。

    Note

    特定の VM を移行する際に、一般化されたイメージを作成しない場合、プロビジョニング解除手順をスキップしてください。

        sudo waagent -force -deprovision
        sudo export HISTSIZE=0
    
  16. Hyper-V マネージャーで [アクション]>[シャットダウン] の順に選択します。 これで、Linux VHD を Azure にアップロードする準備が整いました。

Hyper-V マネージャーを使用した RHEL 7

  1. Hyper-V マネージャーで VM を選択します。

  2. [接続] を選択すると、VM のコンソール ウィンドウが開きます。

  3. /etc/sysconfig/network ファイルを作成または編集して次のテキストを追加します。

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    
  4. /etc/sysconfig/network-scripts/ifcfg-eth0 ファイルを作成または編集して次のテキストを追加します。

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    PERSISTENT_DHCLIENT=yes
    NM_CONTROLLED=yes
    

    Note

    高速ネットワークを使用する場合、udev 規則を使用して、作成される合成インターフェイスをアンマネージドになるように構成する必要があります。 このアクションにより、NetworkManager がプライマリ インターフェイスと同じ IP を合成インターフェイスに割り当てるのを防ぐことができます。

    適用するには:

    sudo cat <<EOF>> /etc/udev/rules.d/68-azure-sriov-nm-unmanaged.rules
    # Accelerated Networking on Azure exposes a new SRIOV interface to the VM.
    # This interface is transparentlybonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
  5. ネットワーク サービスが起動時に確実に開始されるようにします。

    sudo systemctl enable network
    
  6. RHEL リポジトリからパッケージをインストールできるように、Red Hat のサブスクリプションを登録します。

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  7. Azure 用にさらにカーネル パラメーターを含めるために、GRUB 構成でカーネルのブート行を変更します。 この変更を行うには、テキスト エディターで /etc/default/grub を開き、GRUB_CMDLINE_LINUX パラメーターを編集します。 次に例を示します。

    GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200n8 earlyprintk=ttyS0 net.ifnames=0"
    GRUB_TERMINAL_OUTPUT="serial console"
    GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
    ENABLE_BLSCFG=true
    

    Note

    /etc/default/grubENABLE_BLSCFG=true ではなく ENABLE_BLSCFG=false が存在する場合、ブート エントリと構成を管理するためにブート ローダー仕様 (BLS) に依存する grubeditgubby などのツールが RHEL 8 および 9 で正しく機能しない可能性があります。 ENABLE_BLSCFG が存在しない場合、既定の動作は false になります。

    この変更により、すべてのコンソール メッセージが最初のシリアル ポートに確実に送信されるため、シリアル コンソールとの対話が可能になり、Azure サポートでの問題のデバッグに役立ちます。 また、この構成により、ネットワーク インターフェイス カード (NIC) の新しい RHEL 7 名前付け規則がオフになります。

    rhgb quiet crashkernel=auto
    

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

  8. /etc/default/grub の編集を終了したら、次のコマンドを実行して grub 構成を再構築します。

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    

    Note

    UEFI 対応 VM をアップロードする場合、grub を更新するコマンドは grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg です。

  9. SSH サーバーがインストールされており、起動時に開始するように構成されていることを確認します。通常は、既定でそのように構成されています。 /etc/ssh/sshd_config を変更して、次の行を含めます。

    ClientAliveInterval 180
    
  10. WALinuxAgent パッケージ WALinuxAgent-<version> が Red Hat extras リポジトリにプッシュされました。 extras リポジトリを有効にします。

    sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
    
  11. Azure Linux エージェント、cloud-init、その他の必要なユーティリティをインストールします。

    sudo yum install -y WALinuxAgent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    sudo systemctl enable waagent.service
    sudo systemctl enable cloud-init.service
    
  12. プロビジョニングを処理するように cloud-init を構成します。

    1. cloud-initwaagent を構成します。

      sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=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
      

      Note

      特定の VM を移行する際に、汎用化イメージを作成しない場合、/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. データ ソースを構成します。

      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 swapfile 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
      
      
  13. スワップの構成:

    • オペレーティング システム ディスクにスワップ領域を作成しないでください。

      以前は、VM が Azure にプロビジョニングされた後に VM にアタッチされたローカルのリソース ディスクを使用してスワップ領域を構成するには、Azure Linux エージェントを使用して自動的に行われていました。 このアクションは、cloud-init によって処理されるようになりました。 リソース ディスクをフォーマットして、スワップ ファイルを作成するために、Linux エージェントを使用 "しないでください"。 /etc/waagent.conf 内の次のパラメーターを適宜変更します。

      ResourceDisk.Format=n
      ResourceDisk.EnableSwap=n
      
    • スワップのマウント、フォーマット、作成を行う場合は、次のいずれかの方法を使用できます。

      • カスタム データを使用して VM を作成するたびに、このコードを cloud-init 構成として渡します。 これがお勧めしているメソッドです。

      • イメージに組み込まれている cloud-init ディレクティブを使用します。これは、VM が作成されるたびにこの手順を実行します。

        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
        
  14. サブスクリプションを登録解除する場合は、次のコマンドを実行します。

    sudo subscription-manager unregister
    
  15. VM をプロビジョニング解除し、Azure でのプロビジョニング用に準備します。

    注意事項

    特定の VM を移行する際に、汎用化イメージを作成しない場合は、プロビジョニング解除手順をスキップします。 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
    
  16. Hyper-V マネージャーで [アクション]>[シャットダウン] の順に選択します。 これで、Linux VHD を Azure にアップロードする準備が整いました。

Hyper-V マネージャーを使用した RHEL 8+

  1. Hyper-V マネージャーで VM を選択します。

  2. [接続] を選択すると、VM のコンソール ウィンドウが開きます。

  3. 起動時にネットワーク サービスが確実に開始されるようにします。

    sudo systemctl enable NetworkManager.service
    
  4. 起動時に自動的に開始し、動的ホスト構成プロトコルを使用するようにネットワーク インターフェイスを構成します。

    sudo nmcli con mod eth0 connection.autoconnect yes ipv4.method auto
    

    Note

    高速ネットワークを使用する場合、udev 規則を使用して、作成される合成インターフェイスをアンマネージドになるように構成する必要があります。 このアクションにより、NetworkManager がプライマリ インターフェイスと同じ IP を合成インターフェイスに割り当てるのを防ぐことができます。

    適用するには:

    sudo cat <<EOF>> /etc/udev/rules.d/68-azure-sriov-nm-unmanaged.rules
    # Accelerated Networking on Azure exposes a new SRIOV interface to the VM.
    # This interface is transparentlybonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
  5. RHEL リポジトリからパッケージをインストールできるように、Red Hat のサブスクリプションを登録します。

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  6. grub 構成のカーネル ブート行を変更して、Azure の他のカーネル パラメーターを含め、シリアル コンソールを有効にします。

  7. 現在の GRUB パラメーターを削除します。

    sudo grub2-editenv - unset kernelopts
    
  8. テキスト エディターで /etc/default/grub を編集し、次のパラメーターを追加します。

    GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200n8 earlyprintk=ttyS0,115200 earlyprintk=ttyS0 net.ifnames=0"
    GRUB_TERMINAL_OUTPUT="serial console"
    GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
    

    この変更により、すべてのコンソール メッセージが最初のシリアル ポートに確実に送信されるため、シリアル コンソールとの対話が可能になり、Azure サポートでの問題のデバッグに役立ちます。 NIC の新しい名前付け規則もオフになります。

  9. さらに、次のパラメーターを削除することをお勧めします。

    rhgb quiet crashkernel=auto
    

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

  10. /etc/default/grub の編集を終了したら、次のコマンドを実行して grub 構成を再構築します。

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    

    UEFI 対応 VM の場合は、次のコマンドを実行します。

    sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
    
  11. SSH サーバーがインストールされており、起動時に開始するように構成されていることを確認します。通常は、既定でそのように構成されています。 /etc/ssh/sshd_config を変更して、次の行を含めます。

    ClientAliveInterval 180
    
  12. Azure Linux エージェント、cloud-init、その他の必要なユーティリティをインストールします。

    sudo yum install -y WALinuxAgent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    sudo systemctl enable waagent.service
    sudo systemctl enable cloud-init.service
    
  13. プロビジョニングを処理するように cloud-init を構成します。

    1. cloud-initwaagent を構成します。

      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
      

      Note

      特定の VM を移行する際に、汎用化イメージを作成しない場合、/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. データ ソースを構成します。

      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 swapfile by defaul
      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
      
  14. スワップの構成:

    • オペレーティング システム ディスクにスワップ領域を作成しないでください。

      以前は、VM が Azure にプロビジョニングされた後に VM にアタッチされたローカルのリソース ディスクを使用してスワップ領域を構成するには、Azure Linux エージェントを使用して自動的に行われていました。 このアクションは、cloud-init によって処理されるようになりました。 リソース ディスクをフォーマットして、スワップ ファイルを作成するために、Linux エージェントを使用 "しないでください"。 /etc/waagent.conf 内の次のパラメーターを適切に変更します。

      ResourceDisk.Format=n
      ResourceDisk.EnableSwap=n
      
      • カスタム データを使用して VM を作成するたびに、このコードを cloud-init 構成として渡します。 これがお勧めしているメソッドです。

      • イメージに組み込まれている cloud-init ディレクティブを使用します。これは、VM が作成されるたびにこの手順を実行します。

        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.device-timeout=2,x-systemd.requires=cloud-init.service", "0", "0"]
        EOF
        
  15. サブスクリプションを登録解除する場合は、次のコマンドを実行します。

    sudo subscription-manager unregister
    
  16. 次のコマンドを実行して VM をプロビジョニング解除し、Azure でのプロビジョニング用に準備します。

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

    注意事項

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

  17. Hyper-V マネージャーで [アクション]>[シャットダウン] の順に選択します。 これで、Linux VHD を Azure にアップロードする準備が整いました。

KVM

このセクションでは、Azure にアップロードするために、KVM を使用して RHEL 6 または RHEL 7 ディストリビューションを準備する方法について説明します。

KVM を使用した RHEL 6

重要

RHEL 6 のメンテナンス フェーズは、2020 年 11 月 30 日に終了しました。 メンテナンス フェーズが終了すると、延長ライフ フェーズに移行します。 RHEL 6 はフル サポート/メンテナンス フェーズから移行するため、RHEL 7、8、または 9 にアップグレードすることを強くお勧めします。 RHEL 6 を引き続き使用する必要がある場合は、RHEL 延長ライフサイクル サポートのアドオンを追加することをお勧めします。

  1. Red Hat の Web サイトから、RHEL 6 の KVM イメージをダウンロードします。

  2. ルート パスワードを設定します。

    暗号化されたパスワードを生成し、コマンドの出力をコピーします。

    sudo openssl passwd -1 changeme
    

    guestfish でルート パスワードを設定します。

    sudo guestfish --rw -a <image-name>
    > <fs> run
    > <fs> list-filesystems
    > <fs> mount /dev/sda1 /
    > <fs> vi /etc/shadow
    > <fs> exit
    

    ルート ユーザーの 2 番目のフィールドを !! から暗号化されたパスワードに変更します。

  3. qcow2 イメージから KVM に VM を作成します。 ディスクの種類を qcow2 に設定して、仮想ネットワーク インターフェイスのデバイス モデルを virtio に設定します。 その後、VM を起動し、ルートとしてサインインします。

  4. /etc/sysconfig/network ファイルを作成または編集して次のテキストを追加します。

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    
  5. /etc/sysconfig/network-scripts/ifcfg-eth0 ファイルを作成または編集して次のテキストを追加します。

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    
  6. udev ルールを移動 (または削除) して、イーサネット インターフェイスの静的ルールが生成されないようにします。 これらの規則により、Azure または Hyper-V で VM を複製する際に問題が発生します。

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
    

    Note

    高速ネットワークを使用する場合、udev 規則を使用して、作成される合成インターフェイスをアンマネージドになるように構成する必要があります。 このアクションにより、NetworkManager がプライマリ インターフェイスと同じ IP を合成インターフェイスに割り当てるのを防ぐことができます。

    適用するには:

    sudo cat <<EOF>> /etc/udev/rules.d/68-azure-sriov-nm-unmanaged.rules
    # Accelerated Networking on Azure exposes a new SRIOV interface to the VM.
    # This interface is transparently bonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
  7. ネットワーク サービスが起動時に確実に開始されるようにします。

    sudo chkconfig network on
    
  8. RHEL リポジトリからパッケージをインストールできるように、Red Hat のサブスクリプションを登録します。

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  9. Azure 用にさらにカーネル パラメーターを含めるために、GRUB 構成でカーネルのブート行を変更します。 この構成を行うには、テキスト エディターで /boot/grub/menu.lst を開きます。 既定のカーネルに次のパラメーターが含まれていることを確認します。

    console=ttyS0 earlyprintk=ttyS0
    

    この手順により、すべてのコンソール メッセージが最初のシリアル ポートに送信され、Azure サポートでの問題のデバッグに役立ちます。

    また、次のパラメーターを削除することをお勧めします。

    rhgb quiet crashkernel=auto
    

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

  10. Hyper-V モジュールを initramfs に追加します。

    /etc/dracut.conf を編集し、次の内容を追加します。

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    initramfs を再構築します。

    sudo dracut -f -v
    
  11. cloud-init をアンインストールします。

    sudo yum remove cloud-init
    
  12. SSH サーバーがインストールされており、起動時に開始するように構成されていることを確認します。

    sudo chkconfig sshd on
    

    /etc/ssh/sshd_config を変更して、次の行を含めます。

    PasswordAuthentication yes
    ClientAliveInterval 180
    
  13. WALinuxAgent パッケージ WALinuxAgent-<version> が Red Hat extras リポジトリにプッシュされました。 extras リポジトリを有効にします。

    sudo subscription-manager repos --enable=rhel-6-server-extras-rpms
    
  14. Azure Linux エージェントをインストールします。

    sudo yum install WALinuxAgent
    sudo chkconfig waagent on
    
  15. Azure Linux エージェントは、VM が 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 whatever you need it to be.
    
  16. サブスクリプションの登録を解除する (必要な場合):

    sudo subscription-manager unregister
    
  17. 次のコマンドを実行して VM をプロビジョニング解除し、Azure でのプロビジョニング用に準備します。

    Note

    特定の VM を移行する際に、汎用化イメージを作成しない場合は、プロビジョニング解除手順をスキップします。

    sudo rm -rf /var/lib/waagent/
    sudo rm -f /var/log/waagent.log
    sudo waagent -force -deprovision+user
    sudo rm -f ~/.bash_history
    sudo export HISTSIZE=0
    
  18. KVM で VM をシャット ダウンします。

  19. qcow2 イメージを VHD 形式に変換します。

    Note

    qemu-img のバージョン 2.2.1 以降には、VHD の不適切なフォーマットを引き起こす既知のバグがあります。 この問題は QEMU 2.6 で修正されています。 qemu-img 2.2.0 以前を使用するか、2.6 以降に更新することをお勧めします。 詳細については、こちらの Web サイトを参照してください。

    まず、イメージを未加工の形式に変換します。

    sudo qemu-img convert -f qcow2 -O raw rhel-6.9.qcow2 rhel-6.9.raw
    

    未加工のイメージのサイズが 1 MB になっていることを確認します。 そうでない場合は、1 MB になるようにサイズの端数を切り上げます。

    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "rhel-6.9.raw" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    rounded_size=$((($size/$MB + 1)*$MB))
    sudo qemu-img resize rhel-6.9.raw $rounded_size
    

    RAW ディスクを固定サイズの VHD に変換します。

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

    または、qemu バージョン 2.6 以降を使用して force_size オプションを含めます。

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

KVM を使用した RHEL 7

  1. Red Hat の Web サイトから、RHEL 7 の KVM イメージをダウンロードします。 この手順では、例として RHEL 7 を使います。

  2. ルート パスワードを設定します。

    暗号化されたパスワードを生成し、コマンドの出力をコピーします。

    sudo openssl passwd -1 changeme
    

    guestfish でルート パスワードを設定します。

    sudo  guestfish --rw -a <image-name>
    > <fs> run
    > <fs> list-filesystems
    > <fs> mount /dev/sda1 /
    > <fs> vi /etc/shadow
    > <fs> exit
    

    ルート ユーザーの 2 番目のフィールドを !! から暗号化されたパスワードに変更します。

  3. qcow2 イメージから KVM に VM を作成します。 ディスクの種類を qcow2 に設定して、仮想ネットワーク インターフェイスのデバイス モデルを virtio に設定します。 その後、VM を起動し、ルートとしてサインインします。

  4. /etc/sysconfig/network ファイルを作成または編集して次のテキストを追加します。

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    
  5. /etc/sysconfig/network-scripts/ifcfg-eth0 ファイルを作成または編集して次のテキストを追加します。

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    PERSISTENT_DHCLIENT=yes
    NM_CONTROLLED=yes
    

    Note

    高速ネットワークを使用する場合、udev 規則を使用して、作成される合成インターフェイスをアンマネージドになるように構成する必要があります。 このアクションにより、NetworkManager がプライマリ インターフェイスと同じ IP を合成インターフェイスに割り当てるのを防ぐことができます。

    適用するには:

    sudo cat <<EOF>> /etc/udev/rules.d/68-azure-sriov-nm-unmanaged.rules
    # Accelerated Networking on Azure exposes a new SRIOV interface to the VM.
    # This interface is transparentlybonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
  6. ネットワーク サービスが起動時に確実に開始されるようにします。

    sudo systemctl enable network
    
  7. RHEL リポジトリからパッケージをインストールできるように、Red Hat のサブスクリプションを登録します。

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  8. Azure 用にさらにカーネル パラメーターを含めるために、GRUB 構成でカーネルのブート行を変更します。 この構成を行うには、テキスト エディターで /etc/default/grub を開き、GRUB_CMDLINE_LINUX パラメーターを編集します。 次に例を示します。

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

    このコマンドにより、すべてのコンソール メッセージが最初のシリアル ポートに送信され、メッセージを Azure での問題のデバッグに利用できるようになります。 NIC の新しい RHEL 7 名前付け規則も、このコマンドでオフになります。 また、次のパラメーターを削除することをお勧めします。

    rhgb quiet crashkernel=auto
    

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

  9. /etc/default/grub の編集を終了したら、次のコマンドを実行して grub 構成を再構築します。

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  10. Hyper-V モジュールを initramfs に追加します。

    /etc/dracut.conf を編集して、コンテンツを追加します。

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    initramfs を再構築します。

    sudo dracut -f -v
    
  11. cloud-init をアンインストールします。

    sudo yum remove cloud-init
    
  12. SSH サーバーがインストールされており、起動時に開始するように構成されていることを確認します。

    sudo systemctl enable sshd
    

    /etc/ssh/sshd_config を変更して、次の行を含めます。

    PasswordAuthentication yes
    ClientAliveInterval 180
    
  13. WALinuxAgent パッケージ WALinuxAgent-<version> が Red Hat extras リポジトリにプッシュされました。 extras リポジトリを有効にします。

    sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
    
  14. Azure Linux エージェントをインストールします。

    sudo yum install WALinuxAgent
    

    waagent サービスを有効にします。

    sudo systemctl enable waagent.service
    
  15. cloud-initをインストールする。

    Hyper-V Manager マネージャーからの RHEL 7 VM の準備に関するセクションの手順 12 「プロビジョニングを処理する cloud-init をインストールします」の手順に従います。

  16. スワップの構成:

    • オペレーティング システム ディスクにスワップ領域を作成しないでください。
    • Hyper-V Manager マネージャーからの RHEL 7 VM の準備に関するセクションの手順 13 「スワップの構成」の手順に従います。
  17. サブスクリプションの登録を解除する (必要な場合):

    sudo subscription-manager unregister
    
  18. Hyper-V Manager マネージャーからの RHEL 7 VM の準備に関するセクションの手順 15 「プロビジョニング解除」の手順に従ってプロビジョニングを解除します。

  19. KVM で VM をシャット ダウンします。

  20. qcow2 イメージを VHD 形式に変換します。

    Note

    qemu-img のバージョン 1.1.1 以降には、VHD の不適切なフォーマットを引き起こす既知のバグがあります。 この問題は QEMU 1.6 で修正されました。 qemu-img 1.1.0 以前を使用するか、1.6 以降に更新することをお勧めします。 詳細については、こちらの Web サイトを参照してください。

    まず、イメージを未加工の形式に変換します。

    sudo qemu-img convert -f qcow2 -O raw rhel-7.4.qcow2 rhel-7.4.raw
    

    未加工のイメージのサイズが 1 MB になっていることを確認します。 そうでない場合は、1 MB になるようにサイズの端数を切り上げます。

    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "rhel-7.4.raw" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    rounded_size=$((($size/$MB + 1)*$MB))
    sudo qemu-img resize rhel-7.4.raw $rounded_size
    

    RAW ディスクを固定サイズの VHD に変換します。

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

    または、qemu バージョン 1.6 以降を使用して force_size オプションを含めます。

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

VMware

このセクションでは、VMware から RHEL 6 または RHEL 7 ディストリビューションを準備する方法について説明します。

前提条件

このセクションでは、VMware に RHEL VM が既にインストールされていることを前提としています。 VMware にオペレーティング システムをインストールする方法の詳細については、VMware の「ゲスト オペレーティング システム インストール ガイド」を参照してください。

  • Linux オペレーティング システムをインストールする場合は、LVM (通常、多くのインストールで既定) ではなく標準パーティションを使用することをお勧めします。 特にトラブルシューティングのためにオペレーティング システム ディスクを別の VM に接続する必要がある場合、パーティションを使用すると、複製された VM との LVM 名の競合を回避できます。 必要に応じて、LVM または RAID を使用できます。
  • オペレーティング システム ディスクにスワップ パーティションを構成しないでください。 一時的なリソース ディスク上にスワップ ファイルを作成するよう Linux エージェントを構成できます。 詳細については、以下の手順を参照してください。
  • VHD を作成する場合、[仮想ディスクを 1 つのファイルとして格納する] をオンにします。

VMware を使用した RHEL 6

重要

RHEL 6 のメンテナンス フェーズは、2020 年 11 月 30 日に終了しました。 メンテナンス フェーズが終了すると、延長ライフ フェーズに移行します。 RHEL 6 はフル サポート/メンテナンス フェーズから移行するため、RHEL 7、8、または 9 にアップグレードすることを強くお勧めします。 RHEL 6 を引き続き使用する必要がある場合は、RHEL 延長ライフサイクル サポートのアドオンを追加することをお勧めします。

  1. RHEL 6 では、NetworkManager が Azure Linux エージェントに干渉する可能性があります。 このパッケージをアンインストールします。

    sudo rpm -e --nodeps NetworkManager
    
  2. /etc/sysconfig/ ディレクトリに network という名前のファイルを作成し、次のテキストを追加します。

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    
  3. /etc/sysconfig/network-scripts/ifcfg-eth0 ファイルを作成または編集して次のテキストを追加します。

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    
  4. udev ルールを移動 (または削除) して、イーサネット インターフェイスの静的ルールが生成されないようにします。 これらの規則により、Azure または Hyper-V で VM を複製する際に問題が発生します。

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
    

    Note

    高速ネットワークを使用する場合、udev 規則を使用して、作成される合成インターフェイスをアンマネージドになるように構成する必要があります。 このアクションにより、NetworkManager がプライマリ インターフェイスと同じ IP を合成インターフェイスに割り当てるのを防ぐことができます。

    適用するには:

    sudo cat <<EOF>> /etc/udev/rules.d/68-azure-sriov-nm-unmanaged.rules
    # Accelerated Networking on Azure exposes a new SRIOV interface to the VM.
    # This interface is transparently bonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
  5. ネットワーク サービスが起動時に確実に開始されるようにします。

    sudo chkconfig network on
    
  6. RHEL リポジトリからパッケージをインストールできるように、Red Hat のサブスクリプションを登録します。

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  7. WALinuxAgent パッケージ WALinuxAgent-<version> が Red Hat extras リポジトリにプッシュされました。 extras リポジトリを有効にします。

    sudo subscription-manager repos --enable=rhel-6-server-extras-rpms
    
  8. Azure 用にさらにカーネル パラメーターを含めるために、GRUB 構成でカーネルのブート行を変更します。 この手順を行うには、テキスト エディターで /etc/default/grub を開き、GRUB_CMDLINE_LINUX パラメーターを編集します。 次に例を示します。

    GRUB_CMDLINE_LINUX="console=ttyS0 earlyprintk=ttyS0"
    

    この手順により、すべてのコンソール メッセージが最初のシリアル ポートに送信され、Azure サポートでの問題のデバッグに役立ちます。 また、次のパラメーターを削除することをお勧めします。

    rhgb quiet crashkernel=auto
    

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

  9. Hyper-V モジュールを initramfs に追加します。

    /etc/dracut.conf を編集し、次の内容を追加します。

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    initramfs を再構築します。

    sudo dracut -f -v
    
  10. SSH サーバーがインストールされており、起動時に開始するように構成されていることを確認します。通常は、既定でそのように構成されています。 /etc/ssh/sshd_config を変更して、次の行を含めます。

    ClientAliveInterval 180
    
  11. Azure Linux エージェントをインストールします。

    sudo yum install WALinuxAgent
    sudo chkconfig waagent on
    
  12. オペレーティング システム ディスクにスワップ領域を作成しないでください。

    Azure Linux エージェントは、VM が 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 whatever you need it to be.
    
  13. サブスクリプションの登録を解除する (必要な場合):

    sudo subscription-manager unregister
    
  14. 次のコマンドを実行して VM をプロビジョニング解除し、Azure でのプロビジョニング用に準備します。

    Note

    特定の VM を移行する際に、汎用化イメージを作成しない場合は、プロビジョニング解除手順をスキップします。

    sudo rm -rf /var/lib/waagent/
    sudo rm -f /var/log/waagent.log
    sudo waagent -force -deprovision+user
    sudo rm -f ~/.bash_history
    sudo export HISTSIZE=0
    
  15. VM をシャットダウンし、VMDK ファイルを .vhd ファイルに変換します。

    Note

    qemu-img のバージョン 2.2.1 以降には、VHD の不適切なフォーマットを引き起こす既知のバグがあります。 この問題は QEMU 2.6 で修正されています。 qemu-img 2.2.0 以前を使用するか、2.6 以降に更新することをお勧めします。 詳細については、こちらの Web サイトを参照してください。

    まず、イメージを未加工の形式に変換します。

    sudo qemu-img convert -f vmdk -O raw rhel-6.9.vmdk rhel-6.9.raw
    

    未加工のイメージのサイズが 1 MB になっていることを確認します。 そうでない場合は、1 MB になるようにサイズの端数を切り上げます。

    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "rhel-6.9.raw" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    rounded_size=$((($size/$MB + 1)*$MB))
    sudo qemu-img resize rhel-6.9.raw $rounded_size
    

    RAW ディスクを固定サイズの VHD に変換します。

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

    または、qemu バージョン 2.6 以降を使用して force_size オプションを含めます。

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

VMware を使用した RHEL 7

  1. /etc/sysconfig/network ファイルを作成または編集して次のテキストを追加します。

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    
  2. /etc/sysconfig/network-scripts/ifcfg-eth0 ファイルを作成または編集して次のテキストを追加します。

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    PERSISTENT_DHCLIENT=yes
    NM_CONTROLLED=yes
    

    Note

    高速ネットワークを使用する場合、udev 規則を使用して、作成される合成インターフェイスをアンマネージドになるように構成する必要があります。 このアクションにより、NetworkManager がプライマリ インターフェイスと同じ IP を合成インターフェイスに割り当てるのを防ぐことができます。

    適用するには:

    sudo cat <<EOF>> /etc/udev/rules.d/68-azure-sriov-nm-unmanaged.rules
    # Accelerated Networking on Azure exposes a new SRIOV interface to the VM.
    # This interface is transparentlybonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
  3. ネットワーク サービスが起動時に確実に開始されるようにします。

    sudo systemctl enable network
    
  4. RHEL リポジトリからパッケージをインストールできるように、Red Hat のサブスクリプションを登録します。

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  5. Azure 用にさらにカーネル パラメーターを含めるために、GRUB 構成でカーネルのブート行を変更します。 この変更を行うには、テキスト エディターで /etc/default/grub を開き、GRUB_CMDLINE_LINUX パラメーターを編集します。 次に例を示します。

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

    この構成により、すべてのコンソール メッセージが最初のシリアル ポートに送信され、メッセージを Azure での問題のデバッグに利用できるようになります。 NIC の新しい RHEL 7 名前付け規則もオフになります。 上記の他に、次のパラメーターを削除することをお勧めします。

    rhgb quiet crashkernel=auto
    

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

  6. /etc/default/grub の編集を終了したら、次のコマンドを実行して grub 構成を再構築します。

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  7. Hyper-V モジュールを initramfs に追加します。

    /etc/dracut.confを編集して、コンテンツを追加します。

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    initramfs を再構築します。

    sudo dracut -f -v
    
  8. SSH サーバーがインストールされており、起動時に開始するように構成されていることを確認します。 通常これが既定の設定です。 /etc/ssh/sshd_config を変更して、次の行を含めます。

    ClientAliveInterval 180
    
  9. WALinuxAgent パッケージ WALinuxAgent-<version> が Red Hat extras リポジトリにプッシュされました。 extras リポジトリを有効にします。

    sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
    
  10. Azure Linux エージェントをインストールします。

    sudo yum install WALinuxAgent
    sudo systemctl enable waagent.service
    
  11. cloud-init をインストールします。

    Hyper-V Manager マネージャーからの RHEL 7 VM の準備に関するセクションの手順 12 「プロビジョニングを処理する cloud-init をインストールします」の手順に従います。

  12. スワップの構成:

    • オペレーティング システム ディスクにスワップ領域を作成しないでください。
    • Hyper-V Manager マネージャーからの RHEL 7 VM の準備に関するセクションの手順 13 「スワップの構成」の手順に従います。
  13. サブスクリプションを登録解除する場合は、次のコマンドを実行します。

    sudo subscription-manager unregister
    
  14. Hyper-V Manager マネージャーからの RHEL 7 VM の準備に関するセクションの手順 15 「プロビジョニング解除」の手順に従ってプロビジョニングを解除します。

  15. VM をシャットダウンし、VMDK ファイルを VHD 形式に変換します。

    Note

    qemu-img のバージョン 2.2.1 以降には、VHD の不適切なフォーマットを引き起こす既知のバグがあります。 この問題は QEMU 2.6 で修正されています。 qemu-img 2.2.0 以前を使用するか、2.6 以降に更新することをお勧めします。 詳細については、こちらの Web サイトを参照してください。

    まず、イメージを未加工の形式に変換します。

    sudo qemu-img convert -f vmdk -O raw rhel-7.4.vmdk rhel-7.4.raw
    

    未加工のイメージのサイズが 1 MB になっていることを確認します。 そうでない場合は、1 MB になるようにサイズの端数を切り上げます。

    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "rhel-7.4.raw" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    rounded_size=$((($size/$MB + 1)*$MB))
    sudo qemu-img resize rhel-7.4.raw $rounded_size
    

    RAW ディスクを固定サイズの VHD に変換します。

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

    または、qemu バージョン 2.6 以降を使用して force_size オプションを含めます。

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

kickstart ファイル

このセクションでは、kickstart ファイルを使用して、ISO から RHEL 7 ディストリビューションを準備する方法について説明します。

kickstart ファイルからの RHEL 7

  1. 次の内容を含む kickstart ファイルを作成して、そのファイルを保存します。 kickstart のインストールの詳細については、Kickstart のインストール ガイドを参照してください。

    # Kickstart for provisioning a RHEL 7 Azure VM
    
    # System authorization information
      auth --enableshadow --passalgo=sha512
    
    # Use graphical install
    text
    
    # Don't run the Setup Agent on first boot
    firstboot --disable
    
    # Keyboard layouts
    keyboard --vckeymap=us --xlayouts='us'
    
    # System language
    lang en_US.UTF-8
    
    # Network information
    network  --bootproto=dhcp
    
    # Root password
    rootpw --plaintext "to_be_disabled"
    
    # System services
    services --enabled="sshd,waagent,NetworkManager"
    
    # System timezone
    timezone Etc/UTC --isUtc --ntpservers 0.rhel.pool.ntp.org,1.rhel.pool.ntp.org,2.rhel.pool.ntp.org,3.rhel.pool.ntp.org
    
    # Partition clearing information
    clearpart --all --initlabel
    
    # Clear the MBR
    zerombr
    
    # Disk partitioning information
    part /boot --fstype="xfs" --size=500
    part / --fstyp="xfs" --size=1 --grow --asprimary
    
    # System bootloader configuration
    bootloader --location=mbr
    
    # Firewall configuration
    firewall --disabled
    
    # Enable SELinux
    selinux --enforcing
    
    # Don't configure X
    skipx
    
    # Power down the machine after install
    poweroff
    
    %packages
    @base
    @console-internet
    chrony
    sudo
    parted
    -dracut-config-rescue
    
    %end
    
    %post --log=/var/log/anaconda/post-install.log
    
    #!/bin/bash
    
    # Register Red Hat Subscription
    subscription-manager register --username=XXX --password=XXX --auto-attach --force
    
    # Install latest repo update
    yum update -y
    
    # Enable extras repo
    subscription-manager repos --enable=rhel-7-server-extras-rpms
    
    # Install WALinuxAgent
    yum install -y WALinuxAgent
    
    # Unregister Red Hat subscription
    subscription-manager unregister
    
    # Enable waaagent at boot-up
    systemctl enable waagent
    
    # Install cloud-init
    yum install -y cloud-init cloud-utils-growpart gdisk hyperv-daemons
    
    # Configure waagent for cloud-init
    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
    
    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
    
    # Disable the root account
    usermod root -p '!!'
    
    # Configure swap using 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.device-timeout=2,x-systemd.requires=cloud-init.service", "0", "0"]
    EOF
    
    # Set the cmdline
    sed -i 's/^\(GRUB_CMDLINE_LINUX\)=".*"$/\1="console=tty1 console=ttyS0 earlyprintk=ttyS0"/g' /etc/default/grub
    
    # Enable SSH keepalive
    sed -i 's/^#\(ClientAliveInterval\).*$/\1 180/g' /etc/ssh/sshd_config
    
    # Build the grub cfg
    grub2-mkconfig -o /boot/grub2/grub.cfg
    
    # Configure network
    cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    PERSISTENT_DHCLIENT=yes
    NM_CONTROLLED=yes
    EOF
    
    sudo cat <<EOF>> /etc/udev/rules.d/68-azure-sriov-nm-unmanaged.rules
    # Accelerated Networking on Azure exposes a new SRIOV interface to the VM.
    # This interface is transparentlybonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
    # Deprovision and prepare for Azure if you are creating a generalized image
    sudo cloud-init clean --logs --seed
    sudo rm -rf /var/lib/cloud/
    sudo rm -rf /var/lib/waagent/
    sudo rm -f /var/log/waagent.log
    
    sudo waagent -force -deprovision+user
    rm -f ~/.bash_history
    export HISTSIZE=0
    
    %end
    
  2. インストール システムからアクセスできる場所に kickstart ファイルを置きます。

  3. Hyper-V マネージャーで新しい VM を作成します。 [仮想ハード ディスクの接続] ページで、[後で仮想ハード ディスクをアタッチする] をオンにし、仮想マシンの新規作成ウィザードを完了します。

  4. VM 設定を開きます。

    1. 新しい VHD を VM にアタッチします。 [VHD 形式][固定サイズ] を選択します。

    2. インストール ISO を DVD ドライブに接続します。

    3. CD から起動するように BIOS を設定します。

  5. VM を起動します。 インストール ガイドが表示されたら、Tab キーを押してブート オプションを構成します。

  6. ブート オプションの最後に inst.ks=<the location of the kickstart file> を入力し、Enterキーを押します。

  7. インストールが完了するのを待ちます。 完了すると、VM は自動的にシャットダウンされます。 これで、Linux VHD を Azure にアップロードする準備が整いました。

既知の問題

次の問題が確認されています。

非 Hyper-V ハイパーバイザーを使用しているとき、Hyper-V ドライバーを初期 RAM ディスクに含めることができない

一部のケースにおいて、Linux インストーラーは、Hyper-V 環境で実行されていることを Linux が検出しない限り、初期 RAM ディスク (initrd または initramfs) に Hyper-V 用のドライバーを含めないことがあります。

別の仮想化システム (VirtualBox や Xen など) を使用して Linux イメージを準備する場合、少なくとも hv_vmbushv_storvsc のカーネル モジュールを初期 RAM ディスクで確実に使用できるように initrd を再構築することが必要な場合があります。 この問題は、少なくとも、アップストリームの Red Hat ディストリビューションに基づくシステムで確認されています。

この問題を解決するには、initramfs に Hyper-V モジュールを追加して再構築する必要があります。

/etc/dracut.conf を編集し、次の内容を追加します。

add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "

initramfs を再構築します。

sudo dracut -f -v

詳細については、initramfs の再構築に関するページを参照してください。