Об’єднання файлів з віртуальним файлом в Linux


10

Чи є в системі Linux який-небудь спосіб об'єднати ряд файлів в один відкритий файл для читання і запису, а насправді не займає ще N байт дискового простору? Я сподівався на щось подібне встановити ці файли через loopback / devmapper, щоб досягти цього.

У мене проблема, коли є розділені двійкові файли, які можуть отримати досить великі розміри. Я не хочу подвоювати свої вимоги до простору з масовим IO диском, щоб тимчасово читати / записувати вміст з цих файлів, шляхом catїх об'єднання в один величезний файл.

Я знайшов цей проект тут , але це , здається, має дуже специфічний випадок використання , а також залежить від Perl


Я думаю, що FUSE був винайдений для вирішення подібної проблеми. Можливо, вам доведеться написати власний модуль, але це не повинно бути занадто складно.
Hauke ​​Laging

Відповіді:


14

Це можна зробити, комбінуючи петлеві пристрої та картографічний пристрій, завдяки "все є файлом". Але з одним обмеженням: розмір файлу неможливо змінити (оскільки ви не можете збільшити блокові пристрої, записуючи на них). Отже, якщо ви хочете додати дані, тоді вам доведеться створити блок більшого блоку і перезаписати додані дані манекена.

# 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

Для розширення файлу ви можете створити великий розріджений файл і використовувати його як додатковий пристрій.


1

Це можна зробити за допомогою названої труби в Linux.

Припустимо, у вас є імена файлів file0, file1, file2, file3, file4, file5

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

У програмі C ви можете це зробити

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

Потім використовуйте mynewfile як у нас, який ви читали б із звичайного файлу.

mynewfile - це файл FIFO


0

Для читання ви можете lessкілька файлів, а потім скористатися параметрами :nта :pпараметрами, щоб пройти через них.

Для запису, без доступу до файлів безпосередньо, ви не зможете їх записувати.

Ви також можете vimдекілька файлів, і вони просто пройдуть порядок їх vim fileA fileB fileCвиклику (тобто. FileB відкрився після закриття файлуА закритий, файлC відкрився після закриття файлуB).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.