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にアップロードし、仮想マシンをデプロイします。