それマグで!

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

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

pipenvで環境を整える

pipenv で環境を整える

pipenv でサクッと環境を整える

mkdir tatget
cd target
PIPENV_VENV_IN_PROJECT=1 pipenv install
pipenv run pip install pip --upgrade

PIPENV_VENV_IN_PROJECT=1 変数を使うと、プロジェクトのディレクトリに作られる。変数の名前の通りです( pipenv venv in project)。 project root で実行される。有り体に言えばカレントディレクトリ、正確言うと上位のpipenvを探しに行く。

変数を使わないときは、user homeつまり、ユーザーのホームディレクトリが使われる。

python3を明示的に指定する。

使いたいときに、python3を明示的に指定する。最近はpythonコマンドではなくpython3コマンドかもしれない。

PIPENV_VENV_IN_PROJECT=1 pipenv --python=/usr/bin/python3 install

pipenv の Pipfileにパッケージを登録する

cd target
pipenv run pip install PyP100

pipインストールではなく、pipenv install を使ってインストールする

先程の例だと、次のようになる。

cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
pyp100 = "*"

[dev-packages]

[requires]
python_version = "3.9"

pipenv 自体のインストール

pipenv 自体は、python pip を使って グローバルにインストールしておく。または、apt でインストールしておく

pipの場合

pip install pipenv

apt の場合

apt install python-is-python3
apt install python3-pip
apt install pipenv

過去記事

takuya-1st.hatenablog.jp

rbash で制限付きのシェルを作って安全を確保する

bash で何でもされるのが怖い?なら rbashはどうですか?

rbash は bash の機能の一つで 「機能制限をされたbash」を提供するためのものです。

rbash とは、制限付きのシェル(RESTRICTED SHELL) の略です。

rbash の正体 bash -r

rbash コマンドは /usr/bin/rbash で提供されていて。bash へのエイリアスになっています。

ls -l  /usr/bin/rbash
lrwxrwxrwx 1 root root 4 Jan  6 16:23 /usr/bin/rbash -> bash

rbash で制限付きのシェルを使う

とにかくまずは、rbash を使ってみよう

実験環境の準備

サクッと lxc でubuntuを起動して実験環境を作ります。

NAME=rbash-test
lxc launch ubuntu:22.04 $NAME
lxc exec $NAME  -- adduser takuya
lxc exec $NAME  -- usermod -aG sudo takuya
lxc exec $NAME  -- sudo --login --user  takuya

lxc に通常ログイン(bash)する

ログインの代わりにシェルを起動して代替とします。

通常であれば、bashを起動します。

lxc exec $NAME  --cwd /home/takuya --user $uid --cwd /home/takuya  -- bash

docker で同じようなことをするのであれば、こんな感じですよね。

docker run --rm -it ubuntu bash 

lxc に制限ログインする(rbash)

通常であれば bashを起動するところが rbashになるだけです。

lxc exec $NAME  --cwd /home/takuya --user $uid --cwd /home/takuya  -- rbash

docker で同じようなことをするのであれば、こんな感じですよね。

docker run --rm -it ubuntu -- rbash 

rbash は制限シェル

rbashでLinuxを使ってみます。

lxc exec $NAME  --cwd /home/takuya --user $uid --cwd /home/takuya  -- rbash  --norc

cd やコマンドが制限されています。PATH変数は固定化されています。 /tmp は書き込めるようです。

rbash-5.1$ echo $SHELL
/bin/bash
rbash-5.1$ cd /
rbash: cd: restricted
rbash-5.1$ touch /tmp/a
rbash-5.1$ mkdir .bin
rbash-5.1$ export PATH=$PATH:~/.bin
rbash: PATH: readonly variable

rbash は起動したディレクトリより上のディレクトリには移動できません。

lxc exec $NAME  --cwd /home/takuya --user $uid --cwd /home/takuya/.bin  -- rbash  --norc
rbash-5.1$
rbash-5.1$ pwd
/home/takuya/.bin
rbash-5.1$ cd ..
rbash: cd: restricted
rbash-5.1$

LXCで試しているので少しややこしいですが、rbash をexecするときに cwd=/home/takuya/.bin で起動しています。その中にchroot状態になりますが、chrootではありません。

参照もできるし、ファイルも扱うことができます。

