harumaki.net

インフラ屋の覚書や、ラーメン食べある記とか。

[Google Drive] LinuxサーバーにてRcloneインストール&お試し

   


LinuxサーバーからGoogle Driveのストレージにファイルの同期をしよう、ということで
数あるGoogle Driveの同期ツールの中から、今回はインストール/環境整備がもっとも手軽で
かつGUIでの認証作業が要らない”Rclone”を導入してみたログ。
公式サイトに”rsync for cloud storage”とある通り、オンラインストレージにrsyncするような使い方になりますが
Google Driveのほか、Amazon S3やDropBoxなどにも対応しており、複数のオンラインストレージでの管理にも有用なツールといえそうです。

今回はVPSからの利用ということもあり、認証するのにわざわざVNCやssh経由のXwindowとか立ち上げるのが一手間に感じられたので
テキストベースでの認証ができるのがもっともメリットでした!

参考:お世話になっております!

Rclone公式サイト
ダウンロードページ(公式サイト内)
GitHub
インストール(公式サイト内)

1)インストール

インストールのパターンは二つ。

・goを使ってGitHubからインストール
・公式サイトからバイナリのzipファイルをダウンロードし、展開してそのまま実行

ともに公式サイトのインストールドキュメントを見れば速攻でインストール可能。とても親切で助かります!!
最新版は、06/18(日本時間06/19)にリリースされていました。ChangeLogはこちら

1. ダウンロードと展開

	$ cd /usr/local/src
	$ wget http://downloads.rclone.org/rclone-v1.30-linux-amd64.zip
	# su -
	# cd /usr/local/src
	# unzip rclone-v1.30-linux-amd64.zip
	Archive:  rclone-v1.30-linux-amd64.zip
	   creating: rclone-v1.30-linux-amd64/
	  inflating: rclone-v1.30-linux-amd64/README.html
	  inflating: rclone-v1.30-linux-amd64/rclone
	  inflating: rclone-v1.30-linux-amd64/rclone.1
	  inflating: rclone-v1.30-linux-amd64/README.txt

2. ファイルの確認

	# cd rclone-v1.30-linux-amd64/
	# ll
	合計 12596
	-rw-rw-r-- 1 root root   151550  6月 19 00:41 2016 README.html
	-rw-rw-r-- 1 root root   117204  6月 19 00:41 2016 README.txt
	-rwxrwxr-x 1 root root 12462464  6月 19 00:44 2016 rclone
	-rw-rw-r-- 1 root root   132339  6月 19 00:41 2016 rclone.1

unzip実行時に出ちゃってたけど、READMEファイルのhtml版とテキスト版、コマンド本体にmanファイル、非常にシンプル。
zipファイルの展開から全部rootでやっちゃったので、オーナー権限、パーミッションともにそのままで、所定のディレクトリにコピーして終了。
※一般ユーザーでダウンロードから展開まで進めたときはオーナー権限、パーミッションを変える作業が入ります。

3. 実行ファイルのコピー

	# cp rclone /usr/sbin/

4. manファイルのコピー

	# cp -a rclone.1 /usr/local/share/man/man1/

5. コピーしたらmanページの表示を確認

	# man rclone

以上でインストールはOKです。

2)環境設定

最初の設定として、同期するストレージサービスへの認証とエントリの作成を行います。
rclone全体のマニュアルはこちら。まず設定やオプションなどの全体像を俯瞰できます。
そしてGoogle Driveを利用する際の手順・サンプルはこちら。超助かる~!

▼初期設定、および認証作業

1. rcloneにオプション”config”をつけてエントリ作成開始

	$ rclone config
	2016/06/22 13:13:00 Failed to load config file "/home/user/.rclone.conf" - using defaults: open /home/user/.rclone.conf: no such file or directory
	No remotes found - make a new one
	n) New remote
	s) Set configuration password
	q) Quit config
	n/s/q> 

最初に起動した際、”Failed to load config file “/home/ユーザー名/.rclone.conf” ~”のメッセージが出力されるが、これはエントリを作成すると出力される設定ファイルであり、当然まだ存在していないので、無視してOK。

2. エントリ名を入力

“name”プロンプトが出たら、今回新規作成する設定に対して名前を付ける。
一意のわかりやすいネーミングでOKだが、今回は”GoogleDrive”として作成。

	e/n/d/s/q> n
	name> GoogleDrive

3. オンライストレージのタイプを指定。

	Type of storage to configure.
	Choose a number from below, or type in your own value
	 1 / Amazon Cloud Drive
	   \ "amazon cloud drive"
	 2 / Amazon S3 (also Dreamhost, Ceph)
	   \ "s3"
	 3 / Backblaze B2
	   \ "b2"
	 4 / Dropbox
	   \ "dropbox"
	 5 / Google Cloud Storage (this is not Google Drive)
	   \ "google cloud storage"
	 6 / Google Drive
	   \ "drive"
	 7 / Hubic
	   \ "hubic"
	 8 / Local Disk
	   \ "local"
	 9 / Microsoft OneDrive
	   \ "onedrive"
	10 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
	   \ "swift"
	11 / Yandex Disk
	   \ "yandex"
	Storage> 

