プラットフォーム情報:
OpenBSD 6.2 amd64
$ rsync --version rsync version 3.1.2 protocol version 31
daily.local
大容量ディレクトリ(4TB)を次のファイルと同期しようとしています(これはデフォルトではLinux管理者の毎日のクローン操作です)。
#!/bin/sh
# Sync the primary storage device to the backup disk
/usr/local/bin/rsync -avz /mnt/media_primary/ /mnt/media_backup/
初期のrsyncコピーには1日以上かかります。 1日か2日後、プロセスリストに実行中のrsyncコピーが複数表示されます。新しいプロセスが予定通りに開始され、これらの新しいプロセスが互いに競合しているように見え、タスクを完了できません(少なくとも高速ではありません)!
新しいrsyncプロセスが他のrsyncプロセスを認識するようにする方法(またはrsync競合状態を防ぐ他の方法)はありますか?
最初にディレクトリをコピーしたり、スケジュールされた間隔を増やすためにrsyncを手動で実行できることを知っています。オンラインでこのトピックに関する情報が見つからないため、この質問にもっと興味があります。
答え1
解決策は次のように似ています。マークのソリューション/etc/fstab
ただし、ファイルシステムを変更したり、マウントおよびアンマウントする必要はありません。
#!/bin/sh
lockdir=/tmp/file-copy.lock
if ! mkdir "$lockdir"; then
echo 'File copy already in progress' >&2
exit 1
fi
trap 'rmdir "$lockdir"' EXIT
PATH=$PATH:/usr/local/bin
rsync -ai ...
これに関するいくつかの注意:
ディレクトリがすでに存在する場合はタスクは失敗しますが、ディレクトリがない場合はディレクトリが作成されるの
mkdir
と同じアトミックタスクです。mount
ロックを最初に確認するよりもこれが安全です。文書その後、作成します(2つのステップ間に競合条件がある可能性があります)。この
EXIT
トラップは、スクリプトの終了時にロックされたディレクトリが削除されることを保証します。ロックディレクトリはにあるため、再起動時にシステムによって削除されます/tmp
。フルパスで呼び出す
PATH
のではなく、適切な値に設定しました。rsync
これは純粋に装飾的なものですが、後でOpenBSDポートコレクションの他のコマンド(restic
または)を使用するようにスクリプトを拡張する場合にborgbackup
便利です。このオプションには、
-z
実際にはrsync
次のものだけが必要です。非常に遅いネットワーク接続(ネットワーク帯域幅より速くデータを圧縮/圧縮解除する場合)といいえローカル複製用。私も-i
(--itemize-changes
)より-v
()を好みます。--verbose
なぜなら、ファイル転送の目的を正確に伝えるからです。
大量のデータを安全にバックアップするには、通常、次rsync
のように特別に作成されたバックアップソフトウェアを使用することをお勧めします。restic
またはborgbackup
。どちらも重複排除と暗号化も可能で、オプションborgbackup
で圧縮することもできます。サーバーがまだインストールされていない場合でも、外部サーバーにバックアップを保存できますが、ターゲットシステムにソフトウェアをインストールする必要があることをお勧めしますrestic
。両方ともバックアップストレージロックを処理します。sftp
restic
borgbackup
restic
borgbackup
答え2
この問題を解決する1つの方法(バックアップディレクトリが独自のパーティションにある場合)は、ボリュームをアンマウントされたままにして、rsyncコマンドを開始する前にボリュームをマウントすることです。これにより、使用する必要がなくなり、flock
ドライブの寿命が延び、消費電力が低くなるという利点があります。
/etc/fstab
:noauto
起動時に自動的にインストールされないようにパーティションにオプションを追加します。
進行中のタスクdaily.local
またはcron.daily
スケジュールされたタスク:
#!/bin/sh
mount /mnt/media_backup && \
/usr/local/bin/rsync -avz /mnt/media_primary/ /mnt/media_backup/ && \
umount /mnt/media_backup
&&
デュアルアンパサンド演算子()は、前のコマンドが成功した場合にのみ次のコマンドを開始します。したがって、バックアップディスクをマウントできない場合(すでにマウントされていてrsyncがすでにパーティションで実行されているため)、残りのコマンドは続行されません。