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

Считайте редкий файл с 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 (обсуждения которого я просто наткнулся на).

12
задан Community 23 May 2017 в 12:13
поделиться

7 ответов

Прямо сейчас кажется, что только NTFS поддерживает пробивание отверстий. Это было исторически проблема в большинстве файловых систем. POSIX Насколько я знаю, не определяет интерфейс ОС для удара отверстий, поэтому ни один из стандартных файловых систем Linux не поддерживает его. NetApp поддерживает пробивание отверстия через окна в своем WAFL файловой системы. Там есть хороший блог по поводу этого здесь .

Для вашей проблемы, как указано другие, единственное решение состоит в том, чтобы переместить файл, оставив блок, содержащие Zeroes. Да, это будет медленным. Или пишите расширение для вашей файловой системы на Linux, который делает это и PACKEL A Patch в хорошие люди в команде Kernel Linux. ;)

Редактировать: выглядит как XFS поддерживает пробивание отверстий. Проверьте эта нить .

Другим действительно скрученным вариантом можно использовать отладчик отладчика файловой системы , чтобы перейти и пробивать отверстия во всех косвенных блоках, которые указывают на обеленные блоки в вашем файле (возможно, вы можете сценарий этого). Затем запустите FSCK, который исправит все связанные сочетание блока, соберите все сирофонные блоки (оборудованные из них) и поместите их в каталог «Утерянный + найденный» (вы можете удалить их, чтобы восстановить пространство) и исправлять другие свойства в файловой системе. Страшно, а?


Отказ от ответственности: Сделайте это по своему страхому риску. Я не несу ответственности за любые потери данных, которые вы несете. ;)

4
ответ дан 2 December 2019 в 19:54
поделиться

Рон Йорстон предлагает несколько решений; но все они включают либо монтирование FS только для чтения (или его размонтирование) во время разрядки; либо создание нового разреженного файла, затем копирование по тем частям оригинала, которые не являются просто 0s, а затем замена оригинального файла на новый разреженный файл.

Это действительно зависит от вашей файловой системы. Мы уже видели, что NTFS справляется с этим. Я полагаю, что любая из других файловых систем Википедии перечисляет как обработка прозрачного сжатия сделает то же самое - это, в конце концов, эквивалентно прозрачному сжатию файла.

2
ответ дан 2 December 2019 в 19:54
поделиться

Этот способ дешев, но работает. :-P

  1. Читайте все данные, прошедшие нужную дыру, в память (или другой файл, или еще что-нибудь).
  2. Усекайте файл до начала дыры (ftruncate - ваш друг).
  3. Ищите конец дыры.
  4. Запишите данные обратно в.
1
ответ дан 2 December 2019 в 19:54
поделиться

размонтируйте вашу файловую систему и редактируйте файловую систему непосредственно аналогичным образом в отладках или fsck. обычно вам нужен драйвер для каждого используемого fs.

.
0
ответ дан 2 December 2019 в 19:54
поделиться

Похоже, что написание нулей (как в упомянутом вопросе) к той части, с которой вы закончили, логично попробовать. Здесь ссылка на MSDN вопрос для разреженных файлов NTFS, который делает это только для того, чтобы "выпустить" "неиспользованную" часть. YMMV.

http://msdn.microsoft.com/en-us/library/ms810500.aspx

-1
ответ дан 2 December 2019 в 19:54
поделиться

После того, как вы «обнулили» некоторую область файла, вы должны сообщить файловой системе, что эта новая область должна быть разреженной. Поэтому в случае NTFS вам нужно снова вызвать DeviceIoControl () для этого региона. По крайней мере, я делаю это в своей утилите: "sparse_checker"

Для меня более серьезная проблема заключается в том, как вернуть разреженную область обратно :).

С уважением

2
ответ дан 2 December 2019 в 19:54
поделиться

Похоже, Linux добавила системный вызов fallocate для «пробивания дыр» в файлах. Реализации в отдельных файловых системах, кажется, сосредоточены на возможности использовать это для предварительного выделения большего непрерывного числа блоков.

Существует также вызов posix_fallocate , который фокусируется только на последнем и не может использоваться для перфорации.

9
ответ дан 2 December 2019 в 19:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: