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インストール直後の状態が複数個欲しい
・Linux OSを自動でインストールしたい
Ubuntu、CentOS、AlamaLinux 、Rocky Linuxなどいろいろなディストリビューションの違いを調べるときなどに最適です。
WindowsのHyper-VやVirtualBoxなども便利ですが、KVMでリモート&CUIでインストールが非常に楽ですね。
Linuxの自動インストールまで可能なので超便利です。
KVM Linuxの利用イメージ
ホストOSのHWリソース(CPU、メモリ、ディスク)をゲストOSへ割り当てるようなイメージになります。
ゲストOSを複数同時に起動する場合は、ホストOS側のリソース(CPU、メモリ、ディスク)が必要です。
今回、「CPU 16コア/メモリ64GB/ディスク2TB」ぐらいのスペックで説明。
数年前のIntel Xeon サーバで、CPUは最新ではないが、HWリソース(CPUコアや物理メモリ)はそこそこあるサーバマシン。(今だと20万円ぐらいのタワーマシンとして買えそうですが)
■以下の3つのLinux-OSに以下の配分で割り当てたケース
・Ubuntu22.04:vCPU:4/メモリ:4GB/HDD:100GB
・CentOS7 :vCPU:2/メモリ:2GB/HDD:50GB
・RockyLinux8:vCPU:2/メモリ:1GB/HDD:30GB
1つずつの割り当てがホストのリソースを超えずに、かつ、同時実行する合計値を超えることはできません。
■ゲスト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
<Ubuntuの場合>
$ sudo apt install qemu-kvm libvirt-daemon-system bridge-utils virt-manager
(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のインストール画面)
数字を入力して選択して設定していきます。ホスト名や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名
■shutdownで停止しない場合は、destroy オプションで強制終了
意外とshutdownコマンドで止まらないことが多い。destroyはプロセスを停止するkillコマンドのような機能です。
# virsh destroy ゲストOS名
■ゲストOS のコンソール画面に接続。SSHで接続できない場合に利用
# virsh console ゲストOS名
■ゲストに関連するファイルをすべて削除
# virsh undefine ゲストOS名 –remove-all-storage
■仮想マシンの名前や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)の自動インストール方法
OSの自動インストールを使うとLinux-OSのインストールとOSの初期設定(SELinuxやFirewalldをオフにするとか)まで自動で可能です。
仮想マシンのクローンを作成する方法
複数台検査環境など作成する場合などにコピーを簡単に作成できて便利です。
注意事項(ノウハウ)
利用中に分かったノウハウを記載します。
一般ユーザで作成したゲスト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もインストール可能です。
ゲスト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のインストール時の詳細な設定手順は以下が参考になります。
クラウド上で簡単に使えるLinux VPSサービス
KVMも便利ですが、ゲストOSの管理など面倒な面もあるので、VPSを使う方法もあります。
クラウド上のLinuxがリーズナブルな価格で即日利用可能なVPSサービスが存在します。
動作検証などで1ヶ月利用などの用途にも使えます。
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を使ったほうが全然簡単で便利です。
最後に
KVM Linuxを使ってみて非常に便利で可能性を感じますが、情報が少なく調査に時間がかかりますね。
こういった技術ノウハウ以外に、技術ブログの収益化についても記事にしています。参考まで。