Compacte arquivos usando os recursos do bzip2

O bzip2 comprime arquivos através do algoritmo de Burrows-Wheeler.
O nível de compressão por este método é consideravelmente mais eficiente do que o de softwares baseados no LZ77/LZ78 (LZW).
Por outro lado, não chega a ser tão bom quanto a família de compressores estatísticos PPM.

O pacote de utilitários bzip2 é composto pelos seguintes itens:

  1. bzip2, bunzip2 — respectivamente, ferramentas de compactação e descompactação de arquivos.
  2. bzcat — descomprime arquivos para o stdout, ou seja, exibe o conteúdo.
  3. bzip2recover — ferramenta de recuperação e correção de arquivos bzip2 danificados.

É comum usar o programa em conjunto com o comando tar.
O tar não é, exatamente, uma ferramenta de compressão e depende de aplicativos de terceiros para fazer este trabalho.
Por outro lado, o bzip2 não é um arquivador. Ele comprime os arquivos individualmente.
Por ĩsto, é tão comum combinar os dois utilitários.
Para fazer o arquivamento (backup) de diretórios, usando o tar, com compressão pelo bzip2, use-o assim:


tar cjf backup.tar.bz ~/temp/

Se quiser, use o progress, como ferramenta para acompanhar o andamento do processo de backup tar/bzip2, com resultados individuais exibidos para cada processo.

progress tar bzip2

O bzip2 faz parte do conjunto de ferramentas padrão das grandes distribuições GNU/Linux. Você provavelmente não precisará se preocupar em instalar, portanto. Tudo que precisa para começar a usar agora, já se encontra no seu sistema.

Como usar o bzip2 na CLI

Na linha de comando (CLI), o bzip2 tem uma sintaxe similar ao do gzip, o que pode tornar mais fácil o trabalho de substituição em scripts de backup.
O utilitário espera que lhe seja dado uma lista de arquivos, acompanhados das opções de uso.
Cada arquivo é substituído por uma versão comprimida de si mesmo — acrescida da extensão .bz2.
Cada arquivo comprimido mantém (enquanto possível) as propriedades originais de posse, facilitando sua restauração posterior.
Se você prefere que os arquivos existentes sejam sobrescritos, é necessário usar o parâmetro ‘-f’. Sem isso, o programa pula arquivos que já tenham passado pelo processo de compactação.


bzip2 -f Occidentalis_v02.img

Exemplos de uso do bzip2

Adapte os exemplos, a seguir, às suas necessidades.
Para dar opções rápidas, o utilitário permite definir --fast (mais rápido) ou --best (melhor compressão),
Portanto para obter a melhor compressão possível, use o bzip2 assim:


bzip2 --best nome-do-arquivo

Para obter uma compressão mais rápida:


bzip2 --fast nome-do-arquivo

A qualidade da compressão também pode ser definida numericamente (de 1 a 9).
A opção ‘-9’ equivale a --best e ‘-1’ a --fast.
Para obter um nível de compressão equilibrado, use -5:


bzip2 -5 nome-do-arquivo

Para obter um feedback mais verboso, use ‘-v’ ou --verbose:


bzip2 -v *.* 

O comando, acima, irá comprimir todos os arquivos do diretório corrente, gerando um novo arquivo com extensão .bz2 em substituição para cada um.
Este é o comportamento padrão do programa.
A opção ‘-v’ serve para mostrar o que está sendo feito.

Sim! Você pode combinar várias opções.
Abaixo, ativei a ‘verbosidade’ e especifiquei que não quero que o arquivo original seja removido. Veja o meu resultado:


bzip2 -vk woman-drinking-cup-of-coffee.jpg 

woman-drinking-cup-of-coffee.jpg:  0.991:1,  8.072 bits/byte, -0.90% saved, 36856 in, 37189 out.

ls -lah woman-drinking-cup-of-coffee.*

-rw-r--r-- 1 justincase justincase 36K set  1 15:03 woman-drinking-cup-of-coffee.jpg
-rw-r--r-- 1 justincase justincase 37K set  1 15:03 woman-drinking-cup-of-coffee.jpg.bz2

Desta vez restaram 2 arquivos — com extensões ‘.jpg’ e ‘.jpg.bz2’.
Note que o arquivo resultante ficou 1K maior do que o original.
Isto se deve ao fato de que arquivos JPEG já são comprimidos.
Neste caso, além de não ter sido possível obter uma taxa de compressão maior, somou-se ao arquivo resultante as informações do bzip2.
Por isto ele ficou maior.
Você irá obter resultados bem melhores sobre arquivos de texto ou de áudio FLAC, por exemplo.

Como descompactar e testar meus arquivos bz2

Para descomprimir (inflar) seus arquivos, use o bunzip2 ou ‘bzip2 -d’:


