それマグで!

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

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

tar cvzf xxx.tgz が遅いのでpigz で高速化する

tar cvzf xxx.tgz が遅い。

SSDに変えたら、gzipボトルネックになる。

ボトルネックgzipであれば、gzip を変えればいい。pigzというちょうどいいコマンドがある。

tar コマンドとパイプを見直して、gzip の箇所をpigzに置き換えていきたい。

よく使われるtar

最初にtar のコマンドを確認しておく

むかしから使われるtar コマンドは、次のとおりだと思う。

私が初心者の頃からよく見かけたtarコマンドが次の通り。

通常のtar ()

mnt フォルダをファイルに保存。

tar cvzf out.tar.gz ./mnt

パイプつきの通常のtar

tar cvzf - ./mnt | cat - > out.tar.gz

圧縮有・無圧縮

tar cvzf out.tar.gz ./mnt
tar cvf out.tar ./mnt

パイプで圧縮

tar cvf - ./mnt | gzip - | cat - > out.tar.gz

pigz で圧縮を高速に

pigz がマルチプロセスで動作するので少し早い。gzipをpigzに変えてあげればいい

tar cvf - ./mnt | pigz - | cat - > out.tar.gz

verboseも外す

verboseすると、ファイル一覧が出力されて描画と一覧の転送である。SSH経由でSSHが遅いと、ファイル出力が終わっているのに表示終了を待って次のコマンドに移れない。

tar cf - ./mnt | pigz - | cat - > out.tar.gz

代わりにpv しておけば、残り容量がわかる。

# フォルダ使用量を確認
du -cksh ./mnt 
# pv しながら状況を見ておく
tar cf - ./mnt| pv | pigz - | cat - > out.tar.gz

最終手段

面倒を考えるのが辛くなったら、 /usr/bin/gzip 自体を書き換えてしまえばいい。

mv /usr/bin/gzip /usr/bin/gzip.orig
ln -s /usr/bin/pigz /usr/bin/gzip

これは、最終手段です。普段遣いLinuxデスクトップでやるには最速・最強の最終手段だと思います。

設定を忘れてパニックにならないように。自分だけの環境に留めておけば最速で単純で良いと思います。

ポエム

世の中すべてがpigz になればいいのに。。。

圧縮処理は「効率」を考えて使いますが、「効率」とはなんですか。

「効率」とは「ディスク消費量」のことだけではなく、「作業時間効率」でもあり、「CPU使用率」のこともあると思います。無人で圧縮するのならともかく、ディスクのバックアップなどダウンタイムを極力少なくしたいときには、「時間効率」もまた重要な要因だと思います。

人間の時間がいちばん高コストであり、一番貴重なのです。ある程度の圧縮率でCPUマルチスレッドを使い切って時間効率を追い求めてもいいのではないでしょうか。

Lvm Snapshotで稼働中OSや起動中VMのバックアップを取る。

Lvm Snapshot

スナップショットについて。

スナップショットを使うと、稼働中のVMのディスクイメージファイルをバックアップ取り出すことが出来ます。virsh snapshot だと qcow2 ディスクイメージファイルに書き込みが出来ず、virshだと仮想マシンのバックアップが作れず不便。lvm を使うとその点が解消される。

さらにルート・ファイルシステムのバックアップも可能。仮想マシンの親になっているOSのファイルをバックアップを取ることが出来る。これもとてもいい。

事前に必要なもの

lvm で構成したファイルシステムと、空き容量。空き容量が無いと使えないので注意。

lvm スナップショットのコマンド

スナップショットを作るには、LVMのコマンドを使います(要sudo)

スナップショットの作成

sudo lvcreate -s -L 5G -n my_snap /dev/vg0/lv0

スナップショットの一覧

sudo lvs  -S "lv_attr=~[^s.*]"

スナップショットの削除

スナップショットの削除をするときに確認が出てくる。-y をつければスキップできる

sudo lvremove  /dev/vg0/my_snap

スナップショットをオリジナルへ戻し

sudo lvconvert --merge  /dev/vg0/my_snap

スナップショットから戻すと、オリジナルはスナップショット時点に戻る。差分が多いと時間がかかる。マージ終了後はスナップショットはなくなります。稼働中(オンライン)マージは地獄を見そう

スナップショット作成直後

スナップショット作成直後は、スナップショットもオリジナルも同じ記憶域ブロックを参照しています。メインになるのはオリジナルです。スナップショットにソフトウェアから書き込まれることはありません。稼働中ソフトウェアが書き込むとオリジナルに変更が加わります。スナップショットは取得時点の参照を保持しています。

スナップショットの容量

スナップショットは、作成時点では同じブロックを指しています。容量は差分保持の上限容量です。

しばらく使っていると

しばらく使っていると、スナップショットがファイルを抱え込みます。

なぜなら、オリジナルが書き換わり、スナップショットだけが保持するからです。

オリジナルに変更が加わり、スナップショットにはバックアップが溜まります。このためておける上限が、スナップショットの容量になります。

takuya@:~$ sudo lvs
  LV              VG Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv              vg owi-aos--- 70.00g
  snap_2023_01_05 vg swi-aos--- 10.00g      lv     60.35

容量上限になると

容量上限に達したスナップショットは、もはや無意味です。オリジナルとの差分を保持できなくなっています。inactiveになっています、こうなるとマージによる復元は絶望的です。もしかしたら、スナップショットをマウントで取り出せるかもしれません。

容量上限になるようなスナップショットの利用は、時間と容量の無駄です。

スナップショットの活用例

lvm スナップショットを活用すると、バックアップがとても便利です。

libvirtd の仮想マシンに使う。

仮想マシン無停止でバックアップを取れます。

sudo lvcreate -s -L 5G -n snap01_05 /dev/vg/lv
sudo mount /dev/mapper/vg-snap01_05 /mnt
cd /mnt/var/lib/libvirt/images/
sudo rsync -avz ubuntu-01.qcow2 my-server:~/

スナップショット取得時点の仮想マシンのストレージが載っているブロックの参照がそのままコピーでき便利です。

仮想マシンが稼働中でも、更新はオリジナルに書かれます。スナップショットには取得時点の状態が保存されています。オリジナルへの更新差分がスナップショットに溜まって行きます。このおかげで無停止にバックアップが取れました。

ルートファイルシステムに使う。

そして、ルートファイルシステムも取り出すこともできそうです。

sudo lvcreate -s -L 5G -n snap20230105 /dev/vg/lv
sudo mount /dev/mapper/vg-snap_20230105 /mnt
tar cvzf - . | ssh server  'cat - > out.tar.gz '

ファイルを取り出すこと自体はできました。わたしは、復元をやったことがないのでここから復元ができるかわかりませんが。/usr,/etcなどの重要なファイルが取り出せて便利でした。スナップショット使わずに、rsync で持ち出しも不可能ではないですが、mountが複雑だと面倒なんですよね。スナップショットを使えばOSを停止せずにルート・ファイルシステムが取り出せます。スナップショットは無停止でルートが取り出せます。これ大事なので2回書きました。

データベースのバックアップ

