AndersonArruda

Artigos de tecnologia ao alcance de um clique!


Como Montar Buckets do Google Cloud Storage no Linux com GCSFuse
gcsfuse google cloud storage gcs linux mount bucket fuse systemd gcp cloud storage tutorial gcsfuse permission denied gcsfuse

Como Montar Buckets do Google Cloud Storage no Linux com GCSFuse

16/10/2025 17:17

Se você trabalha com Google Cloud Platform e precisa acessar seus buckets de forma simples e transparente no Linux, o GCSFuse é a solução perfeita. Neste artigo, vou te mostrar como configurar, otimizar e resolver os problemas mais comuns ao montar buckets GCS como se fossem discos locais.


Nota: Nos exemplos deste artigo, vou usar my-bucket como nome genérico do bucket. Substitua pelo nome do seu bucket real em todos os comandos.

Por Que Usar GCSFuse?


Imagine poder acessar seus arquivos no Google Cloud Storage usando comandos simples como cd, ls, cp - sem precisar de SDKs, APIs ou bibliotecas complexas. É exatamente isso que o GCSFuse oferece: um ponto de montagem FUSE que transforma seu bucket em um diretório comum do sistema.

Casos de uso comuns:

  • Servir arquivos estáticos diretamente do GCS para aplicações web
  • Compartilhar dados entre múltiplas instâncias sem duplicação
  • Backup e sincronização automática de arquivos
  • Processamento de grandes volumes de dados sem ocupar disco local

Instalando o GCSFuse

Primeiro, vamos instalar o GCSFuse no seu servidor Ubuntu/Debian:


# Adicionar o repositório oficial
export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
echo "deb https://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list

# Importar a chave GPG
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

# Instalar
sudo apt-get update
sudo apt-get install gcsfuse


Verifique a instalação:

gcsfuse --version


Configurando as Credenciais


Para autenticar com o GCP, você precisa de um arquivo JSON de service account. Crie uma service account no console do GCP com as permissões adequadas (geralmente "Storage Object Viewer" ou "Storage Admin").

# Criar diretório para credenciais
sudo mkdir -p /data

# Copiar seu arquivo de credenciais
sudo cp ~/gcp-key.json /data/gcp-key.json

# Proteger o arquivo
sudo chmod 600 /data/gcp-key.json


Primeira Montagem Manual


Antes de automatizar, vamos testar manualmente para garantir que tudo funciona:

# Criar o ponto de montagem
sudo mkdir -p /mnt/my-bucket
sudo chmod 777 /mnt/my-bucket

# Montar o bucket
sudo GOOGLE_APPLICATION_CREDENTIALS=/data/gcp-key.json \
  gcsfuse --foreground --file-mode=777 --dir-mode=777 \
  my-bucket /mnt/my-bucket


Abra outro terminal e teste:

ls -la /mnt/my-bucket
cd /mnt/my-bucket
echo "Hello from GCS!" > teste.txt


Se funcionou, pressione Ctrl+C no terminal onde o gcsfuse está rodando. Agora vamos automatizar!


Automatizando com Systemd


A melhor forma de garantir que seu bucket esteja sempre disponível é criar um serviço systemd. Aqui está onde muita gente se perde - vou te mostrar a configuração que realmente funciona.

Habilitando allow_other

Primeiro, um passo crítico que muitos esquecem:

sudo nano /etc/fuse.conf


Descomente ou adicione esta linha:

user_allow_other


Isso permite que outros usuários (além de quem montou) acessem o filesystem.


Criando o Serviço

Crie o arquivo /etc/systemd/system/gcsfuse-my-bucket.service:

sudo nano /etc/systemd/system/gcsfuse-my-bucket.service


Atenção: Esta configuração foi testada e refinada após resolver diversos problemas comuns:

[Unit]
Description=Mount GCS bucket my-bucket
After=network-online.target local-fs.target
Wants=network-online.target
Requires=network-online.target

