すでに多くのバックアップ投稿があり、特にLinuxの場合が多くあります。 バックアップのセットアップも担当しました。
システムのバックアップ、マウントされたパーティションのデータ、およびLVMボリューム(仮想マシンディスク)を作成する必要がありました。 Bacula、tkを使用する考えがありました。 私はそれをよく知っていますが、自宅には1台のコンピューターしかないため、クライアントサーバーアーキテクチャは、システムの損傷から回復する際に追加の困難を引き起こすだけです。 したがって、システムとデータをコピーし、ddを使用してパーティションのLVMイメージを作成します。 毎日(少なくともデータ)バックアップを作成し、少なくとも14日間保存したかった。 しかし、すべてのニーズを満たす既製のシンプルなソリューションの検索は失敗しました。 そのため、bashを手に取り、自転車を作成します。 この記事では、何が起こったかを共有します。
免責事項:スクリプトを書くとき、すべてを行うモンスターを書く目的はありませんでした。 バックアップするためのシンプルで信頼できる方法が必要でした。 スクリプトの不正確さとボトルネック(エラーが発生する可能性のあるもの)に感謝します。 この記事は、既製のソリューションを探しているLinuxの初心者と、自分自身を書くのが面倒な怠け者のために、より詳細に設計されています。
ベースライン:
- OS:Arch Linux
- ルートファイルシステム(/):btrfs、すべてのファイルをコピーする必要があります。
- データセクション(/ mnt / data /):btrfs。
- LVMボリューム(/ dev / virt_image_array / *)。
- バックアップのセクション(/ mnt / backup /:etx4、バックアップコピーがここに追加されます。
- 必要なユーティリティ(基本ディストリビューションに含まれているものを除く):rsync、btrfs-progs(btrfsの管理用)。
毎週1回、すべての完全なコピーを作成し、btrfsを使用してセクションのスナップショットを毎日作成することが決定されました。 LVMボリュームのスナップショットを作成することもできますが、私にとっては週ごとのデータ損失は重要ではないため、週ごとのコピーで十分です。
したがって、スクリプト番号1は、/ mnt / backup / root / "day number" /にルートパーティションファイルのコピーを作成します。
スクリプト番号1
#!/bin/bash set -e echo "Date_start: `date +%Y-%m-%d-%H-%M-%S`" # ### Vars ### # (1970 ) day=$((`date +%s` / (60*60*24))) # dayexp=21 # path="/" # ( ) spath="/snapshots/backup_script/" # dpath="/mnt/backup/root/" ### Delete Old Backups ### # find $dpath -maxdepth 1 -type d -mtime +$dayexp -exec rm -rf {} \; ### Check exist snapshot ### # , , if (( "`btrfs subvolume list $path | grep backup_script |wc -l`" > 0 )) then echo "Warning: Snapshot exist, deleting" btrfs subvolume delete $spath fi ### Create snapshot ### # btrfs subvolume snapshot $path $spath ### Rsync ### # rsync -aAXv $spath $dpath$day ### Delete snapshot ### # btrfs subvolume delete $spath echo "Backup succesful complete" echo "Date_end: `date +%Y-%m-%d-%H-%M-%S`" exit 0
スクリプト2は、ルートFSのスナップショットを作成します(スクリプトは、ロジックの最初のものと非常に似ているため、相違点についてのみコメントします)。 スナップショットの名前はauto_ "day number"です。
スクリプト番号2
#!/bin/bash set -e echo "Date_start: `date +%Y-%m-%d-%H-%M-%S`" ### Vars ### day=$((`date +%s` / (60*60*24))) dayexp=14 path="/" spath="/snapshots/" ### Delete Old Backups / Check existing snapshot ### # , btrfs subvolume list $path |grep auto |sed -e '1,$ s/.*_//g'| while read ONE_OF_LIST do if [[ "$ONE_OF_LIST" -lt "$day - $dayexp" ]] then echo "remove: $spath"auto_"$ONE_OF_LIST" btrfs subvolume delete $spath"auto_"$ONE_OF_LIST fi if [[ "$ONE_OF_LIST" -eq "$day" ]] then echo "Eroor: snapshot auto_$ONE_OF_LIST exist. Stop script execution." exit 1 fi done ### Create snapshot ### btrfs subvolume snapshot $path $spath"auto_"$day ### End ### echo "Snapshot succesful created" echo "Date_end: `date +%Y-%m-%d-%H-%M-%S`" exit 0
スクリプトNo. 3は、LVMボリュームのコピーを作成します。
スクリプト番号3
#!/bin/bash set -e echo "Date_start: `date +%Y-%m-%d-%H-%M-%S`" ### Vars ### day=$((`date +%s` / (60*60*24))) dayexp=21 # LVM path="/dev/virt_image_array/win_home_system" spath="/dev/virt_image_array/backup_lvm1" dpath="/mnt/backup/lvm1/" ### Delete Old Backups ### find $dpath -maxdepth 1 -type f -mtime +$dayexp -exec rm -rf {} \; ### Check exist snapshot ### # , , if (( "`ls /dev/virt_image_array |grep backup_lvm1|wc -l`" > 0 )) then echo "Warning: Snapshot exist, deleting" lvremove --autobackup y -f $spath fi ### Create snapshot ### # , , . 10 Gb. lvcreate --size 10G --snapshot --name backup_lvm1 $path # echo #echo "y"| lvcreate --size 10G -A y --snapshot --name backup_lvm1 $path ### DD ### # bs, 16M dd if=$spath of=$dpath$day bs=16M ### Delete snapshot ### lvremove --autobackup y -f $spath echo "Backup succesful complete" echo "Date_end: `date +%Y-%m-%d-%H-%M-%S`" exit 0
/ mnt / dataからデータをバックアップするスクリプトはスクリプト1と2に似ているので、それらを記述する必要はないと思います。
crontabに追加して、バックアップを作成する頻度を決定します(私の例では、バックアップは週に1回、スナップショットは1日1回作成されます)。
20 01 * * 1 /usr/bin/backup_root.sh >> /var/log/backup_root.log 2>&1 50 01 * * 1 /usr/bin/backup_lvm1.sh >> /var/log/backup_lvm.log 2>&1 20 01 * * * /usr/bin/snapshot_root.sh >> /var/log/snapshot_root.log 2>&1
私は他に何をねじ込むことができます:
- さらにバックアップを作成する必要があるがスペースがない場合は、重複排除機能を備えたファイルシステム(たとえば、Opendedup)を配置できますが、データストレージの信頼性は低下します。
- ストレージは、NFSまたはsshfsを介して接続されたフォルダーにすることができます。
- バックアップまたはスナップショットを1日に1回よりも頻繁に作成する必要がある場合は、1970年以降の日数をカウントするのではなく、時間(松葉杖、バックアップの日付がさらにわかりにくい)を数えることができます。
UPD。 Onix74は、スクリプトを微調整するようにアドバイスしました 。