Transferência de grandes arquivos
Transcrição
Transferência de grandes arquivos
TUTORIAL Transferência de arquivos | TUTORIAL Transferência de arquivos Transferência de grandes arquivos Várias alternativas permitem contornar os limites de tamanho quando transferimos um arquivo do ponto A ao ponto B. por Frank Hofmann C onsidere a seguinte situação: um usuário deseja armazenar um arquivo grande em um cartão de memória USB, mas a tentativa falha, mesmo havendo espaço suficiente no dispositivo. Neste caso, muito provavelmente foram atingidos os limites do sistema de arquivos na mídia que estava sendo utilizada. As causas possíveis podem ser: uma tabela de alocação de arquivo cheia – File Allocation Table (FAT) –, o diretório para conteúdos do disco ter excedido o número máximo de blocos por arquivo. Por razões de compatibilidade, muitos fabricantes fornecem mídia para o sistema de arquivos VFAT ou FAT32, e podemos não notar por um longo tempo que o tamanho de um arquivo é limitado. Ambos podem armazenar arquivos até um máximo de 4GB, Linux Magazine #99 | Fevereiro de 2013 aproximadamente; no entanto, podemos transportar arquivos maiores de um computador para outro de outras formas. A primeira variante envolve a transferência de dados através de uma conexão de rede; a variante dois, envolve a compressão de dados; a variante três, formatação de disco com um sistema de arquivos diferente, e a variante quatro, a divisão do arquivo em diversas partes para, posteriormente, voltar a uni-los no sistema de destino. Operações de rede A transferência de arquivos através da rede é apenas uma opção genuína se a taxa de transferência de linha for suficiente e a largura de banda estável durante a conexão. Prestadores de serviços de Internet muitas vezes fornecem menos capacidade para uploads do que para downloads em uma conexão com largura de banda assimétrica (por exemplo, ADSL). Quando a Internet está sempre disponível, este fato pode ser facilmente esquecido. Se o sistema de destino é capaz de receber dados via FTP, este protocolo é a escolha óbvia. Para além da ferramenta de linha de comando clássica ( listagem 1), o cliente gFTP com interface gráfica simplifica significativamente o processo de envio de dados antes e depois ( figura 1). No entanto, o FTP é um protocolo inseguro; todos os dados são enviados sem criptografia. Alternativas mais seguras estão disponíveis há muito tempo, sob a forma de FTP seguro (Secure FTP ou SFTP), FTPS (FTP sobre SSH) e cópia segura (Secure Copy ou SCP). O programa SCP é normalmente parte do escopo de uma instalação SSH em um PC cliente; o sistema de destino precisa executar um servidor SSH. 57 TUTORIAL | Transferência de arquivos Figura 1 O cliente gFTP possui uma interface gráfica para facilitar a transferência de arquivos para um servidor FTP. Ambos os componentes estão disponíveis nos pacotes openssh-client e openssh-server no Debian e no Ubuntu. O cliente é parte da ferramenta padrão definida em muitas distribuições; uma instalação geralmente não é necessária. Para instalar o servidor de forma retroativa no Ubuntu/Debian, utilize: apt-get install openssh-server no sistema de destino. Para transferir dados a partir do host para o servidor, basta digitar o comando da primeira linha da listagem 2. O SCP abre uma conexão criptografada para a máquina de destino e transmite o arquivo para o diretório especificado; é necessário indicar o diretório explicitamente, acrescentando-o ao nome do host na linha de comando. O separador de comandos SCP é o de dois pontos (colon). Se só forem informados os dois pontos, o software automaticamente seleciona o diretório raiz no sistema remoto como destino. Enquanto as duas primeiras chamadas na listagem 2 mantêm o mesmo nome do arquivo no sistema de destino, o terceiro comando o altera para debian.iso. Além disso, a transferência usa um formato gzip compactado, graças ao switch -C. Para arquivos de texto e arquivos tar (compactados), esta forma pode reduzir de forma bastante significativa a duração da transmissão do arquivo sob certas circunstâncias. Se assim desejar, o SCP também irá coletar dados do servidor caso seja digitado o nome do computador no qual os arquivos estão armazenados tendo o nome do caminho como primeiro parâmetro e o nome do arquivo no sistema local como segundo parâmetro. Na última linha da listagem 2, o programa lê o arquivo debian.iso a partir do diretório home do usuário no computador especificado, transmite o arquivo gzip para o sistema local, e armazena o arquivo no diretório atual sob o nome file4.iso. Se o usuário não estiver totalmente confortável com as ferramentas de linha de comando, o Midnight Commander fornecerá uma alternativa. Dois itens de menu, Left/FTP link e Left/ Shell link oferecem uma camada de abstração para uma conexão FTP e SCP, respectivamente (figura 2). Note que o Midnight Commander armazena os dados de buffer no diretório /tmp. Consequentemente, o usuário deverá certificar-se de que há espaço disponível suficiente antes de transferir arquivos grandes. Sincronização com Rsync Figura 2 Se preferir ficar longe da linha de comando, o Midnight Commander oferece recurso similar ao SCP e FTP, envolto em uma interface gráfica. 58 Outra abordagem para a transferência de dados envolve a sincronização de dois diretórios via Rsync ou www.linuxmagazine.com.br Transferência de arquivos | TUTORIAL através de sua interface gráfica, o Grsync (figura 3). O comando para sincronizar o conteúdo do diretório /original em um computador com o diretório local, chamado de copy é: $ rsync -z <user>@<source>: /original/ copy O Rsync transfere apenas as mudanças entre o original e a cópia – dados idênticos (blocos) são reconhecidos e excluídos pela ferramenta. A opção -z assegura que os dados na sincronização Gzip estejam compactados para transmissão através da rede. Compressão de dados Figura 3 O Grsync, a interface gráfica para o Rsync, torna mais fácil lidar com comandos Rsync por vezes enigmáticos. Listagem 1: FTP na linha de comando $ ftp <user>@<server> Password: 230 Login successful. Have fun. ftp> put <file> ftp> bye 221 Goodbye. Listagem 2: Como usar o SCP $ $ $ $ scp scp scp scp <file> <user>@<target>: <file> <user>@<target>:/tmp/ -C file3.iso <user>@<target>:debian.iso -C <user>@<source>:debian.iso file4.iso Listagem 3: Definição de divisão de nomes de arquivos $ split --bytes=50M -d -a 3 debian-6.0.4-i386-netinst.iso part$ ls -hal part* -rw-r--r-- 1 frank frank 50M 30. Apr 10:33 part-000 -rw-r--r-- 1 frank frank 50M 30. Apr 10:33 part-001 -rw-r--r-- 1 frank frank 50M 30. Apr 10:33 part-002 -rw-r--r-- 1 frank frank 41M 30. Apr 10:33 part-003 Linux Magazine #99 | Fevereiro de 2013 Por um lado, a compactação de dados durante uma transferência custa tempo; por outro lado, o SSH/ SCP só suporta compressão baseada em gzip. O procedimento é amplamente usado, mas nem sempre é a melhor escolha. Se quiser usar um procedimento diferente, é preciso compactar os arquivos antes da transferência e descompactá-los no sistema de destino (por exemplo, usando Xz ou 7z). Qual processo é mais adequado para cada tarefa depende principalmente dos dados a serem processados. Outra coisa a considerar na escolha do formato é que, se deseja descompactar o arquivo no sistema de destino, certifique-se de antemão de que um programa adequado esteja disponível lá. Novo formato Uma outra opção é manipular o meio externo de seu sistema de arquivos. As ferramentas mkfs são usadas para criar um sistema de arquivos básico. Mkfs significa make filesystem (criar sistema de arquivos); um comando separado está disponível para (quase) todos os arquivos. Por exemplo, o comando mkfs.ext4 /dev/sdb1 cria um sistema de arquivos 59 TUTORIAL | Transferência de arquivos ext4 no dispositivo especificado: / dev/sdb1. O tamanho máximo de arquivo permitido em um sistema de arquivos varia consideravelmente e encontra-se na faixa de 16TB em ext2, 1EB em ext4 e 16EB no ZFS [1], onde 1 exabyte = 1018 bytes. Em outras palavras, 1EB é equivalente a 1 milhão de terabytes ou 1 bilhão de gigabytes. De acordo com o tamanho do volume, a criação de um sistema de arquivos pode demorar algum tempo para ser concluída; e lembre-se, este processo irá apagar todos os dados já armazenados no meio. Divisão de arquivos Se as propostas acima referidas não forem do agrado do usuário nem uma opção a se considerar, é possível dividir o arquivo em pedaços menores e uni-los novamente no sistema de destino. O Linux oferece duas ferramentas para isso: o split e o cat. O comando split divide os arquivos, e o cat os coloca juntos novamente. Sem nenhum parâmetro, o split desmonta o arquivo especificado em pedaços de 1.000 linhas. Esta predefinição é adequada para arquivos de texto, mas não para imagens ISO ou uma máquina virtual. O parâmetro --bytes=<value> (ou -b<value>) faz a divisão em um número exato de bytes. Por exemplo, para dividir uma imagem ISO da rede Debian, instale o CD (191MB) em pedaços de 50MB, onde a seguinte chamada irá fazer este truque: $ split --bytes=50M debian-6.0. 4-i386-netinst.iso A imagem é dividida em quatro partes; de xaa até xad. As partes xaa, xab e xac somam exatamente 50MB, enquanto xad contém o restante dos dados, que é de aproximadamente 41MB. Por padrão, a ferramenta prefixa os arquivos de saída com x 60 para duas letras posteriores na ordem crescente (sufixo). Parâmetros adicionais na linha de comando split permitem definir os nomes dos arquivos de saída para atender às necessidades do usuário; podemos passar no componente principal o nome do arquivo a ser dividido, acrescentando um prefixo à chamada anterior: $ split --bytes=50M debian-6.0. 4-i386-netinst.iso part- Os arquivos gerados serão agora apelidados, por exemplo, de part-aa e part-ad. Outros dois parâmetros -d e -a também permitem definir os sufixos. A opção -d gera sufixos numéricos, e -a<count> determina a largura (duas por padrão); a divisão preenche os espaços com zeros. A chamada na primeira linha da listagem 3 cria quatro arquivos: de part-000 até part-003. Para montar as peças individuais no sistema de destino, o usuário só precisa de um simples comando cat: $ cat part-* >> new.iso O cat usa o operador >> para remontar as partes que o esquema de nomeação havia colocado na ordem correta, criando assim um novo arquivo chamado new.iso neste exemplo. Agora só é preciso verificar e certificar-se de que as etapas de desmontagem e remontagem não tenham falhado e os dois arquivos ISO (original e cópia) são idênticos. Uma comparação byte a byte levaria muito tempo e também é propensa a erros; no entanto, duas ferramentas – cmp e diff – podem ajudar a verificar os arquivos para analisar diferenças em potencial: $ diff debian.iso new.iso $ cmp debian.iso new.iso Se não há saída, os arquivos ISO são idênticos. Uma outra abordagem, mais elegante e frequentemente utilizada é a de gerar um hash, que é uma espécie de impressão digital para um conjunto de dados ou string. Na listagem 4, o comando openssl usa o algoritmo MD5 para gerar um hash. Se os checksums forem idênticos, o original e a cópia serão correspondentes. Conclusão Ao copiar arquivos grandes, ideias e abordagens diferentes podem ajudar a atingir seu objetivo. A única coisa importante é encontrar uma solução adequada para o problema que ajuda a dominar as tarefas Linux diárias com mais segurança. n Listagem 4: Como criar um hash $ openssl dgst -md5 debian.iso MD5(debian.iso)= ff79f60c4d1fee2d47baadcbf081e5b6 $ openssl dgst -md5 new.iso MD5(new.iso) = ff79f60c4d1fee2d47baadcbf081e5b6 Mais informações [1] ZFS: http://en.wikipedia.org/wiki/ZFS Gostou do artigo? Queremos ouvir sua opinião. Fale conosco em [email protected] Este artigo no nosso site: http://lnm.com.br/article/8220 www.linuxmagazine.com.br