autofsによるファイルシステムへの自動マウント


<!-- 1 Intro -------------------------------------------->

# Introdaction

解析用データは基本的にNASにおいてあり，計算マシンのUbuntuからアクセスする際に毎回マウントするのは面倒であり，自動化を図りたい。方法としては，まず`fstab`によるシステム起動時の自動マウントが挙げられる。しかしながら，fstabではNASにアクセスしていないときでもマウント対象へファイルシステム向けのリソースが消費されるため，システムが１度に多くのシステムへのマウントを維持している場合はシステムのパフォーマンスに影響を与える可能性がある。また，障害などによりNASへの接続が切れてしまっていたり設定ミスによってマウントができない場合，システムの起動に失敗してしまうことがある。

そこで今回は，`autofs`を利用する。autofsでは，必要になった際ににアクセスすると自動的にマウントしてくれる。また，しばらくアクセスがないと自動的にアンマウントもしてくれる。これらにより，リソースを適宜節約できる。

# 本記事の趣旨
自分のための覚え書きである。
詳細などは他によくまとまったページがあるので，これを参照されたし[[ref1][1][, 2][2][, 3][3][, 4][4]]。


<!-- 2 Setup ---------------------------------------------------->

# パッケージインストール

まずは必要なパッケージを用意する

```terminal:terminal
$ sudo apt install autofs
```

`cifs-utils`，`smbclient`がまだインストールされていないのであれば，これらのパッケージも入れる。

# 設定

### 方針

ホスト名`hoge`というNASで共有設定されている`piyo`というフォルダにアクセスする際に，自動的に`/mnt/`下にマウントされるように設定する。

**流れ**
Step 1. マスタマップにエントリを追加
Step 2. マップファイルを編集（作成）
Step 3. 認証ファイルの作成
Step 4. 設定の反映

<!-- Setup:Step 1 --------------------------------------->

#### Step 1. マスタマップにエントリを追加

主要設定ファイルとして`/etc/auto.master` (マスターマップ) が用意されている。このマスターマップファイルには，autofs により制御されるマウントポイント，それに対応する設定ファイル，または自動マウントマップと呼ばれるネットワークソースが記載される。記載のフォーマットは，`mount-point  map-name  options`であり，今回の場合はmount-pointが`/mnt/hoge/`なので以下のようになる。

```vim:/etc/auto.master
/mnt/hoge/ /etc/auto.smb-hoge --timeout300
```

上記の例で示した末尾のオプションでは，自動的にアンマウントするまでの時間を指定している。オプションの詳細はここでは割愛する。次に，マップファイル`/etc/auto.smb-hoge`を用意してやる必要がある。

<!-- Setup:Step 2 --------------------------------------->

#### Step 2. マップファイルを編集（作成）

マップファイルでは，個々のマウントポイントのプロパティを設定する。なお，マウントポイントの **ディレクトリが存在しない場合，自動マウント機能はディレクトリを作成する**。指定したタイムアウト期間中にアクセスがない場合，自動的にアンマウントされ，当該ディレクトリは削除される。しかし，**自動マウント機能が実行されたときにマウントポイントのディレクトリが存在している場合は，アンマウント時に削除されることはない**。

今回はマップファイル`/etc/auto.smb`をベースとして新たなマップファイル`/etc/auto.smb-hoge`を作成・編集する。元ファイルに追記していく方針でも良いのだが，個人的にはオリジナルとは隔離したい。マップファイル名は好きなものを付ければよい。

```terminal:~/
$ sudo cp /etc/auto.smb /etc/auto.smb-test
```

auto.smb-hogeの中身を確認していく。中に以下のような記載がある。

```vim:/etc/auto.smb-hoge
key="$1"
opts="-fstype=cifs"
# 中略
creds=/etc/creds/$key

if [ -f "$creds" ]; then
    opts="$opts"',uid-$UID,gid+$GID,credentials='"$creds"
    smbopts="-A $creds"
else
```

