summaryrefslogtreecommitdiff
path: root/core/mkinitcpio-nfs-utils
diff options
context:
space:
mode:
authorroot <root@rshg054.dnsready.net>2012-06-03 00:04:14 +0000
committerroot <root@rshg054.dnsready.net>2012-06-03 00:04:14 +0000
commitd915cad658736d96368750201c34df752048751a (patch)
treea6d70fb8b01aaa111efbc8a6874a8f94b882626d /core/mkinitcpio-nfs-utils
parent211709a2f09bd677aa1deac0dc82fde6ce1c8626 (diff)
Sun Jun 3 00:04:13 UTC 2012
Diffstat (limited to 'core/mkinitcpio-nfs-utils')
-rw-r--r--core/mkinitcpio-nfs-utils/PKGBUILD16
-rw-r--r--core/mkinitcpio-nfs-utils/initcpio-hook-net90
-rw-r--r--core/mkinitcpio-nfs-utils/initcpio-install-net107
3 files changed, 209 insertions, 4 deletions
diff --git a/core/mkinitcpio-nfs-utils/PKGBUILD b/core/mkinitcpio-nfs-utils/PKGBUILD
index 0d168a62a..70166e1db 100644
--- a/core/mkinitcpio-nfs-utils/PKGBUILD
+++ b/core/mkinitcpio-nfs-utils/PKGBUILD
@@ -1,16 +1,20 @@
-# $Id: PKGBUILD 158597 2012-05-05 02:34:37Z dreisner $
+# $Id: PKGBUILD 160392 2012-06-01 13:21:36Z dreisner $
# Maintainer: Thomas Bächler <thomas@archlinux.org>
pkgname=mkinitcpio-nfs-utils
pkgver=0.3
-pkgrel=2
+pkgrel=3
pkgdesc="ipconfig and nfsmount tools for NFS root support in mkinitcpio"
arch=('i686' 'x86_64')
url="http://www.archlinux.org/"
license=('GPL2')
depends=('glibc')
-source=("ftp://ftp.archlinux.org/other/mkinitcpio/$pkgname-$pkgver.tar.xz")
-sha256sums=('d290d489844fae100ca7b848b8eef40078124ff373203086bacc07329d1e8939')
+source=("ftp://ftp.archlinux.org/other/mkinitcpio/$pkgname-$pkgver.tar.xz"
+ 'initcpio-install-net'
+ 'initcpio-hook-net')
+sha256sums=('d290d489844fae100ca7b848b8eef40078124ff373203086bacc07329d1e8939'
+ '8e5ddaacb0e5751e432f95870958c5fa2e01e1ab3f55b5eca2b8b2d030b5d861'
+ '29a5a4a9ebd61bfa1afbb8dcaf2187e487ee1f34b1979a85a853fa2acbeb510e')
build() {
make -C "$pkgname-$pkgver"
@@ -18,4 +22,8 @@ build() {
package() {
make -C "$pkgname-$pkgver" DESTDIR="$pkgdir" install
+
+ # override hooks, they need updates
+ install -m644 "$srcdir/initcpio-install-net" "$pkgdir/usr/lib/initcpio/install/net"
+ install -m644 "$srcdir/initcpio-hook-net" "$pkgdir/usr/lib/initcpio/hooks/net"
}
diff --git a/core/mkinitcpio-nfs-utils/initcpio-hook-net b/core/mkinitcpio-nfs-utils/initcpio-hook-net
new file mode 100644
index 000000000..4d1ebb956
--- /dev/null
+++ b/core/mkinitcpio-nfs-utils/initcpio-hook-net
@@ -0,0 +1,90 @@
+# vim: set ft=sh:
+run_hook() {
+ local line i net_mac bootif_mac bootif_dev defaultrootpath defaultserver
+ # These variables will be parsed from /tmp/net-*.conf generated by ipconfig
+ local DEVICE
+ local IPV4ADDR IPV4BROADCAST IPV4NETMASK IPV4GATEWAY IPV4DNS0 IPV4DNS1
+ local HOSTNAME DNSDOMAIN NISDOMAIN ROOTSERVER ROOTPATH
+ local filename
+ # /tmp/net-*.conf
+
+ if [ -z "${ip}" -a -n "${nfsaddrs}" ]; then
+ ip="${nfsaddrs}"
+ fi
+
+ if [ -n "${ip}" ]; then
+ if [ -n "${BOOTIF}" ]; then
+ bootif_mac=${BOOTIF#01-}
+ bootif_mac=${bootif_mac//-/:}
+ for i in /sys/class/net/*/address; do
+ read net_mac < ${i}
+ if [ "${bootif_mac}" == "${net_mac}" ]; then
+ bootif_dev=${i#/sys/class/net/}
+ bootif_dev=${bootif_dev%/address}
+ break
+ fi
+ done
+ ip="${ip}::${bootif_dev}"
+ fi
+
+ # setup network and save some values
+ ipconfig "ip=${ip}"
+
+ for conf in /tmp/net-*.conf; do
+ [ -f "$conf" ] && . "$conf"
+ done
+
+ # calculate nfs_server, nfs_path and nfs_option for later nfs mount
+ if [ "${root}" = "/dev/nfs" -o "${nfsroot}" != "" ]; then
+ # parse ROOTPATH if defined by dhcp server
+ if [ -n "${ROOTPATH}" ]; then
+ line="${ROOTPATH}"
+ nfs_server="${line%%:*}"
+ [ "${nfs_server}" = "${line}" ] && nfs_server="${ROOTSERVER}"
+ defaultserver="${nfs_server}"
+ line="${line#*:}"
+ nfs_path="${line}"
+ defaultrootpath="${nfs_path}"
+ else
+ # define a default ROOTPATH
+ if [ "${ROOTPATH}" = "" ]; then
+ defaultrootpath="/tftpboot/${IPV4ADDR}"
+ fi
+ fi
+
+ # parse nfsroot if present (overrides ROOTPATH)
+ if [ -n "${nfsroot}" ]; then
+ line="${nfsroot}"
+ nfs_server="${line%%:*}"
+ [ -z "${nfs_server}" ] && nfs_server="${defaultserver}"
+ line="${line#*:}"
+ nfs_path="${line%%,*}"
+ line="${line#"${nfs_path}"}"
+ [ -z "${nfs_path}" ] && nfs_path="${defaultrootpath}"
+ nfs_option="${line#","}"
+ fi
+
+ # ensure root and filesystem type are set proper for nfs boot
+ root="/dev/nfs"
+ rootfstype="nfs"
+
+ echo "NFS-Mount: ${nfs_server}:${nfs_path}"
+
+ # set mount handler for NFS
+ mount_handler="nfs_mount_handler"
+ fi
+ fi
+}
+
+nfs_mount_handler() {
+ if [ -z "$nfs_server" -o -z "$nfs_path" ]; then
+ err "Unable to mount root filesystem over NFS: wrong parameters."
+ echo "You are being dropped to a recovery shell"
+ echo " Type 'exit' to try and continue booting"
+ launch_interactive_shell
+ msg "Trying to continue (this will most likely fail) ..."
+ fi
+ nfsmount ${nfs_option:+-o ${nfs_option}} "${nfs_server}:${nfs_path}" "$1"
+}
+
+# vim: set ft=sh ts=4 sw=4 et:
diff --git a/core/mkinitcpio-nfs-utils/initcpio-install-net b/core/mkinitcpio-nfs-utils/initcpio-install-net
new file mode 100644
index 000000000..7030e2d64
--- /dev/null
+++ b/core/mkinitcpio-nfs-utils/initcpio-install-net
@@ -0,0 +1,107 @@
+#!/bin/bash
+
+build() {
+ add_checked_modules '/drivers/net/'
+
+ add_binary "/usr/lib/initcpio/ipconfig" "/bin/ipconfig"
+ add_binary "/usr/lib/initcpio/nfsmount" "/bin/nfsmount"
+
+ add_runscript
+}
+
+help() {
+ cat <<HELPEOF
+This hook loads the necessary modules for a network device.
+Detection will take place at runtime. To minimize the modules
+in the image, add the autodetect hook too.
+For pcmcia net devices please use pcmcia hook too.
+
+Kernel Parameters:
+An interface spec can be either short form, which is just the name of
+an interface (eth0 or whatever), or long form. The long form consists
+of up to seven elements, separated by colons:
+
+ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
+nfsaddrs= is an alias to ip= and can be used too.
+
+<client-ip> IP address of the client. If empty, the address will
+ either be determined by RARP/BOOTP/DHCP. What protocol
+ is used de- pends on the <autoconf> parameter. If this
+ parameter is not empty, autoconf will be used.
+
+<server-ip> IP address of the NFS server. If RARP is used to
+ determine the client address and this parameter is NOT
+ empty only replies from the specified server are
+ accepted. To use different RARP and NFS server,
+ specify your RARP server here (or leave it blank), and
+ specify your NFS server in the 'nfsroot' parameter
+ (see above). If this entry is blank the address of the
+ server is used which answered the RARP/BOOTP/DHCP
+ request.
+
+<gw-ip> IP address of a gateway if the server is on a different
+ subnet. If this entry is empty no gateway is used and the
+ server is assumed to be on the local network, unless a
+ value has been received by BOOTP/DHCP.
+
+<netmask> Netmask for local network interface. If this is empty,
+ the netmask is derived from the client IP address assuming
+ classful addressing, unless overridden in BOOTP/DHCP reply.
+
+<hostname> Name of the client. If empty, the client IP address is
+ used in ASCII notation, or the value received by
+ BOOTP/DHCP.
+
+<device> Name of network device to use. If this is empty, all
+ devices are used for RARP/BOOTP/DHCP requests, and the
+ first one we receive a reply on is configured. If you
+ have only one device, you can safely leave this blank.
+
+<autoconf> Method to use for autoconfiguration. If this is either
+ 'rarp', 'bootp', or 'dhcp' the specified protocol is
+ used. If the value is 'both', 'all' or empty, all
+ protocols are used. 'off', 'static' or 'none' means
+ no autoconfiguration.
+Examples:
+ip=127.0.0.1:::::lo:none --> Enable the loopback interface.
+ip=192.168.1.1:::::eth2:none --> Enable static eth2 interface.
+ip=:::::eth0:dhcp --> Enable dhcp protcol for eth0 configuration.
+
+nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
+
+If the 'nfsroot' parameter is NOT given on the command line, the default
+"/tftpboot/%s" will be used.
+
+<server-ip> Specifies the IP address of the NFS server. If this field
+ is not given, the default address as determined by the
+ 'ip' variable (see below) is used. One use of this
+ parameter is for example to allow using different servers
+ for RARP and NFS. Usually you can leave this blank.
+
+<root-dir> Name of the directory on the server to mount as root. If
+ there is a "%s" token in the string, the token will be
+ replaced by the ASCII-representation of the client's IP
+ address.
+
+<nfs-options> Standard NFS options. All options are separated by commas.
+ If the options field is not given, the following defaults
+ will be used:
+ port = as given by server portmap daemon
+ rsize = 1024
+ wsize = 1024
+ timeo = 7
+ retrans = 3
+ acregmin = 3
+ acregmax = 60
+ acdirmin = 30
+ acdirmax = 60
+ flags = hard, nointr, noposix, cto, ac
+
+root=/dev/nfs
+
+If you don't use nfsroot= parameter you need to set root=/dev/nfs
+to boot from a nfs root by autoconfiguration.
+HELPEOF
+}
+
+# vim: set ft=sh ts=4 sw=4 et: