見出し画像

マウント名前空間機能を触ってみる

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はマウントされていません
つまり、異なるマウント名前空間をもつプロセスのマウント状態は他のプロセスに反映されないことがわかります。
イメージとして示すと以下のようになります。

画像1

マウント名前空間のイメージ

まとめ

今回はマウント名前空間について学びました。マウント名前空間については、dockerにおけるボリューム管理に深く関係しています。

次回はユーザ名前空間か、ネットワーク名前空間についての試行。またはdockerがどのようにして外部からのアクセスを受け入れているのかについて解説しようと思います。


参考文献

Linuxでサイズ指定してダミーファイルを作成する方法
losetupとddでダミーファイルを作ってHDD操作の練習をする
LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術 第2回 コンテナの仕組みとLinuxカーネルのコンテナ機能[1]名前空間とは?

この記事が気に入ったらサポートをしてみませんか?