LinuxのCIFSマウント時にメモリとかのリソースが足りなくて悩んでいませんか?(autofs編)

####0. 序文
　はい、突然 daian183さんに記事を投稿せよと言われて、とりあえずQiitaアカウントを開設し困っている今日この頃です。
　他のアドベントカレンダー担当者が真面目な話題を提供している中、本日はAutofsと言うLinuxのマウントツールについて珈琲ブレイク的にご紹介いたします。(珈琲でもJavaの話でもありません)
『今更Autofsか！』と突っ込まれそうですが、以下の観点で考えると実は需要があるんです。

|No.　|本記事の対象者                                             |
|:----|:--------------------------------------------------------|
| 1   | クラウド環境や仮想環境を利用している                       |
| 2   |クラウドの利用費用や仮想環境のリソース消費を少しでも減らしたい |
| 3   |Linux、Windows混在環境がある                               |
| 4   |LinuxからWindowsへファイルを置きたい(リリースしたい)         |

要はこんな環境ですね。

Windows1
　|
Linux --- Windows2
　|
WindowsN


今回使用したOSは以下の通りです。

|No.　|OS          |
|:----|:-----------|
| 1   | CentOS7    |
| 2   |Windows2016 |

設定上OS差異の少ないツールですが、ご承知おきください。
※利用用途にもよりますが、AWSでもt2.small程度のインスタンスでうん十台とautofsでマウントしても動いていた実績はあります

　最近、Jenkins等々でビルド後にリリースまで行ってしまうのが微妙に流行っています。(本記事ではJenkins等々の環境をリリースシステムと呼ぶことにします)だがしかし、Linux、Windows混在環境の場合、リリース先がLinuxであればその都度ssh等でファイルを撒けば良いのですが、Windowsでは基本的にsshがインストールされていません。だったら『CIFSでマウントすれば良いではないか！』とおっしゃる方もいるかもしれませんが、マウント元のサーバはマウント先のWindowsサーバのノード数に応じてサーバ資源が消費され、常時CIFSマウントするのは望ましくありません。そこで、マウント要求(マウント先への通信)がある度にマウントをしてくれるAutofsの登場です。

####1. 設定概要
今回は以下の流れで設定していきます

- [ ] Windowsにて共有フォルダアクセス用ユーザの作成
- [ ] Windowsにて共有用フォルダの作成
- [ ] Windowsにて共有フォルダのアクセス権追加
- [ ] LinuxにてWindows共有フォルダへマウントを行い疎通確認
- [ ] LinuxにてAutofsのインストール
- [ ] LinuxにてAutofsの設定
- [ ] LinuxにてAutofsを用いてWindows共有フォルダへマウントを行い疎通確認

では、早速設定方法についてご案内いたします。

####2. WindowsサーバにてWindowsの共有フォルダを作成
#####2.1. 共有フォルダ用ユーザの作成
######2.1.1. コマンドプロンプトの実行
コマンドプロンプトにて以下のコマンドを実行してください。
※ユーザ名、パスワード、名前、コメント等は適宜変更してください

```powershell:
net user jkuser01 password /add /fullname:"jenkins file sharing user" /comment:"リリースシステムファ
イル共有用"
```

#####2.2. 共有用フォルダの作成
######2.2.1. コマンドプロンプトの実行
コマンドプロンプトにて以下のコマンドを実行してください。
※Windowsの共有フォルダ対象を"d:\winshare"としています

```powershell:
mkdir d:\winshare
```

#####2.3. 共有フォルダのアクセス権追加
######2.3.1. コマンドプロンプトの実行
コマンドプロンプトにて以下のコマンドを実行してください。
※Windowsの共有フォルダ対象を"d:\winshare"、アクセス可能ユーザを"jkuser01"、アクセス権を"変更"としています

```powershell:
net share winshare=d:\winshare /grant:jkuser01,"change"
```

####3. LinuxサーバにてWindowsサーバの共有フォルダをマウント
#####3.1. 疎通確認
######3.1.1. マウントの実行
リリースシステムサーバのシェルにて以下のコマンドを実行してください。

```bash:
sudo mount -t cifs -o username=jkuser01,password=password //リリースシステムサーバのIPアドレス/winshare /mnt/
```

マウントできれば通信可能です、出来なければデフォルトではWindowsのインバウンドTCP/445とリリースシステムサーバのアウトバンドTCP/445を解放してください。
疎通完了後、アンマウントを忘れずに実施してください。

```bash:
sudo umount /mnt/
```

#####3.2. Autofsのインストール
######3.2.1. yumにてAutofsをインストール
以下のコマンドを実行してください。
※既に該当パッケージがインストール済の場合、インストールは不要です

```bash:
sudo yum install autofs
sudo yum install cifs-utils
```

※インターネット経由でyumが使えない環境の場合、お使いのLinuxと同じLinuxをインターネットに接続できる状態で