今回は”Google Drive”を利用するので6を。

	Storage> 6

4. クライアントID、認証キーの入力

ここは省略できるので、未入力のままEnterしてしまってOK!

	Google Application Client Id - leave blank normally.
	client_id>
	Google Application Client Secret - leave blank normally.
	client_secret>

5. 認証処理

ここはオンラインストレージの認証を行うフェーズとなりますが、”auto config”はGUI環境でのみ実行可能。
今回はGUIでなくSSHでのターミナル接続によるCLIなので、”N”を入力します。

	Remote config
	Use auto config?
	 * Say Y if not sure
	 * Say N if you are working on a remote or headless machine or Y didn't work
	y) Yes
	n) No
	y/n> N
	If your browser doesn't open automatically go to the following link: https://accounts.google.com/o/oauth2/auth?client_id=202264815644.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&state=060b**************************c4
	Log in and authorize rclone for access
	Enter verification code> 

Nを入力すると、リクエスト認証ページへのURLが発行され、プロンプト”Enter verification code”が出力され、待機状態になります。
ここでいったんターミナルから離れ、上記で出力したURLをPCブラウザのアドレスバーへ貼り付け、googleの認証画面を出力します。
つづけてRcloneのリクエスト許可をします。

6. リクエスト許可

リクエスト許可画面

リクエスト許可画面

許可ボタンをクリックすると、認証コードが発行されます。

認証コードが発行されます

認証コードが発行されます

これをターミナルで待機しているプロンプトに入力しましょう。

7. 認証コード入力

	Enter verification code> 4/_F************************************CQ

8. エントリー作成と保存

認証コードを入力すると、エントリーが作成されます。

	--------------------
	[GoogleDrive]
	client_id =
	client_secret =
	token = {"access_token":"ya29.C************************************************************K6tng","token_type":"Bearer","refresh_token":"1/0qi7d******************************pTqPWfqM","expiry":"2016-06-22T14:22:30.758036854+09:00"}
	--------------------
	y) Yes this is OK
	e) Edit this remote
	d) Delete this remote
	y/e/d> 

上記の内容で問題なければ、yを入力してエントリー成完了!

	y/e/d> y

その後、作成したエントリーが表示され、最初のプロンプトに戻ります。

	Current remotes:

	Name                 Type
	====                 ====
	GoogleDrive          drive

	e) Edit existing remote
	n) New remote
	d) Delete remote
	s) Set configuration password
	q) Quit config
	e/n/d/s/q> 

Google Driveのエントリ作成は終了なので、”q”を抜けて設定を終了。

	e/n/d/s/q> q

9. 設定ファイル、エントリーの確認

コンフィグで作成・出力されたエントリーは、/home/user/.rclone.confが生成され、保存されます。

	$ ls -al .rclone.conf
	-rw------- 1 user user 290  6月 22 14:02 2016 .rclone.conf

– 中身は先ほどコンソールに出力された内容が反映されています。

	$ cat .rclone.conf
	[GoogleDrive]
	type = drive
	client_id =
	client_secret =
	token = {"access_token":"ya29.C************************************************************K6tng","token_type":"Bearer","refresh_token":"1/0qi7d******************************pTqPWfqM","expiry":"2016-06-22T14:22:30.758036854+09:00"}

3)動かしてみる

3-1. リストの取得

rcloneコマンドに実行オプションと引数を付けます。

– 書式

# rclone ls GoogleDrive: 

今回はGoogle Driveのエントリ名に”GoogleDrive”と設定したので、以下のような感じに。

# rclone ls GoogleDrive: 

– 実行してみる

	$ rclone ls GoogleDrive:
	  7748066 Archive.zip
	  3701814 file07.bmp
	   211194 file06.bmp
	  3701814 file05.bmp
	  3701814 file04.bmp
	  3701814 file03.bmp
	   130598 file02.bmp
	  3701814 file03.bmp
	  …以下略

3-2.同期してみる(Google Driveからの所定のファイルをダウンロード)

syncオプションを使い、GoogleDrive内のファイルを指定してダウンロードしてみます。

– 書式

	$ rclone sync <<Google Driveエントリ名>:<Google Drive側のアップロード先フォルダまたはファイル> <ローカルの転送先> 

– 実行例
今回はGoogle Drvie上の1ファイルをカレントディレクトリにダウンロードしてみます。
場所はホームディレクトリ直下に”tmp”ディレクトリを作成・移動してカレントディレクトリとし、ダウンロード先に指定。

	$ pwd
	/home/user/tmp
	$ rclone sync GoogleDrive:file03.bmp .
	2016/06/22 14:04:30 Google drive root '' limited to 1 objects: Building file list
	2016/06/22 14:04:30 Local file system at /home/user/tmp: Building file list
	2016/06/22 14:04:30 Local file system at /home/user/tmp: Waiting for checks to finish
	2016/06/22 14:04:30 Waiting for deletions to finish
	2016/06/22 14:04:30 Local file system at /home/user/tmp: Waiting for transfers to finish
	2016/06/22 14:04:31 Local file system at /home/user/tmp: Waiting for deletes to finish (during+after)
	2016/06/22 14:04:31
	Transferred:     206.244kBytes (135.379kByte/s)
	Errors:                 0
	Checks:                 0
	Transferred:            1
	Elapsed time:        1.5s
	[user@localhost tmp]$ ll
	合計 212
	-rw-rw-r-- 1 user user 211194  4月  7 19:15 2016 file03.bmp

