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

注意

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

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

CentOS ベースの Linux オペレーティング システムを格納した Azure 仮想ハード ディスク (VHD) を作成してアップロードする方法について説明します。

前提条件

この記事では、既に CentOS (または同様な派生版) Linux オペレーティング システムを仮想ハード ディスクにインストールしていることを前提にしています。 .vhd ファイルを作成するツールは、Hyper-V のような仮想化ソリューションなど複数あります。 詳細については、「 Hyper-V の役割のインストールと仮想マシンの構成」を参照してください。

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

  • Azure 用に Linux を準備する場合のその他のヒントについては、「Linux のインストールに関する一般的な注記」を参照してください。
  • VHDX 形式は Azure ではサポートされていません。サポートされるのは固定 VHD のみです。 Hyper-V マネージャーまたは convert-vhd コマンドレットを使用して、ディスクを VHD 形式に変換できます。 VirtualBox を使おうとしている場合は、ディスクの作成時に、既定で動的に割り当てられるサイズではなく、固定サイズを選ぶことを意味します。
  • vfat カーネル モジュールをカーネル内で有効にする必要があります
  • Linux システムをインストールする場合は、LVM (通常、多くのインストールで既定) ではなく標準パーティションを使用することをお勧めします。 これで、特に OS ディスクをトラブルシューティングのために別の同一 VM に接続する必要がある場合に、LVM 名と複製された VM の競合が回避されます。 LVM または RAID をデータ ディスク上で使用できます。
  • UDF ファイル システムをマウントするためのカーネル サポートが必要です。 Azure での最初の起動時に、ゲストに接続されている UDF でフォーマットされたメディアを使用して、プロビジョニング構成が Linux VM に渡されます。 Azure Linux エージェントまたは cloud-init は、その構成を読み取り、VM をプロビジョニングするために、UDF ファイル システムをマウントする必要があります。
  • 2.6.37 より前の Linux カーネル バージョンは、大きい VM サイズの NUMA on Hyper-V をサポートしていません。 この問題は、主に、アップストリームの Centos 2.6.32 カーネルを使用した以前のディストリビューションに影響があり、Centos 6.6 (kernel-2.6.32-504) で修正されました。 2.6.37 より古いカスタム カーネルまたは 2.6.32-504 より古い RHEL ベースのカーネルを実行しているシステムでは、grub.conf のカーネル コマンド ラインで、ブート パラメーター numa=off を設定する必要があります。 詳細については、Red Hat KB 436883 を参照してください。
  • OS ディスクにスワップ パーティションを構成しないでください。
  • Azure の VHD の仮想サイズはすべて、1 MB にアラインメントさせる必要があります。 未フォーマット ディスクから VHD に変換するときに、変換する前の未フォーマット ディスクのサイズが 1 MB の倍数であることを確認する必要があります。 詳細については、Linux のインストールに関する注記のセクションを参照してください。

Note

"cloud-init 21.2 以降では、UDF の要件はなくなりました。" ただし、UDF モジュールが有効になっていないと、プロビジョニング中に cdrom がマウントされず、カスタム データが適用されません。 これを回避するには、ユーザー データを使ってカスタム データを適用します。 ただし、カスタム データとは異なり、ユーザー データは暗号化されません。 https://cloudinit.readthedocs.io/en/latest/topics/format.html

CentOS 6.x

重要

