バックアップをとろう(その5)
前回の続きです。
まずは、do_backup()の実装から。
def do_backup(partition, dest_mtpt): """ 関数 doBckup: rsyncを利用してバックアップコピーをとります パラメータ partition コピー元となるパーティションの名前(文字列) ex 'boot' dest_mtpt コピー先となるディレクトリ(文字列) ex '/mnt/backup' """ #文字列 source_node #バックアップ元となる論理ボリュームもしくは物理パーティション #の名前を格納します source_node = LFS.get_devnode(partition) #文字列 source_mtpt #バックアップ元のマウントポイント #通常は、/etc/fstabにあるマウントポイントをそのまま利用します source_mtpt = LFS.get_mountpoint(partition) # コピー元の処理 # FSタイプをmount_cmdに追加します file_system = LFS.get_filesystem(partition) mount_cmd_ext = ['-t', file_system] # nilfs2パーティション用のマウントポイント、オプションスイッチ設定 if file_system == 'nilfs2': # nilfs2パーティションでは、スナップショットを特別な場所に # マウントします source_mtpt = MNT_ROOT + "/src/" + partition # 直近のチェックポイントを変数check_pointに格納します lscp_result = Popen(('/usr/bin/lscp', '-r', '-n1', \ source_node),stdout=PIPE).communicate()[0] check_point = lscp_result.split()[7] # nilfs2のsnapshotを作成します exec_command('chcp', [source_node, check_point]) # snapshotをマウントする為のオプションを設定します mount_cmd_ext.extend(["-o", "ro,cp="+check_point]) # コピー元をマウントする必要があるかどうか調べます need_mount = True if not LFS.is_automount(partition)\ or file_system == 'nilfs2' else False if need_mount: # もしsource_mtptが存在しなければ、作成します if not os.path.exists(source_mtpt): os.makedirs(source_mtpt) # コピー元をマウントします exec_command('mount', mount_cmd_ext + [source_node, source_mtpt]) # ファイルをコピーします exec_command('rsync', [source_mtpt+'/', dest_mtpt]) if need_mount: exec_command('umount', [source_mtpt]) # def do_backup():
マウントしてコピーして、マウント解除するという流れなんですが、これが、main関数にも同じような処理があって、非常に煩わしい。ということで、Partitionクラスを導入することにしました。このクラスは、大体こんな感じのプロトタイプになります。
class Partition(): """ パーティションを管理するクラス 適切な方法で、自身をマウントしたりアンマウトできます """ def __init__(self, name): pass def mount(self): """ マウントする """ pass def umount(self): """ アンマウントする """ # アンマウントしなければいけないのは、 # 1.オートマウントでないのにマウントされたパーティション # 2.nilfs2のスナップショットを利用したパーティション pass def get_mtpt(self): """ マウントポイントを返す """ pass # class Partition():
このクラスを使うと、前述のdo_backup()関数はこんな感じになります。
def do_backup(partition, dest_mtpt): """ 関数 doBckup: rsyncを利用してバックアップコピーをとります パラメータ partition コピー元となるパーティションの名前(文字列) ex 'boot' dest_mtpt コピー先となるディレクトリ(文字列) ex '/mnt/backup' """ src_part = Partition(partition) src_part.mount() exec_command('rsync', [src_part.get_mtpt() + '/', dest_mtpt]) src_part.umount() # def do_backup():
ほとんどコメントがいらないくらいスッキリ