yosh1

メモ

コマンドラインでKVMゲストOSをインストール

virt-install コマンドを使用して、仮想マシンを作成し、ゲストOSをインストールします。
ゲストOSは、Ubuntu 22.04.4 server を使用します。

$ sudo virt-install \
    --name ubuntu-2204-server \
    --vcpus 1 --memory 2048 \
    --cpu mode=host-passthrough \
    --network network=default,model=virtio \
    --location /path/to/ubuntu-22.04.4-live-server-amd64.iso,kernel=casper/vmlinuz,initrd=casper/initrd \
    --os-variant ubuntu22.04 \
    --disk size=80,cache=none,format=qcow2 \
    --graphics none \
    --extra-args 'console=tty0 console=ttyS0,115200n8 --- console=tty0 console=ttyS0,115200n8' \
    --boot uefi

あとは、インストーラの指示通りに進んでください。

virt-install オプション

オプションの詳細は、libvirtのドキュメントを参照 Domain XML format

# サブオプションの一覧を表示
$ virt-install --memory=?
$ virt-install --memory help

--name ubuntu-2204-server

ゲスト仮想マシンの名称
現在アクティブでないものも含め、すべてのゲスト仮想マシンの中で一意である必要があります。

--memory 2048

ゲスト仮想マシンに割り当てるメモリ量を指定(MiB単位)

--vcpus 1

ゲスト仮想マシンに割り当てられる仮想CPUの数を指定

--cpu mode=host-passthrough

ゲスト仮想マシンのCPUモデルを設定

  • mode=host-passthrough:ホストCPUと同じモデルと機能をゲスト仮想マシンに設定します。

--network network=default,model=virtio

ゲスト仮想マシンをホストネットワークに接続する方法を選択

  • network=default:「default」という名前の、仮想NATネットワークに接続します。
  • model=virtio:ゲストから見たネットワークデバイスのモデル。

「default」ネットワークは、KVMをインストールすると自動的に作成されます。
「default」ネットワーク上の仮想マシンは、ネットワークに完全にアクセスできますが、
ホストPC以外のデバイスはホスト上の仮想マシンと通信できません。
ホストPCだけがゲスト仮想マシンにアクセスできます。

「default」ネットワークの設定は以下のコマンドで確認できます。

$ virsh net-dumpxml default

--location /path/to/ubuntu-22.04.4-live-server-amd64.iso,kernel=casper/vmlinuz,initrd=casper/initrd

インストーラーイメージのパスを指定

  • kernel=casper/vmlinuz,initrd=casper/initrd:
    virt-installが利用するlibosinfoがkernelとinitrdの場所を知らないときに指定します。

指定しなかった場合、Ubuntu 22.04.4 server では以下のエラーが出てインストールができませんでした。

ERROR    Couldn't find hvm kernel for Ubuntu tree.

Couldn't find hvm kernel for Ubuntu tree Autoinstall quick start

--disk size=80,cache=none,format=qcow2

ゲスト仮想マシンが使用するストレージの設定

  • size=80:ストレージの容量(GiB単位)
  • format=qcow2:ディスクイメージ形式
  • cache=none:キャッシュの設定

--graphics none

ゲスト仮想マシンにグラフィカルコンソールを割り当てません。

ゲスト仮想マシンにアクセスするために、
--extra-argsオプションで、ゲスト仮想マシンのシリアルポートにテキストコンソールを設定する必要があります。

--extra-args 'console=tty0 console=ttyS0,115200n8 --- console=tty0 console=ttyS0,115200n8'

  • 最初の console=tty0 console=ttyS0,115200n8 は、
    VGAコンソール(console=tty0)またはシリアルコンソール(console=ttyS0)を使用してゲスト仮想マシン
    毎秒115200ビット、パリティビットなし、データビット数8ビット(115200n8)でインストールするように virt-install に指示します。

  • トリプルダッシュ(---)の後の、同じ console=tty0 console=ttyS0,115200n8 は、
    インストールされたゲスト仮想マシンブートローダー/etc/default/grubファイルのGRUB_CMDLINE_LINUX行に追加されます。

--boot uefi

インストール後のブート構成を指定

KVM on Ubuntu 22.04 Desktop

仮想化がサポートされていることを確認

ハードウェアがKVM仮想化をサポートされていることを確認

$ lscpu | grep Virtualization

Virtualization:                     VT-x  # 👈 VT-x or AMD-V

出力が空白の場合、BIOS/UEFIで無効になっている可能性があります。

カーネルKVMモジュールが含まれていることを確認

yまたはmに設定されていれば利用できます。

$ zgrep CONFIG_KVM /boot/config-$(uname -r)

CONFIG_KVM_GUEST=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_KVM_VFIO=y
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
CONFIG_KVM_COMPAT=y
CONFIG_KVM_XFER_TO_GUEST_WORK=y
CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y
CONFIG_KVM=m
CONFIG_KVM_WERROR=y
CONFIG_KVM_INTEL=m
CONFIG_KVM_AMD=m
CONFIG_KVM_AMD_SEV=y
CONFIG_KVM_SMM=y
CONFIG_KVM_XEN=y
CONFIG_KVM_EXTERNAL_WRITE_TRACKING=y

インストール

$ sudo apt update
$ sudo apt install qemu-kvm libvirt-daemon-system libvirt-client virtinst

必要なら

仮想マシンを作成できる準備ができていることを確認

$ sudo virt-host-validate qemu

WARNの修正

QEMU: Checking for device assignment IOMMU support : WARN (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform)

お使いのインテルプロセッサは、VT-x(vmx)機能のみサポートしており、VT-dはサポートしていません。

サポートされていないので無視しても問題ありません。


