作業ログ源泉垂れ流し

しがないIT技術者の作業ログを垂れ流す

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にディスクのオンライン追加

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以外全部をVG vg00で使用
  • vda: 10 GBをVG vg01で使用

LVM論理ボリューム

まずは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

VMを起動してパーティション構成を確認。

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) から起動できた!