Ubuntuのrsyncで自動バックアップシステムを作る方法

ストレージ

UbuntuでバックアップといえばCPコマンドを思い浮かべる方も多いですが、rsyncを使うと「変更されたファイルだけを転送する」差分バックアップが実現できます。実際に検証してみると、初回フルバックアップ後の2回目実行では転送量がほぼゼロになり(speedup 63,937倍)、サーバーへの負荷も通信量も大幅に削減できることが分かりました。

この記事では Ubuntu 24.04 LTS を使って、rsyncのインストールから自動バックアップの設定まで、実際にコンテナで動かした実測データをもとに解説します。

この記事のポイント

  • sudo apt install rsync 1コマンドで導入できる(バージョン 3.2.7、Ubuntu 24.04 標準)
  • 差分バックアップの効率が圧倒的:変更ファイルのみ転送し、初回の 63,937倍 高速になる(実測)
  • cron か systemd timer でスケジュール実行し、完全に自動化できる
  • --delete オプションで「バックアップ先にだけある古いファイルを自動削除」できるが、誤操作に注意
  • VPSにSSHで接続してリモートバックアップにも応用できる

動作確認環境

本記事のコマンドはすべて Ubuntu 24.04 LTS(Docker公式イメージ ubuntu:24.04)で実際に実行し、その stdout を掲載しています。Ubuntu 22.04 でも rsync 3.2.7 が利用可能です(バージョン比較は後述)。

目次

  1. rsyncとは何か
  2. rsyncのインストール
  3. 基本的な構文とよく使うオプション
  4. バックアップスクリプトを作る
  5. cronで毎日自動バックアップ
  6. systemd timerで自動バックアップ
  7. Ubuntu 22.04 vs 24.04 バージョン比較
  8. よくあるエラーと解決策
  9. まとめ

rsyncとは何か

rsync(remote sync)は、ローカルとリモートのあいだでファイルを高効率に同期するコマンドです。1996年にAndrew Tridgellが開発し、現在もLinux/Unix環境でバックアップの定番ツールとして使われ続けています。

普通の cp コマンドとの最大の違いは、「差分転送アルゴリズム」を使っている点です。ファイルをブロック単位で比較し、変更があった部分だけを転送します。実際に Ubuntu 24.04 のコンテナで検証すると、初回バックアップ後に2ファイルだけ変更した場合、転送量がほぼゼロになりました。

rsync 初回フルバックアップ vs 差分バックアップの実行ログ(Ubuntu 24.04)
rsync 初回フルバックアップ vs 差分バックアップの実行ログ(Ubuntu 24.04)

rsyncのインストール

Ubuntu 24.04 には rsync がデフォルトでインストールされていない場合があります。まず apt で追加しましょう。




ubuntu@linuxlab: ~
$ sudo apt update
Fetched 39.6 MB in 3s (13.0 MB/s)
Reading package lists… Done
$ sudo apt install -y rsync
The following NEW packages will be installed:
libpopt0 rsync
Get:2 …/noble-updates/main rsync arm64 3.2.7-1ubuntu1.5 [437 kB]
Setting up rsync (3.2.7-1ubuntu1.5) …
$ rsync –version | head -1
rsync version 3.2.7 protocol version 31
rsyncのaptインストールログ(Ubuntu 24.04 実測)
rsyncのaptインストールログ(Ubuntu 24.04 実測)

インストールは1ステップで完了します。依存パッケージは libpopt0 のみで、合計インストールサイズは 808 KB と非常に軽量です(ubuntu:24.04 公式イメージでの実測値)。

基本的な構文とよく使うオプション

rsync の基本構文は次の通りです。




ubuntu@linuxlab: ~
# ローカル間のバックアップ(基本形)
$ rsync -av /送信元/ /送信先/
sending incremental file list
file1.txt
file2.txt
sent 452 bytes received 111 bytes
# SSHを使ったリモートへのバックアップ
$ rsync -av -e ssh /home/ubuntu/ user@192.168.1.10:/backup/
# –delete で送信元にないファイルを送信先から削除
$ rsync -av –delete /home/ubuntu/ /mnt/backup/

よく使うオプションをまとめると次の通りです。

オプション 意味 用途
-a アーカイブモード(-rlptgoD の省略) バックアップの基本。ほぼ必須
-v 詳細表示(verbose) 何が転送されたか確認できる
--delete 送信元にないファイルを送信先から削除 完全な同期。誤削除に注意
--stats 転送統計を表示 差分転送の効果確認に便利
--dry-run 実際には転送せず、何が転送されるか表示 本番実行前の確認に必須
--exclude='*.log' パターンに一致するファイルを除外 ログや一時ファイルを除く
-e ssh SSH経由で転送 リモートサーバーへのバックアップ

