Linux

[使い方を画面で解説]Linuxの仮想化技術KVMでLinuxゲストOS(仮想マシン)のインストール方法

*記事内に商品プロモーションを含む場合があります

KVM Linux(仮想化環境)にゲストOSとしてLinux(Ubuntu/CentOS/Rocky Linux/AlmaLinux)をインストールして利用する方法を紹介します。

KVM Linuxは便利ですが、公開されている情報が少ないですね。

KVMは、VPSサービスなどの内部でよく使われている仮想化技術なのですが、知名度が低い。

KVMという名前も悪いですね。KVMと言えば、KVM切り替え器をイメージします。

ちなみに、VPSとは「Virtual Private Server」を略した名称で、「仮想専用サーバー」などと呼ばれます。仮想化技術を利用し1台の物理サーバー上に複数の仮想サーバー(OS)を構築し、それらをユーザーごとに割り当てて提供するサービスのことです。

KVM Linuxの使用例

以下のような環境の構築に最適です。

簡単に検証環境を作成する用途に便利ですね。

・いろいろな種類のLinux OSをインストールして検証したい

・バージョンの差を調査したい

・OSインストール直後の状態が何度も欲しい

Ubuntu、CentOS、AlamaLinux 、Rocky Linuxなどいろいろなディストリビューションの違いを調べるときなどに最適です。

WindowsのHyper-VやVirtualBoxなども便利ですが、KVMでリモート&CUIでインストールが非常に楽ですね。

KVM Linuxの利用イメージ

ホストOSのHWリソース(CPU、メモリ、ディスク)をゲストOSへ割り当てるようなイメージになります。

ゲストOSを複数同時に起動する場合は、ホストOS側のリソース(CPU、メモリ、ディスク)が必要です。

今回、「CPU 16コア/メモリ64GB/ディスク2TB」ぐらいのスペックで説明。
数年前のIntel Xeon サーバで、CPUは最新ではないが、HWリソースはそこそこあるサーバマシン。(今だと20万円ぐらいのタワーマシンとして買えそうですが)

■以下の3つのLinux-OSに以下の配分で割り当てたケース

・Ubuntu20.04:vCPU:4/メモリ:4GB/HDD:100GB
・CentOS7 :vCPU:2/メモリ:2GB/HDD:50GB
・RockyLinux8:vCPU:2/メモリ:1GB/HDD:30GB

1つずつの割り当てがホストのリソースを超えずに、かつ、同時実行する合計値を超えることはできません。

■ゲストOSが相互に通信するケース

ローカルIPを使ってゲストOS間の通信が可能です。

ホストOSからゲストOSは、1つのプロセスに見えます。
4GBのメモリを割り当てたら、ホストOSの4GBのメモリを使っているプロセスとして動作しています。

topコマンドで見ると qemu-kvm というプロセス名で確認できます。

KVMのインストール

ホストOSは CentOS 7 を利用しました。
極端に古いOSバージョンやHWは動作しないかもしれません。

全作業がTeraTermなどのSSHツールで接続し、リモートでコマンド実行が可能です。

インストールもCUIでキー入力だけで行えます。一度手順を覚えるとGUIでマウスでポチポチ選択するより非常に楽です。

インストールも事前に特定の設定ファイルを準備すれば、キー入力なしでインストールも自動化できる記事を見ましたが、Debianなど特定のディストリビューション用しか見つからなかったので、完全自動化は保留。

(1)動作環境の確認
# grep -E ‘svm|vmx’ /proc/cpuinfo

何も表示されない場合はCPUが仮想環境をサポートしていません。

(2)KVM関連パッケージのインストール
# yum -y install qemu-kvm qemu-img libvirt virt-install

(3)libvirtdの起動
#systemctl start libvirtd

(4)virshコマンドでKVMが正常に動作しているかを確認
(まだ、VMを未作成なので、一覧の中身が空なのは正しい)

#

# virsh list
Id 名前 状態
---------------------------------------------------

ゲストOS(仮想マシン)のインストール

virt-installコマンドで、ゲストOS(仮想マシン)を作成します。

仮想マシンの各種設定を引数に設定してvirt-installコマンドを実行。

RockyLinux 8.8をインストールする例で説明します。

