CentOS 7.2 と Btrfs + Snapper + Samba で作る「以前のバージョン」に対応したファイルサーバー
最近の OSC のセミナーで紹介していた Snapper で作成した Btrfs ファイルシステムのスナップショットを Samba で公開し、「以前のバージョン」のファイルにアクセスできるファイルサーバーが、CentOS でも 7.2 になって構築できるようになりました。
Snapper は openSUSE 傘下のプロジェクトで、設定しておいたルールに応じて、自動的にファイルシステムのスナップショットを撮ってくれます。Samba 4.2 以降で、Samba と Snapper が vfs_snapper で連携できるようになりました。細かい話は OSC 京都のスライドをチェックして下さい。
では早速インストールしてみましょう。ポイントは SELinux への対応です。(まさか、無効にしていないですよね?) ここは openSUSE ユーザ会の Blog ということで、細かい CentOS の解説は行わないことにします。
とりあえず、samba と snapper をインストールします:
$ sudo yum install samba snapper
共有するディレクトリ /srv/share を作成します。以前のバージョンに対応した共有ディレクトリは Btrfs の(サブ)ボリュームである必要がありま。アクセス権は実際に使用する環境に合わせて変更して下さい:
$ sudo btrfs subvol create share $ sudo chgrp -R geeko share $ sudo chmod g+w share
SELinux で Samba サーバーが /srv/share にアクセスできるようにします:
# semanage がインストールされていない場合 $ sudo yum install policycoreutils-python # ラベル設定 $ sudo semanage fcontext -a -t samba_share_t /srv/share $ sudo restorecon /srv/share/
Samba サーバーの設定をします。今回は /etc/samba/smb.conf に次のような設定を追加します。
最後の vfs objects の設定がミソです:
[share] comment = Shared Directory browseable = yes writable = yes guest ok = no path = /srv/share vfs objects = btrfs snapper
Snapper の設定をします。スナップショットの残し方の設定は openSUSE と共通なので、スライドを参照して下さい:
$ sudo snapper -c smb-share create-config /srv/share
ユーザアカウント geeko がスナップショットにアクセスできるようにします。設定ファイルの直接編集も可能です:
$ sudo snapper -c smb-share set-config ALLOW_USERS=geeko
Samba サーバーを立ち上げましょう。まずはファイアウォールを開けて:
$ sudo firewall-cmd --add-service=samba --permanent $ sudo firewall-cmd --reload
サービスの自動起動設定をし、smb サービスを開始します:
$ sudo systemctl enable smb.service $ sudo systemctl start smb.service
ユーザー geeko を Samba サーバーのユーザーに追加し、パスワードを設定してログインできるようにします。
sudo pdbedit -a geeko
あとは Windows からアクセスして、右クリックして、「以前のバージョン」タブを開くだけ…なのですが、なんと Samba サーバーが Snapper に接続する際に、SELinux が拒否してしまいます。次のようなログが /var/log/audit/audit.log にしっかり記録されています:
type=USER_AVC msg=audit(1452273485.220:943): pid=534 uid=81 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc: denied { send_msg } for msgtype=method_call interface=org.opensuse.Snapper member=ListConfigs dest=org.opensuse.Snapper spid=16293 tpid=16588 scontext=system_u:system_r:smbd_t:s0 tcontext=system_u:system_r:snapperd_t:s0-s0:c0.c1023 tclass=dbus exe="/usr/bin/dbus-daemon" sauid=81 hostname=? addr=? terminal=?'
Samba から Snapper にアクセスを許可するポリシーを作成してみます。次のような samba-snapper.te を作成し
module samba-snapper 1.0; require { type smbd_t; type snapperd_t; class dbus { send_msg }; } allow smbd_t snapperd_t:dbus { send_msg };
ルールをビルドします:
# Makefile がインストールされていない場合 $ sudo yum install selinux-policy-devel # ビルド $ make -f /usr/share/selinux/devel/Makefile
作成した samba-snapper.pp をシステムにインストールすると、以前のバージョンにアクセスできるようになります。
sudo semodule -i samba-snapper.pp
CentOS で以前のバージョンに対応したファイルサーバーを構築する方法を紹介しました。ぜひ、スライドで紹介している openSUSE で YaST を使った設定と比べてみて下さい。