Linuxでrsyncを使ってバックアップを自動化する

  • Rsyncは、変更点のみを転送し、ローカルとSSHの両方で権限とメタデータを保持することで、効率的なバックアップを実現します。
  • スクリプト、cron、またはsystemdタイマーを組み合わせることで、rsyncは自動でローテーションする、ほぼメンテナンスフリーのバックアップシステムになります。
  • 除外設定、--delete オプションの適切な使用、監視、復元テストなどの適切な手法は、バックアップの実際の信頼性に大きな違いをもたらします。

Linuxでrsyncを使ってバックアップを自動化する

Linuxサーバーを管理している場合、または失うことのできないデータが入ったコンピューターを所有している場合は、 rsyncを使用してバックアップを自動化する これは事実上必須です。高価なソフトウェアスイートを導入したり、独自のツールに頼ったりする必要はありません。いくつかのよく考えられたコマンドを実行するだけで、堅牢で効率的、かつメンテナンスが容易なバックアップシステムを構築できます。

このガイド全体を通して、 rsyncの基本から高度な編集までローカルバックアップ、SSH経由のリモートバックアップ、スナップショット付きのTime Machineスタイルのバックアップ、本番環境対応スクリプト、cron、systemdタイマー、除外、ローテーション、検証。詳細については、 バックアップ方法の比較 戦略を決定する。この記事の目的は、明確な計画と、実際に自分の環境に合わせて応用できる具体的な手順をまとめることだ。

rsync とは何ですか? なぜバックアップによく使用されるのですか?

Rsyncは、 2つの場所間でファイルとディレクトリを同期する同じコンピュータ上、または異なるマシン間で、通常はSSH経由、または独自のrsyncdデーモンを使用して行われます。

単純な cp や scp と比較した rsync の利点は、スマートなアルゴリズムを実装していることです。 差動ブロック転送ソースと宛先を比較し、変更箇所のみを送信することで、ファイル全体を毎回送信するわけではありません。データ量が多く、変更箇所がごく一部である場合、時間と帯域幅を大幅に節約できます。

さらに、rsyncは ほぼすべてのメタデータを保持するアクセス許可、所有者、グループ、タイムスタンプ、シンボリックリンク、デバイス…だからこそ、コンテンツだけでなくファイルシステムの構成方法も重要となる「本格的な」バックアップに非常に役立つのです。

もう一つの重要な利点は、rsyncが機能することです。 ローカルとリモートの両方これを使用すると、同じサーバー上の2つのフォルダーを同期したり、リモートサーバーからバックアップマシンにデータを取得したり、SSHを使用してリモートのNASやVPSにデータを送信したりできます。

Linux rsync

さまざまなディストリビューションにrsyncをインストールしてテストする

多くのディストリビューションには既にrsyncがインストールされていますが、 インストール状況を確認し、最新バージョンにアップデートしてください。 自動バックアップをマウントする前に、ソースマシンと宛先マシンの両方で確認してください。

DebianまたはUbuntuベースのシステムでは、次のような簡単な操作が可能です。

rsync --version
sudo apt update
sudo apt install rsync

RHEL、CentOS、Rocky Linuxなどのディストリビューション、またはその他の派生ディストリビューションでは、パッケージマネージャを変更するものの、同じ考え方で手順は非常に似ています。 rsyncが利用可能で最新の状態であることを確認してください。 アン・アンボス・エクストリームモス。

rsync --version
sudo dnf install rsync # En sistemas modernos
sudo yum install rsync # En sistemas más antiguos

常に使用する基本的なrsyncオプション

rsyncには豊富なパラメータが用意されていますが、実際にはバックアップ作業の90%は... 少数の選択肢 それは暗記すべきだ。

コマンドの全体的な構造は非常に単純ですが、多くの可能性を広げる重要な点が1つあります。それは、パスの末尾のスラッシュによって動作が変わるということです。

汎用構文:

rsync ORIGEN DESTINO

主な違いは、ソースディレクトリの扱い方にある。

# Copia el directorio como tal dentro del destino
rsync -av /source/dir /backup/

# ディレクトリの内容のみをコピー先にコピーします
rsync -av /source/dir/ /backup/

