WindowsからLinuxサーバへファイルを高速にコピーするツール CDC File Transfer が公開されました。
GitHub – google/cdc-file-transfer: Tools for synching and streaming files from Windows to Linux
GIGAZINEでも説明されています。
Googleが開発した高速ファイル転送ツール「CDC File Transfer」が無料公開中 – GIGAZINE
CDC File Transfer のツールでは、ファイルの更新部分だけを転送することにより、効率よく転送できるようです。
下の図では、 赤線が CDC File Transfer のツールですが、Cygwin+rsync より2倍以上高速にファイルコピーできています。
CDC File Transfer のツールは、Ubuntuの最新版用にはバイナリファイルが用意されていますが、その他のUbuntuのバージョンや、Ubuntu以外ではツールをビルドする必要があります。
ここでは、Ubuntu20.04 の場合と、RockeyLinux8 の場合について、ツールのビルドや各種設定を含めて、ツールを実行できるようにする方法について説明します。
ただ、v1.0.0 で試しましたが、実行ではどうも動作が不安定なようです。
WindowsからLinuxへのssh接続(公開鍵認証)の設定
CDC File Transfer のツールの使用では、WindowsマシンからLinuxサーバへsshができることが必要です。また、ssh接続する際に、パスワードを聞かれないように公開鍵認証の設定が必要です。
公開鍵認証による接続方法(sshコマンドの場合) に従って、設定をしてください。
なお、「クライアントがLinuxの場合」の箇所の手順は、Windows上のコマンドラインで実行してください。この時、ssh-keygen -t rsa -f id_rsa の実行でパスフレーズの設定を求められますが、何も入力せずに Enter を押して、パスフレーズを空にしてください。
次に Windowsマシン上で、%USERPROFILE%\.ssh 下に configファイルを次のような内容で用意します。
Host linux_device
HostName linux.device.com
User user
IdentityFile C:\path\to\id_rsa
Host に sshで接続する際に指定する識別名を記述します。
HostName の箇所に Linuxサーバのホスト名(またはIPアドレス)、User にssh接続する際のユーザ名、IdentityFile に 公開鍵認証による接続方法(sshコマンドの場合) で作成したWindowsマシン上の id_rsaファイルへのパスを指定します。
これで、Windowsマシンで下のように実行すると、パスワードを聞かれることなく、Linuxサーバにssh接続できることを確認してください。
ssh linux_device
Linuxでツールのビルド
Linuxサーバが Ubuntuで、かつ GitHub – actions/runner-images: GitHub Actions runner images の Available Images の箇所で確認できる Ubuntu の最新版(2023年1月時点ではUbuntu 22.04)の場合は、本手順の作業は不要です。
以降の「Windowsでツールの用意・Linuxサーバの設定」から実施してください。
その他のUbuntuや、RockeyLinuxの場合は、ここでの手順に従ってLinux上でツールをビルドします。
Ubuntuの場合
必要なパッケージをインストールします。
wget https://github.com/bazelbuild/bazel/releases/download/6.0.0/bazel-6.0.0-installer-linux-x86_64.sh
chmod +x bazel-6.0.0-installer-linux-x86_64.sh
sudo ./bazel-6.0.0-installer-linux-x86_64.sh
sudo apt install git build-essential net-tools
続けて次を実行します。
git clone https://github.com/google/cdc-file-transfer
cd cdc-file-transfer
git submodule update --init --recursive
続けて次を実行します。
bazel build --config linux --compilation_mode=opt --linkopt=-Wl,--strip-all --copt=-fdata-sections --copt=-ffunction-sections --linkopt=-Wl,--gc-sections //cdc_rsync_server
bazel build --config linux --compilation_mode=opt --linkopt=-Wl,--strip-all --copt=-fdata-sections --copt=-ffunction-sections --linkopt=-Wl,--gc-sections //cdc_fuse_fs
次のファイルができていることを確認してください。
bazel-bin/cdc_rsync_server/cdc_rsync_server
bazel-bin/cdc_fuse_fs/cdc_fuse_fs
bazel-bin/external/com_github_fuse/libfuse.so
Rockey Linuxの場合
必要なパッケージをインストールします。
yum groupinstall "Development Tools"
dnf install dnf-plugins-core
dnf copr enable vbatts/bazel
dnf install bazel4
yum install gcc-toolset-9
yum install gcc-c++
続けて次を実行します。
git clone https://github.com/google/cdc-file-transfer
cd cdc-file-transfer
git submodule update --init --recursive
続けて次を実行します。
bazel build --action_env=CC=/opt/rh/gcc-toolset-9/root/usr/bin/gcc --config linux --compilation_mode=opt --linkopt=-Wl,--strip-all --copt=-fdata-sections --copt=-ffunction-sections --linkopt=-Wl,--gc-sections //cdc_rsync_server
bazel build --action_env=CC=/opt/rh/gcc-toolset-9/root/usr/bin/gcc --config linux --compilation_mode=opt --linkopt=-Wl,--strip-all --copt=-fdata-sections --copt=-ffunction-sections --linkopt=-Wl,--gc-sections //cdc_fuse_fs
次のファイルができていることを確認してください。
bazel-bin/cdc_rsync_server/cdc_rsync_server
bazel-bin/cdc_fuse_fs/cdc_fuse_fs
bazel-bin/external/com_github_fuse/libfuse.so
Windowsでツールの用意・Linuxサーバの設定
Windows
Releases · google/cdc-file-transfer から cdc-file-transfer-binaries-vXX.XX.XX-x64.zip の形式のファイルをダウンロード・展開します。
2023年1月12日時点で、最新版は cdc-file-transfer-binaries-v1.0.0-x64.zip です。
先の手順「ツールのビルド」で作業した場合は、作成した cdc_rsync_server、cdc_fuse_fs、libfuse.so をLinuxサーバからコピーして、cdc-file-transfer-binaries-vXX.XX.XX-x64.zip を展開した箇所へ上書きします。
Linux
Linuxサーバ上の /etc/fuse.conf で、次の行を追加してください。
/etc/fuse.conf が無い場合は作成してください。
user_allow_other
ツールの実行
CDC RSync、CDC Stream の2つがありますが、いずれもWindowsマシン側の内容を、Linuxサーバ側の指定されたディレクトリへ一方通行で反映させます。
Linuxサーバ側の内容をWindows側に反映させることはできません。
なお、下記で説明のコマンドは、先の手順「Windowsでツールの用意・Linuxサーバの設定」でWindows上で展開したフォルダ下のコマンドです。
CDC RSync
指定したWindows上のファイル/ディレクトリを、Linuxサーバ側の指定ディレクトリへ同期させます。
次の書式で実行します。
”Linuxサーバ” は、先の手順「WindowsからLinuxへのssh接続(公開鍵認証)の設定」で%USERPROFILE%\.ssh\configファイルのHost行に記述した識別名を、記述してください。
CDC File Transfer のページの説明では「Windows側ディレクトリ/*」となっていますが、単に「Windows側ディレクトリ」の記述でも動作するようです。
cdc_rsync Windows側ファイル Linuxサーバ:Linux側ディレクトリ
cdc_rsync Windows側ディレクトリ/* Linuxサーバ:Linux側ディレクトリ
cdc_rsync Windows側ディレクトリ/* Linuxサーバ:Linux側ディレクトリ -r
例えば、次のように実行します。
cdc_rsync c:\from_dir\* linux_device:~/to_dir -r
CDC Stream
指定したWindows上のディレクトリ下に書かれたファイル/ディレクトリが更新されたら、随時Linuxサーバ側へストリーミング転送します。
次の書式でストリーミング開始します。
”Linuxサーバ” は、先の手順「WindowsからLinuxへのssh接続(公開鍵認証)の設定」で%USERPROFILE%\.ssh\configファイルのHost行に記述した識別名を、記述してください。
cdc_stream start Windows側ディレクトリ Linuxサーバ:Linux側ディレクトリ
例えば、次のように実行します。
cdc_stream start c:\from_dir linux_device:~/to_dir
次のように Started streaming と表示されたら、ストリーミング転送開始です。
以降、Windows側ディレクトリに書かれた内容が随時Linuxサーバに転送されます。
cdc_stream start 実行前にWindows側ディレクトリに存在していた内容も、cdc_stream start 後に転送されます。
Started streaming directory 'c:\from_dir' to 'linux_device:~/to_dir'
どうも動作が不安定
上記の手順でビルド・実行させましたが、冒頭で言及の通り、ツールの実行ではどうも動作が不安定なようです。
こちらの環境は Ubuntu20.04,RockyLinux8 ですが、両ディストリビューションともに、cdc_rsync/cdc_stream の両方とも動作が不安定でした。
cdc_stream ではWindows側の変更が反映されないことがありました。
cdc_rsync では実行の際に以下の問題が起こることがありました。
・次のような接続タイムアウトエラーが出て実行できない
Error: Server connection timed out. Verify that the host 'XXXXX' is correct, or specify a larger timeout with --contimeout.
・Windows側の変更が反映されないことがある
・cdc_rsync の実行で次のような表示(この表示自体は正常)の後、コマンドプロンプトに戻ってこないので、CTRL-Cで終了させないといけない。
Server is listening
26 file(s) and 15 folder(s) found
0 file(s) and 0 folder(s) are not present on the instance and will be copied.
0 file(s) changed and will be updated.
26 file(s) and 15 folder(s) match and do not have to be updated.
1 file(s) and 0 folder(s) on the instance do not exist on this machine.
・次のような表示で cdc_rsync が実行されない。さらにコマンドプロンプトに戻ってこないので、CTRL-Cで終了させないといけない。
Server outdated. Redeploying...
コメント