File virtual yang berisi rangkaian file lain

13

Apakah ada cara membuat objek sistem berkas mirip dengan ini:

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

tetapi sedemikian rupa sehingga dapat dicari, seolah-olah itu adalah file biasa?

Witiko
sumber

Jawaban:

18

Pada sistem operasi berbasis Linux, itu bisa dilakukan dengan perangkat blok jaringan atau perangkat perangkat mapper. File yang Anda peroleh adalah perangkat blok.

Dengan 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

(Rangkaiannya adalah /dev/nbd0).

Dengan mapper perangkat (ukuran file harus lebih dari 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

(Rangkaiannya adalah /dev/mapper/mybundle).

Stéphane Chazelas
sumber
8

menulis driver sekering hari ini, jika seseorang tertarik pada solusi sekering (perangkat mapper serta solusi nbd di atas akan membuat perangkat blok bukan file biasa - yang akan pecah, jika Anda ingin menggunakan output yang dihasilkan langsung dengan pengeditan video perangkat lunak atau alat lain yang tidak siap untuk membaca dari perangkat blok secara langsung)

https://github.com/schlaile/concatfs

Peter
sumber
Kode sumber yang sangat mendidik dan mudah digunakan! Terima kasih telah membuatnya dan berbagi!
Grzegorz Wierzowiecki
3

Anda pada dasarnya menjawabnya dalam kalimat pertama pertanyaan: ya, itu bisa dilakukan. Namun, Anda harus menulis driver sistem file khusus. Jika seharusnya menjadi objek sistem file, itu harus ditangani oleh kernel pada tingkat tertentu (termasuk FUSE ). Pengemudi harus memberikan backend untuk syscalls API sistem file standar ( stat(), open()dll., Termasuk mencari). Anda tidak dapat melakukannya sepenuhnya di ruang pengguna (setidaknya tidak dengan kernel monolitik - tetapi bahkan dengan microkernel Anda masih perlu menyediakan driver sistem file, meskipun berjalan sebagai proses userspace biasa).

peterph
sumber
Cukup jelas bahwa itu bisa dilakukan. Yang saya ingin tahu adalah apakah ada cara cepat-hack untuk mencapai hal ini menggunakan paket un * x standar - lebih disukai melalui bash tanpa harus menulis driver ruang-kernel khusus.
Witiko
1
lihat jawaban Stephane - Saya benar-benar lupa dengan mapper perangkat.
peterph