Mostrando postagens com marcador Compactação de Arquivos. Mostrar todas as postagens
Mostrando postagens com marcador Compactação de Arquivos. Mostrar todas as postagens

quinta-feira, 7 de junho de 2012

Preservando as Permissões do Linux com Script Java Ant Build

O projeto Ant da Apache é uma biblioteca utilíssima que, lendo um pequeno script em XML, é capaz de compilar todo o código do seu projeto, empacotá-lo em arquivo JAR, WAR, EAR, ZIP ou outros formatos e ainda faz mais uma série de outras coisas divertidas, a maioria envolvendo manipulação de arquivos e diretórios.
Embora seja o compilador/empacotador padrão de quase qualquer projeto Java profissional, o Ant lida com manipulação de arquivos e execução de programas tão bem que pode facilmente ler scripts que, com certa criatividade, podem compilar e empacotar programas e C, C++, dentre outras linguagens, além de servir de empacotador para outros projetos genéricos.


  • As Permissões no Linux

(Mais informações sobre as permissões do Linux, vide aqui).
No Linux, as permissões de acesso e execução de arquivos é gravada em forma de atributos de arquivo, e estão dispersas em 3 níveis: usuário (dono do arquivo), os outros membros do grupo principal (do usuário dono do arquivo) e, finalmente, os outros usuários que sobraram. Cada um destes três níveis tem 3 atributos de permissão: leitura somente, leitura e gravação, execução. Assim, temos uma combinação de 7 possibilidades para cada nível, ficando:

0 --- sem permissão
1 --x execução
2 -w- escrita
3 -wx escrita e execução
4 r-- leitura
5 r-x leitura e execução
6 rw- leitura e escrita
7 rwx leitura, escrita e execução

Como se pode perceber, estas permissões, nesta ordem (rwx) formam uma seqüência de 3 bits, que pode então ser representada por um número octal (sim, já que 23 = 8).

0: 000
1: 001
2: 010
3: 011
4: 100
5: 101
6: 110
7: 111

Assim, se temos 3 níveis, e se cada nível pode ser representado por um número octal, então as permissões completas podem ser representadas por uma seqüência de 3 números octais. Exemplos:


rwx rwx rwx = 777
r-x r-x r-x = 555
rwx r-- r-- = 744
e assim por diante...


  • O Problema das Permissões no Linux

Muito bem, e qual o problema disso?? É bem simples, meu caro Watson...
Se a permissão de execução de um arquivo, no Linux, é tão-somente um atributo deste arquivo, como podemos preservá-lo, caso o arquivo seja compilado via Ant?? Suponhamos os seguintes cenários:

1- Que o Ant empacote um programa que tem um arquivo executável (por exemplo, script.sh) gerando um arquivo ZIP. Isso funciona?

Não funciona. O formato ZIP não retém as permissões de arquivos do Linux. Ainda que retivesse, se o programa estiver sendo empacotado numa máquina que roda outro sistema (ex: Windows), as permissões não existirão e, no momento em que o Ant ler o arquivo, elas continuarão perdidas.
Exemplo:

[Este exemplo não faz o que pretendemos]
[arquivos compilados e copiados para a pasta "build"]
<zip destfile="pacote.zip" basedir="build"/>


2- Ah, mas o Ant tem uma task tar. E se ele empacotar o programa como tar??

O formato tar suporta o que queremos, de fato, mas ainda é pouco. Exatamente porque o Java é multiplataforma, a task tar do Ant não usa o programa tar do seu Linux. Usa uma implementação totalmente feita em Java do padrão tar. Só poderia ser assim, para que a task funcionasse inclusive em máquinas que não têm o programa tar, garantindo a compatibilidade entre as diversas plataformas.
O resultado disso é que o arquivo tar é gerado perfeitamente, porém sem as permissões herdadas de cada arquivo, e sim com permissões genéricas.
Exemplo:

[Este exemplo não faz o que pretendemos]
[arquivos compilados e copiados para a pasta "build"]
<tar destfile="pacote.tar">
     <fileset dir="build" includes="**/*"/>
</tar>


  • A Solução do Problema

Finalmente, existem algumas opções que podem resolver o problema. Vamos a elas.

1- Usando o Programa tar de seu Linux

