2016年10月26日水曜日

仮想マシンでuEFIが使えるようにしよう その2

前回、KVMにuEFIファームウェア(OVMF)を導入し、新規仮想マシンでuEFIが使えるようにした。
今回は、Ubuntuに用意されているもう一つのパッケージ、qemu-efiを使ってみようと思う。

というわけで導入だ。
(aquarius) $ sudo apt-get update
(aquarius) $ sudo apt-get --simulate install qemu-efi
(aquarius) $ sudo apt-get install qemu-efi
あっさり導入できた。

では、virt-managerで仮想マシンを作成してみよう。
(aquarius) $ virt-manager

確かに、ファームウェアに新しく「UEFI aarch46: /usr/share/AAVMF/AAVMF_CODE.fd」がエントリされた。


ただ、これを選択して「インストールの開始」を実行しても、エラーになる。



エラーメッセージを見てみると「oversized backing file, pflash segments cannot be mapped under 00000000ff800000」と表示されている。

これ、ファームウェアのサイズが大きすぎて、ファームウェア用のメモリ空間に収まらないってことじゃないか?
実際、/usr/share/AAVMF/AAVMF_CODE.fdのサイズは64MByte。
それを、ff800000のアドレスにマップしようとしている。
ff800000~ffffffffのアドレス空間は、約8MBしかない。これじゃ64MByteもあるAAVMF.fdは収まらないよな…。
対して、OVMFのファームウェア(/usr/share/ovmf/OVMF.fd)は2MByte。AAVMF.fdはサイズが大きすぎるのでは?

ただ、調べてみると「/etc/libvirt/qemu.confを一部書き換えればいいよ」という情報もある。その内容は、あくまで権限の話で、ファームウェアのメモリ空間を広げる、という話ではなさそうだ。
ファームウェアのメモリ空間の話な気がしているので、仮想マシンに割り与えるメモリサイズとは関係が無い。

さて…ちょっと調べた限りでは、本格的な対応方法が分からないや。
この件に関しては、一旦保留にして、この先必要になったら調査することにしよう。

というわけでアンインストールしてしまう。
(aquarius) $ sudo apt-get --simulate purge qemu-efi
(aquarius) $ sudo apt-get purge qemu-efi

今回はまともな結論にならなかったけど、まぁいいか。

2016年10月23日日曜日

仮想マシンでuEFIが使えるようにしよう

これまでで、自由に仮想マシンを作ってゲストOSを導入、ネットワークを利用することが出来るようになった。

ただ、これらの仮想マシンは、ファームウェアとしては旧来のBIOS形式だけだ。
仮想マシン上でuEFIを利用することは出来ないだろうか?
利用出来る。ただし、現時点ではホストOS(aquarius)で、KVM用のuEFIファームウェアが用意されていないので、今のaquariusでは利用することが出来ない。

今回は、uEFIのファームウェアをインストールして、新規仮想マシンでuEFIを指定することが出来るようにする、というのが目的だ。
まぁ、仮想マシンでuEFIを利用するのに、どの程度のメリットがあるのか?という点も気にはなるが。
まだ出来るかどうか分からないが、ディスクレスクライアントに相当する環境を作ることが出来るのではないか?とちょっと期待している。

まぁ、難しいことは抜きにして、uEFI環境を作ってみよう。

まずは、どのパッケージがKVM-uEFI環境を作るのに必要か確認だ。
(aquarius) $ sudo apt-get update
(aquarius) $ apt-cache search uefi
たくさん出てくるが、それらしいパッケージ名は以下の2つだろう。
  • ovmf - UEFI firmware for virtual machines
  • qemu-efi - UEFI firmware for virtual machines
さて、じゃあどちらを使うべきか?

それぞれのパッケージの詳細を見てみよう。
(aquarius) $ apt-cache show ovmf
(aquarius) $ apt-cache show qemu-efi
どちらも、メンテナは同じ「Ubuntu Developers」で、オリジナルソースも同じ「edk2」のようだ。
備考としては、前者は

Description-en: UEFI firmware for virtual machines
 Open Virtual Machine Firmware is a build of EDK II for virtual machines.
 It includes full support for UEFI, including Secure Boot, allowing use
 of UEFI in place of a traditional BIOS in your VM.


