Os forks de recursos do OS X são fluxos de dados alternativos anexados a arquivos regulares. Eles podem conter o ícone personalizado do arquivo, o rótulo colorido, as palavras-chave ou qualquer outro metadado definido pelo usuário ou por aplicativos.
Eles são suportados nativamente pelo sistema de arquivos HFS + do OS X, mas sempre que o OS X monta outro sistema de arquivos, seja local (FAT32) ou remoto (NFS, SMB) eles são armazenados nos chamados arquivos "dotbar": o arquivo regular name.ext
é armazenado em outro arquivo normal, mas oculto ._name.ext
. (Eles não devem ser confundidos com arquivos .DS_Store
, que armazenam as configurações de visualização de um diretório, como visualização de ícone vs. coluna, ou a posição de sua janela.)
O problema com os arquivos dotbar ._
é que eles são arquivos regulares reais, no sistema de arquivos de destino, com a mesma extensão que o arquivo original, causando, assim, muitos estragos. Por exemplo, Ant e Maven verão ._MyClass.java
como outro arquivo Java para compilar.
Vejo que o OS X pode ser configurado para armazenar forks de recursos em fluxos denominados SMB e que o Samba pode ser configurado para armazenar fluxos nomeados nos atributos estendidos POSIX ou, alternativamente, em um diretório de depósito em outro lugar .
Ambas as soluções resolveriam o problema de arquivos dotbar que poluem o sistema de arquivos de destino, mas não consigo trabalhar.
Xattr
Primeiro eu tentei com o xattr:
vfs objects = streams_xattr
kernel oplocks = no
A última opção se deve a este bug . Eu disse ao OS X para usá-lo, fazendo isso na raiz do compartilhamento, antes de montá-lo:
touch .com.apple.smb.streams.on
Mas quando tentei copiar um arquivo com o Finder, recebi este erro:
The Finder can’t complete the operation because some data in “hello.java” can’t be read or written.
(Error code -36)
Depot
Então eu tentei com depósito:
vfs objects = streams_depot
deixando .com.apple.smb.streams.on
na raiz do compartilhamento. Tentando copiar o mesmo arquivo com o Finder, recebi outro erro:
The operation can’t be completed because an unexpected error occurred
(error code -50)
Como posso fazer o OS X funcionar com uma dessas duas opções? Meu objetivo é obter esses desagradáveis ._
dos diretórios compartilhados.
Eu tentei simplesmente vetar arquivos dotbar:
veto files = /._*/
delete veto files = yes
Mas isso faz com que alguns aplicativos falhem, por exemplo Mercurial quando executado a partir do OS X através de um compartilhamento SMB montado .
Estou usando o OS X 10.9.5 como o cliente; Samba 3.6.6 do Debian Wheezy como o servidor.
Editar: aqui está minha configuração conforme solicitado:
[global]
security = user
invalid users = root
workgroup = COMPANY_NAME
encrypt passwords = true
panic action = /usr/share/samba/panic-action %d
syslog = yes
syslog only = yes
# PERFORMANCE TUNING
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072 SO_KEEPALIVE
read raw = true
write raw = true
use sendfile = true
min receivefile size = 16384
aio read size = 16384
aio write size = 16384
max xmit = 131072
getwd cache = true
# DEFAULT OPTIONS FOR ALL SHARES
writeable = true
force group = company_group
create mask = 664
security mask = 664
force create mode = 664
force security mode = 664
directory mask = 2775
directory security mask = 2775
force directory mode = 2775
force directory security mode = 2775
# solve problem where OS X clients remove mode 0100
map archive = no
[homes]
browseable = no