他にも MySQLPostgreSQLなどのデータベースや、Gitlabなどのレポジトリを、無停止でバックアップを取り出す事ができます。

### スナップショット作成
sudo lvcreate -s -L 5G -n snap_2023_01_05 /dev/vg/lv  
## スナップショットをマウント
sudo mount /dev/mapper/vg-snap_2023_01_05 /mnt
## 無停止でバックアップ
rsync -av  /mnt/var/lib/mysql server:/nfs/mysql

これは、mysqldumpを使ったほうがいいと思うのですが。

スナップショットから取り出す注意点。

スナップショットを使えば、取得時点のブロックがあるので、ファイルとしてコピーできるので便利です。

ただし、スナップショット内部からスナップショット外部へコピーすると、ブロック割当の計算に時間がかかりますし、スナップショットとの差分が発生します。

### スナップショット作成
sudo lvcreate -s -L 5G -n snap_2023_01_05 /dev/vg/lv  
## スナップショットをマウント
sudo mount /dev/mapper/vg-snap_2023_01_05 /mnt
## 遅いバックアップ(スナップショットからオリジナルへ)
sudo rsync -avz /mnt/etc /tmp

上記のように、スナップショット内部から外部へコピーは、オリジナル側への書き込みであるため、オリジナルとスナップショットに差分が生じます、スナップショットの容量を蝕害します。スナップショットからデータ救出の際は、できる限り、別のブロックデバイスやネットワーク上へ転送したほうが無難です。

grub を使ってブート

ArchWikiによると、GRUBを使ってLVMのスナップショットを起動することも出来るらしい。LVM素晴らしい。

LVMは枯れた技術

LVMは登場から10年以上が経過し、十分に枯れた技術だと思います。ただSNS全盛期に枯れた技術になったのでWEBに情報が少なく、検索や活用例が思うように入手できずに困った。

私も、LVMを単なるディスクのストライプにしか使っていなかった。今後はもっと活用しておこうと思う。

スナップショット作成すら面倒

スナップショット作成し、マウントし、バックアップ取得、マウント解除、スナップショット削除という一連の手続きが、めんどくさいので、バックアップ手順だけにフォーカスしたい。とおもった。

バックアップ専用のライブラリを書いた。

GitHub - takuya/ruby-lvm-snapshot-wrapper: Wrapper for lvm, to use lvm snapshot.

スナップショットのことは考えずに、LVMの空き容量を確保しておく。あとはスクリプトを走らせるだけで、バックアップが取れるようにした。

require "takuya/lvm_snapshot"
LvmSnapShot = Takuya::LvmSnapShot
LvmSnapShot.new('vg0').enter_snapshot{
    ## ブロック内はスナップショットが有効
    FileUtils.cp_r('/mnt/var/lib/mysql', '/nfs/backup/mysql')
    ## 仮想マシンも無停止でバックアップが取れる!
    FileUtils.cp_r('/mnt/var/lib/libvirt/images', '/nfs/backup/vm-images')
}
## ブロック出るとスナップショットは削除されている。

参考資料

lvm snapShotだけを一覧する

lvm snapショットだけを一覧する

検索条件でスナップショットに限定する。

sudo lvs  -S "lv_attr=~[^s.*]"

さらにスナップショットの名前だけに限定する

sudo lvs  -S "lv_attr=~[^s.*]" -o lv_name

これで、LVMスナップショットの名前だけを取り出すことができ、シェルスクリプトから使いやすくなります。

参考資料

https://serverfault.com/questions/697794/listing-all-logical-volumes-in-lvm2-that-are-snapshots

cryptsetup でセットしたディスクのUUIDを得る/ crypttab

crypttab に記載するUUIDを得る

crypttabを手作業で記入するとき、UUIDが必要。そのUUIDはblkid コマンドでは得られない。同様に、/dev/disk/by-uuid の by-uuidのls でも得られない。

cryptsetup コマンドでUUIDを得る

cryptsetup のluksDumpコマンドを使えば得られるようです。

cryptsetup luksDump /dev/sdX
root@host:/# sudo cryptsetup luksDump /dev/nbd0p4 | grep "UUID"

UUID:           ccXXXXX-cb03-4a59-77ab-XXX

あとは、これをcrypttabに記載すれば、LUKSのディスクを交換できる。

参考資料

https://cordx56.hatenablog.com/entry/2020/09/22/003528

はてなブックマークのブロック(ミュート)をAdguardなどiOSのブロック機能(CSSセレクタ)で行う。

はてブミュート機能ができてた

bookmark.hatenastaff.com

それiOS Safari でもやりたい。

特定の炎上を狙ったZennユーザとか中身のないエントリ連発とか、まとめ系の某サイトとか、もうね見たくないの。

ブロック条件

CSSで一覧から消す

li:has(a[href$="zenn.dev/nameless_sn"])

UserJS で一覧から消す

let site='zenn.dev/nameless_sn'
let a = document.querySelectorAll(`li:has(a[href$="${site}"])`)
Array.from(a).forEach(e=>e.remove())

特定の人を消している様に見えるのは気の所為です。

Linux のマルチブートを作りたい レベル4 EFIブートを書き換える。

マルチブート構成

前回までで、2つのOSを同居させて片方だけはEFIブートローダーから起動している。デュアルブートのもう一方は、EFIから起動したDebianGrubから起動される。という構成が出来ている。

ここでは、続きをおこなって、マルチブートで両方ともに、EFIパーティションに登録してEFIブートするように変えておく。

レベル4 EFIブートを書き換える。

システムのインストールの状況

ここまでで、EFIパーティションDebianGRUBメニュからUbuntuを起動している。

Ubuntuが起動した状態を確認する

EFIは使ってない。

Debianが起動した状態を確認する。

EFIがあることがわかる。

ここでの目標

EFI未登録のUbuntuを起動し、Ubuntu自身にEFI登録させる。

ubunuで起動して

efiインストーラーを導入

sudo apt install grub-efi-amd64

EFIパーティションをマウント

sudo mkdir /boot/efi
sudo mount /dev/vda1 /boot/efi

EFIUbuntuブートローダーをインストール

sudo grub-install --target=x86_64-efi

インストール出来たか確認

EFIにインストール出来たか確認

takuya@ubuntu:~$ efibootmgr
BootCurrent: 0001
Timeout: 0 seconds
BootOrder: 0004,0001,0002,0000,0003
Boot0000* UiApp
Boot0001* debian
Boot0002* UEFI Misc Device
Boot0003* EFI Internal Shell
Boot0004* ubuntu

再起動時にEFIパーティションマウントさせる

このままでは、再起動したときに /boot/efi が見えなくなるので再起動後も維持するようにします。

echo "/dev/vda1 /boot/efi vfat umask=0077  0  1" | sudo tee -a /etc/fstab

EFIブート順を変更する

takuya@ubuntu:~$ sudo efibootmgr -o 0004,0001
BootCurrent: 0001
Timeout: 0 seconds
BootOrder: 0004,0001
Boot0000* UiApp
Boot0001* debian
Boot0002* UEFI Misc Device
Boot0003* EFI Internal Shell
Boot0004* ubuntu

再起動する

sudo reboot 

