Newly created XFS filesystem shows 78 GB used
Solution 1:
All filesystems have an overhead for their own internal data structures. This internal information is used for the filesystem to create files and directories in future, and to keep track of where everything is allocated. This data is collectively known as "metadata". It's data "about" the data on the filesystem. The metadata is considered an overhead, as it takes up space but is not user data. This overhead is an unavoidable side effect of using any filesystem.
According to this blog post, XFS has an overhead of around 0.5% of the total disk space. (Note that this post is from 2009, but there's no reason this should have drastically changed). He got that result by testing filesystem overhead of over a dozen different filesystems using guestfish
.
0.5% of your 12TB space is 60GB, so it sounds like that's pretty close to the expected usage. I suspect his number should have been slightly higher than 0.5%, but that it was rounded.
Solution 2:
For XFS, the empty filesystem "Size Used" as shown by df -h
seems to depend a lot on which metadata features you enable at mkfs.xfs
time.
Testing with an empty 12TB file:
# truncate -s 12TB xfstest.img
Default settings (on my current ArchLinux system):
# mkfs.xfs xfstest.img
meta-data=xfstest.img isize=512 agcount=11, agsize=268435455 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=0
data = bsize=4096 blocks=2929687500, imaxpct=5
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=521728, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# mount -o loop xfstest.img loop/
# df -h loop/
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 11T 12G 11T 1% /dev/shm/loop
# umount loop/
Using reflink=1
:
# mkfs.xfs -m reflink=1 -f xfstest.img
meta-data=xfstest.img isize=512 agcount=11, agsize=268435455 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=2929687500, imaxpct=5
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=521728, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# mount -o loop xfstest.img loop/
# df -h loop/
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 11T 78G 11T 1% /dev/shm/loop
Using crc=0
, reflink=0
: (for some reason, that also turns finobt=0
, sparse=0
)
# mkfs.xfs -m reflink=0 -m crc=0 -f xfstest.img
meta-data=xfstest.img isize=256 agcount=11, agsize=268435455 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0, sparse=0, rmapbt=0
= reflink=0
data = bsize=4096 blocks=2929687500, imaxpct=5
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=521728, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# mount -o loop xfstest.img loop/
# df -h loop/
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 11T 33M 11T 1% /dev/shm/loop
In short:
# df -h loop/
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 11T 78G 11T 1% /dev/shm/loop (reflink=1, crc=1)
/dev/loop0 11T 12G 11T 1% /dev/shm/loop (reflink=0, crc=1)
/dev/loop0 11T 33M 11T 1% /dev/shm/loop (reflink=0, crc=0)
So "Used" space on a fresh 12TB filesystem is 78G, 12G or as low as 33M depending on which metadata features you enable at mkfs time.