Un file virtuale contenente la concatenazione di altri file


13

Esiste un modo per creare un oggetto filesystem simile a questo:

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

ma tale da poterlo cercare, come se fosse un file normale?

Risposte:


18

Su sistemi operativi basati su Linux, ciò può essere fatto con dispositivi a blocchi di rete o dispositivi di mappatura dei dispositivi. Il file che ottieni è un dispositivo a blocchi.

Con 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

(la concatenazione è /dev/nbd0).

Con Device Mapper (le dimensioni dei file devono essere multiple di 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

(la concatenazione è /dev/mapper/mybundle).


8

ha scritto un driver per fusibili oggi, se qualcuno è interessato alla soluzione dei fusibili (il mapper del dispositivo e la soluzione nbd sopra creeranno dispositivi a blocchi non file regolari - il che si romperà, se si desidera utilizzare l'output risultante direttamente con l'editing video software o altri strumenti che non sono pronti a leggere direttamente da un dispositivo a blocchi)

https://github.com/schlaile/concatfs


Codice sorgente molto istruttivo e semplice da usare! Grazie per averlo realizzato e condiviso!
Grzegorz Wierzowiecki

3

Fondamentalmente hai risposto nella prima frase della domanda: sì, si può fare. Tuttavia, dovresti scrivere un driver di file system personalizzato. Se si suppone che sia un oggetto del file system, deve essere gestito dal kernel ad un certo livello (incluso FUSE ). Il driver dovrebbe fornire back-end per l'API di syscalls del file system standard ( stat(), open()ecc., Inclusa la ricerca). Non è possibile farlo interamente nello spazio utente (almeno non con un kernel monolitico - ma anche con un microkernel avresti comunque bisogno di fornire un driver di filesystem, sebbene in esecuzione come un normale processo di spazio utente).


È abbastanza ovvio che può essere fatto. Ciò di cui sono curioso è se esiste un modo di hacking rapido per raggiungere questo obiettivo usando i pacchetti standard un * x - preferibilmente tramite bash senza la necessità di scrivere un driver dedicato dello spazio kernel.
Witiko,

1
vedi la risposta di Stephane - Ho completamente dimenticato il mapper del dispositivo.
peterph
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.