再起動のGRUBメニュー

UbuntuEFIブートローダーからUbuntuGRUBメニューが起動する

Ubuntuが管理しているGRUBメニューが見えています。

まとめ

順番を意識すると間違えない。 EFIー>GRUBー>OS起動

EFI自身にマルチブートの機能があり、GRUBメニューにもマルチブートの機能がある。

EFIDebianGRUBメニューを起動し、GRUBメニューからUbuntuを起動することが出来る。

EFIUbuntuを起動して、GRUBメニューからUbuntuが起動できる。

そして、ブートローダーを作るだけなので、OSをインストールをしなくても大丈夫。

OSを丸々コピーしてデュアルブートを作れることがわかった。

その他の方法

Mountしてchrootでも同じです。

Debian起動して、Ubuntuのディスクをマウントする

sudo mount /dev/mapper/vg0-ubuntu /mnt
sudo mount /dev/vdb1 /mnt/boot/efi
sudo mount -t proc proc /mnt/proc/
sudo mount -t sysfs sys /mnt/sys/
sudo mount -o bind /dev /mnt/dev/
sudo mount -t devpts pts /mnt/dev/pts/
chroot /mnt

chroot後にgrub-install

root#chrooted $ sudo grub-install --target=x86_64-efi

Linuxのマルチブートの作業ログ一覧

Linux のマルチブートを作りたい レベル3 EFIブートのGRUBでマルチブートする

レベル3 EFIブートのGRUBでマルチブートする

EFIブートパーティションで同じようにすることが出来るのか。検証である。

今回作った構成は、EFIブートをしたあとに、grub が起動する。

UEFI環境の準備

libvirt/qemu/kvmUEFIを使うために必要なパッケージを追加。

sudo apt install ovmf

EFIブートのDebianを作る。

ディスクの用意

## 必要な変数を用意
NAME=ef01
DISK=/var/lib/libvirt/images/$NAME.qcow2
sudo qemu-img create -f qcow2 $DISK 20G
NAME=ef01
DISK=/var/lib/libvirt/images/$NAME.qcow2
UEFI_PARAM='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'
virt-install \
--boot uefi,$UEFI_PARAM \
--connect=qemu:///system  \
--name $NAME  \
--ram 8192  \
--disk path=$DISK  \
--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"

リサイズしたいのでLVMにする

サイズ指定

LVのサイズは50%未満しておく。残容量にUbuntuをコピーのため。

Debianインストール完了

インストール完了時のディスク上状態

/boot/の中身を確認

UEFI->Grubで起動するのを確認

sudo reboot 

画像は、GRUBだが、EFIからブートしている。

EFIブートしているか確認は、コマンドで確認

ubuntu のディスクをコピーしてくる

ubuntu のディスクを接続する

NAME=ef01
sudo virsh attach-disk \
  --domain $NAME \
  --source /var/lib/libvirt/images/u02.qcow2\
  --driver qemu\
  --subdriver qcow2\
  --targetbus virtio\
  vdb

ディスクが接続されたのを確認。

コピー先を用意する

sudo lvcreate debian-vg -n ubuntu-root -L 5G
sudo mkfs.ext4 /dev/mapper/debian-vg-ubuntu
sudo lvcreate debian-vg -n ubuntu-root -L 5G
sudo mkfs.ext4 /dev/mapper/debian-vg-ubuntu
マウントする
sudo mount /dev/mapper/ubuntu--vg-ubuntu--lv  /mnt
sudo mount /dev/vdb2 /mnt/boot
sudo mkdir /mnt2
sudo mount /dev/mapper/vg0-ubuntu /mnt2
ディスクをコピーする

さくっとrsyncUbuntuをコピー

rsync -av /mnt/ /mnt2

ディスクを取り外す

仮想マシンを抜けvirsh 経由で取り外し。

sudo virsh detach-disk ef01 vdb

コピーの結果。

コピーし、取り外し、その結果のディスクのマウント状況。

grub を更新してubuntuを加える

debian 側の grub を書き換えて、ubuntu を加える

sudo update-grub

EFI ブート順を確認する

EFIブートがDebianに指定されていることを確認。

sudo efibootmgr

この状況から、BIOS->UEFI->GRUB->Debianの順に起動することがわかる。

grub のメニューを確認する

grub メニューを確認する方法で、メニュー項目を確認する。

export GRUB_CONFIG=`sudo find /boot -name "grub.cfg"`
sudo grep 'menuentry ' $GRUB_CONFIG | cut -f 2 -d "'" | nl -v 0

この結果から、DebianGRUBに、Debian自身とUbuntuがあることがわかる。

ubuntuを起動する

メニューのNo.5がUbuntuなので、認識されていることがわかる。

 5  Ubuntu 20.04.3 LTS (20.04) (on /dev/mapper/debian--vg-ubuntu--root)

5を指定して再起動

DebianGrubからUbuntuが起動できた

ここまでは、efi を書き換えはしない。

EFIDebianGRUBを起動し、Debian管理下のGrubメニューからUbuntuGrubへ移行している。デュアルブートにはこの手法が確実だと思う。

EFIにマルチブートがあり、EFIから起動したGRUBにもマルチブートがある。油断すると迷い込む。

EFIの書き換えは、grub-install で出来る。ただ、EFI書き換えたとしても、Grubだけでマルチブート可能なためメリットは薄い。

EFIパーティションに登録してEFIで起動順序を変更してもいい。だが、EFIはシリアルTTYを使うのが面倒。仮想マシンならいいけど、実マシンでEFI書き換えは事故多発なので、個人的には避けておきたい。

いちおうEFIパーティションに登録する方法も試しておきます。

次回へつづく

次回は、EFIパーティションに2つのOSを登録し、EFIブートから両方が起動するように変えてみます。 →次回

Linuxのマルチブートの作業ログ一覧

Linux のマルチブートを作りたい-その2 ddでコピーする

レベル2 通常インストール済みディスクをコピーして持ってくる。

ここまでで、grub-install と update-grub の使い方がちょっとわかった。 そこでインストール済みのOSが入ったパーティションを持ち込んで、既存のディスクにOSを追加する事を考えてみる。

目的は、FSCKとLVMのリサイズである。メンテナンスを楽にするために、既存のシステムにメンテナンス用のOSを追加する方法を模索していく。

これができれば、インストーラーをわざわざ起動しなくても済むわけです。

OSを2つ用意する。

ディスクの用意

## 必要な変数を用意
NAME=d01
DISK=/var/lib/libvirt/images/$NAME.qcow2
sudo qemu-img create -f qcow2 $DISK 20G

パーティションを用意する。