RockyLinux 8.8 のisoファイルを指定しています。 ディスクサイズ size=50 (GB)、vcpu=4 、メモリ ram=4096MB=4GBで作成する場合の引数になります。

(なんとなく主要なパラメータの意味は分かりますね)

その他のオプションは、そのままでOK。 ネットワークの設定は、ローカルネットワークのDHCPです。

#

# virt-install \
--name=RockyLinux8-01 \
--location=/download/Rocky-8.8-x86_64-dvd1.iso \
--disk path=/vm-image/rockylinux8-1.qcow2,size=50,format=qcow2 \
--vcpus=4 --ram=4096 \
--graphics none \
--extra-args="console=tty0 console=ttyS0,115200n8"

コマンドを実行すると仮想マシンのシリアルコンソールへ自動でアタッチされて、Linux-OSのテキストインストールが開始されます。

こんな感じの画面が表示されます。(Rocky Linux8のインストール画面)

すべてキー入力だけでインストールできます。
KVM LInux install

数字を入力して選択して設定していきます。ホスト名やrootのパスワードも入力。

[!] がない状態([ ]か[x]のみ)でなければインストール開始できません。

インストールが開始したら途中の入力はありません。放置して待ちます。
所要時間はCPUやディスクの性能に依存しますが、10分程度ですね。

終わったら自動でOSが起動されます。

OSインストールのポイント

設定ポイントに”★”でコメントを記載。

#

Installation

1) [x] Language settings           2) [x] Time settings
       (Japanese (Japan))               (Asia/Tokyo timezone)
★Language:Japanese  , TimeZone: Asisa/Tokyo を指定

Software selection
Base environment
1) [ ] Server with GUI      4) [ ] Workstation
2) [x] Server  ★           5) [ ] Custom Operating System
3) [ ] Minimal Install      6) [ ] Virtualization Host

★これは用途に応じて変更する。迷ったら 2:Server選択。

-----
Additional software for selected environment

1) [ ] Hardware Monitoring Utilities  15) [ ] Virtualization Hypervisor
2) [ ] Windows File Server            16) [x] Basic Web Server ★
3) [x] Debugging Tools ★             17) [ ] Legacy UNIX Compatibility
4) [ ] DNS Name Server                18) [ ] Container Management
5) [ ] File and Storage Server        19) [x] Development Tools ★
6) [ ] FTP Server                     20) [ ] .NET Core Development
7) [ ] GNOME                     21) [ ] Graphical Administration Tools
8) [ ] Guest Agents                   22) [ ] Headless Management
9) [ ] Infiniband Support             23) [ ] RPM Development Tools
10) [ ] Mail Server                   24) [ ] Scientific Support
11) [ ] Network File System Client    25) [ ] Security Tools
12) [ ] Network Servers               26) [ ] Smart Card Support
13) [x] Performance Tools ★          27) [x] System Tools ★
14) [ ] Remote Management for Linux

★3,13,16,19,27 を1つずつ入力。一度に入力はできない。

=========================
Installation Destination

1) [x] QEMU HARDDISK: 30 GiB (sda) ★デフォルトでOK
1 disk selected; 30 GiB capacity; 30 GiB free
=========================
Partitioning Options

1) [ ] Replace Existing Linux system(s)
2) [x] Use All Space ★デフォルトでOK
3) [ ] Use Free Space
4) [ ] Manually assign mount points
=========================
Partition Scheme Options

1) [ ] Standard Partition
2) [x] LVM ★デフォルトでOK
3) [ ] LVM Thin Provisioning
=========================

Select a partition scheme configuration.
7) [ ] Network configuration          

=========================
Network configuration
Wired (ens3) disconnected
Host Name: localhost.localdomain

Current host name: localhost.localdomain
1) Set host name  ★ホスト名を設定する 
2) Configure device ens3

================================================
Device configuration
1) IPv4 address or "dhcp" for DHCP  dhcp
2) IPv4 netmask
3) IPv4 gateway
4) IPv6 address[/prefix] or "auto" for automatic, "dhcp" for DHCP,
5) IPv6 default gateway
6) Nameservers (comma separated)
7) [x] Connect automatically after reboot ★ON
8) [x] Apply configuration in installer ★ON

Configuring device ens3.

