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