CLUSTERPRO D for Linux ファイルサーバー (Samba) 構築ガイド
改版履歴 版数改版日付内容 1 2016/05/19 新規作成 i
目次 第 1 章はじめに... 1 1.1 対象読者と目的...2 1.2 適用範囲...2 1.3 表記規則...2 1.4 免責事項...2 1.5 商標情報...3 1.6 最新情報の入手先...3 第 2 章概要... 4 2.1 機能概要...5 2.2 動作環境...6 第 3 章構築手順... 7 3.1 Samba の設定...8 3.1.1 smb サービスの起動設定...8 3.1.2 nmb サービスの起動設定...8 3.1.3 smb.conf の設定...8 3.2 CLUSTERPRO の設定...9 3.2.1 リソースグループの設定...9 第 4 章注意事項... 11 付録 A. サンプルスクリプト... 12 A.1 セッション切断用スクリプト...12 ii
第 1 章はじめに 第 1 章はじめに 目次 1.1 対象読者と目的...2 1.2 適用範囲...2 1.3 表記規則...2 1.4 免責事項...2 1.5 商標情報...3 1.6 最新情報の入手先...3 1
第 1 章はじめに 1.1 対象読者と目的 本ガイドは CLUSTERPRO D において Samba と組み合わせて ファイルサーバーをフェールオーバークラスター化するシステムエンジニアを対象読者としています ここでご紹介するソフトウェアや設定例は あくまで参考情報としてご提供するものであり 各ソフトウェアの動作保証を行うものではありません 1.2 適用範囲 本ガイドでは 以下のバージョンの CLUSTERPRO を対象としています CLUSTERPRO D 1.0 for Linux ( 内部バージョン :1.0.5.20340) バージョンが異なる場合 一部の表示や設定内容が異なる可能性がありますので ご注意ください 1.3 表記規則 本書では以下の表記法を使用します 表記使用方法例 [] 角かっこダイアログボックス メニューなどであることを示します [ スタート ] をクリックします [ プロパティ ] ダイアログボックス モノスペースフォント パス コマンドライン メッセージ usercmd -s [-h <host_name>] ファイル名 ファイルパス 関数などを示します モノスペースフォント中の [] 角かっこで囲まれた部分 モノスペースフォント中の <> 山形かっこで囲まれた部分 角かっこ内の値が省略可能であることを示します 山形かっこ内の値をユーザーが有効な値に置き換えて入力することを示します usercmd -s [-h <host_name>] usercmd -s [-h <host_name>] 1.4 免責事項 本書の内容は 予告なしに変更されることがあります 日本電気株式会社は 本書の技術的もしくは編集上の間違い 欠落について 一切責任をおいません また お客様が期待される効果を得るために 本書にしたがった導入 使用および使用効果につきましては お客様の責任とさせていただきます 2
第 1 章はじめに 本書に記載されている内容の著作権は 日本電気株式会社に帰属します 本書の内容の一部 または全部を日本電気株式会社の許諾なしに複製 改変 および翻訳することは禁止されて います 1.5 商標情報 CLUSTERPRO は日本電気株式会社の登録商標です Linux は Linus Torvalds 氏の米国およびその他の国における登録商標です Red Hat および Red Hat Enterprise Linux は Red Hat, Inc. の米国およびその他の国における商標または登録商標です CentOS は CentOS ltd. の商標または登録商標です 本書に記載されたその他の製品名および標語は 各社の登録商標または商標です 1.6 最新情報の入手先 最新の製品情報については 以下の Web サイトを参照してください http://jpn.nec.com/clusterpro/ 3
第 2 章概要 第 2 章概要 目次 2.1 機能概要...5 2.2 動作環境...6 4
第 2 章概要 2.1 機能概要 Samba を利用したファイルサーバーのフェールオーバークラスター化は CLUSTERPRO D が各ノード上の smb サービス nmb サービスの起動 / 停止を制御することで実現します 本ガイドで利用するリソースは以下のとおりです ミラーリソース共有するディレクトリ内のデータを各ノードにミラーリングするために利用します ファイル共有リソース (Samba) smb サービス nmb サービスの起動 / 停止を制御するために利用します なお 本リソースが smb サービス nmb サービスを制御するため OS 起動時に自動起動しないように設定する必要があります 汎用リソース停止対象の共有ディレクトリのセッションを切断するために利用します 仮想 IP リソースクライアントから共有ディレクトリに接続する IP アドレスとして利用します 5
第 2 章概要 2.2 動作環境 動作確認で利用した環境は以下のとおりです CentOS 6 項目 OS CentOS 6.6 CLUSTERPRO CLUSTERPRO D 1.0 for Linux ( 内部バージョン : 1.0.5.20340) samba samba-common CentOS 7 項目 OS CentOS 7.1 内容 samba-3.6.23-12.el6.x86_64 samba-common-3.6.23-12.el6.x86_64 CLUSTERPRO CLUSTERPRO D 1.0 for Linux ( 内部バージョン : 1.0.5.20340) samba samba-common samba-libs 内容 samba-4.1.12-21.el7_1.x86_64 samba-common-4.1.12-21.el7_1.x86_64 samba-libs-4.1.12-21.el7_1.x86_64 6
第 3 章構築手順 第 3 章構築手順 目次 3.1 Samba の設定...8 3.2 CLUSTERPRO の設定...9 7
第 3 章構築手順 3.1 Samba の設定 ここでは Samba に関する設定内容について説明します なお 後述する設定内容は CLUSTERPRO に追加する各ノードで設定する必要があります 3.1.1 smb サービスの起動設定 smb サービスは OS 起動時に自動起動しないように設定します Red Hat Enterprise Linux 6/CentOS 6 の場合 chkcong smb off Red Hat Enterprise Linux 7/CentOS 7 の場合 systemctl disable smb.service 3.1.2 nmb サービスの起動設定 nmb サービスは OS 起動時に自動起動しないように設定します Red Hat Enterprise Linux 6/CentOS 6 の場合 chkcong nmb off Red Hat Enterprise Linux 7/CentOS 7 の場合 systemctl disable nmb.service 3.1.3 smb.conf の設定 smb.conf に以下の内容を追記することで 共有設定を追加します なお security の設定等の smb.conf の設定内容は 用途に合わせて設定してください # 共有対象の共有名を指定 [< 共有名 >] # 共有対象として ミラーボリュームのマウント先ディレクトリ もしくは # ミラーボリュームのマウント先ディレクトリ配下のディレクトリを指定 path = < 共有対象のディレクトリ > # 共有対象に書き込み権限を付与 writeable = yes 8
第 3 章構築手順 3.2 CLUSTERPRO の設定 ここではクラスターの構築は既に完了しているものとして リソースグループの作成や設定内容について説明します クラスターの構築方法については CLUSTERPRO D 1.0 for Linux ユーザーズガイドを参照ください 3.2.1 リソースグループの設定 1. Advanced WebConsole の TOP 画面で [ リソースグループを作成する ] を選択します リソースの追加画面が表示されます 2. [ リソースを追加 ] を選択し 以下のリソースを選択します ミラーリソース 汎用リソース ファイル共有リソース (Samba) 仮想 IP リソース画面上にミラーリソース 汎用リソース ファイル共有リソース (Samba) 仮想 IP リソースを示すアイコンが追加されます 3. [ 詳細設定を表示 ] のチェックボックスをオンにします 4. ミラーリソースのアイコンを選択し 設定値を入力します a. [ 依存関係設定 ] タブを選択します b. [ 既定の依存関係設定を使用する ] のチェックボックスをオフにします c. [ リソース固有設定 ] タブを選択し 以下の項目に設定値を入力します ミラーボリュームのサイズ ミラーデータの保存先ディレクトリサイズ設定値を入力後 ミラーリソースのアイコンが正常であることを確認します 5. 汎用リソースのアイコンを選択し 設定値を入力します a. [ 依存関係設定 ] タブを選択します b. [ 既定の依存関係設定を使用する ] のチェックボックスをオフにします c. [ 依存するリソース ] にミラーリソースを追加します d. [ リソース固有設定 ] タブを選択します e. [ 停止スクリプト ] に共有ディレクトリのセッション切断処理を入力します ここで設定した [ 停止スクリプト ] が実行されることで 共有ディレクトリのセッションを切断されます 9
第 3 章構築手順 入力するスクリプトの内容は セッション切断用スクリプト (12 ページ ) を参考にしてください 設定値を入力後 汎用リソースのアイコンが正常であることを確認します 6. ファイル共有リソース (Samba) のアイコンを選択し 設定値を入力します a. [ 依存関係設定 ] タブを選択します b. [ 既定の依存関係設定を使用する ] のチェックボックスをオフにします c. [ 依存するリソース ] に汎用リソースを追加します d. [ 監視設定 ] タブを選択します e. [ 監視リトライ回数 ] に 1 以上の設定値を入力します 設定値を入力後 ファイル共有リソース (Samba) のアイコンが正常であることを確認します 7. 仮想 IP リソースのアイコンを選択し 設定値を入力します a. [ 依存関係設定 ] タブを選択します b. [ 既定の依存関係設定を使用する ] のチェックボックスをオフにします c. [ 依存するリソース ] にファイル共有リソース (Samba) を追加します d. [ リソース固有設定 ] タブを選択し [ 仮想 IP アドレス ] に設定値を入力します 設定値を入力後 仮想 IP リソースのアイコンが正常であることを確認します 8. すべてのリソースのアイコンが正常であることを確認したら [ 次へ ] を選択します リソースグループの作成画面が表示されます 9. [ リソースグループ名 ] に設定値を入力します 設定値を入力後 リソースグループのアイコンが正常であることを確認します 10. [ 完了 ] を選択します [ 完了 ] を選択すると 自動的にクラスターの運用管理画面へと遷移します これでリソースグループの設定は完了です 10
第 4 章注意事項 第 4 章注意事項 汎用リソースに設定する停止スクリプトでは 共有ディレクトリのセッションを切断す るために smb サービス nmb サービスの再起動を行います そのため リソースグループ停止時には 一時的に以下の事象が発生する場合がありま す - 他リソースグループが制御する共有ディレクトリにアクセスするとエラーが発生 する場合があります - 他リソースグループのファイル共有リソース (Samba) の監視処理でエラーが発生す る場合があります 本現象発生時に不要なフェールオーバーを回避するには 監視リトライ回数の設定 値を 1 以上にする必要があります 仮想 IP リソースに設定した仮想 IP アドレスを用いていない共有ディレクトリへの接 続が存在する場合 停止スクリプトによる共有ディレクトリのセッション切断が行え ず リソースグループのフェールオーバーや停止が失敗する場合があります この現象を回避するために 共有ディレクトリへの接続は仮想 IP リソースに設定した 仮想 IP アドレスを利用するようにしてください 11
付録 A. サンプルスクリプト 付録 A. サンプルスクリプト 本章では 本ガイドと合わせて提供している Samba と CLUSTERPRO の連携用サンプルスクリプトについて説明します ここで説明するサンプルスクリプトを使用しない場合でも 同様の処理を行うスクリプトを作成することによって Samba と CLUSTERPRO を連携させることは可能です 本ガイドに記載したサンプルスクリプトの内容をコピーして利用する場合 不正なコード ( 意図しない改行等 ) が含まれる可能性がありますので ご注意ください A.1 セッション切断用スクリプト リソースグループ停止時に停止対象の共有ディレクトリのセッションを切断するためのスクリプトです smb サービス nmb サービスの再起動を行うことで セッションの切断を実現しています SHARENAME 変数の値 <ShareName> を停止対象の共有名に編集した上で利用してください #!/bin/sh SHARENAME="<ShareName>" TRYCNT_KILLPROC=10 TRYINT_KILLPROC=1 INSTALL_DIR="/opt/clznode" WORK_DIR="/work" SAMBA_DIR="/samba" TARGET_DIR=${INSTALL_DIR}${WORK_DIR}${SAMBA_DIR} LOG_FILE="${TARGET_DIR}/restartsamba_${SHARENAME}.log" STAT_FILE="${TARGET_DIR}/smbstatus_${SHARENAME}" LINE_FILE="${TARGET_DIR}/line_${SHARENAME}" BEFORE_PROC_FILE="${TARGET_DIR}/bproc_${SHARENAME}" AFTER_PROC_FILE="${TARGET_DIR}/aproc_${SHARENAME}" TEMP_FILE1="${TARGET_DIR}/tmp1_${SHARENAME}" TEMP_FILE2="${TARGET_DIR}/tmp2_${SHARENAME}" ENDOFHEADER="\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-" get_session_pid() { # initialize target pid targetpid=-1 # create temporary le for smbstatus touch ${STAT_FILE} 12
付録 A. サンプルスクリプト logging "failed (${STAT_FILE} cannot be created)" exit 1 # create temporary le for searching pid touch ${LINE_FILE} rm -f ${STAT_FILE} logging "failed (${LINE_FILE} cannot be created)" exit 1 smbstatus -S > ${STAT_FILE} 2>&1 iret=$? logging "get_session_pid (smbstatus retval = ${iret})" passedheader=0 while read line do if [ ${passedheader} -eq 0 ] # search line representing end of header echo ${line} grep "${ENDOFHEADER}" >/dev/null 2>&1 if [ $? -eq 0 ] passedheader=1 else # read information of samba session echo ${line} > ${LINE_FILE} 2>&1 # some continuous spaces in line are compressed to 1 space selectedline=`sed -e 's/ */ /g' ${LINE_FILE}` # get sharename from line selectedname=`echo ${selectedline} cut -d ' ' -f 1` if [ "${SHARENAME}" = "${selectedname}" ] # get pid for target samba session from line targetpid=`echo ${selectedline} cut -d ' ' -f 2` break done < ${STAT_FILE} rm -f ${STAT_FILE} rm -f ${LINE_FILE} } logging "get_session_pid (target pid = ${targetpid})" get_ps_info() { # create temporary les touch ${TEMP_FILE1} 13
付録 A. サンプルスクリプト logging "failed (${TEMP_FILE1} cannot be created)" exit 1 touch ${TEMP_FILE2} rm -f ${TEMP_FILE1} logging "failed (${TEMP_FILE2} cannot be created)" exit 1 # save ps info ps -ef > ${TEMP_FILE1} # some continuous spaces in line are compressed to 1 space sed -e 's/ */ /g' ${TEMP_FILE1} > ${TEMP_FILE2} while read line do selectedname=`echo ${line} cut -d ' ' -f 8` if [ "${selectedname}" = "smbd" ] echo ${line} >> ${1} done < ${TEMP_FILE2} } rm -f ${TEMP_FILE1} rm -f ${TEMP_FILE2} logging() { if [! -e ${LOG_FILE} ] touch ${LOG_FILE} # log le cannot be created, so execute without logging return } echo "`date` [restartsamba <${SHARENAME}>] : $1" >> ${LOG_FILE} # restartsamba main export LANG=C # check existence of smbstatus command which smbstatus >/dev/null 2>&1 logging "failed (smbstatus command does not exist)" exit 1 14
付録 A. サンプルスクリプト # create temporary directory mkdir -p ${TARGET_DIR} logging "failed (${TARGET_DIR} cannot be created)" exit 1 # get pid of target samba session get_session_pid # target session may already be disconnected, so do nothing if [ ${targetpid} -eq -1 ] logging "succeeded (target samba process does not exist)" exit 0 # create temporary le for saving samba processes before restart touch ${BEFORE_PROC_FILE} logging "failed (${BEFORE_PROC_FILE} cannot be created)" exit 1 # save samba processes before restart get_ps_info ${BEFORE_PROC_FILE} # restart samba service logging "begin to restart samba service" service smb restart logging "failed (smbd cannot be restarted.)" exit 1 service nmb restart logging "ignored (nmbd cannot be restarted)" # create temporary le for saving samba processes after restart touch ${AFTER_PROC_FILE} logging "failed (${AFTER_PROC_FILE} cannot be created)" exit 1 # save samba processes after restart get_ps_info ${AFTER_PROC_FILE} 15
付録 A. サンプルスクリプト # check existence of remaining samba process while read bline do bproc_pid=`echo ${bline} cut -d ' ' -f 2` bproc_stime=`echo ${bline} cut -d ' ' -f 5` while read aline do aproc_pid=`echo ${aline} cut -d ' ' -f 2` aproc_ppid=`echo ${aline} cut -d ' ' -f 3` aproc_stime=`echo ${aline} cut -d ' ' -f 5` if [ ${bproc_pid} -eq ${aproc_pid} -a \ "${bproc_stime}" = "${aproc_stime}" -a \ ${aproc_ppid} -eq 1 ] # remaining samba process exist # try to kill remaining samba process remain=${trycnt_killproc} while [ ${remain} -gt 0 ] do kill -KILL ${bproc_pid} ps -ef grep "${aproc_pid}" grep "${aproc_ppid}" grep "${aproc_stime}" >/dev/null 2>&1 logging "killed (PID=${aproc_pid} PPID=${aproc_ppid} ST IME=${aproc_stime})" break sleep ${TRYINT_KILLPROC} remain=`expr ${remain} - 1` done if [ ${remain} -le 0 ] rm -f ${BEFORE_PROC_FILE} rm -f ${AFTER_PROC_FILE} logging "failed (remaining process cannot be killed)" exit 1 done < ${AFTER_PROC_FILE} done < ${BEFORE_PROC_FILE} rm -f ${BEFORE_PROC_FILE} rm -f ${AFTER_PROC_FILE} logging "succeeded (samba service was restarted)" exit 0 16
CLUSTERPRO D for Linux ファイルサーバー (Samba) 構築ガイド 2016 年 5 月 01 版発行 日本電気株式会社 日本電気株式会社 2016