Google Drive のデータをクラウドサービス経由で別のアカウントに移す

2020/02/22 17:20:182020/05/30 13:43:24

GSuite アカウントであればデータのエクスポートが容易ですが、普通の Google Drive 課金アカウントから別のアカウントに移す場合、手元に空き容量がないと困ってしまいます。
今回は手元のMBPに10GB程度しか空き容量がないのに300GBぐらいのデータを別の Google アカウントに移したくなった時に行った手筈を紹介します。

使うもの
  • Skicka
  • google 名前空間にあるものの非公式プロジェクトらしい Go 製 Google Drive CLI アプリ
  • GCP/GCE
  • ファイルのダウンロード・アップロード
  • 好みで CentOS8 を使います
  • 別に AWS の Lightsail とかでもいいんですが単純に Google のサービスのデータ移行だし Google API に対してはカウントフリーだし…という話です
  • Lightsail はたしか月 1TB とか通信無料なので普通の移行なら追加ディスクぶっさして余裕かも
  • 各 Credit とかが見えないしあんまり書くと普通に引っかかるのかなあという気もしてきた
  • Google Colab Notebook(オプション)
  • 重複ファイルのリネーム・スラッシュが入ったファイルの調査に使います

手順

やりたい場合やる前に絶対最後まで一読してくださいね

重複ファイルはどちらも残って欲しい時のみの手順
  • いったん手元に Skicka を導入します
  • インスタンス立ててからやってもいいです
  • 落としたいディレクトリの donwload オペレーションを /tmp 相手にでもやります
  • 重複ファイル・スラッシュが入ったディレクトリが表示されるので、即終了します
  • <重複ファイルがあった場合> Colab Notebook に新しいノートを作って、移行元 Google アカウントで Drive をマウントします
rename.ipynb
import pathlib 
 
d = """重複したディレクトリのリストのテキスト""" 
 
for line in d.split("\n"): 
    if line.startswith("skicka:") and "mkdir" not in line: 
        prefix, path, msg = line.split(": ") 
        if "skipping download of duplicate file on Drive" in msg: 
            p = pathlib.Path(f"/content/gdrive/My Drive/{path}") 
            if p.exists(): 
                print(f"リネームします: {path}") 
                p.rename(p.with_name(f"{p.stem}_{p.suffix}")) 
            else: 
                print(f"なかったです: {path}")
  • 中身を理解してから実行してください

セットアップ
GCE で
  • us-central
  • g2-small (メモリ1.7GB、おまかせ)
  • ブートディスク
  • SSD
  • 10GB
  • CentOS
  • 追加ディスク
  • HDD
  • 移したいデータが入るぐらいの容量
のインスタンスを作ってください
  • us-central なのは今回の用途では日本からの速度が重要ではないからです
  • Google APIに問題なくつながればいいので
  • 追加ディスクがHDDなのはSSDにしても Google Drive から落ちてくる速度がそんなでないのであんま意味ないからです
  • SSDの価格はHDDの4倍です
インスタンス
  • インスタンスに接続
bash.sh
$ sudo yum install -y wget tmux 
# https://golang.org/dl/ から最新のバージョンを探してくる 
$ wget https://dl.google.com/go/go1.13.8.linux-amd64.tar.gz 
$ sudo tar -C /usr/local -xzf go[tab] 
$ vim .bash_profile
.bash_profile
export PATH=$PATH:$HOME/bin:/usr/local/go/bin 
export GOPATH=$HOME/go 
export PATH=$PATH:$GOPATH/bin
bash.sh
# いったん落ちてもいいし source で反映させてもいいです 
$ go get github.com/google/skicka 
$ skicka init 
# 書いた時点では skicka の CSCK が無効化されてるので 
# https://console.cloud.google.com/apis/credentials で作ってきてください 
$ vim .skicka.config
.skicka.config
[google] 
	clientid=取ってきたclientid 
	clientsecret=取ってきた
bash.sh
$ skicka -no-browser-auth ls
  • ディスクのマウント
