[Azure] ローカル Hyper-V の Linux 仮想マシンから Linux VM を作成する

最近、Azureをいろいろと触っています。ローカルHyper-Vで作成した仮想マシンのインポートを試してみましたので紹介します。
2020.06.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菊池です。

Azureの勉強をかねて、ローカルのHyper-V上で作成したCentOS7の仮想マシンを、Azureにインポートして VM作成するまでを試してみました。

ローカル Hyper-V の Linux 仮想マシンから Linux VM を作成

それでは実際にやっていきます。移行元となる環境は以下の通りです。

  • 仮想マシン:CentOS Linux release 7.8.2003
  • ホスト:Windows 10 Professional

OSの設定

まずは、インポートするCentOS上で、事前準備のための設定を実施していきます。

/etc/sysconfig/networkを以下のように編集します。

$ sudo cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain

/etc/sysconfig/network-scripts/ifcfg-eth0を編集します。DHCPが有効、IPv6の無効であることを確認しましょう。

$ sudo cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
PEERDNS="yes"
PEERROUTES="yes"
USERCTL="no"
NM_CONTROLLED="no"

udev ルールを編集して、イーサネット インターフェイスの静的ルールが生成されないようにします。

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

Azure内でホストされるリポジトリを利用するように、/etc/yum.repos.d/CentOS-Base.repoを以下のように書き換えます。