入力引数の`$1` には，ホスト名が入る。今回の例ではNASの`hoge` に該当する。`opts`はmount.cifsのオプション設定である。アクセス権限を設定したい場合は，username, password, domainなどの情報を適宜指定してやればよい。ただ，上記if分の部分で，`/etc/creds/`下にホスト名`hoge`と同じ名前の認証ファイルがあれば，その中に記述されている権限情報が自動的に指定されるようになっている。そのため，必要があれば認証ファイル`/etc/auto.creds/hoge`を作成する。

<!-- Setup:Step 3 --------------------------------------->

#### Step 3. 認証ファイルの作成

**アクセスの際に認証が必要ない場合は，この手順はスキップする**

アクセス権限が制限されている場合は，認証ファイルの作成を行う。
以下のように`/etc/auto.creds/hoge`に認証に必要な情報を記載する。

```vim:/etc/auto.creds/hoge
username=ユーザー名
password=パスワード
domain=ドメイン名
```

適宜必要な情報に整えること。


<!---
この認証ファイルでアクセスできるか確認しておきたいなら，以下のコマンドを実行

```terminal: 
$ smbclient -L winsvr -A /etc/auto.credentials/
```

また，マップファイルの動作を確認するなら，

```terminal: 
$ /etc/auto.smb-hoge hoge
```

と実行することでmount.cifsのオプションと共有フォルダが表示される。
-->

<!-- Setup: step 4. --------------------->

#### Step 4. 設定の反映

あとは,サービスを再起動して設定を反映させる。

```terminal:
$ service autofs restart
```

このあと，`/mnt/hoge/`にアクセスして共有フォルダ`piyo`が自動マウントされることを確認する。

```terminal:
$ ls -la /mnt/hoge/
 piyo
$
```

## ※ローカルストレージを自動的にマウントしたい場合

例えばOSやアプリケーションとは異なるストレージにデータを保存したい場合，ドライブを別途積むことがある（e.g., Dドライブ）。これも自動的にマウントしてやる場合，autofsのマップの記載が変わる。マップの一般的な形式は，`mount-point  options  location`であり，これに準ずればよい。

例えば，ファイルシステム`ext4`のローカルストレージ（UUID`foo-bar`）をマウントポイント`/mnt/hogehoge/`にマウントしたいなら，

```vim:/etc/auto.hogehoge
hogehoge -fstype=ext4 :/dev/disk/by-uuid/foo-bar
```

とすればよい。ただしこのとき，`/etc/auto.master`のマスターマップには，`/mnt /etx/auto.hogehoge --timeout=300`のように追記する必要がある。 

`location`では，ディレクトリではなく，個体を一意に識別するための識別子であるUUID（universally unique identifier）を指定している。これは，ディスクの認識順序は起動時に代わる可能性があるため（当該ディスクが/dev/sdcだったのに次回の起動時には/dev/sdbになっていたりする）である。ディスクの情報を確認するには`fdisk -l`などのコマンドが使える。UUIDによるマウントの参考になりそうなページはこのあたり[[ref5][5][, 6][6]]。

<!-- 5 Ref ---------------------------------------------------->

# References

1. [/etc/fstab へのファイルシステムの追加，システムデザインガイド34.8.2.，8，Red Hat Enterprise Linux][1]
1. [autofs のしくみ，第31章 リモートファイルシステムリファレンスへのアクセス，Solaris のシステム管理 (第 3 巻) ][2]
1. [autofsを用いてHDD/SSD/USBメモリを起動時に自動マウントする方法(Debian)][3]
1. [Qiita-Windows の認証付き共有フォルダを Ubuntu で自動マウント][4]
1. [Qiita-Ubuntu 起動時にディスクをマウントする][5]
1. [Qiita-uuidによるデバイスのマウント][6]
 
[1]: https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/nfs-autofs
[2]: https://docs.oracle.com/cd/E19455-01/806-2719/6jbtsifm7/index.html
[3]: https://debimate.jp/2019/10/05/autofs%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6hdd-ssd-usb%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E8%87%AA%E5%8B%95%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%99%E3%82%8B/ 
[4]: https://qiita.com/quenhulu/items/c3b306ec1cf6278bdd81
[5]: https://qiita.com/suisuina/items/7b55a640fdd6b299aa46
[6]: https://qiita.com/qpSHiNqp/items/8e33f11b0f1a4a717e1a