:::

想用無限空間沒那麼容易!Google Drive與伺服器整合失敗記錄 / Solution to Integrate Google Drive with Services: not reliable

image

最近花了一段時間在研究怎麽把Google Drive (Google雲端硬碟)ZoteroProxmox伺服器整合。整合之後可以運作,但是可能是因為檔案處理速度過慢或是Google Drive API配額的限制,最後都無法順利運作。這篇記錄一下到目前為止的研究進度。


無限空間的教育版Google雲端硬碟 / Google Drive for Education's Unlimited Storage

google-drive

Google有許多免費的線上應用程式,Google Drive也是其中一項。在免費的帳戶底下,Google Drive跟其他的應用程式共享了15GB的儲存空間。但除了免費帳戶之外,Google Drive還有另一種版本,可以讓我們使用無限空間:Google雲端硬碟教育版。

Google Apps Logo New

Google為了將他的眾多應用程式推廣到教育市場,他將許多原本為免費的應用程式整合成一套Google Apps for Education (已經改名做G Suite for Education),並加上許多額外的功能之後,推廣到各大學校使用。沒錯,如果你還有印象的話,這就是去年記者在吵的「柯文哲害 35 萬學童個資外洩?」中所講的Google Apps for Education。

Google Drive也被包含在Google Apps for Education當中,而這種Google Drive教育版跟免費版Google Drive最大的不同就是:儲存空間沒有上限。沒錯,暨沒有整體檔案儲存容量的上限,也沒有單一檔案大小的限制,而且Google Drive傳送檔案的速度明顯比其他雲端硬碟更快且穩定,非常好用!

誰能夠使用Google Drive教育版呢?這就要看你所在的單位了。大部分大專院校都有訂購Google Apps for Education,電算中心會是以備援信箱的名義提供服務,而且是要請學生手動去啟用這個備援信箱。

image

以政治大學為例,申請手續需參考政治大學電算中心的備援信箱公告,使用者必須先登入iNCCU,然後在個人設定中的進階設定來啟用Google備援信箱。啟用之後我們會獲得一個前面原本學校信箱帳號相同、但是後面是@mail2.nccu.tw的教育版電子信箱帳號,例如xxxxxxxxx@mail2.nccu.tw (注意,沒有.edu,我每次都會打錯orz)。

這個帳號跟我們一般使用免費Google服務的帳號是不一樣的獨立帳號。如果要使用Google Drive教育版,則需要登出原本使用免費版的帳號,再以上述啟用的教育版電子信箱帳號登入Google Drive,這樣就能夠開始使用Google Drive教育版了。

image

Google Drive教育版的介面跟與原本的Google Drive差不多,但是多了學校自訂的政大Logo。而且更重要的是,使用空間的確是無上限的。從上圖中可以看到我的Google Drive教育版已經使用了98GB,早就超過免費版Google Drive的15GB上限了。

不過先旨聲明,我主要用這個Google Drive教育版上傳研究用的相關資料,包括論文、研究數據、伺服器會用到的光碟映像檔、還有龐大的虛擬機器相關檔案,像是OpenVZ虛擬應用範本。我並沒有在這個雲端空間上傳漫畫、影片或遊戲等娛樂用檔案喔。而且學校似乎其實可以觀看Google Drive教育版的檔案用量,上傳到這個空間的資料就沒啥隱私了,請各位同學自重一點啊。

Google Drive跟其他應用的整合 / How to integrate Google Drive with Other Service?

講了老半天,終於要進入本篇要討論的主題:如何有效應用無限空間的Google Drive呢?

原始的Google Drive只能透過網頁、桌面端的同步工具、智慧型手機的APP等三種標準途徑來存取。這些手動存取的功能對一般使用來說足矣,但我會更希望在一些需要佔用大量空間的服務上有效使用這個無限空間。我目前有兩個主要的目標:一個是個人的Zotero檔案備份、另一個是Proxmox VE的虛擬機器備份空間。這兩種目標都提供了一些自動同步、備份的功能,但這些都無法對應上述手動備份,需要個別搭配其他方案,才能使用Google Drive。


Zotero的整合方案 / Solution for Zotero

image

以Zotero來說,Zotero的同步功能需要的是WebDAV協定。詳細設定請看我之前寫的「Zotero的書目與附加檔案同步功能」這篇。

剛好ownCloud有提供WebDAV協定,而且ownCloud可以利用External Storage整合其他的雲端硬碟,其中包括了Google Drive。因此我就先來進行這個整合方案:Zotero <-> ownCloud <-> Google Drive。

Zotero <-> ownCloud <-> Google Drive

