Ffs: Difference between revisions
No edit summary |
|||
Line 14: | Line 14: | ||
For more information on FFS see [http://www.cs.berkeley.edu/~brewer/cs262/FFS.pdf A fast filesystem for UNIX]. | For more information on FFS see [http://www.cs.berkeley.edu/~brewer/cs262/FFS.pdf A fast filesystem for UNIX]. | ||
=== A breakdown of a disk === | |||
I created a virtual disk, it is 32MB big: | |||
# ls -lh disk | |||
-rw-r--r-- 1 root wheel 32.0M Oct 28 08:55 disk | |||
WTF? It's a file! Ok so lets make it a disk device: | |||
# vnconfig -cv svnd0 disk | |||
svnd0: 33554432 bytes on disk | |||
let's make a new partition on it called a: | |||
# disklabel -E /dev/rsvnd0c | |||
disklabel: Can't get bios geometry: Device not configured | |||
Initial label editor (enter '?' for help at any prompt) | |||
> a | |||
partition: [a] | |||
offset: [0] | |||
size: [65536] | |||
FS type: [4.2BSD] | |||
> p a | |||
device: /dev/rsvnd0c | |||
type: SCSI | |||
disk: vnd device | |||
label: fictitious | |||
bytes/sector: 512 | |||
sectors/track: 100 | |||
tracks/cylinder: 1 | |||
sectors/cylinder: 100 | |||
cylinders: 655 | |||
total sectors: 65536 | |||
free sectors: 0 | |||
rpm: 3600 | |||
16 partitions: | |||
# size offset fstype [fsize bsize cpg] | |||
a: 65536 0 4.2BSD 2048 16384 16 # Cyl 0 - 655* | |||
c: 65536 0 unused 0 0 # Cyl 0 - 655* | |||
> q | |||
Write new label?: [y] y | |||
# | |||
Now write the filesystem on it with [[newfs]]: | |||
# newfs /dev/rsvnd0a | |||
Warning: cylinder groups must have a multiple of 8 cylinders | |||
Warning: 64 sector(s) in last cylinder unallocated | |||
/dev/rsvnd0a: 65536 sectors in 656 cylinders of 1 tracks, 100 sectors | |||
32.0MB in 1 cyl groups (656 c/g, 32.03MB/g, 4096 i/g) | |||
super-block backups (for fsck -b #) at: | |||
32, | |||
mount the new filesystem to /mnt: | |||
# mount /dev/svnd0a /mnt | |||
# df /mnt | |||
Filesystem 512-blocks Used Avail Capacity Mounted on | |||
/dev/svnd0a 64412 4 61188 0% /mnt | |||
# df -i /mnt | |||
Filesystem 512-blocks Used Avail Capacity iused ifree %iused Mounted on | |||
/dev/svnd0a 64412 4 61188 0% 1 4093 0% /mnt | |||
OK let's count it up, we have 65536 blocks in total for the disk, 4094 inodes exist at 128 bytes size which is 1023 blocks, and we have 2 superblocks (0 and 32) which are 16384 bytes big each or 32 blocks, then the filesystem space claims 64412 blocks, this gives us a total of 65499 blocks which isn't quite the complete disksize of 65536 blocks, however I left the disklabel unaccounted for which also takes up some space. | |||
Now let's fill the drive: | |||
$ dd if=/dev/zero of=fill bs=1 | |||
/mnt: write failed, file system is full | |||
dd: fill: No space left on device | |||
31326209+0 records in | |||
31326208+0 records out | |||
31326208 bytes transferred in 40.458 secs (774289 bytes/sec) | |||
$ df /mnt | |||
Filesystem 512-blocks Used Avail Capacity Mounted on | |||
/dev/svnd0a 64412 61220 -28 100% /mnt | |||
100% capacity, but the used blocks aren't all the blocks that the filesystem claims, so let's repeat that last step but this time as [[root]]: | |||
# dd if=/dev/zero of=fill bs=1 | |||
/mnt: write failed, file system is full | |||
dd: fill: No space left on device | |||
32931841+0 records in | |||
32931840+0 records out | |||
32931840 bytes transferred in 44.276 secs (743779 bytes/sec) | |||
# df /mnt | |||
Filesystem 512-blocks Used Avail Capacity Mounted on | |||
/dev/svnd0a 64412 64356 -3164 105% /mnt | |||
Lovely almost all used up and it can't go further. Note that we're using up '''105% capacity''' this is built into ffs and can be tweaked at [[newfs]] time. The superuser gets 5% above 100% of capacity noone else. | |||
=== UFS2 === | === UFS2 === |
Revision as of 23:48, 27 October 2005
The Berkeley FFS resides on a disk partition in blocks greater or equal to 4096 bytes (no less). It has a super block that contains filesystem specific data (eg. when the last fsck took place) which is at block 0. It also has backup superblocks in case the first superblock is corrupted (fsck -b to repair a broken superblock and check the filesystem with an alternate superblock), the next superblock is at block 32 and the others are made known at newfs time.
# newfs /dev/rsvnd0a Warning: cylinder groups must have a multiple of 2 cylinders Warning: 64 sector(s) in last cylinder unallocated /dev/rsvnd0a: 65536 sectors in 656 cylinders of 1 tracks, 100 sectors 32.0MB in 3 cyl groups (250 c/g, 12.21MB/g, 3136 i/g) super-block backups (for fsck -b #) at: 32, 25032, 50032,
Here in the example the backups are 32, 25032 and 50032. To find out the alternate superblocks after a filesystem has already been created use newfs -N.
Next (not counting the super-blocks) the filesystem is split into 2 parts. One for a long sequence of inodes and the other for data. The inodes are the reference points for objects and data in the filesystem and they hold information such as permissions, file link count, file size, atime, mtime, ctime, disk blocks used by file, chflags, file owner and file group. The size of a UFS1 inode is 128 bytes. By default an inode exists for every 8192 bytes of filesystem space, this is tweakable with newfs.
For more information on FFS see A fast filesystem for UNIX.
A breakdown of a disk
I created a virtual disk, it is 32MB big:
# ls -lh disk -rw-r--r-- 1 root wheel 32.0M Oct 28 08:55 disk
WTF? It's a file! Ok so lets make it a disk device:
# vnconfig -cv svnd0 disk svnd0: 33554432 bytes on disk
let's make a new partition on it called a:
# disklabel -E /dev/rsvnd0c disklabel: Can't get bios geometry: Device not configured Initial label editor (enter '?' for help at any prompt) > a partition: [a] offset: [0] size: [65536] FS type: [4.2BSD] > p a device: /dev/rsvnd0c type: SCSI disk: vnd device label: fictitious bytes/sector: 512 sectors/track: 100 tracks/cylinder: 1 sectors/cylinder: 100 cylinders: 655 total sectors: 65536 free sectors: 0 rpm: 3600 16 partitions: # size offset fstype [fsize bsize cpg] a: 65536 0 4.2BSD 2048 16384 16 # Cyl 0 - 655* c: 65536 0 unused 0 0 # Cyl 0 - 655* > q Write new label?: [y] y #
Now write the filesystem on it with newfs:
# newfs /dev/rsvnd0a Warning: cylinder groups must have a multiple of 8 cylinders Warning: 64 sector(s) in last cylinder unallocated /dev/rsvnd0a: 65536 sectors in 656 cylinders of 1 tracks, 100 sectors 32.0MB in 1 cyl groups (656 c/g, 32.03MB/g, 4096 i/g) super-block backups (for fsck -b #) at: 32,
mount the new filesystem to /mnt:
# mount /dev/svnd0a /mnt # df /mnt Filesystem 512-blocks Used Avail Capacity Mounted on /dev/svnd0a 64412 4 61188 0% /mnt # df -i /mnt Filesystem 512-blocks Used Avail Capacity iused ifree %iused Mounted on /dev/svnd0a 64412 4 61188 0% 1 4093 0% /mnt
OK let's count it up, we have 65536 blocks in total for the disk, 4094 inodes exist at 128 bytes size which is 1023 blocks, and we have 2 superblocks (0 and 32) which are 16384 bytes big each or 32 blocks, then the filesystem space claims 64412 blocks, this gives us a total of 65499 blocks which isn't quite the complete disksize of 65536 blocks, however I left the disklabel unaccounted for which also takes up some space.
Now let's fill the drive:
$ dd if=/dev/zero of=fill bs=1 /mnt: write failed, file system is full dd: fill: No space left on device 31326209+0 records in 31326208+0 records out 31326208 bytes transferred in 40.458 secs (774289 bytes/sec) $ df /mnt Filesystem 512-blocks Used Avail Capacity Mounted on /dev/svnd0a 64412 61220 -28 100% /mnt
100% capacity, but the used blocks aren't all the blocks that the filesystem claims, so let's repeat that last step but this time as root:
# dd if=/dev/zero of=fill bs=1 /mnt: write failed, file system is full dd: fill: No space left on device 32931841+0 records in 32931840+0 records out 32931840 bytes transferred in 44.276 secs (743779 bytes/sec) # df /mnt Filesystem 512-blocks Used Avail Capacity Mounted on /dev/svnd0a 64412 64356 -3164 105% /mnt
Lovely almost all used up and it can't go further. Note that we're using up 105% capacity this is built into ffs and can be tweaked at newfs time. The superuser gets 5% above 100% of capacity noone else.
UFS2
FreeBSD and NetBSD have a second version of FFS that allows filesystem sizes greater than 1 TB. This is UFS2. The size of an UFS2 inode is 256 bytes and thus UFS1 and UFS2 are not compatible.
Soft Updates
You will want to check out soft-updates if you have ffs, and most likely install it on all partitions except / (example for FreeBSD):
$ less -XF /usr/src/sys/contrib/softupdates/README
To see if you have soft-updates enabled: on FreeBSD:
$ mount /dev/ad0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/ad0s1g on /backup (ufs, local, soft-updates) /dev/ad0s1e on /tmp (ufs, local, soft-updates) /dev/ad0s1f on /usr (ufs, local, soft-updates) /dev/ad0s1d on /var (ufs, local, soft-updates)
on OpenBSD
$ mount /dev/wd0a on / type ffs (local, softdep) /dev/wd0e on /usr type ffs (NFS exported, local, nodev, softdep) /dev/wd0d on /var type ffs (local, nodev, nosuid, softdep) mfs:22707 on /tmp type mfs (asynchronous, local, nodev, nosuid, size=261120 512-blocks)