mounting root from NFS via ROOTDEVNAME

Rick Macklem rmacklem at uoguelph.ca
Sun Jun 2 00:28:59 UTC 2013


Lars Eggert wrote:
> Hi,
> 
> to conclude this thread, the patch below allows one to specify an nfs
> rootfs via the ROOTDEVNAME kernel option, which will be mounted when
> BOOTP does not return a root-path option.
> 
> Lars
> 
My only concern with this (mainly because I don't understand the rules
applied to boot alternatives well enough) is that a few arm configs have
both BOOTP, BOOTP_NFSROOT and ROOTDEVNAME specified, where ROOTDEVNAME
is set to "ufs:...". I don't think this patch will break them, since I
think they'll use NFS and ignore the ROOTDEVNAME, but I'm not completely
sure. Does someone else know how HL201 boots, for example?

Lars, if you have a src commit, you can consider this reviewed by me. If
not, maybe Craig can review it and then I'll commit it.

Thanks for doing this, rick

> 
> diff --git a/sys/nfs/bootp_subr.c b/sys/nfs/bootp_subr.c
> index 2c57a91..972fb12 100644
> --- a/sys/nfs/bootp_subr.c
> +++ b/sys/nfs/bootp_subr.c
> @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
> 
> #include "opt_bootp.h"
> #include "opt_nfs.h"
> +#include "opt_rootdevname.h"
> 
> #include <sys/param.h>
> #include <sys/systm.h>
> @@ -870,8 +871,20 @@ bootpc_call(struct bootpc_globalcontext *gctx,
> struct thread *td)
> rtimo = time_second +
> BOOTP_SETTLE_DELAY;
> printf(" (got root path)");
> - } else
> + } else {
> printf(" (no root path)");
> +#ifdef ROOTDEVNAME
> + /*
> + * If we'll mount rootfs from
> + * ROOTDEVNAME, we can accept
> + * offers without root paths.
> + */
> + gotrootpath = 1;
> + rtimo = time_second +
> + BOOTP_SETTLE_DELAY;
> + printf(" (ROOTDEVNAME)");
> +#endif
> + }
> printf("\n");
> }
> } /* while secs */
> @@ -1440,6 +1453,16 @@ bootpc_decode_reply(struct nfsv3_diskless *nd,
> struct bootpc_ifcontext *ifctx,
> 
> p = bootpc_tag(&gctx->tag, &ifctx->reply, ifctx->replylen,
> TAG_ROOT);
> +#ifdef ROOTDEVNAME
> + /*
> + * If there was no root path in BOOTP, use the one in ROOTDEVNAME.
> + */
> + if (p == NULL) {
> + p = strdup(ROOTDEVNAME, M_TEMP);
> + if (strcmp(strsep(&p, ":"), "nfs") != 0)
> + panic("ROOTDEVNAME is not an NFS mount point");
> + }
> +#endif
> if (p != NULL) {
> if (gctx->setrootfs != NULL) {
> printf("rootfs %s (ignored) ", p);
> 
> _______________________________________________
> freebsd-current at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to
> "freebsd-current-unsubscribe at freebsd.org"


More information about the freebsd-current mailing list