オンプレ仮想基盤の Linux を Azure へ移行する

create-vm-from-custom-image2

こんにちは、サイオステクノロジー 水倉です。

オンプレ仮想マシンをハードの老朽化や保守切れ等で Azure へ移行したいことがあると思います。Azure で新規仮想マシンを作れば済む場合はよいのですが、構築の手間が大きい場合や、OS が古くてマーケットプレースで提供されていない場合は困ったことになります。今回は、そんな時に有用なオンプレ仮想マシン (Linux) を Azure へ移行する方法を紹介します。

以降、オンプレ仮想マシンをオンプレ VM、Azure 仮想マシン を Azure VM と表記します。

移行の流れ

Azure Site Recovery で移行することも可能ですが、ASR 自体の構築の手間もあるので、ここではオンプレ VM イメージを Azure へアップロードして、Azure VM を作成する方法で進めていきます。

流れとしては、

  1. オンプレ VM を Azure-ready な設定に変更(OS レイヤの設定変更)
  2. Azure へ移行可能な仮想ディスク形式 (VHD) へ変換 ※オプション
  3. VHD を 汎用 ストレージ (ページ Blob) へアップロード
  4. Blob 上の VHD からマネージドディスクの作成
  5. マネージドディスクから Azure VM の作成

という流れになります。

前提環境

vCenter 上の VM で、CentOS 6.3 を前提とします。

Azure で動作保証済みの Linux ディストリビューションについてはこちらをご確認ください。

動作保証外のディストリビューションでも Azure VM を作成可能ですが、制約やLinux 設定の微調整が必要で、それなりのリスクを覚悟する必要がありそうです。詳細はこちらのドキュメントに記載されています。

また、仮想ディスクサイズに対して OS のディスク使用量が小さい (プロビジョニングされたサイズが過剰に大きい) 場合、あらかじめ仮想ディスクサイズを縮小することで、Azure へのアップロード時間短縮とストレージコストの低減が可能です。各仮想環境毎のツールを使って仮想ディスクサイズを縮小しておくことをお勧めします。

VirtualBox の場合は VBoxManage (事前に空き容量に 0 書き込みが必要)、vmware の場合は VMwareToolboxCmd コマンドでサイズ縮小が可能です。

オンプレ VM を Azure-ready な設定に変更 (OS レイヤの設定変更)

まず、オンプレ VM へログインし、Azure-ready な設定に変更していきます。
ここでは、vCenter から事前に OVA 形式で VM をエクスポートし、ローカル VirtualBox でインポートして作業をしました。

どんな設定変更が必要かというと、

  • ネットワークインタフェースの設定 (Azure Linux エージェントと干渉する NetworkManager のアンインストール、udev の無効化等)
  • Azure Linux エージェントのインストール
  • ブートローダのカーネルパラメータ変更
  • スワップ領域の解放

といった感じで、Azure 仕様にする必要があります。

事前に Linux VM の制約を確認しておきましょう。

具体的な手順は、下記手順に従って設定を変更します。
※ディストリビューションによって手順が異なるため、移行するディストリビューション毎の手順を確認してください。

「Azure 用の CentOS ベースの仮想マシンの準備」
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/create-upload-centos?toc=%2fazure%2fvirtual-machines%2flinux%2ftoc.json

注意点

少し注意が必要な点を補足します。

Linux Integration Services 用ドライバーの導入にはカーネルバージョンの最新化が必要

MS ドキュメントの手順に記載されているように、CentOS 6.3 以前のバージョンの場合、Linux Integration Services 用ドライバー (microsoft-hyper-v) のインストールが必要となりますが、カーネルバージョンの最新化が必要です。

CentOS 6.3 の場合、2.6.32-279 から 2.6.32-696 へのバージョンアップが必要でした。yum update でパッケージを最新化する手順で、移行元 VM の カーネル、ディストリビューションのバージョンを上げなかった場合、Azure Linux エージェントのインストールが失敗します。

$ sudo yum update --exclude=kernel* --exclude=centos*
$ sudo yum install microsoft-hyper-v

こんなエラーメッセージです。

your running kernel 2.6.32-279.el6.x86_64 is not your latest installed kernel, aborting installation

メッセージには、”aborting installation” と表示されていますが、カーネルは 2.6.32-279 から 2.6.32-696 へバージョンアップされてしまいました。ちゃっかり、最後にインストールされたことを示すメッセージが出力されていました。パッケージを確認すると確かにインストールされています。

依存性関連をインストールしました:
  kernel.x86_64 0:2.6.32-696.13.2.el6

再起動して、新しいカーネルバージョンで動作している状態で、再度 microsoft-hyper-v をインストールするとめでたく成功します。

root ユーザはパスワード認証不可になる

