(a little while ago I was writing a really long entry on everything possible. I realised that this would be a long read for people and that less people would look at it, so I’ve split it up).
This sprung out of doing work on the NDB disk data tree. Anything where efficient use of the filesystem is concerned tickles my fancy, so I went to have a look at what was going on.
Filesystems store what part of the disk belongs to what file in one of two ways. The first is to keep a list of every disk block (typically 4kb) that’s being used by the file. A 400kb file will have 100 block numbers. The second way is to store a range (extent). That is, a 400kb file could use 100 blocks starting at disk block number 1000.
XFS has a tool called xfs_bmap. It gives you a list of the extents allocated to a file.
So, let’s have a look at what it tells us about some recordings on my MythTV box.
myth@orpheus:~$ ls -lah myth-recordings/10_20050912183000_20050912190000.nuv -rw-r--r-- 1 myth myth 452M 2005-09-12 19:00 myth-recordings/10_20050912183000_20050912190000.nuv myth@orpheus:~$ xfs_bmap -v myth-recordings/10_20050912183000_20050912190000.nuv myth-recordings/10_20050912183000_20050912190000.nuv: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..639]: 228712176..228712815 7 (21106232..21106871) 640 1: [640..1663]: 83674040..83675063 2 (24358056..24359079) 1024 2: [1664..923519]: 83675368..84597223 2 (24359384..25281239) 921856 3: [923520..924031]: 84631272..84631783 2 (25315288..25315799) 512
Just to make things fun, this is all in 512byte blocks. But anyway, the real interesting thing is the number of extents. Ideally, every file would have one extent as this means that we avoid disk seeks – *the* most expensive disk operation.
XFS also provides the xfs_fsr tool (File System Repacker) that can defragment files (even on a mounted file system). On IRIX this used to run out of cron – fun when a bunch of machines hit a CXFS volume all at the same time.