我以OpenVZ虛擬機器架設ownCloud伺服器。虛擬機器的記憶體為1024MB,硬碟空間為8GB。架設的範本是用ubuntu-14.04-x86_64.tar.gz,範本來自於「OpenVZ Precreated templates」。ownCloud community安裝方法參考這篇「安裝套件 isv:ownCloud:community / owncloud」,Ubuntu 14.04的安裝手續如下:

wget http://download.opensuse.org/repositories/isv:ownCloud:community/xUbuntu_14.04/Release.key
sudo apt-key add - < Release.key
sudo sh -c "echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/community/xUbuntu_14.04/ /' > /etc/apt/sources.list.d/owncloud.list"
sudo apt-get update
sudo apt-get install owncloud -y

經過漫長的安裝過程後,我們就可以透過以下網址來開啟ownCloud的網頁:

image

接著要先到ownCloud的「應用程式」功能中啟用External storage support。然後就能在「管理」的「外部儲存」中設定Google Drive的整合。

image

要在ownCloud中使用Google Drive的話,必須從Google APIs當中申請Client ID (使用者ID)Client secret (通關密語)。這個步驟非常複雜,因為Google APIs會因為你使用API的方式不同,而有不同的申請方式,並不是隨便找到一組Client ID跟Client secret就可用。在ownCloud 8.2 Server Administration Manual - Google Drive這篇裡面有詳細的圖文教學,請務必遵照說明的步驟來申請。

唯需注意的是,設定時必須將說明中的「https://example.com/」替換成你所架設的ownCloud實際網址,而且不能用區域網路IP,不然認證會失敗。我們可以藉由修改hosts檔案來模擬一個Domain Name,這樣就不需要再到DNS中設定了。

image

在ownCloud連結Google Drive之後,我就可在Zotero中設定WebDAV同步到ownCloud,就可以達到「Zotero <-> ownCloud <-> Google Drive」的完美檔案同步效果。

方案的失敗 / Solution Failed

然而,事情並沒有想象的這麼簡單。我的Zotero檔案大概有8GB之多,但更大的問題是,需要同步的檔案數量約有8千個左右。用上述的方式同步在一開始都還算順利,但是同步了約500個檔案之後,Zotero同步進度就會停住,然後發生錯誤。接下來再手動同步,也只能同步十個檔案左右,然後又會發生錯誤。

image

造成這個原因的可能之一在於Google APIs的配額。Google APIs雖然可以免費使用,但只有一定的額度。Google Drive API配額的限制如下:

  • 每日的查詢限制:1,000,000,000
  • 每個使用者每100秒的查詢限制:1,000
  • 每100秒的查詢限制:10,000

不過從上圖來看,我離每日查詢限制還有很大的一段差距,那麼可能的問題是使用者查詢限制嗎?

檢查ownCloud的記錄檔 / Review Log in ownCloud

image

另一個可能是虛擬機器的負荷達到了上限。根據Proxmox VE的效能報表,在Zotero同步時會佔用虛擬機器幾乎所有的記憶體。儘管如此,網頁版的ownCloud仍然能夠正常連線,而虛擬機器也還是能用SSH控制,看起來虛擬機器並沒有完全因為Zotero的同步而當機。

image

根據ownCloud的記錄檔報告,跟WebDAV相關的錯誤原因包括了:

  1. HTTP/1.1 500 Could not rename part file to final file
  2. Google_Service_Exception… User Rate Limit Exceeded
  3. Could not resolve host: www.googleapis.com
  4. Could not resolve host: accounts.google.com   

第一個是ownCloud程式端的錯誤,無法簡單處理。

第二個就是前面說的配額上限。

第三個跟第四個錯誤是DNS設定的問題,我姑且先在/etc/hosts裡面加入以下設定看看:

172.217.24.10 www.googleapis.com
216.58.200.237 accounts.google.com
下一個解決方案:限速 / Next: Limit Request

我認為最大的原因還是在於達到配額上限的問題。為了避免太過容易達到每位使用者在100秒內只能進行1000筆查詢的限制,我們需要的是為伺服器限速。這個限速又分成兩個找尋方向:

  1. 找尋ownCloud的限速設定:似乎是沒有這種設定
  2. 找尋Apache的限速設定:應該就是這個了。

Apache裡面有一個prefork MPM模組,可以限制Apache伺服器的ServerLimit 和 MaxClients。詳細請看「提升 Apache (prefork) 負載量:修改設定與效能限制 (performance tuning) 」這篇的說明。

總之我找到設定檔/etc/apache2/mods-enabled/mpm_prefork.conf之後調整成以下的設定:

<IfModule mpm_prefork_module>
StartServers       1
MinSpareServers    1
MaxSpareServers    5
        MaxRequestWorkers         150
        MaxConnectionsPerChild   0

ServerLimit 10
MaxClients 10
</IfModule>

image

現在繼續放著看看同步看看,但一點進度都沒有啊……


Proxmox VE的整合方案 / Solution for Proxmox VE

image

另一個目標是整合虛擬機器管理環境Proxmox VE的備份功能。Proxmox VE能夠掛載NFS的共享空間,而我們雖然可以在Linux伺服器上架設NFS伺服器,但要怎麼讓Linux跟Google Drive整合呢?這就要用FUSE filesystem over Google Drive: google-drive-ocamlfuse這個套件了。google-drive-ocamlfuse可以幫我們在Linux的作業系統上面掛載Google Drive,然後我們就可以把掛載的資料夾以NFS伺服器分享給Promox VE使用。總結來說這個方案的做法就是:Proxmox VE <-> NFS Server <-> google-drive-ocamlfuse <-> Google Drive。

Proxmox VE <-> NFS Server <-> google-drive-ocamlfuse <-> Google Drive

要進行這個方案,我們要從後面到前面來架設。

google-drive-ocamlfuse的安裝分成兩個階段:安裝google-drive-ocamlfuse,以及Google APIs授權。google-drive-ocamlfuse的安裝很複雜,雖然google-drive-ocamlfuse的Wiki「Installation」這篇有介紹步驟,但是並不是很完整。說明的步驟大概是:

  1. 安裝python-software-properties
    sudo apt-get install python-software-properties –y
  2. 新增PPA儲存庫
    sudo add-apt-repository ppa:alessandro-strada/ppa
  3. 更新apt-get
    sudo apt-get update
  4. 安裝google-drive-ocamlfuse
    apt-get install google-drive-ocamlfuse

但我記得其他安裝教學上的步驟複雜很多。在OpenVZ架設的時候,還需要啟用fuse的功能:

vzctl set CONTAINERID --devnodes fuse:rw --save

總之這一步可能會遭遇很多問題,難以一言道盡啊。

授權 / Google APIs Authorization

接著是要進行Google APIs的授權。授權的方法分成兩種:

  1. Linux有圖形化介面:如果是以KVM虛擬機器安裝的話,我們就可以用圖形化介面中的瀏覽器進行授權。教學請看這篇:「Authorization
  2. Linux沒有圖形化介面:如果是用OpenVZ虛擬機器安裝的話,因為沒有圖形化介面的瀏覽器,所以Google APIs的授權就必須以指令的方式進行,步驟變得複雜許多。

在第二種做法下,我們必須以指令來進行Google APIs的授權動作。「Headless Usage & Authorization」有寫了大致上的做法,但我還是摸索了好一陣子才真正找到解法。

image

這裡的指令依然需要Google APIs的Client ID跟Client Secret,但申請憑證的方式跟前面在ownCloud中所使用的「網路應用程式」並不相同,在這邊要選擇「其他」。接著再按照教學來授權,其他就沒有特別需要注意的地方了。

授權完成之後,我們就可以用以下語法簡單掛載Google Drive:

google-drive-ocamlfuse /var/nfs/google-drive
NFS伺服器 / Export in NFS Server

當Google Drive被掛載到Linux中,成為Linux的一個資料夾之後,接下來我們就要來把它變成NFS伺服器的資料夾,分享給Promxox VE使用。

How To Set Up an NFS Mount on Ubuntu 14.04介紹了架設NFS私服器的流程,並不是很困難。唯獨需要注意的是,在分享已經掛載Google Drive的資料夾的時候會遭遇到類似以下的錯誤訊息:

exportfs: Warning: /dev/shm requires fsid= for NFS export

因此在/etc/exports裡面的設定應該要加上fsid=1:

/dev/shm 10.0.0.1/24(rw,fsid=1,async,no_subtree_check)

此外,如果是用OpenVZ架設,那更加麻煩。OpenVZ還需要啟用NFS的設定:

vzctl set $CTID --feature nfsd:on --save

其他還有很多步驟要處理,詳細請看這篇「NFS server inside container」。不過我最後並沒有順利用OpenVZ架設成功,就改用KVM來架設了。

方案失敗 / Solution Failed

image

只要架設好NFS伺服器之後,就能夠給Proxmox VE掛載,請看「在Proxmox VE中加入NFS資料儲存伺服器」這篇的教學。然後接著我們就用Proxmox VE備份虛擬機器到Google Drive看看吧,Google Drive空間居然有10TB,好開心啊。

image

可惜的是,最後結果依然不盡人意,失敗了。在一開始的時候,Proxmox VE可以傳送檔案虛擬機器的檔案到Google Drive。所以我們可以從網頁介面上看到Google Drive裡面有虛擬機器的原始備份檔,這個倒是沒什麼問題。但是問題在於之後Proxmox VE會在這個空間上進行壓縮的動作。壓縮需要不斷地取得Google Drive上的原始資料,然後把壓縮檔案寫入Google Drive中。這個壓縮動作來回進行的結果,立刻就達到Google APIs的上限,造成NFS伺服器當機,接著連帶就讓Proxmox VE當機了。這個情況就跟「修復Proxmox VE:節點全部離線」這篇的問題是一樣的。

下一步的解決方案:排程轉移 / Next: Move Backup

這個問題並不是像前面Zotero可以靠限速來解決,最大的問題還是在於Proxmox VE會在掛載的空間上進行壓縮的這個動作,太容易達到Google APIs的配額了。這下子可怎麼辦好呢?

一個簡單的想法是:

  1. NFS伺服器上建立一個暫存資料夾
  2. 讓Proxmox VE備份到NFS伺服器上的暫存資料夾
  3. NFS伺服器每天執行腳本,把暫存資料夾的檔案移動到Google Drive。只是這個移動檔案的條件必須是「檔案變更時間是在一天之前」,以避免移動到Proxmox VE備份到一半的檔案。

要如何搜尋變更時間是一天之前的檔案呢?這可以使用Linux強大的find指令來進行,範例如下:

find . -mtime +1

find的使用詳細請看「Unix/Linux 的 find 指令使用教學、技巧與範例整理」這篇。

不過要寫這個腳本那又是另外一種麻煩的工作了,今天就先到這邊吧。


小結 / In closing

有人可能會問我說,為什麼不要用同步就好了呢?例如把Proxmox VE的檔案備份到某一台伺服器上,然後再用同步功能把伺服器上的資料夾與Google Drive同步,這樣不就好了嗎?現在這麼多NAS都有提供Google Drive整合同步功能了,買那種NAS不就好了嗎?

然而,這種做法的問題在於這樣沒辦法使用到Google Drive教育版的無限空間。同步的意思是,我的伺服器也必須具備跟Google Drive相同的空間大小,而且也要跟Google Drive一樣穩定。雖然現在並不是沒辦法弄買到一臺10TB的NAS,但是我就是不希望自己還要花時間維護NAS的正常運作。

1450280810-1012348669

圖片來自於:[技術] 如何用Synology NAS 的DSM6.0新功能來進行雲端備份

也是有像是Synology的DSM這樣的NAS,可以不僅可以上傳本地端的檔案,還能夠設定「當檔案從來源資料夾刪除時,不刪除目標資料夾的檔案」這樣的功能,就能夠達到類似我上面講到Proxmox VE解法的效果。

不過不管怎麼說,最理想的做法是準備一臺虛擬機器作為連結Google Drive的中介橋樑。虛擬機器容易架設、容易替換。就算虛擬機器掛點了,我也能夠很快地架設一模一樣的虛擬機器。而這臺虛擬機器連線的Google Drive檔案仍然可以正常存取,不會因為虛擬機器毀損而受到任何影響。

不過,理想歸理想,掛載Google Drive作為網路硬碟的做法看起來的確還是有很多限制。這次的研究就先到此為止吧。

總共6 則留言, (我要發問)

  1. ............................................................

    回覆刪除
  2. 想請問~~
    iNCCU及計算機中心寫到Google信箱皆為7GB, 但您還是有無限的容量嗎??

    回覆刪除
    回覆
    1. To Shih Ching Huang,

      https://lh3.googleusercontent.com/-Z2rPsuBZh5c/WT_7elBh4RI/AAAAAAADL4E/-UebIQpCqskvhkU4MIXruSB10SUO4N5MgCHM/s0/2017-06-13_22-48-25.png
      「你的 Mail2.Nccu.tw 帳戶擁有無限量的儲存空間!」

      我沒有作什麼特別的設定
      可能學校沒意識到自己買的是無限空間吧?真是賺到了呢!

      刪除
    2. G Suite for Education是完全免費的,只要是教育單位都可以跟Google申請,
      這個免費服務大約是10年前就開始了,當時是給7GB沒錯,後來慢慢增加到15GB,
      最後再給到無限空間,NCCU的公告大概從當時就沒改過XD。

      刪除
    3. 我想應該也是如此,不過這是小事,別擔心。學校還是花多點心力在大事上,這樣比較好啦!

      刪除

留言工具: