Diğer dosyaların birleştirilmesini içeren sanal bir dosya


13

Buna benzer bir dosya sistemi nesnesi oluşturmanın bir yolu var mı:

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

ama normal bir dosya gibi aranabilir öyle?

Yanıtlar:


18

Linux tabanlı işletim sistemlerinde, ağ engelleme cihazları veya cihaz eşleme cihazları ile yapılabilir. Elde ettiğiniz dosya bir blok cihazdır.

İle 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

(birleştirme /dev/nbd0).

Cihaz eşleyici ile (dosya boyutları 512'nin katları olmalıdır):

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

(birleştirme /dev/mapper/mybundle).


8

Birisi sigorta çözümüyle ilgileniyorsa, bugün bir sigorta sürücüsü yazdı (cihaz eşleyici ve yukarıdaki nbd çözümü normal dosyalar değil blok cihazlar oluşturacak - sonuçta ortaya çıkan çıktıyı doğrudan video düzenleme ile kullanmak isterseniz kırılacak doğrudan bir blok cihazından okumaya hazır olmayan yazılım veya diğer araçlar)

https://github.com/schlaile/concatfs


Çok eğitici ve kullanımı kolay kaynak kodu! Yaptığınız ve paylaştığınız için teşekkürler!
Grzegorz Wierzowiecki

3

Temel olarak sorunun ilk cümlesinde cevapladınız: evet, yapılabilir. Ancak, özel dosya sistemi sürücüsü yazmanız gerekir. Bir dosya sistemi nesnesi olması gerekiyorsa, çekirdek tarafından bir düzeyde ( FUSE dahil ) ele alınmalıdır . Sürücünün standart dosya sistemi sistem çağrıları API'sı (arama stat(), open()vb. Dahil) için arka uç sağlaması gerekir . Tamamen kullanıcı alanında yapamazsınız (en azından monolitik bir çekirdekle değil - ancak bir mikro çekirdeğe rağmen, normal bir kullanıcı alanı işlemi olarak da çalışsa da bir dosya sistemi sürücüsü sağlamanız gerekir).


Bunun yapılabileceği oldukça açıktır. Merak ettiğim şey, standart un * x paketlerini kullanarak bunu başarmanın hızlı bir yolu olup olmadığı - tercihen özel bir çekirdek alanı sürücüsü yazma ihtiyacı olmadan bash aracılığıyla.
Witiko

1
Stephane'nin cevabına bakın - Cihaz haritalayıcısını tamamen unuttum.
peterph
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.