fsck of large volume with small memory
Don Lewis
truckman at FreeBSD.org
Mon Sep 24 16:56:18 PDT 2007
On 24 Sep, sam wrote:
> hi, all
> http://lists.freebsd.org/pipermail/freebsd-questions/2007-June/151686.html
>
> my problem
> # fsck /dev/aacd0s1f
> ** /dev/aacd0s1f (NO WRITE)
> ** Last Mounted on /usr
> ** Phase 1 - Check Blocks and Sizes
> fsck_ufs: cannot alloc 2378019004 bytes for inoinfo
I'd be willing to bet that one of the cylinder group blocks in your file
system got corrupted.
> any solutions ?
The patch below should allow a manual fsck to run to completion. I'd
recommend running "fsck -N" and capturing its output. Then use the clri
command (either standalone or in fsdb) to zero out the uninitialized
inodes that are unmasked by setting cg_initediblk to its maximum
possible value based on the file system parameters.
Expect major file system lossage ...
I think this patch could be better, but this should get you going ...
Index: sbin/fsck_ffs/pass1.c
===================================================================
RCS file: /home/ncvs/src/sbin/fsck_ffs/pass1.c,v
retrieving revision 1.43
diff -u -r1.43 pass1.c
--- sbin/fsck_ffs/pass1.c 8 Oct 2004 20:44:47 -0000 1.43
+++ sbin/fsck_ffs/pass1.c 24 Sep 2007 23:15:22 -0000
@@ -93,9 +93,29 @@
inumber = c * sblock.fs_ipg;
setinodebuf(inumber);
getblk(&cgblk, cgtod(&sblock, c), sblock.fs_cgsize);
- if (sblock.fs_magic == FS_UFS2_MAGIC)
+ if (sblock.fs_magic == FS_UFS2_MAGIC) {
inosused = cgrp.cg_initediblk;
- else
+ if (inosused < 0 || inosused > sblock.fs_ipg) {
+ pfatal("CG %d: PREPOSTEROUS NUMBER OF INODES %d (cg_initediblk), ASSUMING %d (fs_ipg)\n",
+ c, inosused, sblock.fs_ipg);
+ /*
+ * The cylinder group block is most likely
+ * totally corrupted and will probably
+ * fail the magic number check below as well.
+ * Ignoring cg_initediblk and setting
+ * inosused to sblock.fs_ipg will allow
+ * a manual fsck to proceed further instead
+ * of dying when it attempts to allocate
+ * an insane amount of memory to store
+ * the inode info for this cylinder group.
+ * This may provide enough information
+ * to allow the system administrator to
+ * do a better job of patching the
+ * filesystem with fsdb.
+ */
+ inosused = sblock.fs_ipg;
+ }
+ } else
inosused = sblock.fs_ipg;
if (got_siginfo) {
printf("%s: phase 1: cyl group %d of %d (%d%%)\n",
More information about the freebsd-hackers
mailing list