102.6 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
102 Linuxのインストールとパッケージ管理 |
Objective: |
102.6 仮想化ゲストとしてのLinux |
Lesson: |
1 of 1 |
はじめに
Linuxの大きな強みの1つは、汎用性にあります。この汎用性の中には、完全に分離された安全な環境として、他のオペレーティングシステムないし個々のアプリケーションをホストする手段として、Linuxを使用できることです。このレッスンでは、仮想化とコンテナ技術の概念に焦点を当て、クラウドプラットフォームに仮想マシンを配備する際に考慮すべきいくつかの技術的な詳細を示します。
仮想化の概要
仮想化は、ハイパーバイザー と呼ばれるソフトウェアプラットフォームが、完全にエミュレートされたコンピューターシステムを、プロセスとして実行できるようにする技術です。ハイパーバイザーは、個々の仮想マシンが使用できるハードウェアリソースを管理します。これらの仮想マシンは、ハイパーバイザーの ゲスト と呼ばれます(ハイパーバイザーを「ホスト」と呼ぶこともあります)。仮想マシンでは、システムBIOSやハードドライブのディスクコントローラーなど、物理コンピューターの多くのパーツをソフトウェアでエミュレートしています。仮想マシンは、多くの場合は単なるファイルとして保存されているハードディスクイメージを使用し、ハイパーバイザーを介してホストマシンのRAMとCPUにアクセスします。ハイパーバイザーが、ゲストのホストマシンのハードウェアリソースへのアクセスを分離するので、1台のホストマシンで、複数のオペレーティングシステムを実行できるのです。
Linuxで一般的に使用されるハイパーバイザーには、次のようなものがあります:
- Xen
-
Xenはオープンソースの、Type-1ハイパーバイザーです。Type-1のハイパーバイザーとは、基盤となるオペレーティングシステムに依存せずに、ハードウェア上で直接実行されるものです。この種のハイパーバイザーは、コンピューターから直接起動されるので、ベアメタルハイパーバイザー とも呼ばれます。
- KVM
-
KVM(Kernel Virtual Machine)は、仮想化用のLinuxカーネルモジュールです。KVMは、汎用のLinuxオペレーティングシステム上で動作しますが、ホストLinuxと統合された完全なハイパーバイザーとして動作します。そのため、Type-1ハイパーバイザーと、Type-2(ホスト型)ハイパーバイザーとのハイブリッド型とも言えます。KVMにデプロイする仮想マシンは、
libvirt
デーモンと、そのユーティリティを使用して作成および管理されます。 - VirtualBox
-
簡単に仮想マシンの作成や管理ができる人気のデスクトップアプリケーションです。Oracle VM VirtualBoxはクロスプラットフォームであり、Linux、macOS、およびMicrosoft Windowsで動作します。VirtualBoxの実行には、基盤となるオペレーティングシステムが必要なため、Type-2のハイパーバイザーです。
一部のハイパーバイザーでは、仮想マシンの動的な再配置が可能です。仮想マシンをあるハイパーバイザーから別のハイパーバイザーに移動するプロセスを マイグレーション(移行) と呼びますが、その手法はハイパーバイザーによって異なります。マイグレーション には、仮想マシンがシャットダウンされているときにのみ実行できるものと、稼働中でも実行できるもの(ライブマイグレーション)があります。マイグレーションの技術は、ハイパーバイザーのメンテナンスや、ハイパーバイザーが機能しなくなった時に仮想マシンを別のハイパーバイザーに移動して実行を継続する場合などに役立ちます。
仮想マシンの種類
仮想マシンには、完全仮想化 ゲスト、準仮想化 ゲスト、ハイブリッド ゲストの、主に3種類があります。
- 完全仮想化
-
完全仮想化ゲストとは、ゲストOS(またはHardwareVM)が、仮想マシンインスタンスとして実行されていることを意識する必要がないゲストです。ゲストOSが実行するすべての命令は、仮想マシン内部で実行されます。つまり、完全仮想化では、命令をシミュレートしたり、実際のハードウェアを操作するための追加のドライバをゲスト内にインストールする必要はありません。このタイプの仮想化をx86ベースのハードウェアで実行するには、ハイパーバイザーをインストールするシステムでIntel VT-xまたはAMD-V CPU拡張機能を有効にする必要があります。これは、BIOSまたはUEFIファームウェア構成メニューから実行できます。
- 準仮想化
-
準仮想化ゲスト(PVM)は、ゲストOSが仮想マシンのインスタンスとして実行されていることを認識しているゲストです。このタイプのゲストでは、変更されたカーネルと、ゲストOSがハイパーバイザーの機能やハードウェアリソースを利用するための特別なドライバー(ゲストドライバー)が必要です。これらの仕組みによって、準仮想化ゲストのパフォーマンスが、完全仮想化ゲストのパフォーマンスよりも優れているケースがよくあります。
- ハイブリッド
-
準仮想化と完全仮想化の組み合わせで、完全仮想化ゲストにおいても準仮想化と同様のドライバーを使用することで、オペレーティングシステム自体に変更を加えること無く、ネイティブに近いI/Oパフォーマンスを実現するものです。ディスクとネットワークのI/Oパフォーマンスを強化する、ストレージドライバとネットワークドライバが提供されるのが一般的です。
仮想化プラットフォームでは、パッケージされた仮想化OS用のゲストドライバーが提供されているのが普通です。KVMでは Virtio プロジェクトのドライバーを利用し、Oracle VM VirtualBoxではISO CD-ROMイメージファイルで提供される Guest Additions を利用します。
libvirt
仮想マシンの例
libvirt
によって管理され、KVMハイパーバイザーを使用する仮想マシンの例を見ていきます。多くの場合、仮想マシンはファイルのグループで構成されます。特に重要なのは、仮想マシンを 定義 するXMLファイル(ハードウェア構成、ネットワーク接続、表示機能など)と、オペレーティングシステムやソフトウェア含む、ハードディスクイメージファイルです。
まず、仮想マシンとそのネットワーク環境を定義するXMLファイルの例を見ていきましょう。
$ ls /etc/libvirt/qemu total 24 drwxr-xr-x 3 root root 4096 Oct 29 17:48 networks -rw------- 1 root root 5667 Jun 29 17:17 rhel8.0.xml
Note
|
ディレクトリパスにある |
networks
という名前のディレクトリがあることに着目しましょう。このディレクトリには、仮想マシンが使用するネットワークの定義ファイル(XML形式)が含まれています。この例では、ハイパーバイザーは1つのネットワークだけを使用しているので、仮想ネットワークセグメントの構成を定義するファイルは1つだけです。
$ ls -l /etc/libvirt/qemu/networks/ total 8 drwxr-xr-x 2 root root 4096 Jun 29 17:15 autostart -rw------- 1 root root 576 Jun 28 16:39 default.xml $ sudo cat /etc/libvirt/qemu/networks/default.xml <!-- WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE OVERWRITTEN AND LOST. Changes to this xml configuration should be made using: virsh net-edit default or other application using the libvirt API. --> <network> <name>default</name> <uuid>55ab064f-62f8-49d3-8d25-8ef36a524344</uuid> <forward mode='nat'/> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:b8:e0:15'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp> </ip> </network>
この定義には、クラスCプライベートネットワークと、そのネットワークの(デフォルト)ルーターとして機能するエミュレートされたハードウェアデバイスが含まれています。このネットワークを使用する仮想マシンに割り当てられるDHCPサーバーが使用する、IPアドレスの範囲も定義されています。このネットワークでは、NAT(network address translation)を利用して、ホスト(ハイパーバイザーが)が属するLANなどのネットワークにパケットを転送できます。
次に、Red Hat Enterprise Linux 8の仮想マシン定義ファイルを見てみましょう。(着目すべき箇所を太字で示しています。)
$ sudo cat /etc/libvirt/qemu/rhel8.0.xml <!-- WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE OVERWRITTEN AND LOST. Changes to this xml configuration should be made using: virsh edit rhel8.0 or other application using the libvirt API. --> <domain type='kvm'> <name>rhel8.0</name> <uuid>fadd8c5d-c5e1-410e-b425-30da7598d0f6</uuid> <metadata> <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0"> <libosinfo:os id="http://redhat.com/rhel/8.0"/> </libosinfo:libosinfo> </metadata> <memory unit='KiB'>4194304</memory> <currentMemory unit='KiB'>4194304</currentMemory> <vcpu placement='static'>2</vcpu> <os> <type arch='x86_64' machine='pc-q35-3.1'>hvm</type> <boot dev='hd'/> </os> <features> <acpi/> <apic/> <vmport state='off'/> </features> <cpu mode='host-model' check='partial'> <model fallback='allow'/> </cpu> <clock offset='utc'> <timer name='rtc' tickpolicy='catchup'/> <timer name='pit' tickpolicy='delay'/> <timer name='hpet' present='no'/> </clock> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <pm> <suspend-to-mem enabled='no'/> <suspend-to-disk enabled='no'/> </pm> <devices> <emulator>/usr/bin/qemu-system-x86_64</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/rhel8'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> </disk> <controller type='usb' index='0' model='qemu-xhci' ports='15'> <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> </controller> <controller type='sata' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/> </controller> <controller type='pci' index='0' model='pcie-root'/> <controller type='pci' index='1' model='pcie-root-port'> <model name='pcie-root-port'/> <target chassis='1' port='0x10'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/> </controller> <controller type='pci' index='2' model='pcie-root-port'> <model name='pcie-root-port'/> <target chassis='2' port='0x11'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/> </controller> <controller type='pci' index='3' model='pcie-root-port'> <model name='pcie-root-port'/> <target chassis='3' port='0x12'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/> </controller> <controller type='pci' index='4' model='pcie-root-port'> <model name='pcie-root-port'/> <target chassis='4' port='0x13'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/> </controller> <controller type='pci' index='5' model='pcie-root-port'> <model name='pcie-root-port'/> <target chassis='5' port='0x14'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/> </controller> <controller type='pci' index='6' model='pcie-root-port'> <model name='pcie-root-port'/> <target chassis='6' port='0x15'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/> </controller> <controller type='pci' index='7' model='pcie-root-port'> <model name='pcie-root-port'/> <target chassis='7' port='0x16'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6'/> </controller> <controller type='virtio-serial' index='0'> <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> </controller> <interface type='network'> <mac address='52:54:00:50:a7:18'/> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> </interface> <serial type='pty'> <target type='isa-serial' port='0'> <model name='isa-serial'/> </target> </serial> <console type='pty'> <target type='serial' port='0'/> </console> <channel type='unix'> <target type='virtio' name='org.qemu.guest_agent.0'/> <address type='virtio-serial' controller='0' bus='0' port='1'/> </channel> <channel type='spicevmc'> <target type='virtio' name='com.redhat.spice.0'/> <address type='virtio-serial' controller='0' bus='0' port='2'/> </channel> <input type='tablet' bus='usb'> <address type='usb' bus='0' port='1'/> </input> <input type='mouse' bus='ps2'/> <input type='keyboard' bus='ps2'/> <graphics type='spice' autoport='yes'> <listen type='address'/> <image compression='off'/> </graphics> <sound model='ich9'> <address type='pci' domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/> </sound> <video> <model type='virtio' heads='1' primary='yes'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> </video> <redirdev bus='usb' type='spicevmc'> <address type='usb' bus='0' port='2'/> </redirdev> <redirdev bus='usb' type='spicevmc'> <address type='usb' bus='0' port='3'/> </redirdev> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/> </memballoon> <rng model='virtio'> <backend model='random'>/dev/urandom</backend> <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/> </rng> </devices> </domain>
このファイルには、ゲストに割り当てられるRAM容量、CPUコア数、ハードディスクイメージファイル(disk
節の中)、表示機能(SPICEプロトコル経由)、USBデバイス、エミュレートされたキーボードとマウスからの入力などのハードウェア設定が定義されています。
仮想マシンのストレージ例
この仮想マシンのハードディスクイメージは、/var/lib/libvirt/images/rhel8
です。ホストマシンでのファイルの実体は次のとおりです。
$ sudo ls -lh /var/lib/libvirt/images/rhel8 -rw------- 1 root root 5.5G Oct 25 15:57 /var/lib/libvirt/images/rhel8
このディスクイメージは、ホストマシン上でわずか5.5GBしか消費していません。しかし、次のコマンド出力からわかるように、実行中の仮想マシンのオペレーティングシステムでは23.3GBと表示されます。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 252:0 0 23.3G 0 disk ├─vda1 252:1 0 1G 0 part /boot └─vda2 252:2 0 22.3G 0 part ├─rhel-root 253:0 0 20G 0 lvm / └─rhel-swap 253:1 0 2.3G 0 lvm [SWAP]
この違いは、このゲストに使用されているディスクの割り当て方法によるものです。仮想マシンが使用できるディスクイメージには何種類かありますが、次の2つが主要なものです。
- COW
-
Copy-On-Write や thin-provisioning、sparse images と呼ばれるディスク種別は、上限サイズのみを定義してディスクファイルを作成する方法です。ディスクイメージファイルのサイズは、新しいデータがディスクに書き込まれた時にのみ増加します。例に示したように、ゲストオペレーティングシステムでは定義したとおりの23.3GBのディスクが見えていますが、ディスクイメージには5.5GBのデータしか書き込まれていません。この仮想マシンに使用されているディスクイメージの形式は、QEMU COWファイル形式である
qcow2
です。 - RAW
-
raw または full というディスク種別では、指定した容量すべてを事前に割り当てたファイルが作成されます。たとえば、10GBのrawディスクイメージファイルは、ホスト上で10GBのディスク容量を消費します。この種類のディスクでは、必要なディスクスペースがあらかじめ割り当てられているので、ハイパーバイザーが容量を確認して割り当てるという処理を行わなくても書き込みを行えるという、パフォーマンス上のメリットがあります。
Red Hat Enterprise Virtualization や oVirt などの仮想環境管理プラットフォームでは、ゲスト用のバッキングストレージ(仮想ディスク)として、物理ディスクを使用することができます。これらのシステムでは、(仮想マシンは)SAN(ストレージエリアネットワーク)やNAS(ネットワーク接続ストレージ)のデータを読み書きし、ハイパーバイザーはどの仮想マシンがどのストレージを利用しているかを管理します。これらのストレージシステムでは、LVM(論理ボリューム管理)などのテクノロジーを用いて必要に応じて仮想マシンのストレージサイズを拡大/縮小したり、ストレージスナップショットの作成や管理を実現しています。
仮想マシンのテンプレート
ハイパーバイザーから見れば、仮想マシンは単なる実行可能ファイルですから、シナリオに合わせてカスタマイズした テンプレート を簡単に作成できます。オペレーティングシステムと基本的なパッケージをインストールして、ロケールや起動のための認証設定を行った仮想マシンを用意しておけば、繰り返し行う作業を減らして新しいシステムの構築にかかる時間を削減できます。
このような仮想マシンのテンプレートをコピーして、新しいゲストシステムを作成することができます。この場合、新しいゲストのホスト名を変更し、ネットワークインターフェイスに新しいMACアドレスを生成し、さらに使用目的に応じた変更を行います。
D-BusマシンID
多くのLinuxディストリビューションでは、インストール時に生成した D-Bus machine ID をマシンの識別IDとして使用します。仮想マシンを クローン して別の仮想マシンのテンプレートとする場合には、ハイパーバイザーがそれぞれのゲストシステムに適切なシステムリソースを割り当てられるように、新しいD-BusマシンIDを生成する必要があります。
次のコマンドを使用して、実行中のシステムがD-BusマシンIDを持っていることを確認できます。
$ dbus-uuidgen --ensure
エラーメッセージが表示されない場合は、マシンIDが既に存在します。現在のD-BusマシンIDを表示するには、次のコマンドを実行します。
$ dbus-uuidgen --get 17f2e0698e844e31b12ccd3f9aa4d94a
表示された文字列が、現在のマシンIDです。ハイパーバイザーで実行される複数のLinuxシステムが、同じD-BusマシンIDを持つことはできません。
D-BusマシンIDは /var/lib/dbus/machine-id
にあり、/etc/machine-id
にシンボリックリンクされています。システムが不安定になりクラッシュする可能性があるため、稼働中のシステムでこのマシンIDを変更することはお勧めしません。複数の仮想マシンが同じD-BusマシンIDを持っている場合は、以下の手順で新しいD-BusマシンIDを生成します。
$ sudo rm -f /etc/machine-id $ sudo dbus-uuidgen --ensure=/etc/machine-id
/var/lib/dbus/machine-id
が /etc/machine-id
へのシンボリックリンクでない場合は、/var/lib/dbus/machine-id
を削除する必要があります。
仮想マシンをクラウドにデプロイする
ハイパーバイザーを提供し、組織の仮想ゲストイメージを展開できるIaaS(infrastructure as a service)プロバイダーが多数あります。ほとんどのプロバイダーは、さまざまなLinuxディストリビューションをベースに、カスタム仮想マシンを構築、配備、構成するツールを備えています。これらのプロバイダーの多くは、顧客が組織内で構築した仮想マシンを、展開・移行するためのシステムも導入しています。
IaaS環境におけるLinuxシステムの導入を評価する場合にポイントとなる重要な要素がいくつかあります。
- コンピューティングインスタンス
-
多くのクラウドプロバイダーは、“コンピューティングインスタンス”、つまりクラウドベースのシステム基盤が使用するCPU時間に基づいて利用料金を請求します。アプリケーションが必要とする処理時間を慎重に計画することは、クラウドソリューションのコスト管理に役立ちます。
コンピューティングインスタンスは、クラウド環境に配備した仮想マシンの数を指すこともあります。ここでも、同時に実行するシステムのインスタンスが増えると、全体的なCPU時間に影響して請求額が増大します。
- ブロックストレージ
-
クラウドプロバイダーは、さまざまなレベルのブロックストレージも用意しています。ウェブベースのネットワークストレージとして利用できるものもあれば、クラウドに配備された仮想マシンがファイル保存に使用するストレージとして利用できるものもあります。
これらサービスのコストは、使用するストレージ容量や、データセンター内のストレージ速度によって異なります。ストレージへのアクセスが高速になるとコストが高くなり、逆に “保存中” のデータ(アーカイブストレージなど)は非常に安くなります。
- ネットワーキング
-
クラウドソリューションプロバイダーが提供する重要なコンポーネントの1つに、仮想ネットワークの構成方法があります。多くのIaaSプロバイダーでは、Webベースのユーティリティを使って、さまざまなネットワーク経路、サブネット、ファイアウォール構成などの設計と実装を行います。DNSソリューションを提供して、インターネットに接続されたシステムにアクセス可能なFQDN(完全修飾ドメイン名)を割り当てることができるものもあります。また、既存のオンプレミス型ネットワークインフラとクラウドベースのインフラをVPN(仮想プライベートネットワーク)で接続して、両方のインフラを一体化できる「ハイブリッド型」ソリューションが用意されていることもあります。
クラウドのゲストに安全にアクセスする
クラウドプラットフォーム上のリモート仮想ゲストにアクセスするには、OpenSSHソフトウェアを使うのが一般的です。クラウド上のLinuxシステムでは、OpenSSHサーバーを実行します。管理者は、公開鍵とOpenSSHクライアントを使ってリモートアクセスします。
管理者は、まず次のコマンドを(ローカルマシンで)実行します。
$ ssh-keygen
プロンプトに従って、SSHの公開鍵と秘密鍵のペアを作成します。秘密鍵をローカルシステム(~/.ssh/
)に保存し、公開鍵をリモートのクラウドシステムにコピーします。企業LAN上のネットワークマシンで作業する場合とまったく同じです。
次に、管理者は次のコマンドを(ローカルマシンで)実行します。
$ ssh-copy-id -i <public_key> user@cloud_server
これで、生成した公開鍵が、リモートのクラウドサーバーにコピーされます。公開鍵はクラウドサーバーの ~/.ssh/authorized_keys
ファイルに保存されて、適切なパーミッションが設定されます。
Note
|
|
クラウドプロバイダーによっては、新しいLinuxシステムを配備するときに、鍵ペアを自動的に生成します。管理者は、新しいシステムの秘密鍵をクラウドプロバイダーからダウンロードして、ローカルシステムに保存します。SSH鍵のパーミッションは、秘密鍵は 0600
、公開鍵は 0644
とすることに注意してください。
クラウドシステムの事前構成
クラウドへの仮想マシンの展開を簡素化する便利なツールに、cloud-init
ユーティリティがあります。このコマンドは、あらかじめ構成した仮想マシンイメージと構成ファイルに基づいて、多数のIaaSプロバイダーにLinuxゲストを配置するための、ベンダーニュートラルな方法です。プレーンテキストのYAML(YAML Ain’t Markup Language)ファイルに、ネットワーク設定、ソフトウェアパッケージの選択、SSHキーの設定、ユーザーアカウントの作成、ロケールの設定、など多数のオプションを事前に定義しておくことで、新しいシステムをすばやく構築できます。
システムを初めて起動する時に、cloud-init
がYAMLファイルから設定を読み込んで、システムに適用します。この処理は、システムの初期設定時のみに実行され、クラウドプロバイダーのプラットフォーム上に新しいシステムを簡単に配備できます。
cloud-init
で使用するYAMLファイルは、cloud-config 形式で定義します。cloud-config
ファイルの例を示します。
#cloud-config timezone: Africa/Dar_es_Salaam hostname: test-system # Update the system when it first boots up apt_update: true apt_upgrade: true # Install the Nginx web server packages: - nginx
最初の行のハッシュ記号(#
)と cloud-config
の間に空白がないことに注意してください。
Note
|
|
コンテナ
コンテナテクノロジーは仮想マシンと似ている部分があり、分離された環境にアプリケーションを簡単に配備することができます。仮想マシンではコンピューター全体がエミュレートされますが、コンテナはアプリケーションを実行するのに必要なソフトウェアだけを使用します。これにより、オーバーヘッドを大幅に削減することができます。
コンテナは仮想マシンよりも柔軟です。仮想マシンをあるハイパーバイザーから別のハイパーバイザーに移行できるのと同じように、アプリケーションコンテナをあるホストから別のホストに移行することができます。仮想マシンを移行するにはあらかじめ電源をオフにしておくことが必要な場合がありますが、コンテナでは実行中のアプリケーションを移行することができます。また、コンテナでは、既存のバージョンと並行して、新しいバージョンのアプリケーションを簡単に配備できます。ユーザーが実行中のコンテナとのセッションを閉じると、コンテナ オーケストレーション ソフトウェアがコンテナを自動的にシステムから削除して新しいバージョンに置き換えるので、ダウンタイムが短縮されます。
Note
|
Linuxでは、Docker 、Kubernetes、LXD/LXC、systemd-nspawn、OpenShift など、多数のコンテナ技術が利用できます。コンテナソフトウェアの具体的な実装は、LPIC-1試験の範囲外です。 |
コンテナは、Linuxカーネルの control groups(cgroups)機構を利用します。cgroupとは、メモリ、CPU時間、ディスク、ネットワーク帯域幅などのシステムリソースを、個々のアプリケーションに分割する機能です。管理者はcgroupを使用して、1つのアプリケーション、ないし1つのcgroupに含まれるアプリケーショングループに、システムリソース制限をセットできます。つまり、コンテナソフトウェアは、管理者のためにcgroupsの管理と展開を容易にするツールを提供するものです。
Note
|
ここでcgroupの概念を説明したのは、アプリケーションをグループに分割することによって、それぞれが互いに影響せずにリソースを使えるようになる概念を紹介するためです。現在、LPIC-1試験に合格するためにcgroupの知識は必要ありません。 |
演習
-
完全仮想化ゲストを実行するx86ベースのハードウェアプラットフォームに必要な、CPU拡張は何ですか?
-
最大のパフォーマンスを必要とするミッションクリティカルなサーバーのインストールでは、どのタイプの仮想化を使用することが望ましいですか?
-
同じテンプレートから複製され、D-Busを利用する2つの仮想マシンが不安定です。ホスト名とネットワーク設定は異なっています。それぞれの仮想マシンが異なるD-BusマシンIDを持っているかどうかを判断するにはどうしますか?
発展演習
-
次のコマンドを実行して、仮想マシンを実行するためのCPU拡張機能がシステムで有効になっているかどうかを確認してください(結果はCPUによって異なります)。
grep --color -E "vmx|svm" /proc/cpuinfo
出力では、
vmx
(Intel VT-xが有効なCPUの場合)か、svm
(AMD SVMが有効なCPUの場合)が強調表示されます。結果が得られない場合は、BIOSまたはUEFIファームウェアのマニュアルを見て、プロセッサの仮想化を有効にしてください。 -
プロセッサが仮想化をサポートしていたら、KVMハイパーバイザーを実行する方法を、ディストリビューションのドキュメントから探します。
-
KVMハイパーバイザーを実行するために必要なパッケージをインストールしてください。
-
グラフィカルデスクトップ環境を使用している場合は、KVMを利用するためのグラフィカルフロントエンドである
virt-manager
アプリケーションもインストールしてください。仮想マシンのインストールと管理に役立ちます。 -
好みのLinuxディストリビューションのISOイメージをダウンロードして、そのドキュメントに従ってそのISOから新しい仮想マシンを作成してください。
-
まとめ
このレッスンでは、仮想マシンとコンテナの基本概念と、これらのテクノロジーをLinuxで使用する方法について説明しました。
次のコマンドについて簡単に説明しました。
dbus-uuidgen
-
DBusマシンIDを確認する。
ssh-keygen
-
リモートシステムにアクセスするときに使う、sshの公開鍵と秘密鍵のペアを生成する。
ssh-copy-id
-
リモート認証のために、SSHの公開鍵をリモートシステムにコピーする。
cloud-init
-
仮想マシンとコンテナを構成し、クラウド環境への配備を支援する
演習の解答
-
完全に仮想化されたゲストを実行するx86ベースのハードウェアプラットフォームに必要なCPU拡張は何ですか?
Intel CPUではVT-x、AMD CPUではAMD-V。
-
最大のパフォーマンスを必要とするミッションクリティカルなサーバーのインストールでは、どのタイプの仮想化を使用することが望ましいですか?
Xenなどで準仮想化ゲストを利用する場合、ハイパーバイザーと連携するソフトウェアドライバーを使用することで、ハードウェア資源をより有効に活用できます。
-
同じテンプレートから複製され、D-Busを利用する2つの仮想マシンが不安定です。ホスト名とネットワーク設定は異なっています。それぞれの仮想マシンが異なるD-BusマシンIDを持っているかどうかを判断するにはどうしますか?
それぞれのマシンで
dbus-uuidgen --get
を実行します。
発展演習の解答
-
次のコマンドを実行して、仮想マシンを実行するためのCPU拡張機能がシステムで有効になっているかどうかを確認してください(結果はCPUによって異なります)。
grep --color -E "vmx|svm" /proc/cpuinfo
。出力では、
vmx
(Intel VT-xが有効なCPUの場合)か、svm
(AMD SVMが有効なCPUの場合)が強調表示されます。結果が得られない場合は、BIOSまたはUEFIファームウェアのマニュアルを見て、プロセッサの仮想化を有効にしてください。結果は、使用しているCPUによって異なります。UEFIファームウェアで仮想化拡張機能が有効になっているIntel CPUを搭載したコンピューターからの出力例を次に示します。
$ grep --color -E "vmx|svm" /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d
-
プロセッサが仮想化をサポートしていたら、KVMハイパーバイザーを実行する方法を、ディストリビューションのドキュメントから探します。
-
KVMハイパーバイザーを実行するために必要なパッケージをインストールしてください。
ディストリビューションによって異なるので、参考URLを示します:
Arch Linux — https://wiki.archlinux.org/index.php/KVM
-
グラフィカルデスクトップ環境を使用している場合は、KVMを利用するためのグラフィカルフロントエンドである
virt-manager
アプリケーションもインストールしてください。仮想マシンのインストールと管理に役立ちます。繰り返しますが、ディストリビューションによって異なります。
$ sudo apt install virt-manager
-
好みのLinuxディストリビューションのISOイメージをダウンロードして、そのドキュメントに従ってそのISOから新しい仮想マシンを作成してください。
このタスクは
virt-manager
パッケージで簡単に処理できます(GUI環境の場合)。virt-install
コマンドを使用してコマンドラインから仮想マシンを作成することもできます。両方を試して、仮想マシンがどのように配備されるかを理解してください。
-