If you want know how fragmented a file is on an ext2/ext3/ext4 filesystem there are a couple of methods of finding out. One method is to use hdparm, but one needs CAP_SYS_RAWIO capability to do so, hence run with sudo:
sudo hdparm --fibmap /boot/initrd.img-2.6.38-9-generic
/boot/initrd.img-2.6.38-9-generic:
filesystem blocksize 4096, begins at LBA 24000512; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 35747840 35764223 16384
8388608 39942144 39958527 16384
16777216 40954664 40957423 2760
Alternatively, one can use the filefrag utility (part of the e2fsprogs package) for reporting the number of extents:
filefrag /boot/initrd.img-2.6.38-9-generic
/boot/initrd.img-2.6.38-9-generic: 3 extents found
..or more verbosely:
filefrag -v /boot/initrd.img-2.6.38-9-generic
Filesystem type is: ef53
File size of /boot/initrd.img-2.6.38-9-generic is 18189027 (4441 blocks, blocksize 4096)
ext logical physical expected length flags
0 0 1468416 2048
1 2048 1992704 1470463 2048
2 4096 2119269 1994751 345 eof
/boot/initrd.img-2.6.38-9-generic: 3 extents found
Well, that's useful. So, going one step further, how many free extents are available on the filesystem? Well, e2freefrag is the tool for this:
sudo e2freefrag /dev/sda1
Device: /dev/sda1
Blocksize: 4096 bytes
Total blocks: 2999808
Free blocks: 1669815 (55.7%)
Min. free extent: 4 KB
Max. free extent: 1370924 KB
Avg. free extent: 6160 KB
Num. free extent: 1084
HISTOGRAM OF FREE EXTENT SIZES:
Extent Size Range : Free extents Free Blocks Percent
4K... 8K- : 450 450 0.03%
8K... 16K- : 97 227 0.01%
16K... 32K- : 99 527 0.03%
32K... 64K- : 134 1475 0.09%
64K... 128K- : 96 2193 0.13%
128K... 256K- : 50 2235 0.13%
256K... 512K- : 30 2643 0.16%
512K... 1024K- : 36 6523 0.39%
1M... 2M- : 36 13125 0.79%
2M... 4M- : 14 9197 0.55%
4M... 8M- : 15 18841 1.13%
8M... 16M- : 8 17515 1.05%
16M... 32M- : 7 38276 2.29%
32M... 64M- : 3 39409 2.36%
64M... 128M- : 3 67865 4.06%
512M... 1024M- : 4 802922 48.08%
1G... 2G- : 2 646392 38.71%
..thus reminding me to do some housekeeping and remove some junk from my file system... :-)
so to defragment a single file one must place it to single extent of nearest greater power 2 size? is there any simple means to do that by command line?
ReplyDeletedd if=/dev/zero bs=1024M does not help :(