★7, 8 ON に変更
-------------------------------------------


仮想マシンとハイパーバイザの管理コマンドvirsh

virshは、仮想マシンとハイパーバイザを管理するコマンドです。

必要最低限のオプションを紹介。

■ゲストOSの確認
# virsh list –all

・virsh list のみで、「–all」を付けないと停止しているゲストOSは表示されません。
・別OSでアカウントで作成したゲストOSも表示されません。

■ゲストOSの起動
# virsh start ゲストOS名

■ゲストOSの停止
# virsh shutdown ゲストOS名

■停止しない場合は、destroy オプションで強制終了
意外とshutdownコマンドで止まらないことが多いです。destroyはプロセスを停止するkillコマンドみないな機能です。
# virsh destroy ゲストOS名

■ゲストOS のコンソール画面に接続。SSHで接続できない場合に利用。
# virsh console ゲストOS名

■ゲストに関連するファイルをすべて削除
# virsh undefine ゲストOS名

■仮想マシンの名前やCPU数などの情報を表示
# virsh dominfo ゲストOS名

■仮想マシンのIPアドレスを表示(IPアドレスの確認)
# virsh domifaddr ゲストOS名

VM作成時にネットワーク指定がデフォルトの場合、DHCPでIPアドレスが割り当てられるので、再起動でIPアドレスが変わるときがあります。

ゲストOS(仮想マシン)への接続方法

ゲストOSには、ローカルIPしか設定されていませんので、図のような2段のログインになります。

①TeraTermやSSHでホストOS(Linux)にログイン

②それぞれのゲストOS(仮想マシン)にSSHでログイン
ssh root@ゲストOSのIPアドレス


外部IP(会社だと会社内で使えるIP)をゲストOSに割り当て、外部からアクセスできるネットワーク設定にすれば直接接続することも可能です。

その他のノウハウ

仮想マシン(Linux)の自動インストール方法

KVM ゲストVM(Linux)の自動インストール方法virt-installコマンドでKVM上にLinux仮想マシン(ゲストVM)を自動で作成する方法を紹介します。 通常、Linux...

仮想マシンのクローンを作成する方法

KVMでゲストOSのクローンを作成する方法(DHCPのIPアドレス重複問題も回避)KVMで仮想マシンのクローンを作成する方法する方法を紹介します。 KVM環境でvirt-cloneで仮想マシン(VM)のクローンを...

注意事項(ノウハウ)

利用中に分かったノウハウを記載します。

一般ユーザで作成したゲストOSのNWが使えない

root以外の一般ユーザアカウントで作成すると仮想NWが有効にならない。
権限を設定すればできそうだが、未調査。

他の人が作成したゲストOS(仮想マシン)の情報が見れない。

■以下で運用可能

(1)ゲストOS(仮想マシン)の作成は、root権限で行う

(2)ゲストOSの接続は、全ユーザでSSH接続可能なので、一般ユーザでゲストOSにログインする。

(3)ゲストOS(仮想マシン)の起動・停止などメンテナンス業務はrootが行う。

SSHでrootでログインできない場合

SSHでゲストOSにログインできない場合の対処方法です。

ゲストOS のコンソールに接続する。
# virsh console ゲストOS名

ログアウトは、“Ctrl”+”]” キーです。

Red Hat Enterprise系のRocky Linux9やAlmaLinux9 は、デフォルトではrootでログインが許可されていない場合があります。

/etc/ssh/sshd_config に以下の設定を追加します。

PermitRootLogin yes
serviceコマンドでsshdを再起動すると、sshコマンドでrootによるログインが可能になります。

# service sshd restart

yumなど外部通信の利用

デフォルトのネットワーク設定は、ブリッジされているのでyumで外に接続可能です。

会社でプロキシサーバー経由の場合は、プロキシーの設定を行ってください。

a)方法1
# vi   /etc/yum.conf
proxy=http://proxy.XXX.co.jp:8080

b)方法2
# export HTTP_PROXY= http://proxy.XXXX.co.jp:8080

# yum install xxx

Windows OSもインストール可能

X-Windowで画面が表示できる場合、Windows OSもインストール可能です。

