TenForward

技術ブログ。はてなダイアリーから移転しました

LXDのシステムコールインターセプション機能を試す(マウント編)

前回、LXD のシステムコールインターセプション機能がうまく動いたので調子に乗って引き続き試します。

tenforward.hatenablog.com

この機能には色々できることがあって今後も追加されそうな気がしますが、とりあえずは見た目でパッとわかりやすいファイルシステムのマウントを試してみましょう。

お試し環境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" という設定だけが効いてないようなのですが、今日は力尽きました。引き続き調べます。

(つづく)