QEMU: Checking for secure guest support : WARN (Unknown if this platform has Secure Guest support)

AMD Secure Encrypted Virtualization (SEV) サポートを有効にする。

インテルCPUの場合、この警告は無視しても問題ありません。

libvirt デーモン(サービス)をシステム起動時に自動起動する。

sudo systemctl enable --now libvirtd

# 確認する
sudo systemctl status libvirtd

Bash プロンプトのカスタマイズ 色

プロンプトに色を付けていきます。下の画像は今回使用する CSI (Control Sequence Introducer) sequences という文字出力を制御する設定の一部で文字に色・太さ・下線などの属性を設定する機能です。

色の変更 \e[nm

\e[
文字出力の制御の設定(CSI)を開始しする合図です。
よく検索すると、\033[ や \x1b[ と出てきますが同じ意味です。前者が8進数、後者が16進数で e の文字を表現しています。

n
制御する属性を0~107の数値(SGR)で設定します。
複数の属性を設定する場合は「;」セミコロンで区切ります。数値を入力せずに「;;」と1つ以上続いた場合、値のない箇所は0が入力されたことになります。
\e[m と n は省略することができます。この場合、全ての属性が初期値にリセットされます。(\e[0m と同じです。)

m
文字の色やスタイルを設定する記号です。

属性を設定するとリセットするか上書きするまで、その属性が生き続きます。必要な場所でリセット(\e[0m)をすると良いでしょう。

n(SGR)属性の設定

これで色が変えられますね。 0〜107の内、色に関係してくるのは以下の表通りです。

文字色 背景色 備考
30 ~ 47 40 ~ 47 基本の8色
90 ~ 97 100 ~ 107 明るい8色
38;5;n 48;5;n 256色。 nに0~255の数値を入力
38;2;r;g;b 38;2;r;g;b RGB色。r;g;b にはそれぞれ0~255の数値を入力
39 49 39文字色・49背景色を初期値に戻す
7 文字色と背景色を入れ替える

詳細

Fe Escape sequences
CSI (Control Sequence Introducer) sequences
SGR (Select Graphic Rendition) parameters

色の数

ここまで色を付けてきましたが環境によっては256色、RGB色が使えないということがあります。

  • 使っているターミナルアプリケーションが対応していない
  • エミュレートしている端末タイプが対応していない

等です。確認するには以下のコマンドを実行してください。

echo $TERM
echo $COLORTERM

さらに、Terminal Colors にある次のコマンドでテストしてください。

awk 'BEGIN{
    s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
    for (colnum = 0; colnum<77; colnum++) {
        r = 255-(colnum*255/76);
        g = (colnum*510/76);
        b = (colnum*255/76);
        if (g>255) g = 510-g;
        printf "\033[48;2;%d;%d;%dm", r,g,b;
        printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
        printf "%s\033[0m", substr(s,colnum+1,1);
    }
    printf "\n";
}'

TERM の値が *-256color 、COLORTERM の値が truecolor 、 次にテストしたコマンドでグラデーションに段差が出ていなければ、RGBまで対応しています。
グラデーションに段差が出ている場合、アプリケーションが対応していないのでサイトを覗いて確認してください。

truecolorとは
RGB色、#ffffff のこと。R,G,Bをそれぞれ8bit、計24bitで表現

おわりに

次回は見た目をデザインしていきます。

Bash プロンプトのカスタマイズ

普段、Oh My Poshのテーマを利用して綺麗なプロンプトを表示していましたが、
ふと使わずにカスタマイズしたくなりました。

筆が遅いの少しづつ、今回はプロンプトに表示する文字列を見ていきます。

環境
Ubuntu 22.04
bash 5.1.16

.bashrc ファイルの編集

ホームディレクトリにある ~/.bashrcファイルを開きます。vim を使用しますが、好きなエディタで開いてください。

vim ~/.bashrc

.bashrc は bashの設定ファイルです。

開いたら環境変数 PS1 を最下行に記述し、プロンプトに表示したい文字列を入力し保存します。
文字列は必ずシングルクォート「 ' 」で囲ってください。
PS1='文字列'

PS1='Hello bash!:\u@\h:\w\$'

ターミナルを新しく開いて確認してみましょう。
プロンプトの文字列が下記のようになっています。(UserName、HostNameは使用している環境によって文字が変化します。)

Hello bash!:UserName@HostName:~$

PS1 の詳細

ザックと解説、詳しくは詳細を見てください。

環境変数 PS1

  • 環境変数:みんなで共有できる変数。
  • PS1:ターミナルを開いたとき、コマンドを入力する前、終わったあとに表示されている文字列(PS0〜PS4までありますが他は滅多に使いません。Prompt Strings の略。)

詳細
man bashパラメータのシェル変数

'文字列' の中身

'Hello bash!:\u@\h:\w\$'

  • '(シングルクォート):シングルクォートで文字列を囲むと全て文字として扱いますが、特殊な処理をする文字列があります。下記へ
  • \(バックスラッシュ):クォート内でバックスラッシュと英数字・記号の組み合わせで特殊文字を出力できます。\u \h \w \$ など

詳細
man bashクォート
man bashプロンプト(特殊文字)

カスタマイズ

あとは自由に文字を組み合わせます。

PS1='\s:\w\n\$'

保存して編集が終わったら、新しくターミナルを開くか、.bashrcを再読込します。

# .bashrcを再読込
source ~/.bashrc

参考サイト

Ubuntu manual:bash
Arch wiki :Bash/プロンプトのカスタマイズ

後記

次回は色を付けていきます。

  • 画像を作ってもう少し見やすく説明できるようにする。
  • ブログのデザインをカスタマイズする。