slitaz-boot-scripts rev 314
init: add aufs support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sun Aug 26 15:09:53 2012 +0200 (2012-08-26) |
parents | b59d773e1de8 |
children | 11c525ec4906 |
files | init |
line diff
1.1 --- a/init Sat Jul 07 17:59:30 2012 +0200 1.2 +++ b/init Sun Aug 26 15:09:53 2012 +0200 1.3 @@ -1,192 +1,210 @@ 1.4 #!/bin/sh 1.5 1.6 -success() 1.7 +fail() 1.8 { 1.9 - cat > /run/init 1.10 - [ -d /proc/sys ] && umount /proc 1.11 - echo -e "\\033[70G[ \\033[1;32mOK\\033[0;39m ]" 1.12 - exit 1.13 +echo -e '\033[70G[ \033[1;3'${1:-1mFailed}'\033[0;39m ]' 1.14 } 1.15 1.16 -launch_init() 1.17 +quit() 1.18 { 1.19 - mount --move /run /mnt/run 1.20 - success <<EOT 1.21 -exec /sbin/switch_root mnt /sbin/init 1.22 +[ -d /mnt$4/etc ] || return 1.23 +mount /mnt -o remount,ro 1.24 +mount --move /run /mnt/${1:-run} 1.25 +cat>/run/init<<EOT 1.26 +$2 1.27 +x=/sbin/switch_root 1.28 +[ -x \$x ] && exec \$x mnt $3 /sbin/init 1.29 EOT 1.30 +fail 2mDone 1.31 +exit 1.32 } 1.33 1.34 -failed() 1.35 +arg() 1.36 { 1.37 - umount /proc 1.38 - echo -e "\\033[70G[ \\033[1;31mFailed\\033[0;39m ]" 1.39 +grep -q $1 /proc/cmdline 1.40 } 1.41 1.42 -try_init() 1.43 +got() 1.44 { 1.45 - if [ ! -d /mnt/etc ] && grep -q cryptoroot= /proc/cmdline; then 1.46 - modprobe dm-mod 1.47 - modprobe dm-crypt 1.48 - modprobe aes-i586 1.49 - root="$(sed 's/.*cryptoroot=\([^ ]*\).*/\1/' < /proc/cmdline)" 1.50 - dev=${root#/dev/} 1.51 - dmlabel=crypto-$dev 1.52 - if cryptsetup isLuks $root 2> /dev/null; then 1.53 - cryptsetup luksOpen $root $dmlabel 1.54 - else 1.55 - read -s -t 60 -p "Pass phrase : " passphrase 1.56 - key=$(echo $passphrase | hashalot -x -n 32 sha512) 1.57 - blocks=$(cat $(find /sys/block | grep /$dev/size)) 1.58 - echo 0 $blocks crypt aes-plain $key 0 $root 0 | \ 1.59 - dmsetup create $dmlabel 1.60 - fi 1.61 - mount /dev/mapper/$dmlabel /mnt 1.62 - fi 1.63 - grep -q subroot= /proc/cmdline && return 1.64 - grep -q loopfs= /proc/cmdline && return 1.65 - if [ -d /mnt/etc ]; then 1.66 - umount /sys 1.67 - [ -n "$1" ] && for i in $@ ; do 1.68 - cp -a $i /mnt$(dirname $i) 1.69 - done 1.70 - mount /mnt -o remount,ro 1.71 - launch_init 1.72 - fi 1.73 - failed 1.74 +arg $1= && root="$(sed "s/.*$1=\([^ ]*\).*/\1/" </proc/cmdline)" 1.75 } 1.76 1.77 -mount_mapper() 1.78 +msg() 1.79 { 1.80 - mount $root /mnt 1.81 - try_init /dev/mapper $@ 1.82 +echo "Switching / to $1 ..." 1.83 } 1.84 1.85 -lvmsetup() 1.86 +use() 1.87 { 1.88 - grep -q lvmroot= /proc/cmdline || return 1 1.89 - modprobe dm-mod 1.90 - vgscan --ignorelockingfailure 1.91 - vgchange -ay --ignorelockingfailure 1.92 - root="/dev/mapper/$(sed 's/.*lvmroot=\([^ ]*\).*/\1/' < /proc/cmdline)" 1.93 - return 0 1.94 +got $1 && echo msg "$1 $root" 1.95 } 1.96 1.97 -load_raid() 1.98 +mnt() 1.99 { 1.100 -while read line; do 1.101 - case "$line" in 1.102 - *raid10*) modprobe raid10 ;; 1.103 - *raid0*) modprobe raid0 ;; 1.104 - *raid1*) modprobe raid1 ;; 1.105 - *raid[456]*) modprobe raid456 ;; 1.106 - *mirror*) modprobe dm-mirror ;; 1.107 - esac 1.108 +r=${root#/dev/} 1.109 +r=/dev/${r%%/*} 1.110 +d=${root#*$r} 1.111 +mount $r $1 && return 1.112 +w=$(cat /sys/module/usb_storage/parameters/delay_use) 1.113 +w=$((1+${w:-2})) 1.114 +echo -n "Sleep $w seconds..." 1.115 +sleep $w 1.116 +mount $r $1 1.117 +} 1.118 + 1.119 +mod() 1.120 +{ 1.121 +modprobe $1 2>/dev/null || insmod $(find /lib/modules|sed "/$1.ko/!dq") 1.122 +} 1.123 + 1.124 +tryinit() 1.125 +{ 1.126 +if [ ! -d /mnt/etc ] && got cryptoroot 1.127 +then mod dm-mod 1.128 + mod dm-crypt 1.129 + mod aes-i586 1.130 + d=${root#/dev/} 1.131 + l=crypto-$d 1.132 + if cryptsetup isLuks $root 2>/dev/null; then 1.133 + cryptsetup luksOpen $root $l 1.134 + else 1.135 + read -st 60 -p "Pass phrase : " p 1.136 + k=$(echo $p|hashalot -x -n 32 sha512) 1.137 + echo 0 $(cat $(find /sys/block|grep /$d/size))\ 1.138 + crypt aes-plain $k 0 $root 0|dmsetup create $l 1.139 + fi 1.140 + mount /dev/mapper/$l /mnt 1.141 +fi 1.142 +got subroot && return 1.143 +got loopfs && return 1.144 +if [ -d /mnt/etc ] 1.145 +then for i in $@; do cp -a $i /mnt$(dirname $i); done 1.146 + quit 1.147 +fi 1.148 +fail 1.149 +} 1.150 + 1.151 +trylvm() 1.152 +{ 1.153 +use lvmroot || return 1.154 +mod dm-mod 1.155 +vgscan --ignorelockingfailure 1.156 +vgchange -ay --ignorelockingfailure 1.157 +mount /dev/mapper/$root /mnt 1.158 +tryinit /dev/mapper $1 1.159 +} 1.160 + 1.161 +ldraid() 1.162 +{ 1.163 +while read l 1.164 +do case "$l" in 1.165 +*raid10*) mod raid10;; 1.166 +*raid0*) mod raid0;; 1.167 +*raid1*) mod raid1;; 1.168 +*raid*) mod raid456;; 1.169 +*mirror*) mod dm-mirror 1.170 +esac 1.171 done 1.172 } 1.173 1.174 -if [ "$1" != "logged" ]; then 1.175 +if [ "$1" != "log" ] 1.176 +then mount -t proc proc /proc 1.177 + mount -t sysfs sys /sys 1.178 mount -t tmpfs tmpfs /run 1.179 - /init logged 2>&1 | tee /run/boot.log 1.180 + x=/sbin/init; echo "[ -x $x ] && exec $x" >/run/init 1.181 + $0 log 2>&1 | tee /run/boot.log 1.182 + umount /proc 1.183 + umount /sys 1.184 . /run/init 1.185 -else 1.186 -mount -t proc proc /proc 1.187 -mount -t sysfs sysfs /sys 1.188 -if grep -q dmraid= /proc/cmdline; then 1.189 - root="$(sed 's/.*dmraid=\([^ ]*\).*/\1/' < /proc/cmdline)" 1.190 - echo -n "Switching / to dmraid $root..." 1.191 - dmraid -s | grep ^type | awk '{ print $3 }' | load_raid 1.192 - case "$root" in 1.193 - /dev/*);; 1.194 - *) root=/dev/mapper/$(dmraid -s|grep ^name|awk '{print $3}')p${root#p};; 1.195 + sh 1.196 +fi 1.197 +ln -s "$(sed '/name/!ds/.*:[^a-z]*//' /proc/sys/dev/cdrom/info)" /dev/cdrom 1.198 +if use dmraid 1.199 +then dmraid -s|sed '/^type/!ds/.*: *//'|ldraid 1.200 + [ ${root:0:4} = /dev ] || 1.201 + root=/dev/mapper/$(dmraid -s|sed '/^name/!ds/.*: *//')p${root#p} 1.202 + dmraid -ay 1.203 +fi 1.204 +if use softraid 1.205 +then mdadm -E -s -c partitions>/etc/mdadm.conf 1.206 + grep -qs " $root " /etc/mdadm.conf || 1.207 + root=$(awk '/dev.md/{print $2;exit}'</etc/mdadm.conf) 1.208 + grep level=raid /etc/mdadm.conf|ldraid 1.209 + for i in 1 2 3 4 5 6 7 8 9 1.210 + do sleep $i 1.211 + mdadm -A -s 1.212 + grep -qs ': act' /proc/mdstat && break 1.213 + done 1.214 + trylvm /etc/mdadm.conf 1.215 +fi 1.216 +trylvm 1.217 +if got mount 1.218 +then dev=$root 1.219 + root=$(blkid|grep $root|sed 's/:.*//;q') 1.220 + [ "$dev" = "$root" ] || dev="$root ($dev)" 1.221 + echo "Mount $dev..." 1.222 + mnt /mnt 1.223 + arg posixovl && echo "And posixovl..." && mount.posixovl /mnt 1.224 +fi 1.225 +got loopfs && echo "Into file $root..." && 1.226 + losetup /dev/loop0 /mnt/$root && mount /dev/loop0 /mnt 1.227 +got bindfs && echo "Bind ${root/,/ to } ..." && 1.228 + mount --bind /mnt/${root%,*} /mnt/${root/,//} 1.229 +arg cryptoroot= && tryinit 1.230 +if use subroot 1.231 +then cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so /usr/sbin/chroot | sed\ 1.232 + 's|.*=> \(/lib/l[^ ]*\).*|\1|;/^\//!d') /usr/sbin/chroot /run 1.233 + r=$root/run 1.234 + quit $r "export LD_LIBRARY_PATH=$r:/lib"\ 1.235 + "$(cd /mnt; ls $r/ld-*) $r/chroot $root" "/$root" 1.236 +fi 1.237 +msg tmpfs 1.238 +root=100 1.239 +got tmpram 1.240 +r=$root 1.241 +root=90% 1.242 +got rootfssize 1.243 +[ $(busybox free|busybox awk '/Mem:/{print int(($4*100)/$3)}') -ge $r ] && 1.244 +mount -t tmpfs -o size=$root tmpfs /mnt && 1.245 +for i in $(ls -ar /) 1.246 +do case "$i" in 1.247 + .*) ;; 1.248 + mnt|proc|sys) mkdir /mnt/$i;; 1.249 + usr|var|rootfs*) mv /$i /mnt;; 1.250 + *) cp -a /$i /mnt 2>/dev/null && continue 1.251 + fail 1.252 + umount /mnt 1.253 + exit 1.254 esac 1.255 - dmraid -ay 1.256 - lvmsetup 1.257 - mount_mapper 1.258 +done || fail 3mSkipped 1.259 +quit 1.260 +msg aufs 1.261 +br=/mnt/.rw 1.262 +mkdir $br 1.263 +got rwdev && mnt $br && br=$br$d 1.264 +o= 1.265 +p= 1.266 +c=/mnt/.cdrom 1.267 +if [ -z "$(ls /mnt/rootfs* 2>/dev/null)" ] 1.268 +then root=cdrom 1.269 + got rodev 1.270 + mkdir -p $c /mnt$c /mnt/.rw$c 1.271 + mnt $c 1.272 + o="-o 124" 1.273 + p=/.cdrom/boot 1.274 + d=/fs 1.275 + got rodir && c=$c$root 1.276 fi 1.277 -if grep -q softraid= /proc/cmdline; then 1.278 - root="$(sed 's/.*softraid=\([^ ]*\).*/\1/' < /proc/cmdline)" 1.279 - echo -n "Switching / to softraid $root..." 1.280 - mdadm --examine --scan --config=partitions > /etc/mdadm.conf 1.281 - grep -qs " $root " /etc/mdadm.conf || 1.282 - root=$(awk '/dev.md/ { print $2; exit }' < /etc/mdadm.conf) 1.283 - grep level=raid /etc/mdadm.conf | load_raid 1.284 - for i in 1 2 3 4 5 6 7 8 9; do 1.285 - sleep $i 1.286 - mdadm --assemble --scan 1.287 - grep -qs ': active' /proc/mdstat && break 1.288 - done 1.289 - lvmsetup 1.290 - mount_mapper /etc/mdadm.conf 1.291 -fi 1.292 -if lvmsetup; then 1.293 - echo -n "Switching / to lvm $root..." 1.294 - mount_mapper 1.295 -fi 1.296 -if grep -q mount= /proc/cmdline; then 1.297 - root="$(sed 's/.*mount=\([^ ]*\).*/\1/' < /proc/cmdline)" 1.298 - dev=$(blkid | grep $root | sed 's/:.*//;q') 1.299 - [ "$dev" = "$root" ] || root="$dev ($root)" 1.300 - echo "Mounting $root ..." 1.301 - if ! mount $dev /mnt; then 1.302 - if echo $dev | grep -q "/dev/sd"; then 1.303 - delay=`cat /sys/module/usb_storage/parameters/delay_use` 1.304 - delay=$((1+$delay)) 1.305 - echo -n "sleep for $delay seconds..." 1.306 - sleep $delay 1.307 - fi 1.308 - mount $dev /mnt 1.309 - fi 1.310 - grep -q posixovl /proc/cmdline && 1.311 - echo "Mounting posixovl.." && 1.312 - mount.posixovl /mnt 1.313 -fi 1.314 -if grep -q loopfs= /proc/cmdline; then 1.315 - loopfs="$(sed 's/.*loopfs=\([^ ]*\).*/\1/' < /proc/cmdline)" 1.316 - echo "Into loop file $loopfs..." 1.317 - losetup /dev/loop0 /mnt/$loopfs 1.318 - mount /dev/loop0 /mnt 2> /dev/null 1.319 -fi 1.320 -if grep -q bindfs= /proc/cmdline; then 1.321 - bind="$(sed 's/.*bindfs=\([^ ]*\).*/\1/' < /proc/cmdline)" 1.322 - echo "Binding ${bind/,/ to } ..." 1.323 - mount --bind /mnt/${bind%,*} /mnt/${bind%,*}/${bind#*,} 1.324 -fi 1.325 -grep -q cryptoroot= /proc/cmdline && try_init 1.326 -umount /sys 1.327 -if grep -q subroot= /proc/cmdline; then 1.328 - subroot="/$(sed 's/.*subroot=\([^ ]*\).*/\1/' < /proc/cmdline)" && 1.329 - echo -n "Chrooting to $subroot..." 1.330 - run=$subroot/run 1.331 - mount --move /run /mnt$run 1.332 - cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so /usr/sbin/chroot | sed \ 1.333 - 's|.*=> \(/lib/l[^ ]*\).*|\1|;/^\//!d') /usr/sbin/chroot /mnt$run 1.334 - success <<EOT 1.335 -export LD_LIBRARY_PATH=$run:/lib 1.336 -exec /sbin/switch_root mnt $run/$(cd /mnt$run ; ls ld-*) $run/chroot $subroot /sbin/init 1.337 -EOT 1.338 -fi 1.339 -echo -n "Switching / to tmpfs" 1.340 -size="$(grep rootfssize= < /proc/cmdline | \ 1.341 - sed 's/.*rootfssize=\([0-9]*[kmg%]\).*/-o size=\1/')" 1.342 -free=$(busybox free | busybox awk '/Mem:/ { print int(($4*100)/$3) }') 1.343 -umount /proc 1.344 -[ -n "$size" ] || size="-o size=90%" 1.345 -echo "exec /sbin/init" > /run/init 1.346 -if [ $free -lt 100 ] || ! mount -t tmpfs $size tmpfs /mnt; then 1.347 - echo -e "\\033[70G[ \\033[1;33mSkipped\\033[0;39m]" 1.348 - exit 1.349 -fi 1.350 -for i in $(ls -ar /); do 1.351 - case "$i" in 1.352 - .|..) ;; 1.353 - mnt) mkdir /mnt/mnt;; 1.354 - usr|var) mv /$i /mnt ;; 1.355 - *) if ! cp -a /$i /mnt 2> /dev/null; then 1.356 - failed 1.357 - umount /mnt 1.358 - exit 1.359 - fi;; 1.360 - esac 1.361 +l=0 1.362 +mod squashfs 1.363 +r= 1.364 +got isofs || for i in /mnt$p/rootfs?*.gz 1.365 +do fs=${i#*root} 1.366 + r=$r:/mnt/.$fs 1.367 + mkdir -p /mnt/.rw/mnt/.$fs /mnt/.$fs 1.368 + losetup $o /dev/loop$l $i 1.369 + mount -o ro -t squashfs /dev/loop$((l++)) /mnt/.$fs 1.370 done 1.371 -launch_init 1.372 -fi 1.373 +mod aufs 1.374 +mount -t aufs -o br=$br${r:-:$c} none /mnt 1.375 +quit