/home/takuya/.bin
rbash-5.1$ cd ..
rbash: cd: restricted
rbash-5.1$ ls /
bin   dev  home  lib32  libx32  mnt  proc  run   snap  sys  usr
boot  etc  lib   lib64  media   opt  root  sbin  srv   tmp  var
rbash-5.1$ echo ~
/home/takuya
rbash-5.1$ touch ~/in-home
rbash-5.1$

rbashの特徴

rbash の制限機能は man に書いてある通りなんだけど

  • PATH環境変数が読み取り専用。
  • フルパス指定でコマンド実行はできない
  • リダイレクトはできない。
  • 制限モードを解除できない

もう少し詳しく書くと、次のとおりです。

  • 環境変数が読み取り専用になっています。
    • PATHはデフォルトで読み取り専用です。
    • リードオンリにする変数は自由に設定可能です。
  • フルパス指定でコマンド実行ができません
    • PATHにあるものは実行できる
    • /bin/bash のような指定はできない。
  • リダイレクトが使えません。
    • パイプは使えるが、リダイレクトはできない
  • 制限モードを解除できません。
    • PATHにbashが含まれない場合に限る

シンプルに表現すれば「PATHに書いたコマンドだけに制限するのがrbash」です。

PATHによる制限が基本機能なので /bin/bashがPATHに含まれていると、制限モードは解除されたbashが起動します。

人によってはrbashでシェルは実行できないと書いてますが、bash /ruby / python などがパスに含まれているとハッキリ何でも出来ちゃいます。

rbash を使うときは PATHにはスクリプトやバイナリを設置して、自由な記述をできるようなインタプリタを設置しないほうがいいと思います。

rbashでの制限の使わせ方

最初にPATHを用意する。PATHを用意して、「使っていいコマンド」を列挙する

rbash の便利な使い方

SSH の authorized_keys に書く。 ログインシェルに指定する

ということです。

ただし、~/.profile や ~/.bashrc が動いていまうと台無しになることがあるので --norc--noprofile を使って起動するほうが無難っぽい

rbash まとめ

このように、rbash は システムの運用者に渡して少し安心できるシェルです。フル機能ではありませんが、だいたいのことはできます 。

ただし、PATHに十分に配慮すること。

コマンドを使わせるだけなら、ssh の authorized_keys でコマンド制限したほうが速いと思います。

システムコーンソールにログインする場合などには有効だと思いますが、シリアルコンソールや直接マシンにアクセスさせるくらいなら、 ssh 経由が安全だし、sshのauthorized_keysに同じような機能があるの出番はあまりないかも難しいかもしれません。

ファイルを扱うときにrbashはいいかもしれません。

シェルスクリプトを実行時にrbash実行したり、スクリプトから呼び出せば、「うっかりミス」を防ぐという意味では大活躍できると思います。

たとえば、次のようにしておけば、、、、少しは安心はできるのかもしれない。。。。

cd ~/.bin 
PATH=~/.bin rbash my-mis-script.sh

rbash の主なオプション

詳しくは man bash (man rbash ではない)を見れば書いてある。

GNU bash, version 5.1.16(1)-release-(x86_64-pc-linux-gnu)
Usage:  rbash [GNU long option] [option] ...
    rbash [GNU long option] [option] script-file ...
GNU long options:
    --debug
    --debugger
    --dump-po-strings
    --dump-strings
    --help
    --init-file
    --login
    --noediting
    --noprofile
    --norc
    --posix
    --pretty-print
    --rcfile
    --restricted
    --verbose
    --version
Shell options:
    -ilrsD or -c command or -O shopt_option     (invocation only)
    -abefhkmnptuvxBCHP or -o option
Type `rbash -c "help set"' for more information about shell options.
Type `rbash -c help' for more information about shell builtin commands.
Use the `bashbug' command to report bugs.

bash home page: <http://www.gnu.org/software/bash>

参考資料

ユーザのUIDを数字だけ取り出す / id

id コマンドでユーザを調べると

$ id takuya
uid=1001(takuya) gid=1001(takuya) groups=1001(takuya),27(sudo)

この結果をついgrep / awk しちゃうが、ちゃんと id コマンドで取れますよ。ってことです。

int の数字だけがほしい

オプションを付けます。

UID (ユーザ番号) をダイレクトに取り出す。

$id -u takuya
1001

GID(グループ番号)を直接取り出す

$id -g takuya
1001

所属するグループIDを全部取り出す

$id -G takuya
1001 27 

何に使うの?

uid わかってどうするの?って思うんだけど、シェルスクリプトを書くときにUIDがわかってるとSUDOやLOGINを扱いやすいし、ファイルの所有者を調べやすいのです。

例えばLXCのコンテナで内部で、コマンドを指定ユーザで実行するとき

$ uid=$(lxc exec $NAME  -- id -u takuya)
$ lxc exec $NAME  --user $uid -- whoami
takuya

lxcのようにユーザ指定を番号でできるコマンドは多いのです。

参考資料

https://kb.iu.edu/d/adwf

Laravel でログを、ターミナルに出す。

Laravel でログを、ターミナルに出す。

laravel のログを画面ではなくターミナルへ出力する事ができる。

またターミナルとファイルに出す事ができる。

ログとデバッグ

dd とかよく使います。

dd( $model );

dump もよく使います。

dump( $model );

これはログの出力先に出てきます。

ログの出力先を変える

Log を使った場合。

このログを、stderr に書きます。

Log::debug('ここまで到達');

config/logging.php に書きます。

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single','stderr'],//←追加、2つの出力先
            'ignore_exceptions' => false,
        ],

ログも「laravel チャンネル」として定義されているので、サクッといけます。

loggerヘルパ Log::debug 書くのがめんどくさい

Log::debug('ここまで到達');
logger($event->task);

これを使えば、ログを任意の場所にだしておけるので、 syslog でもいけるし、php-fpmでも見れるし、ファイルに書き出してもいい。STDEERでターミナルで見ることもできる。

参考資料

sar / sysstat で cpu 利用率を計測し計測値を記録し、調査する

grafana+prometheus でロードアベレージを監視してもいいんだけど

ちょっとログを集めたいのに、あまりにもヘビィだと思うの。

sysstat / sar を使う

古のパッケージ sar コマンドで、CPU利用率を集計する

sar / sysstat で cpu 利用率を詳しく調査する

インストール

apt でインストールが可能

sudo apt install sysstat

楽ちん

起動 と設定とタイマー

マニュアル起動(ログ書いて終了する)

sudo systemctl start sysstat-collect.service

タイマー開始

sudo systemctl start sysstat-collect.timer

タイマー間隔(取得間隔)を調整

sudo systemctl edit sysstat-collect.timer

例えば、15分に1回(初期値は10分に一回)

[Timer]
OnCalendar=*:00/15

設定(ログ保存期間)

sudo vim /etc/sysstat/sysstat

/etc/sysstat/sysstat

# How long to keep log files (in days).
HISTORY=30
# Compression program to use.
ZIP="pixz"
# Parameters for the system activity data collector (see sadc(8) manual page)
SADC_OPTIONS=""

設定したポイント - 初期設定は1週間ほどなので、1ヶ月間位残しておく - xz は pixz を使うようにする。 - CPU統計がほしいだけなのでディスク統計は要らない。足りなくなったら買うだけだし

統計の確認

ログが溜まったら、取得期間全体で統計(平均)が見れられる

sudo sar 

直接ログの確認(日毎ファイルになってる)

sar -f /var/log/sysstat/sa$(date +"%Y%m%d")

cat したいところだけど、バイナリなのでsar コマンドで読む

実行例

sar -f /var/log/sysstat/sa$(date +"%Y%m%d")
Linux 5.10.0-13-amd64 (acid)    2022年04月28日   _x86_64_    (8 CPU)

13時41分00秒  LINUX RESTART  (8 CPU)

13時41分42秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
13時44分30秒     all      4.80      0.50      1.17      0.36      0.00     93.17
平均値:      all      4.80      0.50      1.17      0.36      0.00     93.17

指定した範囲のログの確認

takuya@:~$ sudo sar -s 13:00 -e 13:59
Linux 5.10.0-13-amd64 (acid)    2022年04月28日   _x86_64_    (8 CPU)

13時41分00秒  LINUX RESTART  (8 CPU)

13時41分42秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
13時44分30秒     all      4.80      0.50      1.17      0.36      0.00     93.17
13時50分00秒     all      4.66      0.47      1.17      0.69      0.00     93.02
平均値:      all      4.71      0.48      1.17      0.57      0.00     93.07

リアルタイムモニタリング

ターミナルで表示し続けるする場合。マニュアル起動で今の状態を監視ができる。 ただし、この目的なら s-tui や htop を使ったほうがいい

1秒ごとに状態を取得する

sudo sar 1

1秒ごとに状態を取得する(最大10回,1s x 10=10sで終了)

sudo sar 1 10 

マルチCPUを個別に見る

sudo sar -u -P 0,1     1 10
sudo sar -u -P 0,1,2,3 1 10
sudo sar -u -P ALL     1 10

ロードアベレージ

sudo sar -q 1 10

ネットワークの状態

sudo sar -n DEV 1 10 

指定したIFの状態

sudo sar -n DEV  --iface=br0 1 10

リプレース・買い替えの目安に

CPUパワーが3倍に上がったとして、どこまでそのメリットを享受できるのか

金銭コストに対し、十分な時間的なリターン得られるのか。

電気代はどの程度になりそうなのか(CPUロードアベレージから概算)

など、CPU利用率を測定して計測値を集めるといろいろ見えてきそうですよね。

参考資料

http://performance.oreda.net/linux/check/sar

qcow2のbacking ファイルから複数起動した場合について調べる

qcow2 backing ファイルで複数起動した場合について調べる

今回しらべた構成

d03 の仮想マシン作り、そのイメージから 2つの仮想マシンを差分として起動する。

d03 ─┬ d03.1 
     └─ d03.2

Backing-fileのBASEが更新されたとき、差分側はどうなるのか

d03 の作成

virt-install\
 --connect=qemu:///system \
 --initrd-inject=/home/takuya/preseed.cfg  \
 --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  \
 --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/  \
 --extra-args="console=ttyS0"

d03.1 の作成

オーバーレイ(差分)を作る

sudo qemu-img create \
 -b /var/lib/libvirt/images/d03.qcow2 \
 -f qcow2 -F qcow2 \
 /var/lib/libvirt/images/d03.1.qcow2

差分を使うDebianを起動する

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

d03.2 の作成

差分を使うDebianをもう一つ作る

オーバーレイ(差分)をもう一つ作る

sudo qemu-img create \
 -b /var/lib/libvirt/images/d03.qcow2 \
 -f qcow2 -F qcow2 \
 /var/lib/libvirt/images/d03.2.qcow2

仮想マシンを作る

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

同時に起動できるのか

オーバーレイを使う2つは起動できる

差分を使う2つの仮想マシンは同時に起動できる

sudo virsh start d03.1
sudo virsh start d03.2

差分1と差分2を使う2つの仮想マシンd03.1/d03.2 は同時に起動できた。

これが正しい使い方である。

baseファイルを使えるのか?

Baseファイルを使うd03 というベースは、同時に起動できない。

Base側を起動して

sudo virsh start d03

差分も起動すると、エラー

takuya@:~$ sudo virsh start d03.1
エラー: Failed to start domain 'd03.1'
エラー: 内部エラー: process exited while connecting to monitor: 2022-04-27T06:49:56.304604Z qemu-system-x86_64: -blockdev {"node-name":"libvirt-2-format","read-only":true,"driver":"qcow2","file":"libvirt-2-storage","backing":null}: Failed to get shared "write" lock
Is another process using the image [/var/lib/libvirt/images/d03.qcow2]?

いちどオーバーレイを作成したら大本の仮想マシンは、もはや触るべきではありません。

Base側は更新して大丈夫なのか

Base側を更新して、終了

sudo virsh start d03 --console

takuya@d03:~$ rm from-base
takuya@d03:~$ echo 11 >  from-base
takuya@d03:~$ sudo shutdown -h now

差分側を起動する

sudo virsh start d03.1 --console

takuya@d03:~$ rm from-base
takuya@d03:~$ cat   from-base
cat:  No such file or directory
takuya@d03:~$ sudo shutdown -h now

こうすれば、d03.1にd03の変更点が適用されそうな予感はする。が、これは禁忌である。

動かないことはないが、d03.1に変更点が適用されることもない。

backing file は書き換えたらいけない

https://kashyapc.fedorapeople.org/virt/lc-2012/snapshots-handout.html

NOTE: Backing files are always opened read-only. In other words, once an overlay is created, its backing file should not be modified(as the overlay depends on a particular state of the backing file). Refer below ('blockcommit' section) for relevant info on this.

Backing file は参照先からリードオンリで読み取りがされる。言い換えれば、一度オーバーレイ作成したら、backing file は編集するべきではない。(オーバーレイ側の状況によるが)、差分(オーバーレイ)側からコミットなどを参照のこと

差分をbaseに反映したとき

d03.2 の差分を、d03(base)へ書き出し(commit) する

sudo qemu-img commit /var/lib/libvirt/images/d03.2.qcow2

これで、d03.2 に差分はなくなり、d03 と同じ状態になる。

d03.1 はどうなるのか?変わらない。

d03 ─┬ d03.1 
      └─ d03.2

d03.2 とd03 を同じ状態にしたので d03'が生じている。これは d03.1 となんの関係もない状態になった。

試した結果

d03 ─┬ d03.1 
      └─ d03.2

⇓ commit 後
d03 ── d03.1 
d03' ─┐
       └─ d03.2

上記のようになっていた。 d03(=d03’)になっているが、d03.1は古い状態を維持していた

d03にスナップショットを作ったのと同じような状況になったと考えられる。無名のスナップショット的ものなのかもしれない。

virsh ならできるかも

上流から下流へ変更点を伝播 (propagate)させるなら、virsh でできるかもしれない。

virsh blockpull
virsh blockcommit

qemu-img man ではよくわからなかった

man of qemu-imgをざっと見た感じだと、細かいことがよくわからない。

backing-file から複数の仮想マシンを作れる

OSをインストールしたファイルから、複数の仮想マシンをさくっと、インストールなしで作成できる。しかもコピーもなしで作れるから快適

その程度が実現できたらいい感じ。っていう機能なのかもしれない。

コンテナ全盛期で仮想マシンの関連の記事が空気になっていて、かんたんに結論が出る情報が少ないよぉ。

ソースコードやフォーラムをたどっていくのもしんどいしあまり深く追求しないことにする。

clone や docker pull や preseedよりは速く作れる

qcow2でオーバーレイ(差分)を作ってインストールすると、仮想マシンはすぐ作れる。

  • ストレージをコピーするより速い
  • docker pull より速い
  • preseedでゼロからインストールより速い。

このあたりに大変魅力がある気がします。

仮想マシンをシリアルコンソールでインストールする。

仮想マシンをシリアルコンソールで起動する

Linuxへシリアルコンソールでターミナルを使って接続するには

いくつかのポイントで使ってるオプションが違う

ブート時点で動いてるモノが違うので、それぞれにシリアルコンソールの設定が必要

インストール前にインストーラーを起動するとき

インストール後には

ということで。

大まかな流れ

  • シリアルコンソールで「grub起動する」
  • シリアルを有効にして起動する
  • シリアルコンソールを有効にして 「カーネル」を起動する
  • カーネルを起動。
  • grubからカーネルを起動する場合
  • カーネル直接起動の場合

grub からカーネルオプションを指定

インストール時

インストール後

Linux起動後

  • シリアルコンソールをagettyを待ち受け

シリアルコンソールのインストールのパターン

以上を踏まえると、

インストールから起動までをすべてシリアルコンソールで行う。つまりSSH経由でホストに仮想ゲストを作る方法は

という3つのインストールパターンがるが、

最初から最後までシリアルコンソールでやるには、次の2つが選択肢

これらは、--location を指定して、 extra-ages を指定する。

debian をシリアルコンソールでインストール

いろいろと、やり方はあるが、サクッとインストールできるのは次やりかた

virt-install\
 --connect=qemu:///system \
 --initrd-inject=/home/takuya/preseed.cfg  \
 --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  \
 --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/  \
 --extra-args="console=ttyS0"

ただし、preseedは任意

ubuntu をシリアルコンソールでインストール

netinstall でやるより、ISOのほうがダウンロードができるんで確実

curl https:// ... /ubuntu-20.04.3-live-server-amd64.iso

virt-install\
 --connect=qemu:///system  \
 --name u05 \
 --ram 8192  \
 --disk path=/var/lib/libvirt/images/u05.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" \

22.04 では試してないので、動くかはわからない、ubuntuカーネルイメージのファイル名が変わってなかったら動くと思う。

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