CentOS 6 はサポート終了 (EOL) に達しており、CentOS コミュニティではサポートされなくなっていることに注意してください。 これは、このバージョンにはこれ以上更新プログラムやセキュリティ パッチはリリースされなくなり、潜在的なセキュリティ リスクに対して脆弱になることを意味します。 システムの安全性と安定性を確保するために、より新しいバージョンの CentOS にアップグレードすることを強くお勧めします。 さらに支援が必要であれば、IT 部門またはシステム管理者に問い合わせてください。

  1. Hyper-V マネージャーで仮想マシンを選択します。

  2. [接続] をクリックすると、仮想マシンのコンソール ウィンドウが開きます。

  3. CentOS 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 ルールを編集して、イーサネット インターフェイスの静的ルールが生成されないようにします。 これらのルールは、Microsoft Azure または Hyper-V で仮想マシンを複製する際に問題の原因となる可能性があります。

    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
    
  7. 次のコマンドを実行して、起動時にネットワーク サービスが開始されるようにします。

    sudo chkconfig network on
    
  8. Azure データセンター内でホストされている OpenLogic のミラーを使用する場合は、/etc/yum.repos.d/CentOS-Base.repo ファイルを次のリポジトリに置き換えます。 これにより、Azure Linux エージェントなどの追加のパッケージを含む [openlogic] リポジトリも追加されます。

    [openlogic]
    name=CentOS-$releasever - openlogic packages for $basearch
    baseurl=http://olcentgbl.trafficmanager.net/openlogic/$releasever/openlogic/$basearch/
    enabled=1
    gpgcheck=0
    
    [base]
    name=CentOS-$releasever - Base
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/os/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    #released updates
    [updates]
    name=CentOS-$releasever - Updates
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/updates/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    #additional packages that may be useful
    [extras]
    name=CentOS-$releasever - Extras
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/extras/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    #additional packages that extend functionality of existing packages
    [centosplus]
    name=CentOS-$releasever - Plus
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/centosplus/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    
    #contrib - packages by Centos Users
    [contrib]
    name=CentOS-$releasever - Contrib
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/contrib/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    

    注意

    これ以降の説明では、少なくとも [openlogic] リポジトリを使っていることを前提とします。このリポジトリは、以下の Azure Linux エージェントのインストールに使われます。

  9. /etc/yum.conf ファイルに次の行を追加します。

    http_caching=packages
    
  10. 次のコマンドを実行して、現在の yum メタデータを消去し、最新のパッケージでシステムを更新します。

    sudo yum clean all
    

    以前のバージョンの CentOS 用のイメージを作成している場合を除き、すべてのパッケージを最新のものに更新することをお勧めします。

    sudo yum -y update
    

    このコマンドを実行すると、再起動が必要になることがあります。

  11. (省略可能) Linux Integration Services (LIS) 用ドライバーをインストールします。

    重要

    この手順は、CentOS 6.3 およびそれ以前では必須です。それ以降のリリースでは、この手順を省略できます。

    sudo rpm -e hypervkvpd  ## (may return error if not installed, that's OK)
    sudo yum install microsoft-hyper-v
    

    または、LIS ダウンロード ページの手動インストール手順に従って、RPM を VM にインストールします。

  12. Azure Linux エージェントと依存関係をインストールします。 waagent サービスを開始して有効にします。

    sudo yum install python-pyasn1 WALinuxAgent
    sudo service waagent start
    sudo chkconfig waagent on
    

    手順 3. で説明した NetworkManager パッケージと NetworkManager-gnome パッケージがまだ削除されていない場合、それらは WALinuxAgent パッケージによって削除されます。

  13. GRUB 構成でカーネルのブート行を変更して Azure の追加のカーネル パラメーターを含めます。 これを行うには、テキスト エディターで /boot/grub/menu.lst を開き、既定のカーネルに次のパラメーターが含まれていることを確認します。

    console=ttyS0 earlyprintk=ttyS0 rootdelay=300
    

    これにより、すべてのコンソール メッセージが最初のシリアル ポートに送信され、メッセージを Azure での問題のデバッグに利用できるようになります。

    上記の他に、次のパラメーターを "削除" することをお勧めします。

    rhgb quiet crashkernel=auto
    

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

    重要

    CentOS 6.5 およびそれ以前では、カーネル パラメーター numa=off も設定する必要があります。 Red Hat KB 436883 を参照してください。

  14. SSH サーバーがインストールされており、起動時に開始するように構成されていることを確認します。 通常これが既定です。

  15. OS ディスクにスワップ領域を作成しないでください。

    Azure Linux エージェントは、Azure でプロビジョニングされた後に VM に接続されたローカルのリソース ディスクを使用してスワップ領域を自動的に構成します。 ローカル リソース ディスクは "一時" ディスクであるため、VM のプロビジョニングが解除されると空になることがあります。 Azure Linux Agent のインストール後に (前の手順を参照)、 /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. 次のコマンドを実行して仮想マシンをプロビジョニング解除し、Azure でのプロビジョニング用に準備します。

    sudo waagent -force -deprovision+user
    sudo export HISTSIZE=0
    

Note

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

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

CentOS 7.0+

CentOS 7 (および同様な派生版) への変更

Azure 用の CentOS 7 仮想マシンを準備する手順は、CentOS 6 の場合と似ていますが、以下のように、注目すべき大きな違いがいくつかあります。

  • NetworkManager パッケージが、Azure Linux エージェントと競合しなくなりました。 このパッケージは既定でインストールされ、削除しないことをお勧めします。

  • GRUB2 が、既定のブートローダーとして使用されるようになったため、カーネル パラメーターの編集手順が変更されました (以下を参照)。

  • XFS が既定のファイル システムになりました。 必要に応じて、引き続き ext4 ファイル システムを使用できます。

  • CentOS 8 Stream 以降では既定で network.service が含まれなくなったため、手動でインストールする必要があります。

    sudo yum install network-scripts
    sudo systemctl enable network.service
    

