* add mkinitcpio-nfs-utils
This commit is contained in:
parent
03147d27d7
commit
3020142f5f
36
mkinitcpio-nfs-utils/PKGBUILD
Normal file
36
mkinitcpio-nfs-utils/PKGBUILD
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# POWER Maintainer: Alexander Baldeck <alex.bldck@gmail.com>
|
||||||
|
# Maintainer: Thomas Bächler <thomas@archlinux.org>
|
||||||
|
|
||||||
|
pkgname=mkinitcpio-nfs-utils
|
||||||
|
pkgver=0.3
|
||||||
|
pkgrel=6
|
||||||
|
pkgdesc="ipconfig and nfsmount tools for NFS root support in mkinitcpio"
|
||||||
|
arch=(x86_64 powerpc64le)
|
||||||
|
url="http://www.archlinux.org/"
|
||||||
|
license=('GPL2')
|
||||||
|
depends=('glibc')
|
||||||
|
source=("https://sources.archlinux.org/other/mkinitcpio/$pkgname-$pkgver.tar.xz"
|
||||||
|
'nfsmount-fix-wrong-umount-path.patch'
|
||||||
|
'initcpio-install-net'
|
||||||
|
'initcpio-hook-net')
|
||||||
|
sha256sums=('d290d489844fae100ca7b848b8eef40078124ff373203086bacc07329d1e8939'
|
||||||
|
'6edb239f3d541b8ddee816e2d18bfb3ee1d3f5f8827769674cc8bf2a7ce38f21'
|
||||||
|
'ce9f021763c020b9b62a761974437fd1e9e894df3effc58e71671bf83b061255'
|
||||||
|
'29a5a4a9ebd61bfa1afbb8dcaf2187e487ee1f34b1979a85a853fa2acbeb510e')
|
||||||
|
|
||||||
|
build() {
|
||||||
|
cd "$pkgname-$pkgver"
|
||||||
|
|
||||||
|
# upstream commit 029622dfbfe25203275a385a5bf33d44c2409b00
|
||||||
|
patch -Np1 < "$srcdir/nfsmount-fix-wrong-umount-path.patch"
|
||||||
|
|
||||||
|
make
|
||||||
|
}
|
||||||
|
|
||||||
|
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"
|
||||||
|
}
|
90
mkinitcpio-nfs-utils/initcpio-hook-net
Normal file
90
mkinitcpio-nfs-utils/initcpio-hook-net
Normal file
@ -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:
|
108
mkinitcpio-nfs-utils/initcpio-install-net
Normal file
108
mkinitcpio-nfs-utils/initcpio-install-net
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
build() {
|
||||||
|
add_checked_modules '/drivers/net/'
|
||||||
|
add_module nfsv3?
|
||||||
|
|
||||||
|
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:
|
14
mkinitcpio-nfs-utils/nfsmount-fix-wrong-umount-path.patch
Normal file
14
mkinitcpio-nfs-utils/nfsmount-fix-wrong-umount-path.patch
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
--- a/nfsmount/mount.c 2012-11-10 20:16:31.894540497 -0500
|
||||||
|
+++ b/nfsmount/mount.c 2012-11-10 20:16:39.957369011 -0500
|
||||||
|
@@ -358,9 +358,9 @@
|
||||||
|
bail:
|
||||||
|
if (mounted) {
|
||||||
|
if (data->flags & NFS_MOUNT_VER3) {
|
||||||
|
- umount_v3(path, clnt);
|
||||||
|
+ umount_v3(rem_path, clnt);
|
||||||
|
} else {
|
||||||
|
- umount_v2(path, clnt);
|
||||||
|
+ umount_v2(rem_path, clnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user