| | 1 | [[PageOutline]] |
| | 2 | [[TitleIndex(TipAndDoc/service/Google/Drive/Comparision,format=group)]] |
| | 3 | |
| | 4 | * Googleドライブ クライアントの仕様比較 |
| | 5 | |
| | 6 | * 検証対象 |
| | 7 | * GUIではなくコンソールから使用できるものを対象とした |
| | 8 | * aur:google-drive-ocamlfuse 0.6.7-1 |
| | 9 | * aur:gdrivefs 0.14.8-2 |
| | 10 | * [https://www.archlinux.org/packages/community/x86_64/rclone/ rclone] 1.35-1 |
| | 11 | |
| | 12 | * 検証に用いる一時ファイルなどは以下のように用意した |
| | 13 | {{{ |
| | 14 | dd if=/dev/urandom of=1GiB.0 count=1048576 bs=1024 |
| | 15 | for i in {0..9}; do dd if=/dev/urandom of=102.4MiB.$i count=7482 bs=14351; done |
| | 16 | for i in {0..99}; do dd if=/dev/urandom of=10.24MiB.$i count=346 bs=31033; done |
| | 17 | for i in {0..100}; do dd if=/dev/urandom of=1MiB.$i count=1024 bs=1024; done |
| | 18 | for i in {0..1000}; do dd if=/dev/urandom of=100KiB.$i count=100 bs=1024; done |
| | 19 | |
| | 20 | $ du -b |
| | 21 | 1073745920 ./1.1Gx1 |
| | 22 | 1073745916 ./2.102Mx10 |
| | 23 | 1073745896 ./3.10Mx100 |
| | 24 | 105910272 ./4.1Mx100 |
| | 25 | 102539264 ./5.100Kx1000 |
| | 26 | }}} |
| | 27 | * {{{4.1Mx100}}} は実際には101ファイル、{{{5.100Kx1000}}}も同じく1001ファイル |
| | 28 | |
| | 29 | * rsync オプションについて |
| | 30 | {{{ |
| | 31 | rsync --times --recursive --links --human-readable --whole-file --delete --stats --inplace --verbose |
| | 32 | }}} |
| | 33 | * ファイルシステムとしてマウント可能なクライアントに対して使用 |
| | 34 | * コピー中の一時ファイルを作成させないため、 {{{--inplace}}} オプションを用いた |
| | 35 | * [https://github.com/astrada/google-drive-ocamlfuse/wiki/rsync rsync · astrada/google-drive-ocamlfuse Wiki] |
| | 36 | |
| | 37 | * dstat のオプションは次のようにした |
| | 38 | {{{ |
| | 39 | dstat -t -c -m -d -n -o dstat.csv --nocolor 5 |
| | 40 | }}} |
| | 41 | |
| | 42 | * 検証環境 |
| | 43 | * QEMU/KVM VM on Core i7-4790 (wiki:TipAndDoc/Hardware#ASUSH97M-PLUS) |
| | 44 | * vCPU: 2cores |
| | 45 | * Mem : 2GB |
| | 46 | * Disk: qcow2 file backend on software RAID1 HDD x2 |
| | 47 | * ArchLinux 4.10.x (途中で何度かアップデート) |
| | 48 | |
| | 49 | * インターネット回線について |
| | 50 | * 比較的安定しているが、時間帯(主に深夜)によっては遅くなる |
| | 51 | * 下り: 100Mbps~、上り: 80Mbps~ をほぼ維持できている |
| | 52 | * 参考: http://www.speedtest.net/result/6254044691, http://beta.speedtest.net/result/6294874249 |
| | 53 | |
| | 54 | = 用語について = |
| | 55 | * アップロード |
| | 56 | * ローカルストレージからGoogleドライブへの移動・コピー。もしくはマウントされているFUSEへの書き込み |
| | 57 | * ダウンロード |
| | 58 | * アップロードの逆で、ローカルストレージへの移動・コピー。もしくはマウントされているFUSEからの読み込み |
| | 59 | * キャッシュ |
| | 60 | * FUSEを使ってマウントする場合に、ローカルストレージに作成される一時ファイル |
| | 61 | * ファイルID |
| | 62 | * Googleドライブ上でアイテム(ファイル・ディレクトリ)を一意に指定するID |
| | 63 | * Googleドライブではディレクトリもファイルの一種 |
| | 64 | * ブラウザ上ではURLにこれが含まれる |
| | 65 | |
| | 66 | = brief overview of comparison = |
| | 67 | |
| | 68 | * 各ツールの設定において、特にチューニング等は行っていない |
| | 69 | * I/Oの速度計測は十分な回数実施し平均をとるべきだが、傾向が見たいだけだったので各1回しか計測していない |
| | 70 | |
| | 71 | ||= 名前 =||= アクセス方法 =||||||||= Up =||||||||= Down =||||= mtimeの保存 =||= CPU負荷 =||= 操作の中断 =|| |
| | 72 | || - || - ||1.07GB x1||102MB x10||10MB x100||1MB x101||1.07GB x1||102MB x10||10MB x100||1MB x101||アップロード||ダウンロード ^[#cmp1 *1]^|| - || - || |
| | 73 | ||ブラウザ||WebUI||10MB/s~||未計測||未計測||未計測||10MB/s~||未計測||未計測||未計測||保存されない||保存されない||低負荷||可|| |
| | 74 | ||google-drive-ocamlfuse ||FUSE mount||940.87KB/s||828.39KB/s||623.52KB/s||158.71KB/s||14.04MB/s||9.72MB/s||未計測||503.27KB/s||保存されない||保存される||高負荷(IO wait)||不可|| |
| | 75 | ||GDriveFS||FUSE mount||3.22MB/s ^[#cmp2 *2]^||1.95MB/s||1.11MB/s||197.46KB/s||計測不可 ^[#cmp3 *3]^||984.82KB/s ^[#cmp4 *4]^||未計測||816.26KB/s ^[#cmp4 *4]^||場合による ^[#cmp5 *5]^ ||保存される||高負荷(usr)||不可|| |
| | 76 | ||rclone||CUI (rsync like)||7.064MB/s||9.783MB/s||8.532MB/s||2.397MB/s||16.521MB/s||19.585MB/s||未計測||4.493MB/s||保存される||保存される||低負荷||可|| |
| | 77 | |
| | 78 | 1. [=#cmp1] rsyncコマンドでのみ確認 |
| | 79 | 2. [=#cmp2] I/Oエラーが発生したため、dstatでの計測下でない条件での参考値 |
| | 80 | 3. [=#cmp3] I/Oエラーが発生したため |
| | 81 | 4. [=#cmp4] 一部のファイルでI/Oエラーが発生した |
| | 82 | 5. [=#cmp5] cpコマンド {{{cp -a}}} では保存されないが、rsyncコマンドでは保存される |
| | 83 | |
| | 84 | == copy/move == |
| | 85 | * cp, mvなどによるファイルの複製・移動について |
| | 86 | |
| | 87 | * ブラウザからの操作 |
| | 88 | * すべてサーバーサイドで処理される |
| | 89 | * 単純な移動はmtimeが維持されるが、ファイル名変更は維持されない |
| | 90 | * コピーは新しいファイルの作成となるため、mtimeは維持されない |
| | 91 | |
| | 92 | * rclone |
| | 93 | * Googleドライブはサーバーサイドでの移動・コピーをサポートしているため、rcloneでもサーバーサイドで処理される |
| | 94 | * https://rclone.org/overview/#optional-features Googleドライブを含め、各種クラウドストレージサービスの機能比較 |
| | 95 | * 移動先はディレクトリである必要がある |
| | 96 | * mitty@google:~$ {{{rclone move google:/move/rclone/1MiB google:/move/rclone/1MiB.move}}} |
| | 97 | {{{ |
| | 98 | 2017/04/23 19:35:35 ERROR : Google drive root 'move/rclone/1MiB.move': can't move files on overlapping remotes |
| | 99 | 2017/04/23 19:35:35 ERROR : Attempt 1/3 failed with 0 errors and: can't move files on overlapping remotes |
| | 100 | 2017/04/23 19:35:35 ERROR : Google drive root 'move/rclone/1MiB.move': can't move files on overlapping remotes |
| | 101 | 2017/04/23 19:35:35 ERROR : Attempt 2/3 failed with 0 errors and: can't move files on overlapping remotes |
| | 102 | 2017/04/23 19:35:35 ERROR : Google drive root 'move/rclone/1MiB.move': can't move files on overlapping remotes |
| | 103 | 2017/04/23 19:35:35 ERROR : Attempt 3/3 failed with 0 errors and: can't move files on overlapping remotes |
| | 104 | 2017/04/23 19:35:35 Failed to move: can't move files on overlapping remotes |
| | 105 | }}} |
| | 106 | * mitty@google:~$ {{{rclone move google:/move/rclone/1MiB google:/move/1MiB.move}}} |
| | 107 | * mitty@google:~$ {{{rclone ls google:/move/1MiB.move}}} |
| | 108 | {{{ |
| | 109 | 1048576 1MiB |
| | 110 | }}} |
| | 111 | * {{{1MiB}}}ファイルがリネームされるのではなく、{{{1MiB.move}}}というディレクトリの中に移動される |
| | 112 | |
| | 113 | == move of directory tree == |
| | 114 | * ブラウザからの操作と同様、treeディレクトリがdestディレクトリにリネームされたのと同じコマンド操作が可能[[br]][[Image(googedrive-movetree.png,33%)]] |
| | 115 | * mitty@google:~$ {{{time rclone -v move google:/move/rclone/tree/ google:/move/rclone/dest/}}} |
| | 116 | {{{ |
| | 117 | 2017/04/23 22:11:26 INFO : Google drive root 'move/rclone/dest': Modify window is 1ms |
| | 118 | 2017/04/23 22:11:26 INFO : Google drive root 'move/rclone/dest': Server side directory move succeeded |
| | 119 | 2017/04/23 22:11:26 INFO : |
| | 120 | Transferred: 0 Bytes (0 Bytes/s) |
| | 121 | Errors: 0 |
| | 122 | Checks: 0 |
| | 123 | Transferred: 0 |
| | 124 | Elapsed time: 4.6s |
| | 125 | |
| | 126 | real 0m4.606s |
| | 127 | user 0m0.027s |
| | 128 | sys 0m0.000s |
| | 129 | }}} |
| | 130 | * mitty@google:~/mnt/google-drive-ocamlfuse/move/gdo$ date; time mv -v tree dest; date |
| | 131 | {{{ |
| | 132 | Sun Apr 23 22:14:44 JST 2017 |
| | 133 | 'tree' -> 'dest' |
| | 134 | |
| | 135 | real 0m1.874s |
| | 136 | user 0m0.000s |
| | 137 | sys 0m0.000s |
| | 138 | Sun Apr 23 22:14:46 JST 2017 |
| | 139 | }}} |
| | 140 | * mitty@google:~/mnt/gdfs/move/gdfs$ date; time mv -v tree dest; date |
| | 141 | {{{ |
| | 142 | Sun Apr 23 22:17:43 JST 2017 |
| | 143 | 'tree' -> 'dest' |
| | 144 | |
| | 145 | real 0m1.804s |
| | 146 | user 0m0.000s |
| | 147 | sys 0m0.000s |
| | 148 | Sun Apr 23 22:17:45 JST 2017 |
| | 149 | }}} |
| | 150 | |
| | 151 | * ディレクトリのファイルIDは維持される |
| | 152 | * ツリー以下のファイル数が多くなっても、ディレクトリ自体の移動は一瞬で完了する |
| | 153 | |
| | 154 | = google-drive-ocamlfuse = |
| | 155 | |
| | 156 | * 認証 => wiki:TipAndDoc/service/Google/OAuth#aur:google-drive-ocamlfuse |
| | 157 | |
| | 158 | == mount/umount == |
| | 159 | |
| | 160 | * mitty@google:~/mnt$ google-drive-ocamlfuse google-drive-ocamlfuse |
| | 161 | {{{ |
| | 162 | Mar 20 16:46:10 google kernel: fuse init (API version 7.26) |
| | 163 | Mar 20 16:46:10 google systemd[1]: Mounting FUSE Control File System... |
| | 164 | Mar 20 16:46:10 google systemd[1]: Mounted FUSE Control File System. |
| | 165 | }}} |
| | 166 | * $ mount |
| | 167 | {{{ |
| | 168 | google-drive-ocamlfuse on /home/mitty/mnt/google-drive-ocamlfuse type fuse.google-drive-ocamlfuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000) |
| | 169 | }}} |
| | 170 | |
| | 171 | * fusermount -u /home/mitty/mnt/google-drive-ocamlfuse |
| | 172 | |
| | 173 | == features == |
| | 174 | * {{{$HOME/.gdfuse/default/cache/}}} にキャッシュを作成する |
| | 175 | * ファイルIDがファイル名になっている |
| | 176 | * マウントしたローカルディレクトリは、Sambaからアクセスできない(見えなくなる) |
| | 177 | * Googleドライブをローカルにマウントして、その中身をSambaでさらに別のPCからアクセスすることはできない |
| | 178 | * マウントしたディレクトリへアクセスする場合、まずキャッシュファイルが作成される |
| | 179 | * マウントしたディレクトリへのコピー・移動時: キャッシュファイル作成→Googleドライブへネットワーク転送 |
| | 180 | * マウントしたディレクトリからの場合: Googleドライブからキャッシュディレクトリへダウンロード→目的のパスにファイル作成 |
| | 181 | * rmコマンドによる削除はゴミ箱(.Trash/)への移動となる |
| | 182 | |
| | 183 | === mtime === |
| | 184 | * {{{cp -a}}}、rsyncのいずれでも、アップロード時は一部のファイルを除いて更新日時は同期時に変更されてしまう |
| | 185 | * mtimeが保存されるファイルとそうでないファイルの違いは不明 。拡張子などによる違いではない模様 |
| | 186 | * ダウンロード時はmtimeは保存される |
| | 187 | |
| | 188 | === I/O === |
| | 189 | * for detail => [[./dstat/google-drive-ocamlfuse]] |
| | 190 | |
| | 191 | * アップロード |
| | 192 | * ネットワーク転送に先立ってディスク上にキャッシュが作成されるが、かなり時間がかかる (10MB/s程度しか出ない)が、アップロード自体は高速(~100Mbps) |
| | 193 | * キャッシュ作成中はCPUがIO waitで高負荷になる(100%) |
| | 194 | * キャッシュ作成のI/Oが完了する前にGoogleドライブ上にはファイルが作成されている |
| | 195 | * ただしサイズが表示されないので、openされただけのような状態でデータにはアクセスできない模様 |
| | 196 | * キャッシュの作成完了とともに書き込みプロセスからシェルに制御ぎゃもどるため、writeが終了したとして処理されている模様 |
| | 197 | * 実際のネットワークアップロードはその後バックグラウンド処理 |
| | 198 | * ダウンロード |
| | 199 | * FUSEからの読み込みによってキャッシュが作成されるが、これもIO waitで高負荷になる(80%~) |
| | 200 | * Googleドライブからのダウンロード自体は高速(~190Mbps) |
| | 201 | * キャッシュへの書き込み終了後の読み込みは高速かつ低IO wait |
| | 202 | |
| | 203 | * I/O waitについては、[http://forums.debian.net/viewtopic.php?f=10&t=129095#p620297 Debian User Forums • View topic - Google drive mounting client.] でも言及されている |
| | 204 | |
| | 205 | === move/copy === |
| | 206 | * マウントしたディレクトリ上でのcp, mvいずれでもmtimeは保存されない |
| | 207 | * cpはサーバーサイドで処理されず、一度キャッシュにダウンロードしたのち改めてアップロードとして処理される |
| | 208 | * mvはサーバーサイドで処理され、ファイルIDも維持される |
| | 209 | |
| | 210 | * for detail => [[./dstat/google-drive-ocamlfuse#movecopy]] |
| | 211 | |
| | 212 | === error handling === |
| | 213 | * マウント中に、Googleアカウント側でクレデンシャルを削除するなどして接続を切ると、lsのI/Oがブロックして帰ってこなくなる |
| | 214 | * 割り込み不可のためCtrl+Cなども効かないが、google-drive-ocamlfuseプロセスをkillすることで一応回避可能 |
| | 215 | * 書き込み(アップロード)が完了したように見えても、{{{fusermount -u}}}せずGoogleアカウント側でクレデンシャルを削除して切断するとファイルが壊れることがある模様 |
| | 216 | * アンマウント中にGoogleアカウント側でクレデンシャルを削除し、{{{google-drive-ocamlfuse}}}で再マウントしてもエラー表示などは表示されない |
| | 217 | * debug表示があるかは未確認 |
| | 218 | * ただしアクセスしようとするとI/Oエラーになる |
| | 219 | {{{ |
| | 220 | $ google-drive-ocamlfuse ~/mnt/google-drive-ocamlfuse/ |
| | 221 | $ ls -la google-drive-ocamlfuse |
| | 222 | ls: cannot access 'google-drive-ocamlfuse': Input/output error |
| | 223 | }}} |
| | 224 | |
| | 225 | == config == |
| | 226 | * read onlyにすることが可能 |
| | 227 | * $ vim .gdfuse/default/config |
| | 228 | {{{ |
| | 229 | read_only=true |
| | 230 | }}} |
| | 231 | * $ touch google-drive-ocamlfuse/tmp |
| | 232 | {{{ |
| | 233 | touch: cannot touch 'google-drive-ocamlfuse/tmp': Permission denied |
| | 234 | }}} |
| | 235 | * $ mount |
| | 236 | {{{ |
| | 237 | google-drive-ocamlfuse on /home/mitty/mnt/google-drive-ocamlfuse type fuse.google-drive-ocamlfuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000) |
| | 238 | }}} |
| | 239 | * mount上は区別できない |
| | 240 | |
| | 241 | == debug == |
| | 242 | * mitty@google:~$ google-drive-ocamlfuse -debug ~/mnt/google-drive-ocamlfuse/ |
| | 243 | {{{ |
| | 244 | Starting application setup (label=default, base_dir=/home/mitty/.gdfuse). |
| | 245 | Opening log file: /home/mitty/.gdfuse/default/gdfuse.log |
| | 246 | }}} |
| | 247 | * foregroud で動作する |
| | 248 | * ただし、不安定になるためあまり使いにくそう |
| | 249 | * mitty@google:~$ ls -l mnt/google-drive-ocamlfuse |
| | 250 | {{{ |
| | 251 | ls: cannot access 'mnt/google-drive-ocamlfuse': Software caused connection abort |
| | 252 | }}} |
| | 253 | * mitty@google:~$ google-drive-ocamlfuse -debug ~/mnt/google-drive-ocamlfuse/ |
| | 254 | {{{ |
| | 255 | Illegal instruction (core dumped) |
| | 256 | }}} |
| | 257 | |
| | 258 | = GDriveFS = |
| | 259 | * 認証 => wiki:TipAndDoc/service/Google/OAuth#aur:gdrivefs |
| | 260 | |
| | 261 | == mount/umount == |
| | 262 | |
| | 263 | * mitty@google:~$ gdfstool mount ~/.gdfs/cred ~/mnt/gdfs/ |
| | 264 | * sudo umount /home/mitty/mnt/gdfs |
| | 265 | |
| | 266 | * $ gdfstool mount {{{-o big_writes}}} .gdfs/cred ~/mnt/gdfs/ |
| | 267 | * はっきりわかるほどの差は発生しなかった |
| | 268 | |
| | 269 | == features == |
| | 270 | * {{{/tmp}}}にキャッシュを作成する |
| | 271 | * ディストリビューションによってはtmpfs(オンメモリ)になっていることが多いので、巨大なファイルにアクセスしようとすると空き容量が不足してファイルが壊れることがある |
| | 272 | {{{#!sh |
| | 273 | 'sample/1GiB' -> 'gdfs/sample/1GiB' |
| | 274 | cp: error writing 'gdfs/sample/1GiB': Input/output error |
| | 275 | }}} |
| | 276 | * {{{export TMPDIR=/var/tmp/}}}等、キャッシュを作成するパスを変更することで回避可能 |
| | 277 | * google-drive-ocamlfuse 同様、ファイルへのアクセスは一度tmpにキャッシュファイルが作成される |
| | 278 | * {{{getfattr}}}コマンドにより、Googleドライブ上でのファイルIDや作成日時(ctime)、修正日時(mtime)などの属性を確認できる |
| | 279 | * [https://github.com/dsoprea/GDriveFS#extended-attributes Extended Attributes] |
| | 280 | * {{{ln}}}によるsymlinkは作成できない |
| | 281 | * rmはゴミ箱ではなく即座に削除される |
| | 282 | |
| | 283 | === mtime === |
| | 284 | * google-drive-ocamlfuse 同様、{{{cp -a}}}でもアップロード時はmtimeは保存されない |
| | 285 | * ダウンロードでは保存される |
| | 286 | |
| | 287 | === I/O === |
| | 288 | |
| | 289 | * for detail => [[./dstat/gdrivefs]] |
| | 290 | |
| | 291 | * キャッシュ作成時は50MB/s程度、ネットワーク転送はアップロード・ダウンロードとも~30Mbpsほどで低速 |
| | 292 | * キャッシュ作成中はCPUがIO waitで高負荷になる(~80%)が、時間はそれほどかからない |
| | 293 | |
| | 294 | === move/copy === |
| | 295 | * google-drive-ocamlfuseと同様、マウントしたディレクトリ上でのcp, mvいずれでもmtimeは保存されない |
| | 296 | * mvはサーバーサイドで処理されるが、cpはローカルのキャッシュを経由してダウンロード→アップロードされる |
| | 297 | * mvではファイルIDは維持される |
| | 298 | |
| | 299 | * for detail => [[./dstat/gdrivefs#movecopy]] |
| | 300 | |
| | 301 | === error handling === |
| | 302 | * 転送途中にCtrl+Cで強制終了ができない |
| | 303 | * psで見るとSTATがDになっている |
| | 304 | * gdfstoolのプロセスをkillするなどして無理に強制終了すると、OSのシャットダウン時にI/Oがブロックされたままになることがある |
| | 305 | |
| | 306 | == debug == |
| | 307 | * https://github.com/dsoprea/GDriveFS#developingdebugging |
| | 308 | * export {{{GD_DEBUG=1}}} |
| | 309 | |
| | 310 | * mitty@google:~/.gdfuse/default$ cat curl.log |
| | 311 | {{{ |
| | 312 | [15.400034] curl: info: Trying 172.217.25.74... |
| | 313 | [15.400053] curl: info: TCP_NODELAY set |
| | 314 | [15.436757] curl: info: Connected to www.googleapis.com (172.217.25.74) port 443 (#0) |
| | 315 | [15.436874] curl: info: ALPN, offering http/1.1 |
| | 316 | [15.436914] curl: info: Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH |
| | 317 | [15.441081] curl: info: successfully set certificate verify locations: |
| | 318 | [15.441089] curl: info: CAfile: /etc/ssl/certs/ca-certificates.crt |
| | 319 | CApath: none |
| | 320 | [15.441138] curl: info: TLSv1.2 (OUT), TLS header, Certificate Status (22): |
| | 321 | }}} |
| | 322 | * mitty@google:~/.gdfuse/default$ cat gdfuse.log |
| | 323 | {{{ |
| | 324 | [0.000102] TID=0: Setting up default filesystem... |
| | 325 | [0.000116] TID=0: Loading configuration from /home/mitty/.gdfuse/default/config...done |
| | 326 | [0.000193] TID=0: BEGIN: Saving configuration in /home/mitty/.gdfuse/default/config |
| | 327 | [0.000258] TID=0: END: Saving configuration in /home/mitty/.gdfuse/default/config |
| | 328 | [0.000282] TID=0: Loading application state from /home/mitty/.gdfuse/default/state...done |
| | 329 | Current version: 0.6.7 |
| | 330 | Setting up cache db...done |
| | 331 | Setting up CURL...done |
| | 332 | Refresh token already present. |
| | 333 | [0.002030] TID=0: Starting filesystem /home/mitty/mnt/google-drive-ocamlfuse/ |
| | 334 | [0.004052] TID=1: init_filesystem |
| | 335 | [15.395620] TID=2: getattr / |
| | 336 | [15.395644] TID=2: BEGIN: Loading metadata from db |
| | 337 | [15.395883] TID=2: BEGIN: Recalculating cache size (old value=213280358) |
| | 338 | [15.396095] TID=2: END: Recalculating cache size (new value=213280358) |
| | 339 | [15.396101] TID=2: END: Getting metadata: Not valid |
| | 340 | [15.396104] TID=2: BEGIN: Refreshing metadata |
| | 341 | }}} |
| | 342 | |
| | 343 | = rclone = |
| | 344 | |
| | 345 | * Googleドライブを含め、多数のクラウドストレージに対応している |
| | 346 | * https://rclone.org/overview/ |
| | 347 | * 認証 |
| | 348 | * google-drive-ocamlfuse と同様に、ハードコードされたクライアントIDを使うことも、自分で用意したものを設定することもできる |
| | 349 | |
| | 350 | == features == |
| | 351 | * FUSE mountする機能もあるがまだ実験的 (EXPERIMENTAL) |
| | 352 | * シーケンシャルアクセスのみ対応 |
| | 353 | * https://rclone.org/commands/rclone_mount/ |
| | 354 | * copyコマンドなど多くのコマンドが、引数のパスをディレクトリ名として扱うことが多い点に注意が必要 |
| | 355 | * 特に移動・コピー先のパス(dest)はディレクトリして扱われるコマンドが多い |
| | 356 | * このため、あるファイルを別のディレクトリにコピーすることはできるが、コピー先のファイル名を指定してコピーと同時にリネームするようなことはできない |
| | 357 | * 同時並行で複数の処理が行われる。デフォルトでは4並行 |
| | 358 | * 当然だが各転送ごとの帯域はその並行数だけ分割される |
| | 359 | * 使用するネットワーク帯域に制限をかけることができる |
| | 360 | * パスワードを設定し透過的に暗号化することができる |
| | 361 | * ログをファイルもしくはsyslogに出力可能 |
| | 362 | |
| | 363 | === mtime === |
| | 364 | * ダウンロード・アップロードとも保存される |
| | 365 | * move, copyコマンドにおいても維持される |
| | 366 | * ディレクトリのmtimeは保存されない |
| | 367 | |
| | 368 | === I/O === |
| | 369 | * [[./dstat/rclone]] |
| | 370 | |
| | 371 | * CPU負荷はusr, io waitとも高くなく、制限しなければネットワーク帯域をすべて使い切ることができる |
| | 372 | |
| | 373 | === move === |
| | 374 | * mitty@google:~$ {{{rclone move google:/mtime/rclone google:/mtime/rclone.test}}} |
| | 375 | * 移動前と移動後で、ファイルのファイルIDは維持される |
| | 376 | {{{ |
| | 377 | $ getfattr -d mnt/gdfs/mtime/rclone/1MiB | grep '\.id' |
| | 378 | user.original.id="0B6fZtAGUBbvtazRXTjR2T19GZzQ\012" |
| | 379 | }}} |
| | 380 | {{{ |
| | 381 | $ getfattr -d mnt/gdfs/mtime/rclone.test/1MiB | grep '\.id' |
| | 382 | user.original.id="0B6fZtAGUBbvtazRXTjR2T19GZzQ\012 |
| | 383 | }}} |
| | 384 | |
| | 385 | * mitty@google:~$ {{{date; time rclone move google:/rclone/1.1Gx1 google:/rclone/dest/1.1Gx1}}} |
| | 386 | {{{ |
| | 387 | Thu Mar 30 01:00:19 JST 2017 |
| | 388 | |
| | 389 | real 0m4.700s |
| | 390 | user 0m0.023s |
| | 391 | sys 0m0.000s |
| | 392 | }}} |
| | 393 | * サーバーサイドで処理されるため、ファイルサイズに関わらず数秒で完了する |
| | 394 | * ネットワーク帯域もほぼ使用しない |
| | 395 | {{{ |
| | 396 | $ dstat -t -c -m -d -n -o dstat.csv --nocolor 5 |
| | 397 | ----system---- --total-cpu-usage-- ------memory-usage----- -dsk/total- -net/total- |
| | 398 | time |usr sys idl wai stl| used free buff cach| read writ| recv send |
| | 399 | 30-03 01:00:13| 3 1 96 0 0| 140M 1671M 36.2M 120M| 0 819B|1357B 3805B |
| | 400 | 30-03 01:00:18| 0 0 98 2 0| 140M 1671M 36.2M 120M| 0 9011B| 281B 349B |
| | 401 | 30-03 01:00:23| 0 0 100 0 0| 146M 1665M 36.2M 120M| 0 819B|9626B 1965B |
| | 402 | 30-03 01:00:28| 0 0 99 1 0| 140M 1671M 36.3M 120M| 0 3277B|1401B 718B |
| | 403 | 30-03 01:00:33| 0 0 100 0 0| 140M 1671M 36.3M 120M| 0 819B| 524B 507B |
| | 404 | }}} |
| | 405 | |
| | 406 | === copy === |
| | 407 | * mitty@google:~$ {{{time rclone copy google:/mtime/rclone/1MiB google:/mtime/rclone/1MiB.copy}}} |
| | 408 | {{{ |
| | 409 | |
| | 410 | real 0m6.659s |
| | 411 | user 0m0.027s |
| | 412 | sys 0m0.010s |
| | 413 | }}} |
| | 414 | * moveと同じく、サーバーサイドで処理されるため、ファイルサイズに関わらず数秒で完了する |
| | 415 | * 同様にネットワーク帯域もほぼ使用しない |
| | 416 | {{{ |
| | 417 | ----system---- --total-cpu-usage-- ------memory-usage----- -dsk/total- -net/total- |
| | 418 | time |usr sys idl wai stl| used free buff cach| read writ| recv send |
| | 419 | 01-04 23:05:47| 1 0 98 1 0| 147M 1720M 18.6M 104M| 0 819B| 721B 1281B |
| | 420 | 01-04 23:05:52| 1 1 97 1 0| 142M 1725M 18.6M 104M| 0 4096B|1087B 3182B |
| | 421 | 01-04 23:05:57| 0 0 99 1 0| 148M 1718M 18.6M 104M| 0 15k| 13k 1908B |
| | 422 | 01-04 23:06:02| 0 0 100 0 0| 141M 1725M 18.6M 104M| 0 0 |7335B 2294B |
| | 423 | }}} |
| | 424 | * コピーの場合は当然ながらファイルIDは異なったものになる |
| | 425 | {{{ |
| | 426 | mitty@google:~$ getfattr -d mnt/gdfs/mtime/rclone/1MiB | grep '\.id' |
| | 427 | user.original.id="0B6fZtAGUBbvtSkVLTzI4YjM3Nm8\012" |
| | 428 | mitty@google:~$ getfattr -d mnt/gdfs/mtime/rclone/1MiB.copy/1MiB | grep '\.id' |
| | 429 | user.original.id="0B6fZtAGUBbvtel93REFhTUpvUkE\012" |
| | 430 | }}} |
| | 431 | |
| | 432 | * 10MB x100ファイル (約1GB)のコピーであっても短時間で処理できる |
| | 433 | * mitty@google:~$ {{{date; time rclone copy google:/rclone/3.10Mx100 google:/rclone/dest/3.10Mx100.copy}}} |
| | 434 | {{{ |
| | 435 | Sat Apr 1 23:13:24 JST 2017 |
| | 436 | |
| | 437 | real 0m25.053s |
| | 438 | user 0m0.083s |
| | 439 | sys 0m0.037s |
| | 440 | }}} |
| | 441 | * {{{$ dstat -t -c -m -d -n -o dstat.csv --nocolor 5}}} |
| | 442 | {{{ |
| | 443 | ----system---- --total-cpu-usage-- ------memory-usage----- -dsk/total- -net/total- |
| | 444 | time |usr sys idl wai stl| used free buff cach| read writ| recv send |
| | 445 | 01-04 23:13:17| 0 0 100 0 0| 156M 1710M 18.8M 104M| 0 0 | 627B 547B |
| | 446 | 01-04 23:13:22| 0 0 99 1 0| 157M 1710M 18.8M 104M| 0 2458B| 296B 363B |
| | 447 | 01-04 23:13:27| 0 0 100 0 0| 161M 1705M 18.8M 104M| 21k 0 | 14k 2225B |
| | 448 | 01-04 23:13:32| 0 0 99 1 0| 163M 1704M 18.8M 104M| 0 2458B| 76k 5625B |
| | 449 | 01-04 23:13:37| 0 0 100 0 0| 164M 1702M 18.8M 104M| 0 0 | 13k 4202B |
| | 450 | 01-04 23:13:42| 0 0 99 1 0| 164M 1702M 18.8M 104M| 0 2458B| 12k 4351B |
| | 451 | 01-04 23:13:47| 0 0 100 0 0| 164M 1702M 18.8M 104M| 0 819B| 13k 4506B |
| | 452 | 01-04 23:13:52| 0 0 99 1 0| 157M 1709M 18.9M 104M| 0 3277B|4994B 1486B |
| | 453 | 01-04 23:13:57| 0 0 100 0 0| 157M 1709M 18.9M 104M| 0 0 | 502B 479B |
| | 454 | }}} |
| | 455 | |
| | 456 | * 自分がオーナーではないファイルについてもサーバーサイドでコピーが可能 |
| | 457 | * mitty@google:~$ {{{rclone -v copy google:/share/shared google:/share/copy}}} |
| | 458 | {{{ |
| | 459 | 2017/05/19 01:13:45 INFO : Google drive root 'share/copy': Modify window is 1ms |
| | 460 | 2017/05/19 01:13:47 INFO : Google drive root 'share/copy': Waiting for checks to finish |
| | 461 | 2017/05/19 01:13:47 INFO : Google drive root 'share/copy': Waiting for transfers to finish |
| | 462 | 2017/05/19 01:13:48 INFO : 10.24MiB.5: Copied (server side copy) |
| | 463 | 2017/05/19 01:13:48 INFO : 1MiB: Copied (server side copy) |
| | 464 | 2017/05/19 01:13:49 INFO : test/10.24MiB: Copied (server side copy) |
| | 465 | 2017/05/19 01:13:49 INFO : test/1MiB.copy: Copied (server side copy) |
| | 466 | 2017/05/19 01:13:49 INFO : |
| | 467 | Transferred: 0 Bytes (0 Bytes/s) |
| | 468 | Errors: 0 |
| | 469 | Checks: 0 |
| | 470 | Transferred: 4 |
| | 471 | Elapsed time: 6.6s |
| | 472 | }}} |
| | 473 | * {{{google:/share/shared}}} 以下のファイルは別ユーザーからの共有ファイル |
| | 474 | |
| | 475 | == encrypt/decrypt == |
| | 476 | * https://rclone.org/crypt/ |
| | 477 | * ファイル名の暗号化にも対応 |
| | 478 | * nonce を用いる(24バイト、ファイルの先頭に保存される)ため、同じパスワード、同じファイルであっても暗号化後は異なるファイルになる |
| | 479 | * このため、ファイルサイズは若干大きくなる |
| | 480 | * パスワードと別にsaltも指定可能({{{password2}}}として指定できる) |