Boot kernel from ufs:md0 gives error 22 on AVILA arm board

Monthadar Al Jaberi monthadar at gmail.com
Mon Nov 14 17:37:54 UTC 2011


Hi,

I am having problems booting from ufs:md0 and hope you can help me.

I changed the default configuration file AVILA so that it boots from
MD instead of NFS.
options 	MD_ROOT			#MD is a potential root device
options 	MD_ROOT_SIZE=4096
options 	ROOTDEVNAME=\"ufs:md0\"

I then generated a filesystem and embedded it inside kernel like this:
makefs -t ffs -B little -s 4m avila.img path/to/root

addr=($(strings -td kernel.bin | grep "MFS Filesystem" | awk '{print
$1}')) #calculate start and end address for mdroot
rootfs_start=${addr[0]}
rootfs_end=$((${addr[1]}+1))
echo "Generating kernel image for AVILA from ${rootfs_start} to ${rootfs_end}"
head -c ${rootfs_start} kernel.bin > kernel.new
cat avila.img >> kernel.new
tail -c +${rootfs_end} kernel.bin >> kernel.new

then from redboot:
load -b 0x00200000 kernel.new
go

and I get following error:
Trying to mount root from ufs:/dev/md0 []...
Mounting from ufs:/dev/md0 failed with error 22.
Trying to mount root from ufs:md0 []...
Mounting from ufs:md0 failed with error 22.

Loader variables:

Manual root filesystem specification:
  <fstype>:<device> [options]
      Mount <device> using filesystem <fstype>
      and with the specified (optional) option list.

    eg. ufs:/dev/da0s1a
        zfs:tank
        cd9660:/dev/acd0 ro
          (which is equivalent to: mount -t cd9660 -o ro /dev/acd0 /)

  ?               List valid disk boot devices
  .               Yield 1 second (for background tasks)
  <empty line>    Abort manual input

mountroot> ?

List of GEOM managed disk devices:
redboot/FIS directory redboot/RedBoot config redboot/RedBoot cfid0 md0

mountroot>

The md0 partition is there. And this is how I do it for the
RouterStation Pro and it works there.

When I debug the kernel code I see that the EINVAL is generated from
/*
 * Common code for mount and mountroot
 */
static int
ffs_mountfs(devvp, mp, td)
	struct vnode *devvp;
	struct mount *mp;
	struct thread *td;
{
...
        /*
	 * Try reading the superblock in each of its possible locations.
	 */
	for (i = 0; sblock_try[i] != -1; i++) {
		...
	}
	if (sblock_try[i] == -1) {
		error = EINVAL;		/* XXX needs translation */
		goto out;
	}
...
}

What am I doing wrong? any help is very appreciated.
Best regards
-- 
Monthadar Al Jaberi


More information about the freebsd-fs mailing list