Linuxのrsyncでディレクトリをリモートにバックアップする方法

Linuxのrsyncでディレクトリをリモートにバックアップする方法

Linuxでファイルやディレクトリをネットワーク経由でリモートにバックアップするときによく利用されるのがrsyncコマンドです。

そこでここではRedHat系Linux(AlmaLinux)を例に、rsyncコマンドを使ってディレクトリをリモートマシンにバックアップ(同期)する方法を解説します。

rsyncコマンドの書式とオプション

書式

rsync [オプション] コピー元 コピー先

オプション

rsyncにはたくさんのオプションが用意されていますが、主なオプションは次のとおりです。

オプション説明
-v実行内容を表示する
-q実行状況の表示しない
-n実際には実行せずに、動作内容だけを表示する(試験モード)
-aアーカイブモード
-r再帰的にコピーする
-z転送データを圧縮する
--delete削除ファイルを同期

rsyncコマンドの使い方

rsyncのインストール

まず、ローカル側(コピー元)とリモート側(コピー先)の双方にrsyncをインストールします。

# dnf install rsync

また、rsyncではデフォルトでリモートマシンへの接続にSSHが使用されるため、リモート側でSSHサーバーが動作していることが前提となりますが、ここでは、SSHを使わずにrsync独自のポート(TCP873番ポート) で接続する方法を紹介したいので、rsyncをサービスとして(daemonモードで)動作させるためのパッケージをリモート側にインストールします。

# dnf install rsync-daemon

ちなみに、rsyncをサービスとして動作させることで、ユーザー認証を省略させたり、コピー元を制限したりといった設定ができます。

rsyncの設定(リモート側)

次に、リモート側でrsyncの設定を追記します。

# vi /etc/rsyncd.conf

pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
transfer logging = yes

[backup]
path = /srv/backup ←コピー先のディレクトリ
hosts allow = 192.168.53.12 ←コピー元マシンのIPアドレス
hosts deny = *
list = true
uid = root
gid = root
read only = false

設定を記述したら、バックアップを保存するディレクトリを作成します。

# mkdir /srv/backup

次に、rsyncのサービスを自動起動するよう設定して、ファイアウォールで通信を許可します。

# systemctl enable --now rsyncd
# firewall-cmd --add-service=rsyncd --permanent
# firewall-cmd --reload

なお、SELinuxが有効な環境では、以下の設定も必要になります。

# setsebool -P rsync_full_access on

rsyncでバックアップ

上の設定が完了したら、ローカル側から以下ようにコマンドを実行することで、ローカルの指定したディレクトリ「/home/test/」をリモート側に同期できます。

# rsync -avz --delete /home/test/ 192.168.50.32::backup

コマンドの「::backup」は、設定ファイル「rsyncd.conf」に記述したセクション名です。

なお、コピー元ディレクトリ名を指定する際に、ディレクトリ名の最後にスラッシュ「/」を付けるとディレクトリの中身のみがコピーされ、スラッシュを付けないと、ディレクトリの中身とディレクトリ自体がコピーされます。

ちなみに、デフォルトのSSH接続でコピーするときは、以下のように実行します。

# rsync -avz --delete コピー元ディレクトリ ユーザ名@リモートマシン名:コピー先ディレクトリ

除外ファイルを指定したいときは

一部のファイルやディレクトリをコピー対象から除外したいときは、除外するファイルやディレクトリを記述したファイルを用意します。

# vi /etc/rsync_exclude.lst

# コピー対象から除外したいファイルやディレクトリを相対パスで記述
test
test.txt

あとは、そのファイルを「--exclude-from」オプションで指定して実行します。

# rsync -avz --delete --exclude-from=/etc/rsync_exclude.lst /home/test/ 192.168.50.32::backup

ディレクトリを復元したいときは

rsyncでリモートにコピーしたディレクトリをローカルに復元したいときは、rsyncコマンドのコピー元とコピー先を入れ替えて実行することで、簡単に復元できます。

たとえば、上記で実行したコマンドなら、以下のようにコピー元とコピー先を入れ替えて実行することで、リモートにバックアップしたディレクトリをローカルの指定したディレクトリに復元できます。

# rsync -avz 192.168.50.32::backup /home/test/