Esta sabemos que não é a melhor opção, embora funcione. Através da task exec, o Ant permite a execução de um programa externo, inclusive passando parâmetros (argumentos) para o mesmo (mais sobre esta task aqui).
O exemplo abaixo indica como chamar o programa tar de um script Ant, passando argumentos que indicam o que deve ser empacotado (diretório ".") e uma lista de arquivos a serem excluídos. O problema é que, como o programa tar normalmente só existe em ambientes Linux, para evitar erros, a task é instruída a só executar se este ambiente for detectado. Esta detecção, internamente, é feita pela propriedade de sistema "os.name".

[Este exemplo não é a melhor opção]
<exec executable="tar" output="/dev/null" os="Linux">
        <arg value="--exclude-from=arquivos_a_excluir.txt"/>
        <arg value="-cvz"/>
        <arg value="--file=${pacote.tar}"/>
        <arg value="."/>
</exec>

A fragilidade desta opção é que, dependendo de um programa externo, ela não funciona em qualquer plataforma. Se você constrói seu sistema sozinho ou se a sua equipe tem o ambiente todo padronizado, então ela pode ser usada. Caso contrário, você teria que criar tantas task exec quanto sistemas usados por sua equipe, e torcer para que, em cada sistema, todos tenham o programa tar no mesmo lugar (ou no PATH).


1- A Forma Correta

A maneira abaixo despreza chamadas para programas externas e constrói a solução ideal. Como isto é possível??
Simples, meu caro Watson: substituímos (ou incluímos) a tag (elemento) fileset pela tag tarfileset. Esta tag é específica da task tar e herda de fileset. Esta faz o mesmo que aquela, ou seja, define uma lista de arquivos para serem considerados, porém com duas propriedades (atributos) a mais, a saber:

- filemode: define as permissões de arquivo Linux que os arquivos incluídos nesta tag deverão ter após incluídos no pacote tar, independente de os arquivos originais terem ou não estas permissões.
- dirmode: faz o mesmo, porém para diretórios.

Assim, é possível se manter ou mesmo trocar as permissões de arquivos no momento de serem empacotados no pacote tar. Evidentemente, devido a esta arquitetura de trabalho, o pacote tar será formado como desejado mesmo que você esteja rodando o script Ant de ambiente Windows, que não suporta as permissões de arquivos Linux. Ou seja: funciona em qualquer plataforma, por mais louca que seja a maneira como ela armazena seus arquivos.

Veja na prática como funciona, pelo exemplo abaixo:

[Este exemplo é o recomendável]
<tar destfile="pacote.tar">
    <fileset dir="build" includes="**/*" excludes="build/script.sh"/>
    <tarfileset dir="build" includes="build/script.sh" filemode="755"/>
</tar>

 No exemplo, selecionamos os arquivo que não são executáveis dentro do elemento fileset, como é feito normalmente. Porém, excluímos o único arquivo diferente, o que queremos que seja um executável. Logo abaixo, incluímos o arquivo executável, porém agora utilizando o elemento (tag) tarfileset, que está instruído a adicioná-lo ao pacote usando as permissões 755.
Como vimos acima, as permissões são representadas por 3 algarismos octais. Os atributos filemode e dirmode de tarfileset somente recebem estes 3 algarismos numéricos. No exemplo, 755 representa: rwx  r-x  r-x, ou seja, todos podem ler e executar, mas somente o dono do arquivo pode modificá-lo.


  • Conclusões

Neste artigo apresentamos como utilizar, no escopo de um script Ant, a task tar, de modo a elegantemente preservar as permissões de arquivos Linux ao se criar um pacote. Claro, estas permissões podem inclusive serem alteradas e/ou criadas no momento do empacotamento, uma vez que esta solução é ágil e flexível. Porque a implementação do tar no Ant é feita em puro Java, a solução dispensa o uso de chamadas a programas externos, o que poderia consistir em fragilidade no script, e, o melhor de tudo, pode ser rodada a partir de qualquer sistema, mesmo aqueles para quem estas permissões não existam nativamente.
Espero ter ajudado e, claro, COMENTEM!!!

sábado, 16 de julho de 2011

Como Copiar Arquivos Grandes no Linux?

Imagine que você precisa copiar um arquivo bem grande (ou de tamanho que consideramos bem grande para os dias de hoje, quando escrevo), algo em torno de vários gigas. Pode ser um dump geral de seu banco de dados, um arquivo de log gigantesco, um arquivo temporário ou um filme em Blue Ray. Pode ser que a cópia de backup deste arquivo falhe ou a escrita para ele comece a falhar a partir de certo ponto... o que fazer??
Calma, o Pajé tem a solução!!


  • Cópia em Ambiente Linux