KVMを使ってWindowsをゲストOSとしてインストールする手順KVMを使用してWindowsをゲストOSとしてインストールする手順を紹介します。 https://relax-tech.net/...

ゲストOSのインストールで失敗(OS情報が古い)

ゲストOSのインストールで「hvm カーネルが見つかりませんでした」エラーで失敗する場合の対処方法です。

#
 
# virt-install --name=Ubuntu2204 --location=/DL/ubuntu-22.04.2-live-server-amd64.iso .... 

WARNING  オペレーティングシステムを検出できません。
仮想マシンのパフォーマンスが低下する可能性があります。最適なパフォーマンスを得るには、--os-variant で OS を指定する必要があります。
 
インストールの開始中...
ERROR Ubuntu ツリーに対する hvm カーネルが見つかりませんでした。
仮想マシンのインストールが成功したように見えません。
成功していれば、次を実行すると、仮想マシンを再起動できます:
  virsh --connect qemu:///system start Ubuntu2204
そうでなければ、インストールをやり直してください。

★ホストOSにインストールされているOS情報が古い。Ubuntu20.xx 以降のOS情報がありません。

#

# osinfo-query os | grep -i ubu

ubuntu14.04 | Ubuntu 14.04 LTS | 14.04 |
ubuntu14.10 | Ubuntu 14.10     | 14.10 |
ubuntu15.04 | Ubuntu 15.04     | 15.04 |
ubuntu15.10 | Ubuntu 15.10     | 15.10 |
ubuntu16.04 | Ubuntu 16.04     | 16.04 |
ubuntu16.10 | Ubuntu 16.10     | 16.10 |
ubuntu17.04 | Ubuntu 17.04     | 17.04 |
ubuntu17.10 | Ubuntu 17.10     | 17.10 |

以下にosinfo-dbの最新ファイルがあります。

https://releases.pagure.org/libosinfo/

最新版 osinfo-db-20230518.tar.xz をダウンロードし、osinfo-db-importでインポートします。

wget https://releases.pagure.org/libosinfo/osinfo-db-<VERSION>.tar.xz

osinfo-db-import –system osinfo-db-<VERSION>.tar.xz

#

 
$ wget https://releases.pagure.org/libosinfo/osinfo-db-20230518.tar.xz
 
osinfo-db-import ツールで、データベースをインストール:
 
# osinfo-db-import --system osinfo-db-20230518.tar.xz

# osinfo-query os | grep -i ubuntu
 

ubuntu20.04 | Ubuntu 20.04 LTS | 20.04 | 
ubuntu20.10 | Ubuntu 20.10     | 20.10 | 
ubuntu21.04 | Ubuntu 21.04     | 21.04 | 
ubuntu21.10 | Ubuntu 21.10     | 21.10 | 
ubuntu22.04 | Ubuntu 22.04 LTS | 22.04 | 
ubuntu22.10 | Ubuntu 22.10     | 22.10 | 
ubuntu23.04 | Ubuntu 23.04     | 23.04 | 
ubuntu23.10 | Ubuntu 23.10     | 23.10 | 



Ubuntu20.xx 以降のOS情報がインストールされました。
OSを再起動すると使えるようになります。

Ubuntu 22.04 やUbuntu 20.04でインストール失敗

–locationオプションを使った一般的なUbuntuのインストール方法で、Ubuntu 22.04やUbuntu 20.04 がインストールできない場合があります。

#
virt-install --name ubuntu2204-1 --location /download/ubuntu-22.04.3-live-server-amd64.iso,kernel=casper/hwe-vmlinuz,initrd=casper/hwe-initrd --disk path=/db2/vm-image/Ubuntu2204-S1.qcow2,size=50,format=qcow2 --vcpus 3 --ram 4096 --graphics none --extra-args "console=tty0 console=ttyS0,115200n8"

ERROR インストール場所の検証中にエラーが発生しました: Validating install media '/download/ubuntu-22.04.2-live-server-amd64.iso,kernel=casper/hwe-vmlinuz,initrd=casper/hwe-initrd'
failed: ストレージプールを開始できませんでした: cannot open directory '/download/ubuntu-22.04.2-live-server-amd64.iso,kernel=casper/hwe-vmlinuz,initrd=casper':
No such file or directory

変なところで切れている →「initrd=casper’」

