Gibt es eine Möglichkeit, ein Dateisystemobjekt ähnlich diesem zu erstellen:
mknod files p
cat file1 file2 ... fileN > files
sondern so, dass darin gesucht werden kann, als wäre es eine normale Datei?
Antwort1
Auf Linux-basierten Betriebssystemen kann dies mit Netzwerkblockgeräten oder Gerätemappergeräten erfolgen. Die Datei, die Sie erhalten, ist ein Blockgerät.
Mit 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
(die Verkettung ist /dev/nbd0
).
Mit Gerätemapper (Dateigrößen müssen ein Vielfaches von 512 sein):
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
(die Verkettung ist /dev/mapper/mybundle
).
Antwort2
habe heute einen Fuse-Treiber geschrieben, falls jemand an der Fuse-Lösung interessiert ist (sowohl der Device-Mapper als auch die obige NBD-Lösung erstellen Blockgeräte, keine normalen Dateien – was nicht funktioniert, wenn Sie die resultierende Ausgabe direkt mit Videobearbeitungssoftware oder anderen Tools verwenden möchten, die nicht darauf vorbereitet sind, direkt von einem Blockgerät zu lesen)
Antwort3
Sie haben es im Grunde schon im ersten Satz der Frage beantwortet: ja, das ist möglich. Allerdings müssten Sie dafür einen benutzerdefinierten Dateisystemtreiber schreiben. Wenn es ein Dateisystemobjekt sein soll, muss es auf einer bestimmten Ebene vom Kernel verarbeitet werden (das schließt ein:SICHERUNG). Der Treiber müsste ein Backend für die API der Standard-Dateisystem-Syscalls ( usw., einschließlich Suchen) bereitstellen stat()
. open()
Sie können dies nicht vollständig im Benutzerbereich tun (zumindest nicht mit einem monolithischen Kernel – aber selbst mit einem Mikrokernel müssten Sie immer noch einen Dateisystemtreiber bereitstellen, auch wenn dieser als normaler Benutzerbereichsprozess ausgeführt wird).