Se você usa um sistema de arquivos moderno, como o ext4, então você poderá escrever vários gigas num mesmo arquivo. Se sua cópia ou escrita falhar, tente verificar se existe algum limite pré-definido de escrita, usando o comando:

$ ulimit
unlimited

Se a resposta for a que mostro aí em cima (unlimited), então não há limite para a sua cópia. De outra forma, pode haver limite. Daí, para redefinir o limite, basta usar este mesmo comando, passando o novo valor após o argumento -f:

$ ulimit -f [valor]

Para um tutorial completo sobre limites de escrita, uso e cotas de usuários, visite este endereço.


  • Cópia pela Rede, para Pen-Drives, HDs Externos ou Outros Dispositivos

Agora realmente a coisa muda de figura!! Você está tentando copiar um arquivo que está em um sistema de arquivos Linux para um dispositivo que provavelmente tem seu próprio sistema de arquivos, não necessariamente aquele que você usa na máquina de origem do arquivo. Lembre-se de que um sistema de arquivos é um banco de dados, e que cada tipo tem seus próprios limites.
Se você está copiando para outro dispositivo, verifique qual o sistema de arquivos que ele usa com este comando (claro, presumindo que o dispositivo esteja montado e acessível!!):

$ mount
(....)
/dev/sdb1 on /media/HDExterno type vfat

O comando acima vai mostrar tudo que está montado em seu sistema (a maioria não interessa neste momento, então coloquei estas saídas no formato de "(...)", para ficar mais fácil de entender). Porém, uma das linhas da saída vai se reportar ao dispositivo externo. No caso acima, é um HD Externo, que é acessível em /dev/sdb1 e está montado em /media/HDExterno. Observe que o tipo de sistemas de arquivos é vfat, ou seja, possivelmente um FAT32.
O sistema de arquivos FAT32 (vfat) é o pior que tem: um sistema antigo, limitado e muito simples. Porém, exatamente dada a sua simplicidade, ele é facilmente acessível e montável em ambientes os mais diferentes, desde Linux e MAC até Rádios (CD Players), TVs, DVD Players, CD Players de carros e aparelhos de som.
Notem que o HD Externo acima está formatado em FAT32. Pelas características deste sistema de arquivos, não é possível gravar nenhum arquivo maior que 4GB (na verdade, um byte antes de 4GB de tamanho). Não adianta, quantas vezes você tentar, vai falhar...


  • Achando a Solução para o Caso Acima

Se o seu caso é este acima, então tente fazer uma destas soluções:

1- Reformatar o HD com outro sistema de arquivos, como o NTFS (para ter compatibilidade com Windows) ou mesmo os sistemas do Linux, como ext4, ReiserFS, etc. Claro, isto implica em fazer backup de tudo que tem nele, apagar o HD Externo totalmente e reformatar. Porém, se você precisa muito gravar um arquivão de mais de 4GB, que pode ser seu precioso banco de dados ou o Log de seu sistema, então vale a pena o esforço!!

2- Uma alternativa, é usar o comando split, que quebra o arquivo em vários pedaços definidos por você. Depois desta quebra, o original pode ser apagado e os pedaços, em menor tamanho, podem ser gravados sem problemas. Fique tranqüilo, pois eles podem ser remontados sempre que necessário, usando o comando cat. Excede o escopo deste tutorial explicar detalhadamente como eles funcionam, mas a documentação dos mesmos é bem clara e certamente você conseguirá usá-los bem (digite "man split" e "man cat" para ver a página do manual de cada um)!!

3- Existem compactadores muito bons que conseguem reduzir em grande parte o tamanho dos arquivos. Muitos deles, como o rar, suportam não só a compactação como também a quebra do arquivo compactado em arquivos menores e de mesmo tamanho. Muitas vezes, você pode usar mais de um compactador, como a combinação do tar com o gzip ou bzip2. Se você pretende fazer backup, recomendo sempre compactar os dados e, claro, você pode fazer um script para te ajudar nesta tarefa um tanto quanto enfadonha.

Bom, pessoal, por hoje é isso... espero ter ajudado!!

quarta-feira, 24 de fevereiro de 2010

Abrindo Arquivos 7z e 7za do 7-Zip, ARJ, CAB, CPIO e outros no Linux

