# HG changeset patch # User Pascal Bellard # Date 1345986593 -7200 # Node ID afd4941fd37696233da651f40da490b970963164 # Parent b59d773e1de83405c9e0809c061be9722fb18282 init: add aufs support diff -r b59d773e1de8 -r afd4941fd376 init --- a/init Sat Jul 07 17:59:30 2012 +0200 +++ b/init Sun Aug 26 15:09:53 2012 +0200 @@ -1,192 +1,210 @@ #!/bin/sh -success() +fail() { - cat > /run/init - [ -d /proc/sys ] && umount /proc - echo -e "\\033[70G[ \\033[1;32mOK\\033[0;39m ]" - exit +echo -e '\033[70G[ \033[1;3'${1:-1mFailed}'\033[0;39m ]' } -launch_init() +quit() { - mount --move /run /mnt/run - success </run/init< /dev/null; then - cryptsetup luksOpen $root $dmlabel - else - read -s -t 60 -p "Pass phrase : " passphrase - key=$(echo $passphrase | hashalot -x -n 32 sha512) - blocks=$(cat $(find /sys/block | grep /$dev/size)) - echo 0 $blocks crypt aes-plain $key 0 $root 0 | \ - dmsetup create $dmlabel - fi - mount /dev/mapper/$dmlabel /mnt - fi - grep -q subroot= /proc/cmdline && return - grep -q loopfs= /proc/cmdline && return - if [ -d /mnt/etc ]; then - umount /sys - [ -n "$1" ] && for i in $@ ; do - cp -a $i /mnt$(dirname $i) - done - mount /mnt -o remount,ro - launch_init - fi - failed +arg $1= && root="$(sed "s/.*$1=\([^ ]*\).*/\1/" /dev/null || insmod $(find /lib/modules|sed "/$1.ko/!dq") +} + +tryinit() +{ +if [ ! -d /mnt/etc ] && got cryptoroot +then mod dm-mod + mod dm-crypt + mod aes-i586 + d=${root#/dev/} + l=crypto-$d + if cryptsetup isLuks $root 2>/dev/null; then + cryptsetup luksOpen $root $l + else + read -st 60 -p "Pass phrase : " p + k=$(echo $p|hashalot -x -n 32 sha512) + echo 0 $(cat $(find /sys/block|grep /$d/size))\ + crypt aes-plain $k 0 $root 0|dmsetup create $l + fi + mount /dev/mapper/$l /mnt +fi +got subroot && return +got loopfs && return +if [ -d /mnt/etc ] +then for i in $@; do cp -a $i /mnt$(dirname $i); done + quit +fi +fail +} + +trylvm() +{ +use lvmroot || return +mod dm-mod +vgscan --ignorelockingfailure +vgchange -ay --ignorelockingfailure +mount /dev/mapper/$root /mnt +tryinit /dev/mapper $1 +} + +ldraid() +{ +while read l +do case "$l" in +*raid10*) mod raid10;; +*raid0*) mod raid0;; +*raid1*) mod raid1;; +*raid*) mod raid456;; +*mirror*) mod dm-mirror +esac done } -if [ "$1" != "logged" ]; then +if [ "$1" != "log" ] +then mount -t proc proc /proc + mount -t sysfs sys /sys mount -t tmpfs tmpfs /run - /init logged 2>&1 | tee /run/boot.log + x=/sbin/init; echo "[ -x $x ] && exec $x" >/run/init + $0 log 2>&1 | tee /run/boot.log + umount /proc + umount /sys . /run/init -else -mount -t proc proc /proc -mount -t sysfs sysfs /sys -if grep -q dmraid= /proc/cmdline; then - root="$(sed 's/.*dmraid=\([^ ]*\).*/\1/' < /proc/cmdline)" - echo -n "Switching / to dmraid $root..." - dmraid -s | grep ^type | awk '{ print $3 }' | load_raid - case "$root" in - /dev/*);; - *) root=/dev/mapper/$(dmraid -s|grep ^name|awk '{print $3}')p${root#p};; + sh +fi +ln -s "$(sed '/name/!ds/.*:[^a-z]*//' /proc/sys/dev/cdrom/info)" /dev/cdrom +if use dmraid +then dmraid -s|sed '/^type/!ds/.*: *//'|ldraid + [ ${root:0:4} = /dev ] || + root=/dev/mapper/$(dmraid -s|sed '/^name/!ds/.*: *//')p${root#p} + dmraid -ay +fi +if use softraid +then mdadm -E -s -c partitions>/etc/mdadm.conf + grep -qs " $root " /etc/mdadm.conf || + root=$(awk '/dev.md/{print $2;exit}' \(/lib/l[^ ]*\).*|\1|;/^\//!d') /usr/sbin/chroot /run + r=$root/run + quit $r "export LD_LIBRARY_PATH=$r:/lib"\ + "$(cd /mnt; ls $r/ld-*) $r/chroot $root" "/$root" +fi +msg tmpfs +root=100 +got tmpram +r=$root +root=90% +got rootfssize +[ $(busybox free|busybox awk '/Mem:/{print int(($4*100)/$3)}') -ge $r ] && +mount -t tmpfs -o size=$root tmpfs /mnt && +for i in $(ls -ar /) +do case "$i" in + .*) ;; + mnt|proc|sys) mkdir /mnt/$i;; + usr|var|rootfs*) mv /$i /mnt;; + *) cp -a /$i /mnt 2>/dev/null && continue + fail + umount /mnt + exit esac - dmraid -ay - lvmsetup - mount_mapper +done || fail 3mSkipped +quit +msg aufs +br=/mnt/.rw +mkdir $br +got rwdev && mnt $br && br=$br$d +o= +p= +c=/mnt/.cdrom +if [ -z "$(ls /mnt/rootfs* 2>/dev/null)" ] +then root=cdrom + got rodev + mkdir -p $c /mnt$c /mnt/.rw$c + mnt $c + o="-o 124" + p=/.cdrom/boot + d=/fs + got rodir && c=$c$root fi -if grep -q softraid= /proc/cmdline; then - root="$(sed 's/.*softraid=\([^ ]*\).*/\1/' < /proc/cmdline)" - echo -n "Switching / to softraid $root..." - mdadm --examine --scan --config=partitions > /etc/mdadm.conf - grep -qs " $root " /etc/mdadm.conf || - root=$(awk '/dev.md/ { print $2; exit }' < /etc/mdadm.conf) - grep level=raid /etc/mdadm.conf | load_raid - for i in 1 2 3 4 5 6 7 8 9; do - sleep $i - mdadm --assemble --scan - grep -qs ': active' /proc/mdstat && break - done - lvmsetup - mount_mapper /etc/mdadm.conf -fi -if lvmsetup; then - echo -n "Switching / to lvm $root..." - mount_mapper -fi -if grep -q mount= /proc/cmdline; then - root="$(sed 's/.*mount=\([^ ]*\).*/\1/' < /proc/cmdline)" - dev=$(blkid | grep $root | sed 's/:.*//;q') - [ "$dev" = "$root" ] || root="$dev ($root)" - echo "Mounting $root ..." - if ! mount $dev /mnt; then - if echo $dev | grep -q "/dev/sd"; then - delay=`cat /sys/module/usb_storage/parameters/delay_use` - delay=$((1+$delay)) - echo -n "sleep for $delay seconds..." - sleep $delay - fi - mount $dev /mnt - fi - grep -q posixovl /proc/cmdline && - echo "Mounting posixovl.." && - mount.posixovl /mnt -fi -if grep -q loopfs= /proc/cmdline; then - loopfs="$(sed 's/.*loopfs=\([^ ]*\).*/\1/' < /proc/cmdline)" - echo "Into loop file $loopfs..." - losetup /dev/loop0 /mnt/$loopfs - mount /dev/loop0 /mnt 2> /dev/null -fi -if grep -q bindfs= /proc/cmdline; then - bind="$(sed 's/.*bindfs=\([^ ]*\).*/\1/' < /proc/cmdline)" - echo "Binding ${bind/,/ to } ..." - mount --bind /mnt/${bind%,*} /mnt/${bind%,*}/${bind#*,} -fi -grep -q cryptoroot= /proc/cmdline && try_init -umount /sys -if grep -q subroot= /proc/cmdline; then - subroot="/$(sed 's/.*subroot=\([^ ]*\).*/\1/' < /proc/cmdline)" && - echo -n "Chrooting to $subroot..." - run=$subroot/run - mount --move /run /mnt$run - cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so /usr/sbin/chroot | sed \ - 's|.*=> \(/lib/l[^ ]*\).*|\1|;/^\//!d') /usr/sbin/chroot /mnt$run - success < /run/init -if [ $free -lt 100 ] || ! mount -t tmpfs $size tmpfs /mnt; then - echo -e "\\033[70G[ \\033[1;33mSkipped\\033[0;39m]" - exit -fi -for i in $(ls -ar /); do - case "$i" in - .|..) ;; - mnt) mkdir /mnt/mnt;; - usr|var) mv /$i /mnt ;; - *) if ! cp -a /$i /mnt 2> /dev/null; then - failed - umount /mnt - exit - fi;; - esac +l=0 +mod squashfs +r= +got isofs || for i in /mnt$p/rootfs?*.gz +do fs=${i#*root} + r=$r:/mnt/.$fs + mkdir -p /mnt/.rw/mnt/.$fs /mnt/.$fs + losetup $o /dev/loop$l $i + mount -o ro -t squashfs /dev/loop$((l++)) /mnt/.$fs done -launch_init -fi +mod aufs +mount -t aufs -o br=$br${r:-:$c} none /mnt +quit