それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

virsh で自動起動している仮想マシンを管理する

virsh で自動起動している仮想マシンを管理する

自動起動のまとめ

自動起動(仮想ホストが起動したときにゲストも一緒に起動する)設定のオンオフ

## 自動起動 On
sudo virsh autostart d02 
## 自動起動 Off
sudo virsh autostart d02 --disable
## 自動起動 on の一覧
sudo virsh list --autostart --all
## 自動起動 off の一覧
sudo virsh list --no-autostart --all

--all をつけてすべて取得する。つけてない場合は、起動中のみが対象になる。

--all の有無はよく忘れる。自動起動のオフを勘違いすることが多いので注意

動作例

実際に試してみた例

仮想マシンの一覧で次のように見える

takuya@:images$ sudo virsh list --all
 Id   名前    状態
----------------------------
 5    d02.1   実行中
 -    d02     シャットオフ

自動起動の一覧を見る

いまは何もない

takuya@:images$ sudo virsh list --autostart --all
 Id   名前   状態
-------------------

自動起動オフ」の一覧を見る

takuya@:images$ sudo virsh list --no-autostart --all
 Id   名前    状態
----------------------
 5    d02.1   実行中

自動起動を「オン」にする

takuya@:images$ sudo virsh autostart d02
Domain 'd02' marked as autostarted

自動起動を「オフ」にする

takuya@:images$ sudo virsh autostart d02 --disable
Domain 'd02' unmarked as autostarted

結果を確認する

takuya@:images$ sudo virsh list --autostart --all
 Id   名前   状態
---------------------------
 -    d02    シャットオフ

注意 --all でみること

--all をつけないと、停止中の仮想マシンについては表示されない。

よくあるミスが次のパターン

自動起動をしたくないマシン」が「自動起動してたのですでに停止した」

この状態で自動起動を設定しようとして、あれ?すでにオフか・・・と勘違いすることは多いので注意、

参考資料

man virtsh

libvirt で仮想マシンをクローンする

libvirt仮想マシンをクローンする

sudo virt-clone -o d02 -n d02.1 -f /var/lib/libvirt/images/d02.1.img

仮想マシンをコピーして新規作成する。(クローン)

  • -o d02 元になる
  • -n d02.1 コピー先の名前
  • -f FILE_NAME ディスクの名前

上記例は、ディスクを1つしか使ってない場合なので、複数ディスクの場合がどうなるかはあとで実験してみよう。

kvm / qemu で clone を実行した場合、 qcow2 ディスクから qcow2 ディスクができた。

virsh 起動時に コンソールを接続する

virsh 起動時に コンソールを接続する

起動してコンソール接続するには

通常は、2つのコマンドを接続する

virsh start vm01 
virsh console vm01 

2つのコマンドを1回で済ませることができる

virsh start vm01 --console 

--console をつけて起動すれば、コンソールを接続した状態で起動するので便利である。

VS Code の矩形選択(箱型選択)のキーボード・ショートカットが気に入いらない

気に入らないので、箱型選択のときだけAtomを使ってたけど。

我慢できずに、キーボードショートカットを変えることにした。

キーボードショートカットの設定を開く

Column で検索して変える。 columnSelect textInput で絞り込む

デフォルト設定 は Ctrl - Alt - Shift

ctrl+shift+alt UpArrow

これを ctrl - Alt に変えた

ctrl+alt UpArrow

ctrl-shift だとだめ

ctrl shift 矢印は、Windowsのデフォルトで、単語選択のキーボードショートカットなので絶対上書きできない。

Ctrl -ALTが使いやすい。

Ctrl-Alt-Shiftの3つも押しながらは流石に辛い。

上下矢印だけならアリかもしれない。

矩形選択・箱型選択

矩形選択、最近は呼ばないですよね。箱型ですね。

英語でも column selection / visual block とか表記に揺れがある気がします。

preseedでtasksel をスキップするには。

preseed で tasksel をスキップするには。

debian インストールを自動化するときにtaskselをスキップしてサクッとインストールしたい。

何も書かなかればいいみたい・・・?

tasksel tasksel/first multiselect 

何も明示明示しないで、インストールしたときの インストール後のtasksel

何も選択されてない

standard は入ってるのかもしれない。

明示的に書く方法もあるみたい。試してないので知らんけど。

https://gist.github.com/tfheen/779962

d-i tasksel/first multiselect none
d-i pkgsel/include string openssh-server curl
d-i pkgsel/install-language-support boolean false
d-i pkgsel/language-pack-patterns string
d-i pkgsel/language-packs multiselect none
tasksel tasksel/skip-tasks string standard

local apt mirror(apt-cacher-ng) を使って debian/ubuntu インストールを早くする

仮想マシンをインストールしていると、aptの通信ロスが時間ロスになって気になった。

1分程度だけど、何度も実行してると疲れてくるので、apt-cacher-ngを使うことにした。

apt-cacher-ng をdocker で起動する

---
version: '2'
services:
  apt-cacher:
    container_name: proxies-apt-cacher
    image: sameersbn/apt-cacher-ng
    ports:
    - 3142:3142

docker-compose で起動する

sudo docker-compose pull
sudo docker-compose up

apt に設定して使う場合

echo 'Acquire::HTTP::Proxy "http://172.17.0.1:3142";' |sudo tee  /etc/apt/apt.conf.d/01proxy

名前解決ができる場合。

echo 'Acquire::HTTP::Proxy "http://apt-cacher.lan";' |sudo tee  /etc/apt/apt.conf.d/01proxy

preseedで使う場合

preseed.cfg に次のとおりに記載する。(ip は環境依存)

d-i mirror/country string manual
d-i mirror/http/hostname string debian-mirror.sakura.ne.jp
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string http://172.17.0.1:3142

使ってみた結果

ローカルホストでミラーは速いですよね。やっぱり。ボトルネックは純粋にディスクIOだけになった。

docker で作ったapt-cacher-ngの場合、apt-cacherのまれなエラーで自動処理が止まることがある。

proxies-apt-cacher | [warn] Epoll ADD(1) on fd 12 failed. Old events were 0; read change was 1 (add); write change was 0 (none); close change was 0 (none): Bad file descriptor

apt-cacher-ng は概ね良好に起動するが、まれにエラーが出て、APTパッケージの取得に失敗する。再度トライすれば問題なくインストールが終わる。

手作業でインストールするときはもんだ無いが、完全無人だと気づかずにインストールが死ぬので、問題が多い。

無人インストールでapt-cacherを使うなら、手作業で初回キャッシュさせたほうが無難かもしれない。

apt-cache-ng は単なるプロキシ

ちょっと変わったプロキシなので、ubuntu/debian だけでなく、cygwincentos(yum)でも使えるので、ローカルや組織内に1つくらいあってもいいかもしれない。

指定の仕方 インストール済み

ubuntu の場合、ここでインストールで指定することもできる

指定の仕方 インストール済み

echo 'Acquire::HTTP::Proxy "http://172.17.0.1:3142";' >> /etc/apt/apt.conf.d/01proxy

過去の関連記事

apt-cacherで docker buildを速くする - それマグで!

仮想hdd/ボリューム指定して 仮想マシン新規作成

仮想マシン ボリューム指定して 仮想マシン新規作成

libvirtを使ってラッピングしていたらは virt-install を使ってインストールする。

HDDからブートすればいい

--disk path=/var/lib/libvirt/images/d03.qcow2 でディスクを付ける。

--boot hd これをつければかんたん(なくてもいいし、uefiのときもある。)

コマンドの例

boot して既存のHDD(クローンしたものなど)を指定して、新規で仮想マシンを作る。

virt-install\
 --boot hd \
 --connect=qemu:///system  \
 --name d03  \
 --ram 8192  \
 --disk path=/var/lib/libvirt/images/d03.qcow2  \
 --vcpus 8  \
 --virt-type kvm  \
 --os-type linux  \
 --os-variant debian10  \
 --graphics none  \

uefi の場合

virt-install\
 --boot uefi \
 --connect=qemu:///system  \
 --name d03.diff_1  \
 --ram 8192  \
 --disk path=/var/lib/libvirt/images/d03.diff.qcow2  \
 --vcpus 8  \
 --virt-type kvm  \
 --os-type linux  \
 --os-variant debian10  \
 --graphics none  \