■回避策

少し面倒ですが、以下のサイトの情報でインストール可能です。

How to install Ubuntu 22.04 as GUEST in KVM

<ポイント>
・isoファイルをmountして、–locationではなく、–cdromを使う。
・–bootオプションでkernelとinitrdの場所を”mnt/”付きで指定する。
・VMの設定を変更する(mnt/側を見ているので)。

#

# mkdir mnt
# mount -o loop ubuntu-22.04.3-live-server-amd64.iso mnt

# virt-install --name ubuntu2204 --ram=4096 --vcpus=2 --hvm \
--os-variant ubuntu22.04 \
--disk path=/vm-image/Ubuntu2204-1.qcow2,size=30,format=qcow2 \
--cdrom /DL/ubuntu-22.04.3-live-server-amd64.iso \
--graphics none --console pty,target_type=serial --os-type linux \
--network network:default \
--hvm --force \
--boot kernel=mnt/casper/vmlinuz,initrd=mnt/casper/initrd,kernel_args="console=ttyS0"

(VM強制終了する)
# virsh destroy ubuntu2204 
(定義ファイルを編集)
# virsh edit ubuntu2204 

(次の3行を削除する)
 /DL/mnt/casper/vmlinuz
 /DL/mnt/casper/initrd
 console=ttyS0

# virsh start ubuntu2204 

【参考】Ubuntu Server 22.04のインストール時の詳細な設定手順は以下が参考になります。

Ubuntu Server 22.04 インストール方法(VirualBoxにインストール)Ubuntu Server をインストールする方法を紹介します。 Ubuntu Server 22.04 をVirtualBoxに...

クラウド上で簡単に使えるLinux VPSサービス

KVMも便利ですが、ゲストOSの管理など面倒な面もあるので、VPSを使う方法もあります。

クラウド上のLinuxがリーズナブルな価格で即日利用可能なVPSサービスが存在します。
動作検証などで1ヶ月利用などの用途にも使えます。

Linuxサーバが不足/スペック不足!Linux VPSが解決策になる理由。開発や本番運用でも利用可能Linuxサーバを使いたいけど、自分で構築するのは面倒だし、レンタルサーバは手配も面倒で高額だし、どうしたらいいの?という方におすすめな...

Linux VPSとは?

VPSとはLinuxの仮想OS環境を提供するサービスです。

VPSで使うLinuxは、X-WindowのようなGUIがありません。

操作は、TeraTermやSSHでLinuxサーバに接続し、CUIで黒いコンソール画面にコマンドを入力する使い方になります。

Linux-OSを使うので、コマンド操作ができないと使えません。

以下のような感じです。
(正確には、Linuxは常に接続して操作するものではないので少し違いますが)
以下の画面は操作イメージです。

Windows10からTeraTermでLinuxサーバに接続して、Linuxサーバを操作しています。


プログラムはLinux側で動作しているので、クライアントPCのスペックは低くても問題ないです。
TeraTermやSSHの端末として使える程度のスペックでいいです。

時間課金で短い時間、短い日数で利用することも可能

ConoHaなどVPSで時間課金をサポートしているサービスもあります。数時間や数日だけの利用も可能です。

AWSやAzureサービスを使っている企業なら、クラウドサービス内にLinuxやWindowsの仮想化環境を構築して使う場合が多いでしょう。

しかし、個人やAWSやAzureなどのクラウドサービスを使っていない中小企業などは、VPSを使ったほうが全然簡単で便利です。

時間課金が魅力のConoHa VPS!費用を安く抑える方法と便利な使い方を解説。「お試し」にも最適WindowsやLinuxサーバーを利用するとき、気になるのは費用ですよね。毎月一定の料金を払うのは、無駄な出費に感じませんか? ...

最後に

KVM Linuxを使ってみて非常に便利で可能性を感じますが、情報が少なく調査に時間がかかりますね。

こういった技術ノウハウ以外に、技術ブログの収益化についても記事にしています。参考まで。

【データ公開】技術ブログで収益化。個人で月○万円稼ぐITエンジニアのブログ運営方法と収益内訳技術ブログは、ITエンジニアが個人でできる魅力的な副業になります。 自分が学んだことや経験したことをブログに書くことで、自分の知識...