xref: /OK3568_Linux_fs/kernel/Documentation/filesystems/sysv-fs.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun.. SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun==================
4*4882a593SmuzhiyunSystemV Filesystem
5*4882a593Smuzhiyun==================
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunIt implements all of
8*4882a593Smuzhiyun  - Xenix FS,
9*4882a593Smuzhiyun  - SystemV/386 FS,
10*4882a593Smuzhiyun  - Coherent FS.
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunTo install:
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun* Answer the 'System V and Coherent filesystem support' question with 'y'
15*4882a593Smuzhiyun  when configuring the kernel.
16*4882a593Smuzhiyun* To mount a disk or a partition, use::
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun    mount [-r] -t sysv device mountpoint
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun  The file system type names::
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun               -t sysv
23*4882a593Smuzhiyun               -t xenix
24*4882a593Smuzhiyun               -t coherent
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun  may be used interchangeably, but the last two will eventually disappear.
27*4882a593Smuzhiyun
28*4882a593SmuzhiyunBugs in the present implementation:
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun- Coherent FS:
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun  - The "free list interleave" n:m is currently ignored.
33*4882a593Smuzhiyun  - Only file systems with no filesystem name and no pack name are recognized.
34*4882a593Smuzhiyun    (See Coherent "man mkfs" for a description of these features.)
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun- SystemV Release 2 FS:
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun  The superblock is only searched in the blocks 9, 15, 18, which
39*4882a593Smuzhiyun  corresponds to the beginning of track 1 on floppy disks. No support
40*4882a593Smuzhiyun  for this FS on hard disk yet.
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun
43*4882a593SmuzhiyunThese filesystems are rather similar. Here is a comparison with Minix FS:
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun* Linux fdisk reports on partitions
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun  - Minix FS     0x81 Linux/Minix
48*4882a593Smuzhiyun  - Xenix FS     ??
49*4882a593Smuzhiyun  - SystemV FS   ??
50*4882a593Smuzhiyun  - Coherent FS  0x08 AIX bootable
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun* Size of a block or zone (data allocation unit on disk)
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun  - Minix FS     1024
55*4882a593Smuzhiyun  - Xenix FS     1024 (also 512 ??)
56*4882a593Smuzhiyun  - SystemV FS   1024 (also 512 and 2048)
57*4882a593Smuzhiyun  - Coherent FS   512
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun* General layout: all have one boot block, one super block and
60*4882a593Smuzhiyun  separate areas for inodes and for directories/data.
61*4882a593Smuzhiyun  On SystemV Release 2 FS (e.g. Microport) the first track is reserved and
62*4882a593Smuzhiyun  all the block numbers (including the super block) are offset by one track.
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun* Byte ordering of "short" (16 bit entities) on disk:
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun  - Minix FS     little endian  0 1
67*4882a593Smuzhiyun  - Xenix FS     little endian  0 1
68*4882a593Smuzhiyun  - SystemV FS   little endian  0 1
69*4882a593Smuzhiyun  - Coherent FS  little endian  0 1
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun  Of course, this affects only the file system, not the data of files on it!
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun* Byte ordering of "long" (32 bit entities) on disk:
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun  - Minix FS     little endian  0 1 2 3
76*4882a593Smuzhiyun  - Xenix FS     little endian  0 1 2 3
77*4882a593Smuzhiyun  - SystemV FS   little endian  0 1 2 3
78*4882a593Smuzhiyun  - Coherent FS  PDP-11         2 3 0 1
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun  Of course, this affects only the file system, not the data of files on it!
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun* Inode on disk: "short", 0 means non-existent, the root dir ino is:
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun  =================================  ==
85*4882a593Smuzhiyun  Minix FS                            1
86*4882a593Smuzhiyun  Xenix FS, SystemV FS, Coherent FS   2
87*4882a593Smuzhiyun  =================================  ==
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun* Maximum number of hard links to a file:
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun  ===========  =========
92*4882a593Smuzhiyun  Minix FS     250
93*4882a593Smuzhiyun  Xenix FS     ??
94*4882a593Smuzhiyun  SystemV FS   ??
95*4882a593Smuzhiyun  Coherent FS  >=10000
96*4882a593Smuzhiyun  ===========  =========
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun* Free inode management:
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun  - Minix FS
101*4882a593Smuzhiyun      a bitmap
102*4882a593Smuzhiyun  - Xenix FS, SystemV FS, Coherent FS
103*4882a593Smuzhiyun      There is a cache of a certain number of free inodes in the super-block.
104*4882a593Smuzhiyun      When it is exhausted, new free inodes are found using a linear search.
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun* Free block management:
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun  - Minix FS
109*4882a593Smuzhiyun      a bitmap
110*4882a593Smuzhiyun  - Xenix FS, SystemV FS, Coherent FS
111*4882a593Smuzhiyun      Free blocks are organized in a "free list". Maybe a misleading term,
112*4882a593Smuzhiyun      since it is not true that every free block contains a pointer to
113*4882a593Smuzhiyun      the next free block. Rather, the free blocks are organized in chunks
114*4882a593Smuzhiyun      of limited size, and every now and then a free block contains pointers
115*4882a593Smuzhiyun      to the free blocks pertaining to the next chunk; the first of these
116*4882a593Smuzhiyun      contains pointers and so on. The list terminates with a "block number"
117*4882a593Smuzhiyun      0 on Xenix FS and SystemV FS, with a block zeroed out on Coherent FS.
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun* Super-block location:
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun  ===========  ==========================
122*4882a593Smuzhiyun  Minix FS     block 1 = bytes 1024..2047
123*4882a593Smuzhiyun  Xenix FS     block 1 = bytes 1024..2047
124*4882a593Smuzhiyun  SystemV FS   bytes 512..1023
125*4882a593Smuzhiyun  Coherent FS  block 1 = bytes 512..1023
126*4882a593Smuzhiyun  ===========  ==========================
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun* Super-block layout:
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun  - Minix FS::
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun                    unsigned short s_ninodes;
133*4882a593Smuzhiyun                    unsigned short s_nzones;
134*4882a593Smuzhiyun                    unsigned short s_imap_blocks;
135*4882a593Smuzhiyun                    unsigned short s_zmap_blocks;
136*4882a593Smuzhiyun                    unsigned short s_firstdatazone;
137*4882a593Smuzhiyun                    unsigned short s_log_zone_size;
138*4882a593Smuzhiyun                    unsigned long s_max_size;
139*4882a593Smuzhiyun                    unsigned short s_magic;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun  - Xenix FS, SystemV FS, Coherent FS::
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun                    unsigned short s_firstdatazone;
144*4882a593Smuzhiyun                    unsigned long  s_nzones;
145*4882a593Smuzhiyun                    unsigned short s_fzone_count;
146*4882a593Smuzhiyun                    unsigned long  s_fzones[NICFREE];
147*4882a593Smuzhiyun                    unsigned short s_finode_count;
148*4882a593Smuzhiyun                    unsigned short s_finodes[NICINOD];
149*4882a593Smuzhiyun                    char           s_flock;
150*4882a593Smuzhiyun                    char           s_ilock;
151*4882a593Smuzhiyun                    char           s_modified;
152*4882a593Smuzhiyun                    char           s_rdonly;
153*4882a593Smuzhiyun                    unsigned long  s_time;
154*4882a593Smuzhiyun                    short          s_dinfo[4]; -- SystemV FS only
155*4882a593Smuzhiyun                    unsigned long  s_free_zones;
156*4882a593Smuzhiyun                    unsigned short s_free_inodes;
157*4882a593Smuzhiyun                    short          s_dinfo[4]; -- Xenix FS only
158*4882a593Smuzhiyun                    unsigned short s_interleave_m,s_interleave_n; -- Coherent FS only
159*4882a593Smuzhiyun                    char           s_fname[6];
160*4882a593Smuzhiyun                    char           s_fpack[6];
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun    then they differ considerably:
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun        Xenix FS::
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun                    char           s_clean;
167*4882a593Smuzhiyun                    char           s_fill[371];
168*4882a593Smuzhiyun                    long           s_magic;
169*4882a593Smuzhiyun                    long           s_type;
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun        SystemV FS::
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun                    long           s_fill[12 or 14];
174*4882a593Smuzhiyun                    long           s_state;
175*4882a593Smuzhiyun                    long           s_magic;
176*4882a593Smuzhiyun                    long           s_type;
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun        Coherent FS::
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun                    unsigned long  s_unique;
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun    Note that Coherent FS has no magic.
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun* Inode layout:
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun  - Minix FS::
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun                    unsigned short i_mode;
189*4882a593Smuzhiyun                    unsigned short i_uid;
190*4882a593Smuzhiyun                    unsigned long  i_size;
191*4882a593Smuzhiyun                    unsigned long  i_time;
192*4882a593Smuzhiyun                    unsigned char  i_gid;
193*4882a593Smuzhiyun                    unsigned char  i_nlinks;
194*4882a593Smuzhiyun                    unsigned short i_zone[7+1+1];
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun  - Xenix FS, SystemV FS, Coherent FS::
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun                    unsigned short i_mode;
199*4882a593Smuzhiyun                    unsigned short i_nlink;
200*4882a593Smuzhiyun                    unsigned short i_uid;
201*4882a593Smuzhiyun                    unsigned short i_gid;
202*4882a593Smuzhiyun                    unsigned long  i_size;
203*4882a593Smuzhiyun                    unsigned char  i_zone[3*(10+1+1+1)];
204*4882a593Smuzhiyun                    unsigned long  i_atime;
205*4882a593Smuzhiyun                    unsigned long  i_mtime;
206*4882a593Smuzhiyun                    unsigned long  i_ctime;
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun* Regular file data blocks are organized as
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun  - Minix FS:
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun             - 7 direct blocks
214*4882a593Smuzhiyun	     - 1 indirect block (pointers to blocks)
215*4882a593Smuzhiyun             - 1 double-indirect block (pointer to pointers to blocks)
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun  - Xenix FS, SystemV FS, Coherent FS:
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun             - 10 direct blocks
220*4882a593Smuzhiyun             -  1 indirect block (pointers to blocks)
221*4882a593Smuzhiyun             -  1 double-indirect block (pointer to pointers to blocks)
222*4882a593Smuzhiyun             -  1 triple-indirect block (pointer to pointers to pointers to blocks)
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun  ===========  ==========   ================
226*4882a593Smuzhiyun               Inode size   inodes per block
227*4882a593Smuzhiyun  ===========  ==========   ================
228*4882a593Smuzhiyun  Minix FS        32        32
229*4882a593Smuzhiyun  Xenix FS        64        16
230*4882a593Smuzhiyun  SystemV FS      64        16
231*4882a593Smuzhiyun  Coherent FS     64        8
232*4882a593Smuzhiyun  ===========  ==========   ================
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun* Directory entry on disk
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun  - Minix FS::
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun                    unsigned short inode;
239*4882a593Smuzhiyun                    char name[14/30];
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun  - Xenix FS, SystemV FS, Coherent FS::
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun                    unsigned short inode;
244*4882a593Smuzhiyun                    char name[14];
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun  ===========    ==============    =====================
247*4882a593Smuzhiyun                 Dir entry size    dir entries per block
248*4882a593Smuzhiyun  ===========    ==============    =====================
249*4882a593Smuzhiyun  Minix FS       16/32             64/32
250*4882a593Smuzhiyun  Xenix FS       16                64
251*4882a593Smuzhiyun  SystemV FS     16                64
252*4882a593Smuzhiyun  Coherent FS    16                32
253*4882a593Smuzhiyun  ===========    ==============    =====================
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun* How to implement symbolic links such that the host fsck doesn't scream:
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun  - Minix FS     normal
258*4882a593Smuzhiyun  - Xenix FS     kludge: as regular files with  chmod 1000
259*4882a593Smuzhiyun  - SystemV FS   ??
260*4882a593Smuzhiyun  - Coherent FS  kludge: as regular files with  chmod 1000
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun
263*4882a593SmuzhiyunNotation: We often speak of a "block" but mean a zone (the allocation unit)
264*4882a593Smuzhiyunand not the disk driver's notion of "block".
265