slitaz-boot-scripts annotate init @ rev 285
Moved etc/init.d/rc.shutdown to slitaz-base-files
author | Christophe Lincoln <pankso@slitaz.org> |
---|---|
date | Sun Mar 18 00:57:34 2012 +0100 (2012-03-18) |
parents | b4cefa566cf7 |
children | 84129ba21c66 |
rev | line source |
---|---|
pascal@276 | 1 #!/bin/sh |
pascal@276 | 2 |
pascal@278 | 3 success() |
pascal@278 | 4 { |
pascal@278 | 5 cat > /dev/shm/init |
pascal@278 | 6 [ -d /proc/sys ] && umount /proc |
pascal@278 | 7 echo -e "\\033[70G[ \\033[1;32mOK\\033[0;39m ]" |
pascal@278 | 8 exit |
pascal@278 | 9 } |
pascal@278 | 10 |
pascal@276 | 11 launch_init() |
pascal@276 | 12 { |
pascal@278 | 13 mount --move /dev/pts /mnt/dev/pts |
pascal@278 | 14 mount --move /dev/shm /mnt/dev/shm |
pascal@278 | 15 success <<EOT |
pascal@276 | 16 exec /sbin/switch_root mnt /sbin/init |
pascal@276 | 17 EOT |
pascal@276 | 18 } |
pascal@276 | 19 |
pascal@276 | 20 failed() |
pascal@276 | 21 { |
pascal@276 | 22 umount /proc |
pascal@276 | 23 echo -e "\\033[70G[ \\033[1;31mFailed\\033[0;39m ]" |
pascal@276 | 24 } |
pascal@276 | 25 |
pascal@276 | 26 try_init() |
pascal@276 | 27 { |
pascal@276 | 28 if [ ! -d /mnt/etc ] && grep -q cryptoroot= /proc/cmdline; then |
pascal@276 | 29 modprobe dm-mod |
pascal@276 | 30 modprobe dm-crypt |
pascal@276 | 31 modprobe aes-i586 |
pascal@276 | 32 root="$(sed 's/.*cryptoroot=\([^ ]*\).*/\1/' < /proc/cmdline)" |
pascal@276 | 33 dev=${root#/dev/} |
pascal@276 | 34 dmlabel=crypto-$dev |
pascal@276 | 35 if cryptsetup isLuks $root 2> /dev/null; then |
pascal@276 | 36 cryptsetup luksOpen $root $dmlabel |
pascal@276 | 37 else |
pascal@276 | 38 read -s -t 60 -p "Pass phrase : " passphrase |
pascal@276 | 39 key=$(echo $passphrase | hashalot -x -n 32 sha512) |
pascal@276 | 40 blocks=$(cat $(find /sys/block | grep /$dev/size)) |
pascal@276 | 41 echo 0 $blocks crypt aes-plain $key 0 $root 0 | \ |
pascal@276 | 42 dmsetup create $dmlabel |
pascal@276 | 43 fi |
pascal@276 | 44 mount /dev/mapper/$dmlabel /mnt |
pascal@276 | 45 fi |
pascal@284 | 46 grep -q subroot= /proc/cmdline && return |
pascal@284 | 47 grep -q loopfs= /proc/cmdline && return |
pascal@276 | 48 if [ -d /mnt/etc ]; then |
pascal@276 | 49 umount /sys |
pascal@276 | 50 [ -n "$1" ] && for i in $@ ; do |
pascal@276 | 51 cp -a $i /mnt$(dirname $i) |
pascal@276 | 52 done |
pascal@276 | 53 mount /mnt -o remount,ro |
pascal@276 | 54 launch_init |
pascal@276 | 55 fi |
pascal@276 | 56 failed |
pascal@276 | 57 } |
pascal@276 | 58 |
pascal@276 | 59 mount_mapper() |
pascal@276 | 60 { |
pascal@276 | 61 mount $root /mnt |
pascal@276 | 62 try_init /dev/mapper $@ |
pascal@276 | 63 } |
pascal@276 | 64 |
pascal@276 | 65 lvmsetup() |
pascal@276 | 66 { |
pascal@276 | 67 grep -q lvmroot= /proc/cmdline || return 1 |
pascal@276 | 68 modprobe dm-mod |
pascal@276 | 69 vgscan --ignorelockingfailure |
pascal@276 | 70 vgchange -ay --ignorelockingfailure |
pascal@276 | 71 root="/dev/mapper/$(sed 's/.*lvmroot=\([^ ]*\).*/\1/' < /proc/cmdline)" |
pascal@276 | 72 return 0 |
pascal@276 | 73 } |
pascal@276 | 74 |
pascal@276 | 75 load_raid() |
pascal@276 | 76 { |
pascal@276 | 77 while read line; do |
pascal@276 | 78 case "$line" in |
pascal@276 | 79 *raid10*) modprobe raid10 ;; |
pascal@276 | 80 *raid0*) modprobe raid0 ;; |
pascal@276 | 81 *raid1*) modprobe raid1 ;; |
pascal@276 | 82 *raid[456]*) modprobe raid456 ;; |
pascal@276 | 83 esac |
pascal@276 | 84 done |
pascal@276 | 85 } |
pascal@276 | 86 |
pascal@276 | 87 if [ "$1" != "logged" ]; then |
pascal@276 | 88 mount -t devpts devpts /dev/pts |
pascal@276 | 89 mount -t tmpfs tmpfs /dev/shm |
pascal@276 | 90 script -qc '/init logged' /dev/shm/boot.log |
pascal@276 | 91 . /dev/shm/init |
pascal@276 | 92 else |
pascal@276 | 93 mount -t proc proc /proc |
pascal@276 | 94 mount -t sysfs sysfs /sys |
pascal@276 | 95 if grep -q dmraid= /proc/cmdline; then |
pascal@276 | 96 root="$(sed 's/.*dmraid=\([^ ]*\).*/\1/' < /proc/cmdline)" |
pascal@278 | 97 echo -n "Switching / to dmraid $root..." |
pascal@276 | 98 dmraid -s | grep ^type | awk '{ print $3 }' | load_raid |
pascal@276 | 99 case "$root" in |
pascal@276 | 100 /dev/*);; |
pascal@276 | 101 *) root=/dev/mapper/$(dmraid -s|grep ^name|awk '{print $3}')p${root#p};; |
pascal@276 | 102 esac |
pascal@276 | 103 dmraid -ay |
pascal@276 | 104 lvmsetup |
pascal@276 | 105 mount_mapper |
pascal@276 | 106 fi |
pascal@276 | 107 if grep -q softraid= /proc/cmdline; then |
pascal@276 | 108 root="$(sed 's/.*softraid=\([^ ]*\).*/\1/' < /proc/cmdline)" |
pascal@278 | 109 echo -n "Switching / to softraid $root..." |
pascal@276 | 110 mdadm --examine --scan --config=partitions > /etc/mdadm.conf |
pascal@276 | 111 grep -qs " $root " /etc/mdadm.conf || |
pascal@276 | 112 root=$(awk '/dev.md/ { print $2; exit }' < /etc/mdadm.conf) |
pascal@276 | 113 grep level=raid /etc/mdadm.conf | load_raid |
pascal@276 | 114 for i in 1 2 3 4 5 6 7 8 9; do |
pascal@276 | 115 sleep $i |
pascal@276 | 116 mdadm --assemble --scan |
pascal@276 | 117 grep -qs ': active' /proc/mdstat && break |
pascal@276 | 118 done |
pascal@276 | 119 lvmsetup |
pascal@276 | 120 mount_mapper /etc/mdadm.conf |
pascal@276 | 121 fi |
pascal@276 | 122 if lvmsetup; then |
pascal@278 | 123 echo -n "Switching / to lvm $root..." |
pascal@276 | 124 mount_mapper |
pascal@276 | 125 fi |
pascal@276 | 126 if grep -q mount= /proc/cmdline; then |
pascal@276 | 127 root="$(sed 's/.*mount=\([^ ]*\).*/\1/' < /proc/cmdline)" |
pascal@276 | 128 dev=$(blkid | grep $root | sed 's/:.*//;q') |
pascal@278 | 129 echo "Mounting $dev ($root) ..." |
pascal@276 | 130 if ! mount $dev /mnt; then |
pascal@276 | 131 if echo $dev | grep -q "/dev/sd"; then |
pascal@276 | 132 delay=`cat /sys/module/usb_storage/parameters/delay_use` |
pascal@276 | 133 delay=$((1+$delay)) |
pascal@276 | 134 echo -n "sleep for $delay seconds..." |
pascal@276 | 135 sleep $delay |
pascal@276 | 136 fi |
pascal@276 | 137 mount $dev /mnt |
pascal@276 | 138 fi |
pascal@278 | 139 grep -q posixovl /proc/cmdline && |
pascal@278 | 140 echo "Mounting posixovl.." && |
pascal@278 | 141 mount.posixovl /mnt |
pascal@276 | 142 fi |
pascal@276 | 143 if grep -q loopfs= /proc/cmdline; then |
pascal@276 | 144 loopfs="$(sed 's/.*loopfs=\([^ ]*\).*/\1/' < /proc/cmdline)" |
pascal@278 | 145 echo "Into loop file $loopfs..." |
pascal@276 | 146 losetup /dev/loop0 /mnt/$loopfs |
pascal@276 | 147 mount /dev/loop0 /mnt 2> /dev/null |
pascal@276 | 148 fi |
pascal@276 | 149 if grep -q bindfs= /proc/cmdline; then |
pascal@276 | 150 bind="$(sed 's/.*bindfs=\([^ ]*\).*/\1/' < /proc/cmdline)" |
pascal@278 | 151 echo "Binding ${bind/,/ to } ..." |
pascal@276 | 152 mount --bind /mnt/${bind%,*} /mnt/${bind%,*}/${bind#*,} |
pascal@276 | 153 fi |
pascal@276 | 154 grep -q cryptoroot= /proc/cmdline && try_init |
pascal@276 | 155 umount /sys |
pascal@276 | 156 if grep -q subroot= /proc/cmdline; then |
pascal@276 | 157 subroot="/$(sed 's/.*subroot=\([^ ]*\).*/\1/' < /proc/cmdline)" && |
pascal@278 | 158 echo -n "Chrooting to $subroot..." |
pascal@278 | 159 mount --move /dev/pts /mnt$subroot/dev/pts |
pascal@278 | 160 shm=$subroot/dev/shm |
pascal@278 | 161 mount --move /dev/shm /mnt$shm |
pascal@278 | 162 if mv /usr/share/boot/busybox-static /mnt$shm 2> /dev/null; then |
pascal@278 | 163 success <<EOT |
pascal@278 | 164 exec /sbin/switch_root mnt $shm/busybox-static chroot $subroot /sbin/init |
pascal@278 | 165 EOT |
pascal@276 | 166 else |
pascal@278 | 167 success <<EOT |
pascal@278 | 168 exec chroot /mnt$subroot /sbin/init |
pascal@278 | 169 EOT |
pascal@276 | 170 fi |
pascal@276 | 171 fi |
pascal@278 | 172 echo -n "Switching / to tmpfs" |
pascal@276 | 173 size="$(grep rootfssize= < /proc/cmdline | \ |
pascal@276 | 174 sed 's/.*rootfssize=\([0-9]*[kmg%]\).*/-o size=\1/')" |
pascal@276 | 175 free=$(busybox free | busybox awk '/Mem:/ { print int(($4*100)/$3) }') |
pascal@276 | 176 umount /proc |
pascal@276 | 177 [ -n "$size" ] || size="-o size=90%" |
pascal@276 | 178 echo "exec /sbin/init" > /dev/shm/init |
pascal@278 | 179 if [ $free -lt 50 ] || ! mount -t tmpfs $size tmpfs /mnt; then |
pascal@276 | 180 echo -e "\\033[70G[ \\033[1;33mSkipped\\033[0;39m]" |
pascal@276 | 181 exit |
pascal@276 | 182 fi |
pascal@278 | 183 for i in $(ls -ar /); do |
pascal@276 | 184 case "$i" in |
pascal@276 | 185 .|..) ;; |
pascal@276 | 186 mnt) mkdir /mnt/mnt;; |
pascal@278 | 187 usr|var) mv /$i /mnt ;; |
pascal@276 | 188 *) if ! cp -a /$i /mnt 2> /dev/null; then |
pascal@276 | 189 failed |
pascal@276 | 190 umount /mnt |
pascal@276 | 191 exit |
pascal@276 | 192 fi;; |
pascal@276 | 193 esac |
pascal@276 | 194 done |
pascal@276 | 195 launch_init |
pascal@276 | 196 fi |