diff options
author | John Bowler <jbowler@nslu2-linux.org> | 2005-05-30 06:12:33 +0000 |
---|---|---|
committer | John Bowler <jbowler@nslu2-linux.org> | 2005-05-30 06:12:33 +0000 |
commit | 6950e496815f69df7b50f4664b654ac6b3e4f7de (patch) | |
tree | 0cd12f2251a5a0590d3c511d60d8a26dc10575e9 /packages/openslug-init | |
parent | a4912c88f3ebe4f5e322773b655b4300f1e39e07 (diff) |
Initscripts patch.
This changes the order of the shutdown scripts in openslug to ensure
that the network shutdown does not happen before network file systems
have been unmounted.
It also adds some missing scripts - hwclock.sh (load/save the hwclock,
otherwise it gets loaded but not saved, in the absence of NTP). alignment.sh
(added to openslug, was in 'arm' before), and umountfs (excluded from oe).
The file system unmount scripts use /proc/mounts (not fstab) and unmount in
the correct order (the old scripts only worked if nothing was mounted within
a mounted file system).
Scripts have been patched (openslug only patches) to make them work correctly
with openslug NFS, flash and disk root and to arrange for syslog to run as
long as possible (it's now in S/0/6, not in the user run levels).
Directory struction of openslug-init has been tidied up, with all the
initscripts in a sub-dirctory.
initscritps-openslug is an openslug specific variant of initscripts which
tracks it and fails safe (an update/change to initscripts will cause
initscripts-openslug to fail rather than build strangeness).
turnup also contains a fix for slugbug 150.
BKrev: 429aaed1D-1XOdk8brF2bP9C9EEEJQ
Diffstat (limited to 'packages/openslug-init')
12 files changed, 160 insertions, 222 deletions
diff --git a/packages/openslug-init/openslug-init-0.10/leds_startup b/packages/openslug-init/openslug-init-0.10/initscripts/leds_startup index e69de29bb2..e69de29bb2 100644 --- a/packages/openslug-init/openslug-init-0.10/leds_startup +++ b/packages/openslug-init/openslug-init-0.10/initscripts/leds_startup diff --git a/packages/openslug-init/openslug-init-0.10/rmrecovery b/packages/openslug-init/openslug-init-0.10/initscripts/rmrecovery index e69de29bb2..e69de29bb2 100644 --- a/packages/openslug-init/openslug-init-0.10/rmrecovery +++ b/packages/openslug-init/openslug-init-0.10/initscripts/rmrecovery diff --git a/packages/openslug-init/openslug-init-0.10/initscripts/sysconfsetup b/packages/openslug-init/openslug-init-0.10/initscripts/sysconfsetup new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/openslug-init/openslug-init-0.10/initscripts/sysconfsetup diff --git a/packages/openslug-init/openslug-init-0.10/initscripts/syslog.buffer b/packages/openslug-init/openslug-init-0.10/initscripts/syslog.buffer new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/openslug-init/openslug-init-0.10/initscripts/syslog.buffer diff --git a/packages/openslug-init/openslug-init-0.10/initscripts/syslog.file b/packages/openslug-init/openslug-init-0.10/initscripts/syslog.file new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/openslug-init/openslug-init-0.10/initscripts/syslog.file diff --git a/packages/openslug-init/openslug-init-0.10/initscripts/syslog.network b/packages/openslug-init/openslug-init-0.10/initscripts/syslog.network new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/openslug-init/openslug-init-0.10/initscripts/syslog.network diff --git a/packages/openslug-init/openslug-init-0.10/initscripts/umountinitrd.sh b/packages/openslug-init/openslug-init-0.10/initscripts/umountinitrd.sh new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/openslug-init/openslug-init-0.10/initscripts/umountinitrd.sh diff --git a/packages/openslug-init/openslug-init-0.10/initscripts/zleds b/packages/openslug-init/openslug-init-0.10/initscripts/zleds new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/openslug-init/openslug-init-0.10/initscripts/zleds diff --git a/packages/openslug-init/openslug-init-0.10/leds_rs_green b/packages/openslug-init/openslug-init-0.10/leds_rs_green deleted file mode 100644 index c3ad3d2d64..0000000000 --- a/packages/openslug-init/openslug-init-0.10/leds_rs_green +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh -# -# This script is executed at the start and end of each run-level -# transition. It is the first 'stop' script and the last 'start' -# script. -# -# 'stop' sets the correct colour power LED to flash between the -# two colours of the previous and next runlevel. -# 'start' sets the LED to steady -# -# 'red' is the initial setting on kernel boot -# -# 'amber' is used for run levels S (from /linuxrc), 0 (halt), -# 1 (single user) and 6 (reboot). halt and reboot do not -# terminate therefore the LED remains flashing until the -# kernel terminates. -# -# 'green' is used for run levels 2-5 - the normal user run levels. -# -# colours are 'g' (green), 'r' (red) or 'gr' (amber). -colour() { - case "$1" in - S|0|1|6) echo gr;; - 2|3|4|5) echo g;; - N) echo r;; - *) echo "led change: $runlevel: runlevel unknown" >&2 - echo r;; - esac -} - -# leds syntax is -A +<init state> /<new state> -case "$1" in -start) leds -A +"$(colour "$runlevel")";; -stop) leds -A +"$(colour "$previous")" /"$(colour "$runlevel")";; -*) echo "led change: $1: command ignored" >&2;; -esac - -exit 0 diff --git a/packages/openslug-init/openslug-init-0.10/sysconfsetup b/packages/openslug-init/openslug-init-0.10/sysconfsetup deleted file mode 100644 index 8d2ecdca09..0000000000 --- a/packages/openslug-init/openslug-init-0.10/sysconfsetup +++ /dev/null @@ -1,146 +0,0 @@ -#!/bin/sh -# This script is run once when the system first boots. Its sole -# purpose is to create /etc/default/sysconf (the overall system -# configuration file) and other files derived from this. -# -# The script runs immediately after S10checkroot.sh - this is the -# point at which the rootfs will be mounted rw even if the kernel -# booted with it ro. -# -# rm or mv the file to run this again. If this is done the -# following configuration files will be rewritten: -# -# /etc/default/sysconf -# /etc/hostname -# /etc/defaultdomain -# /etc/network/interfaces -# /etc/resolv.conf -# -test -r /etc/default/sysconf && exit 0 -# -# /etc/default/functions contains useful utility functions - it's -# in a separate file so that it can be loaded by any script -. /etc/default/functions -# -# Utility to deal with absence of DNS configuration -echodns(){ - local dns - if test $# -gt 0 - then - for dns in "$@" - do - echo "nameserver $dns" - done - fi -} -# -# The SysConf device must exist in /dev at this point for this script -# to work. -# -# It is important not to hard-wire the name of the device because of -# the posibility of changing the flash partition layout. -# -# The block device is used here because at present udev does not -# show the character devices -sysdev="$(mtblockdev SysConf)" -if test -n "$sysdev" -a -b "$sysdev" -then - # Read the defined part of SysConf into /etc/default/sysconf. - # SysConf has lines of two forms: - # - # [section] - # name=value - # - # In practice SysConf also contains other stuff, use the command: - # - # devio '<</dev/mtd1;cpb' - # - # to examine the current settings. The badly formatted stuff - # is removed (to be exact, the sed script selects only lines - # which match one of the two above). The lan interface, which - # defaults to ixp0, is changed to the correct value for openslug, - # eth0 - devio '<<'"$sysdev"';cpb;fb1,10' | sed -n '/^\[[^][]*\]$/p; - s/^lan_interface=ixp0$/lan_interface=eth0/; - /^[-a-zA-Z0-9_][-a-zA-Z0-9_]*=/p' >/etc/default/sysconf - # - # Now take the result and set up the 'standard' files in the - # root file system (these couldn't be set up before because - # they depend on stuff which RedBoot puts into SysConf from the - # ID info on the specific machine - in particular the hardware - # address of eth0, which must be the one assigned for *this* - # box!) - # - # HOSTNAME: defaults to LGK<mac> i.e. something derived from - # the ethernet hardware. LinkSys documentation explains how - # to determine this. Set by the user in linksys setup software. - # DOMAINNAME: LinkSys puts this in w_d_name. - test -n "$(config host)" && config host >/etc/hostname - domain="$(config domain)" - test -n "$domain" && echo "$domain" >/etc/defaultdomain - # - # Ethernet information. This goes into /etc/network/interfaces, - # however this is only used for static setup (and this is not - # the default). With dhcp the openslug udhcp script, - # /etc/udhcpc.d/50default, loads the values from sysconf. The - # lan_interface config value must exist for the file to be - # overwritten here. - iface="$(config iface)" - if test -n "$iface" - then - boot="$(config boot)" - # Only dhcp and static are supported at present - bootp - # support requires installation of appropriate packages - # dhcp is the fail-safe - case "$boot" in - dhcp|static) ;; - *) boot=dhcp;; - esac - # - mac="$(config mac)" - ip="$(config ip)" - netmask="$(config netmask)" - gateway="$(config gateway)" - { - echo "# /etc/network/interfaces" - echo "# configuration file for ifup(8), ifdown(8)" - echo "#" - echo "# The loopback interface" - echo "auto lo" - echo "iface lo inet loopback" - echo "#" - echo "# The NSLU2 built-in ethernet" - echo "auto eth0" - echo "# Automatically generated from /etc/default/sysconf" - if test -n "$mac" - then - echo "# The pre-up option must always be supplied, regardless" - echo "# of configuration, to set the hardware correctly." - echo "# Severe network problems may result if this option is" - echo "# removed." - c= - else - echo "# WARNING: improperly configured network interface." - echo "# WARNING: the pre-up line must be corrected or severe" - echo "# WARNING: network problems may result." - c='#' - mac='<WARNING: unknown hardware address>' - fi - echo "iface $iface inet $boot" - echo "${c} pre-up ifconfig $iface hw ether $mac" - # The following are ignored for DHCP but are harmless - test -n "$ip" && echo " address $ip" - test -n "$netmask" && echo " netmask $netmask" - test -n "$gateway" && echo " gateway $gateway" - } >/etc/network/interfaces - fi - # - # The DNS server information gives up to three nameservers, but this - # currently only binds in the first. - { - test -n "$domain" && echo "search $domain" - echodns $(config dns) $(config dns1) $(config dns2) - } >/etc/resolv.conf -fi - -exit 0 diff --git a/packages/openslug-init/openslug-init-0.10/turnup b/packages/openslug-init/openslug-init-0.10/turnup index b688bc3051..d22e15c208 100644 --- a/packages/openslug-init/openslug-init-0.10/turnup +++ b/packages/openslug-init/openslug-init-0.10/turnup @@ -8,6 +8,55 @@ # force: override certain checks force= # +# fstype new +# The type of the file system mounted on "new" Outputs the last +# piece of information found, which should be the one for the +# currently visible mount! +fstype() { + local cwd dev mp type options pass freq result + cwd="$(cd "$1"; /bin/pwd)" + result= + while read dev mp type options pass freq + do + case "$mp" in + "$cwd") result="$type";; + esac + done </proc/mounts + echo "$result" +} +# +# fsoptions arguments +# Collapses the mount (-o) options into a single list which is +# printed on stdout. Accepts an arbitrary list of options and +# just joins them together. +fsoptions() { + local options + options= + while test $# -gt 1 + do + case "$1" in + -t) shift;; + -o) if test -n "$2" + then + if test -n "$options" + then + options="$options,$2" + else + options="$2" + fi + fi + shift;; + esac + shift + done + if test -n "$options" + then + echo "$options" + else + echo defaults + fi +} +# # check_rootfs [-i] <root fs directory> # Make sure the candidate rootfs is empty check_rootfs() { @@ -87,8 +136,8 @@ setup_dev() { return 1 } echo "done" >&2 - # now remove the startup links which mount the ramfs on /dev - rm "$1"/etc/rc?.d/[KS]??devices + # now prevent this being done each time + :>"$1"/dev/.permanent return 0 } @@ -128,8 +177,8 @@ setup_var() { echo "turnup: /var: could not populate directory" >&2 return 1 } - # and remove the startup links - rm "$1"/etc/rc?.d/[KS]??populate-var.sh + # the startup link is left for the moment, this seems safer + #rm "$1"/etc/rc?.d/[KS]??populate-var.sh # remove the /var tmpfs entry from the new /etc/fstab case "$2" in disk) sed -i '\@\s/var\s\s*tmpfs\s@d' "$1"/etc/fstab @@ -138,10 +187,9 @@ setup_var() { echo "turnup: tmpfs /var mount moved to /var/tmp" >&2;; esac # - # warn the user - it's not enough to put the /var mount back, it - # is necessary to reinsert the populate-var.sh links! - echo " If you remount tmpfs on /var it must be populated at boot, use:" >&2 - echo " update-rc.d populate-var.sh start 37 S ." >&2 + # Previous versions of turnup removed populate-var.sh from the + # startup links, this one doesn't, so /var can be made back into + # a tmpfs just by a change to /etc/fstab. return 0 } @@ -225,6 +273,23 @@ setup_rootfs() { } # +# setup_fstab new fsdev fstype fsoptions +# Alters the /etc/fstab entry for / to refer to the correct device and +# have the correct type and options. Essential for checkroot to remount +# / with the correct options. +# bad, since sed won't fail even if it changes nothing. +setup_fstab() { + sed -i '\@^[^ ]*\s\s*/\s@s@^.*$@'"$2 / $3 $4 1 1"'@' "$1"/etc/fstab + egrep -q "^$2 / $3 $4 1 1\$" "$1"/etc/fstab || { + echo "turnup: /etc/fstab: root(/) entry not changed" >&2 + echo " you probably need to check the options in /etc/fstab" >&2 + echo " to ensure that the root partition is mounted correctly" >&2 + return 1 + } +} + + +# # boot_rootfs <boot type> <flash file system> <sleep time> <device> [options] # Change the flash partition (not the current root!) to boot off # the new root file system @@ -342,7 +407,7 @@ mountflash() { # disk [-m] [-i] [-s<time>] <device> {options} # Carefully copy the flash file system to the named device. disk() { - local setup_type sleep init device new ffs + local setup_type sleep init device new ffs fst fso setup_type=disk sleep=0 @@ -388,8 +453,17 @@ disk() { # read only is *not* an option, this is important because the boot/disk # script needs a rw file system status=1 + fst= + fso="$(fsoptions "$@")" if mount "$@" "$device" "$new" then + fst="$(fstype "$new")" + umount "$new" || + echo "turnup disk: $device($new): umount does not seem to work" >&2 + fi + + if test -n "$fst" && mount -t "$fst" -o "$fso" "$device" "$new" + then if check_rootfs $init "$new" && { test -z "$init" || { copy_rootfs "$ffs" "$new" && @@ -397,14 +471,20 @@ disk() { } } then + setup_fstab "$new" "$device" "$fst" "$fso" status=0 fi # clean up the disk. It is worrying if this umount fails! - umount "$new" || { + umount "$new" || test "$force" = "-f" || { echo "turnup disk: $device: umount failed" >&2 echo " you must unmount this device cleanly yourself, then use" >&2 - echo " the -i option to boot from the device" >&2 + if test -z "$init" + then + echo " turnup with the -f option to boot from the device" >&2 + else + echo " turnup without the -i option to boot from the device" >&2 + fi status=1 } @@ -412,10 +492,15 @@ disk() { if test $status -eq 0 then # memsticks boot like disks, so ignore the -m - boot_rootfs disk "$ffs" "$sleep" "$device" "$@" + boot_rootfs disk "$ffs" "$sleep" "$device" -t "$fst" -o "$fso" fi else echo "turnup disk: $device($*): unable to mount device on $new" >&2 + # If it worked first time + if test -n "$fst" + then + echo " options used: -t $fst -o $fso [error in this script]" >&2 + fi fi # clean up the flash file system @@ -501,7 +586,19 @@ nfs() { # read only is *not* an option, this is important because the boot/disk # script needs a rw file system status=1 - if mount -t nfs -o nolock,noatime,hard,intr,rsize=1024,wsize=1024,"$@" "$nfsroot" "$new" + fst= + # These settings for for NFS, something better will probably have to + # be done to support other network file systems. + nfsopt="nolock,noatime,hard,intr,rsize=1024,wsize=1024" + fso="$(fsoptions -o "$nfsopt" "$@")" + if mount -o "$nfsopt" "$@" "$nfsroot" "$new" + then + fst="$(fstype "$new")" + umount "$new" || + echo "turnup nfs: $nfsroot($new): umount does not seem to work" >&2 + fi + + if test -n "$fst" && mount -t "$fst" -o "$fso" "$nfsroot" "$new" then if :>"$new"/ttt && test -O "$new"/ttt && rm "$new"/ttt then @@ -512,19 +609,25 @@ nfs() { } } then + setup_fstab "$new" "$nfsroot" "$fst" "$fso" status=0 fi else - echo "turnup nfs: $nfsroot: partition must be mounted no_root_squash" >&2 + echo "turnup nfs: $nfsroot: partition must be exported no_root_squash" >&2 fi # clean up the disk. It is worrying if this umount fails! - umount "$new" || { + umount "$new" || test "$force" = "-f" || { echo "turnup nfs: $nfsroot: umount failed" >&2 if test $status -eq 0 then echo " you must unmount this partition cleanly yourself, then use" >&2 - echo " the -i option to boot from the NFS root" >&2 + if test -z "$init" + then + echo " turnup with the -f option to boot from the NFS root" >&2 + else + echo " turnup without the -i option to boot from the NFS root" >&2 + fi status=1 fi } @@ -533,11 +636,15 @@ nfs() { if test $status -eq 0 then # the options used are exactly those which worked before. - boot_rootfs nfs "$ffs" 0 "$nfsroot" -t nfs \ - -o nolock,noatime,hard,intr,rsize=1024,wsize=1024,"$@" + boot_rootfs nfs "$ffs" 0 "$nfsroot" -t nfs -o "$fso" fi else - echo "turnup disk: $nfsroot($*): unable to mount device on $new" >&2 + echo "turnup nfs: $nfsroot($*): unable to mount device on $new" >&2 + # If it worked first time + if test -n "$fst" + then + echo " options obtained: -t $fst -o $fso" >&2 + fi fi # clean up the flash file system @@ -588,10 +695,9 @@ usage: turnup command [options] partition must be available to be mounted without root id sqashing (i.e. root must be root) and it will be selected as the root file system for subsequent reboots. - The options are added to the -o list, therefore to give - additional flag arguments specify an empty first option. - The options may be used to override the defaults just by - specifying the new value. + A default set of -o options are provided, additional options + may be given on the command line (multiple -o options will + be combined into a single -o). flash Revert to booting from the flash disk on next reboot. ram diff --git a/packages/openslug-init/openslug-init_0.10.bb b/packages/openslug-init/openslug-init_0.10.bb index be4f02714a..7414a23e99 100644 --- a/packages/openslug-init/openslug-init_0.10.bb +++ b/packages/openslug-init/openslug-init_0.10.bb @@ -2,7 +2,8 @@ DESCRIPTION = "Openslug initial network config via sysconf" SECTION = "console/network" LICENSE = "GPL" DEPENDS = "base-files" -PR = "r26" +RDEPENDS = "busybox" +PR = "r27" SRC_URI = "file://linuxrc \ file://boot/flash \ @@ -11,13 +12,17 @@ SRC_URI = "file://linuxrc \ file://boot/ram \ file://boot/network \ file://boot/udhcpc.script \ + file://initscripts/syslog.buffer \ + file://initscripts/syslog.file \ + file://initscripts/syslog.network \ + file://initscripts/zleds \ + file://initscripts/leds_startup \ + file://initscripts/rmrecovery \ + file://initscripts/sysconfsetup \ + file://initscripts/umountinitrd.sh \ file://functions \ - file://rmrecovery \ - file://sysconfsetup \ file://turnup \ file://modprobe.conf \ - file://leds_rs_green \ - file://leds_startup \ file://leds.h \ file://leds.c \ file://kern_header.c \ @@ -29,6 +34,8 @@ USRSBINPROGS = "kern_header" CPROGS = "${USRSBINPROGS} ${SBINPROGS}" SCRIPTS = "turnup update-kernel" BOOTSCRIPTS = "flash disk nfs ram network udhcpc.script" +INITSCRIPTS = "syslog.buffer syslog.file syslog.network zleds\ + leds_startup rmrecovery sysconfsetup umountinitrd.sh" # This just makes things easier... S="${WORKDIR}" @@ -78,10 +85,10 @@ do_install() { # # Init scripts install -m 0644 functions ${D}${sysconfdir}/default - install -m 0755 rmrecovery ${D}${sysconfdir}/init.d/ - install -m 0755 sysconfsetup ${D}${sysconfdir}/init.d/ - install -m 0755 leds_startup ${D}${sysconfdir}/init.d/ - install -m 0755 leds_rs_green ${D}${sysconfdir}/init.d/zleds_rs + for s in ${INITSCRIPTS} + do + install -m 0755 initscripts/$s ${D}${sysconfdir}/init.d/ + done # # Boot scripts @@ -100,21 +107,30 @@ do_install() { # case it is normal to run 'start' and 'stop', but because the conf # files installed don't actually start or stop anything this is # unnecessary, so the package postfoo handling is simplified here. +#NB: do not use '08' (etc) for the first argument after start/stop, +# the value is interpreted as an octal number if there is a leading +# zero. pkg_postinst_openslug-init() { opt= test -n "$D" && opt="-r $D" - update-rc.d $opt sysconfsetup start 11 S . - update-rc.d $opt zleds_rs start 99 S 1 2 3 4 5 . stop 05 0 1 2 3 4 5 6 . + update-rc.d $opt hwclock.sh start 8 S . start 45 0 6 . + update-rc.d $opt umountinitrd.sh start 9 S . + update-rc.d $opt syslog.buffer start 11 S . start 49 0 6 . + update-rc.d $opt sysconfsetup start 12 S . + update-rc.d $opt syslog.file start 39 S . start 47 0 6 . + update-rc.d $opt syslog.network start 44 S . start 39 0 6 . + update-rc.d $opt zleds start 99 S 1 2 3 4 5 . stop 5 0 1 2 3 4 5 6 . # bug fix for startup - update-rc.d $opt leds_startup start 01 1 2 3 4 5 . + update-rc.d $opt leds_startup start 1 1 2 3 4 5 . } pkg_postrm_openslug-init() { opt= test -n "$D" && opt="-r $D" - update-rc.d $opt sysconfsetup remove - update-rc.d $opt zleds_rs remove - update-rc.d $opt leds_startup remove + for s in ${INITSCRIPTS} + do + update-rc.d $opt "$s" remove + done } PACKAGES = "${PN}" |