注意:--delete の使用

--delete は送信先にのみ存在するファイルを削除します。送信元と送信先を間違えると大切なファイルを消してしまう恐れがあります。初めて使う場合は 必ず --dry-run を先に付けて、削除対象を確認してから実行してください。

バックアップスクリプトを作る

毎回手でオプションを打つのは大変なので、スクリプトにまとめましょう。

手順1:スクリプトファイルを作成する




ubuntu@linuxlab: ~
$ sudo nano /usr/local/bin/rsync-backup.sh

エディタが開いたら、以下の内容を入力します。




/usr/local/bin/rsync-backup.sh
#!/bin/bash
# 変数を設定
BACKUP_SRC=”/home/ubuntu/”
BACKUP_DST=”/mnt/backup/”
LOG=”/var/log/rsync-backup.log”

# バックアップ実行(差分転送 + 削除同期 + 統計表示)
rsync -av –delete –stats \
–exclude=’*.tmp’ \
–exclude=’.cache/’ \
“$BACKUP_SRC” “$BACKUP_DST” \
>> “$LOG” 2>&1

# 終了コードをログに残す
echo “rsync exit code: $? at $(date)” >> “$LOG”

手順2:実行権限を付与する




ubuntu@linuxlab: ~
$ sudo chmod +x /usr/local/bin/rsync-backup.sh
$ ls -la /usr/local/bin/rsync-backup.sh
-rwxr-xr-x 1 root root 287 Jun 13 11:30 /usr/local/bin/rsync-backup.sh
# テスト実行(まず –dry-run で確認)
$ sudo bash /usr/local/bin/rsync-backup.sh –dry-run

バックアップ先ディレクトリ(/mnt/backup/)は事前に sudo mkdir -p /mnt/backup で作成しておいてください。外付けHDDやNASをマウントした場所を指定するのが一般的です。

cronで毎日自動バックアップ

スクリプトが用意できたら、cron を使って毎日決まった時刻に自動実行させましょう。cron はLinuxに古くから存在するスケジューラで、シンプルな書式で定期実行を設定できます

手順1:cronをインストール




ubuntu@linuxlab: ~
$ sudo apt install -y cron
Setting up cron (3.0pl1-184ubuntu2) …
$ sudo systemctl enable –now cron
Synchronizing state of cron.service with SysV service script…
$ sudo systemctl status cron
● cron.service – Regular background program processing daemon
Active: active (running)

手順2:crontabにバックアップを登録




ubuntu@linuxlab: ~
# rootのcrontabを編集(sudo crontab -e)
$ sudo crontab -e
# エディタが開くので、末尾に以下を追加:
0 2 * * * /usr/local/bin/rsync-backup.sh
# 保存後、登録を確認
$ sudo crontab -l
0 2 * * * /usr/local/bin/rsync-backup.sh
cron を使った自動バックアップ設定の流れ(Ubuntu 24.04)
cron を使った自動バックアップ設定の流れ(Ubuntu 24.04)
cron + rsync 自動バックアップ設定手順(Ubuntu 24.04 実測)
cron + rsync 自動バックアップ設定手順(Ubuntu 24.04 実測)

cron の書式は「分・時・日・月・曜日」の5フィールドです。0 2 * * * は「毎日午前2時ちょうど」を意味します。バックアップは読者が寝ている深夜帯に設定するのがおすすめです。

著者アイコン
著者アイコン

正直、crontab の書式は最初は「5つも覚えるの?」と思いがちです。ただ実際には 0 2 * * *(毎日2時)か 0 2 * * 0(毎週日曜2時)くらいしか使わないので、丸暗記せずにこの2パターンを覚えておけば十分です。

翌日以降、ログファイルで実行結果を確認できます。




ubuntu@linuxlab: ~
# バックアップログを確認
$ sudo tail -20 /var/log/rsync-backup.log
Number of regular files transferred: 2
sent 320 bytes received 54 bytes 748.00 bytes/sec
total size is 20,971,543 speedup is 63,937.63
rsync exit code: 0 at Sun Jun 14 02:00:05 JST 2026

speedup is 63,937 というのが差分バックアップの効果です。初回に約21MBを転送したあと、2ファイルだけ変更した2回目では 320 bytes しか転送しませんでした(ubuntu:24.04 コンテナで実測)。

rsync 差分バックアップの実測比較(初回 vs 差分)
rsync 差分バックアップの実測比較(初回 vs 差分)

systemd timerで自動バックアップ(上級者向け)

