Erreur d’entrée / sortie gcsfuse

J’obtiens une erreur d’entrée / sortie lorsque j’essaie de créer un répertoire ou un fichier dans un compartiment de stockage Google Cloud monté sur un répertoire Linux (Ubuntu 15.10).

Étapes que j’ai faites:

  • Création d’un utilisateur nommé transfer
  • Création d’un répertoire /mnt/backups et chown -R transfer /mnt/backups
  • En tant que transfert d’utilisateur, a exécuté gcsfuse --implicit-dir backup01-bucket /mnt/backups . Le système de fichiers se monte avec succès
  • Exécutez le mkdir test et obtenez l’erreur mkdir: cannot create directory test: Input/output error

Y a-t-il quelque chose qui m’a manqué? Ce que j’essaie de faire, c’est de pouvoir transférer des fichiers sur le serveur et de les stocker dans le compartiment Google storing plutôt que dans le stockage local.

Mise à jour J’ai modifié la commande pour obtenir des informations de débogage:

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

Puis exécuté mkdir /mnt/backups/test tant qu’utilisateur de transfer .

Les informations suivantes sur les punaises de lit sont apparues:

 fuse_debug: Op 0x00000060 connection.go:395]  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") (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/") (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() (54.901164ms): OK 2016/04/04 06:51:08.433405 Garbage collection succeeded after deleted 0 objects in 55.248203ms. 

Remarque: Si je crée un répertoire dans la console Web, je peux voir le répertoire correctement.

Il apparaît des erreurs de Insufficient Permission dans votre sortie de débogage que gcsfuse ne dispose pas des permissions suffisantes sur votre compartiment. Il y a probablement un access en lecture seule.

Assurez-vous de lire la documentation relative aux informations d’identification pour gcsfuse. En particulier, si vous utilisez un compte de service sur une machine virtuelle GCE, assurez-vous de configurer la machine virtuelle avec la scope d’access au storage-full .

Votre problème provient d’permissions insuffisantes, mais vous n’avez pas besoin de détruire et de recréer la VM avec une scope différente pour résoudre ce problème. Voici une autre approche plus adaptée aux systèmes de production:

  1. Créer un compte de service
  2. Créez une clé pour le compte de service et téléchargez le fichier JSON
  3. Accorder un rôle approprié au compte de service
  4. Accordez les permissions appropriées au compte de service sur le compartiment
  5. Télécharger les informations d’identification JSON pour le compte de service sur la machine virtuelle

Enfin, définissez une variable d’environnement contenant le chemin d’access aux informations d’identification du compte de service lorsque vous appelez gcsfuse à partir de la ligne de commande:

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

Utilisez l’option key_file pour accomplir la même chose dans fstab . Ces deux options sont documentées dans la documentation relative aux informations d’identification gcsfuse . (EDIT: cette option est documentée, mais ne fonctionnera pas pour moi.)

Fait intéressant, vous devez utiliser la variable d’environnement ou l’option key_file même si vous avez configuré le compte de service sur la machine virtuelle en utilisant:

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

Pour une raison quelconque, gcsfuse ignore le compte accrédité actif.

L’utilisation de l’étendue de storage-full lors de la création d’une machine virtuelle a des implications sur la sécurité et la stabilité, car elle permet à cette machine virtuelle d’accéder à tous les compartiments appartenant au même projet. Votre serveur de stockage de fichiers devrait-il réellement pouvoir écraser les journaux dans un compartiment de journalisation ou lire les sauvegardes de la firebase database dans un autre compartiment?