bzip2 -dv woman-drinking-cup-of-coffee.jpg.bz2

bzip2: Output file woman-drinking-cup-of-coffee.jpg already exists.

Como o arquivo original ‘woman-drinking-cup-of-coffee.jpg’ já existia, obtive a mensagem acima ‘Output file woman-drinking-cup-of-coffee.jpg already exists‘ — “O arquivo de saída … já existe”.
Se quiser forçar a extração, neste caso, use ‘-f’:


bzip2 -dvf woman-drinking-cup-of-coffee.jpg.bz2

Use ‘-tv’ para testar um ou vários arquivos bz2:


bzip2 -tv woman-drinking-cup-of-coffee.jpg.bz2 

woman-drinking-cup-of-coffee.jpg.bz2: ok

Mais adiante, vamos abordar novamente o uso de ‘-t’.

Como usar o bzip2, quando os recursos do sistema estão escassos

Em ambiente servidor pode ser difícil encontrar “uma folga” no tempo do processador ou no espaço disponível na memória RAM do sistema.
Ficar sem backup, justamente nestes casos, não é uma opção.
Aplicar o --small ou ‘-s’ faz com que o aplicativo realize o seu trabalho com menor consumo de memória.
Segue um exemplo de uso:


bzip2 -sv Screenshot_20170*

  Screenshot_20170619-092621.png:  1.005:1,  7.963 bits/byte,  0.47% saved, 2090633 in, 2080882 out.
  Screenshot_20170619-092626.png:  1.000:1,  7.997 bits/byte,  0.04% saved, 2199528 in, 2198582 out.
  Screenshot_20170619-092823.png:  1.137:1,  7.036 bits/byte, 12.05% saved, 156600 in, 137732 out.

...

  Screenshot_20170706-164342.png:  1.134:1,  7.053 bits/byte, 11.84% saved, 128326 in, 113135 out.
  Screenshot_20170706-164407.png:  1.097:1,  7.292 bits/byte,  8.85% saved, 120458 in, 109795 out.
  Screenshot_20170706-164419.png:  1.141:1,  7.014 bits/byte, 12.33% saved, 97195 in, 85210 out.

A opção reduz o uso da memória durante a compressão, descompressão e teste.
Neste caso, é ativado um outro algoritmo, que requer 2,5 bytes por cada byte de bloco.
Com isto, qualquer arquivo pode ser inflado dentro de um espaço de 2300 kb, na memória RAM.
O custo: redução pela metade da velocidade de trabalho do aplicativo.
Durante o processo de descompressão, o ‘-s’ seleciona blocos de 200 kb, limitando o uso de memória ao mesmo valor — com a consequente redução da taxa de compressão.

A documentação manda usar ‘-s’ em sistemas com 8 Mb de memória RAM livres ou menos.
Mas você pode usar o recurso em outras situações que julgar adequado.

Como recuperar arquivos bzip2 danificados

Acidentes podem ocorrer durante uma transferência e você pode acabar com arquivos compactados importantes corrompidos.
O bzip2 comprime em blocos, usualmente, com 900 Kb — cada qual é manipulado independentemente pelo utilitário.
Se uma mídia danificada ou um erro de transmissão causar dano a um ou mais blocos, ainda é possível recuperar o conteúdo a partir dos dados armazenados nos blocos saudáveis.

O bzip2recover é um programa simples com o propósito de varrer blocos dentro de arquivos .bz2 e gravar cada bloco em outro arquivo .bz2.
Os arquivos resultantes podem ser verificados com a opção ‘-t’ e, se for o caso, descomprimidos.
Veja um exemplo:


bzip2recover woman-drinking-cup-of-coffee.jpg.bz2 

bzip2recover 1.0.6: extracts blocks from damaged .bz2 files.
bzip2recover: searching for block boundaries ...
   block 1 runs from 80 to 297425
