pdumpfs-copy.rb

【取扱説明書】

pdumpfs-copy.rb は pdumpfs が作成したバックアップのコピーを作成します。

自家用の使い捨てコマンドとして作成したので、引数で対象ディレクトリを指定するようにはなっていません。スクリプト中に書かれた下記の部分を自分用に書換えてから実行してください。

DEFAULT_SRC_BASE = "/mnt/NP11-34/storage2/pdumpfs_of"
DEFAULT_SRC_NAME = "backup_of"
DEFAULT_DST_BASE = "/storage2/pdumpfs_of"

実行すると次のように表示されていきます。pdumpfs-copy が行うのは、「rm・・、ln -s・・、pdumpfs・・、mkdir・・、mv・・」だけです。実行するコマンドは全てシェルコマンドであり、全部表示されます。<<<
−−−
[tk@EeePC-40 /]$ sudo ruby /samba_public/apollo/tkUtils/pdumpfs-copy.rb
・・・
"'/storage2/pdumpfs_of/2013/07/11/backup_of' already exists, then skip." ←前回実行分はスキップする。
"'/storage2/pdumpfs_of/2013/07/12/backup_of' .. start on Tue Jul 23 13:19:41 +0900 2013." ← 開始
["rm /storage2/pdumpfs_of/latest"]
["ln -s /storage2/pdumpfs_of/2013/07/11 /storage2/pdumpfs_of/latest"]
["pdumpfs /mnt/NP11-34/storage2/pdumpfs_of/2013/07/12/backup_of /storage2/pdumpfs_of"]
["mkdir -p /storage2/pdumpfs_of/2013/07/12"]
["mv /storage2/pdumpfs_of/2013/07/23/backup_of /storage2/pdumpfs_of/2013/07/12/backup_of"]
・・・
−−−

実行に長時間(何日も)係ることを想定して、途中でハングしたり、Ctrl+C で中断しても、再開後は実行済みの部分をスキップするようになっています。

【pdumpfs-copy.rb】<<<
DEFAULT_SRC_BASE = "/mnt/NP11-34/storage2/pdumpfs_of"
DEFAULT_SRC_NAME = "backup_of"
DEFAULT_DST_BASE = "/storage2/pdumpfs_of"

def get_date_directories(src_dir)
Dir.glob(src_dir+"/????/??/??/").collect{|dir| dir[-12,12] }.sort
end

def main
# →/storage2/pdumpfs_of/2001/01/01/backup_of ・・・ src
# --------base-------- ---date--- --name--- src_base src_date src_name
# →/storage3/pdumpfs_of/2002/02/02/backup_of ・・・ dst
# --------base-------- ---date--- --name--- dst_base dst_date dst_name
# →/storage3/pdumpfs_of/2001/01/01/backup_of ・・・ correct
# --------base-------- ---date--- --name--- correct_base correct_date correct_name
#
src_base = DEFAULT_SRC_BASE # "/mnt/NP11-34/storage2/pdumpfs_of"
src_name = DEFAULT_SRC_NAME # "backup_of"
dst_base = DEFAULT_DST_BASE # "/storage/pdumpfs_of"
#
cor_name = dst_name = src_name
cor_base = dst_base
#
date_directories = get_date_directories(src_base)
p date_directories
# #=>["/2012/08/24/", "/2012/08/25/"・・・"/2012/09/01/", "/2012/09/02/"] 古い順に並んだ配列。
#
latest = dst_base + "/latest"
#
# rescue Interrupt を準備する。
#
dst = src = cor = old = nil
begin
#
date_directories.each{|src_date|
#
# pdumpfs は独自に今日の日付を取り出すので、毎回 dst_date を作成すべき。
# 長時間かかることが予想され、日付をまたいで実行する可能性が多い。
#
# この時刻から、pdumpfs開始の時刻の間で日付が変わった場合には例外で終了するはず。
#
today = Time.now
dst_date = "/%04d/%02d/%02d/" % [today.year,today.month,today.day]
cor_date = src_date
#
old = File.dirname(cor) if cor
src = src_base + src_date + src_name
dst = dst_base + dst_date + dst_name
cor = cor_base + cor_date + cor_name
#
# コピー先に既に存在する場合には、
# 前回の試行で途中で中断した場合であると想定されので、
# スキップする。
#
if File.exist?(cor)
p "'#{cor}' already exists, then skip."
next
end
p "'#{cor}' .. start on #{Time.now.to_s}."
#
# 存在するディレクトリのうち直前のディレクトリを latest にセットする。
#
if old
if File.exist? latest
cmd = "rm #{latest}"
p [cmd]
`#{cmd}`
end
cmd = "ln -s #{old} #{latest}"
p [cmd]
`#{cmd}`
end
#
cmd = "pdumpfs #{src} #{dst_base}"
p [cmd] #=> ["pdumpfs //NP11-34/moc_root/storage2/pdumpfs_of/2012/09/01/backup_of /storage/pdumpfs_of"]
`#{cmd}`
#
raise "'#{dst}' is not created by pdumpfs" if !File.exist?(dst)
#
cmd = "mkdir -p #{File.dirname(cor)}"
p [cmd]
`#{cmd}`
#
# これだと latest がリンク切れになって、次回に全てコピーになってしまうような気がするのだが、
# なぜか、うまくいっているような気がする。
#
if dst != cor
cmd = "mv #{dst} #{cor}"
p [cmd] #=> ["mv /storage3/pdumpfs_of/2012/09/03/ /storage3/pdumpfs_of/2012/09/01/"]
`#{cmd}`
end
}
#
# 例外(中断など)で中間ディレクトリが残っていたら削除する。
#
# 途中で消していくと、次の日の取得に時間がかかる模様。
#
# 最後の raise を忘れたら、中断できなくなったよ。rebootせざるをえなくなった。
#
rescue Interrupt
if dst != cor && File.exist?(dst)
cmd = "rm -r #{dst}"
p [cmd]
`#{cmd}`
end
raise
end
end

main if __FILE__ == $0