|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.