bzip2recover: splitting into blocks
   writing block 1 to `rec00001woman-drinking-cup-of-coffee.jpg.bz2' ...
bzip2recover: finished

Em seguida, rode o teste:


bzip2 -tv rec00001woman-drinking-cup-of-coffee.jpg.bz2 

  rec00001woman-drinking-cup-of-coffee.jpg.bz2: ok

Este é o procedimento básico de recuperação pelo bzip2 de um arquivo danificado.

Compactação com criptografia

Segurança implica em criptografia, em muitos casos.
O bzip2 pode ser usado em conjunto com a ferramenta de criptografia GnuPG.
Para obter este resultado, você pode invocar a compressão com o bzip2 do próprio gpg:


gpg --output ssp2.html.gpg.bz2 --bzip2-compress-level 1 -cv ssp2.html

gpg: pinentry launched (11802 gnome3 1.0.0 ? ? ?)
gpg: pinentry launched (11809 gnome3 1.0.0 ? ? ?)
gpg: using cipher AES
gpg: writing to 'ssp2.html.gpg.bz2'

Veja o que foi feito:

  • gpg --output ssp2.html.gpg.bz2 — a execução pede para gerar um arquivo de saída, criptografado, com o nome ‘ssp2.html.gpg.bz2’.
  • --bzip2-compress-level 1 — especifica o método e o nível de compressão a ser usado.
  • -cv — indica explicitamente a criptografia (-c) e verbosidade (-v).

O valor de --bzip2-compress-level pode variar de 0 (nenhuma compressão) a 9 (máxima compressão).
Acima, usei o valor 1, para tornar o procedimento mais célere.
Para reverter, use o gpg assim:


gpg --output ssp2.html -dv --bzip2-decompress-lowmem ssp.html.gpg.bz2

gpg: AES encrypted data
gpg: pinentry launched (11769 gnome3 1.0.0 ? ? ?)
gpg: encrypted with 1 passphrase
gpg: original file name='ssp.html'

O que há de diferente?
Desta vez, usamos a opção ‘-d’ e --bzip2-decompress-lowmem para indicar que é para descomprimir um arquivo, com o uso do bzip2.

Como comprimir arquivos no Linux, usando o comando gzip

O comando gzip oferece um dos meios mais eficientes de comprimir arquivos, no Linux.
O gzip faz uso do Lempel-Ziv ou lz77 que, além de ser eficaz na redução do pacote final, promove uma metodologia de compressão lossless, ou seja, sem perda de informações.
gzip oficial logo

O LZ77 e o LZ78 são dois algoritmos de compressão lossless, publicados por Abraham Lempel e Jacob Ziv, em 1977 e 1978.
São também conhecidos por LZ1 e LZ2, respectivamente. Ambos formam a base para outras variações, o que inclui os LZW, LZSS, LZMA etc.
Além da influência no meio acadêmico, estes algoritmos formaram a base de vários importantes e ubíquos esquemas de compressão, tais como o GIF (imagens) e o algoritmo deflacionário usado nas imagens PNG.

O gzip é um comando muito usado na compressão de arquivos e diretórios no Linux — diretamente ou dentro de scripts (de backup, por exemplo). Com toda certeza, vale a pena conhecer melhor o seu uso.
Ao final do artigo, há um link para o site data-compression, onde é possível obter mais informações sobre o algoritmo.
A animação, que segue, demonstra a aplicação do método LZ1/LZ2 de compressão:
lempelziv animation
Além disto, entre os programas de (de)compressão, este é padrão e costuma estar presente em quase todas as distribuições GNU/Linux.

Como usar o gzip, na linha de comando do Linux

Como comportamento padrão, quando comprimimos um arquivo ou pasta, usando o comando gzip, o resultado será um arquivo com o mesmo nome, acrescido da extensão .gz.
Para comprimir um simples arquivo, use o gzip na linha de comando, assim:

gzip arquivo

O mesmo vale para um arquivo do LibreOffice:

gzip documento.odt 
ls doc*

documento.odt.gz

Como você pode ver, no exemplo acima, o nome do arquivo foi acrescido da extensão .gz, logo após sua original .odt.
Alguns arquivos irão ter taxas de compressão melhores do que outros.
Documentos de texto, imagens bitmap, arquivos de áudio WAV e FLAC, entre outros, costumam alcançar boas taxas de compressão.
Por outro lado, arquivos de compressão lossy, que já sofreram perda de dados, como imagens JPEG e áudio MP3, terão péssimas taxas de compressão. Na verdade, o resultado final pode acabar sendo um arquivo maior — uma vez que passarão a carregar informações adicionadas pelo gzip.

Como descomprimir arquivos gzip

Se você tem um arquivo que já tenha sido comprimido via gzip, use o comando acompanhado da opção ‘-d’ (descomprimir) para reverter o processo anterior.
Veja um exemplo:

gzip -d documento.odt.gz 
ls doc*

documento.odt

Como forçar o gzip a comprimir um arquivo

Quando não houver ganho na compressão de algum arquivo, o gzip pode “se recusar” a fazer o serviço.
Se você pretende insistir na tarefa, use a opção ‘-f’ para forçar o gzip a prosseguir.
No exemplo, que segue, acompanhe o que é feito, através dos comentários, precedidos pelo símbolo #:

# Verificação do tamanho original do arquivo BackCover.jpg.gz
ls -l BackCover.jpg.gz 
-rw-r--r-- 1 justincase justincase 76646 Ago 29 18:22 BackCover.jpg.gz

# Ao tentar comprimir o arquivo o programa avisa que ele já tem a extensão .gz
gzip BackCover.jpg.gz 
gzip: BackCover.jpg.gz already has .gz suffix -- unchanged

# Para prosseguir, use a opção -f
gzip -f BackCover.jpg.gz 

# Note que o arquivo final passou a ter 50 bytes a mais
ls -l BackCover.jpg.gz.gz 
-rw-r--r-- 1 justincase justincase 76696 Ago 29 18:22 BackCover.jpg.gz.gz

Se quiser, faça suas próprias experiências, antes de prosseguir.

Como manter o arquivo original e aplicar a compressão a uma cópia

Para manter o arquivo original e criar um novo arquivo comprimido, use a opção ‘-k’:

gzip -k cartaz.jpg
ls -l cartaz.*
-rw-r--r-- 1 justincase justincase 76965 Ago 29 18:22 cartaz.jpg
-rw-r--r-- 1 justincase justincase 76643 Ago 29 18:22 cartaz.jpg.gz

Como obter estatísticas de compressão do gzip

O objetivo de se comprimir arquivos é economizar espaço de armazenamento e/ou obter transferências mais eficientes, na rede.
Seria interessante, portanto, obter algumas estatísticas sobre a eficiência de compressão sobre os arquivos.
Para ter uma idéia da eficiência da compressão de um arquivo, use a opção ‘-l’:

gzip -l cartaz.jpg.gz 

O que se vê, como resultado, é o tamanho original do arquivo, seu tamanho comprimido, a taxa de compressão obtida pelo gzip e, por fim, o nome original do arquivo:

         compressed        uncompressed  ratio uncompressed_name
              76643               76965   0.5% cartaz.jpg

Dá para comprimir pastas com o gzip?

Se você quiser comprimir uma pasta inteira, para dentro de um único pacote, o ideal é usar o comando tar — por que o gzip irá comprimir cada arquivo, individualmente, não a pasta inteira, como um pacote.
Além disto, ele não aceita compactar o diretório. Veja:

gzip textos/
gzip: textos/ is a directory -- ignored

Para compactar os arquivos dentro do diretório – recursivamente, portanto –, é necessário usar a opção ‘-r’:

gzip -r textos/

O resultado é o que segue:

ls -l textos/
total 20
-rw-r--r-- 1 justincase justincase 145 Ago 30 11:18 texto1.txt.gz
-rw-r--r-- 1 justincase justincase 145 Ago 30 11:20 texto2.txt.gz
-rw-r--r-- 1 justincase justincase 145 Ago 30 11:20 texto3.txt.gz
-rw-r--r-- 1 justincase justincase 145 Ago 30 11:20 texto4.txt.gz
-rw-r--r-- 1 justincase justincase 145 Ago 30 11:20 texto5.txt.gz

Como verificar se o gzip obteve sucesso no procedimento

Se você usa o gzip, dentro de um processo de backup, pode verificar a integridade de cada arquivo comprimido com a opção ‘-t’:

gzip -tv textos/*
textos/texto1.txt.gz:    OK
textos/texto2.txt.gz:    OK
textos/texto3.txt.gz:    OK
textos/texto4.txt.gz:    OK
textos/texto5.txt.gz:    OK

Note que adicionei o ‘v’ às opções do comando. Do contrário, ele não retornaria resultados, a menos que houvesse erros. Isto seria útil dentro de um script.
Por fim, é possível controlar a taxa de compressão, adicionando um valor númerico, como opção — de 1 a 9.
Para obter a taxa de compressão máxima, use o valor 9.
Na “brincadeira”, abaixo, o arquivo foi compactado com a opção ‘-1’, primeiro (que é a taxa de compressão mais baixa) e depois, com a taxa de compressão mais alta. Enquanto isto, foi verificada a estatística de compressão de cada um, com a opção ‘-l’:

# compactando com a taxa mais baixa
gzip -1 documento.odt 
# obtendo estatísticas
gzip -l documento.odt.gz 
         compressed        uncompressed  ratio uncompressed_name
                159                 685  81.5% documento.odt

# descomprimindo o arquivo
gzip -d documento.odt.gz 
# compactando com a taxa mais alta
gzip -9 documento.odt 
# obtendo estatísticas
gzip -l documento.odt.gz 
         compressed        uncompressed  ratio uncompressed_name
                158                 685  81.6% documento.odt


Não use o programa gzip com arquivos ZIP. Para este tipo de arquivo, existem aplicativos apropriados: o zip e o unzip, por exemplo.

Referências

https://en.wikipedia.org/wiki/LZ77_and_LZ78.
http://www.data-compression.com/lempelziv.html.
http://linux.about.com/od/commands/fl/Example-Uses-Of-The-Linux-gzip-Command.htm?utm_content=7489444&utm_medium=email&utm_source=exp_nl&utm_campaign=list_linux&utm_term=.

Como obter melhor desempenho do swap no seu sistema com o zswap.

O ZSWAP é um sistema de cache leve e comprimido para páginas da memória swap.
Ele pega páginas que estão prestes a ser movidas para o swap e as comprime em um pool de memória dinamicamente alocado na RAM.
O zswap é um recurso que pode ser útil a alguns usuários e ainda não foi testado em um número consistente de configurações — e deve ser considerado como experimental, portanto.
Entre os potenciais benefícios obtidos com o seu uso, citam-se:

  1. Usuários de máquinas com capacidade de memória física (RAM) limitada, podem reduzir o impacto que o uso do swap causa na performance do sistema.
  2. Máquinas virtuais que compartilham os mesmos recursos de E/S podem reduzir drasticamente a pressão da concorrência pelo uso do swap.
  3. Usuários de drives ou partições SSD, dedicadas ao swap, podem estender a vida útil de seus dispositivos, uma vez que este recurso reduz a necessidade constante de escrita.

Em troca de um uso mais intenso de ciclos da CPU, o zswap reduz o fluxo de E/S no swap.
Esta relação pode trazer uma melhora significativa na performance do sistema — isto é, se a leitura do cache comprimido for mais rápida que a leitura de um dispositivo swap.

Como verificar se posso usar o zswap no meu sistema

Este recurso já está presente na maioria das distribuições GNU/Linux e, portanto, só precisa ser ativado.
Os arquivos de configuração podem ser encontrados em /sys/module/zswap.
arquivos de configuração do zswap.
Se este diretório existe, então o recurso também estará presente e poderá ser ativado e usado.
Pode ser habilitado no runtime, com uma única linha de comando — como veremos, a seguir.
A partir daí, ele passa a armazenar as páginas swapeadas pelo sistema.
A qualquer momento você também pode desabilitá-lo. Quando isto acontece, ele simplesmente para de receber as páginas de swap e vai se esvaziando, à medida em que seu conteúdo perca sua validade ou seja transferido de volta à memória.
Se houver a necessidade de esvaziar imediatamente o conteúdo do swap, sempre é possível executar o comando swapoff — conforme ensinamos aqui.

Como verificar as suas configurações atuais de zswap

As configurações atuais (runtime) podem ser vistas no diretório /sys/module/zswap/parameters/, dentro de seus respectivos arquivos.
Captura de tela da configuração do zswap
Use os comandos abaixo para verificar de que forma o zswap se encontra configurado no seu sistema:

ls -lah /sys/module/zswap/parameters/; cat /sys/module/zswap/parameters/*
total 0
drwxr-xr-x 2 root root    0 Mar 16 10:42 .
drwxr-xr-x 3 root root    0 Mar 16 10:42 ..
-rw-r--r-- 1 root root 4,0K Mar 16 10:42 compressor
-rw-r--r-- 1 root root 4,0K Mar 16 10:42 enabled
-rw-r--r-- 1 root root 4,0K Mar 16 10:42 max_pool_percent
-rw-r--r-- 1 root root 4,0K Mar 16 10:42 zpool

lzo
N
20
zbud

A primeira parte da listagem exibe os arquivos contidos no diretório /sys/module/zswap/parameters/ e a segunda parte exibe o conteúdo de cada arquivo, respectivametne:

  • compressor — abriga o método de compressão usado. Pode ser LZO ou LZ4.
    O ajuste padrão é LZO, que usa uma taxa de compressão menor e, portanto, oferece mais velocidade ao processo.
  • enabled — indica quando o zswap esta habilitado (enabled) ou desabilitado (disabled).
    Os valores podem ser:

    • 0 ou N: para desabilitado (padrão)
    • 1 ou Y: para habilitado
  • max_pool_percent — delimita a quantidade máxima de memória que pode ser utilizada pelo pool de compressão.
  • zpool — determina o tipo de zpool a ser usado. O padrão é zbud — que aloca exatamente 1 página para armazenar 2 páginas comprimidas, o que implica em uma taxa de compressão de 2:1 ou “pior” (uma vez que o zbud pode não preencher completamente cada página).

O que é o zbud e o zpool

O zbud é um dispositivo do sistema, com o propósito especial de armazenar páginas comprimidas (“zpages“) na memória.
Projetado para armazenar até 2 páginas comprimidas por página em memória física.
Embora esta abordagem traga limitações à densidade de armazenamento, é mais eficiente no final das contas.
O zpool é um alocador de memória especial para zpages.
Os pools de memória permitem que softwares possam reservar, acessar e liberar blocos de memória representados por handles em runtime.
Este recurso é usado por vários algoritmos de compressão.

Como ativar o zswap

O zswap faz uso uso do zpool para gerenciar o pool de memória comprimida.
O pool se expande de acordo com a demanda do sistema. Ele também se contrai à medida em que páginas comprimidas são liberadas.
Se você alterar os parâmetros, no runtime, o zswap não apaga o que foi feito. Ele apenas passa a trabalhar de acordo com os novos parâmetros.
Para ativar o zswap, no kernel runtime, basta mudar o arquivo ‘enabled’:

echo '1' > /sys/module/zswap/parameters/enabled 

Para desativar, edite o comando acima, mudando o valor 1 para 0:

echo '0' > /sys/module/zswap/parameters/enabled 

Da mesma forma, é possível alterar os outros parâmetros, através dos arquivos correspondentes.
As alterações terão efeito apenas para a sessão atual. Ao desligar e ligar a máquina, seus valores voltam ao padrão.

Outras formas de habilitar o zswap no Linux

Para escrever este artigo, usei uma máquina Debian 8.3 “Jessie”. Não testei o recurso em outras distribuições — mas é razoável acreditar que irá funcionar do mesmo jeito no Ubuntu e em outras distro baseadas no Debian.
Você pode também ativar o zswap no menu do GRUB, na inicialização do sistema:

  1. Pressione a tecla Shift, durante o boot, para entrar no menu do GRUB.
  2. Edite a linha de comando, incluindo zswap.enabled=1 ao final dela.
  3. Pressione a tecla F10 para retomar a inicialização do Linux.

Se você tem intimidade com a configuração do GRUB, pode editá-lo e incluir o parâmetro zswap.enabled=1 ao final da entrada GRUB_CMDLINE_LINUX_DEFAULT.

Referências

https://www.kernel.org/doc/Documentation/vm/zswap.txt.
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4e2e2770b1529edc5849c86b29a6febe27e2f083.
http://dcjtech.info/topic/the-linux-kernels-compressed-memory-pages/.
https://www.ibm.com/developerworks/community/blogs/fe313521-2e95-46f2-817d-44a4f27eba32/entry/new_linux_zswap_compression_functionality7?lang=en.
https://bbs.archlinux.org/viewtopic.php?id=169585.

Diferenças entre os sistemas de arquivos Ext4 e Btrfs

O sistema de arquivos Btrfs foi lançado no final de Julho de 2013 — é um sistema de arquivos relativamente novo, escrito do zero e que ainda está provando a que veio.
Surgiu da necessidade dos desenvolvedores de ter um sistema que incluísse pooling, snapshots e checksums, entre outros recursos — presentes também no ZFS.
ext4 vs btrfs

A pronúncia do nome, em inglês, é alvo de uma (bem leve) polêmica.
Pode ser Butter FS, Better FS ou B-Tree FS — sendo que, este último, está mais próximo do nome original.

Diferenças básicas entre o Ext4 e o Btrfs

Já que muitos usuários Linux, que desejam experimentar o novo sistema, vêm do Ext4, faz sentido enumerar alguns pontos que realçam as diferenças entre os dois:

  • O Ext4 ainda é a melhor escolha, no desktop do usuário comum — por ser mais rápido na transferência de arquivos e por ser mais maduro
  • O Btrfs tem vários recursos, que são novidades, tais com o Copy-on-Write, snapshots, checksums extensivos, scrubbing, duplicação dos dados, informações de autocorreção (self-healing) etc.
  • Os recursos de RAID-Z, presentes no ZFS, ainda são experimentais, neste momento, no Btrfs.
  • O Btrfs é fruto de um esforço patrocinado pela Oracle Corporation, Fujitsu e Red Hat — abaixo, há uma relação mais completa.
  • O Ext4 foi desenvolvido por Mingming Cao, Andreas Dilger, Alex Zhuravlev (Tomas), Dave Kleikamp, Theodore Ts’o, Eric Sandeen, Sam Naghshineh, entre outros.
  • O Btrfs tem suporte no Linux; O Ext4 tem suporte nativo no Linux, no FreeBSD e no Android.

O Btrfs faz parte da nova geração de sistemas de arquivos do Linux, projetada para tirar o máximo dos novos dispositivos e métodos de armazenamento, como as unidades SSD.
Se você está acostumado a usar LVM e RAID para gerenciar os seus dados, o Btrfs está pronto para substituí-los.
O snapshot é um conceito semelhante à captura de telas com o PrtScr.
O recurso consiste em fazer uma cópia em imagem de um subvolume Btrfs em um determinado ponto no tempo — o que é muito mais rápido do que um backup tradicional e não implica em parar o sistema.
Você pode tirar snapshots do seu sistema quando quiser — o mais comum é fazê-lo antes de instalar algum novo programa ou fazer alterações significativas.
Este recurso permite voltar “no tempo”, se algo der errado.

A lista atual de empresas que contribuem para o código do Btrfs, é a seguinte:

  • Facebook
  • Fujitsu
  • Fusion-IO
  • Intel
  • Linux Foundation
  • Netgear
  • Novell/SUSE
  • Oracle
  • Red Hat
  • STRATO AG

Quais são os recursos disponíveis no Btrfs

À medida em que as unidades de armazenamento vão aumentando suas capacidades e os SSD caminham para se tornar padrão de mercado, espera-se que os sistemas de arquivos façam sua escalada para atender às novas demandas que a tecnologia impõe.

No artigo Introdução ao sistema de arquivos Btrfs, explicamos, com maior riqueza de detalhes, os recursos presentes no sistema.

Até o momento, a capacidade do Btrfs, inclui os seguintes itens:

  • Capacidade de armazenamento de arquivos com tamanhos de até 2^64 byte == 16 EiB (Em função do VFS do Linux, o limite prático é 8 EiB)
  • Empacotamento de arquivos pequenos, para fazer uso eficiente do espaço.
  • Diretórios indexados, também para uso eficiente do espaço.
  • Alocação dinâmica de inodes.
  • Um snapshot pode ser alterável (writable) ou não (read-only).
  • Suporte a subvolumes — sistemas de arquivos raiz internos e separados.
  • Checksums sobre dados e metadados (crc32c)
  • Compressão por algoritmos zlib ou LZO.
  • Suporte a dispositivos múltiplos integrados.
  • Recursos de detecção de armazenamento em SSD ou flash — com suporte nativo a TRIM/Discard, com relatório de blocos livres para reuso.
  • Backup incremental eficiente.
  • Processo de limpeza (scrub) em background para encontrar e corrigir erros em arquivos com cópias redundantes.
  • Desfragmentação online.
  • Verificação do sistema de arquivos offline.
  • Conversão local de sistemas de arquivos Ext3 ou Ext4.
  • Dispositivos semente ou semeadores — Em inglês, são chamados seed devices.
    Refere-se a capacidade de criar sistemas de arquivos (apenas de leitura) que funcionam como moldes para criar outros sistemas de arquivos Btrfs.
  • Suporte a quota em subvolumes.
  • Relatórios de mudanças em subvolumes.
  • Espelhamento incremental eficiente de sistemas de arquivos.

Outros recursos estão em desenvolvimento para o sistema, o que inclui:

  • Checagem offline e mais rápida do sistema de arquivos.
  • Checagem online do sistema de arquivos.
  • Remoção e espelhamento no nível do objeto.
  • Algoritmos de checksum alternativos.
  • Deduplicação in-band (ocorre durante as gravações).
  • Adição de outros algoritmos de compressão: Snappy, LZ4.

Referências

https://help.ubuntu.com/community/btrfs.
https://btrfs.wiki.kernel.org/index.php/Main_Page.
http://www.differencebtw.com/difference-between-btrfs-and-ext4/.

Como otimizar imagens com o jpegtran

O jpegtran é um utilitário de linha de comando para transformação de arquivos de imagem JPEG, com o mínimo de perda de qualidade.
Nas distribuições Linux Debian 8.2 “Jessie” e no Ubuntu 16.04 LTS “Xenial Xerus” o pacote libjpeg-progs já se encontra instalado.
Se este não for o seu caso, é possível baixar e instalar o programa dos repositórios.
No Ubuntu ou em qualquer outra distro baseada no Debian, use o apt ou o apt-get para fazer a instalação:

sudo apt install libjpeg-progs

Como é possível ver (pelo nome do pacote), trata-se de um conjunto de programas:

  • cjpeg/djpeg — converte arquivos de imagens de outros formatos (especialmente PNM e targa para JPEG e vice-versa
  • rdjpgcom/wrjpgcom — lê/altera a sessão de comentários dentro dos arquivos JPEG
  • jpegtran — transformação sem perda de arquivos JPEG
  • jpegexiforient/exifautotran — manipula a tag de orientação da imagem, dentro do EXIF

No decorrer do texto, vou mostrar como otimizar suas imagens, fazendo uso do jpegtran.
Em seguida, vou mostrar como reduzir o peso de maneira mais significativa e eficiente com o uso da dupla djpeg e cjpeg.

Otimizar suas imagens, antes de fazer o upload, é fundamental para evitar que causem impacto negativo no tempo de carregamento.
A regra é nunca fazer upload de imagens sem tratamento pro seu site.

Este procedimento é fundamental para quem tem um site ou blog e deseja mantê-lo o mais enxuto e eficiente para carregar para seus leitores.

O que o jpegtran faz com suas imagens

O aplicativo executa várias transformações úteis em seus arquivos JPEG.
Ele pode traduzir a representação codificada de um tipo de JPEG para outro — por exemplo, pode transformar um arquivo comum para JPEG progressivo ou vice-versa.
O jpegtran pode alterar certos dados dos seus arquivos de imagem, como a sua orientação: de retrato para paisagem, por exemplo.
O programa trabalha rearranjando os dados comprimidos (DCT coefficients), sem precisar decodificar completamente a imagem — por isto, ele é capaz de fazer transformações sem perda de qualidade (lossless transformation).
Já, com o uso do djpeg (descompressão), seguido do cjpeg (compressão), para obter a mesma conversão, já vai ocorrer perda da qualidade na imagem.
Você vai encontrar mais informações sobre o uso do aplicativo no manual. Na linha de comando, é possível obter informações sobre como usar:

jpegtran -h

Exemplos de uso do jpegtran

Vamos ver alguns exemplos práticos de uso do aplicativo, que podem ser úteis no seu dia a dia.
Para converter uma imagem não-progressiva para progressiva, use os seguintes parâmetros:

jpegtran -progressive Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg > Mercedes-optimized.jpg

No exemplo acima, o primeiro arquivo é o original e o segundo é o novo, criado com as novas alterações.
Use a opção ‘-optimize’, para otimizar seus arquivos:

jpegtran -verbose -optimize Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg > Mercedes-optimized.jpg

Como acrescentei a opção ‘-verbose’, o programa mostra informações detalhadas do trabalho em execução:

libjpeg-turbo version 1.3.1 (build 20150308)
Copyright (C) 1991-2012 Thomas G. Lane, Guido Vollbeding
Copyright (C) 1999-2006 MIYASAKA Masaru
Copyright (C) 2009 Pierre Ossman for Cendio AB
Copyright (C) 2009-2014 D. R. Commander
Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies)

Emulating The Independent JPEG Group's software, version 6b  27-Mar-1998

Start of Image
Miscellaneous marker 0xe1, length 22752
Define Quantization Table 0  precision 0
Define Quantization Table 1  precision 0
Define Huffman Table 0x00
Define Huffman Table 0x10
Define Huffman Table 0x01
Define Huffman Table 0x11
Start Of Frame 0xc0: width=3264, height=2448, components=3
    Component 1: 2hx1v q=0
    Component 2: 1hx1v q=1
    Component 3: 1hx1v q=1
Start Of Scan: 3 components
    Component 1: dc=0 ac=0
    Component 2: dc=1 ac=1
    Component 3: dc=1 ac=1
  Ss=0, Se=63, Ah=0, Al=0
End Of Image

Para ver se houve alteração no tamanho da imagem:

ls -l

Como você pode ver, abaixo, a redução no tamanho foi mínima:

total 5644
-rw-r--r-- 1 justincase justincase 2925612 Dez  7 11:32 Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg
-rw-r--r-- 1 justincase justincase 2849006 Dez  7 16:08 Mercedes-optimized.jpg

Para obter uma cópia em escala de cinza, use a opção ‘-grayscale’:

jpegtran -grayscale Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg > Mercedes-optimized.jpg
ls -l

Este tipo de medida costuma trazer resultados mais claros para reduzir o tamanho de um arquivo:

total 4896
-rw-r--r-- 1 justincase justincase 2925612 Dez  7 11:32 Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg
-rw-r--r-- 1 justincase justincase 2080959 Dez  7 16:38 Mercedes-optimized.jpg

Como obter redução significativa no tamanho do arquivo JPEG

Para obter uma redução maior da sua imagem, use a dupla djpeg/cjpeg para descomprimir e descomprimir novamente.
Funciona assim:

djpeg imagem_original.jpg > imagem_descomprimida.jpg
cjpeg image_descomprimida.jpg > imagem_final.jpg
_

Neste caso, vai haver perda da qualidade da imagem — mas é razoavelmente pequena. O ganho com a redução do tamanho é maior.
Na listagem, que segue, temos 4 exemplos de uma imagem:

ls -lh Mercedes*
_
-rw-r--r-- 1 justincase justincase 2,8M Dez  7 11:32 Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg
-rw-r--r-- 1 justincase justincase 666K Dez  7 16:47 Mercedes-comprimido.jpg
-rw-r--r-- 1 justincase justincase  23M Dez  7 16:46 Mercedes-descomprimido.jpg
-rw-r--r-- 1 justincase justincase 2,8M Dez  7 16:45 Mercedes-optimized.jpg
  • O primeiro arquivo é o original (2,8 Mb);
  • o terceiro foi descomprimido a partir do original (23 Mb);
  • o segundo foi comprimido a partir do terceiro (666 Kb) e
  • o último foi apenas otimizado a partir do original.

Veja a imagem original:

… e a cópia comprimida:

Consegue perceber as diferenças entre as 2 imagens?
Se você ainda estiver insatisfeito com o tamanho do arquivo comprimido, é possível repetir o processo de descomprimir/comprimir e reduzir ainda mais o seu tamanho.

Referências

Crédito da imagem: Thomas Bersey.