それマグで!

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

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

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 インストール - それマグで!

systemdのタイマーの実行予定・実行済を一覧表示する

systemd のタイマーの実行予定を俯瞰したい

crontab と違って systemdは個別ファイルに実行予定を記載するため、全体の予定がわからない。

それを一覧で俯瞰したいなと思ったときどうするのか

list-timersを使う

sudo systemctl list-timers --all

list-timersコマンドで、次回実行予定の一覧が閲覧できて便利である。

できればクリックしたいレベル。

実行サンプル

takuya@livaz:~$ sudo systemctl list-timers --all
NEXT                        LEFT          LAST                        PASSED        UNIT                         ACTIVATES
Tue 2022-04-19 14:23:22 JST 57min left    Tue 2022-04-19 08:02:50 JST 5h 23min ago  ua-timer.timer               ua-timer.service
Tue 2022-04-19 17:02:36 JST 3h 36min left Mon 2022-04-18 17:02:36 JST 20h ago       systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Tue 2022-04-19 18:52:52 JST 5h 26min left Tue 2022-04-19 08:04:55 JST 5h 21min ago  apt-daily.timer              apt-daily.service
Tue 2022-04-19 20:47:29 JST 7h left       Tue 2022-04-19 08:02:54 JST 5h 23min ago  fwupd-refresh.timer          fwupd-refresh.service
Wed 2022-04-20 00:00:00 JST 10h left      Tue 2022-04-19 00:00:06 JST 13h ago       logrotate.timer              logrotate.service
Wed 2022-04-20 00:00:00 JST 10h left      Tue 2022-04-19 00:00:06 JST 13h ago       man-db.timer                 man-db.service
Wed 2022-04-20 05:06:05 JST 15h left      Tue 2022-04-19 13:13:19 JST 12min ago     motd-news.timer              motd-news.service
Wed 2022-04-20 06:38:29 JST 17h left      Tue 2022-04-19 06:23:57 JST 7h ago        apt-daily-upgrade.timer      apt-daily-upgrade.service

参考資料

https://wiki.archlinux.org/title/Systemd/Timers

macのライブラリフォルダが見えないので見えるようにする。

ターミナルからコマンドで不可視を変えられる。

sudo chflag nohidden ~/Library
sudo chflag nohidden /Library

ただし、この方法でも ~/Library が見えないことがある。

Finder のオプションを使うのが確実。

nohiddenが動かない理由

sudo chflag nohidden ~/Library で動くはずなのだが、なぜか最新版のmacOSでは無効になっていた。

chflagでできないことが増えたのでmacosには一貫性が無いので本当に怖い。

タイムマシンで書き戻すのに必要

Libary をまるっと書き戻したいときにはFinderでLibaryを選択できないと書き戻せないので本当に勘弁してほしい。

過去記事

フォルダを不可視に設定する。または不可視フォルダLibraryを可視化する。 - それマグで!

三井住友銀行の通帳繰越は非対応のATMがある。(営業時間内に来店と表示された)

ATM通帳記入で窓口へとでた。

三井住友銀行のATMで通帳記入をしたんですよ。

そしたら、「この通帳はお取り扱いできません」って出るんですよね

15:00 までに銀行とか不可能じゃん。通帳繰越だけなんですよねぇ。

ATMを変えたら使えた。なんだそれ。

店舗を変えて違うタイプのATMにすると、通帳繰越ができて、通帳の切り替えができた。

f:id:takuya_1st:20220418142840j:plain

不親切なので、確認を

三井住友銀行は、とても不親切なので、ATMで通帳繰越が発生するときは、窓口へ行く前に、ATMを変えてみるといいと思います。

未だに旧住友銀行や旧さくら銀行のATMが稼働しているので、古いタイプのATMだとSMBCのATMでも通帳繰越ができないです。

とても不親切なので、店舗に行く前に確認を。

私は、店舗に行くと「ATMでできますよ」と言われ、「できへんから来とんやろ」という無駄なイライラを体験しました。問い詰めて、散々待たされて「非対応のATMはあります」と回答を得た。しんどかった。

グレーのATMではできない。白を探す。

旧ATMはだいたいグレーカラーです。新しいATMは白色ですね。

白色のATMなら通帳繰越ができるようです。殆どの場合店舗に併設されたATMですね。

出張所と書かれていると、「できない」と思ったらいいと思います。

WEB通帳は?

WEB通帳は信用していません。

割引があるといってもそのうち無くなるだろう。って言い続けてた。 昨年、本当になくなった。