と書かれているのに対し、後者は

Description-en: UEFI firmware for virtual machines
 qemu-efi is a build of EDK II for virtual machines. It allows virtual machines
 to run in a UEFI environment.


だ。
前者の方が高機能に見えるのだが、インストールサイズは、前者が4130に対し、後者は133152だ。ぜんぜん違う。
どちらがいいのだろうか?

よく分からないので、まずは前者をインストールしてみよう。
(aquarius) $ sudo apt-get --simulate install ovmf
(aquarius) $ sudo apt-get install ovmf

インストールしてみたら、virt-managerから仮想マシンを作ってみよう。
内容は、virt-managerで新規仮想マシンを作ろう に従い、最後の「インストールの前に設定をカスタマイズ」にチェックを入れて、詳細確認するところの画面まで行く。
(aquarius) $ virt-manager
とりあえず、カスタマイズの画面までは同じなので、カスタマイズの画面までは飛ばす。

カスタマイズの画面、概要ページのファームウェアを見てみよう。
プルダウンで選択できそうな状態になっている。


ここで、プルダウンを選んでみよう。
今までは「BIOS」しか選べなかったが、新しく「UEFI x86_64: /usr/share/OVMF/OVMF_CODE.fd」が選べるようになった。


今回の仮想マシンは、このOVMF_CODE.fdを選んだ状態で「インストールの開始」をしてみよう。
(uEFIを確認するのが目的なので、インストール用のCDメディアは用意しなくていいぞ)


なんか失敗したように見えるが、実は仮想マシンは完成していて、起動もしているぞ。(遠隔からの操作の場合に、これが出るのかもしれない。)
とりあえず、CLOSEする。


仮想マシンの詳細設定画面からは、「インストールのキャンセル」をクリックしよう。


「インストールを中断します」のダイアログは、「Yes」でいい。


仮想マシンの一覧には、testは作成済み、実行中になっているはずだ。
testを選択した状態で、「開く」ボタンをクリックしよう。


仮想マシンのコンソールが立ち上がってきて、EFI Shellの状態になっているのが確認できるはずだ。
これは、仮想HDDにはOSが入っておらず、それ以外のブートデバイス(CD-ROM等)も存在しないため、OSのブートが出来ず、EFI Shellが起動した、という状態だ。


uEFIの起動にかかる部分を確認するために、一度電源ボタンの横の▼マークから、「強制的にリセット」を選択しよう。


警告のダイアログが出るが、特にデータもないため、恐れず「Yes」だ。


画面の流れが一瞬でキャプチャ出来ないが、uEFIが起動しようとしているのは確認できるはずだ。

またEFI Shellになってしまったが、ここでexitと実行してみよう。
EFI Shellから抜けて、ブートメニューに入るはずだ。



適当に操作して、EDK IIと呼ばれているuEFIの動きを見てみてもいい。

ある程度感触を掴んだら、電源ボタンで強制的にOffさせ、仮想マシンを削除してしまおう。


次は、もう一つのuEFIである、qemu-efi を試してみたい。
が、ちょっと長くなったので、次回にする。

2016年10月22日土曜日

virt-managerで新規仮想マシンを作ろう その3

さて、前回までで、virt-managerを使用して、仮想マシンtestを作成し、その仮想マシンにゲストOSとしてUbuntu 16.10をインストールするところまで実施した。
最後に、この仮想マシンを削除するところをやってしまおう。

削除はvirshからでも出来るが、このままvirt-managerを使用して削除する。

virt-managerを落としていたら、また起動しよう。
(aquarius) $ virt-manager

virt-managerから、削除したい仮想マシンを選択し、メニューバーの「編集」から「Delete」を選択する。


対象の仮想マシンが仮想ストレージを持っている場合、その仮想ストレージごと削除するか聞いてくる。
仮想ストレージを他で流用するツモリなら、チェックを外そう。
今回は、綺麗さっぱり削除するツモリなので、チェックが入ったまま「Delete」だ。
ただ、この仮想マシンが.isoファイルをマウントしている場合も、削除するか聞いてくる。
通常、.isoイメージは流用することが多いため、当該イメージのチェックは外しておいた方がいいだろう。


