sshの公開鍵認証専用のユーザを作成
sshの公開鍵認証でしかログインできないユーザを作成してみる。
まずはユーザ user-a
を作成する(必要なオプションは適当に指定)。
# useradd -m user-a
user-a
をロックする。
# passwd -l user-a
この段階で、コンソールからログインしようとしても
Login incorrect
となってログインできない。
sshの公開鍵認証でのログインに必要なファイルを準備する。
# su -l user-a $ mkdir -m 700 .ssh $ ls -ld .ssh drwx------ 2 user-a user-a 4096 May 27 16:37 .ssh $ touch .ssh/authorized_keys $ chmod 600 .ssh/authorized_keys $ ls -l .ssh/authorized_keys -rw------- 1 user-a user-a 0 May 27 16:39 .ssh/authorized_keys
ログインに使いたいssh公開鍵を登録する。
$ cat >> .ssh/authorized_keys 公開鍵を入力 ^D $ exit
リモートからsshでログインしてみる。
remote$ ssh user-a@host
公開鍵認証でログインできた!
KVMのLVMベースのストレージプールの作成
KVMでLVMベースのストレージプールを作ってデフォルトにしてみる。
LVMベースのストレージプールは、基本的に(通常の方法では)シンプロビジョニングは使えないが、性能面では有利らしい。
一番最初に、LVMベースのストレージプールに対応しているか確認。
$ export LIBVIRT_DEFAULT_URI='qemu:///system' $ virsh pool-capabilities | grep "'logical' supported='yes'" <pool type='logical' supported='yes'>
次に、現在定義されているストレージプールを確認。
$ virsh pool-list --all Name State Autostart ------------------------------------ default active yes
既に(使っていない)default
プールが存在している場合は先に削除する。
$ virsh pool-destroy default Pool default destroyed $ virsh pool-undefine default Pool default has been undefined
空のディスク/dev/sdb
に、VG vg_kvm
として、
default
ストレージプールを作成する。
意味はマニュアルを参照。
$ virsh pool-define-as default logical --source-dev /dev/sdb --source-name vg_kvm Pool default defined $ virsh pool-build default Pool default built # pvs PV VG Fmt Attr PSize PFree /dev/sdb vg_kvm lvm2 a-- <931.00g <931.00g # vgs VG #PV #LV #SN Attr VSize VFree vg_kvm 1 0 0 wz--n- <931.00g <931.00g $ virsh pool-list --all Name State Autostart ------------------------------- default inactive no
PVとVGが作成され、ストレージプールが作成されている。
作成したストレージプールを起動する。
$ virsh pool-start default Pool kvm_pool_lvm started
続いて、ストレージプールの自動起動を設定する。
$ virsh pool-autostart default Pool kvm_pool_lvm marked as autostarted
正しく作成できているか確認。
$ virsh pool-list --all Name State Autostart ------------------------------- default active yes $ virsh pool-info default Name: default UUID: aaad3421-ed6d-44ba-bc81-494521be5061 State: running Persistent: yes Autostart: yes Capacity: 931.00 GiB Allocation: 0.00 B Available: 931.00 GiB
ボリュームを作ってみる。
$ virsh vol-create-as default test 10G Vol test created $ virsh vol-list default --details Name Path Type Capacity Allocation ----------------------------------------------------------- test /dev/vg_kvm/test block 10.00 GiB 10.00 GiB # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert test vg_kvm -wi-a----- 10.00g
LVMベースのストレージプールをdefault
としてボリュームが作成できた!
LVMでのシンプロビジョニング論理ボリュームの作成 2
前回の続き。
実際にシンプロビジョニング論理ボリュームを使ってみる。
まずは、ファイルシステムを作成してマウントする。
# mkfs.ext4 /dev/vg01/thinvolume01 # mkfs.ext4 /dev/vg01/thinvolume02 # mkdir /mnt/thinvolume01 /mnt/thinvolume02 # mount /dev/vg01/thinvolume01 /mnt/thinvolume01 # mount /dev/vg01/thinvolume02 /mnt/thinvolume02
この段階で容量確認。
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root debian-vg -wi-ao---- <8.36g swap_1 debian-vg -wi-ao---- 976.00m thinpool vg01 twi-aotz-- 1.00g 9.56 12.30 thinvolume01 vg01 Vwi-aotz-- 1.00g thinpool 4.78 thinvolume02 vg01 Vwi-aotz-- 1.00g thinpool 4.78
次に、ddでthinvolume01
に400 MiBのファイルを作成してみる。
# dd if=/dev/zero of=/mnt/thinvolume01/test bs=1M count=400 400+0 records in 400+0 records out 419430400 bytes (419 MB, 400 MiB) copied, 0.204323 s, 2.1 GB/s # sync # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root debian-vg -wi-ao---- <8.36g swap_1 debian-vg -wi-ao---- 976.00m thinpool vg01 twi-aotz-- 1.00g 48.62 16.89 thinvolume01 vg01 Vwi-aotz-- 1.00g thinpool 43.84 thinvolume02 vg01 Vwi-aotz-- 1.00g thinpool 4.78
thinvolume01
で43.84%が使われており、thinpool
全体で48.62%が使われていることが分かる。
次に、同じくthinvolume02
にも400 MiBのファイルを作成してみる。
# dd if=/dev/zero of=/mnt/thinvolume02/test bs=1M count=400 400+0 records in 400+0 records out 419430400 bytes (419 MB, 400 MiB) copied, 0.225232 s, 1.9 GB/s # sync # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root debian-vg -wi-ao---- <8.36g swap_1 debian-vg -wi-ao---- 976.00m thinpool vg01 twi-aotz-- 1.00g 87.68 21.78 thinvolume01 vg01 Vwi-aotz-- 1.00g thinpool 43.84 thinvolume02 vg01 Vwi-aotz-- 1.00g thinpool 43.84
thinpool
全体の使用率が87.68%になった。
ここで、さらにthinvolume02
に200 MiBのファイルを作成して、thinpool
の上限を超えさせてみる。
# dd if=/dev/zero of=/mnt/thinvolume02/over bs=1M count=200 200+0 records in 200+0 records out 209715200 bytes (210 MB, 200 MiB) copied, 0.0784244 s, 2.7 GB/s # sync
sync
で時間が異常に掛かるが一見何事もなく戻ってくる。
しかし、/var/log/syslog
には
debian lvm[7682]: WARNING: Thin pool vg01-thinpool-tpool data is now 100.00% full. debian kernel: [14173.012984] device-mapper: thin: 253:4: switch ing pool to out-of-data-space (error IO) mode
と出たあと、
debian kernel: [14173.013028] EXT4-fs warning (device dm-7): ext 4_end_bio:345: I/O error 3 writing to inode 13 starting block 182256)
や
debian kernel: [14173.014082] Buffer I/O error on dev dm-7, logi cal block 32897, lost async page write debian kernel: [14173.014525] EXT4-fs error (device dm-7): ext4_check_bdev_write_error:215: comm kworker/u2:1: Error while async write back metadata debian kernel: [14173.031246] buffer_io_error: 20470 callbacks suppressed
といったエラーが表示されている。
論理ボリュームの状態を確認してみる。
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root debian-vg -wi-ao---- <8.36g swap_1 debian-vg -wi-ao---- 976.00m thinpool vg01 twi-aotzD- 1.00g 100.00 23.63 thinvolume01 vg01 Vwi-aotz-- 1.00g thinpool 43.84 thinvolume02 vg01 Vwi-aotz-- 1.00g thinpool 56.16
ファイルシステムとしては空き容量があると思っているのに、デバイスには書き込めないので、こういう挙動になるようだ。
オーバーコミットは便利だが、シンプールの残容量には注意が必要ということが分かった!
LVMでのシンプロビジョニング論理ボリュームの作成 1
LVMでシンプロビジョニングの論理ボリュームを作ってみる。
まず必要なパッケージがインストールされていない場合はインストールする。
Debianの場合
# apt install thin-provisioning-tools
Red Hatのドキュメントを参考に進める。
空きのあるVG(ここではvg01
)に、1 GBのシンプール thinpool
を作成する。
# lvcreate -L 1G -T vg01/thinpool Thin pool volume with chunk size 64.00 KiB can address at most 15.81 TiB of da ta. Logical volume "thinpool" created. # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%S ync Convert root debian-vg -wi-ao---- <8.36g swap_1 debian-vg -wi-ao---- 976.00m thinpool vg01 twi-a-tz-- 1.00g 0.00 10.94
続いて、今作ったシンプール vg01/thinpool
に、1 GBのシンボリューム thinvolume01
を作成する。
# lvcreate -V 1G -T vg01/thinpool -n thinvolume01 Logical volume "thinvolume01" created. # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root debian-vg -wi-ao---- <8.36g swap_1 debian-vg -wi-ao---- 976.00m thinpool vg01 twi-aotz-- 1.00g 0.00 11.04 thinvolume01 vg01 Vwi-a-tz-- 1.00g thinpool 0.00
同じシンプール vg01/thinpool
に、さらに、1 GBのシンボリューム thinvolume02
を作成する。
# lvcreate -V 1G -T vg01/thinpool -n thinvolume02 WARNING: Sum of all thin volume sizes (2.00 GiB) exceeds the size of thin pool vg01/thinpool and the size of whole volume group (<2.00 GiB). WARNING: You have not turned on protection against thin pools running out of space. WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full. Logical volume "thinvolume02" created.
シンボリュームの合計サイズが、シンプールのサイズを超えているという警告は出るものの、論理ボリュームは作成された。
論理ボリュームの一覧を確認してみる。
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root debian-vg -wi-ao---- <8.36g swap_1 debian-vg -wi-ao---- 976.00m thinpool vg01 twi-aotz-- 1.00g 0.00 11.13 thinvolume01 vg01 Vwi-a-tz-- 1.00g thinpool 0.00 thinvolume02 vg01 Vwi-a-tz-- 1.00g thinpool 0.00
LVMでオーバーコミットした論理ボリュームが作成できた!
KVMの稼働中VMにディスクのオンライン追加
ディスクのイメージファイルを作成してVMにアタッチする。
host$ dd if=/dev/zero of=vdb.img bs=1M seek=2048 count=0 host$ virsh attach-disk kvmdom --source $PWD/vdb.img --target vdb
VM側でディスク追加を確認する。
host$ virsh console kvmdom kvmdom# fdisk -l /dev/vdb Disk /dev/vdb: 2 GiB, 2147483648 bytes, 4194304 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
追加したディスクにLVMの論理ボリュームを作成する。
kvmdom# pvcreate /dev/vdb Physical volume "/dev/vdb" successfully created. kvmdom# pvs PV VG Fmt Attr PSize PFree /dev/vda5 kvmdom-vg lvm2 a-- <15.52g <6.21g /dev/vdb lvm2 --- 2.00g 2.00g kvmdom# vgcreate vg01 /dev/vdb Volume group "vg01" successfully created kvmdom# vgs VG #PV #LV #SN Attr VSize VFree kvmdom-vg 1 2 0 wz--n- <15.52g <6.21g vg01 1 0 0 wz--n- <2.00g <2.00g kvmdom# lvcreate -n ext -L 1G vg01 Logical volume "ext" created. kvmdom# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root kvmdom-vg -wi-ao---- <8.36g swap_1 kvmdom-vg -wi-ao---- 976.00m ext vg01 -wi-a----- 1.00g
VMにオンラインでディスクを追加して論理ボリュームが作成できた!
Debian bullseye (RC1)のインストール練習 5 〜自動パーティション構成〜
標準ではないパーティション構成を自動で作成してみる。
今回は敢えて変な構成でパーティションを作成する。
ドライブ
LVMボリュームグループ
- vdb:
/boot
,/boot/efi
以外全部をVGvg00
で使用 - vda: 10 GBをVG
vg01
で使用
LVM論理ボリューム
- vg00
- / - 8 GB
- /var - 4 GB
- 空き - 残り
- vg01
- /home - vg01全部
- swapパーティションなし
まずはpreseed.cfg
ファイルを準備。
自動パーティショニングに関連する部分。
# 使用するドライブ(デバイス) d-i partman-auto/disk string /dev/vdb /dev/vda # LVMを利用 d-i partman-auto/method string lvm d-i partman-auto-lvm/guided_size string max # recipeファイルを指定 d-i partman-auto/expert_recipe_file string /recipe # UEFI/GPTを利用 d-i partman-efi/non_efi_system boolean true d-i partman-partitioning/choose_label string gpt d-i partman-partitioning/default_label string gpt # swapパーティションなしでも確認しない d-i partman-basicfilesystems/no_swap boolean false # フォーマット未指定パーティションありでも確認しない d-i partman-basicmethods/method_only boolean false
partman用のrecipeファイルを ドキュメントや ソースを参考に作成する。
lvm_two_drive :: 538 538 1075 free $iflabel{ gpt } $reusemethod{ } method{ efi } format{ } . 5000 5000 -1 ext4 $defaultignore{ } $primary{ } method{ lvm } device{ /dev/vdb } vg_name{ vg00 } . 512 512 768 ext2 $defaultignore{ } device{ /dev/vdb } method{ format } format{ } use_filesystem{ } filesystem{ ext2 } mountpoint{ /boot } . 8000 1 8000 $default_filesystem $lvmok{ } in_vg{ vg00 } method{ format } format{ } use_filesystem{ } $default_filesystem{ } mountpoint{ / } . 4000 1 4000 $default_filesystem $lvmok{ } in_vg{ vg00 } method{ format } format{ } use_filesystem{ } $default_filesystem{ } mountpoint{ /var } . 1 10000 -1 free $lvmok{ } in_vg{ vg00 } method{ keep } . 10000 10000 10000 ext4 $defaultignore{ } $primary{ } method{ lvm } device{ /dev/vda1 } vg_name{ vg01 } . 5000 1 10000 free $lvmok{ } in_vg{ vg01 } method{ format } format{ } use_filesystem{ } $default_filesystem{ } mountpoint{ /home } . 5000 1 -1 ext4 $defaultignore{ } $primary{ } method{ lvm } device{ /dev/vda2 } vg_name{ dummy } .
なお、partmanでは空き容量は全てパーティションに割り振ってしまうので、空きを作りたい場合はダミーのパーティションを作成しておいて、インストール後に削除する必要がある。
virt-installでインストールする。
- vda.img, vdb.imgの2個のディスクを作成
- initrd-injectで
preseed.cfg
ファイルとrecipe
ファイルを利用
host$ virt-install --name debian --memory 4096 --vcpus 1 --location $PWD/debian-bullseye-DI-rc1-amd64-netinst.iso --os-variant debiantesting --disk path=vda.img,size=20,format=qcow2 --disk path=vdb.img,size=16,format=qcow2 --network network=default --graphics none --serial pty --console pty --initrd-inject preseed.cfg --initrd-inject recipe --extra-args 'console=ttyS0,115200n8 serial'
自動でインストール完了。
ただ、そのままだと、1番目のディスク (vda.img) から起動しようとしてしまいOSが起動しないので、記事「KVMのブートドライブ変更」と同様に起動ドライブを変更する。
host$ virsh destroy debian host$ virsh edit debian
debian# fdisk -l /dev/vda /dev/vdb Disk /dev/vda: 20 GiB, 21474836480 bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: A682AD80-3822-40C3-B683-9F552A752B6F Device Start End Sectors Size Type /dev/vda1 2048 19531775 19529728 9.3G Linux LVM /dev/vda2 19531776 41940991 22409216 10.7G Linux LVM Disk /dev/vdb: 16 GiB, 17179869184 bytes, 33554432 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: 5F3C0AC9-B022-4EE4-A8ED-0A19E0D46072 Device Start End Sectors Size Type /dev/vdb1 2048 1050623 1048576 512M Linux filesystem /dev/vdb2 1050624 2050047 999424 488M Linux filesystem /dev/vdb3 2050048 33552383 31502336 15G Linux LVM debian# pvscan PV /dev/vdb3 VG vg00 lvm2 [<15.02 GiB / 0 free] PV /dev/vda2 VG dummy lvm2 [10.68 GiB / 10.68 GiB free] PV /dev/vda1 VG vg01 lvm2 [<9.31 GiB / 0 free] Total: 3 [35.01 GiB] / in use: 3 [35.01 GiB] / in no VG: 0 [0 ] debian# lvscan ACTIVE '/dev/vg00/root' [<7.45 GiB] inherit ACTIVE '/dev/vg00/var' [3.72 GiB] inherit ACTIVE '/dev/vg00/keep_1' [<3.85 GiB] inherit ACTIVE '/dev/vg01/home' [<9.31 GiB] inherit debian# df Filesystem 1K-blocks Used Available Use% Mounted on udev 1995216 0 1995216 0% /dev tmpfs 402588 512 402076 1% /run /dev/mapper/vg00-root 7588516 603708 6577872 9% / tmpfs 2012924 0 2012924 0% /dev/shm tmpfs 5120 0 5120 0% /run/lock /dev/vdb2 481642 48558 408099 11% /boot /dev/mapper/vg01-home 9504960 40 9000500 1% /home /dev/mapper/vg00-var 3761336 156808 3392972 5% /var /dev/vdb1 523244 4 523240 1% /boot/efi
予定通りのパーティションが自動で作成できた!
ダミーのパーティションを削除する。
debian# lvremove -y /dev/vg00/keep_1 Logical volume "keep_1" successfully removed debian# vgremove -y dummy Volume group "dummy" successfully removed debian# pvremove /dev/vda2 Labels on physical volume "/dev/vda2" successfully wiped.
結論!凝ったパーティション構成にしたい場合は、インストール後に手動で作った方が早い!
KVMのブートドライブ変更
KVMで最初のディスクドライブ以外からブートさせてみる。
libvirtのドキュメントを参考に、 対象VM(ここではkvmdom)のXMLファイルを書き換える。
$ virsh edit kvmdom
<os> <type arch='x86_64' machine='pc-q35-4.2'>hvm</type> - <boot dev='hd'/> </os> ... <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='.../vdb.img'/> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/> + <boot order='1'/> </disk>
os
要素からboot
要素を削除し、ブートさせたいdisk
要素にorder
属性付きのboot
要素を追加する。
実際に起動してみる。
$ virsh start --console kvmdom
2番目のディスクドライブ (vdb) から起動できた!