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. コマンドプロンプトの実行

コマンドプロンプトにて以下のコマンドを実行してください。
※ユーザ名、パスワード、名前、コメント等は適宜変更してください

net user jkuser01 password /add /fullname:"jenkins file sharing user" /comment:"リリースシステムファ
イル共有用"
2.2. 共有用フォルダの作成
2.2.1. コマンドプロンプトの実行

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

mkdir d:\winshare
2.3. 共有フォルダのアクセス権追加
2.3.1. コマンドプロンプトの実行

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

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

3. LinuxサーバにてWindowsサーバの共有フォルダをマウント

3.1. 疎通確認
3.1.1. マウントの実行

リリースシステムサーバのシェルにて以下のコマンドを実行してください。

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

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

sudo umount /mnt/
3.2. Autofsのインストール
3.2.1. yumにてAutofsをインストール

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

sudo yum install autofs
sudo yum install cifs-utils

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

sudo yum install --downloadonly autofs
sudo yum install --downloadonly cifs-utils

とコマンドを実行すると
/var/cache/yum/x86_64/latest/"リポジトリ名"/packages/
辺りにファイルがダウンロードされるので、該当rpmをインストールしてください。
※今時aptitudeを使わないのかとか言う突込みは無しでお願いします、daian183さんは赤い帽子派です!

3.3. Autofsの設定
3.3.1. Autofsの自動起動設定

以下のコマンドを実行し、Autofsのサービス自動起動設定をしてください。
サービスの起動確認

systemctl status autofs

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

systemctl start autofs

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

sudo chkconfig autofs on
3.3.2. Autofsの設定ファイル編集
3.3.2.1. "auto.master"設定ファイルのバックアップ

編集前のファイルをバックアップします。

sudo cp /etc/auto.master /etc/auto.master.org
3.3.2.2. "auto.master"ファイルの編集

"auto.master"を編集します。

sudo vi /etc/auto.master

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

/misc /etc/auto.misc
/net  -hosts
+auto.master
3.3.2.3. "cifs.autofs"ファイルの作成

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

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 : 未アクセス状態ではマウントしない

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

mkdir /mnt/cifs
3.3.2.4. マウント用アカウントの設定

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

sudo touch /root/.winid
sudo chmod 600 /root/.winid

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

sudo vi /root/.winid

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

username=jkuser01
password=password
3.3.2.5. hostsファイルの編集

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

vi /etc/hosts

以下の例に習ってhostsにレコードの追記をしてください。

IPアドレス ホスト名 ホスト名別名(あれば)
3.3.2.6. マウント先の設定

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

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のサービスをリブートし、設定を反映させます。

sudo systemctl restart autofs

4. 動作確認

4.1. Linuxより共有フォルダへアクセス

マウント先に指定した"/mnt/cifs"以下に新しくフォルダが出来ています。このフォルダ名は"auto.cifs"で指定した"マウント時の名前M"、"マウント時の名前N"が表示されます。

ls -atrl /mnt/cifs/

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