#author("2021-06-02T16:19:24+00:00","default:sysosa","sysosa") #author("2023-12-29T12:18:25+00:00;2021-06-02T16:19:24+00:00","default:sysosa","sysosa") rsync マシン間の特定のフォルダを同期、中身を同じにするツール バックアップとかの際によく利用します 詳細[[https://www.computerhope.com/unix/rsync.htm>+https://www.computerhope.com/unix/rsync.htm]] コマンド書式 #code(nonumber){{ [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 }} ***cronを使っての自動バックアップ(/home) [#l44b6d95] バックアップ対象側(&color(darkgreen){''source''};)の&color(magenta){root};の秘密鍵-公開鍵を作成する. (パスフレーズはなしで) #code(nonumber){{ [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 ~]# }} 作成した&color(darkorchid){公開鍵};(/root/.ssh/id_rsa.pub)を バックアップ先(&color(orangered){destination};)に渡す #code(nonumber){{ [root@source ~]# scp .ssh/id_rsa.pub root@destination: }} そして、バックアップ先(&color(orangered){destination};)にて、受け取った&color(darkorchid){公開鍵};(id_rsa.pub)の中身を .ssh/authorized_keysファイルに追記します #code(nonumber){{ [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 }} これでパスワードなしで、バックアップ対象側(&color(darkgreen){''source''};)から バックアップ先(&color(orangered){destination};)にパスワードなしでrootログインが可能になる &color(red){*};&size(10){sshd_configの設定に依存しますが}; #code(nonumber){{ [root@source ~]# ssh root@destination [root@destination ~]# }} その上で下記のようにバックアップが可能となる #code(nonumber){{ [root@source ~]# rsync -avz /target/ root@destination:/target/ }} これをcronに仕込めば定期的なバックアップが行われる #code(nonumber){{ [root@source ~]# crontab -e MAILTO="" */5 * * * * rsync -XAavz /target/ root@destination:/target/ }} ***cronを使っての自動バックアップ(その2) [#e7100637] cronでの多重起動防止 - pidof を使う [[bash#vec6b673]] ***sshを使わないrsync [#o45744a1] ほとんどのrsyncは既定でsshを使うようにできてる。以前なら「-e ssh」とかでsshで通信しますよ宣言が必要だったのに。 sshの負荷なしでrsyncを行うにはどうすればいいのか? ここではpushでファイル同期を行う場合を記載する。ごくごく簡単な方法です。 サーバ側(ファイルを受ける側) #code(nonumber){{ [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が共有先なる。 クライアント側(ファイルを送る側) #code(nonumber){{ [root@c ~]# rsync -av /home/illya/ c::home/illya }} これでパスワードなしで、「client:/home/illya」と「c:/home/illya」が同期されます。 とってもセキュアではないです。 ***もっと早くrsync!! [#m9e80a78] 小さいサイズのファイルが膨大にあるとき、rsyncではあんまり効率的に運んでくれない。 片方が満載で、片方がバックアップに拵えた空のストレージで同期を取る際は留意すべき事項である。 っで、初回の同期なのだから別にタイムスタンプさえ合っていればいいような気がするので、tarとかcpで行ってもいいように思える 具体的には/homeの内容をバックアップ先(2nd)の/backupに収めるのなら #code(nonumber){{ [root@c ~]# cd / [root@c ~]# tar cf - home | ssh root@2nd "cd /backup ; tar xf -" }} でもいいように思える バックアップ先では /backup/home として置かれる。 これはsshを経由します。たかが隣のマシンへの転送にsshの暗号処理は不要と思われるのなら、rshで行う。 ただrootでrshを行うには調整が必要。 #code(nonumber){{ (相手側) [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 }} この設定の後で #code(nonumber){{ [root@c ~]# cd / [root@c ~]# tar cf - home | rsh -l root 2nd "cd /backup ; tar xf -" }} ***rsyncを最新版にしてみる [#a1aaae59] やっぱり最新版だと早いそうな #code(nonumber){{ [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の場所を示す #code(nonumber){{ [root@c apps]# /usr/local/bin/rsync -a --rsync-path=/usr/local/bin/rsync ./pyenv/ root@centos7:/apps/pyenv/ }}