## nbd有効化
sudo modprobe nbd max_part=8
## 接続
sudo -E qemu-nbd --connect=/dev/nbd0 $DISK
## パーティションを作成する。point of no return.
vda=/dev/nbd0
sudo -E sgdisk -og $vda # 初期化 
sudo -E sgdisk  -p $vda
sudo -E sgdisk \
-n 1:2048:4095 -c 1:"BIOS Boot" -t 1:ef02  \
-n "2::+1G" -c 2:"GRUB" -t 2:8300 \
-n "3::+1G" -c 3:"swap" -t 3:8200 \
-n 4:0:$(sudo -E sgdisk -E $vda ) -c 4:"LVM" -t 4:8e00 \
$vda;
sudo -E sgdisk  -p $vda
sudo pvcreate /dev/nbd0p4
sudo vgcreate vg0 /dev/nbd0p4
sudo lvcreate vg0 -n debian  -L 5G
## 解放
sudo dmsetup ls 
sudo dmsetup remove vg0-debian
## 取り外し
sudo qemu-nbd --disconnect /dev/nbd0
## nbd 無効化
sudo rmmod nbd

これで、ディスクが用意できた。

OS-01 Debianの用意

## 必要な変数を用意
NAME=d01
DISK=/var/lib/libvirt/images/$NAME.qcow2
## インストール開始
INSTALLER=http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/
virt-install --connect=qemu:///system --graphics none \
 --location $INSTALLER --extra-args="console=ttyS0" \
 --ram 4096 --vcpus 8 --virt-type kvm --os-type linux \
 --os-variant debian10 \
 --name $NAME \
 --disk path=$DISK \
; 

OSをインストールするときに、/boot は別パーティションにする。

インストールができた。

OS-02 Ubuntuの用意

素のUbuntuを用意する。単純なインストール

## 必要な変数を用意
NAME=u02
DISK=/var/lib/libvirt/images/$NAME.qcow2
sudo qemu-img create -f qcow2 $DISK 10G
### インストール
virt-install\
 --connect=qemu:///system  \
 --ram 8192 --virt-type kvm --vcpus 8 --name $NAME --os-type linux  \
 --graphics none \
 --disk path=$DISK  \
 --location /var/lib/libvirt/images/ubuntu-20.04.3-live-server-amd64.iso,kernel=casper/hwe-vmlinuz,initrd=casper/hwe-initrd \
 --os-variant ubuntu20.04  \
 --extra-args "console=tty0 console=ttyS0,115200n8" \

Enter diskを選んで、シンプルにインストール。

ディスクのレイアウト設定

インストールができた

インストール後のディスクのマウント状況

Ubuntuのシリアルコンソールを有効にする。

sudo sed '/console/i GRUB_TERMINAL="console serial"' -i /etc/default/grub
sudo sed 's/GRUB_TIMEOUT/#GRUB_TIMEOUT/' -i /etc/default/grub
sudo sed '/GRUB_DEFAULT/a GRUB_TIMEOUT=5' -i /etc/default/grub
sudo sed '/GRUB_DEFAULT/a GRUB_TIMEOUT_STYLE=menu' -i /etc/default/grub
sudo update-grub
sudo grub-install --boot-directory=/boot /dev/vda

シリアルコンソールの有効化を忘れると、やばい。Ubuntuをシリアルコンソールで見られない。

シリアル経由でUbuntuが起動してるのか失敗したかわからない。Grubミスで停止しても起動してても、全くわからないので注意。

2つのHDDを接続する

これで、次のディスクができた。

ubuntu u02.qcow2
debian d01.qcow2

USBディスクのUbuntuをPCに差し込んだ状態をシミュレートする。OS入りHDDをそれぞれ1台を2台用意し、1台のPCに2台を突っ込む。

ubuntuのディスクをPCに接続する

sudo virsh attach-disk \
  --domain d01 \
  --source /var/lib/libvirt/images/u02.qcow2\
  --driver qemu\
  --subdriver qcow2\
  --targetbus virtio\
  vdb

二台とも接続できたかチェック

sudo virsh console d01
lsblk

ちゃんと接続されて、VGが認識されていることがわかる。

ディスクの内容をコピー

コピー先を用意する

sudo lvcreate vg0 -n ubuntu -L 5G
sudo mkfs.ext4 /dev/mapper/vg0-ubuntu

マウントする

sudo mount /dev/mapper/ubuntu--vg-ubuntu--lv  /mnt
sudo mount /dev/vdb2 /mnt/boot
sudo mkdir /mnt2
sudo mount /dev/mapper/vg0-ubuntu /mnt2

マウント状況を確認する。/bootも

コピーする。

sudo rsync -avz /mnt/ /mnt2

rsyncコピーは遅いので、dump-restore/ddでもいいかも

/etc/fstabを変更する

ubuntuのfstabを書き換える。UUIDで記述されていてまずい。/bootは使わないようにしたので変更する。

/mnt2/etc/fstab

/dev/disk/by-id/dm-name-vg0-ubuntu / ext4 defaults 0 1
#/dev/disk/by-uuid/xxxxx /boot ext4 defaults 0 1

DebianGrub再構築。

アンマウントして

sudo umount /mnt
sudo umount /mnt/boot
sudo umount /mnt2
sudo dmsetup remove ubuntu--vg-ubuntu--lv

ディスクを取り外しする

sudo virsh detach-disk d01 vdb

正常に取外した。

os-proberでコピー確認

コピーした領域が、DebianからUbuntuとして認識されてるかテスト

GRUBメニューを作り直す

Debianで起動しログインする。Ubuntuが追加されたのをGRUBに認識させて、メニューに追加させる。

sudo update-grub

再起動して確認。

GRUBを使った起動を確認する。

Debianで起動することを確認

無事起動した。

Ubuntuで起動するか確認

Ubuntuも無事に起動した。

ここまでのまとめ

Ubuntuがインストールされたディスクをコピーして起動させることができた。

ミスしそうポイントは以下の通り。

  • /etc/fstab
  • GRUB_TERMINAL="serial console"
  • mount /dev/vdb2 /mnt/boot
  • os-prober

手順としては単純にコピーをしてファイルを作るだけでいい。なるほどね。

次回へつづく

次回は、EFIブートと組み合わあせます。→ 次回

Linuxのマルチブートの作業ログ一覧

Linux のマルチブートを作りたい レベル1 インストーラーによる、デュアルブートの構築

レベル1 インストーラーによる、デュアルブートの構築

簡単に言えば、CD-ROMでOS別にインストールを行う。2回インストをする方法だ。

ディスクを準備

パーティションをインストール時に作ると面倒なので、先にパーティションをqcow2に仕込んでおく。

qcow2 を作って、nbd でループデバイスにして、sgdsik でパーティション作成してく。

NAME=mbt-d01
DISK=/var/lib/libvirt/images/$NAME.qcow2
## disk 初期化
sudo qemu-img create -f qcow2 $DISK 20G

最初に決めたディスク・レイアウトを目指してディスクをパーティションする。

パーティション作成はインストール中に行うほうが分かりやすい。

私はインストーラーのパーティション作成画面が得意ではないので、事前にパーティションを作っておくことにした。(参考資料 nbdでqcowを扱う , sgdisk使い方)

パーティションの作成

  

qcow2 のディスクをnbd でループデバイスにして、
sgdisk でパーティション作成、
LVMを作成してパーティションレイアウトを先に完成させておく。

先に完成させることでインスト中の作業を減らす。

## nbd有効化
sudo modprobe nbd max_part=8

## 接続
sudo -E qemu-nbd --connect=/dev/nbd0 $DISK



## ここからは point of no return.

