Rozpatrzmy rzadki plik z 1s zapisanym w części pliku.W jaki sposób jeden odzyskuje wyzerowane bloki z pliku rzadkiego?
Chcę odzyskać rzeczywistą przestrzeń na dysku dla tych 1, ponieważ nie potrzebuję już tej części pliku rozrzedzonego. Część pliku zawierająca te 1 powinna stać się "dziurą", tak jak to było przed napisaniem samych liter.
Aby to zrobić, wyczyściłem region na 0s. To robi nie odzyskać bloków na dysku.
Jak właściwie utworzyć rzadki plik, cóż, rozrzedzony ponownie?
To pytanie jest podobne do this one, ale nie ma akceptowanej odpowiedzi na to pytanie.
Rozważmy następującą sekwencję zdarzeń w stanie uruchomić na serwerze Linux:
$ cat /tmp/test.c
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
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....
EDIT -
Pozwól mi dalej zakwalifikować, że nie chcą przepisać plików, kopiowanie plików, itd. Jeśli nie jest możliwe, aby w jakiś sposób zwolnić wcześniej przydzielone bloki in situ, niech tak będzie, ale chciałbym sprawdzić, czy jest to rzeczywiście możliwe, czy nie. Wygląda na to, że "nie, nie jest" w tym momencie. Przypuszczam, że szukam dla Linuksa sys_punchhole
(dyskusje, o których się natknąłem).
Z tego co przeczytałem o rzadkich plikach, kluczową determinantą nie jest to, że blok jest wypełniony zerami, ale że nigdy nie został napisany. Czy masz jakieś odniesienia do czegoś przeciwnego? – kdgregory
Fragmenty pliku rozrzedzonego nigdy nie zostały napisane, aby nie zostały przydzielone bloki. Ale moje pytanie brzmi, gdy przydzielę jeden lub więcej bloków, w jaki sposób mogę je uwolnić? Nie potrzebuję już części rozrzedzonego pliku i chcę odzyskać poprzednio przydzielone bloki. Ale nie mogę. Gwizd. – z8000
'cp --sparse = always' ... rzadkie pliki są hackami w zależności od sposobu zarządzania pamięcią przez systemy; nigdy nie warto polegać na hackach. Jeśli potrzebujesz rzadkich struktur danych, które mogą mieć fragmenty przychodzące i odchodzą, polecam poszukiwanie takiej struktury lub samodzielne napisanie. – kdgregory