単純なダウンロードになりましたが、本質的にはrsyncと同じなので、注意事項があります。

注意事項

ファイル同期はrsyncの”–delete”オプションがついた状態で実行される。

Rcloneはデフォルトの動きとして、rsyncの”–delete”オプションがついた状態で実行されます
ローカルで指定したファイルだけアップロードしたい場合などに、GoogleDrive側(つまりアップロード先)のホームを指定した場合、下手をするとGoogleDrive側のホームディレクトリ以下をまるっと消してしまう、という事故が起きる場合がありますw 
というか–delete”オプションを把握してなくて、最初の同期時に事故っちゃいました(汗
幸い4台のPCで同期していたことと、ファイルが消えたPC以外の3台はGoogleDriveの自動同期をOFFにしていたので、管理人の環境では事無きを得ましたが、1台だけだったりすると吐血しますorz
rclone実行前に、オプション”–dry-run”を付けると動作のトレースだけを実行するので、事前にトレースで動作を確認しましょう。

rsyncと同じような動作をする、ということを把握しておけば注意できると思います。
※”–delete”オプションを無効にするオプションがあるかどうか、はドキュメントを調べてからレポートをしようと思います。確実にうっかりミスの原因になってしまうので…

3-3.同期してみる(LinuxホストからGoogle Driveへ所定のファイルをアップロード)

以下は機能のレビューというより、コマンドの性質を踏まえた簡単なノウハウ的な内容になりますが

  • ローカル側で、Google Driveと同期するディレクトリを決めて作成(mkdir)する
  • 最初にGoogle Drive上のすべてのファイル/フォルダを同期をするときは、Google Driveからローカルへの同期を行う。
    逆をやっちゃうと、ローカルの空ディレクトリの状態をGoogle Driveへ反映することになるので、Google Drive側のファイルがすべて消えますwww

またローカル上のファイルやディレクトリを指定してアップロードだけしたい場合は、GoogleDrive側で同期対象のディレクトリを指定すれば、それぞれの対象ディレクトリ以下のファイルを同期する動きとなるので、

  • ローカルの一部のファイル/フォルダだけアップロード・同期したい
  • Google Deive側のファイルはダウンロードしない

といった目的には有効な方法と思われます。
これだと、ファイル/フォルダ全削除の惨劇は回避できますw

上記を踏まえて、ローカルの指定したファイルだけをアップロードしてみます。
今回はテストなので、Google Drive側のフォルダは新しく空フォルダを作って試しました(ファイルがあるフォルダだと、また事故が起きちゃうので…)

– 書式

	$ rclone sync <ローカルから転送したいファイル> <<Google Driveエントリ名>:<Google Drive側のアップロード先フォルダ>

– 実行例
サーバー内のテキストファイル”foobar.txt”をGoogle Drive内の空フォルダ”example_dir”を指定してアップロード。

	$ rclone sync foobar.txt GoogleDrive:example_dir
	2016/06/22 14:54:44 Local file system at /home/user limited to 1 objects: Building file list
	2016/06/22 14:54:44 Google drive root 'example_dir': Building file list
	2016/06/22 14:54:49 Google drive root 'example_dir': Waiting for checks to finish
	2016/06/22 14:54:49 Waiting for deletions to finish
	2016/06/22 14:54:49 Google drive root 'example_dir': Waiting for transfers to finish
	2016/06/22 14:54:52 Google drive root 'example_dir': Waiting for deletes to finish (during+after)
	2016/06/22 14:54:52
	Transferred:          581Bytes (69Byte/s)
	Errors:                 0
	Checks:                 0
	Transferred:            1
	Elapsed time:        8.4s

→指定したフォルダ以外のファイル・フォルダは影響出ません。ふー安心(汗

4)注意事項・制限事項

1.rootでのエントリ作成について

rootアカウントでエントリを作成して試したところ、1回同期を実行した後で.rclone.confが消えました。
特にメッセージも出なかったので仕様と思われますが、このブログを書いた時点では、まだ公式ドキュメントではこの仕様の有無は確認できていません。
この動作は確実にセキュリティや事故防止のためと思われるので、トラブル防止の意味もかねて一般ユーザーでエントリを作成して利用しましょう。

2.転送制限

公式ドキュメントに記載されている制限事項として、Google Driveとのファイル送受信にて、rcloneでは1秒あたり約2つのファイルだけの転送に制限されているとのこと。
ファイル1個あたりは100MBytes/sで転送できるが、たくさんの小さいファイルは転送に長時間かかってしまいます。
つまり多数のファイルを転送したい場合は、あらかじめアーカイブ・圧縮してから転送するのが効率的といえますね。

といったところで、今後時間ができたら細かいオプションについても調べてみようかと。
以上でした~
 

 - cloud, GNU/Linux , ,