[Service]
Type=simple
User=root
Environment=GOOGLE_APPLICATION_CREDENTIALS=/data/gcp-key.json
ExecStartPre=/bin/mkdir -p /mnt/my-bucket
ExecStart=/usr/bin/gcsfuse --foreground --file-mode=777 --dir-mode=777 my-bucket /mnt/my-bucket
ExecStop=/bin/umount -l /mnt/my-bucket
Restart=on-failure
RestartSec=3
TimeoutStartSec=30

[Install]
WantedBy=multi-user.target


Pontos Importantes da Configuração

Por que Type=simple com --foreground? O gcsfuse tenta fazer daemonize por padrão, mas isso causa conflitos com o systemd. Usar Type=simple + --foreground mantém o processo em primeiro plano, permitindo que o systemd gerencie corretamente.


Por que NÃO usar Group=gcsusers? Muitos tutoriais sugerem adicionar Group= no serviço, mas isso causa problemas de permissão. Deixe apenas User=root e controle as permissões via flags do gcsfuse.


Por que --file-mode=777 --dir-mode=777? Essas flags nativas do gcsfuse definem permissões para arquivos e diretórios. Evite usar -o uid=X,gid=X,umask=X - isso causa o erro "invalid argument".


Ativando o Serviço

# Recarregar configurações
sudo systemctl daemon-reload

# Habilitar inicialização automática
sudo systemctl enable gcsfuse-my-bucket.service

# Iniciar o serviço
sudo systemctl start gcsfuse-my-bucket.service

# Verificar status
sudo systemctl status gcsfuse-my-bucket.service


Se tudo correu bem, você verá:

Active: active (running)


Verificando a Montagem

# Verificar se está montado
mount | grep my-bucket

# Deve mostrar algo como:
# /mnt/my-bucket on /mnt/my-bucket type fuse.gcsfuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions)

# Testar acesso
ls -la /mnt/my-bucket


Troubleshooting: Problemas Comuns e Soluções


Durante minha experiência configurando GCSFuse, encontrei vários problemas. Aqui estão as soluções:


1. "Permission Denied" Mesmo como Root

Sintoma: O serviço diz que montou com sucesso, mas ls /mnt/my-bucket retorna "Permission denied".

Causa: Você provavelmente está em um terminal que já estava dentro do diretório antes da montagem. O shell herdou o diretório antigo, não o ponto de montagem.

Solução:

# Saia do diretório primeiro
cd ~

# Agora tente acessar
ls -la /mnt/my-bucket


2. Diretório Aparece como "d?????????"

Sintoma: Ao fazer ls -la /mnt/, o diretório aparece com permissões estranhas:

d????????? ? ? ? ? ? my-bucket

Causa: O FUSE está montado mas você está visualizando antes do sistema sincronizar, ou falta user_allow_other no /etc/fuse.conf.

Solução:

# 1. Verificar /etc/fuse.conf
sudo nano /etc/fuse.conf
# Garantir que user_allow_other está descomentado

# 2. Reiniciar o serviço
sudo systemctl restart gcsfuse-my-bucket.service

# 3. Aguardar alguns segundos e testar de fora do diretório
cd ~ && ls -la /mnt/my-bucket


3. Erro "mount: invalid argument"

Sintoma: O serviço falha com erro "mountWithStorageHandle: mount: mount: invalid argument".

Causa: Você está usando -o uid=0,gid=1012,umask=0002 ao invés das flags nativas do gcsfuse.

Solução: Use as flags corretas:

# ERRADO:
ExecStart=/usr/bin/gcsfuse -o uid=0,gid=1012,umask=0002 bucket /mount

# CERTO:
ExecStart=/usr/bin/gcsfuse --foreground --file-mode=777 --dir-mode=777 bucket /mount


4. Serviço Fica em Loop de Restart

Sintoma: O serviço reinicia constantemente.

Causa: Geralmente problema de autenticação ou bucket não existe.

