AFS使用例


AFSとは?簡単に言えば、異なるディレクトリを組み合わせることができるファイルシステムです.このファイルシステムはフォーマットせず、直接マウントすればいいです.このブログがあるのは、Dockerで使うからです.Ubuntu 12.0.4でのインストールは比較的簡単で、他のシステムは自分で研究する必要があります.直接apt-get installでいいですが、インストール後は以下のようになります.
root@localhost:/tmp/test/aufs#cat /etc/issue
Ubuntu12.04.5 LTS 
\l root@localhost:/tmp/test/aufs#dpkg -l | grep aufs ii aufs-tools 1:3.0+20111101-1ubuntu1 Tools to manage aufs filesystems

  従来のファイルシステムの使用習慣によると、パーティション化、フォーマット化、マウントは、この3つの斧で、AFSではそんなに面倒ではありません.操作は以下の通りです.
root@localhost:/tmp/aufs1#mkdir a b c d
root@localhost:/tmp/aufs1#echo aaaaaaa > a/a.txt
root@localhost:/tmp/aufs1#echo bbbbbbb > b/b.txt
root@localhost:/tmp/aufs1#echo ccccccc > c/c.txt
root@localhost:/tmp/aufs1#mkdir root
root@localhost:/tmp/aufs1#ls
a  b c  d  root

まず4つのディレクトリa b c dを作成し、a bcの下でそれぞれ1つのファイルを生成します.以下の操作はab cの3つのディレクトリをAUFSでrootディレクトリにマウントすることです.
root@localhost:/tmp/aufs1#mount -v -t aufs -o br=/tmp/aufs1/a:/tmp/aufs1/b:/tmp/aufs1/c none/tmp/aufs1/root/
noneon /tmp/aufs1/root type aufs (rw,relatime,si=e7143f80f3aede09)
root@localhost:/tmp/aufs1#cd root/
root@localhost:/tmp/aufs1/root#ll
total20
drwxr-xr-x4 root root 4096 Dec 19 15:12 ./
drwxr-xr-x7 root root 4096 Dec 19 15:07 ../
-rw-r--r--1 root root    8 Dec 19 15:07 a.txt
-rw-r--r--1 root root    8 Dec 19 15:07 b.txt
-rw-r--r--1 root root    8 Dec 19 15:07 c.txt
root@localhost:/tmp/aufs1/root#cat *
aaaaaaa
bbbbbbb
ccccccc

mountコマンドの各パラメータの意味を説明します.
            -t aufs指定ファイルシステムタイプaufs
            -o後はマウントオプションで、マウントするディレクトリを指定します
            Noneは、ディレクトリを直接マウントしているので、デバイスファイルではないことを示しています.
catコマンドで内容が表示され、元のファイルの内容が表示されます.
 
AFSの検出レベルはudbaで指定できます
root@localhost:/tmp/aufs1#  mount -v -t aufs -obr=/tmp/aufs1/a:/tmp/aufs1/b:/tmp/aufs1/c -o udba=none  none /tmp/aufs1/root/
noneon /tmp/aufs1/root type aufs (rw,relatime,si=e7143f80fc7a7609,udba=none)

udbaにはnone、reval、inotifyの3つのレベルがあり、パフォーマンスへの影響は順次増加し、もちろんセキュリティも強化されています.
    None:この検出は最も速いが、元のディレクトリでファイルを変更したり、aufsで読み込んだりして、正確さを完全に保証しないなど、誤ったデータを引き起こす可能性がある.
    reval:aufsは再元のディレクトリにアクセスし、ファイルが更新された場合はaufsに反映されます.
    Notify:すべての元のディレクトリのすべてのディレクトリにnotifyイベントが登録されます.これはパフォーマンスに深刻な影響を及ぼし、使用を推奨しません.
  AFSでは異なるマウントディレクトリに対して異なる権限を指定でき、読み取り専用、読み書きの2つの権限はマウント時に指定できます.