cron より少し設定が複雑ですが、systemd timer を使うとより堅牢な自動バックアップが実現できます。cron との最大の違いは「サーバーが止まっていてスケジュール時刻を逃した場合に、起動後に自動で実行し直す(Persistent=true)」機能があることです。VPSを使っている場合にとくに便利です。

比較項目 cron systemd timer
設定の難しさ ★★☆☆☆(簡単) ★★★☆☆(中程度)
ログ確認 /var/log/syslog または独自ログ journalctl -u rsync-backup.service
起動遅れのリカバリ なし Persistent=true で自動実行
推奨用途 入門・シンプルな定期実行 本番VPS・確実性が必要な場合

手順1:service ファイルと timer ファイルを作成




ubuntu@linuxlab: ~
# serviceファイルを作成
$ sudo nano /etc/systemd/system/rsync-backup.service
[Unit]
Description=Daily rsync backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/rsync-backup.sh

# timerファイルを作成
$ sudo nano /etc/systemd/system/rsync-backup.timer
[Unit]
Description=Run rsync backup daily at 2:00

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

手順2:timer を有効化・起動する




ubuntu@linuxlab: ~
$ sudo systemctl daemon-reload
$ sudo systemctl enable –now rsync-backup.timer
Created symlink … rsync-backup.timer → …
# 次回の実行時刻を確認
$ sudo systemctl list-timers rsync-backup.timer
NEXT LEFT LAST UNIT
Sun 2026-06-14 02:00:00 JST 14h – rsync-backup.timer
# 実行ログは journalctl で確認
$ sudo journalctl -u rsync-backup.service –since “today”
systemd timer によるrsync自動バックアップ設定(概念図)
systemd timer によるrsync自動バックアップ設定(概念図)

Ubuntu 22.04 vs 24.04 バージョン比較

Ubuntu 22.04 LTS を使っている方向けに、バージョン差を実測で確認しました。

Ubuntu 22.04 vs 24.04 rsync バージョン比較(実測)
Ubuntu 22.04 vs 24.04 rsync バージョン比較(実測)

重要な点として、rsync 3.2.7 は Ubuntu 22.04 / 24.04 両方で利用可能で、機能上の差はほとんどありません。パッケージのメンテナンスバージョン(末尾の数字)が異なるだけです。この記事で紹介した手順はどちらのバージョンでも同じように動作します。

よくあるエラーと解決策

①「rsync: command not found」が出る

rsync がインストールされていません。sudo apt install rsync を実行してください。Ubuntu 24.04 ではデフォルトで入っていない場合があります。

②バックアップ先に空き容量がない




ubuntu@linuxlab: ~
rsync error: error in file IO (code 11) at receiver.c(385)
# 対処: バックアップ先の空き容量を確認する
$ df -h /mnt/backup
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 50G 49G 1.0G 98% /mnt/backup
# 古いバックアップを削除するか、容量を追加する

③SSHリモートバックアップで「Permission denied」

SSH鍵認証が必要です。パスワードなしで接続できるように ssh-keygen で鍵を生成し、ssh-copy-id user@server で公開鍵を送信先サーバーに登録してください。詳細は UbuntuのSSH設定ガイド を参照してください。

④cronでrsyncが動かない(PATHの問題)




ubuntu@linuxlab: ~
# cron は PATH が限定されているため、絶対パスで書く
0 2 * * * /usr/bin/rsync -av /home/ubuntu/ /mnt/backup/
# rsyncのパスを確認するには which コマンド
$ which rsync
/usr/bin/rsync

cron の実行環境は通常のシェルと異なり、PATH が制限されています。スクリプト内でコマンドを絶対パス(/usr/bin/rsync)で書くか、スクリプト冒頭に PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin を追加してください。

まとめ

rsync を使った Ubuntu の自動バックアップシステムについて、実測データとともに解説しました。

この記事のまとめ

  • rsync 3.2.7 は sudo apt install rsync で即インストール可能(Ubuntu 24.04)
  • 差分転送の効率は圧倒的:2ファイルのみ変更時、転送量は初回の約 1/65,000 になった(実測)
  • バックアップスクリプト + cron で毎日自動実行できる(0 2 * * * = 毎日午前2時)
  • 本番VPSには systemd timer(Persistent=true)で起動遅れのリカバリにも対応できる
  • cron 実行時は /usr/bin/rsync など絶対パスで書くとPATH問題を回避できる

自宅サーバーや VPS で重要なデータを管理しているなら、rsync の自動バックアップは必須の設定です。まずは --dry-run でプレビューしながら、安心して設定を進めてみてください。

本格的にVPSでサーバーを運用したい方は、費用対効果の高いVPSサービスを比較した記事も参考にしてみてください。

コメント

タイトルとURLをコピーしました