system management
1752402 メンバー
6344 オンライン
108788 解決策
新規ポスト

ファイルシステムのバックアップ(同期)方法

 
komutan
アドバイザー

ファイルシステムのバックアップ(同期)方法

大変お世話になっております。

ファイルシステムのバックアップ(同期)方法について教えていただきたく投稿いたしました。

環境

バックアップ元

zx6000:/usersローカルファイルシステム

バックアップ先

NFSサーバ上 /backup(NFS3でマウント済み)

一度フルバックアップを行った後、次の日のバックアップ時には更新されたファイルのみバックアップを行う仕組みを

作りたいと考えています。

rsyncコマンドを使うのが一番簡単かと

思いますが、あえてコマンドを組み合わせたスクリプトによるバックアップを行う場合のスクリプトを教えていただければと思います。

すべて教えてというのは大変心苦しいのですが、宜しくお願いいたします。

5件の返信5
nt
貴重なコントリビューター

ファイルシステムのバックアップ(同期)方法

動作確認はしていませんが、 find と cpio を組み合わせて

#! /bin/sh

cd /users

touch .new_date

if

then

# incremental

find . -newer .old_date -print |

cpio -pxdm /backup

else

# full

find . -print |

cpio -pxdm /backup

fi

rm -f .old_date

mv -f .new_date .old_date

このような感じでいかがでしょうか? ただし、これだけでは

不十分でいろいろと考えなければいけないことがあります。

"同期" と考えると消されたファイルは消されるべきですが、

"バックアップ" と考えるといつ消すべきか等です。

単純な例を元に必要な機能を簡単に追加していけるのが shell

programming の楽しい所ですよね。

hazelwood
信頼あるコントリビューター

ファイルシステムのバックアップ(同期)方法

単純に

cd /users ; find . -print | cpio -pxdm /backup

でできると思います。(cpioの"u"オプションをつけなければ、更新されていないファイルは上書きされないはず。)

または、

fbackup -i /users -f - | (cd /backup; frecover -Xrf - )

でよろしいかと。ただし、この例では、全ファイルを一度吸い上げてしまうので、fbackupに-uと-0〜-9を使用することで差分バックアップにするとよいでしょう。

目的の処理をシェルスクリプト(とcp)だけで組むと、

---------------------

#!/usr/bin/sh

src=/users

BKUP=/backup

copy_subdir ()

{

for f in ${1}/*; do

if ] ; then

if ]; then

mkdir -p ${BKUP}/${f}

fi

copy_subdir ${f}

else

if ] ; then

cp -p ${SRC}/${f} ${BKUP}/${f}

fi

fi

done

}

cd ${SRC}

copy_subdir ./

-----------------------

という感じでしょうか。

(あまりテストしていないので、間違っていたらご容赦ください。)

削除されたファイルを消すことを考えるともっと複雑になります。(その場合は、Perlで書いた方がいいかも知れません。)
hazelwood
信頼あるコントリビューター

ファイルシステムのバックアップ(同期)方法

バックアップ元のファイルが削除されたときにバックアップ先も削除するための処理を考えてみたのですが、以下のようにしてできると思います。(すいませんが、処理の概要だけ書きます。)

cd /users; find . -print | sort >/tmp/src

cd /backup; find . -print | sort >/tmp/backup

で、/tmp/srcと/tmp/backupのdiffをとることで、削除されたファイル名をピックアップできると思います。

後は、それらを消すだけ。

/backupの容量の方が大きければ、最初に差分コピーしてから削除するようにすれば、スクリプトが少しだけ楽になると思います。同程度か、/backupの方が小さければ、先に削除してやらないとfilesystem fullを起こす可能性があります。

nt
貴重なコントリビューター

ファイルシステムのバックアップ(同期)方法

> cd /users; find . -print | sort >/tmp/src

> cd /backup; find . -print | sort >/tmp/backup

> で、/tmp/srcと/tmp/backupのdiffをとることで、削除された

> ファイル名をピックアップできると思います。

この場合は diff よりは comm の方が使いよいかと。

>  後は、それらを消すだけ。

消す場合は rev で list の最後から消さないと、directory ごと

削除した場合空の directory が残ります。

hazelwood
信頼あるコントリビューター

ファイルシステムのバックアップ(同期)方法

なるほど、commで表示させるカラムを限定すれば処理が楽になりますね。

勉強になりました。