RHEL7ストレージ管理ガイドのP.129 参照
・バックアップ取得前にプリスナップショット、取得後にポストスナップショットをペアで取得するすることによって、あとで下記のコマンドを実行することによってスナップショットペアの変更を追跡できるようになる。
snapper status:2 つのスナップショットの間で作成、編集、または削除されたファイルおよび ディレクトリ一覧を表示
snapper diff:1 つ以上の変更が検出された場合に status コマンドが出力する 2 つのスナ
ップ ショットの間に変更されたファイルおよびディレクトリーの差異を表示
snapper dadiff:2 つのスナップショットの間にファイルまたはディレクトリーの拡張属性がど
のように変更されたかを比較
・スケジューリングして日時とか1時間あととかに実行できる。
使い方
# snapper -c lvm_config create-config -f "lvm(xfs)" /lvm_mount
※/lvm_mount でマウントされている LVM2 サブボリューム上に xfs ファイルシステ ムで
lvm_config という設定ファイルを作成する場合
・プリスナップショット取得
# snapper -c SnapperExample create -t pre -p
・ポストスナップショット取得
# snapper -c lvm_config create -t post --pre-num 1 -p
■nfsサーバがexportしてるファイルシステムへのクライアントからの書き込みが完了するのを待ってファイルシステムの書き込みをロックする方法
【要件】
nfsクライアントが書き込み中のデータは書き込みが完了するまで待ってから、nfsクライアントによるnfsへの書き込みを停止する方法を考える
・ポイント:クライアント側にどんな応答が返るか
0.初期状態
server# exportfs
/testlv 192.168.0.0/16
client# mount | grep testlv
192.168.101.1:/testlv on /nfs type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.101.201,local_lock=none,addr=192.168.101.1)
client# ll /dst/hoge
-rw-r--r--. 1 root root 10485760002 Sep 23 04:26 /dst/hoge
1.exportしてるファイルシステムをnfsサーバ側でro remountする方法
nfsクライアント側で完了までに約7秒かかる書き込みジョブを開始直後にnfsサーバ側で下記コマンドを発行。(この時点ではまだexportしてるファイルシステムはread-writeでマウントしている)
server# i=1;while ! mount -o remount,ro /testlv;do echo $i;sleep 1;((i++));done;findmnt /testlv
mount: /testlv is busy
1
mount: /testlv is busy
2
mount: /testlv is busy
3
mount: /testlv is busy
4
mount: /testlv is busy
5
mount: /testlv is busy
6
mount: /testlv is busy
7
TARGET SOURCE FSTYPE OPTIONS
/testlv /dev/mapper/src-testlv xfs ro,relatime,seclabel,attr2,inode64,noquota
→クライアントから書き込み中にサーバ側でroにremountしようとするとbusyのエラーになるが、クライアントの書き込み完了後はexportしたままread-onlyにremountできる。
server# exportfs
/testlv 192.168.0.0/16
client# time su nfstest -c "touch /nfs/fuga2"
touch: cannot touch ‘/nfs/fuga2’: Read-only file system
real 0m0.159s
user 0m0.004s
sys 0m0.047s
client# echo $?
1
2.nfsサーバ側でexportfs -uでアンエクスポートする方法
client# time cp /dst/hoge /nfs/hoge2
server# ll /testlv
合計 10972696
drwxr-xr-x. 25 root root 4096 9月 7 04:59 1
-rw-r--r--. 1 nfstest nfstest 2 9月 24 12:02 fuga
-rw-r--r--. 1 root root 10485760002 9月 18 13:40 hoge
-rw-r--r--. 1 nfstest nfstest 1220272128 9月 24 12:11 hoge2
server# exportfs -u 192.168.0.0/16:/testlv
server# echo $?
0
server# exportfs;echo $?
0
server# ll /testlv/hoge2
-rw-r--r--. 1 nfstest nfstest 1289084928 9月 24 12:11 /testlv/hoge2
server# ll /testlv/hoge2
-rw-r--r--. 1 nfstest nfstest 1289084928 9月 24 12:11 /testlv/hoge2
----(6分間待つ)----
server# exportfs -a
server# exportfs
/testlv 192.168.0.0/16
server# ll /testlv/hoge2
-rw-r--r--. 1 nfstest nfstest 1289084928 9月 24 12:18 /testlv/hoge2
----(10秒待つ)----
server# ll /testlv/hoge2
-rw-r--r--. 1 nfstest nfstest 1313202176 9月 24 12:18 /testlv/hoge2
→書き込みが再開した
3.LVM論理ボリュームを非アクティブにする方法
クライアントが書き込み中にサーバ側で下記を実行
server# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home cl -wi-ao---- 173.87g
root cl -wi-ao---- 50.00g
swap cl -wi-ao---- 7.81g
1TBthin_snap1 dst Vwi---tz-k 2.00t big_thinpool dst_thinlv
big_thinpool dst twi-aotz-- 2.44t 40.30 20.04
dst_thinlv dst Vwi-a-tz-- 2.00t big_thinpool 49.20
testlv_bk dst -wi-ao---- 200.00g
test_thinpool src twi-aotz-- 400.00g 18.09 26.40
testlv src -wi-ao---- 200.00g
thinlv_1 src Vwi-aotz-- 200.00g test_thinpool 35.38
server# lvchange -an src/testlv
Logical volume src/testlv contains a filesystem in use.
server# echo $?
5
4.LVM論理ボリュームをroに変更する方法
クライアントが書き込み中にサーバ側で下記を実行
server# lvchange -pr src/testlv
Logical volume src/testlv changed.
server# echo $?
0
server# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home cl -wi-ao---- 173.87g
root cl -wi-ao---- 50.00g
swap cl -wi-ao---- 7.81g
1TBthin_snap1 dst Vwi---tz-k 2.00t big_thinpool dst_thinlv
big_thinpool dst twi-aotz-- 2.44t 40.30 20.04
dst_thinlv dst Vwi-a-tz-- 2.00t big_thinpool 49.20
testlv_bk dst -wi-ao---- 200.00g
test_thinpool src twi-aotz-- 400.00g 18.09 26.40
testlv src -ri-ao---- 200.00g
thinlv_1 src Vwi-aotz-- 200.00g test_thinpool 35.38
server# ll /testlv
合計 12997500
drwxr-xr-x. 25 root root 4096 9月 7 04:59 1
-rw-r--r--. 1 nfstest nfstest 2 9月 24 12:02 fuga
-rw-r--r--. 1 root root 10485760002 9月 18 13:40 hoge
-rw-r--r--. 1 nfstest nfstest 2900361216 9月 24 12:34 hoge2
server# ll /testlv
合計 13024124
drwxr-xr-x. 25 root root 4096 9月 7 04:59 1
-rw-r--r--. 1 nfstest nfstest 2 9月 24 12:02 fuga
-rw-r--r--. 1 root root 10485760002 9月 18 13:40 hoge
-rw-r--r--. 1 nfstest nfstest 2900361216 9月 24 12:34 hoge2
----(1分待つ)----
server# lvchange -prw src/testlv
Logical volume src/testlv changed.
server# echo $?
0
server# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home cl -wi-ao---- 173.87g
root cl -wi-ao---- 50.00g
swap cl -wi-ao---- 7.81g
1TBthin_snap1 dst Vwi---tz-k 2.00t big_thinpool dst_thinlv
big_thinpool dst twi-aotz-- 2.44t 40.30 20.04
dst_thinlv dst Vwi-a-tz-- 2.00t big_thinpool 49.20
testlv_bk dst -wi-ao---- 200.00g
test_thinpool src twi-aotz-- 400.00g 18.09 26.40
testlv src -wi-ao---- 200.00g
thinlv_1 src Vwi-aotz-- 200.00g test_thinpool 35.38
server# ll /testlv
合計 13316272
drwxr-xr-x. 25 root root 4096 9月 7 04:59 1
-rw-r--r--. 1 nfstest nfstest 2 9月 24 12:02 fuga
-rw-r--r--. 1 root root 10485760002 9月 18 13:40 hoge
-rw-r--r--. 1 nfstest nfstest 3772776448 9月 24 12:36 hoge2
→バッファ?にたまってたデータがページキャッシュに一気に流れ込んだ?
どこのバッファやねん?
【わかったこと】
nfsクライアントが書き込み中にnfsサーバ側OSで実行される各IO停止(中断)を伴う(伴いそうな)コマンドを試みた結果は下記のようになった。
1.ro remount→exitコード32で失敗。(nfsクライアント側の書き込み完了後に成功)
2.nfsアンエクスポート→成功。クライアントは書き込みを中断
3.lvm非アクティブ化→exitコード5で失敗
4.lvmをread-onlyにステータス変更→成功。nfsサーバ側のどっかのバッファにクライアントからのデータがため込まれてlvmをread-writeステータスに戻した瞬間にバッファのデータがページキャッシュに反映された
よって、1.か3.を0.5秒おきにポーリングしてクライアントからの書き込みが終了したらすかさず書き込み禁止してそのすきにスナップショットを取るのがいいように思われる。
具体的には1.の場合は、
# remountを1秒おきに試みる(もし書き込み中のクライアントがあった場合はbusyエラーが返る)
while ! mount -o remount,ro /testlv;do echo $i;sleep 1;done
# ファイルシステムをフリーズ(nfsクライアントはこの間無限リトライになる)
xfs_freeze -f /testlv
mount -o remount,rw /testlv
# スナップショット取得
----スナップショット取得----
# ファイルシステムをフリーズ解除
xfs_freeze -u/testlv
【課題】
念のため、ローカルプロセスが書き込み中の場合の1.と3.の挙動も確認しておく