マウント名前空間機能を触ってみる
Linuxにはcgroupや名前空間といった機能があり、Dockerではこれらを利用することで隔離された空間やリソースの分離機能を実現しています。
Linuxにおける名前空間
プロセスに対して様々な領域における隔離空間を提供するための機能です。以下のような機能で名前空間を提供しています。
・マウント名前空間
・UTS名前空間(ホスト名・ドメイン名)
・PID名前空間
・IPC名前空間(IPCオブジェクト・POSIXメッセージキュー)
・ユーザ名前空間(UID・GID)
・ネットワーク名前空間(ネットワークデバイス・アドレス・ポート・ルートテーブル・フィルタ)
今回は、マウント名前空間について触ってみて理解を深めていきましょう
マウント名前空間を触るための前準備
fallocateコマンドを使って空ファイルを作ります。
$ fallocate -l 200M sample_disk_01.img
$ ls -lah
total 200M
drwxr-x---. 2 ec2-user ec2-user 32 Feb 11 09:03 .
drwxr-x---. 5 ec2-user ec2-user 169 Feb 11 09:03 ..
-rw-r-----. 1 ec2-user ec2-user 200M Feb 11 09:03 sample_disk_01.img
空ファイルの作成
次にこれをlosetupコマンドでループデバイスとします。
$ sudo losetup -f ./sample_disk_01.img
$ sudo losetup -a
/dev/loop0: [66305]:97576 (/home/ec2-user/docker/sample_disk_01.img
losetupを使ったファイルのループデバイス化
sample_disk_01.imgファイルを/dev/loop0に出来ました。このデバイスファイル(/dev/loop0)をext4でフォーマットします。
$ sudo mkfs -t ext4 /dev/loop0
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
51200 inodes, 204800 blocks
10240 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33816576
25 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
/dev/loop0をext4でフォーマット
動作確認のためマウントします。
$ sudo mount -t ext4 /dev/loop0 /mnt
$ sudo mount | grep /dev/loop0
/dev/loop0 on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
/dev/loop0の/mntへのマウント(動作確認)
無事マウントできました。
アンマウントして元に戻します。
$ sudo umount /mnt
$ sudo mount | grep /dev/loop0
$
アンマウント(片付け)
マウント空間のプロセスへの割当
ここからはシェルAとシェルBを使っていきます。
では、新しいマウント名前空間をプロセスに割り当ててみましょう。シェルAでunshareコマンドを使って新しいマウント名前空間を割り当てたプロセスを立ち上げます。
$ sudo unshare --mount /bin/bash
マウント名前空間の作成
/dev/loop0を/mntにマウントします。
$ mount -t ext4 /dev/loop0 /mnt
$ mount | grep /dev/loop0
/dev/loop0 on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p1 8.0G 1.4G 6.7G 17% /
devtmpfs 462M 0 462M 0% /dev
tmpfs 479M 0 479M 0% /dev/shm
tmpfs 479M 0 479M 0% /sys/fs/cgroup
tmpfs 479M 460K 479M 1% /run
tmpfs 96M 0 96M 0% /run/user/0
tmpfs 479M 0 479M 0% /tmp
/dev/loop0 190M 1.6M 175M 1% /mnt # マウントされている
/dev/loop0のマウントとマウント結果の確認
シェルB(プロセス)からマウント状態を確認してみます。
$ mount | grep /dev/loop0
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 462M 0 462M 0% /dev
tmpfs 479M 0 479M 0% /dev/shm
tmpfs 479M 460K 479M 1% /run
tmpfs 479M 0 479M 0% /sys/fs/cgroup
/dev/nvme0n1p1 8.0G 1.4G 6.7G 17% /
tmpfs 479M 0 479M 0% /tmp
tmpfs 96M 0 96M 0% /run/user/0
他プロセスからのマウント状態の確認
シェルBのプロセスでは、/dev/loop0はマウントされていません。
つまり、異なるマウント名前空間をもつプロセスのマウント状態は他のプロセスに反映されないことがわかります。
イメージとして示すと以下のようになります。
マウント名前空間のイメージ
まとめ
今回はマウント名前空間について学びました。マウント名前空間については、dockerにおけるボリューム管理に深く関係しています。
次回はユーザ名前空間か、ネットワーク名前空間についての試行。またはdockerがどのようにして外部からのアクセスを受け入れているのかについて解説しようと思います。
参考文献
・Linuxでサイズ指定してダミーファイルを作成する方法
・losetupとddでダミーファイルを作ってHDD操作の練習をする
・LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術 第2回 コンテナの仕組みとLinuxカーネルのコンテナ機能[1]名前空間とは?
この記事が気に入ったらサポートをしてみませんか?