LINUX.ORG.RU

Как вставить блок в середину файла не перезаписывая хвост?

 , ,


1

5

Я хочу чтобы хвост файла оказался дальше от начала файла, а в середину чтобы вписалось некоторое количество нулей.

Пример: общий размер файла 600 GB, хочу вставить не менее 200 байт в начало (но можно и более). Хотелось бы сделать это быстро, не перезаписывая 600 GB с одного места на другое.

Как это сделать, через какие API? Как узнать, какого минимального размера блок можно использовать для такой операции?

Я думаю, что через VFS такое не получится и надо использовать более низкоуровневые АПИ. Или получится?

Понятно, что минимальный блок будет около 128 килобайт или более на современных SSD.

★★★

Последнее исправление: Shushundr (всего исправлений: 1)

Стандартными средствами - никак. API FS не предусматривает такой операции. Можно заморочиться сделать решение для конкретной файловой системы, но это в ядро патчи писать (потом ещё замучаешься поддерживать их работоспособность), если надо чтобы из пространства пользователя работало. На отмонтированной ФС чуть проще, но вас скорее всего это не заинтересует.

unDEFER ★★★★★
()
Последнее исправление: unDEFER (всего исправлений: 1)

Понятно, что минимальный блок будет около 128 килобайт или более на современных SSD.

Нет, конечно.

Но такое нигде не предусмотрено, и скорее всего и тебе оно не нужно, а ты просто решаешь не ту задачу.

firkax ★★★★★
()
Ответ на: комментарий от Shushundr

Блин ну инструмент есть, заюзать его это уже твоя задача. Открываешь новый файл, делаешь в него клон до начала новых блоков, пишешь новые блоки и делаешь клон остатка. Файл переименовываешь. Вообще не вопрос

no-dashi-v2 ★★
()
Ответ на: комментарий от no-dashi-v2

и делаешь клон остатка

хотелось бы найти документацию по конкретным файловым системам. Какие там требования к выравниванию остатков, чтобы они были клоноспособны.

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от InterVi

Временем на переписывание остатка файла? Ну, например, это сортированный индекс, и он должен оставаться сортированным, поэтому требуется запись в середину.

Shushundr ★★★
() автор топика
Ответ на: комментарий от Shushundr

Где-то мне попадался hex редактор, в нём можно было менять байтики на диске. Надо подсмотреть решение в таких утилитах, но конкретно подсказать не могу. Ещё надо посмотреть parted, testdisk и прочие утилиты для низкоуровневой работы с диском.

А по-нормальному надо подумать над архитектурой программы и способом хранения данных. Если есть нужда что-то переписывать в большом файле, значит нужно хранить информацию по-другому. Также перезапись можно делать в фоне, чтобы не тормозить основной поток — для этого уже придумали асинхронное i/o.

InterVi ★★★★
()
Ответ на: комментарий от InterVi

«менять» это не то же самое, что «вставлять», тут много ума не нужно - спозиционировался и произвёл запись.

утилиты для низкоуровневой работы с диском

они работают с отмонтированной файловой системой - это не то, что надо.

Shushundr ★★★
() автор топика

переходи от монолитного файла к базе данных. там указанный функционал имеется внутри.
плюс искать бд, которое имеет функционал выравнивания блоков данных по «ссд-границам»

судя по всему тебе нужна файловая система с CoW - zfs btrfs и т.д.
в ней при создании копии файла, создается новый индекс блоков данных в который копируется указатели со старого индекса, сами данные файла «не копируются».
при изменении нового файла, создаются новые блоки данных и заменяются указатели на них в индексе. указатели на неизменные блоки в индексе файла остаются теми же самыми.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 3)
Ответ на: комментарий от Shushundr

А, так ещё и количество байт не фиксированно? При фрагментации фс умеет рассовывать данные по разным адресам, так что чисто теоретически, можно добиться этого своей реализацией фс, где будет api для подсовывания новых кусков данных.

InterVi ★★★★
()