最も一般的に使用されているバックアップオプションのいくつかは、特に実用的です。 彼らは短い文章の中に多くの要素を詰め込んでいる。:

  • -aファイルモード。-rlptgoD(再帰的、シンボリックリンク、パーミッション、タイムスタンプ、グループ、所有者、特殊ファイルを保持)と同等です。
  • -v「詳細」モード。実行中の処理内容とアクセスしているファイルを表示します。
  • -z: 転送中にデータを圧縮するため、インターネット経由のリモートコピーに最適です。
  • -h: サイズを「見栄えよく」(MB、GBなど)表示し、人間にとって最適にします。
  • -P: 進捗状況と部分的なファイルを組み合わせ、状況を把握し、作業を再開できるようにします。
  • –削除: 送信元に存在しなくなったファイルを宛先で削除し、まったく同じ複製を残します。
  • -n / –ドライラン何も変更せずに実行をシミュレートするので、物事を台無しにしないのに最適です。
  • –除外 / –除外対象: コピーしたくないパターンやルートの完全なリストを除外できます。
  • –リンク先: 以前のコピーとのハードリンクを作成します。これは、Time Machineタイプの増分バックアップの基礎となります。

手動ローカルコピーと最初の例

何かを自動化する前の最初のステップは、 明確で実績のある手動コピーコマンド後ほどスクリプト内で使用する典型的なケースを復習しておきましょう。

ホームディレクトリをクローンしたい場合は ローカルバックアップディスク最小限のコマンドは次のようになります。

rsync -av /home/usuario/ /mnt/disco_backup/usuario/

このrsyncはあなたの ホームページは、権限、日付、構造を完全に保持します。そして、前回以降に欠落している部分や変更された部分のみをコピーするため、複雑な処理をすることなく、非常に効率的な増分コピーが実現されます。

もう一つの典型的な例は同期です プロジェクトデータ、写真、または文書 同じサーバー上、あるいは異なるディスク上の2つのフォルダ間で、常に最新のローカルゲームを2つ用意しておくことができます。

rsync -av /media/fotos/ /backup/fotos/

機密性の高いシステムデータに関しては、 /etc または /var/www元のデータと全く同じコピーを作成し、元のデータから削除された部分をバックアップから削除したいというのはごく自然なことです。そこで役立つのが、有名な削除オプションです。

rsync -av --delete /var/www/ /backup/www/

rsync Linux

SSHを使用して安全なリモートバックアップを実現します。

rsync が真価を発揮するのは、 SSHを使用してサーバーからコピーを送信しますこうすることで、ネットワーク上の別のノード、NAS、またはインターネット上のVPSにデータを保存できます。これにより、単一のデバイスに依存することなく、有名な3-2-1ルール(少なくとも1つのオフサイトコピー)の一部を満たすことができます。

理想的には、毎回手動でパスワードを入力するのではなく、公開鍵認証を設定することをお勧めします。鍵をバックアップサーバーにコピーしておけば、コマンドは非常に直感的に操作できるようになります。

# Empujar datos locales a un servidor remoto de backup
rsync -avz /etc/ backup@servidor-remoto:/backups/etc/

# リモートサーバーからバックアップマシンにデータを取り込む
rsync -avz backup@remote-server:/var/www/ /backups/www/

もう少し洗練されたシナリオでは、調整することができます SSH暗号化、ポート、または圧縮 例えば、サーバーが別のポートでリッスンしている場合や、低速なリンクを最適化したい場合などに、rsync 自体に -e オプションを付けて使用します。

rsync -avz \
-e "ssh -p 2222 -c -o Compression=no" \
/origen/ backup@servidor-remoto:/destino/

接続が弱い場合や共有ネットワークの場合に役立つテクニックは、 リンクの過負荷を避けるため、-bwlimit オプションを指定します。 大規模なバックアップを実行する間も、誰もインターネットに接続できない状態に陥らないようにする。

rsync -avz --bwlimit=5000 /datos/ backup@servidor-remoto:/backups/datos/

rsync を使用したフルバックアップ、差分バックアップ、増分バックアップ

rsyncは既にブロックレベルで差分転送を実行していますが、バックアップ戦略の観点からは、 コピーの種類は、完全コピー、差分コピー、増分コピーの3種類です。これはrsyncのオプションを使って直接実装できます。

完全なコピーは簡単です。ソースのすべてのコンテンツを宛先で再現します。 初期バックアップまたはクリーンな参照用.

# Copia completa de un árbol de directorios
rsync -a /ruta/origen/ /ruta/destino/

差分コピーは、その基本原理に基づいて構築され、コピー先をソースと同期させ、変更点をコピーし、存在しなくなったものを削除することに重点を置いています。これは、通常、あなたが「差分コピー」と言うときに意味するものです。 システムのミラーを用意する.

# Copia diferencial, manteniendo el destino idéntico al origen
rsync -a --delete /ruta/origen/ /ruta/destino/

