slitaz-modular annotate initramfs/init @ rev 166

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