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_vmbus
と hv_storvsc
のカーネル モジュールを初期 RAM ディスクで使用できるように initrd の再構築が必要になる場合があります。 これは、アップ ストリームの Red Hat ディストリビューションに基づくシステムの既知の問題ですが、その他のシステムでも発生する可能性があります。
initrd または initramfs イメージの再構築のためのメカニズムは、ディストリビューションによって異なる場合があります。 適切な手順については、使用しているディストリビューションのドキュメントまたはサポートを参照してください。 次は、mkinitrd
ユーティリティを使用して initrd を再構築する 1 つの例です。
既存の initrd イメージをバックアップします。
cd /boot sudo cp initrd-`uname -r`.img initrd-`uname -r`.img.bak
hv_vmbus
とhv_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 以降を使用することをお勧めします。
qemu-img
やvbox-manage
などのツールを使用して直接 VHD のサイズを変更すると、VHD が起動できなくなる可能性があります。 最初に以下のコードを使用して VHD を RAW ディスク イメージに変換することをお勧めします。VM イメージを RAW ディスク イメージとして作成した場合は、このステップをスキップできます。 VM イメージを RAW ディスク イメージとして作成することは、KVM などの一部のハイパーバイザーで既定になっています。
sudo qemu-img convert -f vpc -O raw MyLinuxVM.vhd MyLinuxVM.raw
仮想サイズが 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"
$rounded_size
を使用して RAW ディスクのサイズを変更します。sudo qemu-img resize MyLinuxVM.raw $rounded_size
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 のアクティブなカーネルには、次のパッチが含まれている必要があります。 この一覧はすべてのディストリビューションを完全に網羅するものではありません。
- ata_piix: 既定でディスクを Hyper-V ドライバーに従うようにする
- storvsc: RESET パスの転送中パケットを正しく考慮する
- storvsc: WRITE_SAME の使用を回避する
- storvsc: RAID と仮想ホスト アダプター ドライバーの WRITE SAME を無効にする
- storvsc: NULL ポインターの逆参照の修正
- storvsc: リング バッファーのエラーにより I/O の凍結が発生する可能性がある
- scsi_sysfs: __scsi_remove_device の二重実行を保護する
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 システムの一般的な要件
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 では問題になる可能性があります。/etc/default/grub の編集が終了したら、次のコマンドを実行して GRUB 構成を再構築します。
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
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
SSH サーバーがインストールされており、起動時に開始するように構成されていることを確認します。 この構成が通常の既定です。
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
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
プロビジョニングを処理するように cloud-init を構成します。
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
を設定します。マウントを構成します。
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
データ ソースを構成します。
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
既存のスワップ ファイルを構成した場合は、削除します。
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
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
次のコマンドを実行して仮想マシンをプロビジョニング解除します。
注意事項
特定の仮想マシンを移行していて、一般化されたイメージを作成しない場合は、プロビジョニング解除のステップをスキップしてください。 コマンド
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
というエラー メッセージが表示されることがあります。 このエラー メッセージは重要ではないため、無視してかまいません。仮想マシンをシャットダウンし、Azure に VHD をアップロードします。