ただし、uefi を使う場合、セキュアブートに注意すること。また、ディスクのチェックに注意すること。ディスクのUUIDとマシンのUUIDの一致のチェックが走るので、既存のぶーとだとうまく行かないことがある。( UEFI でnvram をコピーする方法はそのうち調べたい)

qemu で直接指定してもいいんだけど、汎用性にちょっと不安を感じるのでなれるまで libvirt を使っている。

virt-install のos varian が unknown で怒られたときに、OSをインストールするときの名前を調べたい

osinfo-query

virt-install のos variant が unknown で怒られたときに、OSをインストールするときの名前を調べたい

$ virt-install  --os-variant ubuntu 
ERROR    Unknown OS name 'ubuntu'. See `osinfo-query os` for valid values.

名前がわからない・・・・どうしたらいいいのか

コマンドで調べることができる

コマンドで調べる

$ osinfo-query os

コマンドのインストール

通常のままだと、コマンドが存在しないので、インストールする必要があった。

takuya@:~$ apt-file search osinfo-query
libosinfo-bin: /usr/bin/osinfo-query
libosinfo-bin: /usr/share/man/man1/osinfo-query.1.gz

インストール

sudo apt install  libosinfo-bin

実行例

実行してみると、次のようにデータが出てくる。

takuya@:~$ osinfo-query os
Short ID        | Name                    | Version  | ID
-----------------+-------------------------+----------+-----------------------------------------
alpinelinux3.10 | Alpine Linux 3.10       | 3.10     | http://alpinelinux.org/alpinelinux/3.10
alpinelinux3.11 | Alpine Linux 3.11       | 3.11     | http://alpinelinux.org/alpinelinux/3.11
alpinelinux3.12 | Alpine Linux 3.12       | 3.12     | http://alpinelinux.org/alpinelinux/3.12
alpinelinux3.13 | Alpine Linux 3.13       | 3.13     | http://alpinelinux.org/alpinelinux/3.13
android-x86-8.1 | Android-x86 8.1         | 8.1      | http://android-x86.org/android-x86/8.1
android-x86-9.0 | Android-x86 9.0         | 9.0      | http://android-x86.org/android-x86/9.0
archlinux       | Arch Linux              |      
centos6.9       | CentOS 6.9              | 6.9      | http://centos.org/centos/6.9
centos7.0       | CentOS 7                | 7        | http://centos.org/centos/7.0
centos8         | CentOS 8                | 8        | http://centos.org/centos/8
cirros0.3.0     | CirrOS 0.3.0            | 0.3.0    | http://cirros-cloud.net/cirros/0.3.0
debian7         | Debian 7                | 7        | http://debian.org/debian/7
debian8         | Debian 8                | 8        | http://debian.org/debian/8
debian9         | Debian 9                | 9        | http://debian.org/debian/9
debiantesting   | Debian testing          | testing  | http://debian.org/debian/testing
freebsd9.0      | FreeBSD 9.0             | 9.0      | http://freebsd.org/freebsd/9.0
freebsd9.1      | FreeBSD 9.1             | 9.1      | http://freebsd.org/freebsd/9.1
freebsd9.2      | FreeBSD 9.2             | 9.2      | http://freebsd.org/freebsd/9.2
freebsd9.3      | FreeBSD 9.3             | 9.3      | http://freebsd.org/freebsd/9.3
freedos1.2      | FreeDOS 1.2             | 1.2      | http://freedos.org/freedos/1.2
ubuntu17.10     | Ubuntu 17.10            | 17.10    | http://ubuntu.com/ubuntu/17.10
ubuntu18.04     | Ubuntu 18.04 LTS        | 18.04    | http://ubuntu.com/ubuntu/18.04
ubuntu18.10     | Ubuntu 18.10            | 18.10    | http://ubuntu.com/ubuntu/18.10
ubuntu19.04     | Ubuntu 19.04            | 19.04    | http://ubuntu.com/ubuntu/19.04
ubuntu19.10     | Ubuntu 19.10            | 19.10    | http://ubuntu.com/ubuntu/19.10
ubuntu20.04     | Ubuntu 20.04            | 20.04    | http://ubuntu.com/ubuntu/20.04
ubuntu20.10     | Ubuntu 20.10            | 20.10    | http://ubuntu.com/ubuntu/20.10
win10           | Microsoft Windows 10    | 10.0     | http://microsoft.com/win/10
win7            | Microsoft Windows 7     | 6.1      | http://microsoft.com/win/7
winvista        | Microsoft Windows Vista | 6.0      | http://microsoft.com/win/vista
winxp           | Microsoft Windows XP    | 5.1      | http://microsoft.com/win/xp
takuya@:~$

参考資料

http://ossfan.net/setup/kvm-08.html

ubuntuをvirt-install でインストール時にコンソールを使う。

ubuntuvirt-install でインストールときにコンソールを使う

シリアル・コンソールを使ってUbuntuインストールをしたい。

CD-ROMを使ってインストールすると、シリアルコンソールが使えないので 直接カーネルオプションを指定したいが

カーネルオプションを指定するにはカーネルを直接起動する必要がある。

カーネルを直接起動するには CDROMを指定せずに、 location で ディスク内のカーネルイメージファイルを直接指定する。

cdrom ISOの中にあるカーネルを起動する設定

 --location /var/lib/libvirt/images/ubuntu-20.04.3-live-server-amd64.iso,kernel=casper/hwe-vmlinuz,initrd=casper/hwe-initrd \

CD-ROMからインストーラーを起動するとシリアルコンソールでインストールで来ないので、location を指定する例。

実際の例

virt-install\
 --connect=qemu:///system  \
 --name u04 \
 --ram 8192  \
 --disk path=/var/lib/libvirt/images/u04.qcow2  \
 --location /var/lib/libvirt/images/ubuntu-20.04.3-live-server-amd64.iso,kernel=casper/hwe-vmlinuz,initrd=casper/hwe-initrd \
 --vcpus 8  \
 --virt-type kvm  \
 --os-type linux  \
 --os-variant ubuntu20.04  \
 --graphics none \
 --extra-args "console=tty0 console=ttyS0,115200n8" \

ディスクの作成

qemu-img create -f qcow2 /var/lib/libvirt/images/u04.qcow2 10G

ディスク作成もコマンドで簡単。

インストール完了

ubuntu のインストールは、多数のパッケージ展開とセキュリティアップロードを伴うので、debianのbaseインストールに比べて、ubuntu インストールには時間がかかる。どうしても時間がかかる。

インストールされてしまえばとても快適なんだけどね

debian が2分くらいなら、ubuntu は10分くらいかかる。

ubuntu の場合はSSH経由で

Ubuntuの場合、シリアルコンソールで起動すると、SSH経由でインストールするように誘導される。SSH経由のほうが便利。

インストール済みのHDDから作る場合。

すでにインストールしたqcow2 のコピーファイルを使うともっと手軽に作れて便利である。cloud-initをうまく使うと更に便利だと思う。

 virt-install\
 --boot hd \
 --connect=qemu:///system  \
 --name u04 \
 --ram 8192  \
 --disk path=/var/lib/libvirt/images/u04.qcow2  \
 --vcpus 8  \
 --virt-type kvm  \
 --os-type linux  \
 --os-variant ubuntu20.04  \
 --graphics none  \
 

参考資料

https://askubuntu.com/questions/1319896/how-to-use-autoinstall-from-ubuntu-20-04-with-virt-install-command

qcow2 backing file を使う

qcow2 backing file を使う

sudo qemu-img create -b d03.qcow2 -f qcow2 -F qcow2 d03.diff.qcow2

qcow2をバックエンドにして qcow2.diff を作る

d03.qcow2 -> d03.diff.qcow2

実際にやってみた。

仮想ディスクからディスクを作る。

$ sudo qemu-img create  -b d03.qcow2 -f qcow2 -F qcow2 d03.diff.qcow2
Formatting '/var/lib/libvirt/images/d03.diff.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=8589934592 backing_file=/var/lib/libvirt/images/d03.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16

起動する。

差分ディスクを使って新規仮想マシンを作る

virt-install\
 --boot hd \
 --connect=qemu:///system  \
 --name d03-diff-1 \
 --ram 8192  \
 --disk path=/var/lib/libvirt/images/d03.diff_1.qcow2  \
 --vcpus 8  \
 --virt-type kvm  \
 --os-type linux  \
 --os-variant debian10  \
 --graphics none

