Annotation of 43BSDReno/share/doc/smm/05.fsck/3.t, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1982 Regents of the University of California.
                      2: .\" All rights reserved.  The Berkeley software License Agreement
                      3: .\" specifies the terms and conditions for redistribution.
                      4: .\"
                      5: .\"    @(#)3.t 4.3 (Berkeley) 2/1/86
                      6: .\"
                      7: .ds RH Fixing corrupted file systems
                      8: .NH
                      9: Fixing corrupted file systems
                     10: .PP
                     11: A file system
                     12: can become corrupted in several ways.
                     13: The most common of these ways are
                     14: improper shutdown procedures
                     15: and hardware failures.
                     16: .PP
                     17: File systems may become corrupted during an
                     18: .I "unclean halt" .
                     19: This happens when proper shutdown
                     20: procedures are not observed,
                     21: physically write-protecting a mounted file system,
                     22: or a mounted file system is taken off-line.
                     23: The most common operator procedural failure is forgetting to
                     24: .I sync
                     25: the system before halting the CPU.
                     26: .PP
                     27: File systems may become further corrupted if proper startup
                     28: procedures are not observed, e.g.,
                     29: not checking a file system for inconsistencies,
                     30: and not repairing inconsistencies.
                     31: Allowing a corrupted file system to be used (and, thus, to be modified
                     32: further) can be disastrous.
                     33: .PP
                     34: Any piece of hardware can fail at any time.
                     35: Failures
                     36: can be as subtle as a bad block
                     37: on a disk pack, or as blatant as a non-functional disk-controller.
                     38: .NH 2
                     39: Detecting and correcting corruption
                     40: .PP
                     41: Normally
                     42: .I fsck
                     43: is run non-interactively.
                     44: In this mode it will only fix
                     45: corruptions that are expected to occur from an unclean halt.
                     46: These actions are a proper subset of the actions that 
                     47: .I fsck
                     48: will take when it is running interactively.
                     49: Throughout this paper we assume that 
                     50: .I fsck 
                     51: is being run interactively,
                     52: and all possible errors can be encountered.
                     53: When an inconsistency is discovered in this mode,
                     54: .I fsck
                     55: reports the inconsistency for the operator to
                     56: chose a corrective action.
                     57: .PP
                     58: A quiescent\(dd
                     59: .FS
                     60: \(dd I.e., unmounted and not being written on.
                     61: .FE
                     62: file system may be checked for structural integrity
                     63: by performing consistency checks on the
                     64: redundant data intrinsic to a file system.
                     65: The redundant data is either read from
                     66: the file system,
                     67: or computed from other known values.
                     68: The file system
                     69: .B must
                     70: be in a quiescent state when
                     71: .I fsck
                     72: is run,
                     73: since
                     74: .I fsck
                     75: is a multi-pass program.
                     76: .PP
                     77: In the following sections,
                     78: we discuss methods to discover inconsistencies
                     79: and possible corrective actions
                     80: for the cylinder group blocks, the inodes, the indirect blocks, and
                     81: the data blocks containing directory entries.
                     82: .NH 2
                     83: Super-block checking
                     84: .PP
                     85: The most commonly corrupted item in a file system
                     86: is the summary information
                     87: associated with the super-block.
                     88: The summary information is prone to corruption
                     89: because it is modified with every change to the file
                     90: system's blocks or inodes,
                     91: and is usually corrupted
                     92: after an unclean halt.
                     93: .PP
                     94: The super-block is checked for inconsistencies
                     95: involving file-system size, number of inodes,
                     96: free-block count, and the free-inode count.
                     97: The file-system size must be larger than the
                     98: number of blocks used by the super-block
                     99: and the number of blocks used by the list of inodes.
                    100: The file-system size and layout information
                    101: are the most critical pieces of information for
                    102: .I fsck .
                    103: While there is no way to actually check these sizes,
                    104: since they are statically determined by
                    105: .I newfs ,
                    106: .I fsck
                    107: can check that these sizes are within reasonable bounds.
                    108: All other file system checks require that these sizes be correct.
                    109: If
                    110: .I fsck 
                    111: detects corruption in the static parameters of the default super-block,
                    112: .I fsck
                    113: requests the operator to specify the location of an alternate super-block.
                    114: .NH 2
                    115: Free block checking
                    116: .PP
                    117: .I Fsck
                    118: checks that all the blocks
                    119: marked as free in the cylinder group block maps
                    120: are not claimed by any files.
                    121: When all the blocks have been initially accounted for,
                    122: .I fsck
                    123: checks that
                    124: the number of free blocks
                    125: plus the number of blocks claimed by the inodes
                    126: equals the total number of blocks in the file system.
                    127: .PP
                    128: If anything is wrong with the block allocation maps,
                    129: .I fsck
                    130: will rebuild them,
                    131: based on the list it has computed of allocated blocks.
                    132: .PP
                    133: The summary information associated with the super-block
                    134: counts the total number of free blocks within the file system.
                    135: .I Fsck
                    136: compares this count to the
                    137: number of free blocks it found within the file system.
                    138: If the two counts do not agree, then
                    139: .I fsck
                    140: replaces the incorrect count in the summary information
                    141: by the actual free-block count.
                    142: .PP
                    143: The summary information
                    144: counts the total number of free inodes within the file system.
                    145: .I Fsck
                    146: compares this count to the number
                    147: of free inodes it found within the file system.
                    148: If the two counts do not agree, then
                    149: .I fsck
                    150: replaces the incorrect count in the
                    151: summary information by the actual free-inode count.
                    152: .NH 2
                    153: Checking the inode state
                    154: .PP
                    155: An individual inode is not as likely to be corrupted as
                    156: the allocation information.
                    157: However, because of the great number of active inodes,
                    158: a few of the inodes are usually corrupted.
                    159: .PP
                    160: The list of inodes in the file system
                    161: is checked sequentially starting with inode 2
                    162: (inode 0 marks unused inodes;
                    163: inode 1 is saved for future generations)
                    164: and progressing through the last inode in the file system.
                    165: The state of each inode is checked for
                    166: inconsistencies involving format and type,
                    167: link count,
                    168: duplicate blocks,
                    169: bad blocks,
                    170: and inode size.
                    171: .PP
                    172: Each inode contains a mode word.
                    173: This mode word describes the type and state of the inode.
                    174: Inodes must be one of six types:
                    175: regular inode, directory inode, symbolic link inode,
                    176: special block inode, special character inode, or socket inode.
                    177: Inodes may be found in one of three allocation states:
                    178: unallocated, allocated, and neither unallocated nor allocated.
                    179: This last state suggests an incorrectly formated inode.
                    180: An inode can get in this state if
                    181: bad data is written into the inode list.
                    182: The only possible corrective action is for
                    183: .I fsck
                    184: is to clear the inode.
                    185: .NH 2
                    186: Inode links
                    187: .PP
                    188: Each inode counts the
                    189: total number of directory entries
                    190: linked to the inode.
                    191: .I Fsck
                    192: verifies the link count of each inode
                    193: by starting at the root of the file system,
                    194: and descending through the directory structure.
                    195: The actual link count for each inode
                    196: is calculated during the descent.
                    197: .PP
                    198: If the stored link count is non-zero and the actual
                    199: link count is zero,
                    200: then no directory entry appears for the inode.
                    201: If this happens,
                    202: .I fsck
                    203: will place the disconnected file in the
                    204: .I lost+found
                    205: directory.
                    206: If the stored and actual link counts are non-zero and unequal,
                    207: a directory entry may have been added or removed without the inode being
                    208: updated.
                    209: If this happens,
                    210: .I fsck
                    211: replaces the incorrect stored link count by the actual link count.
                    212: .PP
                    213: Each inode contains a list,
                    214: or pointers to
                    215: lists (indirect blocks),
                    216: of all the blocks claimed by the inode.
                    217: Since indirect blocks are owned by an inode,
                    218: inconsistencies in indirect blocks directly
                    219: affect the inode that owns it.
                    220: .PP
                    221: .I Fsck
                    222: compares each block number claimed by an inode
                    223: against a list of already allocated blocks.
                    224: If another inode already claims a block number,
                    225: then the block number is added to a list of
                    226: .I "duplicate blocks" .
                    227: Otherwise, the list of allocated blocks
                    228: is updated to include the block number.
                    229: .PP
                    230: If there are any duplicate blocks,
                    231: .I fsck
                    232: will perform a partial second
                    233: pass over the inode list
                    234: to find the inode of the duplicated block.
                    235: The second pass is needed,
                    236: since without examining the files associated with
                    237: these inodes for correct content,
                    238: not enough information is available
                    239: to determine which inode is corrupted and should be cleared.
                    240: If this condition does arise
                    241: (only hardware failure will cause it),
                    242: then the inode with the earliest
                    243: modify time is usually incorrect,
                    244: and should be cleared.
                    245: If this happens,
                    246: .I fsck
                    247: prompts the operator to clear both inodes.
                    248: The operator must decide which one should be kept
                    249: and which one should be cleared.
                    250: .PP
                    251: .I Fsck
                    252: checks the range of each block number claimed by an inode.
                    253: If the block number is
                    254: lower than the first data block in the file system,
                    255: or greater than the last data block,
                    256: then the block number is a
                    257: .I "bad block number" .
                    258: Many bad blocks in an inode are usually caused by
                    259: an indirect block that was not written to the file system,
                    260: a condition which can only occur if there has been a hardware failure.
                    261: If an inode contains bad block numbers,
                    262: .I fsck
                    263: prompts the operator to clear it.
                    264: .NH 2
                    265: Inode data size
                    266: .PP
                    267: Each inode contains a count of the number of data blocks
                    268: that it contains.
                    269: The number of actual data blocks
                    270: is the sum of the allocated data blocks
                    271: and the indirect blocks.
                    272: .I Fsck
                    273: computes the actual number of data blocks
                    274: and compares that block count against
                    275: the actual number of blocks the inode claims.
                    276: If an inode contains an incorrect count
                    277: .I fsck
                    278: prompts the operator to fix it.
                    279: .PP
                    280: Each inode contains a thirty-two bit size field.
                    281: The size is the number of data bytes
                    282: in the file associated with the inode.
                    283: The consistency of the byte size field is roughly checked
                    284: by computing from the size field the maximum number of blocks
                    285: that should be associated with the inode,
                    286: and comparing that expected block count against
                    287: the actual number of blocks the inode claims.
                    288: .NH 2
                    289: Checking the data associated with an inode
                    290: .PP
                    291: An inode can directly or indirectly
                    292: reference three kinds of data blocks.
                    293: All referenced blocks must be the same kind.
                    294: The three types of data blocks are:
                    295: plain data blocks, symbolic link data blocks, and directory data blocks.
                    296: Plain data blocks
                    297: contain the information stored in a file;
                    298: symbolic link data blocks
                    299: contain the path name stored in a link.
                    300: Directory data blocks contain directory entries.
                    301: .I Fsck
                    302: can only check the validity of directory data blocks.
                    303: .PP
                    304: Each directory data block is checked for
                    305: several types of inconsistencies.
                    306: These inconsistencies include
                    307: directory inode numbers pointing to unallocated inodes,
                    308: directory inode numbers that are greater than
                    309: the number of inodes in the file system,
                    310: incorrect directory inode numbers for ``\fB.\fP'' and ``\fB..\fP'',
                    311: and directories that are not attached to the file system.
                    312: If the inode number in a directory data block
                    313: references an unallocated inode,
                    314: then
                    315: .I fsck
                    316: will remove that directory entry.
                    317: Again,
                    318: this condition can only arise when there has been a hardware failure.
                    319: .PP
                    320: If a directory entry inode number references
                    321: outside the inode list, then
                    322: .I fsck
                    323: will remove that directory entry.
                    324: This condition occurs if bad data is written into a directory data block.
                    325: .PP
                    326: The directory inode number entry for ``\fB.\fP''
                    327: must be the first entry in the directory data block.
                    328: The inode number for ``\fB.\fP''
                    329: must reference itself;
                    330: e.g., it must equal the inode number
                    331: for the directory data block.
                    332: The directory inode number entry
                    333: for ``\fB..\fP'' must be
                    334: the second entry in the directory data block.
                    335: Its value must equal the inode number for the
                    336: parent of the directory entry
                    337: (or the inode number of the directory
                    338: data block if the directory is the
                    339: root directory).
                    340: If the directory inode numbers are
                    341: incorrect,
                    342: .I fsck
                    343: will replace them with the correct values.
                    344: If there are multiple hard links to a directory,
                    345: the first one encountered is considered the real parent
                    346: to which ``\fB..\fP'' should point;
                    347: \fIfsck\P recommends deletion for the subsequently discovered names.
                    348: .NH 2
                    349: File system connectivity
                    350: .PP
                    351: .I Fsck
                    352: checks the general connectivity of the file system.
                    353: If directories are not linked into the file system, then
                    354: .I fsck
                    355: links the directory back into the file system in the
                    356: .I lost+found
                    357: directory.
                    358: This condition only occurs when there has been a hardware failure.
                    359: .ds RH "References"
                    360: .SH
                    361: \s+2Acknowledgements\s0
                    362: .PP
                    363: I thank Bill Joy, Sam Leffler, Robert Elz and Dennis Ritchie 
                    364: for their suggestions and help in implementing the new file system.
                    365: Thanks also to Robert Henry for his editorial input to
                    366: get this document together.
                    367: Finally we thank our sponsors,
                    368: the National Science Foundation under grant MCS80-05144,
                    369: and the Defense Advance Research Projects Agency (DoD) under
                    370: Arpa Order No. 4031 monitored by Naval Electronic System Command under
                    371: Contract No. N00039-82-C-0235. (Kirk McKusick, July 1983)
                    372: .PP
                    373: I would like to thank Larry A. Wehr for advice that lead
                    374: to the first version of
                    375: .I fsck
                    376: and Rick B. Brandt for adapting
                    377: .I fsck
                    378: to
                    379: UNIX/TS. (T. Kowalski, July 1979)
                    380: .sp 2
                    381: .SH
                    382: \s+2References\s0
                    383: .LP
                    384: .IP [Dolotta78] 20
                    385: Dolotta, T. A., and Olsson, S. B. eds.,
                    386: .I "UNIX User's Manual, Edition 1.1\^" ,
                    387: January 1978.
                    388: .IP [Joy83] 20
                    389: Joy, W., Cooper, E., Fabry, R., Leffler, S., McKusick, M., and Mosher, D.
                    390: 4.2BSD System Manual,
                    391: .I "University of California at Berkeley" ,
                    392: .I "Computer Systems Research Group Technical Report"
                    393: #4, 1982.
                    394: .IP [McKusick84] 20
                    395: McKusick, M., Joy, W., Leffler, S., and Fabry, R.
                    396: A Fast File System for UNIX,
                    397: \fIACM Transactions on Computer Systems 2\fP, 3.
                    398: pp. 181-197, August 1984.
                    399: .IP [Ritchie78] 20
                    400: Ritchie, D. M., and Thompson, K.,
                    401: The UNIX Time-Sharing System,
                    402: .I "The Bell System Technical Journal"
                    403: .B 57 ,
                    404: 6 (July-August 1978, Part 2), pp. 1905-29.
                    405: .IP [Thompson78] 20
                    406: Thompson, K.,
                    407: UNIX Implementation,
                    408: .I "The Bell System Technical Journal\^"
                    409: .B 57 ,
                    410: 6 (July-August 1978, Part 2), pp. 1931-46.
                    411: .ds RH Appendix A \- Fsck Error Conditions
                    412: .bp

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.