Linuxコマンド - rsync

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

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
動作内容を表示する。


-aオプション使用時に有効になるオプション
オプション 説明
-r
--recursive
ディレクトリを再帰的に処理する。
-l
--links
シンボリックリンクをシンボリックリンクのままコピーする。
-p
--perms
パーミッションを保持する。
-t
--times
タイムスタンプを保持する。
-g
--group
所有グループをそのまま保持する。
-o
--owner
所有者をそのまま保持する。(自分以外の所有者を保持するにはroot権限が必要)
-D デバイスファイルや特殊ファイルを保持する。(--devices --specials相当)
--devices デバイスファイルを保持する。(root権限が必要)
--specials 特殊ファイルを保持する。


-aオプション使用時に無効になるオプション
オプション 説明
-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