LINUX.ORG.RU

Как сделать «дырку» в файле?


0

0

На ext2/3 можно использовать lseek, чтобы делать дырку в файле. Открываем файл на запись переходим за конец файла пишем, закрываем. ls -lh; df -h; Радуемся.

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

Естественно не из под рута.


>Можно как-нибудь сказать ФС, что это место файла больше не нужно и его можно использовать под другие файлы?

обрезать сам файл, а так никак. Обрезать == изменить.

alphex_kaanoken ★★★
()

Можно попровать приммапить этот кусок в read-write, и сделать на него bzero. Ядро должно догадаться, что ты имеешь в виду, и сделать sparse file.

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

> Можно попровать приммапить этот кусок в read-write, и сделать на него bzero. Ядро должно догадаться, что ты имеешь в виду, и сделать sparse file.

думал в этом направлении -- но ведь bzero это не системный вызов?

А догадываться смотря нулевое содержимое или нет ядро тоже врядли будет -- во первых perfomance penalty, во вторых ведь dd id=/dev/zero без seek не создает sparse file.

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

Оно просто пересоздаёт файл заново, делая дыры где надо. Это можно и через dd сделать, без всяких сишных программ. Хочешь скрипт на шелле напишу в десять строчек, который будет делать то же самое, что эти 11 килобайт сишного кода? :) Минут 15 займёт, с отладкой.

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

Звиняйте, не прочитал исходник.

Почему-то посчитал, что раз опция --replace, значит оно будет его реплэйсить на месте, а оно временный файл создает...

anonymous
()
Ответ на: комментарий от dilmah

В зависимости от того какому приложению этот файл нужен можно ИМХО(читая теория, проверять лень :) ) нахачить.
То есть останавливаем приложение SIGSTOP . делаем копию файла - с конца,
одновременно урезая файл и копируя содержимое в новый, поблочно. Та этом этапе уже можно в новом файл делать lseek если надо пропустить нули. Теперь имеем исходный файл нулевой длинны и файл2 с данными и пустотами. Теперь делаем ту же процедуру копирования с конца с обрезанием исходного файла(man 2 truncate) из файл2 в исходный. Так как файл2 постоянно отрезается с конца во время копирования место не жрется - мы тоже используем lseek для того что бы писать в конец файла1.
Как-то так ....

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

Внимание, вопрос! что будет с нашими данными, если посреди этой увлекательной процедуры нашу программку кто-то убьёт? :)

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

А что будет если ресетом машину убить с БД :) ? БД спасется только потому что там рековери лог и алгоритмы.

У нас данные окажутся порезаными м-ду двумя файлами. если при этом вести лог и не стирать прежде чем записал восстановление дело такой же прорамки на 2 килобайта исходников :)

kernel ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.