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