$ sudo cat /etc/yum.repos.d/CentOS-Base.repo
[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

yumメタデータをクリアし、最新のパッケージに更新しておきます。

$ sudo yum clean all
$ sudo yum update

Azureの追加のカーネルパラメータを含むように編集します。

$ sudo cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rootdelay=300 console=ttyS0 earlyprintk=ttyS0 net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"

GRUB構成をリビルドしておきましょう。

$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1127.10.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1127.10.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-06562123303d48a1b233ed071cd4d4ba
Found initrd image: /boot/initramfs-0-rescue-06562123303d48a1b233ed071cd4d4ba.img
done

Azure Linux エージェントをインストールし、自動起動を設定しておきます。

$ sudo yum install python-pyasn1 WALinuxAgent
$ sudo systemctl enable waagent

スワップ領域を以下のように編集しておきます。

$ grep ResourceDisk /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.
ResourceDisk.MountOptions=None

仮想マシンをプロビジョニング解除し、Azure でのプロビジョニング用に準備します。

sudo waagent -force -deprovision
export HISTSIZE=0
logout

以上でOSの準備は完了です。ここまでできたら、仮想マシンをシャットダウンしておきます。

VHDXをVHDへの変換

利用可能な仮想ディスクは、容量固定のVHD形式となります。元の仮想マシンは容量可変のVHDX形式だったため、Hyper-Vマネージャにてディスク形式を変換します。

Hyper-Vマネージャの右のメニューから、[仮想ディスクの編集] を選択します。

仮想ハードディスクの変換ウィザードが立ち上がりますので、先に進みます。

変換対象のディスクを選択して次へ。

操作は [変換] を選びます。

VHDへの変換を選択。

こちらも[容量固定] を選びます。

変換後のVHDの出力先/ファイル名を選んで、実行します。

しばらくすると、変換が完了します。

VHDのインポート

作成できたVHDを、Azureにアップロードします。事前準備として、以下の2つのツールをインストールして利用可能にしておきましょう。

まずは az disk create で空のマネージドディスクを作成します。

$ az disk create -n centos7disk -g test -l japaneast --for-upload --upload-size-bytes 32212255232 --sku standard_lrs
{- Finished ..
  "creationData": {
    "createOption": "Upload",
    "galleryImageReference": null,
    "imageReference": null,
    "sourceResourceId": null,
    "sourceUniqueId": null,
    "sourceUri": null,
    "storageAccountId": null,
    "uploadSizeBytes": 32212255232
  },
  "diskIopsReadOnly": null,
  "diskIopsReadWrite": 500,
  "diskMbpsReadOnly": null,
  "diskMbpsReadWrite": 60,
  "diskSizeBytes": null,
  "diskSizeGb": null,
  "diskState": "ReadyToUpload",
  "encryption": {
    "diskEncryptionSetId": null,
    "type": "EncryptionAtRestWithPlatformKey"
  },
  "encryptionSettingsCollection": null,
  "hyperVgeneration": "V1",
  "id": "/subscriptions/89670823-7dcf-4a9b-9b0c-xxxxxxxxxxxx/resourceGroups/test/providers/Microsoft.Compute/disks/centos7disk",
  "location": "japaneast",
  "managedBy": null,
  "managedByExtended": null,
  "maxShares": null,
  "name": "centos7disk",
  "osType": null,
  "provisioningState": "Succeeded",
  "resourceGroup": "test",
  "shareInfo": null,
  "sku": {
    "name": "Standard_LRS",
    "tier": "Standard"
  },
  "tags": {},
  "timeCreated": "2020-06-04T04:17:10.440374+00:00",
  "type": "Microsoft.Compute/disks",
  "uniqueId": "6cdc3cc5-1745-4c96-9674-da4535772bcf",
  "zones": null
}

Azureポータルを確認すると、マネージドディスクが作成されていることがわかります。

続いて、このマネージドディスクにSAS(Shared Access Signatures)を作成して、アクセス可能にします。

$ az disk grant-access -n centos7disk -g test --access-level Write --duration-in-seconds 86400
{- Finished ..
  "accessSas": "https://md-impexp-xxxxxxxxxxxx.blob.core.windows.net/xxxxxxxxxxxx/abcd?sv=2017-04-17&sr=b&si=3b11230c-a077-4615-b44e-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

作成されたSASを利用し、AzCopyでVHDのアップロードを実行します。

$ ./azcopy copy "~/centos7.vhd" "https://md-impexp-xxxxxxxxxxxx.blob.core.windows.net/xxxxxxxxxxxx/abcd?sv=2017-04-17&sr=b&si=3b11230c-a077-4615-b44e-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" --blob-type PageBlob
INFO: Scanning...
INFO: Any empty folders will not be processed, because source and/or destination doesn't have full folder support

Job ca8aafb6-6df2-e142-46fb-29a21398c218 has started
Log file is located at: /Users/kikuchi.shuji/.azcopy/ca8aafb6-6df2-e142-46fb-29a21398c218.log

100.0 %, 0 Done, 0 Failed, 1 Pending, 0 Skipped, 1 Total, 2-sec Throughput (Mb/s): 73.518


Job ca8aafb6-6df2-e142-46fb-29a21398c218 summary
Elapsed Time (Minutes): 0.5342
Number of File Transfers: 1
Number of Folder Property Transfers: 0
Total Number of Transfers: 1
Number of Transfers Completed: 1
Number of Transfers Failed: 0
Number of Transfers Skipped: 0
TotalBytesTransferred: 32212255232
Final Job Status: Completed

アップロード完了です。生成したSASを無効化しておきます。

$ az disk revoke-access -n centos7disk -g test

ここでマネージドディスク を確認すると、30GBのディスクが生成されていることがわかります。

VMの作成

アップロードしたVHDを使って、仮想マシンを起動します。Azure CLIで以下のように実行します。

$ az vm create \
    --resource-group test \
    --name ImportedVM \
    --os-type linux \
    --size Standard_B2s \
    --vnet-name test-vnet \
    --subnet test-subnet1 \
    --public-ip-address "" \
    --attach-os-disk centos7disk
{- Finished ..
  "fqdns": "",
  "id": "/subscriptions/89670823-7dcf-4a9b-9b0c-xxxxxxxxxxxx/resourceGroups/test/providers/Microsoft.Compute/virtualMachines/ImportedVM",
  "location": "japaneast",
  "macAddress": "00-0D-3A-CD-8E-38",
  "powerState": "VM running",
  "privateIpAddress": "172.16.0.5",
  "publicIpAddress": "",
  "resourceGroup": "test",
  "zones": ""
}

起動できました。Azureポータルからも、VMが起動しているのが確認できます。

SSHで接続してみます。VnetにはVPNで接続してありますので、プライベートIPで直接接続できます。

$ ssh 172.16.0.5
The authenticity of host '172.16.0.5 (172.16.0.5)' can't be established.
ECDSA key fingerprint is SHA256:QarstG9qFnjMtIjMw1ORfKsiMBvtGytOMTiFrlbssps.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.16.0.5' (ECDSA) to the list of known hosts.
skikuchi@172.16.0.5's password:
Last login: Thu Jun  4 08:36:55 2020 from 10.212.134.200
$

特に問題なく、インポートしたVMに接続できることが確認できました!

まとめ

公式のドキュメントの手順にしたがって進めていくことで、特に迷ったりトラブルが発生することもなく、ローカルのHyper-Vの仮想マシンからAzure上のLinux VMが作成できました。