前回、LXD のシステムコールインターセプション機能がうまく動いたので調子に乗って引き続き試します。
この機能には色々できることがあって今後も追加されそうな気がしますが、とりあえずは見た目でパッとわかりやすいファイルシステムのマウントを試してみましょう。
お試し環境は Ubuntu 20.04 LTS のベータ版です。
ホスト環境に 1GB のディスクを追加しています(/dev/vdb
)。これは別に不要なのですが、そのディスク上に /dev/vdb1
というパーティションをひとつ作成します。
$ sudo fdisk -l /dev/vdb [sudo] password for karma: Disk /dev/vdb: 1 GiB, 1073741824 bytes, 2097152 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: dos Disk identifier: 0x74374d12 Device Boot Start End Sectors Size Id Type /dev/vdb1 2048 2097151 2095104 1023M 83 Linux
まずはコンテナにこのブロックデバイスを追加する必要があります。でないとコンテナ内でデバイスを指定して mount コマンドを実行できません。
$ lxc config device add c1 vdb unix-block path=/dev/vdb Device vdb added to c1 $ lxc config device add c1 vdb1 unix-block path=/dev/vdb1 Device vdb1 added to c1
パーティションを切ってるので上のふたつを追加しました。/dev/vdb1
をコンテナ内でマウントするだけなら上記の vdb1
だけを追加すれば良いと思います。ホスト上と同じように fdisk
が実行できるようにするために vdb
も登録しています。
$ lxc config show c1 :(snip) devices: vdb: path: /dev/vdb type: unix-block vdb1: path: /dev/vdb1 type: unix-block :(snip)
このように追加されています。コンテナを起動すると次のようにデバイスファイルが作成されているのがわかります。fdisk でもちゃんとパーティションが見えています。
$ lxc shell c1 mesg: ttyname failed: No such device root@c1:~# cat /proc/self/{u,g}id_map (非特権であることを確認) 0 1000000 1000000000 0 1000000 1000000000 root@c1:~# ls -l /dev/vdb* brw-rw---- 1 root root 252, 16 Apr 12 13:16 /dev/vdb brw-rw---- 1 root root 252, 17 Apr 12 13:16 /dev/vdb1 root@c1:~# fdisk -l /dev/vdb Disk /dev/vdb: 1 GiB, 1073741824 bytes, 2097152 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: dos Disk identifier: 0x74374d12 Device Boot Start End Sectors Size Id Type /dev/vdb1 2048 2097151 2095104 1023M 83 Linux
これだけでは mount できません。非特権コンテナなので当たり前です。
oot@c1:~# mount /dev/vdb1 /mnt mount: /mnt: permission denied.
ここで mount ができるように設定しましょう。
$ lxc config set c1 security.syscalls.intercept.mount true $ lxc config set c1 security.syscalls.intercept.mount.shift true $ lxc config set c1 security.syscalls.intercept.mount.allowed ext4 $ lxc config show c1 :(snip) security.syscalls.intercept.mount: "true" security.syscalls.intercept.mount.allowed: ext4 security.syscalls.intercept.mount.shift: "true" :(snip)
コンテナを再起動します。
$ lxc restart c1 $ lxc shell c1 mesg: ttyname failed: No such device root@c1:~# mount /dev/vdb1 /mnt root@c1:~# df -h /mnt Filesystem Size Used Avail Use% Mounted on /dev/vdb1 991M 2.6M 922M 1% /mnt
mount できました。
ここで security.syscalls.intercept.mount.shift: "true"
という設定だけが効いてないようなのですが、今日は力尽きました。引き続き調べます。
(つづく)