Eu estou tentando fazer backup de um compartilhamento hospedado pelo Windows, usando o rsync, de uma caixa do FreeBSD8.2:
bash$ sudo -i
bash# uname -a
FreeBSD zeus.companyname.gr 8.2-RELEASE ...amd64
bash# cat /root/.nsmbrc
...
[MACHINENAME:ADMINISTRATOR]
password=mysuperuncrackablepassword
bash# mount_smbfs -N -E utf-8:cp737 -I 192.168.0.2 //Administrator@machinename/f$ /iso1/
bash# ls -l -raw /iso1/prj/
ΠΡΟΕΤΟΙΜΑΣΙΑ ΔΕΔΟΜΕΝΩΝ ΠΑΡΕΛΘΟΝΤΩΝ ΕΤΩΝ
Πανεπιστήμιο - Προβολή, Δημοσιότητα
Em palavras simples, vejo corretamente as pastas com caracteres gregos (específicos da localidade). A listagem acima é de uma sessão do PuTTY (ou seja, uma sessão SSH), e o PuTTY foi configurado para traduzir o UTF-8 por padrão.
Note que não toquei na localidade:
bash# locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=
Então tudo parece estar bem.
No entanto, quando eu tentei rsyncing da pasta montada, alguns arquivos parecem desaparecer ...
bash# rsync --inplace -rltvxp /iso1/ /backups/backup-machinename/
sending incremental file list
file has vanished: "/iso1/prj/..."
A mensagem "arquivo desapareceu" significa que o rsync chamou as chamadas de sistema adequadas para ler o conteúdo de uma pasta (dir / dirent, acredito) e, quando tentou ler mais tarde um dos arquivos contidos, não localizou isso - ou seja, "open (2)" falhou.
Eu verifiquei o arquivo relatado: (a) ele existe, (b) ele tem permissões legíveis pelo mundo.
Assumi então que o cp737 (página de códigos grega) é o problema, então montei novamente com ...
bash$ mount_smbfs -N -E utf-8:utf-8 -I 192.168.0.2 //Administrator@machinename/f$ /iso1/
... ou seja, usei o utf-8 para o lado do Windows também. Quando tentei o rsync novamente, no entanto, ele ficou preso (!) Com 100% de utilização da CPU ... A conexão com o GDB mostrou:
bash# gdb /usr/local/bin/rsync 3109
GNU gdb 6.1.1 [FreeBSD]
Attaching to program: /usr/local/bin/rsync, process 3109
Reading symbols from /lib/libc.so.7...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /libexec/ld-elf.so.1...(no debugging symbols found)...done.
Loaded symbols for /libexec/ld-elf.so.1
0x0000000800709c0a in getdirentries () from /lib/libc.so.7
... então parece que o rsync está preso esperando o retorno de getdirentries, ou cada chamada para getirentries leva um tempo impossível ...
Alguma idéia?
Alguém conseguiu fazer o que estou fazendo? Ou seja Use o FreeBSD para arquivos rsync com caracteres específicos de localidade em seus nomes de arquivos, a partir de um compartilhamento do Windows montado via mount_smbfs?
P.S. Caso alguém se pergunte por que tento fazer isso, a resposta é simples: ZFS.