Azure Linux エージェントをインストールし、deprovision すると、 root ユーザのパスワードは無効化されるので、SSH できなくなります。警告メッセージとしても表示されます。

$ sudo waagent -force -deprovision
WARNING! The waagent service will be stopped.
WARNING! All SSH host key pairs will be deleted.
WARNING! Cached DHCP leases will be deleted.
WARNING! root password will be disabled. You will not be able to login as root.
WARNING! /etc/resolv.conf will be deleted.

あらかじめ公開鍵認証としておくか、後述の VMAccess 拡張機能を使用した認証情報のリセットが必要です。VMAccess 拡張機能はゲスト OS のファイアウォールの影響で動作しないことがあったりするので、あらかじめ公開鍵認証可能なユーザを用意しておく方がスムーズに勧められます。

Azure へアップロード可能な仮想ディスクは固定サイズの VHD 形式のみ

こちらの前提条件にも記載がありますが、カスタムイメージで対応しているのは固定サイズの VHD 形式のみです。
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/create-upload-centos?toc=%2fazure%2fvirtual-machines%2flinux%2ftoc.json

VMDK、VDI といった形式の場合、任意のツールで固定サイズの VHD へ変換する必要があります。

VHD アップロード

それでは、作成した VHD をアップロードしていきましょう。ここでは Azure CLI 2.0 を使って作業を進めていきます。

Azure ログイン、サブスクリプション設定

いつものようにログインし、使用するサブスクリプションを設定します。

$ az login
$ az account set --subscription <your-subscription-id>

必要リソースと Azure VM 作成

既存のリソースを使うことも可能ですが、ここではそれぞれ新規に作成していきます。
まず、リソースグループを作成します。

$ az group create \
    --name test-centos63 \
    --location japaneast

ストレージアカウントを作成します。

$ az storage account create \
    --resource-group test-centos63 \
    --location japaneast \
    --name testcentos63 \
    --kind Storage \
    --sku Standard_LRS

汎用ストレージにコンテナを作成します。

$ az storage container create \
    --account-name testcentos63 \
    --name vhds

汎用ストレージへのアップロードに必要なキーを表示し、控えておきます。

$ az storage account keys list \
    --resource-group test-centos63 \
    --account-name testcentos63

[
  {
    "keyName": "key1",
    "permissions": "Full",
    "value": <your key value>
  },
  {
    "keyName": "key2",
    "permissions": "Full",
    "value": <your key value>
  }
]

上記で表示されたキーのどちらかを指定して、ローカルに用意した VHD 形式の仮想ディスクをページ Blob としてアップロードします。

$ az storage blob upload --account-name testcentos63 \
    --account-key <your key value> \
    --container-name vhds \
    --type page \
    --file "/mnt/c/Users/ymizukura/VirtualBox VMs/centos63/centos63.vhd" \
    --name test-centos63.vhd

アップロードした VHD ファイルからマネージドディスクを作成します。

$ az disk create \
    --resource-group test-centos63 \
    --location japaneast \
    --sku Standard_LRS \
    --name test-centos63-disk \
    --source https://testcentos63.blob.core.windows.net/vhds/test-centos63.vhd

マネージドディスクから Azure VM を作成します。

$ az vm create \
    --resource-group test-centos63 \
    --location japaneast \
    --name test-centos63 \
    --os-type linux \
    --size Standard_A1 \
    --attach-os-disk test-centos63-disk

--generate-ssh-keys, --admin-user, --admin-password といった認証情報に関わるオプションは --attach-os-disk と一緒には指定できないのでご注意ください。認証情報は元の VM のユーザを使用するか、VMAccess 拡張機能を使用して認証情報のリセットが必要です。

認証情報のリセットは GUI でも可能です (Azure ポータルから対象 VM を選択し、「パスワードのリセット」を選択)。指定したユーザが存在する場合は指定した認証情報でリセット、存在しない場合は新規ユーザとして作成されます。

password-reset
ssh-auth-reset

az vm create コマンドの実行終了後、Azure 上のリソースを確認すると、仮想ネットワーク、パブリック IP 等のネットワーク系リソース含めて、Azure VM が作成されていることが確認できます。

created-azure-resources

コンピューター名がハイフンになっているのは仕様でしょうか・・・

azure-vm-info

SSH で接続してみると、無事認証できました。

azure-vm-ssh-login

まとめ

オンプレ仮想基盤の VM を Azure へ移行する手順を紹介しました。移行元 VM を単にアップロードすれば自動で変換してくれるものではなく、事前にゲスト OS 上で設定変更作業が必要となりますが、新規構築するのに工数がかかる/リスクがある場合や、事情により OS バージョンを上げられない場合などには有用だと思います。手元の VM をそのまま Azure へ持っていきたい時にはぜひお試しを!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です