もう一回、削除するか確認が入るので「Yes」を押して確定しよう。


あっさりさっくり削除されたぞ。


一応、virshからも確認しておこう。
(aquarius) $ virsh list --all
(aquarius) $ virsh vol-list default
(aquarius) $ sudo ls -l /var/lib/libvirt/images

削除されたのが確認できた。
これで、virt-managerから仮想マシンを削除する手順はおしまい。

2016年10月21日金曜日

virt-managerで新規仮想マシンを作ろう その2

というわけで、仮想マシンtestは出来上がった。
とはいえ、OSも何も入っていないので、今回はOSを導入するところ(と、その前後の作業)だ。

まずは、新規仮想マシンにインストールするOSメディアの用意からだ。
testには、つい先日リリースされたばかりのUbuntu 16.10を導入してみよう。

というわけで、Ubuntu 16.10のインストールメディアの入手からだ。

(aquarius) $ sudo su -
(aquarius) # cd /var/lib/libvirt/images
(aquarius) # pwd
(aquarius) # df .
ディスクに空き容量があることは確認しておこう。

(aquarius) # wget http://releases.ubuntu.com/16.10/ubuntu-16.10-server-amd64.iso
(aquarius) # ls -l
(aquarius) # chown libvirt-qemu:kvm ubuntu-16.10-server-amd64.iso
(aquarius) # chmod 644 ubuntu-16.10-server-amd64.iso
(aquarius) # ls -l
(aquarius) # exit

これでメディアは用意できた。

今ダウンロードしたばかりの.isoイメージ、libvirtに認識されていないかもしれない。
一度認識させておこう。
(aquarius) $ virsh pool-refresh default
(aquarius) $ virsh vol-list default
(aquarius) $ virsh vol-info ubuntu-16.10-server-amd64.iso default
先ほどダウンロードしたメディアの情報が出てきたらOKだ。

続いて、spiceのポートを変更しよう。
仮想マシン作成時、spiceの設定は一切いじっていない。そのため、デフォルトのautoになっているはずだ。
これだと、遠隔接続でポート転送設定を組み合わせたい時に不便だ。なので、固定ポートを設定しておこう。
しまった、spiceのポートだ!で設定したことと同じことを行うのだが、piscesで9001、ariesで9003を使用しているので、testは暫定的に9005を指定しよう。

(aquarius) $ virsh edit test
以下のブロックを探し出そう。
    <graphics type='spice' autoport='yes'>
      <image compression='off'/>
    </graphics>
このブロックを、以下のように修正だ。
    <graphics type='spice' port='9005' autoport='no' listen='127.0.0.1'>
      <listen type='address' address='127.0.0.1'/>
      <image compression='off'/>
    </graphics>

これで、この仮想マシンには、piscesやariesと同じような形で接続が出来るようになった。(teratermでのポート転送は追加しておく必要があるが。)

ここまで出来たら、仮想マシンにOSをインストールする流れだ。
virt-managerを起動して、.isoイメージをマウント、仮想マシンの電源を入れる。
(aquarius) $ virt-manager
(すでにvirt-managerを起動していたら、わざわざ起動する必要は無いぞ)

test仮想マシンをクリックして選択し、メニューバーの「編集」から「仮想マシンの詳細」をクリックしよう。


仮想マシンのウィンドウが出たら、メニューバーの「表示」から「詳細」を選択だ。


仮想マシンの詳細設定が表示される。
この仮想マシンには、まだCD-ROMドライブを付けていないので、CD-ROMドライブを搭載する。
左下の「ハードウェアを追加」のボタンをクリックだ。


「新しいハードウェアを追加」の画面が表示されたら、左のハードウェアの種類で「Storage」が選択されていることを確認(選択されてなかったらクリックして選択)し、デバイスの種類を変更しよう。
(デフォルトでは、「ディスクデバイス」になっているはずだ)


デバイスの種類を「CD-ROMデバイス」に変更したら、マウントするメディアを指定するために、すぐ上の「管理」ボタンをクリック。


