参考資料
・カーネルドキュメント Overlay Filesystem
・overlayfsのメインラインコミット overlay filesystem
手順
Fedora22 Serverをインストールして、まずは最新パッケージにアップデートします。
# dnf -y update # reboot # cat /etc/fedora-release Fedora release 22 (Twenty Two) # uname -a Linux f22 4.0.5-300.fc22.x86_64 #1 SMP Mon Jun 8 16:15:26 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Upper Layerのディレクトリと作業用ディレクトリを用意してマウントします。
# mkdir /root/upper # mkdir /root/work # mount -t overlay overlay -o upperdir=/root/upper,lowerdir=/etc,workdir=/root/work /mnt
ここでは、「/etc」にUpper Layerを被せて、「/mnt」にマウントしています。作業用ディレクトリは、Overlayfsが内部的に使用します。
使ってみる
/mntの下には、/etcの内容が見えていますが、新たに書き込んだ内容は、Upper Layerの方に保存されます。/etcの内容が変更されることはありません。
# date > /mnt/hoge.txt # ls -l /mnt/h* -rw-r--r--. 1 root root 43 6月 28 11:18 /mnt/hoge.txt -rw-r--r--. 1 root root 9 2月 23 23:24 /mnt/host.conf -rw-r--r--. 1 root root 4 6月 28 10:19 /mnt/hostname -rw-r--r--. 1 root root 158 2月 23 23:24 /mnt/hosts -rw-r--r--. 1 root root 370 2月 23 23:24 /mnt/hosts.allow -rw-r--r--. 1 root root 460 2月 23 23:24 /mnt/hosts.deny # ls -l /etc/h* -rw-r--r--. 1 root root 9 2月 23 23:24 /etc/host.conf -rw-r--r--. 1 root root 4 6月 28 10:19 /etc/hostname -rw-r--r--. 1 root root 158 2月 23 23:24 /etc/hosts -rw-r--r--. 1 root root 370 2月 23 23:24 /etc/hosts.allow -rw-r--r--. 1 root root 460 2月 23 23:24 /etc/hosts.deny # ls -l /root/upper/ 合計 4 -rw-r--r--. 1 root root 43 6月 28 11:18 hoge.txt
/etcに書き込んだ内容は、/mntからも見えます。
# date > /etc/hoge2.txt # ls -l /mnt/h* -rw-r--r--. 1 root root 43 6月 28 11:18 /mnt/hoge.txt -rw-r--r--. 1 root root 43 6月 28 11:20 /mnt/hoge2.txt -rw-r--r--. 1 root root 9 2月 23 23:24 /mnt/host.conf -rw-r--r--. 1 root root 4 6月 28 10:19 /mnt/hostname -rw-r--r--. 1 root root 158 2月 23 23:24 /mnt/hosts -rw-r--r--. 1 root root 370 2月 23 23:24 /mnt/hosts.allow -rw-r--r--. 1 root root 460 2月 23 23:24 /mnt/hosts.deny
/mntでファイルを削除すると、Upper Layerに、削除したことを示す特殊ファイルが作成されます。
# rm -f /mnt/h* # ls -l /root/upper/ 合計 0 c---------. 1 root root 0, 0 6月 28 11:21 hoge2.txt c---------. 1 root root 0, 0 6月 28 11:21 host.conf c---------. 1 root root 0, 0 6月 28 11:21 hostname c---------. 1 root root 0, 0 6月 28 11:21 hosts c---------. 1 root root 0, 0 6月 28 11:21 hosts.allow c---------. 1 root root 0, 0 6月 28 11:21 hosts.deny
この時、/mntからファイルは見えなくなるのですが、なぜか、ファイル名のTab補完はできてしまいます。ディレクトリ内のエントリとしては、ファイルは存在するけれど、実際にアクセスに行ったタイミングでファイルが存在しないものと解釈されている気がします。実際、"*" でファイルアクセスするとこうなります。
# ls -l /mnt/h* ls: /mnt/hoge2.txt にアクセスできません: そのようなファイルやディレクトリはありません ls: /mnt/host.conf にアクセスできません: そのようなファイルやディレクトリはありません ls: /mnt/hostname にアクセスできません: そのようなファイルやディレクトリはありません ls: /mnt/hosts にアクセスできません: そのようなファイルやディレクトリはありません ls: /mnt/hosts.allow にアクセスできません: そのようなファイルやディレクトリはありません ls: /mnt/hosts.deny にアクセスできません: そのようなファイルやディレクトリはありません
既存のファイルシステムと完全に同じ振る舞いをするわけではないので、このあたりは注意が必要ですね。
あとは、overlay mountしたディレクトリをベースに、さらに Upper layerを被せてマウントすることもできるようです。
# umount /mnt # mkdir /root/upper2 # mount -t overlay overlay -o upperdir=/root/upper,lowerdir=/etc,workdir=/root/work /mnt/mnt1 # mount -t overlay overlay -o upperdir=/root/upper2,lowerdir=/mnt/mnt1,workdir=/root/work /mnt/mnt2
この例では、/etcに/root/upperを被せて/mnt/mnt1にマウントした後、さらに、/mnt/mnt1に/root/upper2を被せて/mnt/mnt2にマウントしています。