mount.sh
$ sudo lsblk 
# 一番下に出てくる sdb みたいなのが追加でマウントしたディスク 
$ sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb # 最初だけ 
$ sudo mkdir -p /mnt/disks/sdb # 最初だけ 
$ sudo mount -o discard,defaults /dev/sdb /mnt/disks/sdb 
$ sudo chmod a+w /mnt/disks/sdb
  • tmux に入ります
in tmux.sh
$ cd /mnt/disks/sdb 
$ mkdir -p ... # ダウンロードしたいディレクトリ相対構造(自由) 
$ skicka download [落としたいGoogleDrive上ディレクトリパス] [上のmkdirで作ったdir]
  • 適当に d でデタッチしても作業進んでるので終わるまで放置します

今筆者が終わるまで放置してるので終わったら残り追記します
110GBのダウンロード
2020/02/23 06:02:06 Preparation time 8s, sync time 12h 56m 51s 
2020/02/23 06:02:06 Updated 0 Drive files, 203911 local files 
2020/02/23 06:02:06 0 B read from disk, 109.83 GiB written to disk 
2020/02/23 06:02:06 0 B uploaded (0 B/s), 109.83 GiB downloaded (2.41 MiB/s) 
2020/02/23 06:02:06 864.95 MiB peak memory used
ファイル数がバカ多いのもあるかもですが、約13時間かかった
60GBのダウンロード
2020/02/23 22:30:24 Preparation time 10s, sync time 8h 6m 32s 
2020/02/23 22:30:24 Updated 0 Drive files, 134292 local files 
2020/02/23 22:30:24 0 B read from disk, 59.42 GiB written to disk 
2020/02/23 22:30:24 0 B uploaded (0 B/s), 59.42 GiB downloaded (2.08 MiB/s) 
2020/02/23 22:30:24 801.88 MiB peak memory used
skicka でアカウントを切り替える
  • -metadata-cache-file
  • メタデータのキャッシュファイル
  • デフォルト: ~/.skicka.metadata.cache
  • -tokencache
  • トークンのキャッシュファイル
  • デフォルト: ~/.skicka.token.cache
これらを明示的に別ファイル指定して -no-browser-auth ls とでもすると別のアカウントでのセッションになる
  • config ファイルにこの設定を固定できれば -config だけで済むが…できない?

アップロード
アップロードしていきます
upload.sh
$ skicka skicka -metadata-cache-file ~/.skicka.metadata2.cache -tokencache ~/.skicka.token2.cache  upload /mnt/disks/sdb/content /content
ディレクトリを作成してからファイルのアップロードに入るみたいなんですが、ディレクトリ23295個の作成に5時間かかると言われました。今日は放置して寝ます

upload
Directories:  23295 / 23295 [===================================================================] 100.00% 4h49m58s 
Files:  66.85 GiB / 180.29 GiB [=======================>---------------------------------------]  37.08% 18h50m45s
upload
Files:  29.17 GiB / 102.38 GiB [=================>-------------------------------------------]  28.50% 1d10h27m23s
めちゃ・時間かかるんだけど…
upload
Files:  73.19 GiB / 73.19 GiB [===================================================================] 100.00% 69h0m47s 
2020/02/28 10:09:46 Preparation time 2m 57s, sync time 69h 1m 52s 
2020/02/28 10:09:46 Updated 250029 Drive files, 0 local files 
2020/02/28 10:09:46 73.19 GiB read from disk, 0 B written to disk 
2020/02/28 10:09:46 73.19 GiB uploaded (308.80 kiB/s), 0 B downloaded (0 B/s) 
2020/02/28 10:09:46 349.87 MiB peak memory used
手法に問題なさそうなので記事公開して終わりにします、現時点で5日かかってるのでだいたい500円ぐらいかかっています。
当たり前なのですが、小さいファイルがたくさんあるより大きいファイルが少しの方がスループットが出るので当然早いです。
あとダウンロードよりアップロードの方が体感2倍程度時間がかかります。


著者の画像

ci7lus

@ci7lus

Caramelize - Made withCaramelizeand / Privacy