Um arquivo virtual contendo a concatenação de outros arquivos

Um arquivo virtual contendo a concatenação de outros arquivos

Existe uma maneira de criar um objeto de sistema de arquivos semelhante a este:

mknod files p
cat file1 file2 ... fileN > files

mas tal que possa ser procurado, como se fosse um arquivo normal?

Responder1

Em sistemas operacionais baseados em Linux, isso pode ser feito com dispositivos de bloco de rede ou dispositivos mapeadores de dispositivos. O arquivo que você obtém é um dispositivo de bloco.

Com nbd:

ln -s /path/to/first-file file.0
...
ln -s /path/to/last-file file.19
nbd-server -C /dev/null -m 127.0.0.1:12345 file

sudo nbd-client localhost 12345 /dev/nbd0

(a concatenação é /dev/nbd0).

Com o mapeador de dispositivos (os tamanhos dos arquivos devem ser múltiplos de 512):

sudo losetup /dev/loop0 file1
sudo losetup /dev/loop1 file2
s0=$(sudo blockdev --getsize /dev/loop0)
s1=$(sudo blockdev --getsize /dev/loop1)
printf '%s\n' "0 $s0 linear /dev/loop0 0" "$s0 $s1 linear /dev/loop1 0" |
  sudo dmsetup create mybundle

(a concatenação é /dev/mapper/mybundle).

Responder2

escrevi um driver de fusível hoje, se alguém estiver interessado na solução de fusível (o mapeador de dispositivos, bem como a solução nbd acima, criarão dispositivos de bloco, não arquivos regulares - que serão quebrados, se você quiser usar a saída resultante diretamente com edição de vídeo software ou outras ferramentas que não estão preparadas para ler diretamente de um dispositivo de bloco)

https://github.com/schlaile/concatfs

Responder3

Você basicamente respondeu na primeira frase da pergunta: sim, isso pode ser feito. No entanto, você teria que escrever um driver de sistema de arquivos personalizado. Se for suposto ser um objeto do sistema de arquivos, ele deverá ser tratado pelo kernel em algum nível (que incluiFUSÍVEL). O driver teria que fornecer back-end para a API de syscalls do sistema de arquivos padrão ( stat(), open()etc., incluindo busca). Você não pode fazer isso inteiramente no espaço do usuário (pelo menos não com um kernel monolítico - mas mesmo com um microkernel você ainda precisará fornecer um driver de sistema de arquivos, embora rodando como um processo regular no espaço do usuário).

informação relacionada