構成の手順

  1. Hyper-V マネージャーで仮想マシンを選択します。

  2. [接続] をクリックすると、仮想マシンのコンソール ウィンドウが開きます。

  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
    NM_CONTROLLED=no
    
  5. udev ルールを編集して、イーサネット インターフェイスの静的ルールが生成されないようにします。 これらのルールは、Microsoft Azure または Hyper-V で仮想マシンを複製する際に問題の原因となる可能性があります。

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    
  6. Azure データセンター内でホストされている OpenLogic のミラーを使用する場合は、/etc/yum.repos.d/CentOS-Base.repo ファイルを次のリポジトリに置き換えます。 これにより、Azure Linux エージェント用のパッケージを含む [openlogic] リポジトリも追加されます。

    [openlogic]
    name=CentOS-$releasever - openlogic packages for $basearch
    baseurl=http://olcentgbl.trafficmanager.net/openlogic/$releasever/openlogic/$basearch/
    enabled=1
    gpgcheck=0
    
    [base]
    name=CentOS-$releasever - Base
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/os/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    
    #released updates
    [updates]
    name=CentOS-$releasever - Updates
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/updates/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    
    #additional packages that may be useful
    [extras]
    name=CentOS-$releasever - Extras
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/extras/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    
    #additional packages that extend functionality of existing packages
    [centosplus]
    name=CentOS-$releasever - Plus
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
    baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/centosplus/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    

    注意

    これ以降の説明では、少なくとも [openlogic] リポジトリを使っていることを前提とします。このリポジトリは、以下の Azure Linux エージェントのインストールに使われます。

  7. 次のコマンドを実行して、現在の yum メタデータをクリアし、更新をインストールします。

    sudo yum clean all
    

    以前のバージョンの CentOS 用のイメージを作成している場合を除き、すべてのパッケージを最新のものに更新することをお勧めします。

    sudo yum -y update
    

    このコマンドを実行すると、再起動が必要になることがあります。

  8. GRUB 構成でカーネルのブート行を変更して Azure の追加のカーネル パラメーターを含めます。 これを行うには、テキスト エディターで /etc/default/grub を開き、次のように GRUB_CMDLINE_LINUX パラメーターを編集します。

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

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

    rhgb quiet crashkernel=auto
    

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

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

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

注意

UEFI 対応 VM をアップロードする場合、GRUB を更新するコマンドは grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg です。 また、カーネルで vfat カーネル モジュールを有効にする必要があります。そうしないと、プロビジョニングに失敗します。

必ず 'udf' モジュールを有効にしてください。 それを削除または無効化すると、プロビジョニングまたは起動が失敗します。 _Cloud-init 21.2 以降では、UDF の要件はなくなりました。詳しくは、ドキュメントの先頭をご覧ください。)

  1. VMware、VirtualBox、または KVM からイメージをビルドする場合:Hyper-V ドライバーを確実に initramfs に含めます。

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

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    Initramfs を再構築します。

    sudo dracut -f -v
    
  2. Azure Linux エージェントと Azure VM 拡張機能用の依存関係をインストールします。

    sudo yum install python-pyasn1 WALinuxAgent
    sudo systemctl enable waagent
    
  3. プロビジョニングを処理する cloud-init をインストールします

    sudo yum install -y cloud-init cloud-utils-growpart gdisk hyperv-daemons
    
    1. cloud-init に対して waagent を構成します
    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
    
    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
    
    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
    
    if [[ -f /mnt/swapfile ]]; then
    echo Removing swapfile - RHEL uses a swapfile by default
    swapoff /mnt/swapfile
    rm /mnt/swapfile -f
    fi
    
    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
    
  4. スワップの構成

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

    以前は、Azure で仮想マシンがプロビジョニングされた後に、仮想マシンに接続されたローカル リソース ディスクを使ってスワップ領域を自動的に構成するために、Azure Linux エージェントが使われていました。 しかし、これは cloud-init によって処理されるようになったので、Linux エージェントを使用して、スワップ ファイルを作成するリソース ディスクをフォーマットしないでください/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
    

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

    • VM を作成するたびに、cloud-init 構成としてこれを渡す

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

      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"]
        - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
      EOF
      
  5. 次のコマンドを実行して仮想マシンをプロビジョニング解除し、Azure でのプロビジョニング用に準備します。

    Note

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

    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
    
  6. Hyper-V マネージャーで [アクション] >[シャットダウン] をクリックします。 これで、Linux VHD を Azure にアップロードする準備が整いました。

次のステップ

これで、CentOS Linux 仮想ハード ディスク を使用して、Azure に新しい仮想マシンを作成する準備が整いました。 .vhd ファイルを Azure に初めてアップロードする場合は、「Create a Linux VM from a custom disk (カスタム ディスクから Linux VM を作成する)」を参照してください。