* [PATCH] core-image-minimal-initramfs: prepare initramfs for NFS boot @ 2018-03-12 14:33 Oleksii Konoplitskyi 2018-03-12 16:59 ` André Draszik 0 siblings, 1 reply; 6+ messages in thread From: Oleksii Konoplitskyi @ 2018-03-12 14:33 UTC (permalink / raw) To: openembedded-core; +Cc: Andrii Bordunov, xe-linux-external It helps to boot device by mounting rootfs via NFS when network drivers are built as modules. We include modules in core-image-minimal-initramfs image and start kernel with specifying custom rdinit in cmdline: rdinit=/init-nfs.sh NFS and IP parameters should be passed to kernel as usual. For example: ip=192.168.0.11::192.168.0.1:255.255.255.0:linux:eth0:off nfsroot=192.168.0.10:/exported_nfs,nfsvers=3,tcp root=/dev/nfs rw loglevel=7 rdinit=/init-nfs.sh To use this initramfs, one could put the following to conf/local.conf: INITRAMFS_LOAD_KERNEL_MODULES = "kernel-module-igb" INITRAMFS_IMAGE_BUNDLE = "1" INITRAMFS_IMAGE = "core-image-minimal-initramfs" INITRAMFS_LOAD_KERNEL_MODULES is a space-separated list of modules that will be added to initramfs. Signed-off-by: Andrii Bordunov <aborduno@cisco.com> Signed-off-by: Oleksii Konoplitskyi <okonopli@cisco.com> --- .../images/core-image-minimal-initramfs.bb | 2 +- meta/recipes-core/initrdscripts/files/init-nfs.sh | 108 +++++++++++++++++++++ .../initrdscripts/initramfs-nfs-boot_1.0.bb | 14 +++ 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 meta/recipes-core/initrdscripts/files/init-nfs.sh create mode 100644 meta/recipes-core/initrdscripts/initramfs-nfs-boot_1.0.bb diff --git a/meta/recipes-core/images/core-image-minimal-initramfs.bb b/meta/recipes-core/images/core-image-minimal-initramfs.bb index c446e87..bf794bf 100644 --- a/meta/recipes-core/images/core-image-minimal-initramfs.bb +++ b/meta/recipes-core/images/core-image-minimal-initramfs.bb @@ -3,7 +3,7 @@ DESCRIPTION = "Small image capable of booting a device. The kernel includes \ the Minimal RAM-based Initial Root Filesystem (initramfs), which finds the \ first 'init' program more efficiently." -PACKAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs-live-install-efi ${VIRTUAL-RUNTIME_base-utils} udev base-passwd ${ROOTFS_BOOTSTRAP_INSTALL}" +PACKAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs-live-install-efi ${VIRTUAL-RUNTIME_base-utils} udev base-passwd ${ROOTFS_BOOTSTRAP_INSTALL} initramfs-nfs-boot" # Do not pollute the initrd image with rootfs features IMAGE_FEATURES = "" diff --git a/meta/recipes-core/initrdscripts/files/init-nfs.sh b/meta/recipes-core/initrdscripts/files/init-nfs.sh new file mode 100644 index 0000000..31a55ec --- /dev/null +++ b/meta/recipes-core/initrdscripts/files/init-nfs.sh @@ -0,0 +1,108 @@ +#!/bin/sh + +CONSOLE="/dev/console" +PATH=/sbin:/bin:/usr/sbin:/usr/bin +ROOT_MOUNT="/rootfs" + +fatal() +{ + echo $1 >$CONSOLE + echo >$CONSOLE + exec sh +} + +net_up() +{ + [ "$(ifconfig $PARAM_IFNAME | awk '/inet addr/{print substr($2,6)}')" = "$PARAM_IP" ] && return + #load all ethernet drivers if network interface is not configured + MODULES="$(find /lib/modules/*/kernel/drivers/net/ethernet -name \*.ko | sed -e 's,^.*/,,' -e 's,\.ko$,,')" + [ -z "$MODULES" ] && fatal "Ethernet drivers list is emty. Nothing to load." + modprobe -a $MODULES + + ifconfig $PARAM_IFNAME $PARAM_IP netmask $PARAM_NETMASK || + fatal "Failed to configure ethernet interface" + route add default gw $PARAM_GW || + fatal "Failed to set default gateway" +} + + +#TODO: IPv6 is not supported yet +mount_nfs() +{ + mkdir $ROOT_MOUNT + for i in $(seq 1 10) + do + mount -t nfs "$PARAM_NFSROOT_PATH" -o nolock,"$PARAM_NFSROOT_OPTS" $ROOT_MOUNT && return + sleep 1 + done + fatal "Could not mount rootfs via nfs" +} + + +early_setup() +{ + mkdir -p /proc + mkdir -p /sys + mount -t proc proc /proc + mount -t sysfs sysfs /sys + mount -t devtmpfs none /dev + + mkdir -p /run + mkdir -p /var/run +} + + +#TODO: IPv6 is not supported yet +read_args() +{ + [ -z "$CMDLINE" ] && CMDLINE=$(cat /proc/cmdline) + for arg in $CMDLINE; do + optarg=$(expr "x$arg" : 'x[^=]*=\(.*\)'$) + case $arg in + ip=*) + PARAM_IFNAME=$(echo "$optarg" | cut -d: -f6) + PARAM_IP_ALL=$(echo "$optarg" | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}') + PARAM_IP=$(echo "$PARAM_IP_ALL" | sed -n 1p) + PARAM_GW=$(echo "$PARAM_IP_ALL" | sed -n 2p) + PARAM_NETMASK=$(echo "$PARAM_IP_ALL" | sed -n 3p) + ;; + nfsroot=*) + PARAM_NFSROOT_PATH=$(echo "$optarg" | cut -d, -f1) + PARAM_NFSROOT_OPTS=$(echo "$optarg" | cut -d, -f2-) + ;; + debugshell) + DEBUGSHELL=1 + ;; + esac + done +} + +boot_nfs() +{ + touch $ROOT_MOUNT/bin || fatal "Rootfs is not writeable" + + mount -n --move /proc ${ROOT_MOUNT}/proc + mount -n --move /sys ${ROOT_MOUNT}/sys + mount -n --move /dev ${ROOT_MOUNT}/dev + + cd $ROOT_MOUNT + + # busybox switch_root supports -c option + exec switch_root -c /dev/console $ROOT_MOUNT /sbin/init $CMDLINE || + fatal "Couldn't switch_root, dropping to shell" +} + +early_setup + +read_args + +if [ -n "$DEBUGSHELL" ]; then + exec sh +fi + +net_up + +mount_nfs + +boot_nfs + diff --git a/meta/recipes-core/initrdscripts/initramfs-nfs-boot_1.0.bb b/meta/recipes-core/initrdscripts/initramfs-nfs-boot_1.0.bb new file mode 100644 index 0000000..ca4f191 --- /dev/null +++ b/meta/recipes-core/initrdscripts/initramfs-nfs-boot_1.0.bb @@ -0,0 +1,14 @@ +SUMMARY = "Live image init script" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" +RDEPENDS_${PN} = "${@['', d.getVar('INITRAMFS_LOAD_KERNEL_MODULES', True)][d.getVar('INITRAMFS_LOAD_KERNEL_MODULES', True) is not None]}" +SRC_URI = "file://init-nfs.sh" + +S = "${WORKDIR}" + +do_install() { + install -m 0755 ${WORKDIR}/init-nfs.sh ${D}/init-nfs.sh +} + +FILES_${PN} += " /init-nfs.sh " + -- 2.7.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] core-image-minimal-initramfs: prepare initramfs for NFS boot 2018-03-12 14:33 [PATCH] core-image-minimal-initramfs: prepare initramfs for NFS boot Oleksii Konoplitskyi @ 2018-03-12 16:59 ` André Draszik 2018-03-16 18:20 ` Oleksii Konoplitskyi 0 siblings, 1 reply; 6+ messages in thread From: André Draszik @ 2018-03-12 16:59 UTC (permalink / raw) To: openembedded-core Hi. It'd be nice if this was part of initramfs-framework instead. In particular some devices need a bit more than ifconfig & route, e.g. configuration of SoC internal Ethernet switches. As it is, this patch is not very generic, whereas if it was integrated with the initramfs-framework, another module could take care of the driver / hardware specifics, and this module would just do the actual mounting of the ROOTFS. The remaining bits, like mount --move of /proc are also already part of initramfs-framework. That way, this new addition would be useful on a wide range of devices. Cheers, Andre' On Mon, 2018-03-12 at 16:33 +0200, Oleksii Konoplitskyi wrote: > It helps to boot device by mounting rootfs via NFS when network > drivers are built as modules. > We include modules in core-image-minimal-initramfs image > and start kernel with specifying custom rdinit in cmdline: > rdinit=/init-nfs.sh > > NFS and IP parameters should be passed to kernel as usual. > For example: > ip=192.168.0.11::192.168.0.1:255.255.255.0:linux:eth0:off > nfsroot=192.168.0.10:/exported_nfs,nfsvers=3,tcp > root=/dev/nfs rw loglevel=7 rdinit=/init-nfs.sh > > To use this initramfs, one could put the following > to conf/local.conf: > INITRAMFS_LOAD_KERNEL_MODULES = "kernel-module-igb" > INITRAMFS_IMAGE_BUNDLE = "1" > INITRAMFS_IMAGE = "core-image-minimal-initramfs" > > INITRAMFS_LOAD_KERNEL_MODULES is a space-separated list of > modules that will be added to initramfs. > > Signed-off-by: Andrii Bordunov <aborduno@cisco.com> > Signed-off-by: Oleksii Konoplitskyi <okonopli@cisco.com> > --- > .../images/core-image-minimal-initramfs.bb | 2 +- > meta/recipes-core/initrdscripts/files/init-nfs.sh | 108 > +++++++++++++++++++++ > .../initrdscripts/initramfs-nfs-boot_1.0.bb | 14 +++ > 3 files changed, 123 insertions(+), 1 deletion(-) > create mode 100644 meta/recipes-core/initrdscripts/files/init-nfs.sh > create mode 100644 meta/recipes-core/initrdscripts/initramfs-nfs- > boot_1.0.bb > > diff --git a/meta/recipes-core/images/core-image-minimal-initramfs.bb > b/meta/recipes-core/images/core-image-minimal-initramfs.bb > index c446e87..bf794bf 100644 > --- a/meta/recipes-core/images/core-image-minimal-initramfs.bb > +++ b/meta/recipes-core/images/core-image-minimal-initramfs.bb > @@ -3,7 +3,7 @@ DESCRIPTION = "Small image capable of booting a device. > The kernel includes \ > the Minimal RAM-based Initial Root Filesystem (initramfs), which finds > the \ > first 'init' program more efficiently." > > -PACKAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs- > live-install-efi ${VIRTUAL-RUNTIME_base-utils} udev base-passwd > ${ROOTFS_BOOTSTRAP_INSTALL}" > +PACKAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs- > live-install-efi ${VIRTUAL-RUNTIME_base-utils} udev base-passwd > ${ROOTFS_BOOTSTRAP_INSTALL} initramfs-nfs-boot" > > # Do not pollute the initrd image with rootfs features > IMAGE_FEATURES = "" > diff --git a/meta/recipes-core/initrdscripts/files/init-nfs.sh > b/meta/recipes-core/initrdscripts/files/init-nfs.sh > new file mode 100644 > index 0000000..31a55ec > --- /dev/null > +++ b/meta/recipes-core/initrdscripts/files/init-nfs.sh > @@ -0,0 +1,108 @@ > +#!/bin/sh > + > +CONSOLE="/dev/console" > +PATH=/sbin:/bin:/usr/sbin:/usr/bin > +ROOT_MOUNT="/rootfs" > + > +fatal() > +{ > + echo $1 >$CONSOLE > + echo >$CONSOLE > + exec sh > +} > + > +net_up() > +{ > + [ "$(ifconfig $PARAM_IFNAME | awk '/inet addr/{print > substr($2,6)}')" = "$PARAM_IP" ] && return > + #load all ethernet drivers if network interface is not configured > + MODULES="$(find /lib/modules/*/kernel/drivers/net/ethernet -name > \*.ko | sed -e 's,^.*/,,' -e 's,\.ko$,,')" > + [ -z "$MODULES" ] && fatal "Ethernet drivers list is emty. > Nothing to load." > + modprobe -a $MODULES > + > + ifconfig $PARAM_IFNAME $PARAM_IP netmask $PARAM_NETMASK || > + fatal "Failed to configure ethernet interface" > + route add default gw $PARAM_GW || > + fatal "Failed to set default gateway" > +} > + > + > +#TODO: IPv6 is not supported yet > +mount_nfs() > +{ > + mkdir $ROOT_MOUNT > + for i in $(seq 1 10) > + do > + mount -t nfs "$PARAM_NFSROOT_PATH" -o > nolock,"$PARAM_NFSROOT_OPTS" $ROOT_MOUNT && return > + sleep 1 > + done > + fatal "Could not mount rootfs via nfs" > +} > + > + > +early_setup() > +{ > + mkdir -p /proc > + mkdir -p /sys > + mount -t proc proc /proc > + mount -t sysfs sysfs /sys > + mount -t devtmpfs none /dev > + > + mkdir -p /run > + mkdir -p /var/run > +} > + > + > +#TODO: IPv6 is not supported yet > +read_args() > +{ > + [ -z "$CMDLINE" ] && CMDLINE=$(cat /proc/cmdline) > + for arg in $CMDLINE; do > + optarg=$(expr "x$arg" : 'x[^=]*=\(.*\)'$) > + case $arg in > + ip=*) > + PARAM_IFNAME=$(echo "$optarg" | cut -d: -f6) > + PARAM_IP_ALL=$(echo "$optarg" | grep -Eo '([0- > 9]{1,3}\.){3}[0-9]{1,3}') > + PARAM_IP=$(echo "$PARAM_IP_ALL" | sed -n 1p) > + PARAM_GW=$(echo "$PARAM_IP_ALL" | sed -n 2p) > + PARAM_NETMASK=$(echo "$PARAM_IP_ALL" | sed -n 3p) > + ;; > + nfsroot=*) > + PARAM_NFSROOT_PATH=$(echo "$optarg" | cut -d, > -f1) > + PARAM_NFSROOT_OPTS=$(echo "$optarg" | cut -d, > -f2-) > + ;; > + debugshell) > + DEBUGSHELL=1 > + ;; > + esac > + done > +} > + > +boot_nfs() > +{ > + touch $ROOT_MOUNT/bin || fatal "Rootfs is not writeable" > + > + mount -n --move /proc ${ROOT_MOUNT}/proc > + mount -n --move /sys ${ROOT_MOUNT}/sys > + mount -n --move /dev ${ROOT_MOUNT}/dev > + > + cd $ROOT_MOUNT > + > + # busybox switch_root supports -c option > + exec switch_root -c /dev/console $ROOT_MOUNT /sbin/init $CMDLINE > || > + fatal "Couldn't switch_root, dropping to shell" > +} > + > +early_setup > + > +read_args > + > +if [ -n "$DEBUGSHELL" ]; then > + exec sh > +fi > + > +net_up > + > +mount_nfs > + > +boot_nfs > + > diff --git a/meta/recipes-core/initrdscripts/initramfs-nfs-boot_1.0.bb > b/meta/recipes-core/initrdscripts/initramfs-nfs-boot_1.0.bb > new file mode 100644 > index 0000000..ca4f191 > --- /dev/null > +++ b/meta/recipes-core/initrdscripts/initramfs-nfs-boot_1.0.bb > @@ -0,0 +1,14 @@ > +SUMMARY = "Live image init script" > +LICENSE = "MIT" > +LIC_FILES_CHKSUM = > "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" > +RDEPENDS_${PN} = "${@['', d.getVar('INITRAMFS_LOAD_KERNEL_MODULES', > True)][d.getVar('INITRAMFS_LOAD_KERNEL_MODULES', True) is not None]}" > +SRC_URI = "file://init-nfs.sh" > + > +S = "${WORKDIR}" > + > +do_install() { > + install -m 0755 ${WORKDIR}/init-nfs.sh ${D}/init-nfs.sh > +} > + > +FILES_${PN} += " /init-nfs.sh " > + > -- > 2.7.4 > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] core-image-minimal-initramfs: prepare initramfs for NFS boot 2018-03-12 16:59 ` André Draszik @ 2018-03-16 18:20 ` Oleksii Konoplitskyi 2018-04-03 14:23 ` André Draszik 0 siblings, 1 reply; 6+ messages in thread From: Oleksii Konoplitskyi @ 2018-03-16 18:20 UTC (permalink / raw) To: André Draszik, openembedded-core, xe-linux-external Hi Andre, I could build initramfs using initramfs-framework. My device was booted successfully. I created my own recipe to build initramfs image and added one more module nfsrootfs to initramfs-framework. Also initramfs-framework*.bb was updated. Module "nfsrootfs" has content: nfsrootfs_enabled() { [ -z ${bootparam_nfsroot+x} ] && return 1 return 0 } nfsrootfs_run() { MODULES="$(find /lib/modules/*/kernel/drivers/net/ethernet -name \*.ko | sed -e 's,^.*/,,' -e 's,\.ko$,,')" modprobe -a $MODULES ifname=$(echo $bootparam_ip | cut -d ':' -f 6) ipaddr=$(echo $bootparam_ip | cut -d ':' -f 1) netmask=$(echo $bootparam_ip | cut -d ':' -f 4) gateway=$(echo $bootparam_ip | cut -d ':' -f 3) ifconfig $ifname $ipaddr netmask $netmask route add default gw $gateway nfs_mount_point=$(echo $bootparam_nfsroot | cut -d ',' -f 1) nfs_mount_params=$(echo $bootparam_nfsroot | cut -d ',' -f 2) mount -t nfs ${nfs_mount_point} -o nolock,${nfs_server_params} $ROOTFS_DIR } This modules does not support ipv6 and dhcp configuration. Taking into account your recommendations, module should have the next content: nfsrootfs_enabled() { [ -z ${bootparam_nfsroot+x} ] && return 1 return 0 } nfsrootfs_run() { nfs_mount_point=$(echo $bootparam_nfsroot | cut -d ',' -f 1) nfs_mount_params=$(echo $bootparam_nfsroot | cut -d ',' -f 2) mount -t nfs ${nfs_mount_point} -o nolock,${nfs_server_params} $ROOTFS_DIR } What module is responsible for network configuration and network driver loading? Should it be separate custom module in initramfs-framework not related to upstream? Best regards, Oleksii On 12.03.18 18:59, André Draszik wrote: > Hi. > > It'd be nice if this was part of initramfs-framework instead. > > In particular some devices need a bit more than ifconfig & route, e.g. > configuration of SoC internal Ethernet switches. > > As it is, this patch is not very generic, whereas if it was integrated with > the initramfs-framework, another module could take care of the driver / > hardware specifics, and this module would just do the actual mounting of the > ROOTFS. > > The remaining bits, like mount --move of /proc are also already part of > initramfs-framework. > > That way, this new addition would be useful on a wide range of devices. > > > Cheers, > Andre' > > On Mon, 2018-03-12 at 16:33 +0200, Oleksii Konoplitskyi wrote: >> It helps to boot device by mounting rootfs via NFS when network >> drivers are built as modules. >> We include modules in core-image-minimal-initramfs image >> and start kernel with specifying custom rdinit in cmdline: >> rdinit=/init-nfs.sh >> >> NFS and IP parameters should be passed to kernel as usual. >> For example: >> ip=192.168.0.11::192.168.0.1:255.255.255.0:linux:eth0:off >> nfsroot=192.168.0.10:/exported_nfs,nfsvers=3,tcp >> root=/dev/nfs rw loglevel=7 rdinit=/init-nfs.sh >> >> To use this initramfs, one could put the following >> to conf/local.conf: >> INITRAMFS_LOAD_KERNEL_MODULES = "kernel-module-igb" >> INITRAMFS_IMAGE_BUNDLE = "1" >> INITRAMFS_IMAGE = "core-image-minimal-initramfs" >> >> INITRAMFS_LOAD_KERNEL_MODULES is a space-separated list of >> modules that will be added to initramfs. >> >> Signed-off-by: Andrii Bordunov <aborduno@cisco.com> >> Signed-off-by: Oleksii Konoplitskyi <okonopli@cisco.com> >> --- >> .../images/core-image-minimal-initramfs.bb | 2 +- >> meta/recipes-core/initrdscripts/files/init-nfs.sh | 108 >> +++++++++++++++++++++ >> .../initrdscripts/initramfs-nfs-boot_1.0.bb | 14 +++ >> 3 files changed, 123 insertions(+), 1 deletion(-) >> create mode 100644 meta/recipes-core/initrdscripts/files/init-nfs.sh >> create mode 100644 meta/recipes-core/initrdscripts/initramfs-nfs- >> boot_1.0.bb >> >> diff --git a/meta/recipes-core/images/core-image-minimal-initramfs.bb >> b/meta/recipes-core/images/core-image-minimal-initramfs.bb >> index c446e87..bf794bf 100644 >> --- a/meta/recipes-core/images/core-image-minimal-initramfs.bb >> +++ b/meta/recipes-core/images/core-image-minimal-initramfs.bb >> @@ -3,7 +3,7 @@ DESCRIPTION = "Small image capable of booting a device. >> The kernel includes \ >> the Minimal RAM-based Initial Root Filesystem (initramfs), which finds >> the \ >> first 'init' program more efficiently." >> >> -PACKAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs- >> live-install-efi ${VIRTUAL-RUNTIME_base-utils} udev base-passwd >> ${ROOTFS_BOOTSTRAP_INSTALL}" >> +PACKAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs- >> live-install-efi ${VIRTUAL-RUNTIME_base-utils} udev base-passwd >> ${ROOTFS_BOOTSTRAP_INSTALL} initramfs-nfs-boot" >> >> # Do not pollute the initrd image with rootfs features >> IMAGE_FEATURES = "" >> diff --git a/meta/recipes-core/initrdscripts/files/init-nfs.sh >> b/meta/recipes-core/initrdscripts/files/init-nfs.sh >> new file mode 100644 >> index 0000000..31a55ec >> --- /dev/null >> +++ b/meta/recipes-core/initrdscripts/files/init-nfs.sh >> @@ -0,0 +1,108 @@ >> +#!/bin/sh >> + >> +CONSOLE="/dev/console" >> +PATH=/sbin:/bin:/usr/sbin:/usr/bin >> +ROOT_MOUNT="/rootfs" >> + >> +fatal() >> +{ >> + echo $1 >$CONSOLE >> + echo >$CONSOLE >> + exec sh >> +} >> + >> +net_up() >> +{ >> + [ "$(ifconfig $PARAM_IFNAME | awk '/inet addr/{print >> substr($2,6)}')" = "$PARAM_IP" ] && return >> + #load all ethernet drivers if network interface is not configured >> + MODULES="$(find /lib/modules/*/kernel/drivers/net/ethernet -name >> \*.ko | sed -e 's,^.*/,,' -e 's,\.ko$,,')" >> + [ -z "$MODULES" ] && fatal "Ethernet drivers list is emty. >> Nothing to load." >> + modprobe -a $MODULES >> + >> + ifconfig $PARAM_IFNAME $PARAM_IP netmask $PARAM_NETMASK || >> + fatal "Failed to configure ethernet interface" >> + route add default gw $PARAM_GW || >> + fatal "Failed to set default gateway" >> +} >> + >> + >> +#TODO: IPv6 is not supported yet >> +mount_nfs() >> +{ >> + mkdir $ROOT_MOUNT >> + for i in $(seq 1 10) >> + do >> + mount -t nfs "$PARAM_NFSROOT_PATH" -o >> nolock,"$PARAM_NFSROOT_OPTS" $ROOT_MOUNT && return >> + sleep 1 >> + done >> + fatal "Could not mount rootfs via nfs" >> +} >> + >> + >> +early_setup() >> +{ >> + mkdir -p /proc >> + mkdir -p /sys >> + mount -t proc proc /proc >> + mount -t sysfs sysfs /sys >> + mount -t devtmpfs none /dev >> + >> + mkdir -p /run >> + mkdir -p /var/run >> +} >> + >> + >> +#TODO: IPv6 is not supported yet >> +read_args() >> +{ >> + [ -z "$CMDLINE" ] && CMDLINE=$(cat /proc/cmdline) >> + for arg in $CMDLINE; do >> + optarg=$(expr "x$arg" : 'x[^=]*=\(.*\)'$) >> + case $arg in >> + ip=*) >> + PARAM_IFNAME=$(echo "$optarg" | cut -d: -f6) >> + PARAM_IP_ALL=$(echo "$optarg" | grep -Eo '([0- >> 9]{1,3}\.){3}[0-9]{1,3}') >> + PARAM_IP=$(echo "$PARAM_IP_ALL" | sed -n 1p) >> + PARAM_GW=$(echo "$PARAM_IP_ALL" | sed -n 2p) >> + PARAM_NETMASK=$(echo "$PARAM_IP_ALL" | sed -n 3p) >> + ;; >> + nfsroot=*) >> + PARAM_NFSROOT_PATH=$(echo "$optarg" | cut -d, >> -f1) >> + PARAM_NFSROOT_OPTS=$(echo "$optarg" | cut -d, >> -f2-) >> + ;; >> + debugshell) >> + DEBUGSHELL=1 >> + ;; >> + esac >> + done >> +} >> + >> +boot_nfs() >> +{ >> + touch $ROOT_MOUNT/bin || fatal "Rootfs is not writeable" >> + >> + mount -n --move /proc ${ROOT_MOUNT}/proc >> + mount -n --move /sys ${ROOT_MOUNT}/sys >> + mount -n --move /dev ${ROOT_MOUNT}/dev >> + >> + cd $ROOT_MOUNT >> + >> + # busybox switch_root supports -c option >> + exec switch_root -c /dev/console $ROOT_MOUNT /sbin/init $CMDLINE >> || >> + fatal "Couldn't switch_root, dropping to shell" >> +} >> + >> +early_setup >> + >> +read_args >> + >> +if [ -n "$DEBUGSHELL" ]; then >> + exec sh >> +fi >> + >> +net_up >> + >> +mount_nfs >> + >> +boot_nfs >> + >> diff --git a/meta/recipes-core/initrdscripts/initramfs-nfs-boot_1.0.bb >> b/meta/recipes-core/initrdscripts/initramfs-nfs-boot_1.0.bb >> new file mode 100644 >> index 0000000..ca4f191 >> --- /dev/null >> +++ b/meta/recipes-core/initrdscripts/initramfs-nfs-boot_1.0.bb >> @@ -0,0 +1,14 @@ >> +SUMMARY = "Live image init script" >> +LICENSE = "MIT" >> +LIC_FILES_CHKSUM = >> "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" >> +RDEPENDS_${PN} = "${@['', d.getVar('INITRAMFS_LOAD_KERNEL_MODULES', >> True)][d.getVar('INITRAMFS_LOAD_KERNEL_MODULES', True) is not None]}" >> +SRC_URI = "file://init-nfs.sh" >> + >> +S = "${WORKDIR}" >> + >> +do_install() { >> + install -m 0755 ${WORKDIR}/init-nfs.sh ${D}/init-nfs.sh >> +} >> + >> +FILES_${PN} += " /init-nfs.sh " >> + >> -- >> 2.7.4 >> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] core-image-minimal-initramfs: prepare initramfs for NFS boot 2018-03-16 18:20 ` Oleksii Konoplitskyi @ 2018-04-03 14:23 ` André Draszik 2018-04-18 9:55 ` Oleksii Konoplitskyi 2018-04-18 9:57 ` Oleksii Konoplitskyi 0 siblings, 2 replies; 6+ messages in thread From: André Draszik @ 2018-04-03 14:23 UTC (permalink / raw) To: Oleksii Konoplitskyi, openembedded-core, xe-linux-external Thanks! On Fri, 2018-03-16 at 20:20 +0200, Oleksii Konoplitskyi wrote: > Taking into account your recommendations, module should have the next > content: > > nfsrootfs_enabled() { > [ -z ${bootparam_nfsroot+x} ] && return 1 > return 0 > } > > nfsrootfs_run() { > nfs_mount_point=$(echo $bootparam_nfsroot | cut -d ',' -f 1) > nfs_mount_params=$(echo $bootparam_nfsroot | cut -d ',' -f 2) > > mount -t nfs ${nfs_mount_point} -o nolock,${nfs_server_params} > $ROOTFS_DIR > } Actually, this is missing various things, according to linux/Documentation/filesystems/nfs/nfsroot.txt nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] * The server-ip is optional (and would be taken from the ip= option in that case) * there can be more than one nfs-option (which is probably more important to fix) * it ignores the 'ro' or rootflags=ro option Maybe something like this (completely untested): nfsrootfs_run() { local nfs_opts local location local flags nfs_opts="" if [ "${bootparam_nfsroot#*,}" != "${bootparam_nfsroot}" ] ; then nfs_opts="-o ${bootparam_nfsroot#*,}" fi location="${bootparam_nfsroot%%,*}" if [ "${location#*:}" = "${location}" ]; then # server-ip not given location=${ROOTSERVER}:${location} fi flags="-o nolock" if [ -n "$bootparam_ro" ] && ! echo "$bootparam_rootflags" | grep -w -q "ro"; then if [ -n "$bootparam_rootflags" ]; then bootparam_rootflags="$bootparam_rootflags," fi bootparam_rootflags="${bootparam_rootflags}ro" fi if [ -n "$bootparam_rootflags" ]; then flags="$flags -o$bootparam_rootflags" fi mount -t nfs ${flags} ${nfs_opts} ${location} ${ROOTFS_DIR} } ? Just need to get at $ROOTSERVER now, or at least issue a warning that it should be given on the command line. > What module is responsible for network configuration and network driver > loading? I'd say IP should be separate, as you can then also easily add DHCP or zeroconf. It's not really related to nfsroot (except for the ROOTSERVER bit). Network driver loading should definitely be a machine specific thing... > Should it be separate custom module in initramfs-framework not related > to upstream? > > Best regards, > Oleksii Cheers, Andre' ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] core-image-minimal-initramfs: prepare initramfs for NFS boot 2018-04-03 14:23 ` André Draszik @ 2018-04-18 9:55 ` Oleksii Konoplitskyi 2018-04-18 9:57 ` Oleksii Konoplitskyi 1 sibling, 0 replies; 6+ messages in thread From: Oleksii Konoplitskyi @ 2018-04-18 9:55 UTC (permalink / raw) To: André Draszik, openembedded-core, xe-linux-external Hi Andre, I could boot my device using your code (+ parsing nfs server ip address from ip option): nfsrootfs_run() { local nfs_opts local location local flags local server_ip nfs_opts="" if [ "${bootparam_nfsroot#*,}" != "${bootparam_nfsroot}" ]; then nfs_opts="-o ${bootparam_nfsroot#*,}" fi location="${bootparam_nfsroot%%,*}" if [ "${location#*:}" = "${location}" ]; then # server-ip is not given. Get server ip from ip option server_ip="" if [ "${bootparam_ip#*:}" != "${bootparam_ip}" ]; then server_ip=$(echo "$bootparam_ip" | cut -d: -f2) fi if [ -z "$server_ip" ]; then fatal "Server IP is not set. Update ip or nfsroot options." fi location=${server_ip}:${location} fi flags="-o nolock" if [ -n "$bootparam_ro" ] && ! echo "$bootparam_rootflags" | grep -w -q "ro"; then if [ -n "$bootparam_rootflags" ]; then bootparam_rootflags="$bootparam_rootflags," fi bootparam_rootflags="${bootparam_rootflags}ro" fi if [ -n "$bootparam_rootflags" ]; then flags="$flags -o$bootparam_rootflags" fi mount -t nfs ${flags} ${nfs_opts} ${location} ${ROOTFS_DIR} } Should module fail if ip is set to dhcp (or off)? Should we mount rootfs via nfs if "nfsroot" option is not set? Best regards, Oleksii On 03.04.18 17:23, André Draszik wrote: > Thanks! > > On Fri, 2018-03-16 at 20:20 +0200, Oleksii Konoplitskyi wrote: >> Taking into account your recommendations, module should have the next >> content: >> >> nfsrootfs_enabled() { >> [ -z ${bootparam_nfsroot+x} ] && return 1 >> return 0 >> } >> >> nfsrootfs_run() { >> nfs_mount_point=$(echo $bootparam_nfsroot | cut -d ',' -f 1) >> nfs_mount_params=$(echo $bootparam_nfsroot | cut -d ',' -f 2) >> >> mount -t nfs ${nfs_mount_point} -o nolock,${nfs_server_params} >> $ROOTFS_DIR >> } > Actually, this is missing various things, according to > linux/Documentation/filesystems/nfs/nfsroot.txt > > nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] > > * The server-ip is optional (and would be taken from the ip= option in > that case) > * there can be more than one nfs-option (which is probably more important > to fix) > * it ignores the 'ro' or rootflags=ro option > > Maybe something like this (completely untested): > > nfsrootfs_run() { > local nfs_opts > local location > local flags > > nfs_opts="" > if [ "${bootparam_nfsroot#*,}" != "${bootparam_nfsroot}" ] ; then > nfs_opts="-o ${bootparam_nfsroot#*,}" > fi > location="${bootparam_nfsroot%%,*}" > if [ "${location#*:}" = "${location}" ]; then > # server-ip not given > location=${ROOTSERVER}:${location} > fi > > flags="-o nolock" > if [ -n "$bootparam_ro" ] && ! echo "$bootparam_rootflags" | grep -w -q "ro"; then > if [ -n "$bootparam_rootflags" ]; then > bootparam_rootflags="$bootparam_rootflags," > fi > bootparam_rootflags="${bootparam_rootflags}ro" > fi > if [ -n "$bootparam_rootflags" ]; then > flags="$flags -o$bootparam_rootflags" > fi > > mount -t nfs ${flags} ${nfs_opts} ${location} ${ROOTFS_DIR} > } > > ? Just need to get at $ROOTSERVER now, or at least issue a warning that it > should be given on the command line. > > >> What module is responsible for network configuration and network driver >> loading? > I'd say IP should be separate, as you can then also easily add DHCP or > zeroconf. It's not really related to nfsroot (except for the ROOTSERVER > bit). > Network driver loading should definitely be a machine specific thing... > >> Should it be separate custom module in initramfs-framework not related >> to upstream? >> >> Best regards, >> Oleksii > > Cheers, > Andre' > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] core-image-minimal-initramfs: prepare initramfs for NFS boot 2018-04-03 14:23 ` André Draszik 2018-04-18 9:55 ` Oleksii Konoplitskyi @ 2018-04-18 9:57 ` Oleksii Konoplitskyi 1 sibling, 0 replies; 6+ messages in thread From: Oleksii Konoplitskyi @ 2018-04-18 9:57 UTC (permalink / raw) To: André Draszik, openembedded-core, xe-linux-external Hi Andre, I could boot my device using your code (+ parsing nfs server ip address from ip option): nfsrootfs_run() { local nfs_opts local location local flags local server_ip nfs_opts="" if [ "${bootparam_nfsroot#*,}" != "${bootparam_nfsroot}" ]; then nfs_opts="-o ${bootparam_nfsroot#*,}" fi location="${bootparam_nfsroot%%,*}" if [ "${location#*:}" = "${location}" ]; then # server-ip is not given. Get server ip from ip option server_ip="" if [ "${bootparam_ip#*:}" != "${bootparam_ip}" ]; then server_ip=$(echo "$bootparam_ip" | cut -d: -f2) fi if [ -z "$server_ip" ]; then fatal "Server IP is not set. Update ip or nfsroot options." fi location=${server_ip}:${location} fi flags="-o nolock" if [ -n "$bootparam_ro" ] && ! echo "$bootparam_rootflags" | grep -w -q "ro"; then if [ -n "$bootparam_rootflags" ]; then bootparam_rootflags="$bootparam_rootflags," fi bootparam_rootflags="${bootparam_rootflags}ro" fi if [ -n "$bootparam_rootflags" ]; then flags="$flags -o$bootparam_rootflags" fi mount -t nfs ${flags} ${nfs_opts} ${location} ${ROOTFS_DIR} } Should module fail if ip is set to dhcp (or off)? Should we mount rootfs via nfs if "nfsroot" option is not set? Best regards, Oleksii On 03.04.18 17:23, André Draszik wrote: > Thanks! > > On Fri, 2018-03-16 at 20:20 +0200, Oleksii Konoplitskyi wrote: >> Taking into account your recommendations, module should have the next >> content: >> >> nfsrootfs_enabled() { >> [ -z ${bootparam_nfsroot+x} ] && return 1 >> return 0 >> } >> >> nfsrootfs_run() { >> nfs_mount_point=$(echo $bootparam_nfsroot | cut -d ',' -f 1) >> nfs_mount_params=$(echo $bootparam_nfsroot | cut -d ',' -f 2) >> >> mount -t nfs ${nfs_mount_point} -o nolock,${nfs_server_params} >> $ROOTFS_DIR >> } > Actually, this is missing various things, according to > linux/Documentation/filesystems/nfs/nfsroot.txt > > nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] > > * The server-ip is optional (and would be taken from the ip= option in > that case) > * there can be more than one nfs-option (which is probably more important > to fix) > * it ignores the 'ro' or rootflags=ro option > > Maybe something like this (completely untested): > > nfsrootfs_run() { > local nfs_opts > local location > local flags > > nfs_opts="" > if [ "${bootparam_nfsroot#*,}" != "${bootparam_nfsroot}" ] ; then > nfs_opts="-o ${bootparam_nfsroot#*,}" > fi > location="${bootparam_nfsroot%%,*}" > if [ "${location#*:}" = "${location}" ]; then > # server-ip not given > location=${ROOTSERVER}:${location} > fi > > flags="-o nolock" > if [ -n "$bootparam_ro" ] && ! echo "$bootparam_rootflags" | grep -w -q "ro"; then > if [ -n "$bootparam_rootflags" ]; then > bootparam_rootflags="$bootparam_rootflags," > fi > bootparam_rootflags="${bootparam_rootflags}ro" > fi > if [ -n "$bootparam_rootflags" ]; then > flags="$flags -o$bootparam_rootflags" > fi > > mount -t nfs ${flags} ${nfs_opts} ${location} ${ROOTFS_DIR} > } > > ? Just need to get at $ROOTSERVER now, or at least issue a warning that it > should be given on the command line. > > >> What module is responsible for network configuration and network driver >> loading? > I'd say IP should be separate, as you can then also easily add DHCP or > zeroconf. It's not really related to nfsroot (except for the ROOTSERVER > bit). > Network driver loading should definitely be a machine specific thing... > >> Should it be separate custom module in initramfs-framework not related >> to upstream? >> >> Best regards, >> Oleksii > > Cheers, > Andre' > ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-04-18 10:04 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-03-12 14:33 [PATCH] core-image-minimal-initramfs: prepare initramfs for NFS boot Oleksii Konoplitskyi 2018-03-12 16:59 ` André Draszik 2018-03-16 18:20 ` Oleksii Konoplitskyi 2018-04-03 14:23 ` André Draszik 2018-04-18 9:55 ` Oleksii Konoplitskyi 2018-04-18 9:57 ` Oleksii Konoplitskyi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox