社内で構築していたSambaサーバがサーバのトラブルでサービスを一時停止せざるを得ない状態になりました。
その際の対処の覚書です。

あくまでも自身で構築したSambaサーバに関する復旧作業ですので、参考にされる(されないか(汗))場合は自己責任で・・

サーバトラブルの概要

  • Ubuntu14.04Lts Server
  • 1CPU/8GB/SATA2THDD x 2 (RAID1)
  • Samba4.3.9/AD-DC

前兆

朝出社するとドメインメンバーのPCでログイン出来ないとのこと。
(厳密にはログインできるが、デスクトップが表示されていない状態)
確認すると、DiskI/O Errorが発生している模様。
リカバリモードで起動して、fsckして対処後、再起動で問題なく起動
当面それで様子を見ようと思ったものの、翌日には再びドメインメンバがログイン出来ない状況に。

対処

サーバ再起動時、3wareのBIOS画面でRAID1で組んでいるディスクアレイの内の片方が、

「DEGRADED」

の表示に。片肺で動いているような状況。

samba関連のバックアップ

リカバリモードでrootでコンソールに落りて、再度fsck後、念のためネットワーク上のNASにsamba関連の設定ファイル等をバックアップ。

設定のバックアップには、Sambaのソース*1を取ってきて、その中にある「samba_backup」というスクリプトを使え、とSambaWikiには書いてある。スクリプト内のFROMWHEREとWHEREを既存の環境に合わせてパスを変更する。(あるいは、samba_backup /from/where /where/to/backupとする事もできる)
*1:導入しているバージョンと同バージョンのソース

FROMWHERE=/var/lib/samba
WHERE=/srv/samba/backups
DAYS=90             # Set default retention period.

ただし、そのまま実行すると「空のアーカイブ作成はご容赦願います」というご丁寧なエラーが。スクリプトを確認して、/var/lib/samba/etc という存在しないディレクトリをアーカイブしている模様だったので、

$ sudo cp -R /etc/samba /var/lib/samba/etc
$ sudo samba_backup

としてバックアップ。

ここで気をつけなければいけないのは、SambaWikiにもあるように、

スクリプトは拡張されたACLをバックアップしません。…(中略)…。もし、あなたの使っているシステムのtarコマンドが -xattrs オプションをサポートしているなら、それをスクリプトの該当部分に追加しろ。

とあります。ただ、残念ながら、Ubuntu14.04で同様の作業を行ってみましたが、tarは-xattrs オプションをサポートしているように思えるのですが、何度やっても拡張ACLの属性を復元させることは出来ませんでした。

またその他にもProfilesやhomeのデータもバックアップをとっています。

RAIDの再構築

HDDを念のため2台取り寄せて、死んだHDD(忌まわしき海門製)の代わりに新しいHDDを装着させた上で、3ware BIOS 画面に入って(POST時にAlt + 3)今回取り付けたHDDとアレイユニットをそれぞれ選択した上で、「F8」キーを押して、「Y」で設定を保存し再起動。

再起動直後は調子よく起動するものの、生きている方のHDDもすでに整合性が失われているみたいで、しばらく時間が経つと、

「end_request: I/O error, ....」

と出てきてしまいます。

ここで、時間的な関係でRAID再構築はやめて、新た環境をセットアップすることに。

Ubuntu14.04LTS Server の再セットアップとSambaの復旧

怪しいHDDは取り外して、新しい2台のHDDでRAID1で構築後、Ubuntuサーバをインストールし、Samba4のセットアップを通常通り行っていきます。

この時、

  • バックアップ時と同じバージョンのSambaをセットアップ
    (今回の場合はバックアップ時4.3.8、リストア時4.3.9 でした)
  • 同一のホスト名+同一のIPアドレス(違う倍はkerberosとDNSで問題が発生する可能性)
  • OSは同じOSで

でセットアップしていきます。

あとはSambaWikiにあるように、一旦Sambaを落としてから、

# service samba-ad-dc stop
# rm -rf /var/lib/samba/etc
# rm -rf /var/lib/samba/private
# rm -rf /var/lib/samba/sysvol

