rsync
マシン間の特定のフォルダを同期、中身を同じにするツール
バックアップとかの際によく利用します
詳細https://www.computerhope.com/unix/rsync.htm
コマンド書式
[root@c ~]# rsync [オプション] source [source2...] destination
オプション:
-a: '-rlptgoD' と同じ
-r: 配下のディレクトリも対象
-l: シンボリックリンクはそのままシンボリックリンクとしてコピー
-p: パーミッションもそのままコピー
-t: タイムスタンプもそのままコピー
-g: グループ情報を保持してコピー
-o: 所有者情報を保持してコピー(rootのみ)
-D: '--devices' '--specials' と同じ
--devices: デバイスファイルもコピー(rootのみ)
--specials: 特殊ファイル(名前付きファイル)らもコピー
-A: aclを保持したままコピー
-X: 拡張属性を保持したままコピー
--log-file: ログファイル指定
-n: 実際のコピーは行わず、処理の流れが確認できる
--delete: <source>に存在しないファイルは <destination> から消される
--delete-after: 同期処理の後に削除を実行
--delete-before: 同期処理の前に削除を実行
--bwlimit=1024 単位はkB/s 1024kB/s --> 8,192k bit/sec --> 8Mbit/sec
--bwlimit=1250 1250kB/s --> 10,000k bit/sec --> 10Mbot/sec
バックアップ対象側(source)のrootの秘密鍵-公開鍵を作成する.
(パスフレーズはなしで)
[root@source ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <-- そのままリターン
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): <-- そのままリターン
Enter same passphrase again: <-- そのままリターン
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
(略)
[root@source ~]#
作成した公開鍵(/root/.ssh/id_rsa.pub)を
バックアップ先(destination)に渡す
[root@source ~]# scp .ssh/id_rsa.pub root@destination:
そして、バックアップ先(destination)にて、受け取った公開鍵(id_rsa.pub)の中身を
.ssh/authorized_keysファイルに追記します
[root@destination ~]# mkdir ~/.ssh && chmod 700 $_
[root@destination ~]# cat id_rsa.pub >> .ssh/authorized_keys
[root@destination ~]# chmod 600 .ssh/authorized_keys
[root@destination ~]# rm -f id_rsa.pu
これでパスワードなしで、バックアップ対象側(source)から バックアップ先(destination)にパスワードなしでrootログインが可能になる
*sshd_configの設定に依存しますが
[root@source ~]# ssh root@destination
[root@destination ~]#
その上で下記のようにバックアップが可能となる
[root@source ~]# rsync -avz /target/ root@destination:/target/
これをcronに仕込めば定期的なバックアップが行われる
[root@source ~]# crontab -e
MAILTO=""
*/5 * * * * rsync -XAavz /target/ root@destination:/target/
cronでの多重起動防止 - pidof を使う bash#vec6b673
ほとんどのrsyncは既定でsshを使うようにできてる。以前なら「-e ssh」とかでsshで通信しますよ宣言が必要だったのに。
sshの負荷なしでrsyncを行うにはどうすればいいのか?
ここではpushでファイル同期を行う場合を記載する。ごくごく簡単な方法です。
サーバ側(ファイルを受ける側)
[root@c ~]# yum install rsync
[root@c ~]# vi /etc/rsyncd.conf
[home]
path=/home
uid=root
gid=root
read only=false
[root@c ~]# systemctl status rsyncd.service
これで/homeが共有先なる。
クライアント側(ファイルを送る側)
[root@c ~]# rsync -av /home/illya/ c::home/illya
これでパスワードなしで、「client:/home/illya」と「c:/home/illya」が同期されます。
小さいサイズのファイルが膨大にあるとき、rsyncではあんまり効率的に運んでくれない。
片方が満載で、片方がバックアップに拵えた空のストレージで同期を取る際は留意すべき事項である。
っで、初回の同期なのだから別にタイムスタンプさえ合っていればいいような気がするので、tarとかcpで行ってもいいように思える
具体的には/homeの内容をバックアップ先(2nd)の/backupに収めるのなら
[root@c ~]# cd /
[root@c ~]# tar cf - home | ssh root@2nd "cd /backup ; tar xf -"
でもいいように思える
バックアップ先では /backup/home として置かれる。
これはsshを経由します。たかが隣のマシンへの転送にsshの暗号処理は不要と思われるのなら、rshで行う。
ただrootでrshを行うには調整が必要。
(相手側)
[root@2nd ~]# systemctl start rsh.socket
[root@2nd ~]# systemctl start rexec.socket
[root@2nd ~]# systemctl start rlogin.socket
[root@2nd ~]#
[root@2nd ~]# cat <<_EOF_>> /etc/securetty
rsh
rexec
rlogin
_EOF_
[root@2nd ~]# echo "c.sybyl.local" > .rhosts
この設定の後で
[root@c ~]# cd /
[root@c ~]# tar cf - home | rsh -l root 2nd "cd /backup ; tar xf -"
やっぱり最新版だと早いそうな
[root@centos7 ~]# wget https://download.samba.org/pub/rsync/rsync-3.2.3.tar.gz
[root@centos7 ~]# tar xf rsync-3.2.3.tar.gz
[root@centos7 ~]# cd rsync-3.2.3/
[root@centos7 rsync-3.2.3]# yum install openssl-devel lz4-devel libzstd-devel xxhash-devel
[root@centos7 rsync-3.2.3]# ./configure
[root@centos7 rsync-3.2.3]# make ; make install
「--prefix=」で指定しないと /usr/local を起点にしてインストールされるが、「rsync」が「/usr/local/bin/rsync」としてインストールされる. あとスクリプトの「rsync-ssl」も「/usr/local/bin/rsync-ssl」としてインストールされる
あとmanファイルとかが /usr/local/share/man に配置されるくらい.
最新のrsyncを使うなら相手方にも同じように最新版をインストールする
っで肝心の最新どうしてrsyncを使うには「--rsync-path=」で相手方のrsyncの場所を示す
[root@c apps]# /usr/local/bin/rsync -a --rsync-path=/usr/local/bin/rsync ./pyenv/ root@centos7:/apps/pyenv/