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.
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:
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
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
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!
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.
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.
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
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".
# 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)
# 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
Durante minha experiência configurando GCSFuse, encontrei vários problemas. Aqui estão as soluções:
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
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
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
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/
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
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.
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
Se seu bucket usa estrutura hierárquica de "pastas", adicione:
--implicit-dirs
chmod
e chown
são ignoradas# 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
chmod 600 /data/gcp-key.json
O GCSFuse é uma ferramenta poderosa para integrar Google Cloud Storage com seu ambiente Linux de forma transparente. A chave para o sucesso está em:
Type=simple
com --foreground
no systemduser_allow_other
no fuse.conf--file-mode
, --dir-mode
)Com esta configuração, seu bucket estará sempre disponível, montando automaticamente no boot e reiniciando em caso de falhas.
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. 🚀
Seja o primeiro a comentar o nosso artigo!