autofs で cifs マウントした中のディレクトリを mount --bind する

Windows のフォルダ共有を Linux で cifs でマウントして、Windows でコードを修正 → Linux で実行、のような流れで開発を行っているのですが、ネットワークファイルシステムは I/O が遅く、PHP の composer の `vendor/` とか node.js の `node_modules/` のようなディレクトリまで cifs 経由でのアクセスになるとかなりのストレスです。

なので、下記の記事のように cifs をマウントした中のディレクトリに mount --bind で Linux のローカルのファイルファイルシステムをマウントするようにしています。

- [cifs でマウントした先の一部ディレクトリを mount --bind](http://ngyuki.hatenablog.com/entry/2013/08/26/182853 "cifs でマウントした先の一部ディレクトリを mount --bind")

この記事の通り netfs を使って Linux の起動時にマウントするようにしているのですが、同僚が、autofs も便利だよー、と言っていたので使ってみました。

最初に少し試してみた感じでは↑のようなマウントが入れ子になっている構造はできなさそうかと思ったのですが、man をよく読んでみたらできました。

## autofs の設定と cifs の自動マウント

autofs をインストールします。CentOS 7 を使っているので yum で入れます。

```
yum install autofs
```

マスタマップファイルにエントリを追加します。`/etc/auto.master` に追記しなくても `/etc/auto.master.d/` に拡張子 `.autofs` で作成すれば追加で読まれる（`auto.master` でそのように設定されていれば）ので `oreore.autofs` というファイル名で作ります。

```sh
cat <<EOS> /etc/auto.master.d/oreore.autofs
/-   /etc/auto.oreore
EOS
```

次にマップファイル（`/etc/auto.oreore`）を作ります。マスタマップファイルで `/-` としているので、マップファイルには絶対パスでマウントポイントを記述します。

```sh
cat <<EOS> /etc/auto.oreore
/oreore/sandbox -fstype=cifs,rw,credentials=/root/.cifs ://ore-no-pc/sandbox
EOS
```

マウントポイントを作ります。

```sh
mkdir -p /oreore/sandbox
```

`/root/.cifs` に ID/PW を書きます。

```sh
touch /root/.cifs
chmod 600 /root/.cifs
vim /root/.cifs
```

```
username=oreore
password=ore-no-password
```

autofs を起動します。

```
systemctl start autofs
```

`/oreore/sandbox` を ls してみます。

```
ls /oreore/sandbox
```

Windows のフォルダ共有が cifs で自動的にマウントされて、フォルダの中身が見えていれば成功です。

## cifs と bind で別々に設定 → 失敗

↑でマウントしたディレクトリの中の local/ というディレクトリに、Linux 上の /tmp をマウントするように autofs で設定してみます。

```sh
cat <<EOS> /etc/auto.oreore
/oreore/sandbox -fstype=cifs,rw,credentials=/root/.cifs ://ore-no-pc/sandbox
/oreore/sandbox/local -bind :/tmp/
EOS
```

autofs を再起動します。

```
systemctl stop autofs
umount -a -t cifs
umount -a -t autofs
systemctl start autofs
```

`/oreore/sandbox` を ls してみます。

```
ls /oreore/sandbox
```

Windows のフォルダ共有の中身が見えているので、次は `/oreore/sandbox/local` を ls してみます。

```
ls /oreore/sandbox/local
```

うーん、ダメです。`local/` のマウントがされる気配がありません。

## Multiple Mounts で設定してみる → 成功

`man 5 autofs` をよく読んでみると、次のような説明がありました。

```
Multiple Mounts
   A multi-mount map can be used to name multiple filesystems to mount.  It takes the form:

     key [ -options ] [[/] location [/relative-mount-point [ -options ] location...]...

   This may extend over multiple lines, quoting the line-breaks with `\´.  If present, the per-mountpoint mount-options are appended to  the  default
   mount-options. This behaviour may be overridden by the append_options configuration setting.
```

これを参考に、次のように変更しました。

```sh
cat <<EOS> /etc/auto.oreore
/oreore/sandbox -fstype=cifs,rw,credentials=/root/.cifs ://ore-no-pc/sandbox /local -bind :/tmp/
EOS
```

autofs を再起動します。

```
systemctl stop autofs
umount -a -t cifs
umount -a -t autofs
systemctl start autofs
```

`/oreore/sandbox` を ls してみます。

```
ls /oreore/sandbox
```

Windows のフォルダ共有の中身が見えたので、次は `/oreore/sandbox/local` を ls してみます。

```
ls /oreore/sandbox/local
```

Linux の `/tmp` が見えました。

先に `/oreore/sandbox/local` の方を ls しても大丈夫だったので、この設定で問題なさそうです。

なお、次のように複数のディレクトリを指定することもできます。

```sh
cat <<'EOS'> /etc/auto.oreore
/oreore/sandbox -fstype=cifs,rw,credentials=/root/.cifs ://ore-no-pc/sandbox \
  /local -bind :/tmp/ \
  /misc  -bind :/tmp/
EOS
```

これは便利。