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 |