RHEL 7.3のKVMゲストイメージをAzureにCloud Accessで持ち込むための準備

RHELの既存のサブスクリプションをAzure Virtual Machineに持ち込むには、Red HatのCloud Accessという仕組みを利用します。最初にRegister Imageから登録する必要があり、[Cloud Provider]として"Microsoft Azure"を選択すると入力フィールドが[Microsoft Subscription Number]になります。Microsoft Subscription NumberはAzureのアカウント管理画面の[アカウント]から確認できます。

ここに表示されている"サブスクリプション ID"を確認してください。

ここまでの手続きが終了したら、RHEL 7.3のKVMゲストイメージをAzureに持ち込むための作業に移ります。必要なのはKVMゲストを動かせるRHEL環境とKVMゲストイメージです。KVMゲストイメージはRed Hatのカスタマーポータルから入手出来ます。

qcow2形式のKVMゲストイメージをRHEL上にダウンロードします。執筆時点でのファイル名は"rhel-guest-image-7.3-35.x86_64.qcow2"でした。以降は仮想ホストのRHEL上での作業になります。

まずKVMゲストイメージのrootパスワードをguestfishを利用して変更します。パスワードの生成にはopensslコマンドを利用します。コマンドの結果をコピーしておきます。

# openssl passwd -1 password $1$NrTCTkpe$cPwjzHZyMOpXmKTVH1UgB.

次にguestfishを起動します。もしツールがインストールされていない場合は、yumでインストールしてください。

yum -y install guestfish

viなどのエディタで/etc/shadowの"root"のエントリーを変更します。"!!"となっている部分を、先にコピーしておいたopensslコマンドの結果に変更します。

guestfish --rw -a rhel-guest-image-7.3-35.x86_64.qcow2
><fs> run
><fs> list-filesystems
/dev/sda1: xfs
><fs> mount /dev/sda1 /
><fs> vi /etc/shadow
><fs> exit

つまり、こうなっている部分が

root:!!:17107:0:99999:7:::

このようになります。

root:$1$NrTCTkpe$cPwjzHZyMOpXmKTVH1UgB.:17107:0:99999:7:::

次にvirt-managerで"rhel-guest-image-7.3-35.x86_64.qcow2"からゲストを起動します。[既存のディスクイメージをインポート(E)]を選択します。

OSの種類を指定して、起動します。

virt-managerのSPICEの画面では何かと作業効率が悪いので、ゲストのsshdを設定してログイン出来るようにします。 以降はvirt-managerのコンソールを利用したゲスト上での作業になります。
/etc/ssh/sshd_configの"PasswordAuthentication no"を"yes"に、"ClientAliveInterval 0"から"180"に変更し、sshdを再起動します。

これを

PasswordAuthentication no

こうします。

PasswordAuthentication yes

コメントアウトされているClientAliveIntervalを

#ClientAliveInterval 0

こうします。

ClientAliveInterval 180

sshdを再起動します。これでゲストにsshでログイン出来ます。 以降はsshを経由したゲスト上での作業になります。 # systemctl restart sshd

エディタで以下のように/etc/sysconfig/networkを編集します。HOSTNAMEを追加し、NOZEROCONFをコメントアウトするだけです。

NETWORKING=yes
HOSTNAME=localhost.localdomain
#NOZEROCONF=yes

/etc/sysconfig/network-scripts/ifcfg-eth0を編集します。

# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
BOOTPROTOv6="dhcp"
ONBOOT="yes"
TYPE="Ethernet"
USERCTL="yes"
PEERDNS="yes"
IPV6INIT="yes"
PERSISTENT_DHCLIENT="1"

こうします。

# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
#BOOTPROTOv6="dhcp"
ONBOOT="yes"
TYPE="Ethernet"
USERCTL="no"
PEERDNS="yes"
IPV6INIT="no"
#PERSISTENT_DHCLIENT="1"

変更したのは以下の箇所です。

# diff /etc/sysconfig/network-scripts/ifcfg-eth0.orig /etc/sysconfig/network-scripts/ifcfg-eth0
3c3
< BOOTPROTOv6="dhcp"
---
> #BOOTPROTOv6="dhcp"
6c6
< USERCTL="yes"
---
> USERCTL="no"
8,9c8,9
< IPV6INIT="yes"
< PERSISTENT_DHCLIENT="1"
---
> IPV6INIT="no"
> #PERSISTENT_DHCLIENT="1"

