Eu tenho seis volumes lógicos do Linux que, juntos, apoiam uma máquina virtual. Atualmente, a VM está desligada, portanto é fácil capturar imagens consistentes delas.
Eu gostaria de agrupar todas as seis imagens em um arquivo. Trivialmente, eu poderia fazer algo assim:
cp /dev/Zia/vm_lvraid_* /tmp/somedir
tar c /tmp/somedir | whatever
Mas é claro que isso cria uma cópia extra. Eu gostaria de evitar a cópia extra.
A abordagem óbvia:
tar c /dev/Zia/vm_lvraid_* | whatever
não funciona, pois o tar reconhece os arquivos como especiais (neste caso, os links simbólicos) e basicamente os armazena ln -s
no arquivo morto. Ou, com --dereference
ou diretamente apontado /dev/dm-X
, ele os reconhece como especiais (arquivos de dispositivo) e basicamente os armazena mknod
no arquivo morto.
Procurei opções de linha de comando para tar para substituir esse comportamento e não consegui encontrar nenhuma. Também tentei o cpio
mesmo problema e também não encontrei nenhuma opção para substituí-lo. Eu também tentei 7z
(idem). O mesmo com pax
. Eu até tentei zip
, o que ficou confuso.
edit: Examinando o código fonte do GNU tar e GNU cpio, parece que nenhum deles pode fazer isso. Pelo menos, não sem truques sérios (o tratamento especial dos arquivos do dispositivo não pode ser desativado). Portanto, sugestões de truques sérios seriam apreciadas ou utilidades alternativas.
TLDR: Existe algum arquivador que agrupe várias imagens de disco (extraídas de dispositivos brutos) e transmita essa saída, sem fazer cópias extras em disco? Minha preferência seria de saída em um formato comum, como POSIX ou GNU tar.
fonte
Respostas:
Então, recentemente, eu queria fazer isso
tar
. Alguma investigação me indicou que era mais do que um pouco absurdo que eu não podia. Eu inventei essasplit --filter="cat >file; tar -r ..."
coisa estranha , mas, bem, era terrivelmente lenta. E quanto mais eu leio,tar
mais absurdo parecia.Você vê,
tar
é apenas uma lista concatenada de registros. Os arquivos constituintes não são alterados de forma alguma - eles estão inteiros no arquivo morto. Mas eles são bloqueados nos limites do bloco de 512 bytes e, precedendo cada arquivo, existe um cabeçalho . É isso aí. O formato do cabeçalho também é muito, muito simples.Então, eu escrevi o meu
tar
. Eu chamo-lhe ...shitar
.Essa é a carne e as batatas, na verdade. Ele escreve os cabeçalhos e calcula o chksum - que, relativamente falando, é a única parte difícil. Faz o
ustar
formato do cabeçalho ... talvez . Pelo menos, emula o que o GNUtar
parece pensar que é oustar
formato do cabeçalho, a ponto de não reclamar. E tem mais, é que eu ainda não coagulei ainda. Aqui, eu vou te mostrar:É isso
tar
. Tudo está preenchido com\0
valores nulos, então eu apenas me transformoem
em\n
ewlines para facilitar a leitura. Eshitar
:RESULTADO
Eu digo tipo lá em cima porque esse não
shitar
é o objetivo -tar
já faz isso lindamente. Eu só queria mostrar como ele funciona - o que significa que eu preciso tocar nochksum
. Se não fosse por isso, eu estariadd
saindo do cabeçalho de umtar
arquivo e pronto. Às vezes, isso pode até funcionar, mas fica confuso quando há vários membros no arquivo. Ainda assim, o chksum é realmente fácil.Primeiro, faça 7 espaços - (que é uma coisa estranha de gnu, eu acho, como a especificação diz 8, mas tanto faz - um hack é um hack) . Em seguida, adicione os valores octais de cada byte no cabeçalho. Esse é o seu chksum. Portanto, você precisa dos metadados do arquivo antes de executar o cabeçalho ou não possui um chksum. E isso é um
ustar
arquivo, principalmente.Está bem. Agora, o que se pretende fazer:
Isso cria três imagens de disco de 500M, formata e monta cada uma e grava um arquivo em cada uma.
Nota - aparentemente os dispositivos de bloqueio sempre bloqueiam corretamente. Muito útil.
Esse
tar
é o conteúdo dos arquivos do dispositivo de disco in-stream e canaliza a saída paraxz
.Agora, o momento da verdade ...
Viva! Extração...
Comparação...
E o monte ...
E assim, neste caso,
shitar
executa bem, eu acho. Eu prefiro não entrar em todas as coisas que não farão bem. Mas eu direi - não faça novas linhas nos nomes de arquivos pelo menos.Você também pode fazer - e talvez deva, considerando as alternativas que eu ofereci - com isso
squashfs
. Você não apenas constrói o único arquivo morto a partir do fluxo, mas também émount
capaz e incorporado aos arquivos do kernelvfs
:No pseudo-arquivo.exemplo :
Você também pode usar
btrfs (send|receive)
para transmitir um subvolume para ostdin
compressor que você gosta. Esse subvolume não precisa existir antes de você decidir usá-lo como contêiner de compactação, é claro.Ainda assim, sobre
squashfs
...Eu não acredito que estou fazendo isso justiça. Aqui está um exemplo muito simples:
Esse é apenas o
-p
argumento embutido paramksquash
. Você pode criar um arquivo-pf
contendo quantos deles desejar. O formato é simples - você define o nome / caminho de um arquivo de destino no novo sistema de arquivos, fornece um modo e um proprietário e, em seguida, informa sobre qual processo executar e ler o stdout. Você pode criar quantos quiser - e pode usar LZMA, GZIP, LZ4, XZ ... hmm, existem mais ... formatos de compactação que desejar. E o resultado final é um arquivo no qual vocêcd
.Mais sobre o formato:
Obviamente, isso não é apenas um arquivo morto - é uma imagem do sistema de arquivos Linux montável e compactada. Seu formato é do kernel do Linux - é um sistema de arquivos suportado pelo kernel vanilla. Dessa maneira, é tão comum quanto o kernel Linux vanilla. Portanto, se você me dissesse que estava executando um sistema vanilla Linux no qual o
tar
programa não estava instalado, eu ficaria duvidoso - mas provavelmente acreditaria em você. Mas se você me dissesse que estava executando um sistema Linux baunilha no qual osquashfs
sistema de arquivos não era suportado, eu não acreditaria em você.fonte
input f 444 root root dd if=/dev/sda1 bs=1024 count=10
é a entrada do arquivo? Talvez seja melhor criar um dispositivo de brinquedo, preenchê-lo com dados e escrever a partir dele? E tudo isso requer raiz?input
arquivo é um arquivo nosquashfs
arquivo morto - a imagem do sistema de arquivos resultante da execução do comando. Ao fazer isso,mksquash
você pode especificar esses comandos pseudofile para comandos executados e a partir dos quais elesstdout
são capturados no momento da compactação.Seu problema me intrigou por algum tempo e acho que encontrei uma solução que funcionaria.
Eu acho que você pode conseguir o que deseja com 7z usando a
-si{NAME}
bandeira.Você será capaz de se adaptar às suas necessidades.
EDIT : Remover o uso inútil de gato
fonte
7z
manual não menciona -si pode usar um nome de arquivo, mas funciona. Não é perfeito (a saída não pode ser canalizada em algum lugar), mas é definitivamente a melhor até agora que sai em um formato comum.