diff options
Diffstat (limited to 'packages/openslug-init/openslug-init-0.10/turnup')
-rw-r--r-- | packages/openslug-init/openslug-init-0.10/turnup | 152 |
1 files changed, 129 insertions, 23 deletions
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 |