slitaz-arm annotate rpi/piboot @ rev 192

Add tazbian
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Nov 15 23:40:30 2014 +0100 (2014-11-15)
parents eef9bf1725b1
children 4e701eef29cb
rev   line source
pankso@118 1 #!/bin/sh
pankso@118 2 #
pankso@118 3 # /sbin/piboot: SliTaz Raspberry Pi bootloader and web boot!
pankso@118 4 #
pankso@118 5 # (C) 2014 SliTaz GNU/Linux - ...
pankso@118 6 #
pascal@123 7 # usage: insert 'rdinit=/sbin/piboot' (if you load an initramfs)
pascal@123 8 # or 'init=/sbin/piboot' in the kernel command line /boot/cmdline.txt
pascal@123 9 #
pankso@118 10 # AUTHORS: Pascal Bellard <pascal.bellard@slitaz.org>
pankso@118 11 #
pankso@118 12
pankso@118 13 # Check for depends ...
pascal@123 14 LOG=/var/log/$(basename $0).log
pankso@161 15 mv -f $LOG $LOG.0 >/dev/null
pankso@118 16 while read file pkg ; do
pankso@118 17 [ "$(which $file)" ] && continue
pascal@123 18 echo "Can't find $file. Please install $pkg." >> $LOG
pankso@118 19 done <<EOT
pankso@118 20 kexec kexec-tools
pankso@118 21 dialog dialog
pankso@118 22 EOT
pascal@123 23 [ -s $LOG ] && exec /init
pankso@118 24
pankso@118 25 cmdlinearg()
pankso@118 26 {
pankso@118 27 grep -q $1= /proc/cmdline && sed "s/.*$1=\([^ ]*\).*/\1/" </proc/cmdline
pankso@118 28 }
pankso@118 29
pankso@118 30 get()
pankso@118 31 {
pankso@118 32 grep -sq ^$1 $2 && sed "/^$1/!d;s/$1[ :=]*//" $2
pankso@118 33 }
pankso@118 34
pankso@118 35 list_entry()
pankso@118 36 {
pankso@118 37 n=0
pankso@118 38 while true ; do
pankso@118 39 n=$(($n+1))
pankso@118 40 eval KEYWORD="\$KEYWORD_$n"
pankso@118 41 eval ENTRY="\$ENTRY_$n"
pankso@118 42 [ "$KEYWORD" ] || break
pankso@118 43 [ "$KEYWORD" == "$default" ] && ENTRY="$ENTRY (default)"
pankso@118 44 echo -n "$KEYWORD \"$ENTRY\" "
pankso@118 45 done
pankso@118 46 }
pankso@118 47
pankso@118 48 edit_menu()
pankso@118 49 {
pankso@118 50 while true; do
pankso@118 51
pankso@118 52 eval KERNEL="\$KERNEL_$1"
pankso@118 53 eval INITRD="\$INITRD_$1"
pankso@118 54 eval CMDLINE="\$CMDLINE_$1"
pankso@118 55
pankso@118 56 exec 3>&1
pankso@118 57 value=$($DIALOG --clear \
pankso@118 58 --title "${edittitle:-Edit menu}" \
pankso@118 59 --ok-label "Edit" \
pankso@118 60 --cancel-label "Done" \
pankso@118 61 --menu "" 20 72 14 \
pankso@118 62 Kernel "$KERNEL" \
pankso@118 63 Initramfs "$INITRD" \
pankso@118 64 Cmdline "$CMDLINE" 2>&1 1>&3 )
pankso@118 65 retval=$?
pankso@118 66 exec 3>&-
pankso@118 67
pankso@118 68 case $retval in
pankso@118 69 1|255) return ;;
pankso@118 70 esac
pankso@118 71
pankso@118 72 exec 3>&1
pankso@118 73 case $value in
pankso@118 74 Kernel)
pankso@118 75 data=$($DIALOG --clear --title "Select the kernel" \
pankso@118 76 --fselect "$mnt/$KEYWORD/$KERNEL" 10 72 2>&1 1>&3) ;;
pankso@118 77 Initramfs)
pankso@118 78 data=$($DIALOG --clear --title "Select the initramfs" \
pankso@118 79 --fselect "$mnt/$KEYWORD/$INITRD" 10 72 2>&1 1>&3) ;;
pankso@118 80 Cmdline)
pankso@118 81 data=$($DIALOG --clear --title "Edit $value" \
pankso@118 82 --inputbox "Cmdline" 20 72 2>&1 "$CMDLINE" 1>&3) ;;
pankso@118 83 esac
pankso@118 84 retval=$?
pankso@118 85 exec 3>&-
pankso@118 86
pankso@118 87 case $retval in
pankso@118 88 1|255) continue ;;
pankso@118 89 esac
pankso@118 90
pankso@118 91 case $value in
pankso@118 92 Kernel) [ -f $data ] && eval KERNEL_$1=\$data ;;
pankso@118 93 Initramfs) [ -f $data ] && eval INITRD_$1=\$data ;;
pankso@118 94 Cmdline) eval CMDLINE_$1=\$data ;;
pankso@118 95 esac
pankso@118 96 done
pankso@118 97 }
pankso@118 98
pankso@118 99 web_boot_entry()
pankso@118 100 {
pankso@118 101 [ "$USING_WEBBOOT" == "1" ] ||
pankso@118 102 echo -n 'WebBoot "boot from Internet"'
pankso@118 103 }
pankso@118 104
pankso@118 105 web_boot()
pankso@118 106 {
pankso@118 107 USING_WEBBOOT=1
pankso@118 108 [ -s $mnt/network.conf ] && cp $mnt/network.conf /etc
pankso@118 109 /etc/init.d/network.sh start
pankso@118 110 webpath=$(get webpath $mnt/menu.txt)
pankso@118 111 [ "$webpath" ] || webpath=http://mirror.slitaz.org/pxe/arm/boot.php
pascal@192 112 for url in ${webpath//,/ }; do
pascal@192 113 wget -O /root/webboot.sh \
pascal@192 114 $url?mac=$(cat /sys/class/net/eth0/address) 2>&1 > /dev/null
pascal@192 115 [ -s /root/webboot.sh ] || continue
pascal@192 116 . /root/webboot.sh
pascal@192 117 webprefix=$(dirname $url)
pascal@192 118 editbutton=""
pascal@192 119 break
pascal@192 120 done
pankso@118 121 }
pankso@118 122
pascal@191 123 web_get()
pascal@191 124 {
pascal@191 125 case "$1" in
pascal@191 126 *torrent) # See http://sl-lab.it/dokuwiki/doku.php/tesi:boottorrent_en
pascal@191 127 [ -z "$(which aria2)" ] &&
pascal@191 128 echo "Can't find aria2." >> $LOG &&
pascal@191 129 exec /init
pascal@191 130
pascal@191 131 wget -O /root/webboot.torrent $1
pascal@191 132 aria2c --enable-dht=false --disable-ipv6=true --seed-time=0 \
pascal@191 133 --file-allocation=none -j5 /root/webboot.torrent
pascal@191 134
pascal@191 135 if ls | grep -q rootfs; then
pascal@191 136 file=$(ls | grep -q rootfs)
pascal@191 137 cat $file >> $2
pascal@191 138 rm -f $file
pascal@191 139 else
pascal@191 140 mv $(ls *mage* *linu* 2> /dev/null) $2
pascal@191 141 fi
pascal@191 142 rm -f /root/webboot.torrent ;;
pascal@191 143 *)
pascal@191 144 wget -O - $1 >> $2
pascal@191 145 esac
pascal@191 146 }
pascal@191 147
pankso@118 148 : ${DIALOG=dialog}
pankso@118 149
pankso@118 150 mount -t proc proc /proc
pascal@191 151 mount -t sysfs sys /sys
pankso@118 152 BOOTDEV=$(cmdlinearg bootdev)
pankso@118 153 mnt=/mnt
pankso@118 154 mount -t devtmpfs /dev /dev
pankso@118 155
pankso@118 156 # A dirty hack: why devtmpfs does not mount ?
pankso@118 157 # pankso@20140421: It mount fine on my side
pankso@118 158 [ -b /dev/mmcblk0p1 ] || mknod -m 660 /dev/mmcblk0p1 b 179 1
pankso@118 159
pankso@118 160 mount -r /dev/${BOOTDEV:-mmcblk0p1} $mnt
pankso@118 161 umount /dev
pankso@118 162
pankso@118 163
pankso@118 164 # Get global variables
pankso@118 165
pankso@118 166 title=$(get title $mnt/menu.txt)
pankso@118 167 subtitle=$(get subtitle $mnt/menu.txt)
pankso@118 168
pankso@118 169 timeout=$(get timeout $mnt/menu.txt)
pankso@118 170 timeout=${timeout:-30}
pankso@118 171
pankso@118 172 default=$(get default $mnt/menu.txt)
pankso@118 173
pankso@118 174 editbutton='--extra-button --extra-label "Edit"'
pankso@118 175 grep -qs ^noedit i$mnt/menu.txt && editbutton=
pankso@118 176
pankso@118 177 kmap=$(get kmap $mnt/menu.txt)
pankso@118 178 [ "$kmap" ] && ! loadkeys $kmap && loadkmap < /usr/share/kmap/$kmap.kmap
pankso@118 179
pankso@118 180 edittitle=$(get edittitle $mnt/menu.txt)
pankso@118 181
pankso@118 182
pankso@118 183 # Get OS variables
pankso@118 184
pankso@118 185 n=0
pankso@118 186 for i in $mnt/*/ ; do
pankso@118 187 grep -qs ^kernel $i/config.txt || continue
pankso@118 188 n=$(($n+1))
pankso@118 189 eval KERNEL_$n="\$(get kernel \$i/config.txt)"
pankso@118 190 eval INITRD_$n="\$(get initramfs \$i/config.txt)"
pankso@118 191 eval CMDLINE_$n="\$(cat \$i/cmdline.txt)"
pankso@118 192 eval KEYWORD_$n="\$(basename \$i)"
pankso@118 193 eval ENTRY_$n="\$(get entry \$i/menu.txt)"
pankso@118 194 done
pankso@118 195
pankso@118 196
pankso@118 197 # Main loop
pankso@118 198
pankso@118 199 while true; do
pankso@118 200
pankso@118 201 exec 3>&1
pankso@118 202 value=$(sh 2>&1 1>&3 <<EOT
pankso@118 203 $DIALOG --clear \
pankso@118 204 --title "${title:-Boot menu}" \
pankso@118 205 $editbutton \
pankso@118 206 --ok-label "Boot" \
pankso@118 207 --cancel-label "Halt" \
pankso@118 208 --timeout $timeout \
pankso@118 209 --menu "${subtitle:-Default boot in $timeout seconds}" 20 72 14 \
pankso@118 210 $(list_entry) $(web_boot_entry) \
pankso@118 211 Continue "Execute SliTaz boot sequence"
pankso@118 212 EOT
pankso@118 213 )
pankso@118 214 retval=$?
pankso@118 215 exec 3>&-
pankso@118 216
pankso@118 217 n=0
pankso@118 218 while true; do
pankso@118 219 n=$(($n+1))
pankso@118 220 eval KEYWORD="\$KEYWORD_$n"
pankso@118 221 [ "$KEYWORD" ] || break
pankso@118 222 [ "$KEYWORD" == "$value" ] && break
pankso@118 223 case $value in
pankso@118 224 *timeout) [ "$KEYWORD" == "$default" ] && break ;;
pankso@118 225 esac
pankso@118 226 done
pankso@118 227
pankso@118 228 case $retval in
pankso@118 229 0)
pankso@118 230 case "$value" in
pankso@118 231 *WebBoot) web_boot ;;
pankso@118 232 *) break ;;
pankso@118 233 esac ;;
pankso@118 234 1|255)
pankso@118 235 case "$value" in
pankso@118 236 *timeout) break ;;
pankso@118 237 esac
pankso@118 238 umount $mnt
pascal@191 239 umount /sys
pankso@118 240 umount /proc
pankso@118 241 poweroff -f ;;
pankso@118 242 3)
pankso@118 243 [ "$KEYWORD" ] && edit_menu $n ;;
pankso@118 244 esac
pankso@118 245 done
pankso@118 246
pankso@118 247
pankso@118 248 # Start OS
pankso@118 249
pankso@118 250 case "$KEYWORD" in
pankso@118 251
pankso@118 252 ''|Continue)
pascal@191 253 KEXEC= ;;
pankso@118 254
pankso@118 255 *)
pankso@118 256 eval KERNEL="\$KERNEL_$n"
pankso@118 257 eval INITRD="\$INITRD_$n"
pankso@118 258 eval CMDLINE="\$CMDLINE_$n"
pankso@118 259
pankso@118 260 if [ "$webprefix" ]; then
pankso@118 261 cd /root
pascal@191 262 web_get $webprefix/$KEYWORD/$KERNEL vmlinuz
pascal@191 263 KERNEL=vmlinuz
pascal@124 264 for i in ${INITRD//,/ }; do
pascal@191 265 web_get $webprefix/$KEYWORD/$i rootfs.gz
pascal@191 266 n=$(stat -c %s rootfs.gz)
pascal@124 267 n=$(($n % 4))
pascal@124 268 [ $n -eq 0 ] && continue
pascal@191 269 dd if=/dev/zero bs=1 count=$((4 - $n)) >> rootfs.gz
pascal@124 270 done
pankso@118 271 else
pankso@118 272 cd $mnt/$KEYWORD
pascal@124 273 cp $KERNEL /root
pascal@124 274 for i in ${INITRD//,/ }; do
pascal@124 275 cat $i >> /root/rootfs.gz
pascal@124 276 n=$(stat -c %s /root/rootfs.gz)
pascal@124 277 n=$(($n % 4))
pascal@124 278 [ $n -eq 0 ] && continue
pascal@124 279 dd if=/dev/zero bs=1 count=$((4 - $n)) >> /root/rootfs.gz
pascal@124 280 done
pankso@118 281 cd /root
pankso@118 282 fi
pascal@124 283 [ "$INITRD" ] && INITRD="--initrd rootfs.gz"
pankso@118 284 [ "$CMDLINE" ] && CMDLINE="--command-line \"$CMDLINE\""
pankso@118 285
pankso@118 286 kexec -l $(basename $KERNEL) $INITRD $CMDLINE --atags
pascal@191 287 KEXEC="kexec -e" ;;
pankso@118 288
pankso@118 289 esac
pascal@191 290
pascal@191 291 umount $mnt
pascal@191 292 umount /sys
pascal@191 293 umount /proc
pascal@191 294 $KEXEC
pascal@191 295 exec /init