Google製のファイル転送ツール CDC File Transfer のビルド・実行方法。ただしツールは動作不安定・・

ALL
スポンサーリンク

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...

コメント