社内で構築していたSambaサーバがサーバのトラブルでサービスを一時停止せざるを得ない状態になりました。
その際の対処の覚書です。
あくまでも自身で構築したSambaサーバに関する復旧作業ですので、参考にされる(されないか(汗))場合は自己責任で・・
Contents
サーバトラブルの概要
Samba サーバーの仕様。
- Ubuntu14.04Lts Server
- 1CPU / 8GB / SATA 2T HDD x 2 (RAID1)
- Samba4.3.9/AD-DC
前兆
朝出社するとドメインメンバーのPCでログイン出来ないとのこと。
(厳密にはログインできるが、デスクトップが表示されていない状態)
確認すると、Disk I/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
とする事もできる)
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再構築はやめて、新た環境をセットアップすることに。
Ubuntu 14.04 LTS 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を復元させてみました。
発覚
ここまで復元させてきたところで、肝心なデータをバックアップ取っていないことに気が付きました。
この顛末は次回に・・
-
導入しているバージョンと同バージョンのソース ↩
0件のコメント