一番面白いのは「本当の」増分バックアップで、同期に加えて、 データの重複なく、日付ごとに履歴を保存します。ここで役立つのが –link-dest オプションです。このオプションは、変更されていないファイルに対して、以前のコピーへのハードリンクを作成します。

# Copia incremental apoyada en una copia previa
rsync -a --link-dest=/ruta/a/copiaprevia \
/ruta/origen/ /ruta/destino-incremental/

この方法では、各バックアップフォルダは完全なコピーのように見えますが、内部的には 同一のファイルはディスク上のブロックを共有しますこれにより使用容量が大幅に削減され、過去のスナップショットを簡単に閲覧できるようになります。

スナップショットとハードリンクを使用したタイムマシン形式のバックアップ

多くの人がLinuxで、 macOS Time Machineの日付別スナップショットrsync を使えば、--link-dest オプション、ちょっとしたシェルスクリプト、そして少しの工夫を組み合わせることで、完全に可能です。

このアイデアは、最後に正常にバックアップされたディレクトリを指す現在のディレクトリを維持し、同時に新しいディレクトリを作成することです。 タイムスタンプ(日時)付きのフォルダ これは各スナップショットを表します。変更されていないファイルは、前のスナップショットへのハードリンクでリンクされ、実際の差異がある場合にのみ新しいブロックが書き込まれます。

その方式における典型的なコマンドは次のようになるでしょう。

rsync -avPh --delete \
--link-dest="$TARGETDIR/current" \
"$SOURCEDIR/$USER/" \
"$TARGETDIR/$USER-$TIMESTAMP"

その後、スクリプトがシンボリックリンクの更新を処理する。 常に最新のスナップショットを指すようにするそして、日付順に整理された簡単な履歴を保持します。これにより、興味のあるフォルダを開くだけで、過去のコピーを簡単に閲覧できます。

自動化は自然に実現します。スクリプトを次のような場所に保存します。 /usr/local/bin/rsync-time-machine そして、cronを使って、あなたにとって最適な時間に毎日実行されるようにスケジュール設定してください。

0 5 * * * bash /usr/local/bin/rsync-time-machine

cronを使用してバックアップを毎日自動化する

手作業でコピーを作るのがもはや意味をなさなくなる時点が来る。通常のやり方は cronを使用してバックアップをスケジュール設定します そうすれば、ピーク時以外の時間帯(例えば早朝)に自動的に実行されるので、時々ログを確認する以外は、それらの存在を忘れてしまっても大丈夫です。

手順は常に同じです。まず、すべてのオプション(除外設定、ログ記録など)を含めて完全なコピーを作成するスクリプトを作成し、実行権限を与え、適切なユーザーのcrontabに組み込みます。システム全体を変更する場合は、rootユーザーのcrontabにも組み込みます。

ローカルコピー用の簡単なスクリプトの例としては、次のようなものが考えられます。

#!/bin/bash
SOURCE_DIR="/home"
BACKUP_DIR="/backup/home"
LOG_FILE="/var/log/backup/rsync-local.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")

mkdir -p «$BACKUP_DIR» «$(dirname «$LOG_FILE»)»
echo "ローカルバックアップを開始しました" >> "$LOG_FILE"

rsync -av –delete
–exclude='*.tmp' \
–exclude='.cache' \
–exclude='Downloads/*' \
«$SOURCE_DIR/» «$BACKUP_DIR/» >> «$LOG_FILE» 2>&1

もし;ならば
echo » バックアップが正常に完了しました » >> «$LOG_FILE»
ほかに
echo » エラーを含むバックアップ» >> «$LOG_FILE»
fi

例えば、スクリプトを入力すれば、 /usr/local/bin/rsync-local-backup.sh 実行可能ファイルとしてマークすれば、cronに追加して特定の時間に実行されるように設定できます。

sudo chmod +x /usr/local/bin/rsync-local-backup.sh
sudo crontab -e

crontabの中には、次のような内容を記述できます。

0 2 * * * /usr/local/bin/rsync-local-backup.sh

systemdタイマー:cronに代わる現代的な選択肢

現代のシステムでは、 cronの代わりにsystemdタイマーを使用する特に、サービスの統合を改善したい場合、ネットワークの依存関係を管理したい場合、またはjournalctlでログを一元管理したい場合は、この方法が有効です。

要は、バックアップスクリプトを実行するサービスと、その実行タイミングを示すタイマーを定義することです。サービスは次のようになります。


Description=Rsync Backup Service
After=network-online.target
Wants=network-online.target

タイプ=ワンショット
ExecStart=/usr/local/bin/rsync-remote-backup.sh
ユーザー=root
標準出力=ジャーナル
StandardError=journal
タイムアウト秒=7200

