summaryrefslogtreecommitdiffstats
path: root/remote/rootfs
diff options
context:
space:
mode:
authorDirk2014-02-21 11:16:02 +0100
committerDirk2014-02-21 11:16:02 +0100
commit1e30627c5b00884054fae7210d036e34ebe4f181 (patch)
tree6d258c5a7a2279881706f38e37921dc4557a0b8d /remote/rootfs
parentSetzen des Windows-Namens beim Booten aus Laufwerk B: (diff)
parent[nvidia_libs] Debug: Checkin für Joey:). (diff)
downloadtm-scripts-1e30627c5b00884054fae7210d036e34ebe4f181.tar.gz
tm-scripts-1e30627c5b00884054fae7210d036e34ebe4f181.tar.xz
tm-scripts-1e30627c5b00884054fae7210d036e34ebe4f181.zip
Merge branch 'master' of git.openslx.org:openslx-ng/tm-scripts
...
Diffstat (limited to 'remote/rootfs')
-rw-r--r--remote/rootfs/rootfs-stage31/data/etc/modprobe.d/vmwgfx-fbdev.conf5
-rwxr-xr-xremote/rootfs/rootfs-stage31/data/inc/activate_sysconfig (renamed from remote/rootfs/rootfs-stage31/data/bin/activate_sysconfig)21
-rw-r--r--remote/rootfs/rootfs-stage31/data/inc/drm.functions71
-rw-r--r--remote/rootfs/rootfs-stage31/data/inc/functions (renamed from remote/rootfs/rootfs-stage31/data/etc/functions.inc)12
-rw-r--r--remote/rootfs/rootfs-stage31/data/inc/network.functions23
-rwxr-xr-xremote/rootfs/rootfs-stage31/data/inc/setup_network (renamed from remote/rootfs/rootfs-stage31/data/bin/setup_network)48
-rwxr-xr-xremote/rootfs/rootfs-stage31/data/inc/setup_network_retry33
-rwxr-xr-xremote/rootfs/rootfs-stage31/data/inc/setup_stage32 (renamed from remote/rootfs/rootfs-stage31/data/bin/setup_stage32)23
-rwxr-xr-xremote/rootfs/rootfs-stage31/data/inc/udhcpc-trigger92
-rwxr-xr-xremote/rootfs/rootfs-stage31/data/init88
-rw-r--r--remote/rootfs/rootfs-stage31/rootfs-stage31.build70
-rw-r--r--remote/rootfs/rootfs-stage31/rootfs-stage31.conf50
-rw-r--r--remote/rootfs/rootfs-stage31/templates/drm.cfg6
-rw-r--r--remote/rootfs/rootfs-stage32/data/etc/modprobe.d/50-mltk-blacklist.conf8
-rw-r--r--remote/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service13
-rw-r--r--remote/rootfs/rootfs-stage32/data/etc/systemd/system/mount-stage4.service3
-rw-r--r--remote/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target2
-rw-r--r--remote/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target3
-rw-r--r--remote/rootfs/rootfs-stage32/data/etc/systemd/system/ntpdate.service1
-rw-r--r--remote/rootfs/rootfs-stage32/data/etc/systemd/system/setup-partitions.service5
-rw-r--r--remote/rootfs/rootfs-stage32/data/etc/systemd/system/stage4.target4
l---------remote/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service1
l---------remote/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/zram-swap.service1
-rw-r--r--remote/rootfs/rootfs-stage32/data/etc/systemd/system/zram-swap.service10
-rw-r--r--remote/rootfs/rootfs-stage32/data/etc/tmpfiles.d/network.conf1
-rw-r--r--remote/rootfs/rootfs-stage32/data/etc/tmpfiles.d/run-lock.conf2
-rwxr-xr-xremote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers29
-rwxr-xr-xremote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-mount_stage43
-rwxr-xr-xremote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_partitions28
-rwxr-xr-xremote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_slx_addons4
-rwxr-xr-xremote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-zram_swap60
-rw-r--r--remote/rootfs/rootfs-stage32/rootfs-stage32.build3
32 files changed, 566 insertions, 157 deletions
diff --git a/remote/rootfs/rootfs-stage31/data/etc/modprobe.d/vmwgfx-fbdev.conf b/remote/rootfs/rootfs-stage31/data/etc/modprobe.d/vmwgfx-fbdev.conf
new file mode 100644
index 00000000..ebc4b49c
--- /dev/null
+++ b/remote/rootfs/rootfs-stage31/data/etc/modprobe.d/vmwgfx-fbdev.conf
@@ -0,0 +1,5 @@
+# when vmwgfx is loaded via modprobe in stage31, this conf file is read,
+# enables fbdev support for vmware so that
+# fb doesnt break when switching tty's in minilinux running inside vmware
+options vmwgfx enable_fbdev=1
+
diff --git a/remote/rootfs/rootfs-stage31/data/bin/activate_sysconfig b/remote/rootfs/rootfs-stage31/data/inc/activate_sysconfig
index 580b23ed..d5838f0b 100755
--- a/remote/rootfs/rootfs-stage31/data/bin/activate_sysconfig
+++ b/remote/rootfs/rootfs-stage31/data/inc/activate_sysconfig
@@ -37,7 +37,7 @@ fetch_config_files() {
#########################################################################
#
# This function updates the downloaded config with the IP information
-# received from /bin/setup_network
+# received from /inc/setup_network
update_sysconfig() {
# sanity checks
[ ! -e "${CONFIG}" ] && { echo "Cannot update. '$CONFIG' does not exist."; return 1; }
@@ -55,18 +55,21 @@ HEREEND
# setup hardware clock
. "${CONFIG}"
- if [ "x$SLX_BIOS_CLOCK" == "xlocal" ]; then
- hwclock -s -l
- elif [ "x$SLX_BIOS_CLOCK" == "xutc" ]; then
- hwclock -s -u
- fi
+ if [ "x$SLX_BIOS_CLOCK" == "xlocal" ]; then
+ hwclock -s -l
+ elif [ "x$SLX_BIOS_CLOCK" == "xutc" ]; then
+ hwclock -s -u
+ fi
- local TEMP_EXTRACT_DIR="/tmp/config.tgz.tmp"
+ local TEMP_EXTRACT_DIR="/tmp/config.tgz.tmp"
mkdir -p "${TEMP_EXTRACT_DIR}"
tar xf "${CONFIG}.tgz" -C "${TEMP_EXTRACT_DIR}" || { echo "Could not untar ${CONFIG}.tgz to ${TEMP_EXTRACT_DIR}"; return 1; }
chown -R 0:0 "${TEMP_EXTRACT_DIR}" 2>/dev/null
cd "${TEMP_EXTRACT_DIR}"
tar -cp * | tar -xp -C "${FUTURE_ROOT}"
+ cd /
+ rm -rf -- "${TEMP_EXTRACT_DIR}"
+ [ $DEBUG -eq 0 ] && rm -f -- "${CONFIG}.tgz"
}
@@ -76,5 +79,7 @@ HEREEND
#
fetch_sysconfig
-fetch_config_files
+fetch_config_files
update_sysconfig
+true
+
diff --git a/remote/rootfs/rootfs-stage31/data/inc/drm.functions b/remote/rootfs/rootfs-stage31/data/inc/drm.functions
new file mode 100644
index 00000000..666f22a9
--- /dev/null
+++ b/remote/rootfs/rootfs-stage31/data/inc/drm.functions
@@ -0,0 +1,71 @@
+
+# pass module name(s) relative path in /lib/modules with .ko extension, or special like @nvidia or @amd
+load_gfx () {
+ local MOD FILES OFFSET RETVAL
+ RETVAL=1 # default: failure
+ while [ $# -gt 0 ]; do
+ MOD=$(echo $1) # trim :)
+ shift
+ [ -z "$MOD" ] && continue
+ if [ "x${MOD}" != "x${MOD#@}" ]; then
+ # starts with '@' - special
+ OFFSET=$(( ${#MOD} + 2 ))
+ FILES=$( grep "^$MOD\s" "/drm.cfg" | cut -c ${OFFSET}- )
+ [ -z "$FILES" ] && drop_shell "Could not find entry for special $MOD"
+ if load_gfx $FILES; then
+ RETVAL=0
+ else
+ # loading special case failed, try fallback if found
+ MOD="${MOD}_fallback"
+ OFFSET=$(( ${#MOD} + 2 ))
+ FILES=$( grep "^$MOD\s" "/drm.cfg" | cut -c ${OFFSET}- )
+ [ -n "$FILES" ] && load_gfx $FILES && RETVAL=0
+ fi
+ else # regular module name or filename
+ if [ "x${MOD%.ko}" == "x${MOD}" ]; then
+ # regular module name
+ modprobe "$MOD" && RETVAL=0
+ else
+ # a .ko file
+ insmod "/lib/modules/$MOD" && RETVAL=0
+ fi
+ fi
+ done
+ return $RETVAL
+}
+
+setup_gfx () {
+ local KERN RETVAL CARD CARDS SUCCESS FILES DRM
+ # check which driver to load
+ CARDS=$(lspci | grep 'Class 03' | awk '{print $4}')
+ if [ -e "/drm.cfg" ] && [ -n "$CARDS" ]; then
+ SUCCESS="yes"
+ for CARD in $CARDS; do
+ # look up exact pci id of this card
+ echo Trying exact matching for drm drivers for $CARD
+ FILES=$(grep "^$CARD\s" "/drm.cfg" | cut -c 11-)
+ load_gfx $FILES && continue
+ # failed... try vendor id only
+ CARD=$(echo $CARD | cut -c 1-4)
+ echo Trying vendor matching for drm drivers for $CARD
+ FILES=$(grep "^$CARD\s" "/drm.cfg" | cut -c 6-)
+ load_gfx $FILES && continue
+ # everything failed for this card
+ echo Unknown PCI vendor id: $CARD
+ SUCCESS="no"
+ done
+ [ "x$SUCCESS" == "xyes" ] && return 0
+ fi
+ # braindead fallback
+ echo "At least one gfx card has no known drm drivers.... will load them all :/"
+ KERN=$(uname -r)
+ RETVAL=1
+ [ -z "$KERN" ] && KERN=$(ls '/lib/modules' | grep '\.' | tail -n 1)
+ for DRM in $(find "/lib/modules/$KERN/kernel/drivers/gpu/drm" -name "*.ko"); do
+ DRM="$(basename "$DRM")"
+ DRM="${DRM%.ko}"
+ modprobe "$DRM" && RETVAL=0
+ done
+ return $RETVAL
+}
+
diff --git a/remote/rootfs/rootfs-stage31/data/etc/functions.inc b/remote/rootfs/rootfs-stage31/data/inc/functions
index ce510aac..f07acc7d 100644
--- a/remote/rootfs/rootfs-stage31/data/etc/functions.inc
+++ b/remote/rootfs/rootfs-stage31/data/inc/functions
@@ -11,6 +11,10 @@
# drop_shell "This is your error message."
#
drop_shell() {
+ if [ -n "$MUTED_OUTPUT" ]; then
+ exec 1>&4 2>&5
+ reset
+ fi
[ $# -gt 0 ] && echo $@
echo "CTRL + D will continue booting."
setsid sh -c 'exec sh </dev/tty1 >/dev/tty1 2>&1'
@@ -23,7 +27,7 @@ drop_shell() {
# Usage:
# read_from_cmdline OPTION
#
-read_from_cmdline(){
+read_from_cmdline() {
[ $# -ne 1 ] && echo "Error - 'read_from_cmdline' requires 1 argument, $# given." && exit 1
local OPTION="$1"
@@ -89,3 +93,9 @@ download() {
return 1
}
+# Add benchmark event to var, including uptime as prefix
+bench_event() {
+ bench_result="${bench_result}$(cut -f 1 -d ' ' "/proc/uptime") $@
+"
+}
+
diff --git a/remote/rootfs/rootfs-stage31/data/inc/network.functions b/remote/rootfs/rootfs-stage31/data/inc/network.functions
new file mode 100644
index 00000000..641f4f55
--- /dev/null
+++ b/remote/rootfs/rootfs-stage31/data/inc/network.functions
@@ -0,0 +1,23 @@
+wait_for_iface() {
+ local DEVICE=$1
+ local TIMEOUT=10
+ echo -n "Waiting for interface $DEVICE: "
+ # Some systems don't have operstate. Seems to be hardware dependent
+ [ ! -e "/sys/class/net/${DEVICE}/operstate" ] && usleep 10000
+ if [ -e "/sys/class/net/${DEVICE}/operstate" ]; then
+ while true; do
+ # check linkstate
+ [ "x$(cat "/sys/class/net/${DEVICE}/operstate")" == "xup" ] && break
+ TIMEOUT=$(( $TIMEOUT - 1 )) # don't wait forever, the pcnet iface of vmware will never be "up" although it's working
+ [ "$TIMEOUT" -le 0 ] && break
+ # else
+ echo -n "."
+ usleep 500000
+ done
+ else
+ # we really don't have a operstate .. then just wait a sec and hope for the best.
+ sleep 1
+ fi
+ echo ".$(cat "/sys/class/net/${DEVICE}/operstate" 2>/dev/null)"
+}
+true
diff --git a/remote/rootfs/rootfs-stage31/data/bin/setup_network b/remote/rootfs/rootfs-stage31/data/inc/setup_network
index 79ae0886..2ba02f84 100755
--- a/remote/rootfs/rootfs-stage31/data/bin/setup_network
+++ b/remote/rootfs/rootfs-stage31/data/inc/setup_network
@@ -5,6 +5,7 @@ echo "Setting up network..."
echo "Main MAC address is '$MAC'"
# setup network
+source /inc/network.functions
# set up loopback networking
echo "Setting up loopback"
@@ -35,17 +36,17 @@ for LINE in $IP_OUT; do
brctl setfd "$BRIDGE" 0.000000000001
ip link set addr "$IFMAC" "$BRIDGE" || drop_shell "Could not set mac of $BRIDGE"
ip link set dev "$IFACE" up
+ wait_for_iface "$IFACE"
brctl addif "$BRIDGE" "$IFACE" || drop_shell "Could not add $IFACE to $BRIDGE"
-
+
+ # save our variables for retry on fail
+ echo "IFACE=$IFACE" > /run/network.conf
+
# analyze ip information from the kernel command line and put parts
# of it into several variables
if [ -n "$IPINFO" ] ; then
getip () {
- local val="$IPINFO:"; i=$(($1 - 1));
- while [ $i -gt 0 ] ; do
- val=${val#*:} ; i=$(($i - 1));
- done;
- echo $val|sed "s/:.*//";
+ echo "${IPINFO}" | awk -F ':' "{print \$$1}"
}
CLIENTIP="$(getip 1)"
SERVERIP="$(getip 2)"
@@ -56,12 +57,14 @@ for LINE in $IP_OUT; do
# we might have an idea of the dns server via preboot
DNS_SERVER="$(getip 5)"
# set static ip address
- ip addr add "$CLIENTIP/$(ipcalc -s -p "$CLIENTIP" "$SUBNET_MASK" | sed "s/.*=//")" broadcast "$BROADCAST_ADDRESS" dev "$BRIDGE"
+ [ -n "$CLIENTIP" ] && ip addr add "$CLIENTIP/$(ipcalc -s -p "$CLIENTIP" "$SUBNET_MASK" | sed "s/.*=//")" broadcast "$BROADCAST_ADDRESS" dev "$BRIDGE"
ip link set dev "$BRIDGE" up
- ip route add default via "$GATEWAY" dev "$BRIDGE"
+ [ -n "$GATEWAY" ] && ip route add default via "$GATEWAY" dev "$BRIDGE"
else
NOIPYET="yes"
fi
+ # Ignore this device later on when systemd handles network interfaces (see hacked 99-systemd.rules in systemd data dir)
+ echo "SUBSYSTEM==\"net\", ACTION==\"add\", KERNEL==\"eth*\", ATTR{address}==\"$IFMAC\", TAG+=\"openslxignore\"" >> "${FUTURE_ROOT}/etc/udev/rules.d/01-ignore-boot-interface.rules"
fi
# youdev
echo "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"$IFMAC\", ATTR{dev_id}==\"0x0\", ATTR{type}==\"1\", KERNEL==\"eth*\", NAME=\"$IFACE\"" >> "${FUTURE_ROOT}/etc/udev/rules.d/70-net-boot-nic-name.rules"
@@ -69,17 +72,20 @@ for LINE in $IP_OUT; do
IFACE=""
done
-echo -n "Waiting for interface $BRIDGE: "
-# Some systems don't have operstate. Seems to be hardware dependent
-[ ! -e "/sys/class/net/${BRIDGE}/operstate" ] && sleep 2
-while true; do
- # still no operstate? assume up and hope for the best...
- [ ! -e "/sys/class/net/${BRIDGE}/operstate" ] && break
- # check linkstate
- [ "x$(cat "/sys/class/net/${BRIDGE}/operstate")" == "xup" ] && break
- # else
- echo -n "."
- usleep 500000
-done
-echo "."
+wait_for_iface "$BRIDGE"
+
+# udhcpc
+PARAM=
+if [ -n "$CLIENTIP" ]; then
+ PARAM="-r $CLIENTIP"
+fi
+echo -n "$CLIENTIP" > "/run/firstip"
+echo -n "$GATEWAY" > "/run/firstgw"
+
+# save our variables for retry on fail ff.
+echo "CLIENTIP=$CLIENTIP" >> /run/network.conf
+echo "GATEWAY=$GATEWAY" >> /run/network.conf
+echo "BRIDGE=$BRIDGE" >> /run/network.conf
+udhcpc $PARAM -O domain -O nissrv -O nisdomain -O wpad -O search -t 5 -T 2 -s "/inc/udhcpc-trigger" -f -n -q -i "$BRIDGE"
+# udhcpc return value will be return value of this script
diff --git a/remote/rootfs/rootfs-stage31/data/inc/setup_network_retry b/remote/rootfs/rootfs-stage31/data/inc/setup_network_retry
new file mode 100755
index 00000000..9239d0d7
--- /dev/null
+++ b/remote/rootfs/rootfs-stage31/data/inc/setup_network_retry
@@ -0,0 +1,33 @@
+#!/bin/ash
+
+source /inc/network.functions
+source /run/network.conf
+
+for i in 1 2 3 4 5 6 7 8; do
+ echo "<$i> Try to fix broken network"
+ echo -n "Take interface $IFACE down .. "
+
+ ip link set dev $IFACE down
+ usleep 1000
+
+ echo "and up again.."
+ ip link set dev $IFACE up
+ usleep 1000
+
+ wait_for_iface "$IFACE"
+
+ udhcpc $PARAM -O domain -O nissrv -O nisdomain -O wpad -O search -t 5 -T 2 -s "/inc/udhcpc-trigger" -f -n -q -i "$BRIDGE"
+
+ if [ $? -eq 0 ]; then
+ echo "Finally fixed IP config. Continue boot."
+ RET=0
+ break
+ else
+ RET=1
+ fi
+done
+
+[ $RET -gt 0 ] && echo "Something is really broken.. Please check your network cable and reset your computer."
+
+# create correct return value
+[ $RET -eq 0 ]
diff --git a/remote/rootfs/rootfs-stage31/data/bin/setup_stage32 b/remote/rootfs/rootfs-stage31/data/inc/setup_stage32
index 4e19fb3a..9bf30d25 100755
--- a/remote/rootfs/rootfs-stage31/data/bin/setup_stage32
+++ b/remote/rootfs/rootfs-stage31/data/inc/setup_stage32
@@ -3,7 +3,7 @@
# This script sets up the stage 3.2.
# - downloads/mounts stage32.sqfs
# - merge it with current rootfs through aufs
-# - will not download, if the "nfs=" is used in the
+# - will not download, if the "nfs=" is used in the
# kernel command line
#
#########################################################################
@@ -43,6 +43,27 @@ mkdir -p /mnt/opt/openslx/uniontmp /mnt/tmp
busybox mount -n --move "$FUTURE_ROOT" /mnt/opt/openslx/uniontmp || drop_shell "Problem moving uniontmp."
FUTURE_ROOT="/mnt"
+# Move network stuff
+cp /etc/hostname /etc/hosts /etc/resolv.conf "${FUTURE_ROOT}/etc/"
+[ -s "/run/config" ] && cat "/run/config" >> "${FUTURE_ROOT}/opt/openslx/config"
+
+# if booting with splash, suppress kernel output in stage32
+if [ $SPLASH -eq 1 ]; then
+ if grep -q -E "^ *kernel.printk" "${FUTURE_ROOT}/usr/lib/sysctl.d/50-default.conf"; then
+ sed -i 's/^ *kernel\.printk.*/kernel\.printk = 1 1 0 1/g' "${FUTURE_ROOT}/usr/lib/sysctl.d/50-default.conf"
+ else
+ echo "kernel.printk = 1 1 0 1" >> "${FUTURE_ROOT}/usr/lib/sysctl.d/50-default.conf"
+ fi
+fi
+
+# Kinda specific for virtualization environment: Autologin and run VM for benchmarks
+if [ -n "$SLX_BENCHMARK_VM" ]; then
+ # Enable KDM autologin for demo user
+ sed -i 's/^AutoLoginUser=.*//;s/^AutoLoginEnable=.*/AutoLoginEnable=true\nAutoLoginUser=demo/' "${FUTURE_ROOT}/etc/kde4/kdm/kdmrc"
+ # Running the VM automatically has to be taken care of by run-virt and vmchooser. SLX_BENCHMARK_VM should contain
+ # a numeric value for the index in vmchooser
+fi
+
# "Delete" addon hook-script in aufs view
touch "/mnt/opt/openslx/uniontmp/.wh.addon-init"
diff --git a/remote/rootfs/rootfs-stage31/data/inc/udhcpc-trigger b/remote/rootfs/rootfs-stage31/data/inc/udhcpc-trigger
new file mode 100755
index 00000000..d4249e29
--- /dev/null
+++ b/remote/rootfs/rootfs-stage31/data/inc/udhcpc-trigger
@@ -0,0 +1,92 @@
+#!/bin/ash
+
+exec >> /run/stdout
+exec 2>> /run/stderr
+set -x
+
+if [ "x$1" != "xbound" -a "x$1" != "xrenew" ] || [ "x$interface" != "xbr0" ] || [ -z "$ip" ]; then
+ exit 0
+fi
+
+# If we already got an IP from KCL, see if it differs, and remove first if so
+# We just try to prevent everything from breaking if the DHCP server doesn't
+# objey the renew request by the client and hands out a new address
+if [ -s "/run/firstip" ]; then
+ #...some address is already configured...
+ OLD=$(cat "/run/firstip")
+ if [ "x${OLD}" != "x${ip}" ]; then
+ #...it's a different one, reconfigure...
+ echo "..reconfiguring ${OLD} to ${ip}.."
+ # remove default route and let it be added again below, as it might get lost when changing the primary address on the interface
+ ip route del default 2>/dev/null
+ rm -f -- "/run/firstgw"
+ ip addr del "${OLD}" dev "${interface}" 2>/dev/null
+ ip addr add "${ip}/$(ipcalc -s -p "${ip}" "${subnet}" | sed s/.*=//)" dev "${interface}"
+ fi
+else
+ #...no address configured yet, just add...
+ echo "..adding ${ip}.."
+ ip addr add "${ip}/$(ipcalc -s -p "${ip}" "${subnet}" | sed s/.*=//)" dev "${interface}"
+fi
+echo -n "$ip" > "/run/firstip"
+
+# Same procedure for default gateway
+if [ -n "${router}" ]; then
+ if [ -s "/run/firstgw" ]; then
+ OLD=$(cat "/run/firstgw")
+ if [ "x${OLD}" != "x${router}" ]; then
+ echo "..reconfiguring default gw from ${OLD} to ${router}.."
+ ip route del default 2>/dev/null
+ ip route add default via "$router"
+ fi
+ else
+ ip route add default via "$router"
+ fi
+ echo -n "$router" > "/run/firstgw"
+fi
+
+rm -f -- "/etc/resolv.conf"
+
+# DNS/domain?
+if [ -n "$dns" ]; then
+ echo "..got DNS.."
+ echo "# From DHCP in stage 3.1" >> "/run/config"
+ echo "SLX_DNS='$dns'" >> "/run/config"
+fi
+for serv in $dns; do
+ echo "nameserver $serv" >> "/etc/resolv.conf"
+done
+if [ -z "$domain" ]; then
+ # try to get domain via reverse lookup if empty
+ echo "..trying to get domain via DNS, as DHCP didn't supply one.."
+ fqdn=$(nslookup "$ip" | grep -E "^Address +[0-9]+: +$ip " | head -n 1 | awk '{print $4}')
+ domain="${fqdn#*.}"
+fi
+if [ -n "$domain" ]; then
+ echo "domain $domain" >> "/etc/resolv.conf"
+fi
+if [ -n "$search" ]; then
+ echo "search $search" >> "/etc/resolv.conf"
+elif [ -n "$domain" ]; then
+ echo "search $domain" >> "/etc/resolv.conf"
+fi
+
+
+# Hostname
+if [ -z "$hostname" ]; then
+ # as with domain, if there's no hostname, try to get via DNS
+ echo "..trying to get hostname via DNS, as DHCP didn't supply one.."
+ [ -z "$fqdn" ] && fqdn=$(nslookup "$ip" | grep -E "^Address +[0-9]+: +$ip " | head -n 1 | awk '{print $4}')
+ hostname="${fqdn%%.*}"
+elif [ -n "$domain" ]; then
+ fqdn="${hostname}.${domain%% *}" # in case domain is a list
+fi
+if [ -n "$hostname" ]; then
+ [ -z "$fqdn" ] && fqdn="$hostname"
+ echo "..setting hostname $hostname (fqdn: $fqdn).."
+ echo "$fqdn" > "/proc/sys/kernel/hostname"
+ echo "$fqdn" > "/etc/hostname"
+ echo "$ip $fqdn $hostname" >> "/etc/hosts"
+ echo "SLX_HOSTNAME='$hostname'" >> "/run/config"
+fi
+
diff --git a/remote/rootfs/rootfs-stage31/data/init b/remote/rootfs/rootfs-stage31/data/init
index ae65d9da..368b3a64 100755
--- a/remote/rootfs/rootfs-stage31/data/init
+++ b/remote/rootfs/rootfs-stage31/data/init
@@ -16,12 +16,13 @@
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
# import common functions
-. /etc/functions.inc
+. "/inc/functions"
# mount the important standard directories
-busybox mount -n -t tmpfs -o 'mode=755' run "/run"
[ ! -f /proc/cpuinfo ] && busybox mount -n -t proc proc /proc
+bench_event "KERNEL" "Kernel initialized"
[ ! -d /sys/class ] && busybox mount -n -t sysfs sysfs /sys
+busybox mount -n -t tmpfs -o 'mode=755' run "/run"
# preparations for mounting stage3.2
FUTURE_ROOT="/dev/shm/uniontmp"
@@ -32,67 +33,71 @@ mkdir -p "$FUTURE_ROOT/opt/openslx"
# let kernel know that mdev is to be used for hotplug
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
-# read graphic and network adaptor configuration (without proprietary drivers yet)
-# TODO: must ugly hack ever... needs to be improved when we add prop drivers
-for DRM in /lib/modules/*/kernel/drivers/gpu/drm/*.ko /lib/modules/*/kernel/drivers/gpu/drm/*/*.ko; do
- DRM="$(basename "$DRM")"
- DRM="${DRM%.ko}"
- echo "Trying to load module $DRM"
- modprobe "$DRM"
-done
-
-# discover devices
-mdev -s
-
# read kernel command line for debugging switch
DEBUG=0
-read KCL < /proc/cmdline
-export KCL
+SPLASH=0
+read KCL < "/proc/cmdline"
for opts in ${KCL}; do
case "${opts}" in
debug=*)
DEBUG=${opts#debug=} ;;
ip=*)
# process IP info
- export IPINFO=${opts#ip=} ;;
+ IPINFO=${opts#ip=} ;;
nfs=*)
- export NFS=${opts#nfs=}
- export NFSPATH=${nfs#*:}
- export NFSSERVER=${nfs%:/*}
+ NFS=${opts#nfs=}
+ NFSPATH=${NFS#*:}
+ NFSSERVER=${NFS%:/*}
;;
BOOTIF=*)
- export MAC="$( echo "$opts" | cut -b 11- | tr '-' ':' | tr '[A-Z]' '[a-z]' )" ;; # make mac lowercase for udev (see setup_network)
+ MAC="$( echo "$opts" | cut -b 11- | tr '-' ':' | tr '[A-Z]' '[a-z]' )" ;; # make mac lowercase for udev (see setup_network)
+ splash*)
+ [ -e "/etc/splash.ppm" ] && SPLASH=1
esac
done
-# suppress kernel output if DEBUG is not set
-[ $DEBUG -ge 1 ] && echo "0" > /proc/sys/kernel/printk || echo "4 4 1 7" >/proc/sys/kernel/printk
+. "/inc/drm.functions"
+
+if [ "$SPLASH" -eq 1 ]; then
+ if setup_gfx; then
+ echo "1 1 0 1" > /proc/sys/kernel/printk
+ exec 4>&1 5>&2 > /dev/null 2>&1
+ MUTED_OUTPUT=1
+ setsid fbsplash -x -c -s /etc/splash.ppm
+ fi
+else
+ setup_gfx
+fi
+
-[ $DEBUG -ge 5 ] && drop_shell "Requested Debug Shell: before network."
+# discover devices
+mdev -s
+bench_event "MDEV" "mdev done"
-. "/bin/setup_network" || drop_shell "Error setting up network"
+# suppress kernel output if neither DEBUG nor SPLASH is set
+if [ $SPLASH -eq 0 ]; then
+ [ $DEBUG -ge 1 ] && echo "4 4 1 7" > /proc/sys/kernel/printk || echo "1 1 0 1" >/proc/sys/kernel/printk
+fi
-[ $DEBUG -ge 4 ] && drop_shell "Requested Debug Shell: after network/before configuring."
+[ $DEBUG -ge 4 ] && drop_shell "Requested Debug Shell: before network."
-. "/bin/activate_sysconfig" || drop_shell "Could not source /bin/activate_sysconfig"
+. "/inc/setup_network" || . "/inc/setup_network_retry" || drop_shell "Error setting up network"
+bench_event "NETWORK" "Network up and running"
[ $DEBUG -ge 3 ] && drop_shell "Requested Debug Shell: after network/before configuring."
-# start plymouth if activated
-#if [ $DEBUG -lt 1 ]; then
-# echo "Starting plymouth..."
-# # link the theming directory from the config to the current root
-# ln -sf "${FUTURE_ROOT}/usr/share" /usr/share
-# plymouthd --kernel-command-line="splash" --tty=/dev/tty7 && plymouth show-splash
-#fi
+. "/inc/activate_sysconfig" || drop_shell "Could not source /bin/activate_sysconfig"
+bench_event "CONFIG" "Downloaded config"
+# From here on, we have all the vars from /opt/openslx/config
[ $DEBUG -ge 2 ] && drop_shell "Requested Debug Shell: after configuration/before stage32."
-. "/bin/setup_stage32" || drop_shell "Problem setting up stage3.2"
+. "/inc/setup_stage32" || drop_shell "Problem setting up stage3.2"
+bench_event "STAGE32" "Downloaded stage 3.2"
# copy files needed for stage3.2 to FUTURE_ROOT
-[ $DEBUG -ge 1 ] && echo "Copying busybox etc. to stage32..."
-tar -cp "/bin" "/sbin" "/usr/bin" "/usr/sbin" "/etc/functions.inc" | tar -xp -C "${FUTURE_ROOT}/opt/openslx/"
+echo "Copying busybox etc. to stage32..."
+tar -cp "/bin" "/sbin" "/usr/bin" "/usr/sbin" "/inc/functions" | tar -xp -C "${FUTURE_ROOT}/opt/openslx/"
# set the SLX_ROOT_PASS if given in config
if [ ! -z "$SLX_ROOT_PASS" ]; then
@@ -102,17 +107,18 @@ fi
# one last debug shell if activated
[ $DEBUG -ge 1 ] && drop_shell "Requested Debug Shell: before switch_root."
-# tell plymouth about the immediate rootfs switch
-#[ $DEBUG -lt 1 ] && plymouth update-root-fs --new-root-dir=/mnt
+# need /proc for this ;)
+bench_event "PRESWITCH" "Switching to stage 3.2"
# unmount filesystems
for mnt in proc sys run ; do
- busybox umount -n "$mnt"
+ busybox umount -f -l "/$mnt" 2>/dev/null
done
echo "Switching root...."
+echo "$bench_result" > "${FUTURE_ROOT}/opt/openslx/.benchmark"
# Prepare environment (HOME is needed as a hack for nss_ldap with ssl and no caching)
-unset BOOT_IMAGE initrd KCL ip slxbase slxsrv IPINFO vga ip MAC BOOTIF
+unset BOOT_IMAGE initrd KCL ip slxbase slxsrv IPINFO vga ip MAC BOOTIF DEBUG OLDPWD MUTED_OUTPUT
export HOME=/
export init="/usr/lib/systemd/systemd"
export recovery=
diff --git a/remote/rootfs/rootfs-stage31/rootfs-stage31.build b/remote/rootfs/rootfs-stage31/rootfs-stage31.build
index b2b66459..3711e16d 100644
--- a/remote/rootfs/rootfs-stage31/rootfs-stage31.build
+++ b/remote/rootfs/rootfs-stage31/rootfs-stage31.build
@@ -4,6 +4,7 @@ fetch_source() {
}
build() {
+ local COPYLIST BIN_LOCATION DRM_MODULES FILE BIN MODNAME PCI_FILE ALIAS VENDOR DEVICE
COPYLIST="list_binaries_and_files"
[ -e "$COPYLIST" ] && rm -f "$COPYLIST"
for BIN in $REQUIRED_BINARIES; do
@@ -11,46 +12,63 @@ build() {
[ -z "$BIN_LOCATION" ] && perror "Cannot find $BIN"
get_link_chain "$BIN_LOCATION" >> "$COPYLIST"
done
- for FILE in $REQUIRED_FILES; do
- get_link_chain "$FILE" >> "$COPYLIST"
- done
+
+ mkdir -p "$MODULE_BUILD_DIR/lib"
+ find /lib /lib64 /usr/lib /usr/lib64 \( -name "libnss_dns*" -o -name "libresolv*" \) -exec cp -a {} "$MODULE_BUILD_DIR/lib/" \;
tarcopy "$(cat "$COPYLIST" | sort -u)" "$MODULE_BUILD_DIR"
+
+ # generate drm module loading database
+ pinfo "Generating PCI ID database for DRM drivers"
+ DRM_MODULES="$MODULES_DIR/kernel/build/lib/modules/$SYS_UTS_RELEASE/kernel/drivers/gpu/drm"
+ PCI_FILE="$MODULE_BUILD_DIR/drm.cfg"
+ [ -d "$DRM_MODULES" ] || perror "DRM dir not found at $DRM_MODULES"
+ cp "$MODULE_DIR/templates/drm.cfg" "$PCI_FILE" || perror "Could not copy drm.cfg from templates dir"
+ echo "# -- generated from kernel $SYS_UTS_RELEASE modules:" >> "$PCI_FILE"
+ for FILE in $(find "$DRM_MODULES" -name "*.ko"); do
+ MODNAME=$(basename "$FILE")
+ MODNAME=${MODNAME%.ko}
+ [ -z "$MODNAME" ] && perror "$FILE equals empty modname"
+ echo "# $MODNAME" >> "$PCI_FILE"
+ for ALIAS in $(modinfo "$FILE" | grep '^alias:' | grep -o 'pci:v.*' | tr '[A-F]' '[a-f]'); do
+ VENDOR=$(echo $ALIAS | cut -c 10-13)
+ if [ "x$(echo $ALIAS | cut -c 15)" == "x*" ]; then
+ # device wildcard
+ grep -q -i "^${VENDOR}\s" "$PCI_FILE" && continue
+ echo "${VENDOR} $MODNAME" >> "$PCI_FILE"
+ else
+ # specific device
+ DEVICE=$(echo $ALIAS | cut -c 19-22)
+ grep -q -i "^${VENDOR}:${DEVICE}\s" "$PCI_FILE" && continue
+ echo "${VENDOR}:${DEVICE} $MODNAME" >> "$PCI_FILE"
+ fi
+ done
+ done
}
post_copy() {
pinfo "Generating rootfs for Stage 3.1 ..."
- generate_rootfs
+ generate_rootfs
# copy kernel, modules and firmware
- copy_kernel_modules
- copy_firmware
+ copy_kernel_modules
+ copy_firmware
copy_kernel
-
- # when vmwgfx is loaded via modprobe in stage31, this conf file is read,
- # enables fbdev support for vmware so that
- # fb doesnt break when switching tty's in minilinux running inside vmware
- # TODO: Why isn't this a simple static file in this module's data dir?
- mkdir -p "$TARGET_BUILD_DIR/etc/modprobe.d"
- echo "options vmwgfx enable_fbdev=1" > "${TARGET_BUILD_DIR}"/etc/modprobe.d/vmwgfx-fbdev.conf
}
#
# helper functions to generate the base rootfs
#
generate_rootfs() {
- # create basic directory structure
- mkdir -p "${TARGET_BUILD_DIR}"/{bin,dev,proc,run,etc,mnt,sys} \
- || perror "Cannot create basic directory structure in '${TARGET_BUILD_DIR}'"
-
- # copy device files from running system
- cp -a /dev/{console,kmsg,mem,null,tty,tty0,tty1,tty9,urandom,zero} \
- "${TARGET_BUILD_DIR}"/dev || perror "Cannot copy devices from running system"
-
- # copy libc and ld-linux
- tarcopy "$(list_basic_libs)" "${TARGET_BUILD_DIR}"
-
- # copy required files
- tarcopy "${REQUIRED_FILES}" "${TARGET_BUILD_DIR}"
+ # create basic directory structure
+ mkdir -p "${TARGET_BUILD_DIR}"/{bin,dev,proc,run,etc,mnt,sys} \
+ || perror "Cannot create basic directory structure in '${TARGET_BUILD_DIR}'"
+
+ # copy device files from running system
+ cp -a /dev/{console,kmsg,mem,null,tty,tty0,tty1,tty9,urandom,zero} \
+ "${TARGET_BUILD_DIR}"/dev || perror "Cannot copy devices from running system"
+
+ # copy libc and ld-linux
+ tarcopy "$(list_basic_libs)" "${TARGET_BUILD_DIR}"
}
diff --git a/remote/rootfs/rootfs-stage31/rootfs-stage31.conf b/remote/rootfs/rootfs-stage31/rootfs-stage31.conf
index cd68e75f..4b638678 100644
--- a/remote/rootfs/rootfs-stage31/rootfs-stage31.conf
+++ b/remote/rootfs/rootfs-stage31/rootfs-stage31.conf
@@ -1,12 +1,15 @@
-REQUIRED_MODULES=" busybox
- kernel"
-REQUIRED_KERNEL_MODULES=" kernel/drivers/video/sis/sisfb.ko
+REQUIRED_MODULES="
+ busybox
+ kernel
+"
+REQUIRED_KERNEL_MODULES="
+ kernel/drivers/video/sis/sisfb.ko
kernel/drivers/video/via/viafb.ko
- kernel/drivers/acpi/video.ko
- kernel/drivers/ssb/ssb.ko
+ kernel/drivers/acpi/video.ko
+ kernel/drivers/ssb/ssb.ko
kernel/drivers/acpi/button.ko
- kernel/drivers/gpu/drm/drm*.ko
- kernel/drivers/gpu/drm/*/*.ko
+ kernel/drivers/gpu/drm/drm*.ko
+ kernel/drivers/gpu/drm/*/*.ko
kernel/drivers/hid/hid-generic.ko
kernel/drivers/i2c/algos/i2c-algo-bit.ko
kernel/drivers/i2c/i2c-core.ko
@@ -45,21 +48,32 @@ REQUIRED_KERNEL_MODULES=" kernel/drivers/video/sis/sisfb.ko
kernel/net/802/stp.ko
kernel/net/bridge/bridge.ko
kernel/ubuntu/aufs/aufs.ko
- kernel/fs/aufs/aufs.ko"
-REQUIRED_FIRMWARE=" 3com/
- e100/
- matrox/
- r128/
- radeon/
- RTL8192E/
- RTL8192SE/
- rtl_nic/
- tigon/"
+ kernel/fs/aufs/aufs.ko
+"
+REQUIRED_FIRMWARE="
+ 3com/
+ e100/
+ matrox/
+ r128/
+ radeon/
+ RTL8192E/
+ RTL8192SE/
+ rtl_nic/
+ tigon/
+"
REQUIRED_BINARIES="
grep
"
-REQUIRED_FILES="
+REQUIRED_LIBRARIES="
+ libnss_dns
+ libresolv
+"
+REQUIRED_SYSTEM_FILES="
/etc/protocols
/etc/services
/etc/localtime
"
+REQUIRED_FILES="
+ /drm.cfg
+"
+
diff --git a/remote/rootfs/rootfs-stage31/templates/drm.cfg b/remote/rootfs/rootfs-stage31/templates/drm.cfg
new file mode 100644
index 00000000..f0a9db0c
--- /dev/null
+++ b/remote/rootfs/rootfs-stage31/templates/drm.cfg
@@ -0,0 +1,6 @@
+# nvidia
+10de:0193 @nvidia
+# aliases
+@nvidia nvidia/nvidia.ko nvidia/nvidia-uvm.ko
+@nvidia_fallback nouveau
+
diff --git a/remote/rootfs/rootfs-stage32/data/etc/modprobe.d/50-mltk-blacklist.conf b/remote/rootfs/rootfs-stage32/data/etc/modprobe.d/50-mltk-blacklist.conf
index 7a01777c..00be09ca 100644
--- a/remote/rootfs/rootfs-stage32/data/etc/modprobe.d/50-mltk-blacklist.conf
+++ b/remote/rootfs/rootfs-stage32/data/etc/modprobe.d/50-mltk-blacklist.conf
@@ -2,4 +2,10 @@
# Intel corporation 82Q35 Express MEI controller spams syslog under
# some 3.0 kernels
-# blacklist mei
+blacklist mei
+
+# pcspeaker device driver
+blacklist pcspkr
+
+# Strange device driver for alsa via pcspeaker
+blacklist snd-pcsp
diff --git a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service
new file mode 100644
index 00000000..2c5d7769
--- /dev/null
+++ b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service
@@ -0,0 +1,13 @@
+# This will trigger network.target etc. at an early point,
+# if network setup happened in stage31 (dhcp...)
+[Unit]
+Description=Trigger network targets early
+DefaultDependencies=no
+Wants=systemd-tmpfiles-setup.service
+Before=sysinit.target
+After=systemd-tmpfiles-setup.service
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-early_network_triggers
+RemainAfterExit=yes
diff --git a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/mount-stage4.service b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/mount-stage4.service
index 15725f8f..7f8b54a8 100644
--- a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/mount-stage4.service
+++ b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/mount-stage4.service
@@ -1,8 +1,9 @@
[Unit]
Description=Mount Openslx Stage 4
DefaultDependencies=no
-Wants=setup-dnbd3.service
+Wants=setup-dnbd3.service stage4.target
After=setup-dnbd3.service
+Before=stage4.target
[Service]
Type=oneshot
diff --git a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target
index c0b7793b..bc12cd1b 100644
--- a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target
+++ b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target
@@ -1,4 +1,4 @@
[Unit]
-
Description=DNS Server available
+ConditionPathExists=/run/network/dns-ready
diff --git a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target
index cfeb719c..770eb697 100644
--- a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target
+++ b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target
@@ -1,3 +1,4 @@
[Unit]
-
Description=Default route configured
+ConditionPathExists=/run/network/gateway-ready
+
diff --git a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/ntpdate.service b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/ntpdate.service
index a48375d0..ebaa9afb 100644
--- a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/ntpdate.service
+++ b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/ntpdate.service
@@ -2,7 +2,6 @@
Description=Update date from local time server
After=network.target
Requires=network.target
-ConditionPathExists=/run/udhcpc/network-ready
[Service]
Type=oneshot
diff --git a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/setup-partitions.service b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/setup-partitions.service
index df075922..ee965219 100644
--- a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/setup-partitions.service
+++ b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/setup-partitions.service
@@ -1,9 +1,8 @@
[Unit]
Description=Setup local disk partitions (tmp, swap)
DefaultDependencies=no
-Before=sysinit.target
-After=systemd-udev-trigger.service
-Wants=sysinit.target
+Before=basic.target
+After=systemd-udev-settle.service
[Service]
Type=oneshot
diff --git a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/stage4.target b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/stage4.target
index 465a324c..2b829854 100644
--- a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/stage4.target
+++ b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/stage4.target
@@ -1,3 +1,5 @@
[Unit]
-
+Wants=mount-stage4.service
+After=mount-stage4.service
Description=OpenSLX Stage 4
+RefuseManualStart=yes
diff --git a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service
new file mode 120000
index 00000000..8aec0a6d
--- /dev/null
+++ b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service
@@ -0,0 +1 @@
+../early-network-triggers.service \ No newline at end of file
diff --git a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/zram-swap.service b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/zram-swap.service
new file mode 120000
index 00000000..c1754b11
--- /dev/null
+++ b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/zram-swap.service
@@ -0,0 +1 @@
+../zram-swap.service \ No newline at end of file
diff --git a/remote/rootfs/rootfs-stage32/data/etc/systemd/system/zram-swap.service b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/zram-swap.service
new file mode 100644
index 00000000..a458b380
--- /dev/null
+++ b/remote/rootfs/rootfs-stage32/data/etc/systemd/system/zram-swap.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Setup zram swap partitions
+DefaultDependencies=no
+Wants=swap.target
+Before=swap.target
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-zram_swap
+RemainAfterExit=yes
diff --git a/remote/rootfs/rootfs-stage32/data/etc/tmpfiles.d/network.conf b/remote/rootfs/rootfs-stage32/data/etc/tmpfiles.d/network.conf
new file mode 100644
index 00000000..346ecf7e
--- /dev/null
+++ b/remote/rootfs/rootfs-stage32/data/etc/tmpfiles.d/network.conf
@@ -0,0 +1 @@
+d /run/network 0755 root root
diff --git a/remote/rootfs/rootfs-stage32/data/etc/tmpfiles.d/run-lock.conf b/remote/rootfs/rootfs-stage32/data/etc/tmpfiles.d/run-lock.conf
index ef610bdc..a20cf5ce 100644
--- a/remote/rootfs/rootfs-stage32/data/etc/tmpfiles.d/run-lock.conf
+++ b/remote/rootfs/rootfs-stage32/data/etc/tmpfiles.d/run-lock.conf
@@ -1,2 +1,2 @@
-D /run/lock 1777 root root
+d /run/lock 1777 root root
diff --git a/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers b/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers
new file mode 100755
index 00000000..990fdb44
--- /dev/null
+++ b/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers
@@ -0,0 +1,29 @@
+#!/bin/ash
+
+# This script will trigger several network targets if
+# applicable at an early point.
+# This happens if dhcp/network setup was successful in stage31
+
+# Main interface
+BRIDGE="br0"
+
+if [ ! -e "/sys/class/net/${BRIDGE}/operstate" -o "x$(cat "/sys/class/net/${BRIDGE}/operstate")" == "xup" ] && [ -e "/opt/openslx/uniontmp/etc/hostname" -o -e "/opt/openslx/uniontmp/etc/resolv.conf" ]; then
+ echo "Triggering network.target"
+ touch "/run/network/network-ready"
+ systemctl start network.target &
+fi
+
+if [ -s "/etc/resolv.conf" ] && grep -q "^nameserver" "/etc/resolv.conf"; then
+ echo "Triggering network-dns.target"
+ touch "/run/network/dns-ready"
+ systemctl start network-dns.target &
+fi
+
+if route -n | grep -q -E '^0\.0\.0\.0.*U.*G'; then
+ echo "Triggering network-gateway.target"
+ touch "/run/network/gateway-ready"
+ systemctl start network-gateway.target &
+fi
+
+exit 0
+
diff --git a/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-mount_stage4 b/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-mount_stage4
index d0a3bc29..1b7935c7 100755
--- a/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-mount_stage4
+++ b/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-mount_stage4
@@ -60,8 +60,5 @@ fi
# dbus reload needed eg. for gnome etc. and perhaps other service files which stage4 needs:
systemctl reload dbus.service
-# tell systemd that stage4 was reached.
-systemctl start stage4.target &
-
exit 0
diff --git a/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_partitions b/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_partitions
index 362e8f14..ca7317d4 100755
--- a/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_partitions
+++ b/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_partitions
@@ -37,7 +37,7 @@ diskfm () {
found=yes
case "mkfs.$fs" in
mkfs.xfs)
- fopt="-f"
+ fopt="-f -b size=4k -s size=4k -l size=512b" # fastest formatting possible :)
mopt="-o noexec"
;;
mkfs.ext2)
@@ -109,7 +109,7 @@ cat "/etc/disk.partition"
HAVE_SWAP=no
for hdpartnr in $(sed -n -e "/ 82 /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
echo -e "$hdpartnr\tswap\t\tswap\t\tdefaults\t 0 0" >> "/etc/fstab"
- swapon "$hdpartnr" -p 10 && HAVE_SWAP=yes
+ swapon "$hdpartnr" -p 10 && HAVE_SWAP=yes # low priority, in case we have zram swap, prefer that)
done
# We use special non assigned partition type (id44) for harddisk scratch
@@ -167,27 +167,5 @@ if [ "$HAVE_SWAP" = "no" ]; then
slxlog "partition-swap" "Have no (formatted) swap partition, using zram swap only!" "/etc/disk.partition"
fi
-# Add zram swap
-[ "$(uname -r)" == "3.8.13.8-openslx" ] && exit 0
-CPUS=$(grep -c -E "^processor.*[0-9]+$" /proc/cpuinfo)
-if [ -z "$CPUS" ]; then
- echo "ERROR: Could not determine CPU core count"
-else
- [ "$CPUS" -gt "16" ] && CPUS=16 # zram can only handle up to 32 devices, the system can apparently even just handle 29 swap partitions, so use a reasonable upper limit
- if ! modprobe zram "num_devices=$CPUS"; then
- echo "ERROR: Could not load zram module"
- else
- TOTAL=$(grep ^MemTotal /proc/meminfo | awk '{print $2}')
- USE=$(( $TOTAL / ( 2 * $CPUS ) ))
- echo "Have $CPUS cores, $TOTAL kb mem, use $USE kb zram swap per core"
- USE=$(( $USE * 1024 ))
- DEV=0
- while [ "$DEV" -lt "$CPUS" ]; do
- echo "$USE" > "/sys/block/zram${DEV}/disksize"
- mkswap "/dev/zram${DEV}"
- swapon "/dev/zram${DEV}" -p 1000
- DEV=$(( $DEV + 1 ))
- done
- fi
-fi
+exit 0
diff --git a/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_slx_addons b/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_slx_addons
index f1253602..5bed4c7f 100755
--- a/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_slx_addons
+++ b/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_slx_addons
@@ -20,7 +20,7 @@
[ -z "${SLX_ADDONS}" ] && { echo "No addons configured. Nothing to do :-)."; exit 0; }
# source functions.inc for the download function
-. /opt/openslx/etc/functions.inc || { echo "functions.inc not found!"; exit 1337; }
+. /opt/openslx/inc/functions || { echo "/opt/openslx/inc/functions not found!"; exit 1337; }
# quick fix for the missing FUTURE_ROOT needed by /opt/openslx/etc/functions.inc
export FUTURE_ROOT="/"
@@ -75,7 +75,7 @@ if [ $# -eq 1 ]; then
# now append it to /
echo "Appending ${ADDON_MOUNT_POINT} to /"
- if ! mount -o "remount,append:${ADDON_MOUNT_POINT}=ro" / ; then
+ if ! mount -o "remount,ins:2:${ADDON_MOUNT_POINT}=ro" / ; then # ins:2 makes sure the addon is after tmpfs and stage32, but before stage4
slxlog --echo "Failed to append ${ADDON_MOUNT_POINT} to the aufs. Cleaning up..."
umount -l ${ADDON_MOUNT_POINT} || echo "Could not unmount ${ADDON_MOUNT_POINT}!"
exit 1
diff --git a/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-zram_swap b/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-zram_swap
new file mode 100755
index 00000000..f8bd5682
--- /dev/null
+++ b/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-zram_swap
@@ -0,0 +1,60 @@
+#!/bin/ash
+# Copyright (c) 2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Local hard disk autodetection script for OpenSLX linux stateless clients,
+# detecting swap and special partitions
+
+#############################################################################
+
+
+# Add zram swap
+# Some older ubuntu kernels had a problem here, see https://bugs.launchpad.net/ubuntu/+source/linux-lts-raring/+bug/1217189
+# So make sure you're up to date
+
+make_swap () {
+ [ $# -ne 2 ] && echo "make_swap: Wrong parameter count $#" && exit 1
+ local USE="$1"
+ local DEV="$2"
+ echo "$USE" > "/sys/block/zram${DEV}/disksize"
+ mkswap "/dev/zram${DEV}"
+ swapon "/dev/zram${DEV}" -p 1000 # high priority (in case we have hdd swap 0x82, prefer zram)
+}
+
+CPUS=$(grep -c -E "^processor.*[0-9]+$" "/proc/cpuinfo")
+if [ -z "$CPUS" ]; then
+ echo "ERROR: Could not determine CPU core count"
+ exit 1
+fi
+
+[ "$CPUS" -gt "16" ] && CPUS=16 # zram can only handle up to 32 devices, the system can apparently even just handle 29 swap partitions, so use a reasonable upper limit
+if ! modprobe zram "num_devices=$CPUS"; then
+ echo "ERROR: Could not load zram module"
+ exit 1
+fi
+
+TOTAL=$(grep ^MemTotal /proc/meminfo | awk '{print $2}')
+USE=$(( $TOTAL / ( 2 * $CPUS ) ))
+echo "Have $CPUS cores, $TOTAL kb mem, use $USE kb zram swap per core"
+USE=$(( $USE * 1024 ))
+DEV=0
+while [ "$DEV" -lt "$CPUS" ]; do
+ make_swap "$USE" "$DEV" &
+ LAST=$!
+ DEV=$(( $DEV + 1 ))
+done
+
+# Wait, so we don't trigger swap.target too early
+while kill -0 "$LAST"; do
+ usleep 100000
+done
+
+exit 0
+
diff --git a/remote/rootfs/rootfs-stage32/rootfs-stage32.build b/remote/rootfs/rootfs-stage32/rootfs-stage32.build
index a751b8f4..bd6d3106 100644
--- a/remote/rootfs/rootfs-stage32/rootfs-stage32.build
+++ b/remote/rootfs/rootfs-stage32/rootfs-stage32.build
@@ -123,7 +123,8 @@ post_copy() {
if [ ! -s "$TARGET_BUILD_DIR/etc/distro.png" ]; then
local DIST=$(lsb_release -si)
if [ -n "$DIST" ]; then
- wget -O "$TARGET_BUILD_DIR/etc/distro.png" "http://132.230.8.113/distro_logo.php?distro=$DIST"
+ [ -z "$CFG_DISTLOGO_URL" ] && CFG_DISTLOGO_URL='http://mltk-services.ruf.uni-freiburg.de/distro_logo.php?distro='
+ wget -O "$TARGET_BUILD_DIR/etc/distro.png" "${CFG_DISTLOGO_URL}${DIST}"
if [ ! -s "$TARGET_BUILD_DIR/etc/distro.png" ]; then
rm -f "$TARGET_BUILD_DIR/etc/distro.png"
pwarning "Could not download distro-logo"