Concatenando Arquivos para um Arquivo Virtual no Linux

10

Em um sistema Linux, existe alguma maneira de concatenar uma série de arquivos em um arquivo exposto para leitura e gravação sem ocupar mais N bytes de espaço em disco? Eu estava esperando algo como montar esses arquivos via loopback / devmapper para fazer isso.

Eu tenho um problema em que há arquivos binários divididos que podem ficar muito grandes. Não quero duplicar meus requisitos de espaço com E / S de disco massiva apenas para ler / gravar temporariamente o conteúdo desses arquivos, catreunindo-os todos em um arquivo enorme.

Encontrei este projeto aqui , mas parece ter um caso de uso muito específico e também depende do perl

Ryan
fonte
Eu acho que o FUSE foi inventado para resolver esse tipo de problema. Provavelmente você precisa escrever seu próprio módulo, mas isso não deve ser muito difícil.
Hauke ​​Laging 14/03/2013

Respostas:

14

Você pode fazer isso combinando dispositivos de loop e mapeador de dispositivos, graças a "tudo é um arquivo". Mas com uma limitação: O tamanho do arquivo não pode ser alterado (pois você não pode aumentar os dispositivos de bloco gravando neles). Portanto, se você deseja anexar dados, é necessário criar um dispositivo de bloco maior e substituir os dados fictícios anexados.

# for testing, Create 4 files
echo foo | dd of=block0 cbs=512 conv=block
echo bar | dd of=block1 cbs=512 conv=block
echo bat | dd of=block2 cbs=512 conv=block
echo baz | dd of=block3 cbs=512 conv=block
# Create a loop device for each of the 4 files
losetup /dev/loop0 block0
losetup /dev/loop1 block1
losetup /dev/loop2 block2
losetup /dev/loop3 block3
# Create a device map named "test" using those loop devices
(
    echo "0 1 linear /dev/loop0 0"
    echo "1 1 linear /dev/loop1 0"
    echo "2 1 linear /dev/loop2 0"
    echo "3 1 linear /dev/loop3 0"
) | dmsetup create test
$EDITOR /dev/mapper/test # use overwrite mode only

Para estender o arquivo, você pode criar um grande arquivo esparso e usá-lo como dispositivo adicional.

Hauke ​​Laging
fonte
1

Isso pode ser feito usando o pipe nomeado no Linux.

Suponha que você tenha arquivos nomeados file0, file1, file2, file3, file4, file5

# create a name pipe
$ mkfifo mynewfile
# cat to named file
$ cat file{0..5} > mynewfile &

Em C programaticamente, você pode fazer

mkfifo(mynewfile , 0777);
system("cat file{0..5} > mynewfile");

Em seguida, use e use mynewfile como você leria do arquivo normal.

mynewfile é um arquivo FIFO

katta
fonte
0

Para leitura, você pode lessvários arquivos e, em seguida, usar as opções :ne :ppara percorrê-los.

Para escrever, sem acessar os arquivos diretamente, você não poderá gravá-los.

Você também pode ter vimvários arquivos, e ele passará pela ordem em que foram chamados (ou seja, vim fileA fileB fileC- arquivoB aberto após o arquivoA fechado, arquivoC aberto após o arquivoB fechado).

BriGuy
fonte