2016-04-03 179 views
4

當我嘗試在安裝在Linux(Ubuntu 15.10)目錄中的谷歌雲存儲桶中創建目錄或文件時,出現輸入/輸出錯誤。gcsfuse輸入/輸出錯誤

步驟我都做:

  • 創建了一個名爲轉移
  • 用戶創建一個/mnt/backups目錄並運行chown -R transfer /mnt/backups
  • 當用戶轉移,跑到gcsfuse --implicit-dir backup01-bucket /mnt/backups。文件系統掛載成功
  • 運行mkdir test並且得到錯誤mkdir: cannot create directory test: Input/output error

有什麼我錯過了什麼?我想要做的是能夠將ftp文件發送到服務器,並將它們存儲在谷歌存儲分區中,而不是本地存儲。

更新 我修改了命令,以獲得一些調試信息:

gcsfuse --implicit-dirs --foreground --debug_gcs --debug_fuse backup01-bucket /mnt/backups 

然後跑mkdir /mnt/backups/testtransfer用戶。

以下bedug信息就出來了:

fuse_debug: Op 0x00000060  connection.go:395] <- GetInodeAttributes (inode 1) 
fuse_debug: Op 0x00000060  connection.go:474] -> OK 
fuse_debug: Op 0x00000061  connection.go:395] <- LookUpInode (parent 1, name "test") 
gcs: Req    0x3a: <- StatObject("test/") 
gcs: Req    0x3b: <- ListObjects() 
gcs: Req    0x3c: <- StatObject("test") 
gcs: Req    0x3c: -> StatObject("test") (53.375107ms): gcs.NotFoundError: googleapi: Error 404: Not Found, notFound 
gcs: Req    0x3b: -> ListObjects() (59.061271ms): OK 
gcs: Req    0x3a: -> StatObject("test/") (71.666112ms): gcs.NotFoundError: googleapi: Error 404: Not Found, notFound 
fuse_debug: Op 0x00000061  connection.go:476] -> Error: "no such file or directory" 
fuse_debug: Op 0x00000062  connection.go:395] <- MkDir 
gcs: Req    0x3d: <- CreateObject("test/") 
gcs: Req    0x3d: -> CreateObject("test/") (22.090155ms): googleapi: Error 403: Insufficient Permission, insufficientPermissions 
fuse_debug: Op 0x00000062  connection.go:476] -> Error: "CreateChildDir: googleapi: Error 403: Insufficient Permission, insufficientPermissions" 
fuse: 2016/04/04 06:51:02.922866 *fuseops.MkDirOp error: CreateChildDir: googleapi: Error 403: Insufficient Permission, insufficientPermissions 
2016/04/04 06:51:08.378100 Starting a garbage collection run. 
gcs: Req    0x3e: <- ListObjects() 
gcs: Req    0x3e: -> ListObjects() (54.901164ms): OK 
2016/04/04 06:51:08.433405 Garbage collection succeeded after deleted 0 objects in 55.248203ms. 

注:如果我創建的Web控制檯的目錄,我可以看到目錄罰款。

+0

你能用'--foreground'運行gcsfuse並用日誌輸出修改你的問題嗎?如果沒有用處,請嘗試'--debug_gcs'和/或'--debug_fuse'。 – jacobsa

+0

我用調試信息更新了這個問題。謝謝。 – user1476207

回答

4

從調試輸出中的Insufficient Permission錯誤中可以看出gcsfuse沒有足夠的權限訪問您的存儲桶。可能它具有隻讀訪問權限。

請務必閱讀gcsfuse的credentials文檔。特別是,如果您在GCE VM上使用服務帳戶,請確保使用storage-full訪問範圍設置虛擬機。

+0

謝謝!不幸的是,我不得不重新創建虛擬機來啓用API。無法找到將存儲更改爲在現有VM上進行讀寫的方法。 – user1476207

+0

是的,據我所知,這是不可能改變的。 – jacobsa

+0

好消息,截至2016年12月17日,可以更改*停止*虛擬機的權限。請參閱https://googlecloudplatform.uservoice.com/forums/302595-compute-engine/suggestions/13101552-ability-to-change-cloud-api-access-scopes-on-launc。您還可以更改每個API的權限,例如繼續拒絕對BigQuery的訪問,但對於存儲是完全的。 – Spotlight

9

您的問題確實源於權限不足,但是您的操作不是而是需要銷燬並重新創建具有不同範圍的VM來解決此問題。這是另一種方法更適合於生產系統:

  1. 創建服務帳戶
  2. 創建的服務帳戶的關鍵,並下載JSON文件
  3. 授予適當的角色服務帳戶
  4. 授予對鬥
  5. 適當的權限的服務帳戶上傳服務帳戶的JSON憑據VM

最後,定義調用命令行gcsfuse當包含的服務帳戶憑據路徑的環境變量:

GOOGLE_APPLICATION_CREDENTIALS=/root/credentials/service_credential_file.json gcsfuse bucket_name /my/mount/point 

使用key_file選項來完成在fstab同樣的事情。這兩個選項均記錄在gcsfuse credentials documentation中。 (編輯:這個選項被記錄在案,但不會爲我工作)

有趣的是,你需要使用環境變量或key_file選項,即使你已經配置使用虛擬機上的服務帳戶:

gcloud auth activate-service-account --key-file /root/credentials/service_credential_file.json 

由於某些原因,gcsfuse會忽略活動的憑證帳戶。

在創建虛擬機時使用storage-full範圍存在安全性和穩定性,因爲它允許該虛擬機完全訪問屬於同一項目的每個存儲桶。您的文件存儲服務器是否應該能夠覆蓋日誌存儲桶中的日誌,或者讀取另一個存儲桶中的數據庫備份?