## パーティションを作成する。
vda=/dev/nbd0

sudo -E sgdisk -og $vda # 初期化 
  sudo -E sgdisk  -p $vda
  sudo -E sgdisk \
  -n 1:2048:4095 -c 1:"BIOS Boot" -t 1:ef02  \
  -n "2::+1G" -c 2:"GRUB" -t 2:8300 \
  -n "3::+1G" -c 3:"swap" -t 3:8200 \
  -n 4:0:$(sudo -E sgdisk -E $vda ) -c 4:"LVM" -t 4:8e00 \
$vda;

### 結果の確認
sudo -E sgdisk  -p $vda

### LVMを作成
sudo pvcreate /dev/nbd0p4
sudo vgcreate vg0 /dev/nbd0p4
sudo lvcreate vg0 -n  u04root  -L 5G  
sudo lvcreate vg0 -n  d05root  -L 5G 


## LVMを取り外し
sudo dmsetup ls 
sudo dmsetup remove vg0-u04root
sudo dmsetup remove vg0-d05root

## ディスク取り外し
sudo qemu-nbd --disconnect /dev/nbd0


## nbd 無効化
sudo rmmod nbd

OS-01 のDebianインストールを開始。

## 必要な変数を用意
NAME=mbt-d01
DISK=/var/lib/libvirt/images/$NAME.qcow2
INSTALLER=http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/

## インストール開始
virt-install --connect=qemu:///system --graphics none \
 --location $INSTALLER --extra-args="console=ttyS0" \
 --ram 4096 --vcpus 8 --virt-type kvm --os-type linux \
 --os-variant debian10 \
 --name $NAME \
 --disk path=$DISK \
 ; 

インストール作業

インストーラーでディスクをマニュアルで選ぶ

作ったパーティション/, , swap をそれぞれを割り当てる。

- dev/vda2 未使用
- dev/vda3 swap
- dev/vda4
    - lvm-vg0-d05root /
    - lvm-vg0-u04root 未使用

/bootの配置

rootファイルシステム(LVM内部)にブートを作っておくことにした。

インストールチェック

起動を確認して

ログインも確認する

ディスクのマウント状態を確認する。

目的はディスク作成なので、仮想マシン自体は一旦消す。

NAME=mbt-d01
sudo -E virsh destroy $NAME
sudo -E virsh undefine $NAME

DebianOSのインストールが完了

これで、Debianディスク作成完了。

ls $DISK

バックアップを作っておく。

念のために、ここまでのディスクをコピーしてバックアップする。

コピーしたものを次の作業で使う。

cp mbt-d01.qcow2 mbt-d01.installed.qcow2 
cp mbt-d01.qcow2 mbt01.qcow2

qcow2スナップショットの作成もありかもしれない。

sudo qemu-img snapshot -c debian.installed mbt01.qcow2
sudo qemu-img snapshot -l mbt01.qcow2

バックアップを作っておかないと、失敗時に何度も作り直す羽目になり心が折れそうになる。

OS-02 のUbuntuを追加インストール開始。

先程開けておいた容量に、Ubuntuをインストール

Ubuntuインストーラーにより、インストール+boot追加する。作ったディスクを、上書きする。

ubuntuインストール

先程作ったDISKを使って、Ubuntuを更にインストール

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

Ubuntuのインストールが始まる。

ubuntuSSH経由のインストール。

ubuntuSSH経由でインストールが楽なのでSSH経由でインストールする。このときホスト鍵を無視しておくと面倒がなくていい。

## SSHインストールへの接続

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no  installer@192.168.200.141

SSH接続でインストールが始まる。

ディスクの割当をマニュアルで行う。

Debianが作った/bootはいじらないようにして、別の場所に/bootを作る

インストールの完了のチェック

再起動して、ubuntuをインストールしたパーティションが使われているのを確認。

Ubuntu側からDebianが発見出来ることを確認。

バックアップ

ディスク状態を一旦ここで保存しときます。

cp  mbt01.qcow2  mbt01.ubuntu-installed.qcow2

qcow2スナップショットの作成もありかもしれない。

sudo qemu-img snapshot -c ubuntu.installed mbt01.qcow2
sudo qemu-img snapshot -l mbt01.qcow2

ubuntuGRUBメニューを有効化

Ubuntuは起動時にGRUBメニューを「隠す」ので表示する必要がある。(関連記事 ubuntuでgrubメニューを出す)

/etc/default/grub を書き換える

sudo sed '/console/i GRUB_TERMINAL="console serial"' -i /etc/default/grub
sudo sed 's/GRUB_TIMEOUT/#GRUB_TIMEOUT/' -i /etc/default/grub
sudo sed '/GRUB_DEFAULT/a GRUB_TIMEOUT=5' -i /etc/default/grub
sudo sed '/GRUB_DEFAULT/a GRUB_TIMEOUT_STYLE=menu' -i /etc/default/grub
sudo update-grub
sudo grub-install --boot-directory=/boot /dev/vda
    

/etc/default/grub を書き換えて反映すると、Ubuntuでシリアルコンソールで接続できる。

デュアルブートの確認。

この時点で再起動してすると、UbuntuからDebianが発見されていて、Ubuntuの起動メニューに出てるはずである。

debian で起動することを確認

Debianは /dev/vda2 を使わないことを確認。

debianubuntu はそれぞれ別個にGRUBを持っていることがわかる。

GRUBメモ

Grubメニューの移動方法。UbuntuGRUBCtl-P/Ctl-Nまたは^/v で項目移動、Enterで決定、ESCで抜ける。

デュアルブート時の注意。

今回は両方ともにGRUBを持ってるので、どっちがどっちGRUBを使っていて、今何処のGRUBから起動しているのか、ちゃんと意識してupdate-grub をする必要がある。

今回の構成は、あとからインストールしたUbuntuのGRUBをメインで使っている。DebianGrubは使われていない。しかし存在はしている。存在はしているので忘れないようにしておく。

切り替える場合の注意。

表示される。順番を変える話ではない。つかう GURBを切り替える話です。

sudo grub-install /dev/sda
sudo reboot

debiangrub-installすると

Debianで、grub-installをすると、DebianGRUBが起動に使用されるようになる。

Debian側で実行

Debianからみたディスクのマウント状況は以下の通り。

debianGRUBを登録

/dev/vda のBISO Boot PartitionにDebianGrubを登録する。

sudo grub-install /dev/sda
sudo reboot

再起動後

DebianGrubから起動している。

ubuntugrub-install すると

Ubuntu側で、grubを作り上書きし、grub-installをすると、UbuntuGRUBが使われる。

ubuntu側から見たマウント状況

Ubuntu側のGRUBを登録

sudo grub-install /dev/sda
sudo reboot

再起動後

DebianGRUBより、UbuntuGRUBが優先されて起動している。

上記GRUBの切り替えの留意点

GPT(MBR互換) / MBRのディスクの場合に限る

GPT / MBRの ディスクは、どのパーティションが「Bootable」であり、どのパーティションからブートするかのオーダーをフラグで管理している。そのフラグに/boot/grubの所有者が書きに行くのである。そのため、起動順が書き換わり、Bootするブロックデバイスが変わってくることになる。

個人的な感想でいえば、だるい。めっちゃめんどくさい仕様だ。だからEFIではこの辺を解消して/EFIパーティションというブート仕様専用のパーティションが設けられてそこを共有して使うことになっている。

ここまでの作業のまとめ

最初に、既存のDebianをつくっておき、Ubuntuインストーラーで追加インストールした。

続く

次回へつづく。 → rsync/ddコピーで作る

Linuxのマルチブートの作業ログ一覧

Linuxのマルチブートを作りたい。目的と手法

動機と目的

リモートから、ext4 のrepair や lvm のりサイズをやりたい。

デュアルブートにしておいて、いつでもFSCKをかけられるようにしておきたい。

そのため、GRUBメニューで起動するOSを切り替えたい。

いちいち、USB起動のディスクを差し込みに行くのがめんどくさいうえ、物理的に接触が必要で遠隔から操作できないのが不便極まりないのである。

リモートFSCKの実現手法

デュアルブート環境と、シリアルコンソール環境を併用し実現する。HDD内部を、複数のパーティションに分割し、OSを複数入れておく。GRUBは一つインストールする。GRUBメニューから起動OSを選ぶ。GRUB操作はシリアルコンソール経由で行う。シリアルコンソールはRaspiなどを使ってSSH経由でアクセスするようにしておく。

次のような接続を実現する。

作業マシンー<SSH>ー>Raspiー<シリアル>ー>PC(Debian,ubuntu )

このとき、PCをデュアルブートにしてGRUBメニューから切り替えて起動すれば、リモートからfsck や lvresizeのようなルートパーティションを操作するコマンドが使えるはずである。

デュアルブートでなく、緊急メンテナンスのroot を使えばいいかもしれない。resizeだったりパーティション切り直しだったり、リードオンリーだと不自由だった。リモートで完全に自由にサワれる環境が欲しかった。この実現にはデュアルブートが確実ではないかと考えた。そこでまずは、デュアルブートを作ることにした。

HDMIキャプチャでリモートKVMでもいいかとおもったけど維持管理がめんどくさそうだった。

BIOSをリモートから触れるIPMIとかでもいいかもしれないが、通常のPCが対応してるはずもなく。  

手元にあるものを組み合わせたらデュアルブートが安上がりっぽい。容量8GBほど確保すればいいだけし。

事前調査

デュアルブートを環境の作成方法を確認する。

linux の ブートは、/bootに書かれる。/bootは別パーティションに出来る。別パーティションにすることで、OSに依存を切り離せる。マルチブートが可能になる。

また、EFIがある場合はEFIパーティションを使うとEFIでOS依存をを切り離してマルチブートが可能になる。( EFIブートの作成例)

DebianUbuntuの場合はGRUBを使っている。ただし、UbuntuGrubメニューを隠蔽しているので、Ubuntuでマルチブートをする場合は、GRUBを変更してメニューを表示する必要がある。(設定例)。

ディスクの構成

今回、作成するディスクの構成は次のような感じにする。

takuya@ubuntu:~$ lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda             252:0    0   20G  0 disk
├─vda1          252:1    0    1M  0 part
├─vda2          252:2    0  998M  0 part
├─vda3          252:3    0    1G  0 part /boot
└─vda4          252:4    0   18G  0 part
  ├─vg0-u04root 253:0    0    3G  0 lvm  /
  └─vg0-d05root 253:1    0    3G  0 lvm

ポイントは、/boot が1つ、/が2つ。という点である。デュアルブートなので、一つのbootを複数のOSがシェアする形式にする。

さらに、UEFIをつかった構築についても考えていきたい。

デュアルブートの構築

デュアルブートを作成し、組み合わせを考慮し作成手段を、いくつかのレベルに分割して考えることにした。

いかの4ステップを試すことにした。

レベル1 インストーラーによる、デュアルブートの構築

簡単に言えば、CD-ROMでOS別にインストールを行う。2回インストをする方法だ。

レベル2 dd/dump/rsyncデュアルブート作成

インストール済みディスクのOSをddでコピーして grub再構築を試す。

rsync/ddでOS複製してデュアルブートを試す。

レベル3 UEFIGRUBメニューを試す。

EFIパーティションを持ったPCをつくり、EFIからGRUBを起動し、Grubメニューからマルチブートする

レベル4 EFIデュアルブート

EFIパーティションに複数のOSを登録に行き、efibootmgrから起動OSを切り替える。

GRUBメニューでデュアルブートの例

こんな感じにGRUBメニューでデュアルブートができることを目指します。

実験環境

実験環境でベアメタルな実PCを使うと時間も手間ももったいないので、KVM/QEMU仮想マシンを作って実験することにした。

kvm/qemu をそのまま使うと大変なので、libvirtd と virt-manager も用意した。

実際の構築

Linuxのマルチブートの作業ログ一覧

デュアルブートについて

OSブートにはMBR/GPT(MBR互換)とEFIパーティションの2つのブートシーケンスがあります。

MBR時代は、ブートパーティションをHDDに書いていました。grub-installコマンドをするとMBRを書き換えます。

EFIパーティションは、ブートをHDD内部のEFIパーティション(FAT)に書き込みに行き、UEFI側でブートOSを選択して起動します。

殆どの場合そのまま起動しますが、WindowsLinuxもOS選択機能があります。Linuxの場合はOS起動前にGRUBを起動して、カーネル起動のオプションを変更します。デュアルブートは古くからGRUBメニューでやるんでした。普段意識しないのですっかり忘れてました。UbuntuではGRUBメニューすら非表示のため存在すら忘れかけていました。

デュアルブート作成の目標地点

既存のOSがインストール済みのPCに、追加でOSをインストールすることを想定しています。

インストール時にブートを書き換えられたら困るのでマニュアルでOSをコピーし、ブート選択を修正する。これが目標です。

登場したコマンド

解説なく、コマンドが登場しまくるので、ここにまとめておきます、

GRUBの再インストール

GRUBをHDDのパーティションに書き込みます。

sudo grub-install 

未指定の場合は起動しているHDDです。

MBR/GPT(MGR互換)へのGRUB再インストール

sudo grub-insall /dev/vda

EFIへのGRUB登録

sudo grub-install --target=x86_64-efi

virsh でインストール・起動・停止・削除

仮想マシンをインストール・停止・削除する方法を覚えておくと作業が早い。

virsh でUbuntuインストール

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

virt-install仮想マシンのインストールができます。インストール時にCDーROMを指定しなくてもURL指定でインストールOSを指定できます。

ただし、フルパッケージCDーROMを使うほうが速いです。ローカルコピーで済むのでインストールが速いです。本当に速いです。

ネットワークから取得する場合はプロキシサーバーを挟んでロスを軽減するといいです。

速いネットワークを自宅に引き込んでいたとしても相手先サーバーの混雑があります。ローカル取得のほうがやっぱり速いんで。

停止

virsh shutdown $NAME # シャットダウン命令送信
virsh destroy $NAME # 強制停止

削除

virsh undefine $NAME
virsh undefine $NAME --nvram ## efi のとき