速攻で起動して嬉しい。

もとに戻す。

もとに戻すのはかんたん。

HDDを作り直せばいい。

仮想マシン停止して、HDDを作り直し、仮想マシンを起動する。

$ sudo virsh destory d03-diff-1
$ sudo qemu-img create  -b d03.qcow2 -f qcow2 -F qcow2 d03.diff_1.qcow2
$ sudo virsh start d03-diff-1

仮想マシンの停止は、起動中ならディスクの書き込みは排他ロックされているため。

差分情報

差分について確認したいとき

takuya@:~$ sudo qemu-img info /var/lib/libvirt/images/d03.diff_1.qcow2
image: /var/lib/libvirt/images/d03.diff_1.qcow2
file format: qcow2
virtual size: 8 GiB (8589934592 bytes)
disk size: 272 MiB
cluster_size: 65536
backing file: /var/lib/libvirt/images/d03.qcow2
backing file format: qcow2
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    extended l2: false

commit でBaseへ変更点を反映する

差分側の変更点を、Baseファイル側へ書き出す(Commit)

書き出すと。ファイルのサイズはほぼゼロになる。差分ファイルに溜まった変更点をBASE側に持っていったので当たり前である。

もちろん、仮想マシンが停止している必要がある。

takuya@:~$ sudo qemu-img commit /var/lib/libvirt/images/d03.diff_1.qcow2
Image committed.
takuya@:~$ sudo qemu-img info /var/lib/libvirt/images/d03.diff_1.qcow2
image: /var/lib/libvirt/images/d03.diff_1.qcow2
file format: qcow2
virtual size: 8 GiB (8589934592 bytes)
disk size: 256 KiB
cluster_size: 65536
backing file: /var/lib/libvirt/images/d03.qcow2
backing file format: qcow2
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    extended l2: false
takuya@:~$

baseファイルとSnapshotの違い

baseファイルとsnapshot は同じに扱える。

snapshot を1ファイルとして切り出したら、ある状態を起動することができる。しかし、変更点をスナップショットに戻すのは困難

一方でスナップショットからスナップを取れるし、スナップは削除できる。

qcow2 -> snapshot -> | port of no return | --> qcow2
qcow2 -> snapshot -> | can  rollback | --> snapshot

しかし、スナップは1つのqcow2 ファイルにあるため同時に起動できない。

そこで、qcow2 をベースに別ファイルとしてファイルを作る

qcow2 -> snapshot -> |  base file | --> qcow2.diff

すると、スナップショットまるごとコピーしてdiff に変更点をためておき、元ファイルに書き出すこともできる。

BASE Fileの場合

baseファイルと差分ファイルを、2つの仮想マシンに分割できる。(同時起動はWriteの奪い合いでできない。)

っていうかqcow単体スナップショットと殆ど変わらない。ファイルに分かれているかどうか。ってくらい

qcow2 ファイル単位で仮想ボリュームが違うものになるため、複数のマシンで起動が可能である。

qcow2 -> snapshot -> | base file | --> qcow2.diff1
qcow2 -> snapshot -> | base file | --> qcow2.diff2
qcow2 -> snapshot -> | base file | --> qcow2.diff3

調べてないけど、特定スナップショットをbase fileにできたかもしれない。

rebaseで元ファイルを切り替える。

このような親子関係を作ると・・・

d03 ── d03.diff1 ┬─ d03.diff2
                 └─ d03.diff3

これこうする

d03 ┬─ d03.diff1 ── d03.diff2
    └─ d03.diff3

diff 3 の元ファイルを変えてしまう。

sudo qemu-img rebase -f qcow2 -b d03.qcow2 -F qcow2  d03.diff_3.qcow2

これで、差分ファイルの親を変えることができる・・・が・・・・

rebase で無茶をしてみる。

debian から作った差分の元ファイル(Backing-file)をUbuntuにしたらどうなるのか

  • debian を入れたファイル d03.qcow2
  • debian からの差分 d03-diff.qcow2
  • ubuntu を入れた u04.qcow2

これを

d03 ── d03.diff
u04 ── 

こうする

d03 ── 
u04 ── d03.diff

どうなるのか。

takuya@:~$ sudo qemu-img info /var/lib/libvirt/images/d03.diff_1.qcow2
image: /var/lib/libvirt/images/d03.diff_1.qcow2
file format: qcow2
virtual size: 8 GiB (8589934592 bytes)
disk size: 5.28 GiB
cluster_size: 65536
backing file: /var/lib/libvirt/images/u04.qcow2
backing file format: qcow2
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    extended l2: false
takuya@:~$

差分が大量に発生してますね。

起動したらDebianで起動します。つまり、ubuntuファイルシステムu04 を d03.diff の状態まで変更した差分ができたってことですかね。

極端な差分は作れないので、aufs のレイヤみたいな感じには使えないようです。

base file は別ファイルのスナップショット的な感じで使う感じですね。

qemu-img のman pages の和訳をメモ

man の適当邦訳

man の適当邦訳

スナップショットについて情報が少なく、qemu-img の邦訳がなかったので、マニュアルを読むにあたってざっと日本語を作りながら確認していました。なんかに役に立つかも知れないので、私家版の邦訳を残しておきます。

qemu-img info

info [--object OBJECTDEF] [--image-opts]  [-f  FMT]  [--out‐
put=OFMT] [--backing-chain] [-U] FILENAME

in particular to know the size reserved on disk which can be different
from the displayed size. If VM snapshots are stored in the disk image,
they are displayed too.

info コマンドで利用者に、ファイル名で指定したファイルの 情報をだします。サイズ、予約サイズとホスト上の表示サイズが異なるので、
これを使って詳細情報を調べます。スナップショットが利用されている時に、
このコマンドで得られる情報が重要になってきます。

If a disk image has a backing file chain, information
about each disk image in the chain can be recursively
enumerated by using the option --backing-chain.
For instance, if you have an image chain like:
base.qcow2 <- snap1.qcow2 <- snap2.qcow2
To enumerate information about each disk image in the
above chain, starting from top to base, do:

backing file chain 利用中イメージファイルの場合、表示情報は各ファイルごとになります。再帰的に辿られます。ただし、---backin-chain の指定が必要です。

たとえば、次のようなチェイン構造のbacking fileの場合

base.qcow2 <- snap1.qcow2 <- snap2.qcow2

上記のチェーン辿りそれぞれのディスクイメージファイルを 先頭から情報を列挙してます。

qemu-img info --backing-chain snap2.qcow2

コマンド例は上記のとおりです。

qemu-img commit

commit [-f fmt] [-t cache] filename
Commit the changes recorded in filename in its base image.

変更差分を、base-fileへ書き出して統合する。

qemu-img snapshot

snapshot [-l | -a snapshot | -c snapshot | -d snapshot ] filename
List, apply, create or delete snapshots in image filename.

snapshot
:   Is  the  name  of  the  snapshot  to create, apply or delete
  -a     Applies a snapshot (revert disk to saved state)
  -c     Creates a snapshot
  -d     Deletes a snapshot
  -l     Lists all snapshots in the given image

スナップショット(一時保存)を併合・作成・削除する、スナップショットの一覧をみる。 (メモ-a/-dあたりがよく使うところっぽい。)

qemu-img create

create [--object OBJECTDEF] [-q] [-f FMT] [-b BACKING_FILE] [-F BACKING_FMT] [-u] [-o OPTIONS] FILENAME [SIZE]

create [-f fmt] [-o options] filename [size]

Create the new disk image filename of size size and format fmt.
Depending on the file format, you can add one or more options
that enable additional features of this format.
If the option backing_file is specified, then the image will
record only the differences from backing_file. No size needs
to be specified in this case.
backing_file will never be modified unless you use
the "commit" monitor command (or qemu-img commit).

The size can also be specified using the size option
with "-o", it doesn't need to be specified separately in this case.

新規にイメージ作成。サイズとフォーマットを指定し使う。
フォーマット次第でオプションは変わる。
詳しくはフォーマット章のオプションを見ておくこと。

例えば、backing_fileを明示したなら、
createしたイメージにbacking-fileからの差分が保存される。
この利用形態であればサイズ指定は不要です。
指定したbacking-fileは更新されず、差分が保持され、貯まった差分はcommitでbaseへ統合できる。
(サブコマンドcommitを参照のこと。)

