Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 1 | .. SPDX-License-Identifier: GPL-2.0 |
| 2 | |
| 3 | ======================= |
| 4 | ROMFS - ROM File System |
| 5 | ======================= |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 6 | |
| 7 | This is a quite dumb, read only filesystem, mainly for initial RAM |
| 8 | disks of installation disks. It has grown up by the need of having |
| 9 | modules linked at boot time. Using this filesystem, you get a very |
| 10 | similar feature, and even the possibility of a small kernel, with a |
| 11 | file system which doesn't take up useful memory from the router |
| 12 | functions in the basement of your office. |
| 13 | |
| 14 | For comparison, both the older minix and xiafs (the latter is now |
| 15 | defunct) filesystems, compiled as module need more than 20000 bytes, |
| 16 | while romfs is less than a page, about 4000 bytes (assuming i586 |
| 17 | code). Under the same conditions, the msdos filesystem would need |
| 18 | about 30K (and does not support device nodes or symlinks), while the |
| 19 | nfs module with nfsroot is about 57K. Furthermore, as a bit unfair |
| 20 | comparison, an actual rescue disk used up 3202 blocks with ext2, while |
| 21 | with romfs, it needed 3079 blocks. |
| 22 | |
| 23 | To create such a file system, you'll need a user program named |
Alexander Kurz | ddf1228 | 2011-02-17 09:35:47 +0100 | [diff] [blame] | 24 | genromfs. It is available on http://romfs.sourceforge.net/ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 25 | |
| 26 | As the name suggests, romfs could be also used (space-efficiently) on |
| 27 | various read-only media, like (E)EPROM disks if someone will have the |
| 28 | motivation.. :) |
| 29 | |
| 30 | However, the main purpose of romfs is to have a very small kernel, |
| 31 | which has only this filesystem linked in, and then can load any module |
| 32 | later, with the current module utilities. It can also be used to run |
| 33 | some program to decide if you need SCSI devices, and even IDE or |
| 34 | floppy drives can be loaded later if you use the "initrd"--initial |
| 35 | RAM disk--feature of the kernel. This would not be really news |
| 36 | flash, but with romfs, you can even spare off your ext2 or minix or |
| 37 | maybe even affs filesystem until you really know that you need it. |
| 38 | |
| 39 | For example, a distribution boot disk can contain only the cd disk |
| 40 | drivers (and possibly the SCSI drivers), and the ISO 9660 filesystem |
| 41 | module. The kernel can be small enough, since it doesn't have other |
| 42 | filesystems, like the quite large ext2fs module, which can then be |
| 43 | loaded off the CD at a later stage of the installation. Another use |
| 44 | would be for a recovery disk, when you are reinstalling a workstation |
| 45 | from the network, and you will have all the tools/modules available |
| 46 | from a nearby server, so you don't want to carry two disks for this |
| 47 | purpose, just because it won't fit into ext2. |
| 48 | |
| 49 | romfs operates on block devices as you can expect, and the underlying |
| 50 | structure is very simple. Every accessible structure begins on 16 |
| 51 | byte boundaries for fast access. The minimum space a file will take |
| 52 | is 32 bytes (this is an empty file, with a less than 16 character |
| 53 | name). The maximum overhead for any non-empty file is the header, and |
| 54 | the 16 byte padding for the name and the contents, also 16+14+15 = 45 |
| 55 | bytes. This is quite rare however, since most file names are longer |
| 56 | than 3 bytes, and shorter than 15 bytes. |
| 57 | |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 58 | The layout of the filesystem is the following:: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 59 | |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 60 | offset content |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 61 | |
| 62 | +---+---+---+---+ |
| 63 | 0 | - | r | o | m | \ |
| 64 | +---+---+---+---+ The ASCII representation of those bytes |
| 65 | 4 | 1 | f | s | - | / (i.e. "-rom1fs-") |
| 66 | +---+---+---+---+ |
| 67 | 8 | full size | The number of accessible bytes in this fs. |
| 68 | +---+---+---+---+ |
| 69 | 12 | checksum | The checksum of the FIRST 512 BYTES. |
| 70 | +---+---+---+---+ |
| 71 | 16 | volume name | The zero terminated name of the volume, |
| 72 | : : padded to 16 byte boundary. |
| 73 | +---+---+---+---+ |
| 74 | xx | file | |
| 75 | : headers : |
| 76 | |
| 77 | Every multi byte value (32 bit words, I'll use the longwords term from |
| 78 | now on) must be in big endian order. |
| 79 | |
| 80 | The first eight bytes identify the filesystem, even for the casual |
| 81 | inspector. After that, in the 3rd longword, it contains the number of |
| 82 | bytes accessible from the start of this filesystem. The 4th longword |
| 83 | is the checksum of the first 512 bytes (or the number of bytes |
| 84 | accessible, whichever is smaller). The applied algorithm is the same |
| 85 | as in the AFFS filesystem, namely a simple sum of the longwords |
| 86 | (assuming bigendian quantities again). For details, please consult |
| 87 | the source. This algorithm was chosen because although it's not quite |
| 88 | reliable, it does not require any tables, and it is very simple. |
| 89 | |
| 90 | The following bytes are now part of the file system; each file header |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 91 | must begin on a 16 byte boundary:: |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 92 | |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 93 | offset content |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 94 | |
| 95 | +---+---+---+---+ |
| 96 | 0 | next filehdr|X| The offset of the next file header |
| 97 | +---+---+---+---+ (zero if no more files) |
| 98 | 4 | spec.info | Info for directories/hard links/devices |
| 99 | +---+---+---+---+ |
| 100 | 8 | size | The size of this file in bytes |
| 101 | +---+---+---+---+ |
| 102 | 12 | checksum | Covering the meta data, including the file |
| 103 | +---+---+---+---+ name, and padding |
| 104 | 16 | file name | The zero terminated name of the file, |
| 105 | : : padded to 16 byte boundary |
| 106 | +---+---+---+---+ |
| 107 | xx | file data | |
| 108 | : : |
| 109 | |
| 110 | Since the file headers begin always at a 16 byte boundary, the lowest |
| 111 | 4 bits would be always zero in the next filehdr pointer. These four |
| 112 | bits are used for the mode information. Bits 0..2 specify the type of |
| 113 | the file; while bit 4 shows if the file is executable or not. The |
| 114 | permissions are assumed to be world readable, if this bit is not set, |
| 115 | and world executable if it is; except the character and block devices, |
| 116 | they are never accessible for other than owner. The owner of every |
| 117 | file is user and group 0, this should never be a problem for the |
| 118 | intended use. The mapping of the 8 possible values to file types is |
| 119 | the following: |
| 120 | |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 121 | == =============== ============================================ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 122 | mapping spec.info means |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 123 | == =============== ============================================ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 124 | 0 hard link link destination [file header] |
| 125 | 1 directory first file's header |
| 126 | 2 regular file unused, must be zero [MBZ] |
| 127 | 3 symbolic link unused, MBZ (file data is the link content) |
| 128 | 4 block device 16/16 bits major/minor number |
| 129 | 5 char device - " - |
| 130 | 6 socket unused, MBZ |
| 131 | 7 fifo unused, MBZ |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 132 | == =============== ============================================ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 133 | |
| 134 | Note that hard links are specifically marked in this filesystem, but |
| 135 | they will behave as you can expect (i.e. share the inode number). |
| 136 | Note also that it is your responsibility to not create hard link |
| 137 | loops, and creating all the . and .. links for directories. This is |
| 138 | normally done correctly by the genromfs program. Please refrain from |
| 139 | using the executable bits for special purposes on the socket and fifo |
| 140 | special files, they may have other uses in the future. Additionally, |
| 141 | please remember that only regular files, and symlinks are supposed to |
| 142 | have a nonzero size field; they contain the number of bytes available |
| 143 | directly after the (padded) file name. |
| 144 | |
| 145 | Another thing to note is that romfs works on file headers and data |
| 146 | aligned to 16 byte boundaries, but most hardware devices and the block |
| 147 | device drivers are unable to cope with smaller than block-sized data. |
| 148 | To overcome this limitation, the whole size of the file system must be |
| 149 | padded to an 1024 byte boundary. |
| 150 | |
| 151 | If you have any problems or suggestions concerning this file system, |
| 152 | please contact me. However, think twice before wanting me to add |
| 153 | features and code, because the primary and most important advantage of |
| 154 | this file system is the small code. On the other hand, don't be |
| 155 | alarmed, I'm not getting that much romfs related mail. Now I can |
| 156 | understand why Avery wrote poems in the ARCnet docs to get some more |
| 157 | feedback. :) |
| 158 | |
| 159 | romfs has also a mailing list, and to date, it hasn't received any |
| 160 | traffic, so you are welcome to join it to discuss your ideas. :) |
| 161 | |
| 162 | It's run by ezmlm, so you can subscribe to it by sending a message |
| 163 | to romfs-subscribe@shadow.banki.hu, the content is irrelevant. |
| 164 | |
| 165 | Pending issues: |
| 166 | |
| 167 | - Permissions and owner information are pretty essential features of a |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 168 | Un*x like system, but romfs does not provide the full possibilities. |
| 169 | I have never found this limiting, but others might. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 170 | |
| 171 | - The file system is read only, so it can be very small, but in case |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 172 | one would want to write _anything_ to a file system, he still needs |
| 173 | a writable file system, thus negating the size advantages. Possible |
| 174 | solutions: implement write access as a compile-time option, or a new, |
| 175 | similarly small writable filesystem for RAM disks. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 176 | |
| 177 | - Since the files are only required to have alignment on a 16 byte |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 178 | boundary, it is currently possibly suboptimal to read or execute files |
| 179 | from the filesystem. It might be resolved by reordering file data to |
| 180 | have most of it (i.e. except the start and the end) laying at "natural" |
| 181 | boundaries, thus it would be possible to directly map a big portion of |
| 182 | the file contents to the mm subsystem. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 183 | |
| 184 | - Compression might be an useful feature, but memory is quite a |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 185 | limiting factor in my eyes. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 186 | |
| 187 | - Where it is used? |
| 188 | |
| 189 | - Does it work on other architectures than intel and motorola? |
| 190 | |
| 191 | |
| 192 | Have fun, |
Mauro Carvalho Chehab | 6db0a48 | 2020-02-17 17:12:22 +0100 | [diff] [blame] | 193 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 194 | Janos Farkas <chexum@shadow.banki.hu> |