WEB通帳は視認性も悪く、保管性も悪い。アプリ認証も煩雑。とても不親切なので、使う必要はないと思います。

WEB通帳に未加入でもインターネットから問題なく使えます。

wireguardでSNAT・マスカレードする

wireguard 経由のパケットをいい感じに転送したい。

wiregaurdのパケットをそのままLANに流すと、IPアドレスの経路がなくなって通信できなくなったりするので、Wireguardの出口側にNATを仕掛けてあげる必要がある。

そもそもWireguardはp2pだけを提供するので、その周辺は自分で面倒を見てあげないといけない感じです。 f:id:takuya_1st:20220418141334p:plain

マスカレードの例

WG_NET=172.16.41.0/24
LAN_IF=br0
LAN_NET=192.168.1.0/24
iptables -t nat -I POSTROUTING  -o $LAN_IF -s $WG_NET -d $LAN_NET  -j MASQUERADE

SNATの例

WG_NET=172.16.41.0/24
LAN_IF=br0
LAN_NET=192.168.1.0/24
LAN_IP=192.168.1.1
iptables -t nat -A POSTROUTING -d $LAN_NET  -s $WG_NET -j SNAT --to-source $LAN_IP

シェルスクリプトで変数と文字列を展開(置換)する

変数を文字列に展開するenvsubst

envsubst を使えば、文字列と変数を置換できる。つまり変数を展開できる。

利用サンプル

echo "HELLO \${HELLO}" | HELLO=takuya envsubst

テンプレートを作れる

これを利用すれば、テンプレートを作って文字列を作成するのが大変楽ちんになる。

CSVSQLのような文字列を埋め込むのが楽になるし、

変数を展開する変数を作って再帰的な処理をするのが大変楽になる。

参考資料

https://www.scriptlife.jp/contents/programming/2019/02/11/linxu-command-envsubst/

gRPC を使う

gRPC について

gRPC はリモートからデータ取得、データ変更するRPCの一種

google が作って、http/2 とうまく協調するようにしている

一言でいえば、C構造体をそのままぶん投げるプロトコル

サーバーとクライアントが事前にお互いに構造を知っていれば、JSONみたいに配列にしたり、オブジェクトキーを入れなくていいよね。

乱暴に言えば、sqlite3 で1行転送してるようなもん。お互いテーブル構造を知ってれば問題ないでしょ?みたいな感じ。

準備する

├── proto
│   └── user.proto
├── protos
│   └── user.proto
├── py
│   ├── Pipfile
│   ├── Pipfile.lock
│   ├── client.py
│   ├── server.py
│   ├── user_pb2.py
│   └── user_pb2_grpc.py
└── users.json

python を準備する

PIPENV_VENV_IN_PROJECT=1 pipenv install
pipenv run pip install 
pipenv run pip3 install grpcio grpcio-tools

protoを作る

protoを作る。データベースでいうスキーマC言語でいう構造体。

proto が特徴的なのは、次の3点だと感じた。

  • protoに名前空間がある
  • proto はメソッド定義を含む
  • proto は 自身にprotoを使った参照(再帰)定義ができる

JAVAのクラス定義だとメンバとメソッド雛形が分けづらい

Cの構造体だと名前空間が使えない。

データベースのスキーマだと参照定義ができない

JSONだと冗長になりすぎる

という部分が解消されて使いやすい「データ型の定義」だと感じた。

SQLiteをリモート転送するには便利そうですよね。

server.py

自動生成されたクラスを継承して作る

client.py

自動生成されたクラスを呼び出して使う。

リクエスト実験

サーバー起動

pipenv run python server.py

クライアント側

pipenv run python client.py 1
pipenv run python client.py 2
pipenv run python client.py 3
pipenv run python client.py 10

grpcurl でリクエストを送る

grpcurl -plaintext -import-path ../protos -proto user.proto  -d ' { "id": 1 } ' localhost:1234 UserManager.get
{
  "user": {
    "id": 1,
    "nickname": "admin",
    "mailAddress": "admin@example.com",
    "userType": "ADMINISTRATOR"
  }
}

http2

http2 らしいのでtcpdump でパケットを見てみる。

f:id:takuya_1st:20220418140344p:plain

f:id:takuya_1st:20220418140414p:plain

cURLで叩きたい

HTTP/2 なので、cURLで叩けそうですが。絶対めんどくさい。

バイナリ転送が基本。まるでC構造体のようなProtoのまま転送しているので、中身を見ても仕方ないし、手動でリクエストを送るのも手間である。

どうしてもやりたきゃ、プロキシする必要がありそうです。

