最新のカーネルで aufs を試したい

研究でファイルシステム aufs を使うので、タイトル通りの環境構築方法をまとめます。

# 前提

この記事では、Linuxでaufsが入っていないカーネルから、
aufsが入っているカーネルに変えるまでをまとめます。

今回入れるのは、linux kernelのバージョンは5.3、aufs5とします。

linux-kernel-4.xなどのほかのバージョンでもやり方は同じだと思います。

linux-4.19.0もこのやり方で入りました。

# 本編
[aufs](http://aufs.sourceforge.net/) は複数のディレクトリを透過的に重ねることができる技術のことで、仮想ファイルシステムを構築する際に利用されます。

かつては docker で利用されていたとか。

aufsに関連するファイルシステムとして、UnionFS があります。

## 想定環境
- Linux Ubuntu(Server) 18.04 LTS
- Kernel Version 最初はなんでも良い

```:端末
$ ls /sys/fs | grep "aufs"
```

などで aufs が入ってないことを確認してください。

入ってたら入れなくてもいいと思うので。

## 手順
- github でカーネルコードを入手
- カーネルをビルドする
- カーネルを変更する
- aufsを利用する

### 1. github でカーネルコードを入手
[ここ](https://github.com/sfjro/aufs5-linux/tree/aufs5.x-rcN)から最新のカーネルをゲットします。

でも git clone でコピーすると、 fs の中の aufs が入らない。

なんでなんだろう。分かる人、教えてください。。。頭が弱いのです。

zip 版をダウンロードするとうまくいきました。

### 2. カーネルをビルドする

ダウンロードした aufs5-linux-aufs5.x-rcN.zip を、/usr/src/ で unzip したとします。

多分解凍後のファイルは aufs5-linux-aufs5.x-rcN でしょう。


ここからは[公式のドキュメント](https://github.com/sfjro/aufs5-linux/tree/aufs5.x-rcN/Documentation/admin-guide#id3)準拠です。（多分？）

ユーザー名が admin なら、以下のようにします。

```:端末
$ cd /usr/src/aufs5-linux-aufs5.x-rcN
$ make /home/admin/build
$ make /home/admin/build/kernel
$ sudo make O=/home/admin/build/kernel menuconfig
  File systems --->
    Misellaneous filesystems --->
       [*] Aufs (Advanced multi layered unification filesystem) support
$ sudo make O=/home/admin/build/kernel
```

 Kernel Configuration で aufs を有効にするのを忘れないでください。

デバッグ機能とかつけたかったら、さらにコンフィグをいじってください。

### 3. カーネルを変更する

先ほど入れたカーネルと現在のカーネルを交換したいと思います。

以下はカーネルのバージョンを5.3.0に変える手順です。

/boot/grub/grub.cfg の中に、インストールされたカーネルの情報が保管されているので、これを参照します。

```:端末
$ cat /boot/grub/grub.cfg | grep "menuentry"
if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-47aabde8-a5b7-445b-85a2-3166f216acdd' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-47aabde8-a5b7-445b-85a2-3166f216acdd' {
        menuentry 'Ubuntu, with Linux 5.3.0-rc2+' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-rc2+-advanced-47aabde8-a5b7-445b-85a2-3166f216acdd' {
        menuentry 'Ubuntu, with Linux 5.3.0-rc2+ (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-rc2+-recovery-47aabde8-a5b7-445b-85a2-3166f216acdd' {
```

linuxのバージョンを5.3.0にしたいなら、ここから

```
gnulinux-5.3.0-rc2+-advanced-47aabde8-a5b7-445b-85a2-3166f216acdd
```

とかを抜いてきて、これを /etc/default/grub の GRUB_DEFAULT に代入しましょう。

```:/etc/default/grub
- GRUB_DEFAULT="gnulinux-(Your Linux Kernel Version)"
+ GRUB_DEFAULT="gnulinux-5.3.0-rc2+-advanced-47aabde8-a5b7-445b-85a2-3166f216acdd"
```

再起動してください。

### 4. aufsを利用する

```:端末
$ ls /sys/fs | grep "aufs"
aufs
```

やったー。あるぞー！

```
$ ls -l
total 12
drwxrwxr-x 2 oka oka 4096 Aug 14 22:18 aufs
drwxrwxr-x 2 oka oka 4096 Aug 14 22:18 dir01
drwxrwxr-x 2 oka oka 4096 Aug 14 22:18 dir02
$ sudo mount -t aufs -o br:dir01=rw:dir02=rw none aufs
$ df -h
Filesystem            Size  Used Avail Use% Mounted on
udev                  7.4G     0  7.4G   0% /dev
tmpfs                 1.6G  1.3M  1.6G   1% /run
/dev/sda2             458G   99G  336G  23% /
tmpfs                 7.7G     0  7.7G   0% /sys/fs/cgroup
/dev/loop0             89M   89M     0 100% /snap/core/7396
tmpfs                 1.6G     0  1.6G   0% /run/user/1000
tmpfs                 1.6G     0  1.6G   0% /run/user/1001
none                  458G   99G  336G  23% /home/oka/fs/aufs
```
やったー。使えたー。

# まとめ

最新版のカーネルで最新版の aufs を使えるようにしました。

同じ方法で他のバージョンのカーネルや aufs も使えると思います。