Více mě ale zajímá to, jak defrag zjistí počet fragmentů souboru - pokud vím, na úrovni Linux VFS neexistuje žádná rutina, na základě které by se to dalo deterministicky zjistit. Bojím se toho, že defrag pouze určitým způsobem odhaduje počet fragmentů porovnáním velikosti souboru, času O_DIRECT přečtení souboru a rychlosti sekvenčního čtení disku (hdparm -tT --direct, pokud chcete změřit svůj disk). Budu rád, pokud mi toto někdo vyvrátí.Mno, já si zkusmo zbastlil tohle:
#include <stdio.h> #include <linux/fs.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> int main(int argc, char **argv) { int fd=0, block, block_size, block_position, fragment_size=0, last_block_position, fragments=1; struct stat st; if (argc < 2) { printf("Enter a file name.\n"); exit(EXIT_FAILURE); } printf("File: '%s'\n", argv[1]); fd = open(argv[1], O_RDONLY); if(fd==-1) { perror(argv[1]); exit(EXIT_FAILURE); } if (stat(argv[1], &st) == -1) { perror("stat"); exit(EXIT_FAILURE); } if (ioctl(fd, FIGETBSZ, &block_size) == -1) { perror("ioctl"); exit(EXIT_FAILURE); } printf("File size: %d (%d blocks, a block has %d bytes)\n", (int)st.st_size, 1+((int)st.st_size/block_size), (int)block_size); for (block=0; block<=st.st_size/block_size; block++) { last_block_position = block_position; block_position = block; if (ioctl(fd, FIBMAP, &block_position) == -1) { perror("ioctl"); exit(EXIT_FAILURE); } /* printf("%d: %d\n", block, block_position); */ if (fragment_size > 0 && block_position != last_block_position+1) { printf("A fragment (%d blocks) ends at block %d\n", fragment_size, block); fragment_size = 0; fragments++; } else { fragment_size++; } } printf("Total: The file has %d fragments with average size of %.1f blocks each.\n", fragments, (1+st.st_size/block_size)/(double)fragments); exit(0); }Je to "narychlo zprasené" (jsou tři ráno ;-)), ale zdá se mi, že to funguje. :-) (A nekamenovat za formu, prosím, Cčko neumím. ;-))
nb-esprimo /usr/portage/distfiles # filefrag -v tetex-src-3.0_p1.tar.gz.new Checking tetex-src-3.0_p1.tar.gz.new Filesystem type is: 52654973 Filesystem cylinder groups is approximately 80 Blocksize of file tetex-src-3.0_p1.tar.gz.new is 4096 File size of tetex-src-3.0_p1.tar.gz.new is 13357541 (3262 blocks) First block: 79879 Last block: 84138 Discontinuity: Block 221 is at 80101 (was 80099) -- vzdálenost mezi fragmenty je jen 1 blok Discontinuity: Block 993 is at 81867 (was 80872) -- vzdálenost ~1000 bloků (4MB) Discontinuity: Block 1010 is at 81885 (was 81883) -- vzdálenost 1 blok Discontinuity: Block 2013 is at 82889 (was 82887) -- 1 blok Discontinuity: Block 3033 is at 83910 (was 83908) -- 1 blok tetex-src-3.0_p1.tar.gz.new: 6 extents foundFilefrag tedy reportuje 6 fragmentů, ale prakticky jsou pouze 2 (2 čtení s díru 1 blok spojí kernel do jednoho čtení, a když to neudělá kernel, tak to spadne do disk readaheadu). Jediné, co nevím, je jestli reiserfs dělá tyto díry schválně a jsou prázdné, či jestli to jsou data jiných souborů (jednoblokových souborů mám hodně - portage), či metadata.
pokud otevřeš (nebo třeba i vytvoříš) soubor, následně ho zavřeš a pak se ho pokusíš smazat tak to s docela vysokou pravděpodobností selžeCo má tohle společného se security descriptory a přístupovými právy?Ano, tomu se prave rika ty security dekriptory a access righty.
To, ze nemuzes nastavit, aby ti jiny proces nemohl smaznout file (co asi podle tve reakce v linuxu nejde) bych povazoval za velmi zasadni nedostatek file systemu...No tak kdo co může smazat se řeší pomocí přístupových práv, případně nějakých mandatory access control, ne?
"One of the coolest things about CFQ is that it features I/O priorities (since 2.6.13). That means you can set the I/O priority of a process so you can avoid that a process that does too much I/O (daily updatedb) starves the rest of the system, or give extra priority to a process that shouldn't be starved by other processes, by using the ionice tool included in schedutils (since version 1.5.0)."Co přesně potřebujete, že Vám tohle nestačí?
a prosim ta, k comu je linuxu potrebny editor registrov, ked veskera konfiguracia sa zapisuje do textovych suborov v adresari /etc? staci ti na to nejaky jednoduchy textovy editor (napr. vim, ci ten v mc),
ale na Windowse rady 9x a WinNT je potrebny editor registrov, lebo v nich je konfiguraxcia v podobe niekolkych binarnych suborov a bez editora sa asi tazko nieco nastavi
Takovy defrag by ale slo asi jen s obtizemi pouzit na primountovanem oddilu.Proč? Programy snad nepřistupují ke konkrétním sektorům, ale drží si nějaké file descriptory a to že tomu "něco" bude přehazovat soubory pod rukama vůbec nemusí vidět. (Jo, tak bude to složitější na implementaci než kopírování, ale nevidím důvod, proč by to nemělo jít.)
Podle me nejlepsi defrag je koupit si jeste jeden disk a vsechno na nej zkopirovat a pak to prekopirovat zpatky.Jistě. Taky nejlevnější. A hlavně to budu určitě dělat na běžícím systému.
Proč? Programy snad nepřistupují ke konkrétním sektorům, ale drží si nějaké file descriptory a to že tomu "něco" bude přehazovat soubory pod rukama vůbec nemusí vidět. (Jo, tak bude to složitější na implementaci než kopírování, ale nevidím důvod, proč by to nemělo jít.)
Ano, existujú online repackery (defrag), napr. pre XFS, plánované (tj. neviem v akom stave je implementácia) sú pre Ext4 a Reiser4.
Ono najlepší "defrag", čo sa týka vplyvu na výkon je aj tak zobrať súbory, ku ktorým jedna aplikácia/proces pristupuje a prekopírovať ich (typický alokátor spraví to, že sa ich bude snažiť naalokovať blízko seba, čím spôsobí menšie seekovanie). Naopak "obyčajný defrag" nemá ani šajnu v súvislostiach ktorý fajl sa bude ako používať, takže ich síce môže defragmentovať, ale zároveň rozhádzať po disku (a bude to seekovať viac).
BTW defrag mal skôr zmysel v DOSe, kde sa čítal jeden fajl v jednom momente (dnes je to tak skôr kvôli dobrému pocitu modulo extrémne prípady, keby sme rozsypali fajly po disku jak čaj). Moderné FS alokujú fajly nie po jednotlivých blokoch, ale po extentoch (premenlivo dlhý súvislý pás blokov), tu delayed allocation dosť pomáha proti fragmentácii preventívne.
Pr. XFS má niekoľko B+ stromov, podľa jedného hľadá voľný extent najbližšej vhodnej veľkosti, podľa druhého hľadá extent/blok v blízkosti predchádzajúceho, tie B+ stromy sú tuším per AG (allocation group, ale už si to nastropro nepamätám).
Počet fragmentov na MB apod. je absolútne nič nehovoriaca metrika (nehovorí nič o čase seeku/"vzdialenosti" medzi fragmentami, nezaoberá sa o koreláciami medzi čítaním súborov atď).
Ne, nemám takový pocit. A to mimo jiné proto, že vím, jak vypadá MS API pro defragmentaci (které používá mimo jiné defrag vestavěný ve Windows).
http://msdn2.microsoft.com/en-us/library/aa363911(VS.85).aspx