#
mv /etc/grub.d/20_linux_xen /etc/grub.d/09_linux_xen
#
update-grub
xen-create-image
コマンドが含まれます。これはタスクの大部分を自動化します。必須のパラメータは --hostname
だけで、このパラメータは domU の名前を設定します。他のオプションは重要ですが、/etc/xen-tools/xen-tools.conf
設定ファイルに保存することが可能です。そして、コマンドラインでオプションを指定しなくてもエラーは起きません。このため、イメージを作る前にこのファイルの内容を確認するか、xen-create-image
の実行時に追加的パラメータを使うことが重要です。以下に注目すべき重要なパラメータを示します。
--memory
、新たに作成するシステム用の RAM のサイズを指定します。
--size
と --swap
、domU で利用できる「仮想ディスク」のサイズを定義します。
--debootstrap
、debootstrap
を使って新しいシステムをインストールします。さらに、このオプションを使う場合、--dist
オプション (ディストリビューションの名前、たとえば jessie) を一緒に使うことが多いです。
--dhcp
は domU のネットワーク設定を DHCP で取得することを宣言します。対して、--ip
は静的 IP アドレスを定義します。
--dir
オプションを使い、各 domU を格納するデバイス用のファイルを dom0 上に作成する方法です。LVM を使っているシステムでは、--lvm
オプションを使い、ボリュームグループの名前を指定しても良いでしょう。そして xen-create-image
は新しい論理ボリュームをグループの中に作成し、この論理ボリュームがハードディスクドライブとして domU から利用できるようにされます。
#
xen-create-image --hostname testxen --dhcp --dir /srv/testxen --size=2G --dist=jessie --role=udev
[...] General Information -------------------- Hostname : testxen Distribution : jessie Mirror : http://ftp.debian.org/debian/ Partitions : swap 128Mb (swap) / 2G (ext3) Image type : sparse Memory size : 128Mb Kernel path : /boot/vmlinuz-3.16.0-4-amd64 Initrd path : /boot/initrd.img-3.16.0-4-amd64 [...] Logfile produced at: /var/log/xen-tools/testxen.log Installation Summary --------------------- Hostname : testxen Distribution : jessie MAC Address : 00:16:3E:8E:67:5C IP-Address(es) : dynamic RSA Fingerprint : 0a:6e:71:98:95:46:64:ec:80:37:63:18:73:04:dd:2b Root Password : adaX2jyRHNuWm8BDJS7PcEJ
vif*
、veth*
、peth*
、xenbr0
です。Xen ハイパーバイザは定義された配置に従いユーザ空間ツールの制御の下でインターフェースを準備します。NAT と routing モデルは特定の場合にのみ適合します。このためわれわれは bridging モデルを使います。
xend
デーモンは既存のネットワークブリッジの中に仮想ネットワークインターフェースを統合する (複数のブリッジが存在する場合 xenbr0
を優先する) ように設定されています。このためわれわれは /etc/network/interfaces
の中にブリッジをセットアップして (bridge-utils パッケージをインストールする必要があります。このため bridge-utils パッケージは xen-utils-4.4 パッケージの推奨パッケージになっています)、既存の eth0 エントリを置き替えます。
auto xenbr0 iface xenbr0 inet dhcp bridge_ports eth0 bridge_maxwait 0
xl
コマンドを使って domU を起動することが可能です。さらに、ドメインを表示、起動、終了するなどの操作を行うことが可能です。
#
xl list
Name ID Mem VCPUs State Time(s) Domain-0 0 463 1 r----- 9.8 #
xl create /etc/xen/testxen.cfg
Parsing config from /etc/xen/testxen.cfg #
xl list
Name ID Mem VCPUs State Time(s) Domain-0 0 366 1 r----- 11.4 testxen 1 128 1 -b---- 1.1
testxen
domU は仮想メモリではなく RAM から取った真のメモリを使い、このメモリ領域は dom0 によって使われる場合もあります。この点に注意してください。このため、サーバを作ることが Xen インスタンスをホストすることを意味する場合、それに応じて物理 RAM を供給することになる点に注意が必要です。
xl console
コマンドから hvc0
コンソールを使う方法です。ネットワーク設定が正しくない場合にはこれが唯一の方法です。
#
xl console testxen
[...] Debian GNU/Linux 8 testxen hvc0 testxen login:
xl pause
と xl unpause
コマンドを使って domU を一時的に停止したり再開することが可能です。一時的に停止された domU は全くプロセッサを使いませんが、割り当てられたメモリを解放しません。xl save
と xl restore
コマンドを考慮することは興味深いかもしれません。なぜなら domU を保存すれば domU の使っていた RAM などの資源が解放されるからです。domU を元に戻す時 (ついでに言えば再開する時)、domU は時間が経過したことに全く気が付きません。dom0 を停止した時に domU が動いていた場合、パッケージに含まれるスクリプトが自動的に domU を保存し、dom0 の次回起動時に domU を自動的に再開します。もちろんこれにはラップトップコンピュータをハイバネートする場合と同様の標準的な不便さがあります。特に、domU が長い間一時停止されていた場合、ネットワーク接続が切断される可能性があります。今現在 Xen は ACPI 電源管理のほとんどに互換性がない点にも注意してください。このため、ホスト (dom0) システムを一時停止することは不可能です。
shutdown
コマンドを使って) 行ったり、xl shutdown
または xl reboot
を使って dom0 から行うことも可能です。
init
プロセスから起動されたすべてのプロセスファミリーに組み込むことが可能です。そして結果、仮想マシンにとてもよく似たものが作られます。このようなセットアップの正式名称は「コンテナ」です (これは LXC の名称 LinuX Containers に由来しています)。Xen や KVM が提供する「真の」仮想マシンとのより重要な違いは 2 番目のカーネルがない点です。このため、コンテナはホストシステムと同じカーネルを使います。これは利点と欠点があります。すなわち、利点はオーバーヘッドが全くないことによる素晴らしい性能と、カーネルがシステムで実行しているすべてのプロセスに対する包括的な視点を持つことです。このため 2 つの独立したカーネルが異なるタスクセットでスケジュールを行うよりも効果的なスケジューリングが可能です。欠点の最たるものはコンテナの中で異なるカーネルを動作させることができない点です (異なる Linux バージョンや異なるオペレーティングシステムを同時に動かすことができません)。
/sys/fs/cgroup
に仮想ファイルシステムをマウントする必要があります。Debian 8 からは init システムとして systemd が採用されており、systemd は control groups に依存しているため、設定せずとも /sys/fs/cgroup
は起動時に自動でマウントされます。
/etc/network/interfaces
を編集することです。物理インターフェース (たとえば eth0
) に関する設定をブリッジインターフェース (通常 br0
) に変え、物理とブリッジインターフェース間のリンクを設定します。たとえば、最初にネットワークインターフェース設定ファイルが以下のようなエントリを持っていたとします。
auto eth0 iface eth0 inet dhcp
#auto eth0 #iface eth0 inet dhcp auto br0 iface br0 inet dhcp bridge-ports eth0
eth0
およびコンテナ用に定義されたインターフェースが含まれます。
/etc/network/interfaces
ファイルは以下のようになります。
# Interface eth0 is unchanged auto eth0 iface eth0 inet dhcp # Virtual interface auto tap0 iface tap0 inet manual vde2-switch -t tap0 # Bridge for containers auto br0 iface br0 inet static bridge-ports tap0 address 10.0.0.1 netmask 255.255.255.0
br0
インターフェースを介した問い合わせに応答するように設定する必要があります。
root@mirwiz:~#
lxc-create -n testlxc -t debian
debootstrap is /usr/sbin/debootstrap Checking cache download in /var/cache/lxc/debian/rootfs-jessie-amd64 ... Downloading debian minimal ... I: Retrieving Release I: Retrieving Release.gpg [...] Download complete. Copying rootfs to /var/lib/lxc/testlxc/rootfs... [...] Root password is 'sSiKhMzI', please change ! root@mirwiz:~#
/var/cache/lxc
の中に作成され、その後目的のディレクトリに移動されます。こうすることで、同一のコンテナが極めて素早く作成されます。なぜなら、単純にコピーするだけだからです。
--arch
オプションと、現在の Debian 安定版以外の物をインストールしたい場合に指定する --release
オプションを受け入れます。また、MIRROR
環境変数を設定してローカル Debian アーカイブミラーを指定することも可能です。
/var/lib/lxc/testlxc/config
) を編集し、いくつかの lxc.network.*
エントリを追加します。
lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.hwaddr = 4a:49:43:49:79:20
br0
ブリッジに自動的に接続されます。さらに仮想インターフェースの MAC アドレスは指定したものになります。最後のエントリを削除するか無効化した場合、ランダムな MAC アドレスが生成されます。
lxc.utsname = testlxc
root@mirwiz:~#
lxc-start --daemon --name=testlxc
root@mirwiz:~#
lxc-console -n testlxc
Debian GNU/Linux 8 testlxc tty1 testlxc login:
root
Password: Linux testlxc 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1 (2015-05-24) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@testlxc:~#
ps auxwf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 28164 4432 ? Ss 17:33 0:00 /sbin/init root 20 0.0 0.1 32960 3160 ? Ss 17:33 0:00 /lib/systemd/systemd-journald root 82 0.0 0.3 55164 5456 ? Ss 17:34 0:00 /usr/sbin/sshd -D root 87 0.0 0.1 12656 1924 tty2 Ss+ 17:34 0:00 /sbin/agetty --noclear tty2 linux root 88 0.0 0.1 12656 1764 tty3 Ss+ 17:34 0:00 /sbin/agetty --noclear tty3 linux root 89 0.0 0.1 12656 1908 tty4 Ss+ 17:34 0:00 /sbin/agetty --noclear tty4 linux root 90 0.0 0.1 63300 2944 tty1 Ss 17:34 0:00 /bin/login -- root 117 0.0 0.2 21828 3668 tty1 S 17:35 0:00 \_ -bash root 268 0.0 0.1 19088 2572 tty1 R+ 17:39 0:00 \_ ps auxfw root 91 0.0 0.1 14228 2356 console Ss+ 17:34 0:00 /sbin/agetty --noclear --keep-baud console 115200 38400 9600 vt102 root 197 0.0 0.4 25384 7640 ? Ss 17:38 0:00 dhclient -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.e root 266 0.0 0.1 12656 1840 ? Ss 17:39 0:00 /sbin/agetty --noclear tty5 linux root 267 0.0 0.1 12656 1928 ? Ss 17:39 0:00 /sbin/agetty --noclear tty6 linux root@testlxc:~#
/var/lib/lxc/testlxc/rootfs
) に制限されています。コンソールを終了するには Control+a q を使います。
lxc-start
に --daemon
オプションを渡したおかげで、コンテナがバックグラウンドプロセスとして実行されていることに注意してください。コンテナを中止するには lxc-stop --name=testlxc
などのコマンドを使います。
lxc.start.auto
オプションが 1 に設定されているコンテナを起動する lxc-autostart
に依存しています)。起動順序を非常に細かく制御するには lxc.start.order
と lxc.group
を使います。デフォルトの場合、初期化スクリプトは onboot
グループに所属するコンテナを起動し、その後いかなるグループにも所属しないコンテナを起動します。どちらの場合も、グループ内の起動順序を制御するには lxc.start.order
オプションを使います。
qemu-*
コマンドがあっても心配しないでください。なぜならこのコマンドは KVM に関連するものだからです。
/proc/cpuinfo
内の CPU フラグを確認して、ここに「vmx」または「svm」が含まれている場合、そのプロセッサは KVM を動かすことができることを意味します。
virtual-manager
はグラフィルインターフェースで、仮想マシンを作成管理するために libvirt を使います。
apt-get install qemu-kvm libvirt-bin virtinst virt-manager virt-viewer
を使って、必要なパッケージをインストールします。libvirt-bin には、libvirtd
デーモンが含まれます。libvirtd
デーモンを使うことで、ホストで実行されている仮想マシンを (潜在的にリモートで) 管理したり、ホスト起動時に要求された VM を開始する、ことが可能です。加えて、libvirt-bin パッケージは virsh
コマンドラインツールを提供します。virsh
を使うことで、libvirtd
の管理するマシンを操作することが可能です。
virt-install
コマンドが含まれます。virt-install
を使うことで、コマンドラインから仮想マシンを作成することが可能になります。最後に、virt-viewer は VM のグラフィカルコンソールへのアクセスを提供します。
eth0
物理インターフェースと br0
ブリッジを備え、eth0
が br0
に接続されていることを仮定します。
/var/lib/libvirt/images/
) でも構わないならばこれは必要ありません。
root@mirwiz:~#
mkdir /srv/kvm
root@mirwiz:~#
virsh pool-create-as srv-kvm dir --target /srv/kvm
Pool srv-kvm created root@mirwiz:~#
virt-install
の最も重要なオプションを詳細に見て行きましょう。virt-install
は仮想マシンとそのパラメータを libvirtd に登録し、インストールを進めるために仮想マシンを開始します。
#
virt-install --connect qemu:///system
--virt-type kvm
--name testkvm
--ram 1024
--disk /srv/kvm/testkvm.qcow,format=qcow2,size=10
--cdrom /srv/isos/debian-8.1.0-amd64-netinst.iso
--network bridge=br0
--vnc
--os-type linux
--os-variant debianwheezy
Starting install... Allocating 'testkvm.qcow' | 10 GB 00:00 Creating domain... | 0 B 00:00 Guest installation complete... restarting guest.
--connect オプションは使用する「ハイパーバイザ」を指定します。これは仮想システムを表す URL (xen:// 、qemu:// 、lxc:// 、openvz:// 、vbox:// など) と VM をホストするマシン (ローカルホストの場合、空でも構いません) の形をしています。QEMU/KVM の場合、これに加えて各ユーザは制限されたパーミッションで稼働する仮想マシンを管理できます。この場合 URL パスは「システム」マシン (/system ) かその他 (/session ) かで識別されます。
| |
URL を一見すると QEMU が使われるように見えますが、KVM は QEMU と同じ方法で管理されているため、 --virt-type kvm を指定することで KVM を使うことが可能です。
| |
--name オプションは仮想マシンの (一意的な) 名前を定義します。
| |
--ram オプションは仮想マシンに割り当てる RAM の量 (MB 単位) を指定します。
| |
--disk オプションは仮想マシンのハードディスクとして利用するイメージファイルの場所を指定します。そして、このファイルが存在しなければ、size パラメータで指定されたサイズ (GB 単位) で作成されます。format パラメータはイメージファイルを保存するさまざまな方法を選択します。デフォルトフォーマット (raw ) はディスクサイズと内容が全く同じ単一ファイルです。ここではより先進的なフォーマット qcow2 を選びました。qcow2 は QEMU 専用のフォーマットで、最初は小さなファイルで仮想マシンが領域を実際に利用することになった時に増加するファイルです。
| |
--cdrom オプションはインストール時に利用する光学ディスクの場所を指定するために使われます。パスは ISO ファイルのローカルパス、ファイル取得先の URL、物理 CD-ROM ドライブのデバイスファイル (例 /dev/cdrom ) のどれか 1 つを使うことが可能です。
| |
--network はホストネットワーク設定の中に仮想ネットワークを統合する方法を指定します。デフォルトは既存のネットワークブリッジに仮想ネットワークを統合する方法です (例では明示的にこの挙動を指定しています)。このブリッジが存在しない場合、仮想マシンが到達できるネットワークは NAT を介した物理ネットワークだけに限定されるので、仮想マシンはプライベートサブネット範囲 (192.168.122.0/24) に含まれるアドレスを割り当てられます。
| |
--vnc は VNC を使ってグラフィカルコンソールを利用できるようにすることを意味します。関連する VNC サーバに対するデフォルトの挙動はローカルインターフェースだけをリッスンします。さらに仮想マシンを操作する VNC クライアントを別のホスト上で実行する場合、VNC 接続を確立するには SSH トンネルを設定する必要があります (第 9.2.1.3 節「ポート転送を使った暗号化トンネルの作成」を参照してください)。別の方法として、VNC サーバをすべてのインターフェースを介して利用できるようにするために、--vnclisten=0.0.0.0 を使うことも可能です。しかしこの方針を取る場合、ファイアウォールを適切に設計するべきという点に注意してください。
| |
--os-type と --os-variant オプションは、指定されたオペレーティングシステムの備える既知の機能に基づいて、仮想マシンのいくつかのパラメータを最適化するためのものです。
|
virt-viewer
を任意のグラフィカル環境から実行します (この時にリモートホストの root パスワードが 2 回尋ねられる点に注意してください。この理由はこの操作には 2 つの SSH 接続を必要とするからです)。
$
virt-viewer --connect qemu+ssh://root@server/system testkvm
root@server's password: root@server's password:
libvirtd
を使って管理している仮想マシンのリストを確認します。
#
virsh -c qemu:///system list --all Id Name State ---------------------------------- - testkvm shut off
#
virsh -c qemu:///system start testkvm
Domain testkvm started
vncviewer
へのパラメータの形で指定することが可能です)。
#
virsh -c qemu:///system vncdisplay testkvm
:0
virsh
サブコマンドには以下のものがあります。
reboot
は仮想マシンを再起動します。
shutdown
は仮想マシンを正常にシャットダウンします。
destroy
は仮想マシンを無理やり停止します。
suspend
は仮想マシンを一時停止します。
resume
は一時停止された仮想マシンを再開します。
autostart
はホスト起動時にこの仮想マシンを自動的に起動することを有効化します (または --disable
オプションを付けて無効化します)。
undefine
は仮想マシンのすべての痕跡を libvirtd
から削除します。
debootstrap
を使って初期化されます。しかし、仮想マシンに RPM に基づくシステム (Fedora、CentOS、Scientific Linux など) をインストールする場合、yum
ユーティリティ (同名のパッケージに含まれます) を使ってセットアップする必要があります。
yum
設定ファイルを含むファイルの初期セットを展開するために rpm
を使い、その後パッケージの残りのセットを展開するために yum
を呼び出す必要があります。しかし、chroot の外から yum
を呼び出しているため、一時的な修正が必要です。以下に載せた例では、対象の chroot 先は /srv/centos
です。
#
rootdir="/srv/centos"
#
mkdir -p "$rootdir" /etc/rpm
#
echo "%_dbpath /var/lib/rpm" > /etc/rpm/macros.dbpath
#
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/centos-release-7-1.1503.el7.centos.2.8.x86_64.rpm
#
rpm --nodeps --root "$rootdir" -i centos-release-7-1.1503.el7.centos.2.8.x86_64.rpm
rpm: RPM should not be used directly install RPM packages, use Alien instead! rpm: However assuming you know what you are doing... warning: centos-release-7-1.1503.el7.centos.2.8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY #
sed -i -e "s,gpgkey=file:///etc/,gpgkey=file://${rootdir}/etc/,g" $rootdir/etc/yum.repos.d/*.repo
#
yum --assumeyes --installroot $rootdir groupinstall core
[...] #
sed -i -e "s,gpgkey=file://${rootdir}/etc/,gpgkey=file:///etc/,g" $rootdir/etc/yum.repos.d/*.repo