Concatenando arquivos para um arquivo virtual no Linux

9

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

Eu tenho um problema onde há arquivos binários divididos que podem ficar muito grandes. Eu não quero dobrar meus requerimentos de espaço com E / S massivo de disco apenas para temporariamente ler / gravar o conteúdo desses arquivos colocando cat todos juntos em um arquivo enorme.

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

    
por Ryan 14.03.2013 / 05:01

3 respostas

13

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 (já que você não pode aumentar os dispositivos de bloco escrevendo para eles). Portanto, se você deseja anexar dados, é necessário criar um dispositivo de bloco maior e substituir os dados simulados 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 arquivo grande e esparso e usá-lo como dispositivo adicional.

    
por 14.03.2013 / 07:04
1

Isso pode ser feito usando o pipe nomeado no Linux.

Suponha que você tenha arquivos com o nome 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, em seguida, use mynewfile como você lê no arquivo normal.

mynewfile é o arquivo FIFO

    
por 15.12.2017 / 21:58
0

Para leitura, você pode usar less de vários arquivos e, em seguida, usar as opções :n e :p para analisá-los.

Para escrever, sem acessar os arquivos diretamente, você não poderá escrever para eles.

Você também pode vim de vários arquivos, e ele apenas passará pela ordem em que foram chamados (por exemplo, vim fileA fileB fileC - fileB aberto após o fileA ser fechado, fileC aberto após o arquivoB ser fechado).

    
por 14.03.2013 / 06:03