Считайте редкий файл с 1 с записанным в часть файла.
Я хочу освободить фактическое пространство на диске в течение этой 1 с, поскольку мне больше не нужна та часть редкого файла. Часть файла, содержащего эту 1 с, должна стать "дырой", как это было перед 1 с были самостоятельно записаны.
Чтобы сделать это, я очистил регион к 0s. Это не исправляет блоки на диске.
Как я на самом деле делаю редкий файл, ну, в общем, редким снова?
Этот вопрос подобен этому, но нет никакого принятого ответа для того вопроса.
Полагайте, что следующая последовательность событий работает на запасе сервер Linux:
$ cat /tmp/test.c
#include
#include
#include
#include
int main(int argc, char **argv) {
int fd;
char c[1024];
memset(c,argc==1,1024);
fd = open("test",O_CREAT|O_WRONLY,0777);
lseek(fd,10000,SEEK_SET);
write(fd,c,1024);
close(fd);
return 0;
}
$ gcc -o /tmp/test /tmp/test.c
$ /tmp/test
$ hexdump -C ./test
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002710 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 |................|
*
00002b10
$ du -B1 test; du -B1 --apparent-size test
4096 test
11024 test
$ /tmp/test clear
$ hexdump -C ./test
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002b10
$ du -B1 test; du -B1 --apparent-size test
4096 test
11024 test
# NO CHANGE IN SIZE.... HMM....
РЕДАКТИРОВАНИЕ -
Позвольте мне далее квалифицировать это, я не хочу переписывать файлы, файлы копии, и т.д. Если бы это не возможно к так или иначе свободным ранее выделенным блокам на месте, пусть будет так, но я хотел бы определить, на самом деле ли такой возможно или нет. Это походит "нет, это не" в этой точке. Я предполагаю, что ищу sys_punchhole
для Linux (обсуждения которого я просто наткнулся на).
Прямо сейчас кажется, что только NTFS поддерживает пробивание отверстий. Это было исторически проблема в большинстве файловых систем. POSIX Насколько я знаю, не определяет интерфейс ОС для удара отверстий, поэтому ни один из стандартных файловых систем Linux не поддерживает его. NetApp поддерживает пробивание отверстия через окна в своем WAFL файловой системы. Там есть хороший блог по поводу этого здесь .
Для вашей проблемы, как указано другие, единственное решение состоит в том, чтобы переместить файл, оставив блок, содержащие Zeroes. Да, это будет медленным. Или пишите расширение для вашей файловой системы на Linux, который делает это и PACKEL A Patch в хорошие люди в команде Kernel Linux. ;)
Редактировать: выглядит как XFS поддерживает пробивание отверстий. Проверьте эта нить .
Другим действительно скрученным вариантом можно использовать отладчик отладчика файловой системы , чтобы перейти и пробивать отверстия во всех косвенных блоках, которые указывают на обеленные блоки в вашем файле (возможно, вы можете сценарий этого). Затем запустите FSCK, который исправит все связанные сочетание блока, соберите все сирофонные блоки (оборудованные из них) и поместите их в каталог «Утерянный + найденный» (вы можете удалить их, чтобы восстановить пространство) и исправлять другие свойства в файловой системе. Страшно, а?
Отказ от ответственности: Сделайте это по своему страхому риску. Я не несу ответственности за любые потери данных, которые вы несете. ;)
Рон Йорстон предлагает несколько решений; но все они включают либо монтирование FS только для чтения (или его размонтирование) во время разрядки; либо создание нового разреженного файла, затем копирование по тем частям оригинала, которые не являются просто 0s, а затем замена оригинального файла на новый разреженный файл.
Это действительно зависит от вашей файловой системы. Мы уже видели, что NTFS справляется с этим. Я полагаю, что любая из других файловых систем Википедии перечисляет как обработка прозрачного сжатия сделает то же самое - это, в конце концов, эквивалентно прозрачному сжатию файла.
Этот способ дешев, но работает. :-P
ftruncate
- ваш друг). размонтируйте вашу файловую систему и редактируйте файловую систему непосредственно аналогичным образом в отладках или fsck. обычно вам нужен драйвер для каждого используемого fs.
.Похоже, что написание нулей (как в упомянутом вопросе) к той части, с которой вы закончили, логично попробовать. Здесь ссылка на MSDN вопрос для разреженных файлов NTFS, который делает это только для того, чтобы "выпустить" "неиспользованную" часть. YMMV.
После того, как вы «обнулили» некоторую область файла, вы должны сообщить файловой системе, что эта новая область должна быть разреженной. Поэтому в случае NTFS вам нужно снова вызвать DeviceIoControl () для этого региона. По крайней мере, я делаю это в своей утилите: "sparse_checker"
Для меня более серьезная проблема заключается в том, как вернуть разреженную область обратно :).
С уважением
Похоже, Linux добавила системный вызов fallocate
для «пробивания дыр» в файлах. Реализации в отдельных файловых системах, кажется, сосредоточены на возможности использовать это для предварительного выделения большего непрерывного числа блоков.
Существует также вызов posix_fallocate
, который фокусируется только на последнем и не может использоваться для перфорации.