root@localhost:/tmp/aufs1#mount -v -t aufs -o br=/tmp/aufs1/a=ro:/tmp/aufs1/b=rw -o udba=none  none /tmp/aufs1/root/
mount:warning: /tmp/aufs1/root/ seems to be mounted read-only.
noneon /tmp/aufs1/root type aufs (rw,relatime,si=e7143f87d915ee09,udba=none)
root@localhost:/tmp/aufs1#cd root/
root@localhost:/tmp/aufs1/root#ls
a1.txt  a.txt b.txt
root@localhost:/tmp/aufs1/root#cat *
aaaaaaa
bbbbbbb
root@localhost:/tmp/aufs1/root#echo AAAA > a.txt
-bash:a.txt: Read-only file system
root@localhost:/tmp/aufs1/root#echo BBBB > b.txt
root@localhost:/tmp/aufs1/root#cat b.txt
BBBB
root@localhost:/tmp/aufs1/root#cat /tmp/aufs1/b/b.txt
BBBB

     aufsはブロックデバイスをマウントしないため、作成されたすべてのファイルはマウントされたディレクトリに存在し、多くのディレクトリがある場合、元のディレクトリの選択ポリシーに関連し、rrのポリシーがどのように使用されるかを見てみましょう.
root@localhost:/tmp/aufs1/b#mount -v -t aufs -o br=/tmp/aufs1/a=rw:/tmp/aufs1/b=rw -o udba=reval -ocreate=rr  none /tmp/aufs1/root
noneon /tmp/aufs1/root type aufs (rw,relatime,si=e7143f84e8324e09,create=rr)
root@localhost:/tmp/aufs1/b#cd ../root/
root@localhost:/tmp/aufs1/root#ll
total20
drwxr-xr-x6 root root 4096 Dec 19 16:13 ./
drwxr-xr-x7 root root 4096 Dec 19 15:07 ../
-rw-r--r--1 root root    0 Dec 19 15:24 a1.txt
-rw-r--r--1 root root    8 Dec 19 15:07 a.txt
-rw-r--r--1 root root    5 Dec 19 15:58 b.txt
-rw-r--r--1 root root    5 Dec 19 16:02 root.txt
root@localhost:/tmp/aufs1/root#rm -f root.txt
root@localhost:/tmp/aufs1/root#touch root1 root2 root3 root4
root@localhost:/tmp/aufs1/root#tree -l /tmp/aufs1/
/tmp/aufs1/
├──a
│  ├──a1.txt
│  ├──a.txt
│  ├──root1
│  └──root3
├──b
│  ├──b.txt
│  ├──root2
│  └──root4
├──c
│  └──c.txt
├──d
└──root
    ├──a1.txt
    ├──a.txt
    ├──b.txt
    ├──root1
    ├──root2
    ├──root3
    └──root4

上のコマンドは、まずabの2つのディレクトリをrootにマウントし、4つのファイルを作成します.最後にtreeコマンドで表示すると、create=rrコマンドの影響でabの2つのディレクトリにファイルが均等に分布していることがわかります.rrはポーリングポリシーであり、使用可能なすべてのディレクトリで作成ファイルをポーリングし、1つのディレクトリだけが書き込み可能であれば意味がありません.Createには次のオプションがあります.
    rr:ポーリング選択書き込み可能ブランチ
    mfs:空き領域が最も多いブランチを選択
    mfsrr:まず残りの空間が最も多いブランチを選択し、rr方式を選択します.
    pmfs:負のディレクトリがある書き込み可能なブランチを選択
  AFSは既存のAFSに対して新しいブランチ(ディレクトリ)を追加したり、削除したり、deladdなどの操作をサポートしています.既存のAFSに対して、どのディレクトリが含まれているかをどのように知ることができますか?
以下の手順で実現できます.
root@localhost:/tmp/aufs1#mount -v
noneon /dockerdata type aufs (rw,relatime,si=e7143f87c2262e09)
noneon /tmp/test/aufs type aufs (rw,relatime,si=e7143f878b324c09)
noneon /tmp/aufs1/root type aufs (rw,relatime,si=e7143f84e8324e09,create=rr)

    Siの値を覚える
root@localhost:/tmp/aufs1#ls /sys/fs/aufs/si_e7143f84e8324e09/
br0      br1     xi_path 
root@localhost:/tmp/aufs1#ls /sys/fs/aufs/si_e7143f84e8324e09/br
br0  br1 
root@localhost:/tmp/aufs1#ls /sys/fs/aufs/si_e7143f84e8324e09/br0
/sys/fs/aufs/si_e7143f84e8324e09/br0
root@localhost:/tmp/aufs1#ls /sys/fs/aufs/si_e7143f84e8324e09/br1
/sys/fs/aufs/si_e7143f84e8324e09/br1
root@localhost:/tmp/aufs1#cat /sys/fs/aufs/si_e7143f84e8324e09/br1
/tmp/aufs1/b=rw

元のディレクトリと権限情報が表示されます.