めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

Fedora22でoverlayfsを使う手順

参考資料

・カーネルドキュメント 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にマウントしています。