qemu-img convert

convert [--object  OBJECTDEF]  [--image-opts]  [--target-im‐
age-opts] [--target-is-zero] [--bitmaps] [-U] [-C] [-c] [-p]
[-q] [-n] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-O OUTPUT_FMT]
[-B  BACKING_FILE]  [-o  OPTIONS]  [-l  SNAPSHOT_PARAM]  [-S
SPARSE_SIZE] [-r RATE_LIMIT] [-m NUM_COROUTINES] [-W]  FILE‐
NAME [FILENAME2 [...]] OUTPUT_FILENAME

Convert the disk image FILENAME or a snapshot SNAP‐
SHOT_PARAM to disk image OUTPUT_FILENAME using format
OUTPUT_FMT. It can be optionally compressed (-c op‐
tion) or use any format specific options like encryp‐
tion (-o option).

Only the formats qcow and qcow2 support compression.
The compression is read-only. It means that if a com‐
pressed sector is rewritten, then it is rewritten as
uncompressed data.

FILENAMEやSNAP‐SHOT_PARAM指定されたディスクイメージを、
OUTPUT_FILENAMEへ書き出す。OUTPUT_FILENAMEはOUTPUT_FMTに従
い記述する。出力時に、圧縮オプション(-c)や暗号化(-o) が使える。

次のqcow/qcow2フォーマットだけが圧縮を取扱可能。圧縮は読込専用になる。
これは、セクタを圧縮し上書きしたら、次に上書きするときは、通常データが
別の領域に書き込まれることを意味する

Image conversion is also useful to get smaller image
when using a growable format such as qcow: the empty
sectors are detected and suppressed from the destina‐
tion image.

convert による変換器は肥大化したイメージの容量削減に活用できる。
未利用セクタが検出されたら、出力時にカットするのである。

SPARSE_SIZE indicates the consecutive number of bytes
(defaults to 4k) that must contain only zeros for
qemu-img to create a sparse image during conversion.
If SPARSE_SIZE is 0, the source will not be scanned
for unallocated or zero sectors, and the destination
image will always be fully allocated.

SPARSE_SIZE で連続バイトの制限を指定できる。デフォルトは4k。 SPARSE_SIZE=0の場合、qemu-img 変換ででは、変換元ファイルをスキャンせずにゼロセクタの割当のためにスキャンせず、変換後ファイルではしっかり全量割り当てる。

You can use the BACKING_FILE option to force the out‐
put image to be created as a copy on write image of
the specified base image; the BACKING_FILE should
have the same content as the input's base image, how‐
ever the path, image format, etc may differ.
If a relative path name is given, the backing file is
looked up relative to the directory containing OUT‐
PUT_FILENAME.

BACKING_FILEを利用もできる。この指定でCoW(Copy on Write)を強制したイメージファイルを作成できる。BACKING_FILEは変換に使うファイルで同じ内容である必要がある。ただしパス・フォーマット(qcow2)などは異なってもいい。 BACKING_FILEに相対パス渡しの際は backing-fileはOUT‐PUT_FILENAMEのディレクトリ名からの相対パスとして扱われる。

If the -n option is specified, the target volume cre‐
ation will be skipped. This is useful for formats
such as rbd if the target volume has already been
created with site specific options that cannot be
supplied through qemu-img

-nオプションを明示なら、変換先のファイル(パス)作成はスキップされる。

このオプションでrbdフォーマットのように、変換先ファイルがすでに存在していてqemu-imgにパスをしかたなく渡さざるを得ないときなどに役立つ。

Out of order writes can be enabled with -W to improve
performance. This is only recommended for preallo‐
cated devices like host devices or other raw block
devices. Out of order write does not work in combina‐
tion with creating compressed images.

NUM_COROUTINES specifies how many coroutines work in
parallel during the convert process (defaults to 8).

NUM_COROUTINES でco-routines の本数を指定して並列化をする、デフォルト=8

qemu-img rebase

