Un fichier virtuel contenant la concaténation d'autres fichiers

13

Existe-t-il un moyen de créer un objet de système de fichiers semblable à ceci:

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

mais tel qu'il puisse être recherché, comme s'il s'agissait d'un dossier régulier?

Witiko
la source

Réponses:

18

Sur les systèmes d'exploitation Linux, cela peut être fait avec des périphériques de bloc réseau ou des périphériques de mappage de périphériques. Le fichier que vous obtenez est un périphérique bloc.

Avec 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 concaténation est /dev/nbd0).

Avec mappeur de périphérique (les tailles de fichier doivent être multiples 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

(la concaténation est /dev/mapper/mybundle).

Stéphane Chazelas
la source
8

a écrit un pilote de fusible aujourd'hui, si quelqu'un est intéressé par la solution de fusible (le mappeur de périphériques ainsi que la solution nbd ci-dessus créeront des périphériques de bloc et non des fichiers réguliers - qui se briseront, si vous souhaitez utiliser la sortie résultante directement avec le montage vidéo logiciels ou autres outils qui ne sont pas prêts à lire directement à partir d'un périphérique de bloc)

https://github.com/schlaile/concatfs

Peter
la source
Code source très instructif et simple à utiliser! Merci de l'avoir fait et partagé!
Grzegorz Wierzowiecki
3

Vous y avez essentiellement répondu dans la première phrase de la question: oui, cela peut être fait. Cependant, vous devez écrire un pilote de système de fichiers personnalisé. S'il est censé être un objet de système de fichiers, il doit être géré par le noyau à un certain niveau (y compris FUSE ). Le pilote devrait fournir un backend pour l'API syscalls du système de fichiers standard ( stat(), open()etc., y compris la recherche). Vous ne pouvez pas le faire entièrement dans l'espace utilisateur (du moins pas avec un noyau monolithique - mais même avec un micro-noyau, vous devrez toujours fournir un pilote de système de fichiers, bien qu'il s'exécute comme un processus d'espace utilisateur normal).

peterph
la source
Il est assez évident que cela peut être fait. Ce qui m'intéresse, c'est de savoir s'il existe un moyen de piratage rapide pour y parvenir en utilisant les packages standard un * x - de préférence via bash sans avoir besoin d'écrire un pilote dédié à l'espace noyau.
Witiko
1
voir la réponse de Stéphane - j'ai complètement oublié le mappeur de périphériques.
peterph