っていうか、冗長性を排してバイナリ転送するのがgRPCだし

参考資料

サービス間通信のための新技術「gRPC」入門 | さくらのナレッジ

https://engineering.mercari.com/blog/entry/2019-05-24-120000/

qcow2 のsparse ファイルのサイズをトリム(節約)- reclaim

qcow2 のファイルが肥大化することがある。

使ってないファイルは消え、ディスク容量を浪費しないはず。だが、実際には、一度確保したファイルを削除しても容量が消えない。なので、長期間メンテナンスなしで使ってるとファイルサイズが肥大化してた。なんとか節約してきれいにすることはできないのかな。

reclaim する方法

容量を取り戻すには、ファイルをコピーして作り直せばいい

qemu-img convert -O qcow2 image.qcow2 shrinked_image.qcow2

ついでに圧縮する

圧縮をかけておけば、変わらない部分に関しては容量を節約できるはず。 -c をつけて圧縮

qemu-img convert -c -O qcow2 image.qcow2 shrinked_image.qcow2

2022-09-21 追記

virt-sparsify でも同じことが出来る。virt-sparsifyのほうが時間がかかるが、出来上がりはきれいに容量が減っている。

参考資料

Reclaim empty space from, Shrink disk of qcow2 disk file – note to self

qcow2 のストレージを直接マウントする。(ループバックで接続経由し、losetupで使う。)

qcow2 ディスクイメージをマウントしようと思ったら、loop back で接続すればいいとわかった。

raw であれば、losetup -P -f /path/to/raw.imgでlosetupで手軽に扱えるが、qcow2の場合は、nbdを経由する。

qcow2 のディスクを接続する

コネクトを使う。

sudo modprobe nbd max_part=8
sudo qemu-nbd --connect=/dev/nbd0 /var/lib/libvirt/images/d02.qcow2
sudo fdisk /dev/nbd0 -l
sudo qemu-nbd -d /dev/nbd0 

nbd 機能を使えば、qcow2 をループバック接続できて、フォーマットやインストール、状況を見ることができる。これを使えば通常のストレージのファイルと同じように扱える。

/dev/nbd0 ループバック・マウント後

ループバックさえできれば、あとはmount したり gdisk したりできるよね。

mount /dev/nbd0p2  /mnt

ただし、qcow2 は完全なディスクイメージなので、lvm になってたり、dm-cryptがかかってたりするので、/dev/mapper経由でマウントすることになる可能性が高い。

mount /dev/mapper/xxx-root-vg /mnt

nbd 機能の有効無効の切り替え

Failed to open /dev/nbd0: No such file or directory のようにnbd が存在しないエラーになるときは、カーネル拡張をロードしてやればいい

sudo modprobe nbd max_part=8

使い終わったら アンロードしておけばいい

sudo rmmod nbd

LVMを含むqcow2 のnbd は注意が必要

lvm を含む nbd を扱うと、nbd デバイスをロードした瞬間に lvm が走って、lvm として認識されちゃう。

認識されちゃうと、nbd を切断しても lvm に残ってしまう。

takuya@:~$ sudo qemu-nbd --disconnect /dev/nbd0
/dev/nbd0 disconnected
takuya@:~$ sudo partprobe
Warning: Error fsyncing/closing /dev/mapper/d01--vg-root: 入力/出力エラーです
Warning: Error fsyncing/closing /dev/mapper/d01--vg-swap_1: 入力/出力エラーです
Warning: Error fsyncing/closing /dev/nbd0p1: 入力/出力エラーです
Warning: Error fsyncing/closing /dev/nbd0p2: 入力/出力エラーです
Warning: Error fsyncing/closing /dev/nbd0p3: 入力/出力エラーです

lvm を含むディスクを扱うときは、手作業でLVMから取り外すしか無いです。

認識されちゃったときは手動で、INACTIVEにしておくと無難

vgchange -an  qcow_vg

マウントして調べるときは/boot 型違反だと思うので、ほぼ使わないので、自動化しないでほしいところ

lvm が消えないとき

lvm, が消えない、そのときは、dmsetpup をた試すのもいい。

sudo dmsetup ls 
sudo dmsetup removevg-lv05

dmsetup をしたあとに再度、除去を試す。

sudo qemu-nbd -d /dev/nbd0 
sudo rmmod nbd

これでも駄目なら再起動するしか・・・・

参考資料

https://consolechars.wordpress.com/2015/07/15/how-to-qcow2-files-mount-in-yours-linux-system-with-lvm/

https://bbs.archlinux.org/viewtopic.php?id=264163