ファイル同期にとても便利なrsyncの3.2.0がリリースされました.
バグフィクスや,いくつかの新機能が入ったようなので少し試してみました.
※1. この記事投稿時には 3.2.2 が出ています.
※2. 鹿児島Linux勉強会 2020.06で発表したものと同じ内容です.
導入例
Debian sid amd64 & Ubuntu 20.04 LTS amd64
$ sudo apt build-dep rsync
$ sudo apt install libxxhash-dev libzstd-dev liblz4-dev
$ wget -c \
https://download.samba.org/pub/rsync/rsync-3.2.0.tar.gz \
https://download.samba.org/pub/rsync/rsync-3.2.0.tar.gz.asc \
https://opencoder.net/WayneDavison.key
$ gpg2 --import ./WayneDavison.key
$ gpg2 --verify ./rsync-3.2.0.tar.gz.asc
$ tar tvzf ./rsync-3.2.0.tar.gz
$ tar xzf ./rsync-3.2.0.tar.gz
$ cd rsync-3.2.0
$ ./configure --help
$ ./configure
$ make
$ ./rsync --version
rsync version 3.2.0 protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace, append,
ACLs, xattrs, iconv, symtimes, prealloc, SIMD
Checksum list:
xxh64 (xxhash) md5 md4 none
Compress list:
zstd lz4 zlibx zlib none
rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. See the GNU
General Public Licence for details.
Note
|
gpg鍵は次から入手できます.rsync download |
Raspberri Pi OS amd64
Raspberry Pi OS arm64の場合 libzstd-dev
のバージョンが 1.3.8+dfsg-3
と少し古くbuildに失敗します. ./configure --disable-zstd
としてzstdを無効にするか,sourceから zstd 1.4.5
を導入することでbuild出来ました.
$ make
:
token.c: In function ‘init_compression_level’:
token.c:73:40: warning: implicit declaration of function ‘ZSTD_minCLevel’; did you mean ‘ZSTD_maxCLevel’? [-Wimplicit-function-declaration]
min_level = skip_compression_level = ZSTD_minCLevel();
^~~~~~~~~~~~~~
ZSTD_maxCLevel
token.c: In function ‘send_zstd_token’:
token.c:685:2: error: unknown type name ‘ZSTD_EndDirective’; did you mean ‘ZSTD_DDict’?
ZSTD_EndDirective flush = ZSTD_e_continue;
^~~~~~~~~~~~~~~~~
ZSTD_DDict
token.c:685:28: error: ‘ZSTD_e_continue’ undeclared (first use in this function)
ZSTD_EndDirective flush = ZSTD_e_continue;
^~~~~~~~~~~~~~~
token.c:685:28: note: each undeclared identifier is reported only once for each function it appears in
token.c:701:3: warning: implicit declaration of function ‘ZSTD_CCtx_setParameter’ [-Wimplicit-function-declaration]
ZSTD_CCtx_setParameter(zstd_cctx, ZSTD_c_compressionLevel, do_compression_level);
^~~~~~~~~~~~~~~~~~~~~~
token.c:701:37: error: ‘ZSTD_c_compressionLevel’ undeclared (first use in this function); did you mean ‘skip_compression_level’?
ZSTD_CCtx_setParameter(zstd_cctx, ZSTD_c_compressionLevel, do_compression_level);
^~~~~~~~~~~~~~~~~~~~~~~
skip_compression_level
token.c:751:13: error: ‘ZSTD_e_flush’ undeclared (first use in this function); did you mean ‘ZSTD_DCtx_s’?
flush = ZSTD_e_flush;
^~~~~~~~~~~~
ZSTD_DCtx_s
token.c:753:8: warning: implicit declaration of function ‘ZSTD_compressStream2’; did you mean ‘ZSTD_compressStream’? [-Wimplicit-function-declaration]
r = ZSTD_compressStream2(zstd_cctx, &zstd_out_buff, &zstd_in_buff, flush);
^~~~~~~~~~~~~~~~~~~~
ZSTD_compressStream
$ cd ..
$ sudo apt remove libzstd-dev
$ wget https://github.com/facebook/zstd/releases/download/v1.4.5/zstd-1.4.5.tar.gz \
https://github.com/facebook/zstd/releases/download/v1.4.5/zstd-1.4.5.tar.gz.sha256
$ sha256sum -c ./zstd-1.4.5.tar.gz.sha256
$ tar tvf ./zstd-1.4.5.tar.gz | lv
$ tar xf ./zstd-1.4.5.tar.gz
$ cd zstd-1.4.5
$ make
$ sudo make install
$ cd ../rsync-3.2.0
$ ./configure && make
Debian sid amd64
Debian sid amd64 環境にはすでに降ってきているのでパッケージから導入するだけでOKです.
$ sudo apt install rsync
$ rsync --version
rsync version 3.2.0 protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace, append,
ACLs, xattrs, iconv, symtimes, prealloc, SIMD
Checksum list:
xxh64 (xxhash) md5 md4 none
Compress list:
zstd lz4 zlibx zlib none
rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. See the GNU
General Public Licence for details.
$ dpkg-query -W rsync
rsync 3.2.0-1
ってことで試せるようになりました.NEWSを見てみます.
BUG FIX
Avoid a hang when an overabundance of messages clogs up all the I/O buffers.
このバグ修正がちょっと気になります.fat32の制限に引っかかったときに帰ってこない問題もこれで解決してるかも?未確認.
ENHANCEMENTS
–checksum-choice=STR, –cc=STR
チェックサム形式を選べるようになったようです.現在選択できるのは xxh64/md5/md4
の3種類 or none
or auto
(既定値)
o auto (the default) o xxh64 (aka xxhash) o md5 o md4 o none
--version
にも出力されます.
$ rsync --version | grep Checksum -A1
Checksum list:
xxh64 (xxhash) md5 md4 none
configure option に --disable-xxhash
がありました.
--disable-xxhash disable xxhash checksums
環境変数 RSYNC_CHECKSUM_LIST
でも指定できます.オプション --checksum-choice
がある場合はオプションのほうが優先なようです.
ちなみに --checksum-choice
オプションに対応していない 3.1.3
に対して xxh64
を向けて叩いてみると以下のようなエラーになりました.(md4
, md5
はok)
$ rsync --checksum-choice=xxh64 -avc ./* user@remote:/tmp/
unknown checksum name: xxh64
rsync error: requested action not supported (code 4) at checksum.c(73) [server=3.1.3]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.2.0]
時間がどのくらい変わるかちょうど転がっていたkernel source(小さいファイルが沢山)で試してみました.はじめ普通に同期した後,キャッシュクリアして md4
, md5
, xxh64
で試してみました.思ったより差が出ない感じ?
$ find ./linux-5.6 | wc -l
82114
$ du -ms ./linux-5.6
1310 ./linux-5.6
$ rsync --checksum-choice=auto -ac ./linux-5.6 /tmp/
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md4 -ac ./linux-5.6 /tmp/
3
real 0m52.393s
user 0m5.051s
sys 0m12.246s
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md5 -ac ./linux-5.6 /tmp/
3
real 0m57.716s
user 0m6.976s
sys 0m13.486s
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=xxh64 -ac ./linux-5.6 /tmp/
3
real 1m5.520s
user 0m2.507s
sys 0m13.625s
大きめのファイルでも試してみました.4GB程のisoファイル1つです.md4
, md5
はあまり代わりませんが,xxh64
はかなり高速ですね.
$ ls -s ./Parrot-security-4.9.1_x64.iso*
3909164 ./Parrot-security-4.9.1_x64.iso 3909164 ./Parrot-security-4.9.1_x64.iso2
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md4 -ac ./Parrot-security-4.9.1_x64.iso ./Parrot-security-4.9.1_x
64.iso2
3
real 0m23.276s
user 0m10.601s
sys 0m4.387s
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md5 -ac ./Parrot-security-4.9.1_x64.iso ./Parrot-security-4.9.1_x64.iso2
3
real 0m28.150s
user 0m16.945s
sys 0m4.399s
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=xxh64 -ac ./Parrot-security-4.9.1_x64.iso ./Parrot-security-4.9.1_x64.iso2
3
real 0m12.767s
user 0m1.375s
sys 0m4.060s
この辺の速度は環境により大分変わると思うので参考程度に.
–compress-choice=STR, –zc=STR
--compress
オプション利用時の圧縮形式を指定できるようです.
圧縮形式はrsync 3.2.0 同士では zlibx
形式が zlib
形式よりも優先されるようです.
選択できるオプションは zstd, lz4, zlibx, zlib, none
のようです.
o zstd
o lz4
o zlibx
o zlib
o none
rsync --version
でも確認できます.
$ rsync --version | grep Compress -A1
Compress list:
zstd lz4 zlibx zlib none
configure oprion に --disable-zstd
, --disable-lz4
があります.
--disable-zstd disable zstd compression
--disable-lz4 disable LZ4 compression
環境変数 RSYNC_COMPRESS_LIST
でも指定できるようです.
未対応の 3.1.3 に対して指定すると unknown option
と言われます.
$ time rsync --compress-choice=zstd --compress -a ./hoge mk@x201i.local:/tmp/
rsync: on remote machine: --compress-choice=zstd: unknown option
rsync error: syntax or usage error (code 1) at main.c(1596) [server=3.1.3]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.2.0]
こちらも簡単にベンチを.でもWi-Fi環境だし参考程度に.
$ ssh user@remote rm -rf ~/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=zstd --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3
real 4m38.921s
user 0m24.463s
sys 0m7.182s
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=lz4 --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3
real 9m28.829s
user 0m4.878s
sys 0m6.177s
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=zlibx --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3
real 5m21.702s
user 0m46.740s
sys 0m6.541s
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=zlib --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3
real 5m28.722s
user 0m45.861s
sys 0m6.381s
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=none -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3
real 22m56.712s
user 0m1.848s
sys 0m7.323s
–debug=NSTR
チェックサムと圧縮の詳細を表示するオプションのようです.どのアルゴリズムを利用しているのかが確認できます.
Client negotiated checksum: xxh64 Client compress: zstd (level 3)
–debug=OPTS, -M—debug=OPTS
--debug=OPTS
を使うとリモートのrsyncにデバッグオプションを送らなくなるようです.これによりクライアント側とサーバ側で異なるデバッグレベルを指定できるようになったそうです.
リモート側にオプションを送る場合には -M—debug=OPTS
SIGINFO & SIGVTALRM
rsyncプロセスに SIGINFO
& SIGVTALRM
シグナルを送信することでステータスを表示できるようになったようです.Linuxは SIGINFO
に対応していないので, SIGVTALRM
を試しました.
SIGVTALRM
を送信$ pkill -SIGVTALRM rsync
linux-5.6/arch/sparc/lib/lshrdi3.S
114,384,392 81% 931.12kB/s 0:01:59 (xfr#21058, ir-chk=1030/23451)
–copy-as=USER[:GROUP]
指定ユーザ/グループ権限でファイルをコピーするようです.
$ ls -Al /tmp/rsync-test/
total 0
-rw-r--r-- 1 matoken matoken 0 Jun 25 18:50 matokenfile
-rw-r--r-- 1 root root 0 Jun 25 18:51 root
-rw-r--r-- 1 www-data www-data 0 Jun 25 18:51 www-data
$ sudo ./rsync -a /tmp/rsync-test/ /tmp/rsync-test2
$ ls -lA /tmp/rsync-test2
total 0
-rw-r--r-- 1 matoken matoken 0 Jun 25 18:50 matokenfile
-rw-r--r-- 1 root root 0 Jun 25 18:51 root
-rw-r--r-- 1 www-data www-data 0 Jun 25 18:51 www-data
--copy-as=matoken
を指定するとすべてmatokenになる$ sudo \rm -rf /tmp/rsync-test2
$ sudo ./rsync --copy-as=matoken -a /tmp/rsync-test/ /tmp/rsync-test2
$ ls -lA /tmp/rsync-test2
total 0
-rw-r--r-- 1 matoken matoken 0 Jun 25 18:50 matokenfile
-rw-r--r-- 1 matoken matoken 0 Jun 25 18:51 root
-rw-r--r-- 1 matoken matoken 0 Jun 25 18:51 www-data
-V
--version
の短いオプションとして -V
が入りました.
$ ./rsync --help|grep -- -V
--version, -V print the version + other info and exit
$ ./rsync --help|grep \-V
grep (GNU grep) 3.4
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
–ipv4, -4 / –ipv6, -6
ipv4, ipv6 を指定したいときに rsh='ssh -4'
とするより便利な --ipv4
, -4
, --ipv6
, -6
オプションが入りました.
-6
を指定して失敗する$ rsync -avc6 ./ user@remote:/tmp/
ssh: Could not resolve hostname remote: Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(235) [sender=3.2.1]