home: hub: mkinitfs

Download patch

ref: ca9c1938ca136ebd5f341f9fb01b822905f41906
parent: f006465dd284560e59eef562158a9ff5a035aba4
author: Carlo Landmeter <clandmeter@gmail.com>
date: Fri Oct 28 10:31:31 CDT 2016

mkinitfs: add nbd support

this also introduces default behaviour for networking
calling configure_ip without setting ip defaults to dhcp

--- a/Makefile
+++ b/Makefile
@@ -40,7 +40,9 @@
 		features.d/ubifs.modules \
 		features.d/usb.modules \
 		features.d/virtio.modules \
-		features.d/xfs.modules
+		features.d/xfs.modules \
+		features.d/nbd.files \
+		features.d/nbd.modules
 
 SCRIPTS		:= mkinitfs bootchartd initramfs-init
 IN_FILES	:= $(addsuffix .in,$(SCRIPTS))
--- /dev/null
+++ b/features.d/nbd.files
@@ -1,0 +1,1 @@
+/usr/sbin/nbd-client
--- /dev/null
+++ b/features.d/nbd.modules
@@ -1,0 +1,1 @@
+kernel/drivers/block/nbd.ko
--- a/features.d/network.modules
+++ b/features.d/network.modules
@@ -1,2 +1,4 @@
 kernel/drivers/net/ethernet
 kernel/net/packet/af_packet.ko
+kernel/drivers/net/hyperv
+kernel/drivers/net/vmxnet3
--- a/initramfs-init.in
+++ b/initramfs-init.in
@@ -167,14 +167,15 @@
 #   ip=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf
 #   ip=dhcp
 #   "server-ip" and "hostname" are not supported here.
+# Default (when configure_ip is called without setting ip=):
+#   ip=dhcp
 #
 configure_ip() {
-	[ -z "$KOPT_ip" -o "$MAC_ADDRESS" ] && return
-	OIFS=$IFS
-	IFS=':'
-	eval set -- $KOPT_ip
-	IFS=$OIFS
-
+	[ -n "$MAC_ADDRESS" ] && return
+	local ops=${KOPT_ip:-dhcp}
+	local IFS=':'
+	set -- $ops
+	unset IFS
 	local client_ip="$1"
 	local gw_ip="$3"
 	local netmask="$4"
@@ -190,13 +191,12 @@
 		echo "ERROR: IP requested but no network device was found"
 		return 1
 	fi
-
 	if [ "$autoconf" = "dhcp" ]; then
+		# automatic configuration
 		if [ ! -e /usr/share/udhcpc/default.script ]; then
 			echo "ERROR: DHCP requested but not present in initrd"
 			return 1
 		fi
-		# automatic configuration
 		ebegin "Obtaining IP via DHCP ($device)..."
 		ifconfig $device 0.0.0.0
 		udhcpc -i $device -f -q
@@ -241,6 +241,21 @@
 	fi
 }
 
+setup_nbd() {
+	modprobe -q nbd max_part=8 || return 1
+	local IFS=, n=0
+	set -- $KOPT_nbd
+	unset IFS
+	for ops; do
+		local server="${ops%:*}"
+		local port="${ops#*:}"
+		local device="/dev/nbd${n}"
+		[ -b "$device" ] || continue
+		nbd-client "$server" "$port" "$device" && n=$((n+1))
+	done
+	[ "$n" != 0 ] || return 1
+}
+
 # read the kernel options. we need surve things like:
 #  acpi_osi="!Windows 2006" xen-pciback.hide=(01:00.0)
 set -- $(cat /proc/cmdline)
@@ -248,7 +263,7 @@
 myopts="alpine_dev autodetect autoraid chart cryptroot cryptdm debug_init
 	dma init_args keep_apk_new modules ovl_dev pkgs quiet root_size root
 	usbdelay ip alpine_repo apkovl alpine_start splash blacklist
-	overlaytmpfs rootfstype rootflags"
+	overlaytmpfs rootfstype rootflags nbd"
 
 for opt; do
 	case "$opt" in
@@ -341,6 +356,11 @@
 	if [ -n "$KOPT_cryptdm" ]; then
 		cryptopts="$cryptopts -m ${KOPT_cryptdm}"
 	fi
+fi
+
+if [ -n "$KOPT_nbd" ]; then
+	configure_ip
+	setup_nbd || echo "Failed to setup nbd device."
 fi
 
 # check if root=... was set