Re: Mountroot problems on RPi3/aarch64
- In reply to: Mark Millard : "Re: Mountroot problems on RPi3/aarch64"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 26 Jun 2022 02:43:58 UTC
On 2022-Jun-25, at 19:22, Mark Millard <marklmi@yahoo.com> wrote: > On 2022-Jun-25, at 14:51, bob prohaska <fbsd@www.zefox.net> wrote: > >> On Thu, Jun 23, 2022 at 06:43:24PM -0700, Mark Millard wrote: >>> There is another checkin to main for superblock handling: >>> >>> QUOTE >>> The branch main has been updated by mckusick: >>> >>> URL: https://cgit.FreeBSD.org/src/commit/?id=50dc4c7df4156863148e6a9609c03e852e2aeb35 >>> >> >> Here's the tail of the boot transcript: >> >> Root mount waiting for: CAM >> da0 at umass-sim0 bus 0 scbus0 target 0 lun 0 >> da0: <ASMT ASM105x 0> Fixed Direct Access SPC-4 SCSI device >> da0: Serial Number 12345678D558 >> da0: 40.000MB/s transfers >> da0: 953869MB (1953525168 512 byte sectors) >> da0: quirks=0x2<NO_6_BYTE> >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) > > I'm not UFS/FFS implementation literate but I can show what I > see when I look up some of the related source code. Looking up > cgdmin leads to sys/ufs/ffs/fs.h material: > > /* > * Cylinder group macros to locate things in cylinder groups. > * They calc filesystem addresses of cylinder group data structures. > */ > #define cgbase(fs, c) (((ufs2_daddr_t)(fs)->fs_fpg) * (c)) > . . . > #define cgdmin(fs, c) (cgstart(fs, c) + (fs)->fs_dblkno) /* 1st data */ > . . . > #define cgstart(fs, c) \ > ((fs)->fs_magic == FS_UFS2_MAGIC ? cgbase(fs, c) : \ > (cgbase(fs, c) + (fs)->fs_old_cgoffset * ((c) & ~((fs)->fs_old_cgmask)))) > > From the cgdmin(fs, 0) I learn that the cgbase(fs, 0) > involved is 0 (i.e., zero). From that, looking at > what cgstart(fs, 0) would be leads to concluding that: > > (fs)->fs_old_cgoffset * ((c) & ~((fs)->fs_old_cgmask)) > > is in use and ends up being 5056. This was wrong: (fs)->fs_dblkno provided the 5056. See later below after the "JUNK" text block. JUNK FROM MISTAKE: > From that I see that: > > (fs)->fs_magic == FS_UFS2_MAGIC > > is false. > > But the messages produced via: > > CHK(fs->fs_csaddr, !=, cgdmin(fs, 0), %jd); > > implies that the code did validate the (fs)->fs_magic > value and it passed. For reference: > > # grep MAGIC /usr/main-src/sys/ufs/ffs/fs.h > #define FS_UFS1_MAGIC 0x011954 /* UFS1 fast filesystem magic number */ > #define FS_UFS2_MAGIC 0x19540119 /* UFS2 fast filesystem magic number */ > #define FS_BAD_MAGIC 0x19960408 /* UFS incomplete newfs magic number */ > #define CG_MAGIC 0x090255 > #define cg_chkmagic(cgp) ((cgp)->cg_magic == CG_MAGIC) > ((fs)->fs_magic == FS_UFS2_MAGIC ? cgbase(fs, c) : \ > > From the code structure and messaging I infer that: > > (fs)->fs_magic == FS_UFS1_MAGIC > > or the code would have done: > > } else { > /* Bad magic number, so assume not a superblock */ > return (ENOENT); > } > > without producing the messaging. > > Why it would be a UFS1 file system that was created originally, > I do not know. END JUNK FROM MISTAKE. When I looked at the messaging code for CHK to see why it reported UFS2 I see: printf("UFS%d superblock failed: %s (" #fmt ") %s %s (" \ #fmt ")\n", fs->fs_magic == FS_UFS1_MAGIC ? 1 : 2, \ #lhs, (intmax_t)lhs, #op, #rhs, (intmax_t)rhs); \ but that implies that fs->fs_magic did not hold the value FS_UFS1_MAGIC . Looking back I see that I incorrectly attributed the: (fs)->fs_dblkno value to: (fs)->fs_old_cgoffset * ((c) & ~((fs)->fs_old_cgmask)) End result: The file system is UFS2 with (fs)->fs_magic == FS_UFS2_MAGIC . Ultimately: fs->fs_csaddr != (fs)->fs_dblkno seems to be the failure condition for this UFS2 context [given the 0 in cgdmin(fs, 0)]. I've no clue about the implications. >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> Mounting from ufs:/dev/da0s2a failed with error 22; retrying for 3 more seconds >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> Mounting from ufs:/dev/da0s2a failed with error 22: Invalid fstype. >> >> Loader variables: >> vfs.root.mountfrom=ufs:/dev/da0s2a >> vfs.root.mountfrom.options=rw >> >> Manual root filesystem specification: >> <fstype>:<device> [options] >> Mount <device> using filesystem <fstype> >> and with the specified (optional) option list. >> >> eg. ufs:/dev/da0s1a >> zfs:zroot/ROOT/default >> cd9660:/dev/cd0 ro >> (which is equivalent to: mount -t cd9660 -o ro /dev/cd0 /) >> >> ? List valid disk boot devices >> . Yield 1 second (for background tasks) >> <empty line> Abort manual input >> >> mountroot> >> >> Rebooting using a kernel of: >> >> FreeBSD 14.0-CURRENT #74 main-n255816-e26ef41f799: Wed May 25 15:05:14 PDT 2022 >> bob@www.zefox.org:/usr/obj/usr/src/arm64.aarch64/sys/GENERIC arm64 >> >> stops in single user with: >> Root mount waiting for: CAM >> da0 at umass-sim0 bus 0 scbus0 target 0 lun 0 >> da0: <ASMT ASM105x 0> Fixed Direct Access SPC-4 SCSI device >> da0: Serial Number 12345678D558 >> da0: 40.000MB/s transfers >> da0: 953869MB (1953525168 512 byte sectors) >> da0: quirks=0x2<NO_6_BYTE> >> Warning: no time-of-day clock registered, system time will not be set accurately >> Dual Console: Serial Primary, Video Secondary >> Setting hostuuid: 30303030-3030-3030-3064-626136386435. >> Setting hostid: 0x5cd40a6a. >> Starting file system checks: >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> Cannot find file system superblock >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> Cannot find file system superblock >> Warning! Some of the devices might not be available; retrying >> Restarting file system checks: >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> Cannot find file system superblock >> UFS2 superblock failed: fs->fs_csaddr (806456) != cgdmin(fs, 0) (5056) >> Cannot find file system superblock >> Unknown error 3; help! >> ERROR: ABORTING BOOT (sending SIGTERM to parent)! >> 2022-06-25T14:23:46.792050-07:00 - init 1 - - /bin/sh on /etc/rc terminated abnormally, going to single user mode >> Enter full pathname of shell or RETURN for /bin/sh: >> root@:/ # >> >> However, simply exiting the single-user shell seems to bring up >> normal multi-user operation. >> >> Network connectivity remains sporadic, but is much helped by an outgoing >> ping process. >> >> Could it be significant that this filesystem was created on June 4, 2020? > > June 4 is after: > > 2022-05-27: Do comprehensive UFS/FFS superblock integrity checks when reading a superblock. > 2022-06-01: Two bug fixes to UFS/FFS superblock integrity checks when reading a superblock. > > but before: > > 2022-06-11: Bug fix to UFS/FFS superblock integrity checks when reading a superblock. > > (and before the later additions of messages about superblock failure details). > > But I can not tell what the status of the system was that created > the apparently problematical file system. It could be much older > for all I know. > > None of these messages suggest code changes to creating UFS file > systems, just to validation. > > I will note that the 2022-05-27 check-in does report: > > QUOTE > . . . Although > it appears in only one place, the new code will apply to the kernel > modules and (through libufs) user applications that read in superblocks. > END QUOTE > > This gets into why the older kernel behaves differently when used > with the newer world and why there are messages from the newer > world code even with the older kernel. > > > Of course, none of these notes provide any solutions, just > background information. > === Mark Millard marklmi at yahoo.com