[RFC PATCH] openbmc: Use JFFS2 for RW overlay filesystem
Andrew Jeffery
andrew at aj.id.au
Wed Feb 17 18:09:50 AEDT 2016
Hi Milton,
Well - with prompts you gave me below the patch has been significantly
reduced and is much less twisty. It seems I sent myself off down rabbit
holes on several fronts.
On Tue, 2016-02-16 at 00:10 +0000, Milton Miller II wrote:
> Hi Andrew.
>
> You got ahead of me and explored some issues, thanks. I wasn't thinking
> about some of the details but I had plans for some others, and had been
> manually changing the type on my own system (causing someone to re-flash
> when it didn't boot for them. cie la vie.
>
>
> On 02/15/2016 around 01:54AM in some timezone, Andrew Jeffery wrote:
> > Subject: [RFC PATCH] openbmc: Use JFFS2 for RW overlay filesystem
> >
> > We can enable JFFS2 support on mtd6 (the RW mtd partition) with a
> > (first-pass) kernel patch[1] applied to work-around a 'stutter' in the
> > (optimised) ARM mmiocpy() implementation.
>
> optimised is flagged in my spell checker.
Hah - do we have a preference for US vs UK spelling? I don't mind.
>
> >
> > Whilst the original scripting surrounding the filesystem selection aimed
> > to be generic, creating and mounting JFFS2 has some warts that seems to
> > require special-case logic.
>
> Or at least some versions of the tools think so :-)
Right - for some reason it was in my head that the mount.jffs2 helper
was required and overlooked the fact that busybox would mount it out-of
-the-box. Additionally I figured we'd want to access /dev/mtd6 rather
than go through the block emulation layer and I don't think busybox was
happy about that? Anyway, this all lead to dragging in mtd-utils-jffs2.
I've thrown that out and just used busybox.
>
> >
> > [1] Unmerged, but tested: https://lists.ozlabs.org/pipermail/openbmc/2016-February/001874.html
> >
> > Signed-off-by: Andrew Jeffery <andrew at aj.id.au>
> > ---
> > meta-phosphor/classes/image-overlay.bbclass | 3 ++-
> > meta-phosphor/classes/obmc-phosphor-image.bbclass | 2 ++
> > .../obmc-phosphor-image_types_uboot.bbclass | 12 ++++++++++--
> > .../obmc-phosphor-initfs/files/obmc-init.sh | 22 +++++++++++++++-------
> > .../obmc-phosphor-initfs/files/obmc-update.sh | 13 +++++++++----
> > 5 files changed, 38 insertions(+), 14 deletions(-)
> >
> > diff --git a/meta-phosphor/classes/image-overlay.bbclass b/meta-phosphor/classes/image-overlay.bbclass
> > index 1c6137d..5043e82 100644
> > --- a/meta-phosphor/classes/image-overlay.bbclass
> > +++ b/meta-phosphor/classes/image-overlay.bbclass
> > @@ -3,7 +3,8 @@ INITRD_IMAGE ?= "core-image-minimal-initramfs"
> > INITRD ?= "${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.${INITRD_CTYPE}${uboot}"
> >
> > IMAGE_BASETYPE ?= "squashfs-xz"
> > -OVERLAY_BASETYPE ?= "ext4"
> > +OVERLAY_BASETYPE ?= "jffs2"
> > +OVERLAY_BASETYPE_OPTS ?= "--pagesize=4096 --little-endian --squash"
> >
>
> Lots of options on that mkfs. Not sure what the --squash flag would be for.
Hah, yeah that was some over-enthusiasm with options. Would've helped
if I actually followed through on reading what the option was for.
Instead, I've defined OVERLAY_BASETYPE_OPTS with the ext4 options and
commented it out, as it's not used unless OVERLAY_BASETYPE is not jffs2
(see below).
>
> > IMAGE_TYPES_${PN} += "${IMAGE_BASETYPE}"
> >
> diff --git a/meta-phosphor/classes/obmc-phosphor-image.bbclass b/meta-phosphor/classes/obmc-phosphor-image.bbclass
> index 9a13f7f..8afa1ea 100644
> --- a/meta-phosphor/classes/obmc-phosphor-image.bbclass
> +++ b/meta-phosphor/classes/obmc-phosphor-image.bbclass
> @@ -38,4 +38,6 @@ IMAGE_INSTALL += " \
> packagegroup-obmc-phosphor-apps-extras \
> i2c-tools \
> screen \
> + mtd-utils-jffs2 \
> + mtd-utils-misc \
> "
>
> You say below that there is no fsck.jffs2, so why are you adding
> mtd-utils instead of using the busybox built-in files? Also, the
> u-boot utilities seem to be ok to compile with out adding these to
> the package list.
I've dropped them, as above.
>
> > diff --git a/meta-phosphor/classes/obmc-phosphor-image_types_uboot.bbclass b/meta-phosphor/classes/obmc-phosphor-
> > image_types_uboot.bbclass
> > index c390c36..dc69dc1 100644
> > --- a/meta-phosphor/classes/obmc-phosphor-image_types_uboot.bbclass
> > +++ b/meta-phosphor/classes/obmc-phosphor-image_types_uboot.bbclass
> > @@ -51,8 +51,16 @@ do_generate_flash() {
> > fi
> >
> > oe_mkimage "${initrd}" "${INITRD_CTYPE}" || bbfatal "oe_mkimage initrd"
> > - dd if=/dev/zero of=${ddir}/${rwfs} bs=1k count=${RWFS_SIZE}
> > - mkfs.${OVERLAY_BASETYPE} -b 4096 -F -O^huge_file ${ddir}/${rwfs} || bbfatal "mkfs rwfs"
> > +
> > + if [ x"${OVERLAY_BASETYPE}" = xjffs2 ]; then
> > + mkfs.${OVERLAY_BASETYPE} ${OVERLAY_BASETYPE_OPTS} \
> > + --pad=$(expr ${RWFS_SIZE} \* 1024) \
> > + -o ${ddir}/${rwfs} || bbfatal "mkfs rwfs"
> > + else
> > + dd if=/dev/zero of=${ddir}/${rwfs} bs=1k count=${RWFS_SIZE}
> > + mkfs.${OVERLAY_BASETYPE} ${OVERLAY_BASETYPE_OPTS} \
> > + ${ddir}/${rwfs} || bbfatal "mkfs rwfs"
> > + fi
> >
>
> That seems like a lot of logic including special caseing the type but then using the variable,
> and some kind of --pad option.
--pad was needed to set the output to a specific size when using mtd
-utils mkfs.jffs2.
> However, it was pointed out to me while I originally used
> the -j option on the busybox flash_eraseall command, which writes 1985 to each erase block,
> the Facebook and other code just did erase_all and mount. Investigation shows jffs2 seems
> to be very happy with a blank NOR flash; I suspect the markers may be more for NAND and/or
> RAM.
>
> Also while there were some ext4 specific options not in variables they should be moved there
> before switching the type so it will be easier to go back (if, for instance, someone wants
> to use managed nand eg emmc or usb for their read-write storage).
Yeah, done.
>
> So, my suggestion here for empty mkfs.jffs2:
>
> dd (size options) | tr '\x00' '\xff'
I've now unconditionally done this, and then special-cased the call to
mkfs.${OVERLAY_BASETYPE}. The only issue was tr doesn't seem to parse
'\xNN'? I've used octal instead (tr '\000' '\377').
>
>
> > diff --git a/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-init.sh b/meta-phosphor/common
> > /recipes-phosphor/obmc-phosphor-initfs/files/obmc-init.sh
> > index 6750de3..226b199 100644
> > --- a/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-init.sh
> > +++ b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-init.sh
> > @@ -65,18 +65,26 @@ then
> > > > > > cp /run/mtd:u-boot-env /run/fw_env
> > fi
> >
> > +rofst=squashfs
> > rofs=$(findmtd rofs)
> > -rwfs=$(findmtd rwfs)
> > -
> > +roopts=ro
> > rodev=/dev/mtdblock${rofs#mtd}
> > -rwdev=/dev/mtdblock${rwfs#mtd}
> >
> > -rofst=squashfs
> > -rwfst=ext4
> > -roopts=ro
> > +rwfst=jffs2
> > +rwfs=$(findmtd rwfs)
> > rwopts=rw
> > +rwdev=${rwfs}
> > +
>
> You seem to have reordered the lines for a different grouping.
> That's probably ok but please do it in a seperate patch either
> before or after changing the file system type.
I re-ordered it so that the rwdev munging made (slightly) more sense.
I've now dropped all of this munging and re-arranging as we can
continue to use /dev/mtdblockX as you pointed out.
>
> > +# mount.jffs2 requires the device node basename, not the absolute device node
> > +# path. But still support alternative filesystems through /dev/mtdblockX.
> > +if [ x"$rwfst" != xjffs2 ]; then
> > +> > > > rwdev=/dev/mtdblock${rwdev#mtd}
> > +fi
>
> The kernel mount system call is very happy to accept the /dev/mtdblockX and
> I have been doing all my testing by just changing rwfst. If the mount.jffs2
> that you added from mtdutils does not accept this then not only is it a waste
> of space but actively harmeful.
>
> Please remove that broken code from the build and try without. Busybox mount
> seems to be fine when the fstype is listed.
>
> Alternatively the kernel accepts mtd: where name is the mtd name. While
> that is useful I have not checked if squashfs is happy with that, and it makes
> it harder to switch to other fs types (eg loop mount).
I've dropped the change and kept rwdev as /dev/mtdblockX
>
>
> > init=/sbin/init
> > +
> > +# There is no fsck for jffs2 - For rwfst=jffs2 just produces a warning in the
> > +# output about being unable to find the binary and the boot continues.
>
> That is true, or we could create a link to /bin/true. The comment it not
> given to the screen where the user sees the message.
> > >
Mounting read-write $rwdev filesystem failed. Please fix and run
> > -> > > > mount $rwdev $rwdir -t $rwfs -o $rwopts
> > +> > > > mount $rwdev $rwdir -t $rwfst -o $rwopts
> > to to continue, or do change nothing to run from RAM for this boot.
> > HERE
>
> Good catch, I must not have tried to cut and paste that.
> It should arguably be a seperate patch.
Done
>
>
> > diff --git a/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh
> > index face06d..2bba4b0 100755
> > --- a/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh
> > +++ b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh
> > @@ -35,13 +35,18 @@ findmtd() {
>
> [ Same comments about variable order changes and updates in update script ]
>
Yeah, these rearrangements are no-longer part of the patch.
Cheers,
Andrew
>
> But I also had plans to have the concept of "old" and "new" rwfst , where update
> would check for the fs mounting as the old type before but be mounted with the
> new type after the update.
>
> Its a bit tricky because jffs2 will try to mount anything but complain about erase
> marks on every block that it can not parse. ext4 relies on magic numbers and so
> should always be tried before jffs2.
>
> Also I was thinking about taking advantage of flash_eraseall being an alias for
> mkfs.jffs2 and doing the wipe in more cases, maybe by an alternate trigger file. I
> don't want to do it for a u-boot-env update but probably should when we do
> image-rofs.
>
>
> I have a patch series to split the whitelist into pieces that affects mostly
> update (and a rename in init). I didn't post it because I wanted a chance to
> review it and had yet to investigate making moving the files in the build
> system. I will probably send that tomorrow. Actually the merge looks easy its
> all contained to the save loop block; most of the work is in the recipe.
>
>
>
> Thanks,
> milton
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://lists.ozlabs.org/pipermail/openbmc/attachments/20160217/42ddf829/attachment.sig>
More information about the openbmc
mailing list