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

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

 

 

サーバトラブルの概要

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 には書いてある。

スクリプト内の FROMWHEREWHERE を利用している環境に合わせてパスを変更する。(あるいは、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を復元させてみました。

 

発覚

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

この顛末は次回に・・

 

 


  1. 導入しているバージョンと同バージョンのソース 


 

 
カテゴリー: LinuxSamba4

zaturendo

中小企業社内SE。

0件のコメント

コメントを残す

アバタープレースホルダー

メールアドレスが公開されることはありません。 が付いている欄は必須項目です