Solução:

# Ver logs detalhados
sudo journalctl -u gcsfuse-my-bucket.service -n 100

# Testar credenciais manualmente
GOOGLE_APPLICATION_CREDENTIALS=/data/gcp-key.json gsutil ls gs://my-bucket/


Monitoramento e Logs


Para acompanhar o que está acontecendo:

# Logs em tempo real
sudo journalctl -u gcsfuse-my-bucket.service -f

# Últimas 50 linhas
sudo journalctl -u gcsfuse-my-bucket.service -n 50

# Filtrar apenas erros
sudo journalctl -u gcsfuse-my-bucket.service | grep -i error


Gerenciando Permissões para Múltiplos Usuários


Se você precisa que vários usuários acessem o bucket (como www-data para web servers), pode criar um grupo:

# Criar grupo
sudo groupadd gcsusers

# Adicionar usuários
sudo usermod -aG gcsusers www-data
sudo usermod -aG gcsusers seu-usuario

# Nota: Com --file-mode=777 e --dir-mode=777, 
# todos já terão acesso. O grupo é útil para 
# controles mais granulares no futuro.


Performance e Boas Práticas


Cache Local

Para melhorar performance, configure cache local:

ExecStart=/usr/bin/gcsfuse --foreground \--file-mode=777 --dir-mode=777 \--temp-dir=/var/cache/gcsfuse \--stat-cache-ttl=60s \--type-cache-ttl=60s \
  my-bucket /mnt/my-bucket


Implicit Dirs

Se seu bucket usa estrutura hierárquica de "pastas", adicione:

--implicit-dirs


Limitações Importantes

  • Não é um filesystem completo: Operações como chmod e chown são ignoradas
  • Latência de rede: Cada operação de I/O vai para o GCS
  • Não recomendado para bancos de dados: Use para arquivos estáticos
  • Rename é caro: Mover arquivos grandes pode demorar


Comandos Úteis para o Dia a Dia

# Reiniciar serviço
sudo systemctl restart gcsfuse-my-bucket.service

# Parar serviço
sudo systemctl stop gcsfuse-my-bucket.service

# Desabilitar inicialização automática
sudo systemctl disable gcsfuse-my-bucket.service

# Status completo
sudo systemctl status gcsfuse-my-bucket.service

# Desmontar manualmente (se necessário)
sudo umount -l /mnt/my-bucket

# Ver configuração do serviço
cat /etc/systemd/system/gcsfuse-my-bucket.service


Segurança: Checklist

  • ✅ Proteja o arquivo JSON: chmod 600 /data/gcp-key.json
  • ✅ Use service account com menor privilégio possível (não owner do projeto!)
  • ✅ Em produção, considere permissões mais restritivas que 777
  • ✅ Habilite logs de auditoria no GCS para compliance
  • ✅ Rotacione as keys periodicamente
  • ✅ Use VPC Service Controls se disponível


Conclusão

O GCSFuse é uma ferramenta poderosa para integrar Google Cloud Storage com seu ambiente Linux de forma transparente. A chave para o sucesso está em:

  1. Usar Type=simple com --foreground no systemd
  2. Habilitar user_allow_other no fuse.conf
  3. Usar as flags nativas do gcsfuse (--file-mode, --dir-mode)
  4. Evitar estar dentro do diretório ao testar a montagem
  5. Monitorar logs para identificar problemas rapidamente

Com esta configuração, seu bucket estará sempre disponível, montando automaticamente no boot e reiniciando em caso de falhas.


Recursos Adicionais


Dúvidas? Deixe nos comentários que eu respondo! Se este artigo te ajudou, compartilhe com outros sysadmins que estão batendo cabeça com GCSFuse. 🚀

Espaço para publicidade
0 Comentário(s)
Seja o primeiro a comentar o nosso artigo!
Todos os direitos reservados. © 2021-2031
SBBlog Powered By Powered By Sysborg | Powered By Anderson Arruda