Menggabungkan file ke file virtual di Linux

10

Pada sistem Linux, apakah ada cara untuk menggabungkan serangkaian file menjadi satu file terbuka untuk membaca dan menulis sementara tidak benar-benar mengambil N byte lain dari ruang disk? Saya berharap sesuatu seperti memasang file-file ini melalui loopback / devmapper untuk mencapai ini.

Saya memiliki masalah di mana ada file biner terpecah yang bisa menjadi cukup besar. Saya tidak ingin menggandakan persyaratan ruang saya dengan IO disk besar hanya untuk sementara membaca / menulis konten dari file-file ini dengan catmenggabungkan semuanya menjadi satu file besar.

Saya menemukan proyek ini di sini , tetapi tampaknya memiliki use case yang sangat spesifik dan juga tergantung perl

Ryan
sumber
Saya kira FUSE diciptakan untuk menyelesaikan masalah semacam ini. Mungkin Anda harus menulis modul Anda sendiri tetapi itu seharusnya tidak terlalu sulit.
Hauke ​​Laging

Jawaban:

14

Anda dapat melakukannya dengan menggabungkan perangkat loop dan perangkat mapper, berkat "semuanya adalah file". Tetapi dengan satu batasan: Ukuran file tidak dapat diubah (karena Anda tidak dapat menambah perangkat blok dengan menulisnya). Jadi jika Anda ingin menambahkan data maka Anda harus membuat perangkat blok yang lebih besar dan menimpa data dummy yang ditambahkan.

# for testing, Create 4 files
echo foo | dd of=block0 cbs=512 conv=block
echo bar | dd of=block1 cbs=512 conv=block
echo bat | dd of=block2 cbs=512 conv=block
echo baz | dd of=block3 cbs=512 conv=block
# Create a loop device for each of the 4 files
losetup /dev/loop0 block0
losetup /dev/loop1 block1
losetup /dev/loop2 block2
losetup /dev/loop3 block3
# Create a device map named "test" using those loop devices
(
    echo "0 1 linear /dev/loop0 0"
    echo "1 1 linear /dev/loop1 0"
    echo "2 1 linear /dev/loop2 0"
    echo "3 1 linear /dev/loop3 0"
) | dmsetup create test
$EDITOR /dev/mapper/test # use overwrite mode only

Untuk memperluas file Anda dapat membuat file jarang besar dan menggunakannya sebagai perangkat tambahan.

Hauke ​​Laging
sumber
1

Ini bisa dilakukan dengan menggunakan pipa bernama di Linux.

Asumsikan Anda memiliki file yang bernama file0, file1, file2, file3, file4, file5

# create a name pipe
$ mkfifo mynewfile
# cat to named file
$ cat file{0..5} > mynewfile &

Di C secara programatik bisa Anda lakukan

mkfifo(mynewfile , 0777);
system("cat file{0..5} > mynewfile");

Kemudian gunakan kemudian gunakan mynewfile seperti kami, Anda akan membaca dari file normal.

mynewfile adalah file FIFO

katta
sumber
0

Untuk membaca, Anda dapat lessbeberapa file dan kemudian menggunakan :ndan :ppilihan untuk pergi melalui mereka.

Untuk menulis, tanpa mengakses file secara langsung Anda tidak akan dapat menulis kepada mereka.

Anda dapat vimbeberapa file juga, dan itu hanya akan pergi melalui urutan mereka dipanggil (mis. vim fileA fileB fileC- fileB dibuka setelah fileA ditutup, fileC dibuka setelah fileB ditutup).

BriGuy
sumber