aboutsummaryrefslogtreecommitdiffstats
path: root/main/mkinitfs/git.patch
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2013-05-02 19:30:43 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2013-05-02 19:30:43 +0000
commit4387da41576f6b2ef9aa7e1bf89954d2b9f7b9a0 (patch)
treeb28a772a2b5291d806e9c96bd2a8dafd40322389 /main/mkinitfs/git.patch
parentfc54f156bf6a076063aef3bb3c7db3919b967fc6 (diff)
downloadaports-4387da41576f6b2ef9aa7e1bf89954d2b9f7b9a0.tar.bz2
aports-4387da41576f6b2ef9aa7e1bf89954d2b9f7b9a0.tar.xz
main/mkinitfs: backport initial pxe support
Diffstat (limited to 'main/mkinitfs/git.patch')
-rw-r--r--main/mkinitfs/git.patch282
1 files changed, 282 insertions, 0 deletions
diff --git a/main/mkinitfs/git.patch b/main/mkinitfs/git.patch
new file mode 100644
index 0000000000..b82239e419
--- /dev/null
+++ b/main/mkinitfs/git.patch
@@ -0,0 +1,282 @@
+diff --git a/initramfs-init.in b/initramfs-init.in
+index 3c05f81..5d07157 100755
+--- a/initramfs-init.in
++++ b/initramfs-init.in
+@@ -191,7 +191,7 @@ setup_inittab_console(){
+ esac
+ shift
+
+- # skip "current console" from beign added to inittab
++ # skip "current console" from being added to inittab
+ [ "$tty" = "tty0" ] && continue
+
+ # do nothing if inittab already have the tty set up
+@@ -240,6 +240,81 @@ start_lvm() {
+ lvm vgchange --ignorelockingfailure -a y >/dev/null 2>&1
+ }
+
++# determine the default interface to use if ip=dhcp is set
++# uses the first "eth" interface.
++ip_choose_if() {
++ for x in /sys/class/net/eth*; do
++ [ -e "$x" ] && echo ${x##*/} && return
++ done
++}
++
++# ip_set <device> <ip> <netmask> <gateway-ip>
++ip_set() {
++ ifconfig "$1" "$2" netmask "$3" || return $?
++ if [ -n "$4" ]; then
++ ip route add 0.0.0.0/0 via "$4" dev "$1" || return $?
++ fi
++}
++
++# if "ip=dhcp" is specified on the command line, we obtain an IP address
++# using udhcpc. we do this now and not by enabling kernel-mode DHCP because
++# kernel-model DHCP appears to require that network drivers be built into
++# the kernel rather than as modules. At this point all applicable modules
++# in the initrd should have been loaded.
++#
++# You need af_packet.ko available as well modules for your Ethernet card.
++#
++# Valid syntaxes:
++# ip=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf
++# ip=dhcp
++# "server-ip" and "hostname" are not supported here.
++#
++configure_ip() {
++ [ -n "$KOPT_ip" ] || return
++ OIFS=$IFS
++ IFS=':'
++ eval set -- $KOPT_ip
++ IFS=$OIFS
++
++ local client_ip="$1"
++ local gw_ip="$3"
++ local netmask="$4"
++ local device="$6"
++ local autoconf="$7"
++ case "$client_ip" in
++ off|none|'') return;;
++ dhcp) autoconf="dhcp";;
++ esac
++
++ [ -n "$device" ] || device=$(ip_choose_if)
++ if [ -z "$device" ]; then
++ echo "ERROR: IP requested but no network device was found"
++ return 1
++ fi
++
++ if [ "$autoconf" = "dhcp" ]; then
++ 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
++ eend $?
++ else
++ # manual configuration
++ [ -n "$client_ip" -a -n "$netmask" ] || return
++ ebegin "Setting IP ($device)..."
++ ip_set "$device" "$client_ip" "$netmask" "$gw_ip"
++ eend $?
++ fi
++ MAC_ADDRESS=$(cat /sys/class/net/$device/address)
++ MACHINE_UUID=$(cat /sys/class/dmi/id/product_uuid)
++ OVL_DEV="${OVL_DEV/{MAC\}/$MAC_ADDRESS}"
++ OVL_DEV="${OVL_DEV/{UUID\}/$MACHINE_UUID}"
++}
++
+ # resolve an uuid or symlink to the real device
+ resolve_dev() {
+ case "$1" in
+@@ -275,8 +350,12 @@ find_fs_type() {
+
+ # find the dirs under ALPINE_MNT that are boot repositories
+ find_boot_repositories() {
+- find $ALPINE_MNT -name .boot_repository -type f -maxdepth 3 \
+- | sed 's:/.boot_repository$::'
++ if [ -n "$ALPINE_REPO" ]; then
++ echo "$ALPINE_REPO"
++ else
++ find $ALPINE_MNT -name .boot_repository -type f -maxdepth 3 \
++ | sed 's:/.boot_repository$::'
++ fi
+ }
+
+ # gotta start from somewhere :)
+@@ -286,8 +365,9 @@ echo "Alpine Init $VERSION"
+ # acpi_osi="!Windows 2006"
+ eval set -- `cat /proc/cmdline`
+
+-myopts="alpine_dev autodetect autoraid chart cryptroot debug_init dma init_args
+- keep_apk_new modules ovl_dev pkgs quiet root_size root usbdelay"
++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"
+
+ for opt; do
+ case "$opt" in
+@@ -340,6 +420,8 @@ ALPINE_DEV_FS=${KOPT_alpine_dev##*:}
+ if [ "$ALPINE_DEV_FS" = "$ALPINE_DEV" ]; then
+ unset ALPINE_DEV_FS
+ fi
++
++# /dev/blah:ext3
+ if [ -n "$KOPT_ovl_dev" ] ; then
+ OVL_DEV=${KOPT_ovl_dev%%:*}
+ OVL_DEV_FS=${KOPT_ovl_dev##*:}
+@@ -348,13 +430,31 @@ if [ -n "$KOPT_ovl_dev" ] ; then
+ fi
+ fi
+
++# http://.../blah.apkovl.tar.gz
++case "$KOPT_apkovl" in
++ http://*|https://|ftp://*)
++ OVL_DEV="$KOPT_apkovl";;
++esac
++
+ case "$ALPINE_DEV" in
+ UUID=*|LABEL=*) ;;
++ nfs)
++ # nfs:IP:EXPORT
++ ALPINE_DEV_FS="$ALPINE_DEV"
++ ALPINE_DEV="${KOPT_alpine_dev:4}"
++ ;;
+ *) ALPINE_DEV=/dev/$ALPINE_DEV ;;
+ esac
+
++# The following values are supported:
++# alpine_repo=auto -- default, search for .boot_repository
++# alpine_repo=http://... -- network repository
++ALPINE_REPO=${KOPT_alpine_repo}
++[ "$ALPINE_REPO" = "auto" ] && ALPINE_REPO=
++
+ # look for standard mountpoint locations
+ ALPINE_MNT=$(find_mnt $ALPINE_DEV /etc/fstab)
++[ -z "$ALPINE_MNT" ] && [ "$ALPINE_DEV_FS" = nfs ] && ALPINE_MNT=/media/alpine
+ [ -z "$ALPINE_MNT" ] && ALPINE_MNT=/media/${ALPINE_DEV##*/}
+
+ # hide kernel messages
+@@ -428,6 +528,9 @@ if [ -z "${ALPINE_DEV##*usb*}" ]; then
+ wait_usb
+ fi
+
++# IP. This shouldn't be needed if root= is set.
++configure_ip
++
+ # incase we have alpine_dev on raid device...
+ start_raid
+ start_cryptsetup
+@@ -444,6 +547,7 @@ fi
+
+ if [ -n "$ALPINE_DEV_FS" ]; then
+ mount_opts="-t $ALPINE_DEV_FS"
++ [ "$ALPINE_DEV_FS" = "nfs" ] && mount_opts="$mount_opts -o nolock"
+ fi
+
+ retry_mount -o ro $mount_opts $ALPINE_DEV $ALPINE_MNT >/dev/null 2>&1
+@@ -462,19 +566,27 @@ if [ -n "$KOPT_root_size" ]; then
+ fi
+ mount -t tmpfs $root_opts tmpfs $sysroot
+
+-if [ -n "$OVL_DEV" ]; then
+- mkdir -p /media/$OVL_DEV
+- unset mount_opts
+- if [ -n "$OVL_DEV_FS" ]; then
+- mount_opts="-t $OVL_DEV_FS"
+- fi
+-
+- retry_mount -o ro $mount_opts /dev/$OVL_DEV /media/$OVL_DEV \
+- >/dev/null 2>&1
+- ovl=$(find_ovl /media/$OVL_DEV)
+-else
+- find_ovl_dev
+-fi
++case "$OVL_DEV" in
++ '')
++ find_ovl_dev
++ ;;
++ http://*|https://*|ftp://*)
++ ovl=/tmp/boot.apkovl.tar.gz
++ wget -O "$ovl" "$OVL_DEV" || ovl=
++ ;;
++ *)
++ mkdir -p /media/$OVL_DEV
++ unset mount_opts
++ if [ -n "$OVL_DEV_FS" ]; then
++ mount_opts="-t $OVL_DEV_FS"
++ fi
++
++ retry_mount -o ro $mount_opts /dev/$OVL_DEV /media/$OVL_DEV \
++ >/dev/null 2>&1
++ ovl=$(find_ovl /media/$OVL_DEV)
++ ;;
++esac
++
+ if ! [ -f "$ovl" ]; then
+ ovl=$(find_ovl $ALPINE_MNT)
+ fi
+@@ -508,7 +620,8 @@ if [ -f "$ovl" ]; then
+ -e 's|:/etc/init.d/rcK|:/sbin/rc shutdown|' \
+ "$sysroot"/etc/inittab
+ fi
+-else
++fi
++if [ -f "$sysroot/etc/.default_boot_services" -o ! -f "$ovl" ]; then
+ # add some boot services by default
+ rc_add devfs sysinit
+ rc_add dmesg sysinit
+@@ -524,6 +637,8 @@ else
+ rc_add mount-ro shutdown
+ rc_add killprocs shutdown
+ rc_add savecache shutdown
++
++ rm -f "$sysroot/etc/.default_boot_services"
+ fi
+
+ if [ -f $sysroot/etc/fstab ]; then
+@@ -569,7 +684,14 @@ ebegin "Installing packages to root filesystem"
+ if [ "$KOPT_chart" = yes ]; then
+ pkgs="$pkgs acct"
+ fi
+-apkflags="--initdb --progress --force --no-network"
++
++apkflags="--initdb --progress --force"
++if [ -z "$ALPINE_REPO" ]; then
++ apkflags="$apkflags --no-network"
++else
++ apkflags="$apkflags --update-cache"
++fi
++
+ if [ -n "$KOPT_quiet" ]; then
+ apkflags="$apkflags --quiet"
+ fi
+@@ -580,7 +702,7 @@ if [ "$KOPT_keep_apk_new" != yes ]; then
+ fi
+
+ if [ -n "$ovlfiles" ]; then
+- apk add --root $sysroot $repo_opt $apkflags $pkgs <$ovlfiles>/dev/null
++ apk add --root $sysroot $repo_opt $apkflags $pkgs <$ovlfiles>/dev/null
+ else
+ apk add --root $sysroot $repo_opt $apkflags $pkgs >/dev/null
+ fi
+@@ -613,11 +735,14 @@ fi
+ setup_inittab_console $CONSOLE
+
+ # copy alpine release info
+-if ! [ -f "$sysroot"/etc/alpine-release ]; then
++if ! [ -f "$sysroot"/etc/alpine-release ] && [ -f $ALPINE_MNT/.alpine-release ]; then
+ cp $ALPINE_MNT/.alpine-release $sysroot/
+ ln -sf /.alpine-release $sysroot/etc/alpine-release
+ fi
+
++! [ -f "$sysroot"/etc/resolv.conf ] && [ -f /etc/resolv.conf ] && \
++ cp /etc/resolv.conf "$sysroot"/etc
++
+ # setup bootchart for switch_root
+ chart_init=""
+ if [ "$KOPT_chart" = yes ]; then