ubichupas.net

KVMゲストをシリアルコンソールとUSBメモリでインストール

何でも「仮想マシン」と呼んでしまう癖が抜けないのですけど、 CPUなどのエミュレータがQEMUでリソース管理を行うハイパーバイザーがKVM、 そしてXenなど他のハイパーバイザーと共通化を図ったlibvirtライブラリがあり、 CUIならvirshコマンド、GUIならvirt-managerで操作します。
自分が仮想マシンと呼んでいるものはlibvirtの「ドメイン」にあたり、 これだけでも覚えておかないとヘルプを読んだときに「ドメインの再起動???」となってしまうのです。

ドメインの定義

ディスプレイ無しでシリアルコンソールを使うシンプルなXMLファイルが書けました。 このXMLで仮想マシン毎に変更が必要なのは<name><disk><source>だけです。 あとはホスト側に用意した仮想ネットワークに合わせて<interface>が変わります。
ドメインXMLのフォーマットについてはここを参照

centos-73min.xml
<domain type='kvm'>
  <name>centos-73min</name>
  <memory unit='GiB'>1</memory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <bootmenu enable='yes' timeout='3000'/>
    <bios useserial='yes' rebootTimeout='0'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/centos-73min.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <controller type='usb' index='0' model='nec-xhci'/>
    <interface type='bridge'>
      <source bridge='br0'/>
      <model type='virtio'/>
    </interface>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
  </devices>
</domain>

好きな容量のディスクイメージを<disk><source>で指定した場所に用意して、XMLファイルから仮想マシンを作成します。 virsh defineした段階でuuid、macアドレス、pciスロット番号などが適切に補われるため上記のXMLファイルでは指定していません。 さらにvirsh startした段階でホスト側のブリッジと繋がるTAPインタフェースの名前(vnet?)やシリアルコンソールが繋がる擬似端末(/dev/pts/?)の番号が決まります。

kvm-host
[root@localhost ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos-73min.qcow2 10G
Formatting '/var/lib/libvirt/images/centos-73min.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off

[root@localhost ~]# virsh define centos-73min.xml
ドメイン centos-73min が centos-73min.xml から定義されました

[root@localhost ~]# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 -     centos-73min                   シャットオフ

USBインストールメディアの作成

CentOSのISOイメージをddコマンドでUSBメモリに書き込むだけでそのままブート可能なメディアになります。

kvm-host
[root@localhost ~]# dd if=CentOS-7-x86_64-Minimal-1611.iso of=/dev/sdc bs=512k
1360+0 レコード入力
1360+0 レコード出力
713031680 バイト (713 MB) コピーされました、 46.8097 秒、 15.2 MB/秒
そのUSBメモリを仮想マシンに接続するためのXMLファイルも用意しておきましょう。
kvm-host
[root@localhost ~]# lsusb
Bus 001 Device 002: ID 8087:0a2b Intel Corp.
Bus 002 Device 009: ID 0411:021a BUFFALO INC. (formerly MelCo., Inc.)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

[root@localhost ~]# cat usb.xml
<hostdev mode='subsystem' type='usb'>
  <source>
    <vendor  id='0x0411'/>
    <product id='0x021a'/>
  </source>
</hostdev>

テキストモードでのインストール

仮想マシンを起動してUSBメモリを接続したらシリアルコンソールにアクセスします。 このとき仮想マシンはブートメディアが無くてリブートを繰り返している状態です。

kvm-host
[root@localhost ~]# virsh start centos-73min
ドメイン centos-73min が起動されました

[root@localhost ~]# virsh attach-device centos-73min usb.xml --live
デバイスが正常に接続されました

[root@localhost ~]# virsh console centos-73min

ESCキーを押してブートメニューを開き、認識されたUSBメモリを選択します。 ドメインの定義で<bootmenu enable='yes'><bios useserial='yes'>を有効にしておかないとこの辺の作業はできません。

CentOSをDVDでインストールするときと同じ画面が出るので Tabキーを押して起動オプションに「inst.keymap=jp inst.text console=ttyS0」を書き足します。 一気にコピペすると失敗するため1文字ずつ入力しましょう。

テキストモードのインストールプログラムが表示され、 Installation sourceが検出できていれば成功したも同然です。 最小構成以外の場合は素直にVNC経由でグラフィカルモードを使いましょう。

CentOSのインストールが完了すると1つのCPUと1GBのメモリ、XMLファイルで定義したPCIデバイスが仮想マシンに実装されたことを確認できます。

kvm-guest
[root@localhost ~]# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 13
model name      : QEMU Virtual CPU version 1.5.3
stepping        : 3
microcode       : 0x1
cpu MHz         : 4008.000
cache size      : 4096 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 4
wp              : yes
flags           : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm rep_good nopl pni cx16 hypervisor lahf_lm abm
bogomips        : 8016.00
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

[root@localhost ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1016532       83880      664024        6640      268628      765616
Swap:       1048572           0     1048572

[root@localhost ~]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:03.0 Ethernet controller: Red Hat, Inc Virtio network device
00:04.0 USB controller: NEC Corporation uPD720200 USB 3.0 Host Controller (rev 03)
00:05.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:06.0 Unclassified device [00ff]: Red Hat, Inc Virtio memory balloon

ここから先はACPIが有効になるので、virsh destroyでなくvirsh shutdownで仮想マシンを停止させるようにしましょう。 最後にUSBメモリが仮想マシンに挿さったままになっているためホスト側に戻って抜いておきます。

kvm-host
[root@localhost ~]# virsh detach-device centos-73min usb.xml --live
デバイスが正常に切断されました

1 件のコメント:

ubichupas
さんのコメント...
使い終わったUSBメモリはWindowsのdiskpartコマンドでフォーマットした。