Linuxコマンド - rsync
概要
rsync
コマンドは、リモート環境とファイルやディレクトリを同期(sync)するコマンドである。(ローカル環境のみでも使用できる。)
変更があった分だけ更新する機能があるため、特にディレクトリ単位のバックアップに便利である。
オプション
rsync
コマンドの書式を、以下に示す。
rsync <オプション> <同期元のディレクトリのパス> <同期先のディレクトリのパス>
下表に、rsyncコマンドの主なオプションを示す。
特に、--progress
オプションを付加することが便利である。
また、-h
オプションを付加することにより、進捗状況の出力においてユーザが読みやすくすることができる。
オプション | 説明 |
---|---|
-a --archive |
アーカイブモード(-rlptgoD -no-H -no-A -no-X 相当)
|
-c --checksum |
更新日とサイズではなく、チェックサムで変更の有無をチェックする。 |
--daemon | デーモンとして動作する。(--daemon --help でデーモン時に使用できるオプションが確認できる)
|
-I --ignore-times |
サイズとタイムスタンプが同じファイルも処理する。 |
--list-only | コピーする代わりにファイルのリストを作成する。 |
-n --dry-run |
試験モード。 実際には動作せず、動作内容だけ表示する。( -v や--stats を一緒に指定する)
|
--no-<オプション名> | 指定したオプションを無効にする。(-H を無効にする場合は、--no-H のように指定する)
|
-q --quiet |
動作中のメッセージを抑制する。 |
--stats | ファイル数や転送サイズを表示する。 |
--size-only | 同じサイズのファイルは処理しない。 |
-v --verbose |
動作内容を表示する。 |
オプション | 説明 |
---|---|
-r --recursive |
ディレクトリを再帰的に処理する。 |
-l --links |
シンボリックリンクをシンボリックリンクのままコピーする。 |
-p --perms |
パーミッションを保持する。 |
-t --times |
タイムスタンプを保持する。 |
-g --group |
所有グループをそのまま保持する。 |
-o --owner |
所有者をそのまま保持する。(自分以外の所有者を保持するにはroot権限が必要) |
-D | デバイスファイルや特殊ファイルを保持する。(--devices --specials 相当)
|
--devices | デバイスファイルを保持する。(root権限が必要) |
--specials | 特殊ファイルを保持する。 |
オプション | 説明 |
---|---|
-H --hard-links |
ハードリンクを保持する。 |
-l --links |
ACL(アクセス制御リスト)を保持する。(-p も同時に指定した扱いになる)
|
-X --xattrs |
拡張属性を保持する。 |
オプション | 説明 |
---|---|
--copy-unsafe-links | リンク先が自分の配下にないものだけを対象にする。 |
-k --copy-dirlinks |
ディレクトリへのリンクの場合もリンク先を転送する。 |
-K --keep-dirlinks |
ディレクトリへのリンクをたどらない。 |
-l --links |
シンボリックリンクをシンボリックリンクのままコピーする。 |
-L --copy-links |
シンボリックリンクを対象にする。 |
--safe-links | リンク先が自分の配下にあるものだけを対象にする。 |
オプション | 説明 |
---|---|
--chmod=CHMOD | パーミッションを指定する。 |
-E --executability |
実行可能属性を保持する。 |
-g --group |
所有グループをそのまま保持する。 |
--numeric-ids | ユーザIDとグループIDを保持する。(転送先の名前に対応させない) |
-O --omit-dir-times |
--times オプション指定時、ディレクトリは除外する。
|
-o --owner |
所有者をそのまま保持する。(自分以外の所有者を保持するにはroot権限が必要) |
-p --perms |
パーミッションを保持する。 |
-t --times |
タイムスタンプを保持する。 |
オプション | 説明 |
---|---|
-T --temp-dir=<ディレクトリのパス> |
指定したディレクトリに一時ディレクトリを作成する。 |
-z --compress |
転送中のデータを圧縮する。 |
--compress-level=<レベル> | データの圧縮レベルを指定する。 |
--skip-compress=<リストファイル> | リストファイルに書かれたファイルは圧縮しない。 |
--port=<ポート番号> | ポート番号を指定する。 |
--sockopts=<TCPオプション> | TCPオプションを指定する。 |
-8 --8-bit-output |
8ビット以上の文字をエスケープしない。 |
-h --human-readable |
数字を読みやすい単位で表示する。 |
--progress | 転送の進行状況を表示する。 |
-P | --partial --progress と同様である。
|
--partial | 転送を中断したファイルを保持する。 |
--partial-dir=<ディレクトリのパス> | 転送を中断したファイルを保存するディレクトリ。 |
-4 --ipv4 |
IPv4を使用する。 |
-6 --ipv6 |
IPv6を使用する。 |
--timeout=<秒数> | I/Oタイムアウトの秒数。 |
--iconv=<変換方法> | ファイル名の変換方法を指定する。 (転送元がmacOSの場合は、 --iconv=UTF-8-MAC,UTF-8 のように指定する)
|
ディレクトリの同期
ディレクトリを同期する場合は、rsync -avz <同期元のディレクトリのパス>/ <同期先のディレクトリのパス>/
のように指定する。
同期先のディレクトリが存在しない場合は、自動的に作成される。
-a
オプションはアーカイブを意味するオプションで、サブディレクトリが存在する場合は、
"サブディレクトリも処理する(再帰処理)"、"パーミッションやファイルのタイムスタンプを保持する"、"シンボリックリンクをシンボリックリンクのままコピーする"等の動作となる。
また、ファイルのサイズとタイムスタンプが同じ場合は、更新されていないファイルとみなし、コピーから除外される。
チェックサムで比較する場合は、-c
オプションを併用して、rsync -acvz ~
と指定する。
-v
オプションは、動作中の内容を表示するオプションである。
-z
オプションは、転送データを圧縮するオプションである。
# rsyncコマンドの実行例 rsync -avz <同期元のディレクトリのパス>/ <同期先のディレクトリのパス>/
ディレクトリ指定時の注意点を、以下に示す。
同期元のディレクトリ末尾の/
を省略した場合、同期先のディレクトリの中に同期元と同じ名前のディレクトリが作成される。
例えば、rsync -avz mydata/ backup-mydata/
コマンドを実行する場合、mydataディレクトリ内のファイルやディレクトリがbackup-mydataディレクトリ内にコピーされる。
これに対して、rsync -avz mydata backup-mydata/
コマンドを実行する場合、backup-mydata内にmydataディレクトリが作成されることになる。
なお、同期先ディレクトリの末尾の/
の有無はどちらでもよい。
異なるホスト間でディレクトリを同期する
異なるホスト間でディレクトリを同期する場合、
同期元や同期先を<IPアドレスまたはホスト名>:<ディレクトリのパス>
または<ユーザ名>@<IPアドレスまたはホスト名>:<ディレクトリのパス>
と指定する。
ネットワークの回線速度が遅い環境で大きなファイルを転送する場合、-z
オプションで転送データを圧縮するとよい。
また、大きなファイルを転送している時にエラーで失敗する場合、--partial
オプションを指定することにより、rsyncコマンドの再実行時に"続き"から再開することができる。
この時、--partial-dir=<ディレクトリのパス>
オプションでコピー中のファイルを保存する場所を指定することもできる。
# コマンドの実行例 (異なるホスト間でディレクトリを同期する) rsync -avz --delete --rsh="ssh" <同期先PCのディレクトリのパス> <同期元PCのユーザ名>@<同期元PCのIPアドレスまたはホスト名>:<同期元PCのディレクトリのパス> rsync -avz --delete --rsh="ssh" <同期元PCのユーザ名>@<同期元PCのIPアドレスまたはホスト名>:<同期元PCのディレクトリのパス> <同期先PCのディレクトリのパス> rsync -avz --delete --rsh="ssh -p <ポート番号> -i <暗号鍵ファイルのパス>" \ <同期先PCのディレクトリのパス> <同期元PCのユーザ名>@<同期元PCのIPアドレスまたはホスト名>:<同期元PCのディレクトリのパス> rsync -avz --delete --rsh="ssh -p <ポート番号> -i <暗号鍵ファイルのパス>" \ <同期元PCのユーザ名>@<同期元PCのIPアドレスまたはホスト名>:<同期元PCのディレクトリのパス> <同期先PCのディレクトリのパス>
パーミッションを保持せずに同期する
パーミッションを保持せずに同期する場合は、-aオプションを使用せずに、必要なオプションを個別に指定する。
rsync -rltvz --delete <同期元のディレクトリ> <同期先のディレクトリ>
- -rオプション
- 再帰的にディレクトリを同期する。
- -lオプション
- シンボリックリンクをリンクとして同期する。
- -t
- タイムスタンプを保持する。
- -vオプション
- 詳細な出力を表示する。
- -z
- 転送時に圧縮する。
-a
オプションには-p
オプション (パーミッションの保持) が含まれているため、これを除外することでパーミッションを保持せずに同期できる。
なお、同期先のファイルには、実行ユーザのumaskに基づいた新しいパーミッションが設定される。
Rsyncのインストール
ソースコードからインストール
Rsyncのビルドに必要なライブラリをインストールする。
# パッケージ管理システムからビルドに必要な全てのライブラリをインストールする場合 sudo zypper install libopenssl-devel libacl-devel xxhash-devel liblz4-devel libzstd-devel python3-CommonMark python3-cmarkgfm # パッケージ管理システムとpipコマンドからビルドに必要なライブラリをインストールする場合 sudo zypper install libopenssl-devel libacl-devel xxhash-devel liblz4-devel libzstd-devel python3 -mpip install --user commonmark
Rsyncの公式Webサイトからソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf rsync-<バージョン>.tar.gz cd rsync-<バージョン>
または、RsyncのGitHubからソースコードをダウンロードすることもできる。
git clone https://github.com/WayneD/rsync.git cd rsync
Rsyncをビルドおよびインストールする。
mkdir build && cd build ../configure --prefix=<Rsyncのインストールディレクトリ> make -j $(nproc) make install
Rsyncを動作させるために必要なライブラリをインストールする。
sudo zypper install openssl xxhash libxxhash0 lz4
Grsyncのインストール
Grsyncの概要
Grsyncは、RsyncのGUI版(GTKライブラリを使用)であり、ディレクトリ、ファイルの同期とバックアップを行うために使用する。
ローカルディレクトリの同期に効果的に使用でき、リモートターゲットもサポートしている。
(ただし、リモートディレクトリのブラウジングはサポートしていない)
Grsyncの使用例として、リムーバブルデバイスとの音楽コレクションの同期、ネットワークドライブへの個人ファイルのバックアップ、パーティションの別へのレプリケーション、ファイルのミラーリング等が挙げられる。
ソースコードからインストール
Grsyncのビルドに必要な依存関係のライブラリをインストールする。
sudo zypper install intltool glib2-devel gtk3-devel wayland-devel wayland-protocols-devel
Grsyncの公式Webサイトにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf grsync-<バージョン>.tar.gz cd grsync-<バージョン>
Grsyncをビルドおよびインストールする。
mkdir build && cd build ../configure --prefix=<Grsyncのインストールディレクトリ> make -j $(nproc) make install
パッケージ管理システムからインストール
sudo zypper install grsync
libRsyncのインストール
libRsyncの概要
librsyncは、rsyncと同様、効率的にファイルを転送する他のプログラムを構築するためのものである。
バックアップおよびプログラムにバイナリパッチを配布したり、ディレクトリをサーバやピア間で同期するために記述したプログラムである。
librsyncは、ネットワーク差分を計算し適用するためのライブラリであり、多様なネットワークソフトウェアに統合できるように設計されたインターフェイスを備えている。
librsyncは、rsyncプロトコルのコアアルゴリズムをカプセル化して、2つのファイルの差分を効率的に計算するのに役立つ。
rsyncアルゴリズムは、差分を計算するために2つのファイルが存在する必要が無いため、ほとんどの差分アルゴリズムとは異なる。
その代わり、一方のファイルの各ブロックのチェックサムのセットを必要とし、それらが一緒になってそのファイルの署名を形成する。
もう一方のファイルのどの位置のブロックでも、チェックサムが同じであれば、同一である可能性が高く、残ったものが差分となる。
このアルゴリズムは、同じシステム上で両方のファイルを必要とすることなく、2つのファイル間の差分を転送する。
librsyncは元々、HTTPのデルタ圧縮におけるrproxy実験のために作成された。
現在では、Dropbox、rdiff-backup、Duplicity等で使用されている。
ソースコードからインストール
ビルドに必要な依存関係のライブラリをインストールする。
sudo zypper install libb2-devel
libRsyncのGitHubからソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf librsync-<バージョン>.tar.gz cd librsync-<バージョン>
または、Githubからソースコードをクローンする。
git clone https://github.com/librsync/librsync.git cd librsync
libRsyncをビルドおよびインストールする。
mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<libRsyncインストールディレクトリ> .. make -j $(nproc) make install
~/.profileファイル等に、環境変数を追記する。
vi ~/.profile
# ~/.profileファイル export PATH="/<libRsyncのインストールディレクトリ>/bin:$PATH" export LD_LIBRARY_PATH="/<libRsyncのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"
パッケージ管理システムからインストール
sudo zypper install librsync2