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