Linux のファイルをさくらの VPS の Ubuntu と rsync でコピー・同期させる方法
前書き
以前に書いた rsync を使ってデータ (ファイル) をバックアップする投稿が中途半端だったので新たに書き直すことにした。
やりたいことは、rsync でバックアップしたいファイルをバックアップサーバーにコピー & 同期させることである。
そして、このコピー & 同期を自動的に実行するようにすることだ。
環境情報
さくらの VPS サーバー (Ubuntu 20.04) をバックアップサーバーにします。
このバックアップサーバーに対して、僕が運用している Ubuntu x2 と Linux Lite のファイルを rsync でコピー & 同期させることで、必要なファイルが 2 箇所で保存される状態を作るわけです。
一度この仕組みを作ってしまえば、バックアップしたい Linux や Mac OS、Windows 等が増えた場合でも応用できると考えています。
下準備
[1] コピーしたいファイルがある側から、バックアップサーバーに公開鍵認証を使った SSH ログイン (パスワードなし) ができることを前提にしている。
パスワードなし公開鍵認証の SSH ログインを設定する方法に関しては以下の記事を参考にしてください。
さくらの VPS の Ubuntu 20.04 に公開鍵認証 (パスワードなし) で SSH ログインできるように設定する
[2] SSH ログインができるようにするためには、バックアップサーバー側で SSH の通信が許可されている必要があります。これに関しては、以下の記事を参考にしてみてください。
[3] バックアップサーバー側の起点となるディレクトリを決めます。起点ディレクトリというのは、データをコピーする先のディレクトリの大元のことです。
僕の環境の場合、起点ディレクトリは /data です。この /data 配下に複数のサーバーのデータをコピーするように構築していきます。
で、この /data ディレクトリをあらかじめ mkdir コマンドで作成しますが、このディレクトリの所有者とグループを [1] で SSH ログインができるように設定したユーザーに指定します。
$ sudo mkdir /data $ sudo chown user:user /data $ ls -ld /data drwxr-xr-x 6 user user 4096 May 27 15:06 /data $
これで下準備は完了です。
rsync は tcp 873 番ポートを使って通信する?
rsync はデフォルトで tcp 873 番ポートを使うみたいですが、ssh (tcp 22 番ポート) を使って動作することもできるようです。
このため、tcp 873 番ポートで疎通できるようにファイアウオールの許可設定をする必要はありません。少なくとも僕の環境では tcp 873 番ポートの許可設定をしていません。
どこのファイルをどこにコピー & 同期させるのか
まずは Ubuntu にあるファイルをバックアップサーバーにコピーしたい状況です。
具体例は以下のとおりです。
- バックアップしたいデータが保存されているサーバー側の /home/user/python ディレクトリ配下にあるファイルすべてを
- バックアップサーバーの /data/cube/home/user/python ディレクトリにコピーする
この時、rsync コマンドを実行するのは バックアップしたいデータを持っているサーバー側 (送信元) です。
バックアップサーバー側で rsync コマンドを実行してコピーすることもできますが、今回はこれをやりません。
バックアップサーバー側のディレクトリ命名規則
/data/cube/home/user/python ディレクトリに含まれている cube は我が家で使っているサーバーの名前です。
バックアップサーバーの /data ディレクトリは、文字通りデータを保管する用のディレクトリです。ここが起点ディレクトリになっています。
起点ディレクトリに cube サーバーの /home/user/python ディレクトリ配下のファイルすべてをコピーしたいので、バックアップサーバー側ディレクトリが /data/cube/home/user/python という名前になっているわけです。
少しややこしいですが、頭の整理を!
- 送信元の /home/user/python ディレクトリ配下のファイルすべてが、
- バックアップサーバーの /data/cube/home/user/python ディレクトリにコピーされるためには、
- rsync コマンド実行時にバックアップサーバーの /data/cube/home/user ディレクトリを指定する必要があります。
言い換えると、
- rsync コマンド時刻時にバックアップサーバーの /data/cube/home/user/python ディレクトリを指定してはダメです。
次のコマンド例を見てもらうとわかりやすいかと思います。
rsync コマンドを実行する
以下のコマンドを実行します。
$ rsync -arvz -d /home/user/python sakura1:/data/cube/home/user/ --delete
sakura1 がバックアップサーバーになります。rsync を実行する側 (コピーしたいデータを持っている側) の SSH の config ファイルに以下のように書かれています。
Host sakura1 HostName 111.222.33.44 User user IdentityFile ~/.ssh/cube_sakura1
rsync コマンドで sakura1 の /data/cube/home/user ディレクトリが指定されている点に注目してください。/data/cube/home/user/python ディレクトリではありません。
この rsync コマンドを実行してファイルがザザザー、、、、、っと表示されていけば順次コピーがされていることを意味します。参考のために実行例を貼っておこう。
$ rsync -arvz -d /home/user/python sakura1:/data/tiny/home/user/ --delete
sending incremental file list
python/
python/autopost/
python/autopost/post_speedtest_result.py
python/autopost/post_speedtest_result.py.20230513-01
python/autopost/post_speedtest_result.py.20230513-02
python/autopost/post_speedtest_result.py.20230513-03
python/autopost/post_speedtest_result.py.20230513-04
python/autopost/old/
sent 4,834 bytes received 127 bytes 583.65 bytes/sec
total size is 8,501 speedup is 1.71
$
rsync コマンドの各オプションの意味は、ChatGPT に質問すると以下の回答をくれました。
-a
: アーカイブモードを有効にします。これにより、ファイルの属性やパーミッションなどのメタデータも保持され、再帰的にディレクトリをコピーする際にも保持されます。通常はこのオプションを使用してデータの完全性を保ちます。-r
オプション: ディレクトリを再帰的にコピーします。-v
: 詳細な出力を表示します。ファイルのコピー状況や転送速度などが表示されます。コマンドの実行中に進捗状況を確認したい場合に便利です。-z
: 圧縮転送を有効にします。データが転送される際に圧縮されるため、ネットワーク帯域を節約できます。ただし、CPUの処理負荷が増加することにも注意が必要です。-d
: コピー先にディレクトリを作成するよう指示します。
–delete の意味は、
--delete
: コピー先に存在しないファイルを削除するよう指示します。コピー元に存在しないファイルは、コピー先から削除されます。
と教えてくれました。
コピーの自動化
rsync の処理を bash スクリプトにする
たとえば以下のファイル (rsync_backup.bash) を作った。
#!/bin/bash rsync -arvz -d /home/user/bash sakura1:/data/tiny/home/user/ --delete rsync -arvz -d /home/user/python sakura1:/data/tiny/home/user/ --delete
/home/user/bash ディレクトリ配下のデータと /home/user/python ディレクトリ配下のデータを rsync でコピー & 同期させるスクリプトだ。
これに実行権限をつける
$ chmod 744 rsync_backup.bash $ ls -l rsync_backup.bash -rwxr--r-- 1 user user 158 May 27 15:44 rsync_backup.bash $
crontab に登録する
crontab -e で毎日 04:00 にこの bash スクリプトを自動実行するように登録してみた。
$ crontab -l
0 4 * * * /home/user/bash/rsync_backup.bash
$
これでよし。