ゲストをsubscription-managerで登録します。

# subscription-manager register --auto-attach --username=XXXXXX --password="XXXXXX"
登録中: subscription.rhsm.redhat.com:443/subscription
このシステムは次の ID で登録されました: bfb8d8c9-984a-4e8a-8ffa-xxxxxxxxxxxx

インストール済み製品の現在の状態:
製品名: Red Hat Enterprise Linux Server
状態:   サブスクライブ済み

エディタで/etc/default/grubのGRUB_CMDLINE_LINUXパラメータを編集します。

GRUB_CMDLINE_LINUX="console=tty0 crashkernel=auto no_timer_check net.ifnames=0 console=ttyS0,115200n8"

こうします。

GRUB_CMDLINE_LINUX="rootdelay=300 console=ttyS0 earlyprintk=ttyS0"

GRUBの構成を反映します。

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

Hyper-Vのモジュールをinitramfsに追加するため、/etc/dracut.confを編集します。

#add_dracutmodules+=""

こうします。

add_drivers+="hv_vmbus hv_netvsc hv_storvsc"

initramfsを再構築します。

# dracut -f -v
Executing: /usr/sbin/dracut -f -v
dracut module 'busybox' will not be installed, because command 'busybox' could not be found!
dracut module 'plymouth' will not be installed, because command 'plymouthd' could not be found!
dracut module 'plymouth' will not be installed, because command 'plymouth' could not be found!
......
*** Creating image file done ***
*** Creating initramfs image file '/boot/initramfs-3.10.0-514.el7.x86_64.img' done ***

cloud-init をアンインストールします。

# yum -y remove cloud-init

不要なレポジトリを無効化し、必要なレポジトリを有効化し、WALinuxAgent RPMパッケージを追加インストールした後、WALinuxAgentサービスを有効にします。

# subscription-manager repos --disable=*
# subscription-manager repos --enable=rhel-7-server-rpms --enable=rhel-7-server-extras-rpms --enable=rhel-7-server-eus-rpms
# yum -y install WALinuxAgent
# systemctl enable waagent

Azure Virtual MachineではOSのディスク領域ではなく、ローカルのディスク領域をスワップとして用いる必要があります。WAAgentの設定・/etc/waagent.confを編集します。

# Create and use swapfile on resource disk.
ResourceDisk.EnableSwap=n

# Size of the swapfile.
ResourceDisk.SwapSizeMB=0

こうします。

# Create and use swapfile on resource disk.
ResourceDisk.EnableSwap=y

# Size of the swapfile.
ResourceDisk.SwapSizeMB=2048

サブスクリプション登録を解除します。

# subscription-manager unregister

仮想マシンのプロビジョニングを解除します。

# 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.
2016/12/23 16:05:05.919871 INFO examine /proc/net/route for primary interface
2016/12/23 16:05:05.920595 INFO primary interface is [eth0]
2016/12/23 16:05:05.921023 INFO interface [lo] has flags [73], is loopback [True]
2016/12/23 16:05:05.921474 INFO interface [lo] skipped
2016/12/23 16:05:05.922003 INFO interface [eth0] has flags [4163], is loopback [False]
2016/12/23 16:05:05.922429 INFO interface [eth0] selected

ログアウトします。

# export HISTSIZE=0
# logout>/mark>

以降は仮想ホストのRHEL上での作業になります。 virt-managerでゲストを停止します。
qcow2イメージをrawイメージに変換します。

# qemu-img convert -f qcow2 -O raw rhel-guest-image-7.3-35.x86_64.qcow2 rhel-guest-image-7.3-35.x86_64.raw

rawイメージのファイルのサイズを切り上げます。

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

rawイメージをvhdイメージに変換します。

# qemu-img convert -f raw -o subformat=fixed -O vpc rhel-guest-image-7.3-35.x86_64.raw  rhel-guest-image-7.3-35.x86_64.vhd

このvhdイメージをAzure Storage Containerにアップロードし、仮想マシンをデプロイします。