qemu-img でスナップショットを取る

virsh (libvirt)のスナップショットはメモリ管理がメインだと思う。今回のように、ディスク・パーティションをガンガン触るときにvirsh スナップショットは向いてない。

qemeu-img でディスク自体をスナップショットを取った方がいい

qemeu-img でスナップショット一覧

qemu-img snapshot -l name.qcow2

qemeu-img でスナップショットを作成

qemu-img snapshot -c pointA name.qcow2
qemu-img snapshot -c pointB name.qcow2

qemeu-img でスナップショットへ戻す

qemu-img snapshot -a pointA name.qcow2

仮想マシンにディスクを接続・切断

sudo virsh attach-disk  path/to/img myVM01 vdX
sudo virsh detach-disk  myVM01 vdX

ただし、qcow2を接続するときは次のようにする。

sudo virsh attach-disk \
  --domain $NAME \
  --source path/to/$DISL\
  --driver qemu\
  --subdriver qcow2\
  --targetbus virtio\
  vdb

OSのインストールを少しでも早く

試行錯誤とインストールを少しでも早くするために、キャッシュを使えばいい。ダウンロードしたISOイメージも速いです。とにかくインストールを少しでも早くすると作業能率があがり気軽に試せます。

APT-PROXYを用意しておく

http://172.17.0.1:3142

efibootmgr でEFIを管理する

EFIの起動順番を変える。

sudo efibootmgr -o 0004,0001

EFI起動メニューから指定番号を無効にする

sudo efibootmgr -A -b 0002 

EFI起動メニューから指定番号を有効化

sudo efibootmgr -a -b 0002 

ディスクを接続してChrootしてGRUB修正

GRUBミスったり飛ばしたら、慌てずにディスクのマウント状況を確認して、GRUBを再インストール・メニュー再構築しましょう。

chroot 後は仮想マシンのように扱える

sudo su
mount /dev/mapper/vg-root /mnt
cd /mnt
mount -t proc proc proc/
mount -t sysfs sys sys/
mount -o bind /dev dev/
mount -t devpts pts dev/pts/
chroot /mnt

Chrootの環境下でGRUB修正

root@chroot ~ : grub-install /dev/vga
root@chroot ~ : update-grub /dev/vga

sgdisk でディスク構成を作る

OSのインストール時に、インストール画面でディスクのフォーマット・パーティション作成をやっているとキリがないです。

初期化

sudo -E sgdisk -og $vda # 初期化 

状態表示

sudo -E sgdisk  -p $vda

パーティション作成

sudo -E sgdisk \
-n 1:2048:4095 -c 1:"BIOS Boot" -t 1:ef02  \
-n "2::+1G" -c 2:"GRUB" -t 2:8300 \
-n "3::+1G" -c 3:"swap" -t 3:8200 \
-n 4:0:$(sudo -E sgdisk -E $vda ) -c 4:"LVM" -t 4:8e00 \
$vda;

表示。

sudo -E sgdisk  -p $vda

gdisk コマンドで事前作成できるとは言え、Gdiskでディスクを毎回作っているとめんどくさいです、コピペで作業効率を改善します。そのためにsgdiskを活用します。

Linuxのマルチブートの作業ログ一覧

やってみて。

いまどきデュアルブートなんてと思ってました。ESXiあるしProxmoxもある。IPMIもある、Raspberryで自作リモートKVMもできる。とおもってた。

でもやってみたら、枯れた技術のシリアルコンソールとSSHが一番確実でした。LinuxLinuxのマルチブートをしておくと緊急メンテナンスがリモートで完結するし管理手法で新しいことを覚えなくていい。新しいことに興味がわかない年寄りには便利だ。

始めからDockerや仮想マシンでいいのだろうけど、その仮想マシンが載っかってるOS自体を更新するのがめんどくさかった。AWSなら常に最新のものをサクッと使えるけど、自宅に放置したPCでそれをやってると数年後にOS自体を更新するのがめんどくさかった。デュアルブートで解決できるんじゃないかなと。

関連記事

参考資料

ubuntu でGRUB2のメニューを出す。

ubuntu でGrub2のメニュー表示したい

UbuntuGrubメニューをだしたい。

UbuntuGRUB2は問題がある。

実は、ubuntu は「Grub2 メニューを隠す。」のです。気づかないと思う。知ってないとハマる。

ブート選択画面が邪魔なのはわかるが、メンテナンスやデュアルブートで、GRUBメニューがなく困る。

ubuntugrubメニューを表示する。

GRUB設定を次のように書き換える。

/etc/default/grub

GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=3

GRUB設定を反映する。

sudo update-grub

シリアルコンソールも有効にする。

さらに、シリアルコンソールを使う。 Grubメニューをシリアルコンソールにも表示したい。

/etc/default/grub

GRUB_TERMINAL="console serial"

GRUB設定を反映する。

sudo update-grub

kvm/qemu など仮想マシンvgaよりシリアル表示を使ってると思われる。

ちなみに、表示先は選べる。

### 両方とも
GRUB_TERMINAL="console serial"
### VGA のみ
GRUB_TERMINAL="console "
### シリアルコンソールのみ
GRUB_TERMINAL="serial"

シリアルコンソール経由だと、キーボードが反応しないとき、焦らずに、矢印キー以外を押しましょう ^ が上で、vが下で、Enterが決定です。

シリアルコンソールでUbuntuGrubメニュー表示例

ubuntuは注意が必要

ubuntuGRUBはシリアルコンソールに流してくれないどころか、そもそもGRUBを非表示にしている。

たしかに、初心者向だし、初心者に表示しても混乱を招くのは理解できる。分かってる人には問題ない。

ただし、ブートに関する学習機会が喪失してしまうの。知らないまま使うのが問題だと思う。

参考資料

kvm/qemuでCDROM内のカーネルを直接起動する。

kvm/qemu でCDROM内のカーネルを起動する

カーネルにオプションを渡して起動したい。シリアルコンソールで画面を出したい。と思った。virt-manager でどうやるのか、virt-install 起動時にどうするか、迷ったのでメモを残す。

virt-manager の画面での指定。

次のように、カーネルのファイルを指定する。

これで起動ができる。起動だけなので、インストールはCD-ROMを差し込む必要がある。

マウントの例

CD-ROMをマウントして

mkdir mnt 
sudo mount -t iso9660 -o loop,ro debian-11.2.0-amd64-netinst.iso mnt 

フルパスを取得する

realpath mnt/install.amd/vmlinuz
realpath mnt/install.amd/initrd.gz

これで準備ができた。

指定した引数。

  • カーネル/var/lib/libvirt/images/mnt/install.amd/vmlinuz
  • init /var/lib/libvirt/images/mnt/install.amd/initrd.gz
  • 引数 console=tty0 console=ttyS0,115200n8

フルパスをvirt-manager で指定する。

準備ができたので、それを仮想マシンに指定する。

これで、問題なく起動できる。

インストールするときは、CD-ROMも渡す

インストール時には、インストールデータを取得するが、カーネルをCD-ROM内部を使っているので、インストールデータもCD-ROMから取ってきたほうが無難