Há algum tempo, um projeto open source ganhou muita popularidade: o 7-Zip (sevenzip). Este programa, criado para Windows e com uma interface parecida com a do WinZip e do WinRAR, deu na verdade um passo a frente: não se limitando a ser apenas mais uma interface para compactadores de arquivos, criou o seu próprio formato de compactação, o 7z (e suas variantes). O fato notável é que este formato tem hoje a maior taxa de compactação, maior mesmo que a do formato RAR, e chegando a ser 30% a 50% melhor que o formato ZIP. Seus filtros conseguem até comprimir arquivos JPG, ainda que com uma pequena taxa de compressão!!
Assim, surgiram muitos arquivos com a extensão 7z, valendo-se do benefício da altíssima compactação do 7-Zip. Porém, o programa roda em Windows... e para descompactar estes arquivos no Linux?? Claro que existe uma maneira!! E a solução é a seguinte:

  • Instalando o 7-Zip no Linux

Existe uma versão do compactador para Linux, que pode ser instalada a partir do repositório padrão. Para sistemas baseados em Debian, como o Ubuntu, basta digitar:

apt-get update
apt-get install p7zip p7zip-full

O novo programa funciona com o comando p7zip, que suporta os formatos 7z, ZIP, CAB, ARJ, GZIP, BZIP2, TAR, CPIO, RPM e DEB.

  • Comprimindo e Descomprimindo Arquivos 7z, ARJ, CAB, etc.

Uma vez instalado o programa, você não precisa digitar nada na linha de comando para abrir um arquivo 7z!!! Basta abrí-lo utilizando o Ark ou o addon do Ark para o Konqueror (lembrando que o Ark é apenas uma interface, um frontend, e que entende uma série de compactadores diferentes que são acionados por baixo dos panos).

  • Compactando e Descompactando com o p7zip

Tudo bem: você é chato, ou é um administrador de sistemas atrás de um terminado remoto, e precisa usar a linha de comando... não se preocupe!! Ainda assim, é fácil comprimir e descomprimir arquivos, com os comandos:

p7zip [nome do arquivo]: comprime o arquivo no formato 7z, apagando o arquivo original e ficando com a cópia comprimida de nome [nome do arquivo].7z.

p7zip -d [nome do arquivo].7z: descomprime o arquivo no formato 7z, apagando o arquivo comprimido e retornando o arquivo original, de nome [nome do arquivo].


Bom, espero ter ajudado!! E, claro, COMENTEM!!!!

quarta-feira, 7 de janeiro de 2009

Como Ler ou Abrir Arquivos bin e cue?

Você já deve ter recebido ou baixado arquivos no formato bin/cue. Do que se trata isto?? Como abri-lo??
Arquivos *.bin são arquivos binários de imagens de CD e que normalmente são acompanhados de um arquivo bem pequenininho que o indexa, de mesmo nome, mas com extensão *.cue. Obviamente, estes arquivos foram gerados na intenção de que o seu receptor não precise abri-lo, mas sim gravá-lo diretamente em CD com um programa que o entenda. Todavia, se a sua intenção não é gravar em CD o conteúdo do arquivo, ou se você precisa ler o que tem dentro para decidir isto, siga os passos brevemente discutidos neste artigo...
Para abrir um arquivo de imagem, ele deve estar no formato iso. Assim, precisamos converter o bin/cue para iso. Felizmente, existe um programa bem simples, rápido e pequenininho que faz isto, o bchunk (ou BinChunker), e a sua instalação em sistemas baseados em Debian é bem fácil:

apt-get install bchunk

Após isto, você precisa converter os arquivos bin e cue em iso, utilizando o programa, com o seguinte comando:

bchunk foo.bin foo.cue foo

(Você pode ainda usar a opção "-v", se quiser uma saída verborosa).
Ótimo!! Agora você já tem um arquivo ISO, que é um outro (bem mais popular!!) formato de imagem de CD. Se você quiser, pode queimá-lo imediatamente para uma mídia fresquinha, com o K3B ou qualquer outro aplicativo semelhante.
Porém, lembremo-nos de que você quer olhar o conteúdo, ver o que tem dentro, e talvez copiar ou abrir um ou outro arquivo ali dentro... então vamos... montar o arquivo ISO em um diretório!! Utilize o seguinte comando (como superusuário):

mount -o loop -t iso9660 arquivo.iso /mnt/iso

Lembre-se de haver previamente criado o diretório /mnt/iso!!
Agora é só acessar o diretório onde a imagem foi montada e navegar tranqüilamente lá dentro... se quiser desmontar, proceda como com qualquer outro dispositivo:

umount /mn/iso

Mais informações sobre montagem de arquivos ISO: clique aqui ou aqui!!
Bom, esta foi mais uma dica expressa do Pajé!! Gostou?? Destestou?? COMENTE!!