slitaz-arm annotate rpi/piboot @ rev 123
rpiboot: fix log file name
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Mon Apr 21 09:13:53 2014 +0000 (2014-04-21) |
parents | aa159e25968d |
children | 2bed449c8905 |
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 |
pascal@123 | 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 |
pankso@118 | 26 cmdlinearg() |
pankso@118 | 27 { |
pankso@118 | 28 grep -q $1= /proc/cmdline && sed "s/.*$1=\([^ ]*\).*/\1/" </proc/cmdline |
pankso@118 | 29 } |
pankso@118 | 30 |
pankso@118 | 31 get() |
pankso@118 | 32 { |
pankso@118 | 33 grep -sq ^$1 $2 && sed "/^$1/!d;s/$1[ :=]*//" $2 |
pankso@118 | 34 } |
pankso@118 | 35 |
pankso@118 | 36 list_entry() |
pankso@118 | 37 { |
pankso@118 | 38 n=0 |
pankso@118 | 39 while true ; do |
pankso@118 | 40 n=$(($n+1)) |
pankso@118 | 41 eval KEYWORD="\$KEYWORD_$n" |
pankso@118 | 42 eval ENTRY="\$ENTRY_$n" |
pankso@118 | 43 [ "$KEYWORD" ] || break |
pankso@118 | 44 [ "$KEYWORD" == "$default" ] && ENTRY="$ENTRY (default)" |
pankso@118 | 45 echo -n "$KEYWORD \"$ENTRY\" " |
pankso@118 | 46 done |
pankso@118 | 47 } |
pankso@118 | 48 |
pankso@118 | 49 edit_menu() |
pankso@118 | 50 { |
pankso@118 | 51 while true; do |
pankso@118 | 52 |
pankso@118 | 53 eval KERNEL="\$KERNEL_$1" |
pankso@118 | 54 eval INITRD="\$INITRD_$1" |
pankso@118 | 55 eval CMDLINE="\$CMDLINE_$1" |
pankso@118 | 56 |
pankso@118 | 57 exec 3>&1 |
pankso@118 | 58 value=$($DIALOG --clear \ |
pankso@118 | 59 --title "${edittitle:-Edit menu}" \ |
pankso@118 | 60 --ok-label "Edit" \ |
pankso@118 | 61 --cancel-label "Done" \ |
pankso@118 | 62 --menu "" 20 72 14 \ |
pankso@118 | 63 Kernel "$KERNEL" \ |
pankso@118 | 64 Initramfs "$INITRD" \ |
pankso@118 | 65 Cmdline "$CMDLINE" 2>&1 1>&3 ) |
pankso@118 | 66 retval=$? |
pankso@118 | 67 exec 3>&- |
pankso@118 | 68 |
pankso@118 | 69 case $retval in |
pankso@118 | 70 1|255) return ;; |
pankso@118 | 71 esac |
pankso@118 | 72 |
pankso@118 | 73 exec 3>&1 |
pankso@118 | 74 case $value in |
pankso@118 | 75 Kernel) |
pankso@118 | 76 data=$($DIALOG --clear --title "Select the kernel" \ |
pankso@118 | 77 --fselect "$mnt/$KEYWORD/$KERNEL" 10 72 2>&1 1>&3) ;; |
pankso@118 | 78 Initramfs) |
pankso@118 | 79 data=$($DIALOG --clear --title "Select the initramfs" \ |
pankso@118 | 80 --fselect "$mnt/$KEYWORD/$INITRD" 10 72 2>&1 1>&3) ;; |
pankso@118 | 81 Cmdline) |
pankso@118 | 82 data=$($DIALOG --clear --title "Edit $value" \ |
pankso@118 | 83 --inputbox "Cmdline" 20 72 2>&1 "$CMDLINE" 1>&3) ;; |
pankso@118 | 84 esac |
pankso@118 | 85 retval=$? |
pankso@118 | 86 exec 3>&- |
pankso@118 | 87 |
pankso@118 | 88 case $retval in |
pankso@118 | 89 1|255) continue ;; |
pankso@118 | 90 esac |
pankso@118 | 91 |
pankso@118 | 92 case $value in |
pankso@118 | 93 Kernel) [ -f $data ] && eval KERNEL_$1=\$data ;; |
pankso@118 | 94 Initramfs) [ -f $data ] && eval INITRD_$1=\$data ;; |
pankso@118 | 95 Cmdline) eval CMDLINE_$1=\$data ;; |
pankso@118 | 96 esac |
pankso@118 | 97 done |
pankso@118 | 98 } |
pankso@118 | 99 |
pankso@118 | 100 web_boot_entry() |
pankso@118 | 101 { |
pankso@118 | 102 [ "$USING_WEBBOOT" == "1" ] || |
pankso@118 | 103 echo -n 'WebBoot "boot from Internet"' |
pankso@118 | 104 } |
pankso@118 | 105 |
pankso@118 | 106 web_boot() |
pankso@118 | 107 { |
pankso@118 | 108 USING_WEBBOOT=1 |
pankso@118 | 109 [ -s $mnt/network.conf ] && cp $mnt/network.conf /etc |
pankso@118 | 110 /etc/init.d/network.sh start |
pankso@118 | 111 webpath=$(get webpath $mnt/menu.txt) |
pankso@118 | 112 [ "$webpath" ] || webpath=http://mirror.slitaz.org/pxe/arm/boot.php |
pankso@118 | 113 wget -O /root/webboot.sh $webpath 2>&1 > /dev/null |
pankso@118 | 114 [ -s /root/webboot.sh ] || return |
pankso@118 | 115 . /root/webboot.sh |
pankso@118 | 116 webprefix=$(dirname $webpath) |
pankso@118 | 117 editbutton="" |
pankso@118 | 118 } |
pankso@118 | 119 |
pankso@118 | 120 : ${DIALOG=dialog} |
pankso@118 | 121 |
pankso@118 | 122 mount -t proc proc /proc |
pankso@118 | 123 BOOTDEV=$(cmdlinearg bootdev) |
pankso@118 | 124 mnt=/mnt |
pankso@118 | 125 mount -t devtmpfs /dev /dev |
pankso@118 | 126 |
pankso@118 | 127 # A dirty hack: why devtmpfs does not mount ? |
pankso@118 | 128 # pankso@20140421: It mount fine on my side |
pankso@118 | 129 [ -b /dev/mmcblk0p1 ] || mknod -m 660 /dev/mmcblk0p1 b 179 1 |
pankso@118 | 130 |
pankso@118 | 131 mount -r /dev/${BOOTDEV:-mmcblk0p1} $mnt |
pankso@118 | 132 umount /dev |
pankso@118 | 133 |
pankso@118 | 134 |
pankso@118 | 135 # Get global variables |
pankso@118 | 136 |
pankso@118 | 137 title=$(get title $mnt/menu.txt) |
pankso@118 | 138 subtitle=$(get subtitle $mnt/menu.txt) |
pankso@118 | 139 |
pankso@118 | 140 timeout=$(get timeout $mnt/menu.txt) |
pankso@118 | 141 timeout=${timeout:-30} |
pankso@118 | 142 |
pankso@118 | 143 default=$(get default $mnt/menu.txt) |
pankso@118 | 144 |
pankso@118 | 145 editbutton='--extra-button --extra-label "Edit"' |
pankso@118 | 146 grep -qs ^noedit i$mnt/menu.txt && editbutton= |
pankso@118 | 147 |
pankso@118 | 148 kmap=$(get kmap $mnt/menu.txt) |
pankso@118 | 149 [ "$kmap" ] && ! loadkeys $kmap && loadkmap < /usr/share/kmap/$kmap.kmap |
pankso@118 | 150 |
pankso@118 | 151 edittitle=$(get edittitle $mnt/menu.txt) |
pankso@118 | 152 |
pankso@118 | 153 |
pankso@118 | 154 # Get OS variables |
pankso@118 | 155 |
pankso@118 | 156 n=0 |
pankso@118 | 157 for i in $mnt/*/ ; do |
pankso@118 | 158 grep -qs ^kernel $i/config.txt || continue |
pankso@118 | 159 n=$(($n+1)) |
pankso@118 | 160 eval KERNEL_$n="\$(get kernel \$i/config.txt)" |
pankso@118 | 161 eval INITRD_$n="\$(get initramfs \$i/config.txt)" |
pankso@118 | 162 eval CMDLINE_$n="\$(cat \$i/cmdline.txt)" |
pankso@118 | 163 eval KEYWORD_$n="\$(basename \$i)" |
pankso@118 | 164 eval ENTRY_$n="\$(get entry \$i/menu.txt)" |
pankso@118 | 165 done |
pankso@118 | 166 |
pankso@118 | 167 |
pankso@118 | 168 # Main loop |
pankso@118 | 169 |
pankso@118 | 170 while true; do |
pankso@118 | 171 |
pankso@118 | 172 exec 3>&1 |
pankso@118 | 173 value=$(sh 2>&1 1>&3 <<EOT |
pankso@118 | 174 $DIALOG --clear \ |
pankso@118 | 175 --title "${title:-Boot menu}" \ |
pankso@118 | 176 $editbutton \ |
pankso@118 | 177 --ok-label "Boot" \ |
pankso@118 | 178 --cancel-label "Halt" \ |
pankso@118 | 179 --timeout $timeout \ |
pankso@118 | 180 --menu "${subtitle:-Default boot in $timeout seconds}" 20 72 14 \ |
pankso@118 | 181 $(list_entry) $(web_boot_entry) \ |
pankso@118 | 182 Continue "Execute SliTaz boot sequence" |
pankso@118 | 183 EOT |
pankso@118 | 184 ) |
pankso@118 | 185 retval=$? |
pankso@118 | 186 exec 3>&- |
pankso@118 | 187 |
pankso@118 | 188 n=0 |
pankso@118 | 189 while true; do |
pankso@118 | 190 n=$(($n+1)) |
pankso@118 | 191 eval KEYWORD="\$KEYWORD_$n" |
pankso@118 | 192 [ "$KEYWORD" ] || break |
pankso@118 | 193 [ "$KEYWORD" == "$value" ] && break |
pankso@118 | 194 case $value in |
pankso@118 | 195 *timeout) [ "$KEYWORD" == "$default" ] && break ;; |
pankso@118 | 196 esac |
pankso@118 | 197 done |
pankso@118 | 198 |
pankso@118 | 199 case $retval in |
pankso@118 | 200 0) |
pankso@118 | 201 case "$value" in |
pankso@118 | 202 *WebBoot) web_boot ;; |
pankso@118 | 203 *) break ;; |
pankso@118 | 204 esac ;; |
pankso@118 | 205 1|255) |
pankso@118 | 206 case "$value" in |
pankso@118 | 207 *timeout) break ;; |
pankso@118 | 208 esac |
pankso@118 | 209 umount $mnt |
pankso@118 | 210 umount /proc |
pankso@118 | 211 poweroff -f ;; |
pankso@118 | 212 3) |
pankso@118 | 213 [ "$KEYWORD" ] && edit_menu $n ;; |
pankso@118 | 214 esac |
pankso@118 | 215 done |
pankso@118 | 216 |
pankso@118 | 217 |
pankso@118 | 218 # Start OS |
pankso@118 | 219 |
pankso@118 | 220 case "$KEYWORD" in |
pankso@118 | 221 |
pankso@118 | 222 ''|Continue) |
pankso@118 | 223 umount $mnt |
pankso@118 | 224 umount /proc |
pankso@118 | 225 exec /init ;; |
pankso@118 | 226 |
pankso@118 | 227 *) |
pankso@118 | 228 eval KERNEL="\$KERNEL_$n" |
pankso@118 | 229 eval INITRD="\$INITRD_$n" |
pankso@118 | 230 eval CMDLINE="\$CMDLINE_$n" |
pankso@118 | 231 |
pankso@118 | 232 if [ "$webprefix" ]; then |
pankso@118 | 233 cd /root |
pankso@118 | 234 wget $webprefix/$KEYWORD/$KERNEL |
pankso@118 | 235 wget $webprefix/$KEYWORD/$INITRD |
pankso@118 | 236 else |
pankso@118 | 237 cd $mnt/$KEYWORD |
pankso@118 | 238 cp $KERNEL $INITRD /root |
pankso@118 | 239 cd /root |
pankso@118 | 240 fi |
pankso@118 | 241 [ "$INITRD" ] && INITRD="--initrd $(basename $INITRD)" |
pankso@118 | 242 [ "$CMDLINE" ] && CMDLINE="--command-line \"$CMDLINE\"" |
pankso@118 | 243 |
pankso@118 | 244 kexec -l $(basename $KERNEL) $INITRD $CMDLINE --atags |
pankso@118 | 245 umount $mnt |
pankso@118 | 246 umount /proc |
pankso@118 | 247 kexec -e ;; |
pankso@118 | 248 |
pankso@118 | 249 esac |