ということで、CD-ROMも仮想マシンに接続する。

これで、無事にインストールが始まる。

全部コマンドラインでやるには

上記の手順を、すべてコマンドから行い、インストールもコマンドから行うには次のように、virt-install を使う。ディスクにCD-ROMもしていする。カーネルもinitrdも指定する。

コマンドの例

mkdir mnt 
sudo mount -t iso9660 -o loop,ro debian-11.2.0-amd64-netinst.iso mnt 

kernel=$( realpath mnt/install.amd/vmlinuz )
initrd=$( realpath  mnt/install.amd/initrd.gz )
kernel_args="console=tty0 console=ttyS0,115200n8"

virt-install \
 --connect=qemu:///system  \
 --name d05  \
 --ram 8192  \
 --vcpus 8  \
 --disk path=/var/lib/libvirt/images/d05.qcow2  \
--disk /var/lib/libvirt//images/debian-11.2.0-amd64-netinst.iso,device=cdrom,bus=ide
 --virt-type kvm  \
 --os-type linux  \
 --os-variant debian10  \
 --graphics none \
 --install \
kernel=${kernel},initrd=${initrd},kernel_args_overwrite=yes,kernel_args="${kernel_args}"           

シリアルコンソールを指定しているので、このままインストールがSSH経由のコマンドラインで開始する。preseedや cloud-initを使って無人インストールも可能だ。

ネットワークから取得する場合

ネットワークからインストーラーを取得する場合なら、location だけで行ける

location でネットワークからインストーラーを取得すればいい。

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

CD-ROMの場合に比べてずいぶんシンプルですね。CD-ROMのほうがコピーで済むので早い気もするが、マウントなどが不要なので、確実なのはネットワークから取得したほうがいい気もする。

カーネルを直接起動する理由

なぜこんなことをしているかというと、シリアルコンソール(ttyS0)を使いたいから。

グラフィック起動でインストールするとコピペが面倒なのです。

まとめ

次の引数いれて、カーネル直接起動ができる。

  • カーネル/var/lib/libvirt/images/mnt/install.amd/vmlinuz
  • init /var/lib/libvirt/images/mnt/install.amd/initrd.gz
  • 引数 console=tty0 console=ttyS0,115200n8

vmlinuz / initrd.gz は、CD-ROMをマウントすれば取れる。

マウントは、is9600を使う。

sudo mount -t iso9660 -o loop,ro debian-11.2.0-amd64-netinst.iso mnt 

GnomeのDocuments/Downloads は使わないので見えなくしたい。

Documents/Downloads は使わないので見えなくしたい。

GNOMEデスクトップのフォルダって使用頻度が低い。

takuya@:~$ ls -l
合計 100
drwxr-xr-x  2 takuya   takuya   4096 11月 18  2021 Desktop
drwxr-xr-x  2 takuya   takuya   4096 11月 18  2021 Documents
drwxr-xr-x  2 takuya   takuya   4096  9月 21 02:50 Downloads
drwx------  5 takuya   takuya   4096  9月  1 04:02 Maildir
drwxr-xr-x  2 takuya   takuya   4096 11月 18  2021 Music
drwxr-xr-x  2 takuya   takuya   4096 11月 18  2021 Pictures
drwxr-xr-x  2 takuya   takuya   4096 11月 18  2021 Public
drwxr-xr-x  2 takuya   takuya   4096 11月 18  2021 Templates
drwxr-xr-x  2 takuya   takuya   4096 11月 18  2021 Videos

正直言って使わないので、何処か別のフォルダに移動したい。

SSH経由で見えなくしたい。

SSH経由で見えなればいいので、ドット始まりのファイルにしてしまえば、僕の悩みはとりあえず解決する。

僕の目標は、次を実現しSSHで見えないようにする。

~/Music => ~/.Music

単純に移動しただけでは、不意なタイミングで再生成されてるので、設定を変える。

設定を変更

Public を移動する場合を考える

Public-> .Public にする手順は、次の通り

  • XDG_PUBLICSHARE_DIR="$HOME/.Public" に書き換え
  • ~/.Public/ を作成
  • xdg-user-dirs-update を実行

コマンド例

コマンドは、次のような感じ

sed 's|/Public|.Public|'  ~/.config/user-dirs.dirs
mv Public/ .Public/
LANG=C xdg-user-dirs-update

他のもまとめてやるなら for で回せばいい。

Public / Music / Document / Videos / Templates をまとめて非表示フォルダに放り込む場合はこんな感じ?

for i in (Public Music Document Videos Templates ); do 
    sed   -i "s|/$i|.$i|"  ~/.config/user-dirs.dirs
    mv $i/ .$i/
done 
LANG=C xdg-user-dirs-update

もと設定に戻したい場合

削除して、設定を元に戻すなら、次のような感じ

rm ~/.config/user-dirs.dirs
LANG=C xdg-user-dirs-update --force 

設定を変更したフォルダ( ~/.Music ) などは削除されない

Gnomeで見るとおかしなことに。

GNOMEで見ると、ちょっとおかしなことになる。GNOMEはそこまで頻繁に使わないので我慢することにする。

根本的に隠したいときは、Gnome 拡張を使う必要があると思う。

ディレクトリだけをls する、ファイルだけをls するの逆

ディレクトリだけをls する、ファイルだけをls する

ディレクトリ中のディレクトリだけを調べたい。

自分自身のディレクトリに限定

これは、指定したパスがディレクトリのときだけ応答される。

ls -d  /var

ワイルドカードと組み合わせ

ワイルドカードで指定したうえで、末尾にスラッシュをつけておけば、ディレクトリを取り出せる。上記のディレクトリに限定する ls を使えば、ディレクトリだけを取り出せる。

ls -d /var/*/

別解:パスにして、スラッシュでgrep

一番簡単かもしれない。パスで表示してgrep で 末尾のスラッシュに限定する。

ls -F | grep -E '/$'

-F はパスで表示する、ディレクトリとファイルを/つきで表示して区別する。

-F が一番便利かもしれないし、alias ls に含まれていることも多い

参考資料

https://askubuntu.com/questions/811210/how-can-i-make-ls-only-display-files

ディレクトリがマウントされているか調べる

ディレクトリがマウントされているか調べる

お困りごと

mount コマンドを使ってマウントチェックすると、未マウント時にmountされてしまう。

なので、代わりにmountpoint コマンドを使う。

mountpoint コマンド

takuya@:~$ mountpoint /home
/home is a mountpoint
takuya@:~$ mountpoint /home/takuya
/home/takuya is not a mountpoint

mountpoint コマンドでマウント先のパスを指定すると、そのパスがマウントされているか調べることが出来る。

bash の if 文の判定にも使える。

mountpoint のコマンドは、マウントされているか調べて、Exitコードを返してくれる。マウントされていたら0が、未マウントなら1(>0)が返される。

マウントされているとき

takuya@:~$ mountpoint /home/takuya ;echo $?
/home/takuya is not a mountpoint
1

マウントされてないとき

takuya@:~$ mountpoint /home/ ;echo $?
/home/ is a mountpoint
0

実例

実際に試してみたら次のようになっている。

参考資料