rebase [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename

Changes the backing file of an image.
Only the formats "qcow2" and "qed" support changing the backing file.
The backing file is changed to backing_file and (if the image format of
filename supports this) the backing file format is changed to backing_fmt.

There are two different modes in which "rebase" can operate:

backing file(ベースイメージ)の変更、qed/qcow2だけがこのbacking-fileをサポート。 backing fileは backing-fileに変変更されbacking_fmtに変更されます。(ファイル名がフォーマットを指定している時)

rebaseコマンドでは、次の2つのモードの操作が可能です。

Safe mode

This is the default mode and performs a real rebase operation.
The new backing file may differ from the old one and qemu-img
rebase will take care of keeping the guest-visible content of
filename unchanged.
In order to achieve this, any clusters that differ between
backing_file and the old backing file of filename are merged
into filename before actually changing the backing file.

Unsafe mode

qemu-img uses the unsafe mode if "-u" is specified.
In this mode, only the backing file name and format of filename
is changed without any checks on the file contents. The user
must take care of specifying the correct new backing file,
or the guest-visible content of the image will be corrupted.
This mode is useful for renaming or moving the backing
file to somewhere else. It can be used without an accessible
old backing file, i.e. you can use it to fix an image whose
backing file has already been moved/renamed.

セーフモード

デフォルト動作で、通常のリベースを処理します。
作成されるbacking file は元のファイルのqemu-imgリベースと違い、
仮想VM上からみたファイル名に変化がなきよう配慮されます。

この実現のため、backing_fileからの差分をもつ
すべてのイメージとbacking file のファイル名はマージされてから、
Backing file処理が走ります

Note that the safe mode is an expensive operation,
comparable to converting an image.
It only works if the old backing file still exists.

注意 セーフモードは負荷の大きい処理です。
比較、変換の処理でイメージファイルが高コストです。
また、もととなるbacking fileが現存してるときに動作可能です。

アンセーフモード

-u オプションを明示した時たとき、アンセーフモードで起動します。
backing file の名前とファイル名からフォーマットが変更されます。
このときファイルの中身などのチェックなしに処理されます。
利用者が、ファイル名について注意を払う必要があります。
このモードは名前変更(rename)をするときにとても重宝します。
また旧ファイルはすでに存在しなくなっていても動作します。
たとえば、すでに移動済みのbacking fileを参照するように参照を変更する時です。

qemu-img で使えるフォーマット

qcow2  
  QEMU  image  format, the most versatile format. Use it to  
  have smaller images (useful if your filesystem  does  not  
  supports holes, for example on Windows), optional AES en‐  
  cryption, zlib based compression and support of  multiple  
  VM snapshots.  

Supported options:

compat
:  Determines  the  qcow2 version to use. like compat=0.10

backing_file
: File name of a base image (see create subcommand)

backing_fmt
: Image format of the base image

encryption
: If  this  option  is  set  to on, the image is en‐crypted with 128-bit AES-CBC.

cluster_size
: Changes the qcow2 cluster size  (must  be  between512 and 2M).

preallocation
: Preallocation mode (allowed values: off, metadata,falloc, full).

lazy_refcounts
:   If this option is set to on, reference  count  updates  are  postponed  with  the   of avoiding metadata I/O and improving  performance.

nocow
:   If  this option is set to on, it will turn off COWof the file. 
:   It's only valid on btrfs,no  effect on other file systems.
:   #### btrfs poor permance
:   Btrfs  has low performance when hosting a VM image file, even more when the guest on the VM using btrfs as file system, also. Turning off COW is a way to mitigate this bad performance. Generally  there are two ways to turn off COW on btrfs:
````

qcow2 をqemu-img で スナップショットを取り扱う

qemu-img で スナップショットを取り扱う

Snapshot を使って仮想マシンを管理したいなと。

snapshot / qcow2

仮想マシンの状態保存する機能。

kvm + qemu / qcow2 で使える。qcow2 を使う場合に使える。

qcow2 のストレージでサポートされていて、qcow-img で管理する。

今回は、libvirtqemu 自体のスナップショット関連機能は言及しない。

qcow2 / qcow-img に絞り仮想マシンのスナップショットを管理する方法を記載する。

qcow2 機能 cow とスナップショット

qcow の cow は copy on write の略称である。copy on write は、書き込み時にコピーし新領域に書き込む。つまり、古いデータを残せるってことよ。だからスナップショットを作れる。btrfs はFS自体に同じ機能を持ってるので、qcow2 をbtrfs 上につくる、qcow2 内部をbtrfs にすると無駄処理が増えてパフォーマンスは劣化する。(といっても現代はnvme ssd 数Gbps とかだし気にならない・・・はず)

qcow2 スナップショットの使い方

スナップショットは、qcow2 のファイル内部に保存される。

スナップショット一覧 -l

qemu-img snapshot -l name.qcow2

スナップショット作成 -c

名前を指定して作成

qemu-img snapshot -c 1.0.0 name.qcow2
qemu-img snapshot -c base name.qcow2

スナップショット選択 -a

apply / 名前を指定してそのバージョンのスナップショットを使う。

qemu-img snapshot -a testing name.qcow2

name.qcow2は スナップショット取得時に巻き戻される。

スナップショット削除 -d

名前を指定して削除

qemu-img snapshot -d 1.0.1 name.qcow

スナップショットからスナップショットを作成

スナップショットからスナップショットを起動するとは

  1. スナップショットの状態に戻す
  2. 戻した状態で起動する
  3. 別のスナップショットとして保存する。

ただし、スナップショットは単体でスナップショットであり、qcow2ファイルに親子関係は存在しない。単にスナップショットが増えるだけである。 スナップショットが複数ある状態になる。親子関係は名前を使い、自分で管理する。

スナップショットからスナップショットを作る(流れ)

わりやすさのため名前を番号にした。

スナップショットからスナップショットを作成する場合

qcow2 -> 1.0.0 -> 1.0.1 -> 1.0.2
               └─ 2.0.0 -> 2.0.1

いったん、スナップショットを適用して作るといい

1.0.0 -> 1.0.1 -> 1.0.2 と順番に保存する時

qemu-img -c 1.0.0 name.qcow2
do something
qemu-img -c 1.0.1 name.qcow2
do something
qemu-img -c 1.0.2 name.qcow2

現在状態を捨てて 1.0.0 -> 2.0.1 と一旦戻して作る時

qemu-img -a 1.0.0 name.qcow2
do something
qemu-img -c 2.0.0 name.qcow2

一旦スナップショットの状態に戻して起動、なんか作業をして、新しいスナップショットとして保存する。これが一連の流れになる。

スナップショットを単一ファイルにする

convert を使う

qemu-img -a 1.0.0 name.qcow2
qemu-img convert name.qcow2 -O qcow2 name-1.0.0.qcow2

スナップショットを単一のqcow2 ファイルとして取り出すことができる。コピーして取り出すことができる。

qcow2 スナップショットの制限

qcow2 のスナップショットは、 qemu-img で管理する。

qemu-img が qcow2 のストレージを直接扱うため、qcow2 に安全に書き込める必要がある。

つまり、qcow2 snapshotにはシャットダウンが必要である。

実験してみる

使い方がわかったので、ちょっと実験してみよう

仮想マシンの準備

virt-install とpreseedでサクッとインストールしておく

virt-install \
 --connect=qemu:///system \
 --graphics none \
 --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/ \
 --extra-args="console=ttyS0"
 --ram 4096 \
 --vcpus 8 \
 --virt-type kvm \
 --os-type linux \
 --os-variant debian10 \
 --name d01-manual \
 --disk path=/var/lib/libvirt/images/d01.qcow2 \

インストールの自動化の細かいやり方は、別記事に書いた

vm の開始と接続

vm を開始し接続する

$ sudo virsh start d02
$ sudo virsh console d02

Debian GNU/Linux 10 d02 ttyS0

d02 login: takuya

takuya@d02:~$ ls -lt
total 0

そして、なにか作業(アップデートなど)をする

vm の強制終了

sudo virsh destroy d02

作業終了したら、シャットダウンする。

スナップショットを作る

必ず、停止してから行う。

$ sudo qemu-img snapshot -c 1.0.0 /var/lib/libvirt/images/d02.qcow2
$ sudo qemu-img snapshot -c 1.1.0 /var/lib/libvirt/images/d02.qcow2

スナップショットを作ったのを確認

$ sudo qemu-img snapshot -l /var/lib/libvirt/images/d02.qcow2
Snapshot list:
ID        TAG               VM SIZE                DATE     VM CLOCK     ICOUNT
1         1.0.0                 0 B 2022-04-21 14:50:34 00:00:00.000          0
2         1.1.0                 0 B 2022-04-21 14:51:00 00:00:00.000          0

スナップショットに入る。

スナップショットの状態で起動する

sudo qemu-img snapshot -a 1.1.0 /var/lib/libvirt/images/d02.qcow2
sudo virsh start d02

起動したら、スナップショット状態がわかるようにファイルを書いておく。

$ sudo virsh consle d02
Debian GNU/Linux 10 d02 ttyS0

d02 login: takuya
Password:
Linux d02 4.19.0-20-amd64 #1 SMP Debian 4.19.235-1 (2022-03-17) x86_64

takuya@d02:~$ ls -alt
takuya@d02:~$ touch snapshot-1.1.0
takuya@d02:~$ sudo shutdown -h now 

再起動してもデータが残ることを確認

$ sudo virsh start d02
$ sudo virsh consle d02

d02 login: takuya
Password:
Last login: Fri Apr 22 15:18:41 JST 2022 on ttyS0

takuya@d02:~$ ls -l
total 0
-rw-r--r-- 1 takuya takuya 0 Apr 22 15:19 snapshot-1.1.0

スナップショットを切り替える

スナップショットを切り替えると、データが消えることを確認

sudo qemu-img snapshot -a 1.1.0 /var/lib/libvirt/images/d02.qcow2
sudo virsh start d02
d02 login: takuya
Password:
Last login: Fri Apr 22 15:18:41 JST 2022 on ttyS0

takuya@d02:~$ ls -l
total 0
takuya@d02:~$ ls -l

snapshotは特定の状態に戻す機能

次のように、Aから Aダッシュまで、複数個のスナップショットを作っていたとして

A → A'→ A''→  A'''

A' を消したら A'' が辿れなくなるというわけでない

Aから派生したA'で、A' から派生したA''だとしても、スナップショットは仮想マシンのその時の状態を保存するものである。

したがってA''は単体スナップショットである。

A→A'の差分を保存しているわけではない。A'の状態を保存しているのである。なのでqcow2スナップショットに親子関係はなく、親子関係は利用者が覚えている限りである。

と考えるのが正しかろう

SnapShot で取り出し

スナップショットを適用する次のコマンド は 1.1.0 の状態に「復元」している

sudo qemu-img snapshot -a 1.1.0 /var/lib/libvirt/images/d02.qcow2

ファイルシステム状態は、その時の状態にきれいに戻る。

snapshots [ A,  A'',  C, B, A'] 
                ↑
                qcow2

スナップショット同士には、相互に順番がない。スナップショットは、順不同でグチャッとqcow2保存されていると考えたらイメージしやすいと思う。あの時のあの状態で保存、名前をつけた時の状態へ戻す。っていう感じです。

スナップショットを取り出したあと、起動したら、起動時の状態はスナップショットより進んだ状態になる。

A → A'→ A''→ A''' のように順番にならんだ差分を取りたいときはSnapShotではなく、backing-file-chainとうqcow-imgの別の機能を使うことになる。backing-file機能がDocker仮想マシンのレイヤにt近い。snapshotはbacking-fileとは全く違う。スナップショットはwindowsMacの「復元」と同じ機能ですよね。

snapshot の名前の付け方

takuya@:~$ sudo sudo qemu-img snapshot -l /var/lib/libvirt/images/d02.qcow2
Snapshot list:
ID        TAG               VM SIZE                DATE     VM CLOCK     ICOUNT
1         1.0.0                 0 B 2022-04-21 14:50:34 00:00:00.000          0
2         1.1.0                 0 B 2022-04-21 14:51:00 00:00:00.000          0
3         1.1.0                 0 B 2022-04-22 16:01:42 00:00:00.000          0

スナップショットに指定するのは、名前ではなくタグです。

一見すると名前のように見えるし、名前のように使えます。ですが実際はタグです。

同じ名前で複数個作ることできます。同名のものはIDで識別されます。

同じ名前(タグ)で複数個作ることができるので、ある意味便利ですがある意味で不便です。

スナップショットIDを指定した、取り出し

特定のスナップショット状態を、一つのqcow2 ファイルとして取り出すことができる。

sudo qemu-img convert -l snapshot.id=3 name.qcow2 -f qcow2 -O qcow2 id-3.qcow2

snapshot.id を指定すれば、特定のスナップショットを確実に取り出すことができる

raw でほしいときは、raw を指定する(またはフォーマット指定省略)

sudo qemu-img convert -l snapshot.id=3 name.qcow2 -O raw id-3.qcow2
sudo qemu-img convert -l snapshot.id=3 name.qcow2 id-3.qcow2 # 省略時はraw

convertでタグだけを指定したときは、一番若いIDが採用されるようです。

次の状態のスナップショットがある時

takuya@:~$ sudo sudo qemu-img snapshot -l name.qcow2
Snapshot list:
ID        TAG               VM SIZE                DATE     VM CLOCK     ICOUNT
1         1.0.0                 0 B 2022-04-21 14:50:34 00:00:00.000          0
2         1.1.0                 0 B 2022-04-21 14:51:00 00:00:00.000          0
3         1.1.0                 0 B 2022-04-22 16:01:42 00:00:00.000          0

convert で取り出してみると、id=3 , id=2 が候補になるが

### ID=2 が採用される
sudo qemu-img convert -l 1.1.0 name.qcow2 id-3.qcow2

取り出されたのは、 id=2 でした。

convert でスナップショットを指定するとき、次の形式のようです。

man の記載より抜粋。

SNAPSHOT_PARAM is param used for internal snapshot, format is 'snapshot.id=[ID],snapshot.name=[NAME]' or '[ID_OR_NAME]'.

manを見た感じだと、'[ID_OR_NAME]' と記載されているので、最初にヒットしたものが取り出されるって感じですね。

まとめ

qemu-img コマンドでスナップショットを取り扱える。

スナップショットは qcow2 で扱える

qemu-img でqcow2を任意の状態に保存できるし、巻き戻しできる

保存した状態を、別のファイルにすることができる。

差分だけを保存するわけではない。

docker のように差分差分を作るのは backing file という別の機能

libvirt など仮想マシン管理ソフトは、kvm/qemu ゲストに対しqemu-img の機能を呼び出している

スナップショットはIDが自動採番されている。

スナップショットには名前をつける(被ってもいい)

被った名前は、IDで識別される(同名の旧バージョンみたいな感じ)

ただし、スナップショットを扱うときは、仮想マシンを停止する必要がある。

参考資料

man qemu-img

dWifi にPC/Macで接続する(0001docomo)

0001docomo は dWifi になりました。

d Wifi の接続方法 メールアドレス-dwifi@docomo

0001docomo は 802.x 認証で運用されています。接続時には専用にID/PWを利用するようになり、ドコモIDを持っていれば使えるようになった。

ユーザーアカウントが次の場合

example@domain.tld

接続するIDは次のようになります。

example@domain.tld-dwifi@docomo

アカウントの発行

アカウントは「ドコモID」があれば誰でも使えるようになります。

ただし、ドコモIDはSMS認証や本人確認を済ませたIDに限られます(MyDocomoが利用可能なもの)

ユーザーアカウントは、ドコモIDになります。ドコモIDでログイン時に指定するIDを使います。メールアドレスやユーザー名です。

dWifi パスワード登録

myDocomo から dWifi の専用ページを開いてパスワード事前登録が必要です。ドコモIDのパスワードとは別管理になります。

適当に自動生成しておきましょう。ただし、7文字制限・記号制限があるので注意しましょう。

7文字制限

記号制限

証明書関連

m-zone (昔の dwifi の呼び方)の証明書を使っています。証明書をインストールしておけば次回から検証で安全に利用できます。

0001docomo はめちゃくちゃ安全

ときどき、公衆無線LANは「盗聴される」とか「ウイルス感染」するとかアホなことをいって「オバケが出るぞ」てきに怖がらせてる方がいます。そのような似非セキュリティ対策を声高に叫ぶ人がいます。しかし、公衆無線LAN、特にキャリアWifiは安全です。次の2つの理由で 0001docomoは安全です。

理由1:ユーザー毎に異なるパスワード

0001docomo はユーザー毎に異なるパスワードを利用した80.2.X認証です。盗聴は不可能です。

理由2:HTTPS通信

現在では、インターネット通信は、HTTPSで暗号化され、盗聴が不可能です。

iOS/Android を始めアプリケーションの通信は暗号化しないと審査を通せません。

これらの理由から通信はすべて暗号化され盗聴が不可能になっています。「オバケが出るぞ」といつまでも古いセキュリティを騙る人は解雇していいレベルです。

その他の安全な理由

  • 802.x 認証なのでなりすましが、とくにSSIDは不可能です。
  • m-zone 証明書を使うため、APなりすまし(SSIDなりすまし)が検出可能です。
  • 0001docomo は安全なWifi暗号方式を使っています。
  • 0001docomo は携帯から接続する場合SIMカード認証を利用します。
  • 0001docomo PCから接続の場合、ユーザー毎パスワードを設定しそれは変更可能です。

これらの理由から、公衆無線LANで一番安全だといえます。

0001docomoが使いやすい理由

0001docomoは、とても配慮されたWifiです。

混線してつながらないことも少なく、認証も速く、速度も十分です。

公衆無線LANにありがちな「つながらない」「遅い」「認証画面がめんどくさい」という問題に遭遇することは珍しいと思います。

都心部の地下鉄駅や乗降客数が多い駅改札でも人通りが非常に多い場所は輻輳Wifiストーム)で接続が困難になると思いますが、通常であれば、問題なく繋がります。

携帯キャリアWiFiは安全に利用できます

携帯キャリアのWiFiは誰でも安全に利用できます。ぜひ活用しましょう。

使わないと7-spotのように、撤去されてしまいます。日頃から使っておきましょう。

災害時や緊急時を考えて、日頃から公衆無線LANを使っておくことは非常に重要です。

マクドナルドなどファミレス・ファーストフードに行った時に使っておけばいいのです。

Windowsを英語表記にして使う

Windowsを英語表現にして使う

Windowsの設定から、言語を選んで、英語にするだけです。

追加と変更

Windowsの表示言語に追加で英語を追加、優先度を変更します。 優先度の変更で、アプリ側の言語の優先度が切り替わります。

DragDropで変更します。

Windows自体は、表示言語(Display Language)でやります。

時刻表現とカレンダー

時刻表記は、英語にしていても「令和」すら選べます。

このあたり海外在住で現地表記に合わせつつも現地語は話せない話者、利用者想定でしょうね。

言語設定は「ユーザ毎」

  • 元々が日本語のWindowsに英語を追加した場合
  • 英語のWindowsに日本語を追加した場合

これらの動作はちょっとだけ異なるので注意が必要

日本語Windowsに英語を追加した場合、起動時のメニューやスタートアップ修復は日本語である。 これは、設定言語が「ユーザー」ごとの設定になっていことに起因する。なので、日本語Windowsに、新規でユーザを作れば日本語になる。

日本語Windowsを英語表示にした場合の各種アプリ

英語表記にした場合の各種アプリの表記を見ておきます。

cmd.exe

表記に揺れが出る。(タイトルバーと本文)

Windowsが英語表示なので、タイトルバーが「 \ バックスラッシュ」
元が日本語Windowsなので、初期表示が日本語フォント。なので本文は「円マーク」

面白いといえば面白いです。円マークとバックスラッシュは同じ文字コードですからね。

cmd.exeの表示フォントを変えれば統一されます。(またはWindows UIの表示でタイトルフォントを変更)

powershell.exe

cmd.exeと同じです。

explorer.exe

regedit

cpl

context menu

MS Officeは、英語化前に入れたので、コンテキストメニューが「日本語版」になっているようです。

VLCは、英語化後に<日本語版>を入れたので、コンテキストメニューが「日本語版」になっているようです。

コンテキストメニューは、Windows全体接待のPrefered Languageにある程度従うようです。(アプリが多言語対応している場合)

多言語対応してない、日本語版いれたらその言語が真っ先に使われるようです(下のChromeの例)

google chrome

多言語版でなく、「日本語版」を入れているので、設定が英語でも日本語が使われています。

ウェブサイト

ウェブサイトの表示言語は、HTTP通信時に決まります。

そのため、設定はWindows側でなく、ブラウザ側で行うのが通例です。

Google Chromeで英語を優先言語にする例。

結論

アプリごとの対応言語と、インストール時期(言語変更前後)でメニュー表示は英語と日本語で変わります。

っていうか、アプリが多言語対応で作られていたら特に問題なく切り替わります。

Windows自体の表記は「ユーザ毎」に変化させられます。

日本語に飽きたら新しい刺激を求めて英語にしてみるのも一興でしょう。

メリット・デメリット

英語にすると統一感がでるのと、妙な日本語訳に遭遇しないので嬉しい。あとフォント表示がきれいになる気がする。もともと英語でデザインされているためだろうか、ボタンなどのメニューに統一感が出る。

デメリットとしては、英語はメニュー表記がひたすら長い。 「開く」「Open」の違いですからね。倍ほど違う。

キーボード

キーボードについては、茨の道なので、特に触っていません。日本語キーボードなら日本語を選んでおけばいいと思います。

108 キー(日本語キーボード)を102キーボード(英語キーボード)として認識を歪めたいときは、過去エントリを参照してください。

takuya-1st.hatenablog.jp

2022-04-22

いくつか追記。ポエムも追記

virt-install で preseed を使い無人インストール方法、さらにUEFIを使ったインストールも。

この記事では、以下の3つの方法を紹介します。

vitt-install で debian on kvm+qemu on uefi をやりたい。

  1. virt-install で仮想マシインストールをターミナルから起動
  2. preseed で すべて自動インストール
  3. ueif でインストール

1. virt-install のインストールについて

virt-install でシリアルコンソールを使って、SSH経由でターミナルからインストールできる方法を確認する。

2. preseed で すべて自動インストール

上記の手法に加えて、PreSeedで更に自動化をする。インストールはSSH経由で行えるので、細かい設定を自動化する。

3. ueif でインストール

上記の手法に加えて、UEFIを使ってブートを変えてインストールする方法を確認する。

準備

kvm / qemu / libvirt の準備

sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virtinst libvirt-daemon dnsmasq-base ovmf 

UEFIファームウェアの準備

sudo apt install ovmf

仮想マシンの作成(virt-install)

virt-install仮想マシンをインストールする。

ただし、コンソールから行う。

コンソール利用条件

コンソールインストールは、インストラーをttyS0起動する必要がある。
→ そのためには、カーネルにオプションを引き渡す。
→ そのために、カーネル直接起動が必要である。
→ そのために、HTTP経由でインストラーを直接取得する。
→ そのために、--locationを利用する。

カーネル起動/ location の例

virt-install  \
 --location=http://exapple.com/debian/dists/buster/main/installer-amd64/ 

installer はdebian ミラーをみてURLを参照する。

今回は、preseedで完全に自動化したいので、locationを利用した。手作業でカーネルオプションを書き換えるのであればISOから起動しても構わない。

virt-install でインストール

location が決まったら、インストールを開始します。

ディスクを作成

qcow2 で作成しSparseファイルにする。

sparse とは「固定量を確保しない、使ったぶんだけ実容量を消費する」スタイル。

sudo qemu-img create -f qcow2 /var/lib/libvirt/images/d02.qcow2 8G
ディスクのチェック

仮想マシン用のディスクが作成できたのでチェックする。

sudo qemu-img info /var/lib/libvirt/images/d02.qcow2 
apt インストールチェック

BISO(MBR)で仮想マシンを作成し。apt で一式が揃えられたことを確認する

インストールが成功し、コマンドが間違ってないことを確認。EFIBIOSインストールを編集して行うので、まずはMBRでインストールする。

virt-install \
 --connect=qemu:///system \
 --graphics none \
 --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/ \
 --extra-args="console=ttyS0"
 --ram 4096 \
 --vcpus 8 \
 --virt-type kvm \
 --os-type linux \
 --os-variant debian10 \
 --name d01-manual \
 --disk path=/var/lib/libvirt/images/d01.qcow2 \
ttyS0 / シリアルコンソールのインストール

シリアルコンソールのインストールは、次の3つをつければオッケみたいです。

 --graphics none \
 --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/ \
 --extra-args="console=ttyS0"
インストのやり直する方法

インストをやり直すとき、仮想マシンと、仮想ディスクを削除する。

コマンドから操作する。仮想マシンを削除・ディスク削除・ディスク作成

### 削除して
sudo virsh  destroy  d01
sudo virsh  undefine d02 --nvram
sudo rm /var/lib/libvirt/images/d02.qcow2
## 作り直す
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/d02.qcow2 8G
virt-install --connect ...

失敗したら削除して、即時に再インスト。

ueif でインストールする

UEFIでインストールするには、ovmf を使う。

UEFIファームウェアの準備

sudo apt install ovmf

uefi でインストール

--boot uefi

これで、UEFIのインストールができる。

preseed の自動インストール

preseed.cfg を使って自動インストールする。

preseed を使って設定を済ませてしまう。

これで無人インストールになる。

preseed の 注意

ファイル名 preseed.cfg が固定なので、ファイル名は変えられない。

preseed.cfg は インストールファイルに書かれているので

preseed を使う(MBRでチェック)

preseed ファイルのパスを起動オプションに入れるとできる。

 --initrd-inject=/path/to/preseed.cfg \

Preseedのチェックを行う。ここもまだMBRインストールでチェックしておく。

virt-install \
 --connect=qemu:///system \
 --initrd-inject=/home/takuya/preseed.cfg \
 --name d02 \
 --ram 4096 \
 --disk path=/var/lib/libvirt/images/d02.qcow2 \
 --vcpus 8 \
 --virt-type kvm \
 --os-type linux \
 --os-variant debian10 \
 --graphics none \
 --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/ \
 --extra-args="console=ttyS0"

すべての設定が終わって正しくインストールできる状態にしておいて、UEFIに関するエラーとBIOS/Pressedなど初期設定に関するエラーを切り分けておいた。

preseedは、なぜ使うのかというとEFIパーティションをきっちり作成したいからである。起動して手動インストールだけなら不要かもしれない。

peseed の設定

deiban の公式サイトに、preseedのサンプルが設置されている。

これを改変して、利用することにする。

設定の確認
cat preseed.cfg  | \grep -vE '^#.*$|^$'

私の設定

d-i debian-installer/locale string en
d-i debian-installer/language string en
d-i debian-installer/country string JP
d-i debian-installer/locale string en_US.UTF-8
d-i keyboard-configuration/xkb-keymap select us
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string d01
d-i netcfg/get_domain string .lan
d-i mirror/country string jp
d-i mirror/http/hostname string debian-mirror.sakura.ne.jp
d-i mirror/http/directory string /debian/
d-i mirror/http/proxy string
d-i passwd/root-login boolean false
d-i passwd/make-user boolean true
d-i passwd/user-fullname string takuya
d-i passwd/username string takuya
d-i passwd/user-password-crypted password $5$J2NR$xxxxxxxxxxxxxxx
d-i clock-setup/utc boolean true
d-i time/zone string Asia/Tokyo
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string ntp.nict.jp
d-i partman-auto/method string lvm
d-i partman-auto-lvm/guided_size string max
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i base-installer/install-recommends boolean false
d-i apt-setup/cdrom/set-first boolean true
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true
tasksel tasksel/first multiselect ssh-server
popularity-contest popularity-contest/participate boolean false
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean false
d-i grub-installer/bootdev  string default
d-i finish-install/reboot_in_progress note

preseedでユーザを作成しておく

preseedでユーザとパスワードを初期設定ができる。

パスワードの作り方

次のようなパスワード $1$nByvFzd5$MXmZlDPk8xchbyQfW9qfm1 を生成する。

いくつか方法がある。

mkpasswd -s -m md5
openssl passwd -1 -salt $( openssl rand -base64 3  | tr '+/' 'Ab')
openssl passwd -5 -salt $( openssl rand -base64 3  | tr '+/' 'Ab')

uefiEFI を使う。セキュアブート問題

UEFIで起動するのには、MBRのインストールのコマンドに、次を追加する。

--boot uefi 

理想論であれば上記だけで済むはず。

しかし、boot uefi だけのすると、セキュアブートが有効になってしまい、いい感じに起動しないことがある。(後述)

そのため、次にのようにOVMFを指定する。

--boot uefi,loader=/usr/share/OVMF/OVMF_CODE_4M.fd,loader_ro=yes,loader_type=pflash,nvram_template=/usr/share/OVMF/OVMF_VARS_4M.fd,loader_secure=no  --connect=qemu:///system  --initrd-inject=/home/takuya/preseed.cfg  --name d02  --ram 4096  --disk path=/var/lib/libvirt/images/d02.qcow2  --vcpus 8  --virt-type kvm  --os-type linux  --os-variant debian10  --graphics none  --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/  --extra-args="console=ttyS0" 

これを考慮すると、次のようになった。

preseed+uefi+netinstall+console の完成ワンライな~

virt-install \
--boot uefi,loader=/usr/share/OVMF/OVMF_CODE_4M.fd,loader_ro=yes,loader_type=pflash,nvram_template=/usr/share/OVMF/OVMF_VARS_4M.fd,loader_secure=no \
--connect=qemu:///system  \
--initrd-inject=/home/takuya/preseed.cfg  \
--name d02  \
--ram 4096  \
--disk path=/var/lib/libvirt/images/d02.qcow2  \
--vcpus 8  \
--virt-type kvm  \
--os-type linux  \
--os-variant debian10  \
--graphics none  \
--location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/  \
--extra-args="console=ttyS0"

uefi / EFI を使う場合

--boot uefi のオプションをつければいい。

virt-install --boot uefi \

uefi をつけた場合 undefine (削除)のコマンドが変わる。

virsh --connect=qemu:///system undefine d02   --nvram

起動エラー対応 uefi セキュアブート問題

先日にこれらを試したとき、つぎのように、OVMFをnosecure にして、code ms を使わない指定に変えた。virt-install でpreseedを組み合わせた時、ovmf 4mを使わないと動かなかった。

preseedでディスクレイアウト詳細変更、インストール後に uefi のセレクトをコールすればいいんだろうけど、今回は見送った

--boot uefi,loader=/usr/share/OVMF/OVMF_CODE_4M.fd,loader_ro=yes,loader_type=pflash,nvram_template=/usr/share/OVMF/OVMF_VARS_4M.fd,loader_secure=no 

https://sven.stormbind.net/blog/posts/deb_uefi_pxe_install_hpe_dl120/

preseed インストールEFI対応

EFI起動して、画面を見ながら自動自動と選んでいけばEFIになるのだが、preseedで同じように、自動を選択したはずだが、GPT/EFIにならなかった。

GPTにはなるが、/boot と /boot/efi が作られなかった。

そこで、preseedを変えて、明示的にEFIパーティションを作るようにした。

d-i partman/mount_style select uuid
d-i partman/choose_label string gpt
d-i partman/default_label string gpt
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select gpt-boot-root-swap
d-i partman-auto/expert_recipe string         \
   gpt-boot-root-swap ::                      \
      1 1 1 free                              \
         $bios_boot{ }                        \
         method{ biosgrub } .                 \
      200 200 200 fat32                       \
         $primary{ }                          \
         method{ efi } format{ } .            \
      512 512 512 ext2                        \
         $primary{ } $bootable{ }             \
         method{ format } format{ }           \
         use_filesystem{ } filesystem{ ext2 } \
         mountpoint{ /boot } .                \
      1000 20000 -1 ext4                      \
         $primary{ }                          \
         method{ format } format{ }           \
         use_filesystem{ } filesystem{ ext4 } \
         mountpoint{ / } .
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-basicfilesystems/no_swap boolean false
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/device_remove_lvm boolean true

インストールにかかった時間

preseed / ueif / virt-install 自動化した結果、カップ麺時間で仮想マシンを準備することができた。

real 3m41.697s
user    0m2.782s
sys     0m1.35s

2022-04-23 追記

preseed のディスクレイアウトを、自動設定にしてLVMで設定をやめたら難なく起動した

virt-install \
 --boot uefi \
 --connect=qemu:///system  \
 --initrd-inject=/home/takuya/preseed.cfg  \
 --name d03  \
 --ram 8912  \
 --disk path=/var/lib/libvirt/images/d03.qcow2  \
 --vcpus 8  \
 --virt-type kvm  \
 --os-type linux  \
 --os-variant debian10  \
 --graphics none  \
 --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/  \
 --extra-args="console=ttyS0"

preseed.cfg

## locales
d-i debian-installer/locale string en
d-i debian-installer/language string en
d-i debian-installer/country string JP
d-i debian-installer/locale string en_US.UTF-8
d-i keyboard-configuration/xkb-keymap select us
## network
d-i netcfg/dhcpv6_timeout string 1
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string d01
d-i netcfg/get_domain string .lan
## apt mirror
d-i mirror/country string jp
d-i mirror/http/hostname string debian-mirror.sakura.ne.jp
d-i mirror/http/directory string /debian/
d-i mirror/http/proxy string
### user
d-i passwd/root-login boolean false
d-i passwd/make-user boolean true
d-i passwd/user-fullname string takuya
d-i passwd/username string takuya
d-i passwd/user-password-crypted password $5$RFWZ$aaaaaaaaaa
## timezone
d-i clock-setup/utc boolean true
d-i time/zone string Asia/Tokyo
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string ntp.nict.jp
## partition
d-i partman-auto/method string regular
d-i partman-efi/non_efi_system boolean false
d-i partman-auto/choose_recipe select atomic
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/choose_partition select Finish partitioning and write changes to disk

### apt / package
tasksel tasksel/first multiselect
popularity-contest popularity-contest/participate boolean false
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean false
d-i grub-installer/bootdev  string default
d-i finish-install/reboot_in_progress note

2022-04-26 debianuefi / preseed / lvm で virt-install

-boot uefi つければ動くはず qemu+kvm をpreseed で UEFI + lvm インストール

オプションを見直して、preseedインストールがLVMでも動くようになったので追記。

virt-install コマンド

virt-install\
 --boot uefi \
 --connect=qemu:///system  \
 --initrd-inject=/home/takuya/preseed.cfg  \
 --name d03  \
 --ram 4096  \
 --disk path=/var/lib/libvirt/images/d03.qcow2  \
 --vcpus 8  \
 --virt-type kvm  \
 --os-type linux  \
 --os-variant debian10  \
 --graphics none  \
 --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/  \
 --extra-args="console=ttyS0"

preseed.cfg の設定

d-i debian-installer/locale string en
d-i debian-installer/language string en
d-i debian-installer/country string JP
d-i debian-installer/locale string en_US.UTF-8
d-i keyboard-configuration/xkb-keymap select us

d-i netcfg/dhcpv6_timeout string 1
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string d03
d-i netcfg/get_domain string .lan

d-i mirror/country string manual
d-i mirror/http/hostname string debian-mirror.sakura.ne.jp
d-i mirror/http/directory string /debian
#d-i mirror/http/proxy string 
#d-i mirror/http/proxy string http://172.17.0.1:3142

d-i passwd/root-login boolean false
d-i passwd/make-user boolean true
d-i passwd/user-fullname string takuya
d-i passwd/username string takuya
d-i passwd/user-password-crypted password $5$RFWZ$q0cwtZLAY4er92IloQE0RwBbRPdohAeZb7p6gNhhTH5

d-i clock-setup/utc boolean true
d-i time/zone string Asia/Tokyo
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string ntp.nict.jp
### partiion
d-i partman-auto/method string lvm
d-i partman-efi/non_efi_system boolean true
d-i partman-auto-lvm/guided_size string max
d-i partman-auto/choose_recipe select atomic
d-i partman-lvm/confirm boolean true
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/choose_partition select Finish partitioning and write changes to disk

### tasksel none
tasksel tasksel/first multiselect

### finish
popularity-contest popularity-contest/participate boolean false
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean false
d-i grub-installer/bootdev  string default
d-i finish-install/reboot_in_progress note

インストールの完了

takuya@:~$ sudo qemu-img info /var/lib/libvirt/images/d03.qcow2
image: /var/lib/libvirt/images/d03.qcow2
file format: qcow2
virtual size: 8 GiB (8589934592 bytes)
disk size: 1.4 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    extended l2: false
takuya@:~$

過去資料

- ubuntu で kvm qemu インストール - それマグで!