ストレージボリュームを選択する画面が出てくるので、「default」プールのubuntu16.10メディアを選択し、「ボリュームの選択」ボタンをクリック。


指定した.isoファイルが選択されているのが確認できたら、「完了」ボタンでウィンドウを閉じよう。


ハードウェア一覧に「IDE CD-ROM」が入ったのが確認できたら、今度は、CD-ROMからブートするために「ブートオプション」をクリックしよう。


起動デバイスの順序に、仮想ディスク、仮想CD-ROM、仮想NICの3つが入っていると思う。
仮想ディスクと仮想CD-ROMにチェックを入れて、ボックス右側の上下ボタンで、仮想CD-ROMが上に来るようにしよう。
設定したら、右下の「Apply」ボタンで確定する。


ブート順の指定が終わったら、仮想マシンを起動しよう。
まずは画面をコンソールに切り替えて、「仮想マシンの電源を入れる」ボタンだ。


すぐにメディアブートして、インストーラーが立ち上がってくるはず。
適当にインストールしてみよう。(この環境は、適当に動かしたらすぐ消すので、あまり細かいことは考えなくていいぞ。)
ホスト名は、仮想マシン名と同じく「test」にしておくことにする。


インストーラーの最後に、「メディアが取り除かれていることを確認してください」の画面が出てくる。
この時点で、仮想CD-ROMから.isoファイルを取り出しておこう。
「仮想マシンの情報を表示」ボタンを押す。(マウスカーソルが画面から出ない場合は、キーボードの左Ctrlキーと左Altキーの同時押しで出せるようになるぞ。)


画面左から「CD-ROM」ドライブを選択し、「Disconnect」ボタンで取り外せる。


取り外したら、もう一度コンソールを表示させ、作業を継続しよう。


インストールが完了したら、自動で再起動され、testが起動してくる。


ちなみに、sshのポート転送設定(9005番ポートの設定)が正しく出来ていれば、Remote-Viewerから接続することも可能だ。


この場合、今までつないでいたコンソールが「エラー: ハイパーバイザーホストへのビューアーの接続は拒否されたか切断されました。」というエラーになって切断されるが、正常動作だ。
仮想マシン設定の画面を一度閉じて、仮想マシンマネージャーから再度testを開けば、また見ることが出来るようになる。


これで、virt-managerから仮想マシンを作成する手順は終わりだ。
testを使用することは無いので、シャットダウンしておこう。
(test) $ sudo shutdown -h now

次回は、このtestを削除する手順だ。

2016年10月19日水曜日

virt-managerで新規仮想マシンを作ろう

KVMの環境がだいぶ整ってきた。とは言え、まだ仮想マシンは2つだけだ。
そこで、新しい仮想マシンを作る手順について整理しておこうと思う。

新しい仮想マシンを作成する手順は、こちらで把握している限り以下の5つだ。
  1. virt-installコマンドで作る
  2. 仮想ディスク等を用意し、仮想マシンの定義ファイル(xmlファイル)を作成、virshにそれを取り込む
  3. virt-managerを用いて作成する
  4. 物理マシンからKVM/QEMUにコンバートする(P2V)
  5. 他のハイパーバイザーで作成した仮想マシン(VMware製品で作成した仮想マシン等)から移行する
1番目は、libvirtを忘れずに で記載済みだ。
2番目は同様に、pisces忘れるな で記載済み。

今回は、今後最も使うことになると思われる、3番目に触れたいと思う。

3番目を実施するうえで、いくつか注意しないといけない点がある。
  • まず、コンソールはspiceプロトコルになるのだが、これがデフォルトではTLS接続も有効化されてしまう。現時点では、spiceプロトコル用のTLS設定(証明書類)はまったく用意していないため、起動時にコケてしまう可能性がある。そのため、仮想マシン作成直後は、spice設定はいじらないようにする。
  • 仮想マシン作成時は、予めOSインストールメディアを用意しておくか、予め作成済みの仮想ディスクを用意しておく必要がある。インストールメディアを用意しての導入は、最初の仮想マシン起動が上手くいかないことがあるため、予め仮想ディスクを作成しておくことにする。
というわけで、実際に作成してみよう。