```bash:
sudo yum install --downloadonly autofs
sudo yum install --downloadonly cifs-utils
```

とコマンドを実行すると
/var/cache/yum/x86_64/latest/"リポジトリ名"/packages/
辺りにファイルがダウンロードされるので、該当rpmをインストールしてください。
※今時aptitudeを使わないのかとか言う突込みは無しでお願いします、daian183さんは<font color="red">赤い</font>帽子派です！
#####3.3. Autofsの設定
######3.3.1. Autofsの自動起動設定
以下のコマンドを実行し、Autofsのサービス自動起動設定をしてください。
サービスの起動確認

```bash:
systemctl status autofs
```

サービスが起動していなければ起動する

```bash:
systemctl start autofs
```

サービスを自動起動設定する

```bash:
sudo chkconfig autofs on
```

######3.3.2. Autofsの設定ファイル編集
######3.3.2.1. "auto.master"設定ファイルのバックアップ
編集前のファイルをバックアップします。

```bash:
sudo cp /etc/auto.master /etc/auto.master.org
```

######3.3.2.2. "auto.master"ファイルの編集
"auto.master"を編集します。

```bash:
sudo vi /etc/auto.master
```

以下3行をコメントアウトしてください。※先頭文字"#"でコメントアウトです

```bash:
/misc /etc/auto.misc
/net  -hosts
+auto.master
```

######3.3.2.3. "cifs.autofs"ファイルの作成
以下のコマンドを実行し、"cifs.autofs"へ設定を追記してください。
※"auto.master"でも同じ設定は可能ですが、今回は設定ファイルを分けます

```bash:
sudo touch /etc/auto.master.d/cifs.autofs 
sudo vi /etc/auto.master.d/cifs.autofs
/mnt/cifs /etc/auto.cifs --timeout=60 --ghost
```

/mnt/cifs : マウント先の指定
/etc/auto.cifs : 設定ファイルの指定
--timeout=60 : 60秒間通信が無ければマウントを解除する
--ghost : 未アクセス状態ではマウントしない

忘れないうちにマウント用のフォルダの作成をします、シェルにて以下のコマンドを実行してください。

```bash:
mkdir /mnt/cifs
```

######3.3.2.4. マウント用アカウントの設定
今回はroot権限でマウントを実行します、以下の通り設定してください。
※rootは読み書き可、root以外はアクセス不可

```bash:
sudo touch /root/.winid
sudo chmod 600 /root/.winid
```

".winid"ファイルを編集します。

```bash:
sudo vi /root/.winid
```

共有フォルダ用に作成したユーザ名/パスワードを記載します。

```bash:
username=jkuser01
password=password
```

######3.3.2.5. hostsファイルの編集
マウント先のサーバの名前解決が出来ない環境であれば、hostsファイルを編集した方が設定が楽です。
※必須ではありません
hostsファイルを編集する場合、以下のコマンドを実行してください。

```bash:
vi /etc/hosts
```
以下の例に習ってhostsにレコードの追記をしてください。

```bash:
IPアドレス ホスト名 ホスト名別名(あれば)
```

######3.3.2.6. マウント先の設定
マウント先のホストを設定します。"cifs.autofs"に追記した"auto.cifs"に対して設定します。

```bash:
sudo vi /etc/auto.cifs
マウント時の名前N -fstype=cifs,rw,noperm,credentials=/root/.winid ://ホスト名1orIPアドレス/winshare
マウント時の名前M -fstype=cifs,rw,noperm,credentials=/root/.winid ://ホスト名2orIPアドレス/winshare
```

マウント時の名前N,M : マウント時に表示されるパスになります
-fstype=cifs : 実は他のプロトコルもマウントできますが、今回はWindowsですのでcifsを指定します
rw : 権限の設定です(r : 読み込み可 ; w : 書き込み可 ; x : 実行可※今回はrwで設定しています)
noperm : これを付けるとWindows上のアクセス権設定が優先され、rwxの設定は無視されます
credentials : 先ほど作成したID/PWファイルのパスを指定します
://XXX : マウント先のパスを指定します

######3.3.2.7. サービスリブート
Autofsのサービスをリブートし、設定を反映させます。

```bash:
sudo systemctl restart autofs
```

####4. 動作確認
#####4.1. Linuxより共有フォルダへアクセス
マウント先に指定した"/mnt/cifs"以下に新しくフォルダが出来ています。このフォルダ名は"auto.cifs"で指定した"マウント時の名前M"、"マウント時の名前N"が表示されます。

```bash:
ls -atrl /mnt/cifs/
```

今回Windows側の設定は変更可になっているので、ファイルを書き込んで見ましょう、書き込みできるはずです。
これにて本日の珈琲ブレイクは終了です。明日からはまた読み応えのある記事に変わると思います、皆さんお付き合いをお願いいたします。