WantedBy = multi-user.target

そして、関連するタイマーは次のように定義されます。 毎日午前2時にバックアップを実施 一度にすべてを圧倒しないように、ある程度のランダム性を持たせる。


Description=Daily Rsync Backup Timer
Requires=rsync-backup.service

OnCalendar=*-*-* 02:00:00
永続的=true
ランダム遅延秒=10分

WantedBy=timers.target

これで、systemd をリロードし、タイマーをアクティブにして、プログラムが正しく動作していることを確認するだけです。 サービスログには、指定された時間にコピーが起動されたことが示されています。.

sudo systemctl daemon-reload
sudo systemctl enable --now rsync-backup.timer
systemctl list-timers
journalctl -u rsync-backup.service

バックアップをローテーションで作成する:日次、週次、月次

単一の静的コピーよりももう少し複雑なものが必要な場合は、次のような構造を設定できます。 バックアップのローテーション:日次、週次、月次ハードリンクを使用して容量を節約し、古いファイルを整理します。

典型的なパターンとしては、rsyncで毎回更新される現在のディレクトリを用意し、そのディレクトリツリーを、日ごと、週ごと、月ごとのフォルダへのハードリンクを使ってクローンするという方法があります。

#!/bin/bash
SOURCE_DIR="/var/www"
BACKUP_ROOT="/backup/www"
CURRENT="$BACKUP_ROOT/current"
DAILY="$BACKUP_ROOT/daily"
WEEKLY="$BACKUP_ROOT/weekly"
MONTHLY="$BACKUP_ROOT/monthly"
DATE=$(date +%Y%m%d)
DOW=$(date +%u)
DOM=$(date +%d)

mkdir -p «$CURRENT» «$DAILY» «$WEEKLY» «$MONTHLY»

rsync -av –delete –link-dest=»$CURRENT» \
「$SOURCE_DIR/」 「$CURRENT/」

&& cp -al «$CURRENT» «$DAILY/$DATE»
&& cp -al «$CURRENT» «$WEEKLY/$DATE»
&& cp -al «$CURRENT» «$MONTHLY/$DATE»

find «$DAILY» -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;
find «$WEEKLY» -maxdepth 1 -type d -mtime +28 -exec rm -rf {} \;
find «$MONTHLY» -maxdepth 1 -type d -mtime +365 -exec rm -rf {} \;

このシステムでは かなり妥当な歴史的展望 ディスクを完全なコピーで埋め尽くすことなく、各スナップショットは通常のフォルダのようにナビゲート可能です。

データの変更頻度が高い場合やデータ量が非常に大きい場合は、保持期間や頻度を調整したり、LVMやZFSのスナップショットと組み合わせたりすることで、データベースや仮想マシンの一貫性を確保できます。

バックアップが有用かどうかを監視、検証し、確認しましょう。

バックアップタスクを毎日実行するのは素晴らしいことですが、 誰も結果を確認しない場合 それはあまり役に立ちません。最後にバックアップが行われたかどうか、またいつ行われたかを把握するために、基本的な監視システムを設定することが重要です。

簡単な方法としては、バックアップが正常に完了するたびに、保存先のフォルダに小さなマーカーファイル(例えば、日付入りの「.last-backup-success」ファイル)を残しておくことです。そうすれば、外部スクリプトやNagios/Icingaのチェック機能を使って、そのファイルが古すぎる場合に警告を発することができます。

MARKER="/backup/www/.last-backup-success"
if ; then
echo "Marcador de backup no encontrado"
exit 1
fi

もう一つの健康的な習慣は、 rsyncのログにエラーや異常な転送速度がないか確認してください。「ファイル数」、「合計サイズ」、「速度向上率」などの統計情報を抽出するスクリプトを使用すると、処理状況の概要を素早く把握できます。

そしてもちろん、本当に違いを生むのは、時折それに慣れることだ。 本格的な修復を行う特定のファイルを選択し、昨日または先週のバージョンを復元して、正しく開くかどうかを確認してください。万が一、何か問題が発生した場合でも、バックアップが確実に機能することを保証できる唯一の方法です。

適切に設定されたrsync、cronまたはsystemdによる自動化、適切なローテーション、監視、復元テストなど、これらの要素をすべて統合すると、最終的に 堅牢で柔軟性があり、かつ安価なLinuxバックアップシステムこれは、利便性や信頼性を損なうことなく、フリーソフトウェアの利点を最大限に活用できるものです。

関連記事
Windowsで増分バックアップを作成するための完全ガイド

優先ソースとして追加