slitaz-boot-scripts annotate init @ 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 |
rev | line source |
---|---|
pascal@276 | 1 #!/bin/sh |
pascal@276 | 2 |
pascal@314 | 3 fail() |
pascal@278 | 4 { |
pascal@314 | 5 echo -e '\033[70G[ \033[1;3'${1:-1mFailed}'\033[0;39m ]' |
pascal@278 | 6 } |
pascal@278 | 7 |
pascal@314 | 8 quit() |
pascal@276 | 9 { |
pascal@314 | 10 [ -d /mnt$4/etc ] || return |
pascal@314 | 11 mount /mnt -o remount,ro |
pascal@314 | 12 mount --move /run /mnt/${1:-run} |
pascal@314 | 13 cat>/run/init<<EOT |
pascal@314 | 14 $2 |
pascal@314 | 15 x=/sbin/switch_root |
pascal@314 | 16 [ -x \$x ] && exec \$x mnt $3 /sbin/init |
pascal@276 | 17 EOT |
pascal@314 | 18 fail 2mDone |
pascal@314 | 19 exit |
pascal@276 | 20 } |
pascal@276 | 21 |
pascal@314 | 22 arg() |
pascal@276 | 23 { |
pascal@314 | 24 grep -q $1 /proc/cmdline |
pascal@276 | 25 } |
pascal@276 | 26 |
pascal@314 | 27 got() |
pascal@276 | 28 { |
pascal@314 | 29 arg $1= && root="$(sed "s/.*$1=\([^ ]*\).*/\1/" </proc/cmdline)" |
pascal@276 | 30 } |
pascal@276 | 31 |
pascal@314 | 32 msg() |
pascal@276 | 33 { |
pascal@314 | 34 echo "Switching / to $1 ..." |
pascal@276 | 35 } |
pascal@276 | 36 |
pascal@314 | 37 use() |
pascal@276 | 38 { |
pascal@314 | 39 got $1 && echo msg "$1 $root" |
pascal@276 | 40 } |
pascal@276 | 41 |
pascal@314 | 42 mnt() |
pascal@276 | 43 { |
pascal@314 | 44 r=${root#/dev/} |
pascal@314 | 45 r=/dev/${r%%/*} |
pascal@314 | 46 d=${root#*$r} |
pascal@314 | 47 mount $r $1 && return |
pascal@314 | 48 w=$(cat /sys/module/usb_storage/parameters/delay_use) |
pascal@314 | 49 w=$((1+${w:-2})) |
pascal@314 | 50 echo -n "Sleep $w seconds..." |
pascal@314 | 51 sleep $w |
pascal@314 | 52 mount $r $1 |
pascal@314 | 53 } |
pascal@314 | 54 |
pascal@314 | 55 mod() |
pascal@314 | 56 { |
pascal@314 | 57 modprobe $1 2>/dev/null || insmod $(find /lib/modules|sed "/$1.ko/!dq") |
pascal@314 | 58 } |
pascal@314 | 59 |
pascal@314 | 60 tryinit() |
pascal@314 | 61 { |
pascal@314 | 62 if [ ! -d /mnt/etc ] && got cryptoroot |
pascal@314 | 63 then mod dm-mod |
pascal@314 | 64 mod dm-crypt |
pascal@314 | 65 mod aes-i586 |
pascal@314 | 66 d=${root#/dev/} |
pascal@314 | 67 l=crypto-$d |
pascal@314 | 68 if cryptsetup isLuks $root 2>/dev/null; then |
pascal@314 | 69 cryptsetup luksOpen $root $l |
pascal@314 | 70 else |
pascal@314 | 71 read -st 60 -p "Pass phrase : " p |
pascal@314 | 72 k=$(echo $p|hashalot -x -n 32 sha512) |
pascal@314 | 73 echo 0 $(cat $(find /sys/block|grep /$d/size))\ |
pascal@314 | 74 crypt aes-plain $k 0 $root 0|dmsetup create $l |
pascal@314 | 75 fi |
pascal@314 | 76 mount /dev/mapper/$l /mnt |
pascal@314 | 77 fi |
pascal@314 | 78 got subroot && return |
pascal@314 | 79 got loopfs && return |
pascal@314 | 80 if [ -d /mnt/etc ] |
pascal@314 | 81 then for i in $@; do cp -a $i /mnt$(dirname $i); done |
pascal@314 | 82 quit |
pascal@314 | 83 fi |
pascal@314 | 84 fail |
pascal@314 | 85 } |
pascal@314 | 86 |
pascal@314 | 87 trylvm() |
pascal@314 | 88 { |
pascal@314 | 89 use lvmroot || return |
pascal@314 | 90 mod dm-mod |
pascal@314 | 91 vgscan --ignorelockingfailure |
pascal@314 | 92 vgchange -ay --ignorelockingfailure |
pascal@314 | 93 mount /dev/mapper/$root /mnt |
pascal@314 | 94 tryinit /dev/mapper $1 |
pascal@314 | 95 } |
pascal@314 | 96 |
pascal@314 | 97 ldraid() |
pascal@314 | 98 { |
pascal@314 | 99 while read l |
pascal@314 | 100 do case "$l" in |
pascal@314 | 101 *raid10*) mod raid10;; |
pascal@314 | 102 *raid0*) mod raid0;; |
pascal@314 | 103 *raid1*) mod raid1;; |
pascal@314 | 104 *raid*) mod raid456;; |
pascal@314 | 105 *mirror*) mod dm-mirror |
pascal@314 | 106 esac |
pascal@276 | 107 done |
pascal@276 | 108 } |
pascal@276 | 109 |
pascal@314 | 110 if [ "$1" != "log" ] |
pascal@314 | 111 then mount -t proc proc /proc |
pascal@314 | 112 mount -t sysfs sys /sys |
pascal@310 | 113 mount -t tmpfs tmpfs /run |
pascal@314 | 114 x=/sbin/init; echo "[ -x $x ] && exec $x" >/run/init |
pascal@314 | 115 $0 log 2>&1 | tee /run/boot.log |
pascal@314 | 116 umount /proc |
pascal@314 | 117 umount /sys |
pascal@310 | 118 . /run/init |
pascal@314 | 119 sh |
pascal@314 | 120 fi |
pascal@314 | 121 ln -s "$(sed '/name/!ds/.*:[^a-z]*//' /proc/sys/dev/cdrom/info)" /dev/cdrom |
pascal@314 | 122 if use dmraid |
pascal@314 | 123 then dmraid -s|sed '/^type/!ds/.*: *//'|ldraid |
pascal@314 | 124 [ ${root:0:4} = /dev ] || |
pascal@314 | 125 root=/dev/mapper/$(dmraid -s|sed '/^name/!ds/.*: *//')p${root#p} |
pascal@314 | 126 dmraid -ay |
pascal@314 | 127 fi |
pascal@314 | 128 if use softraid |
pascal@314 | 129 then mdadm -E -s -c partitions>/etc/mdadm.conf |
pascal@314 | 130 grep -qs " $root " /etc/mdadm.conf || |
pascal@314 | 131 root=$(awk '/dev.md/{print $2;exit}'</etc/mdadm.conf) |
pascal@314 | 132 grep level=raid /etc/mdadm.conf|ldraid |
pascal@314 | 133 for i in 1 2 3 4 5 6 7 8 9 |
pascal@314 | 134 do sleep $i |
pascal@314 | 135 mdadm -A -s |
pascal@314 | 136 grep -qs ': act' /proc/mdstat && break |
pascal@314 | 137 done |
pascal@314 | 138 trylvm /etc/mdadm.conf |
pascal@314 | 139 fi |
pascal@314 | 140 trylvm |
pascal@314 | 141 if got mount |
pascal@314 | 142 then dev=$root |
pascal@314 | 143 root=$(blkid|grep $root|sed 's/:.*//;q') |
pascal@314 | 144 [ "$dev" = "$root" ] || dev="$root ($dev)" |
pascal@314 | 145 echo "Mount $dev..." |
pascal@314 | 146 mnt /mnt |
pascal@314 | 147 arg posixovl && echo "And posixovl..." && mount.posixovl /mnt |
pascal@314 | 148 fi |
pascal@314 | 149 got loopfs && echo "Into file $root..." && |
pascal@314 | 150 losetup /dev/loop0 /mnt/$root && mount /dev/loop0 /mnt |
pascal@314 | 151 got bindfs && echo "Bind ${root/,/ to } ..." && |
pascal@314 | 152 mount --bind /mnt/${root%,*} /mnt/${root/,//} |
pascal@314 | 153 arg cryptoroot= && tryinit |
pascal@314 | 154 if use subroot |
pascal@314 | 155 then cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so /usr/sbin/chroot | sed\ |
pascal@314 | 156 's|.*=> \(/lib/l[^ ]*\).*|\1|;/^\//!d') /usr/sbin/chroot /run |
pascal@314 | 157 r=$root/run |
pascal@314 | 158 quit $r "export LD_LIBRARY_PATH=$r:/lib"\ |
pascal@314 | 159 "$(cd /mnt; ls $r/ld-*) $r/chroot $root" "/$root" |
pascal@314 | 160 fi |
pascal@314 | 161 msg tmpfs |
pascal@314 | 162 root=100 |
pascal@314 | 163 got tmpram |
pascal@314 | 164 r=$root |
pascal@314 | 165 root=90% |
pascal@314 | 166 got rootfssize |
pascal@314 | 167 [ $(busybox free|busybox awk '/Mem:/{print int(($4*100)/$3)}') -ge $r ] && |
pascal@314 | 168 mount -t tmpfs -o size=$root tmpfs /mnt && |
pascal@314 | 169 for i in $(ls -ar /) |
pascal@314 | 170 do case "$i" in |
pascal@314 | 171 .*) ;; |
pascal@314 | 172 mnt|proc|sys) mkdir /mnt/$i;; |
pascal@314 | 173 usr|var|rootfs*) mv /$i /mnt;; |
pascal@314 | 174 *) cp -a /$i /mnt 2>/dev/null && continue |
pascal@314 | 175 fail |
pascal@314 | 176 umount /mnt |
pascal@314 | 177 exit |
pascal@276 | 178 esac |
pascal@314 | 179 done || fail 3mSkipped |
pascal@314 | 180 quit |
pascal@314 | 181 msg aufs |
pascal@314 | 182 br=/mnt/.rw |
pascal@314 | 183 mkdir $br |
pascal@314 | 184 got rwdev && mnt $br && br=$br$d |
pascal@314 | 185 o= |
pascal@314 | 186 p= |
pascal@314 | 187 c=/mnt/.cdrom |
pascal@314 | 188 if [ -z "$(ls /mnt/rootfs* 2>/dev/null)" ] |
pascal@314 | 189 then root=cdrom |
pascal@314 | 190 got rodev |
pascal@314 | 191 mkdir -p $c /mnt$c /mnt/.rw$c |
pascal@314 | 192 mnt $c |
pascal@314 | 193 o="-o 124" |
pascal@314 | 194 p=/.cdrom/boot |
pascal@314 | 195 d=/fs |
pascal@314 | 196 got rodir && c=$c$root |
pascal@276 | 197 fi |
pascal@314 | 198 l=0 |
pascal@314 | 199 mod squashfs |
pascal@314 | 200 r= |
pascal@314 | 201 got isofs || for i in /mnt$p/rootfs?*.gz |
pascal@314 | 202 do fs=${i#*root} |
pascal@314 | 203 r=$r:/mnt/.$fs |
pascal@314 | 204 mkdir -p /mnt/.rw/mnt/.$fs /mnt/.$fs |
pascal@314 | 205 losetup $o /dev/loop$l $i |
pascal@314 | 206 mount -o ro -t squashfs /dev/loop$((l++)) /mnt/.$fs |
pascal@276 | 207 done |
pascal@314 | 208 mod aufs |
pascal@314 | 209 mount -t aufs -o br=$br${r:-:$c} none /mnt |
pascal@314 | 210 quit |