まずは、aquariusでvirt-managerを起動する。
(aquairus) $ virt-manager


仮想マシンマネージャーが起動したら、新規に仮想ディスクを作成する。
メニューバーの「編集」から「接続の詳細」だ。
「接続の詳細」画面が立ち上がってくると思う。


そこの「ストレージ」をクリックしよう。


ストレージプールの一覧(今は、defaultプールしか存在しないが)と、そのストレージプールに入っている仮想ディスク(ボリューム)の一覧が表示されるはずだ。(幾つかのisoファイル等を追加しているため、少し多いが。)
defaultプールに仮想ディスクを追加したいので、このまま「ボリューム」の右横の+ボタンをクリックしよう。


「ストレージボリュームを追加」というウィンドウが開く。

新規に作成する仮想ストレージの名前、サイズを決めたら「完了」だ。
仮想ディスクのフォーマットが幾つか選べるが、とりあえずqcow2にしておこう。
(他のフォーマットは別途調査する)


今回は名前をtest、容量を40GBにしてみたぞ。
(すぐ削除するツモリなので、仮の名前にしている)


作成されたのが確認できるはずだ。


確認できたら、「接続の詳細」画面はメニューバーの「ファイル」から「Close」でクローズしよう。


いよいよ、仮想マシンの作成だ。
「仮想マシンマネージャー」のメニューバー「ファイル」から「新しい仮想マシン」をクリック。


「新しい仮想マシン」というウィンドウが開いてくる。いわゆるウィザード形式だ。
この最初の画面に4つの選択肢が出てくるが、ここで先ほど作成した仮想ディスクを用いることになる。
そのため、「既存のディスクイメージをインポート」にチェックを入れて、「Forward」だ。
(他の手順も暇があったら試してみたいが。)


次の画面は、仮想ストレージを指定する画面だ。「参照」ボタンを使って、先ほど作成したtest.qcow2を指定しよう。




同画面で、ゲストOSの種類とバージョンを選択することができる。
この指定は、virt-managerでは後から変更が出来ない。virshからなら変更できるだろうけど。
今回は下図のように、Linux / Ubuntu 16.04 を選んでおく。


次の画面は、割り当てるメモリー量とCPU数だ。これは後からでも簡単に変更できるので、とりあえず表示されている通りの1024MB/1CPUにしておこう。


これでとりあえず最低限のことは出来たが、このタイミングでまだ手を加えておきたいところがある。


上図の「名前」欄は、仮想マシンの名前に相当する。(piscesとかariesとかのね)
今回は、すぐ削除するツモリなので、testとしておく。

また、「インストール前に設定をカスタマイズする」にチェックを入れておくと、細かい設定変更が可能だ。
一応、チェックを入れておこう。

最後の「ネットワークの選択」は、三角マークをクリックしていればわかる通り、接続するNICをdefaultにするか、先日作成したOpen vSwitchのスイッチにするかが選べる。
Open vSwitchのスイッチを選ぼう。


「完了」をクリックすると、今作った仮想マシンの詳細設定を実施する画面になる。

後から幾つか変更することになるが、今はとりあえず「概要」ページの「ファームウェア」だけチェックしておこう。


BIOSかUEFIかを選べるはずなのだが、現時点ではKVM用のUEFIをインストールしていないため、変更することが出来ない。
しかもこれ、仮想マシン作成時にしか変更することが出来ないのだ。

一旦はこのまま、「インストール」をクリックしてしまおう。


すぐにコンソール画面が出て、No bootable device.と表示されて止まったはずだ。


そんなことは当たり前で、用意した仮想ディスクは空っぽだし、ブート可能なCDメディア等も用意していない。これで起動してくるはずは無い。

とりあえずは停止させてしまおう。
メニューバーから、「強制的に電源OFF」だ。


確認ダイアログが出るので「Yes」をクリックしよう。


仮想マシンのモニタ画面は「仮想マシンが稼動していません」の状態になったはず。
こちらも、メニューバーからCloseしよう。


仮想マシンの一覧に、先ほど作成した「test」が表示されているのが確認できるはずだ。


次回は、このtestにUbuntuをインストールしてみる。