diff options
| author | Dirk | 2014-02-21 11:16:02 +0100 |
|---|---|---|
| committer | Dirk | 2014-02-21 11:16:02 +0100 |
| commit | 1e30627c5b00884054fae7210d036e34ebe4f181 (patch) | |
| tree | 6d258c5a7a2279881706f38e37921dc4557a0b8d /remote/rootfs | |
| parent | Setzen des Windows-Namens beim Booten aus Laufwerk B: (diff) | |
| parent | [nvidia_libs] Debug: Checkin für Joey:). (diff) | |
| download | tm-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')
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" |
