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:
/mnt/backups
et chown -R transfer /mnt/backups
gcsfuse --implicit-dir backup01-bucket /mnt/backups
. Le système de fichiers se monte avec succès 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:
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?