# cd /srv/samba/backups
# tar -jxf etc.xxxx-xx-xx.tar.bz2 -C /var/lib/samba/
# tar -jxf samba4_private.xxxx-xx-xx.tar.bz2 -C /var/lib/samba/
# tar -jxf sysvol.xxxx-xx-xx.tar.bz2 -C /var/lib/samba/
# find /var/lib/samba/private/ -type f name '*.ldb.bak' -print0 | while read -d $'\0' f;do mv "$f" "${f%.bak}" ; done

として、バックアップしたファイルを元に戻します。

もし、バックアップ時にsysvolの拡張ACLをバックアップをできていない場合は、

# samba-tool ntacl sysvolreset

また、元のDNS バックエンドが「BIND9_DLZ」の場合は、

# samba_upgradedns --dns-backend=BIND9_DLZ

とします(今回は「BIND9_FLATFILE」なので、この部分は検証してません)。

その後Sambaを起動して完了です。

ACLの復元

sysvolのACL復元は先ほどの通りですが、ユーザプロファイルや、ユーザーのホームディレクトリのACLの復元は、実際にバックアップからリストアしたディレクトリ名から設定してみました。

ユーザープロファイルの場合
#!/bin/bash
#   ドメイン名=MYDOMAIN
#   Profiles=/srv/samba/profiles
#   としています。
#   /srv/samba/profilesにあるディレクトリ名=ユーザー名として、ACLを作成します

function change_acls() {
    DOMAIN="MYDOMAIN"
    _USER=$1
    _ACLFILE="/tmp/${_USER}.acl"
    _TARGET="srv/samba/profiles/${_USER}"

cat << _EOS_ > ${_ACLFILE}
# file: srv/samba/profiles/${_USER}/
# owner: ${_USER}
# group: users
user::rwx
user:root:rwx
user:3000002:rwx
user:3000008:rwx
user:${_USER}:rwx
group::---
group:users:---
group:3000002:rwx
group:3000008:rwx
mask::rwx
other::---
default:user::rwx
default:user:root:rwx
default:user:3000002:rwx
default:user:3000008:rwx
default:user:${_USER}:rwx
default:group::---
default:group:users:---
default:group:3000002:rwx
default:group:3000008:rwx
default:mask::rwx
default:other::---
_EOS_
    setfacl -bR /${_TARGET}
    setfacl -R -M ${_ACLFILE} /${_TARGET}
    rm ${_ACLFILE}
}

for dir in `ls /home/samba/profiles`
do
    if [ -d "/srv/samba/profiles/${dir}" ]; then
        echo "/srv/samba/profiles/${dir}にACLを適用しています。"
        change_acls ${dir}
    else
        echo "${dir}はディレクトリではない"
    fi
done
ユーザーホームディレクトリの場合
#!/bin/bash
#   ドメイン名=MYDOMAIN
#   としています。
#   /home/MYDOMAIN/にあるディレクトリ名=ユーザー名として、ACLを作成します

function change_acls() {
    DOMAIN="MYDOMAIN"
    _USER=$1
    _ACLFILE="/tmp/${_USER}.acl"
    _TARGET="home/${DOMAIN}/${_USER}"

cat << _EOS_ > ${_ACLFILE}
# file: home/${DOMAIN}/${_USER}/
# owner: ${_USER}
# group: users
user::rwx
user:root:rwx
user:3000002:rwx
user:3000008:rwx
user:${_USER}:rwx
group::---
group:users:---
group:3000002:rwx
group:3000008:rwx
mask::rwx
other::---
default:user::rwx
default:user:root:rwx
default:user:3000002:rwx
default:user:3000008:rwx
default:user:${_USER}:rwx
default:group::---
default:group:users:---
default:group:3000002:rwx
default:group:3000008:rwx
default:mask::rwx
default:other::---
_EOS_
    setfacl -bR /${_TARGET}
    setfacl -R -M ${_ACLFILE} /${_TARGET}
    rm ${_ACLFILE}
}

for dir in `ls /home/${DOMAIN}`
do
    if [ -d "/home/${DOMAIN}/${dir}" ]; then
        echo "/home/${DOMAIN}/${dir}にACLを適用しています。"
        change_acls ${dir}
    else
        echo "${dir}はディレクトリではない"
    fi
done

あとはそれぞれのシェルスクリプトを実行して、ACLを復元させてみました。

発覚

ここまで復元させてきたところで、肝心なデータをバックアップ取っていないことに気が付きました。

この顛末は次回に・・


 
記事を共有する
カテゴリー: LinuxSamba4

zaturendo

中小企業社内SE。

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。