wok-next diff syslinux/stuff/iso2exe/init @ rev 17454
syslinux/iso2exe: create a vfat partition in usb bootkey (DOS case only)
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Thu Dec 18 11:42:27 2014 +0100 (2014-12-18) |
parents | a95b0be09647 |
children | 18dc23394a2c |
line diff
1.1 --- a/syslinux/stuff/iso2exe/init Wed Nov 26 13:45:57 2014 +0100 1.2 +++ b/syslinux/stuff/iso2exe/init Thu Dec 18 11:42:27 2014 +0100 1.3 @@ -2,6 +2,11 @@ 1.4 1.5 DIALOG=dialog 1.6 1.7 +ddq() 1.8 +{ 1.9 + dd $@ 2> /dev/null 1.10 +} 1.11 + 1.12 get() 1.13 { 1.14 od -j $1 -N ${3:-2} -t u${3:-2} -An $2 2> /dev/null || 1.15 @@ -28,6 +33,14 @@ 1.16 umount /proc 1.17 } 1.18 1.19 +words2bin() 1.20 +{ 1.21 + for i in $@ ; do 1.22 + printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255)) | \ 1.23 + xargs echo -en 1.24 + done 1.25 +} 1.26 + 1.27 gettazboot() 1.28 { 1.29 echo "Creating $(basename $1) ..." 1.30 @@ -36,12 +49,9 @@ 1.31 S=$((32+$L)) 1.32 P=$((($S+511)/512)) 1.33 E=$((4096-(32*$P))) 1.34 - for i in 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \ 1.35 - -2 0 256 -16 28 0x6C53 0x5469 0x7A61; do 1.36 - printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255)) | \ 1.37 - xargs echo -en 1.38 - done > $1 1.39 - dd bs=1 count=$L skip=$(echo $O) if=/mnt/$ISO >> $1 2> /dev/null 1.40 + words2bin 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \ 1.41 + -2 0 256 -16 28 0x6C53 0x5469 0x7A61 > $1 1.42 + ddq bs=1 count=$L skip=$(echo $O) if=/mnt/$ISO >> $1 1.43 } 1.44 1.45 checkmagic() 1.46 @@ -82,7 +92,7 @@ 1.47 tazusbinitfs() 1.48 { 1.49 PAD=$(($(stat -c %s $1) % 4)) 1.50 - [ $PAD -ne 0 ] && dd if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1 1.51 + [ $PAD -ne 0 ] && ddq if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1 1.52 mkdir -p /tmp/fs/etc /tmp/fs/lib /tmp/fs/home 1.53 cp -a /etc/locale.conf /tmp/fs/etc 2> /dev/null 1.54 cp -a /etc/keymap.conf /tmp/fs/etc 2> /dev/null 1.55 @@ -163,7 +173,7 @@ 1.56 arg subroot "Change root to directory" 1.57 mount.posixovl -F /mnt/\$val -- -oallow_other -odefault_permissions -osuid 1.58 mount --bind /mnt /mnt/\$val/mnt/dos 1.59 -#mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val 1.60 +mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val 1.61 LDSO=\$(ls /mnt/\$val/lib/ld-* | sed q) 1.62 export LD_LIBRARY_PATH=\$val/lib:\$val/usr/lib:/lib 1.63 [ "$debug" = "true" ] && sh 1.64 @@ -195,7 +205,7 @@ 1.65 return 1 1.66 fi 1.67 echo "Install root filesystem in /slitaz..." 1.68 - if [ -n "$1" ]; then 1.69 + if [ "$1" ]; then 1.70 if [ -d /media/cdrom/fs ]; then 1.71 ( cd /mnt/slitaz/fs; find | cpio -o -H newc ) | gzip -9 1.72 else 1.73 @@ -308,7 +318,7 @@ 1.74 cp -a /media/cdrom/fs/. / 1.75 else 1.76 for i in $(ls_r /media/cdrom/boot/rootfs*); do 1.77 - unlzma < $i | (cd / ; cpio -idmu ) 1.78 + uncpio $i 1.79 done 1.80 fi 1.81 cp /tmp/fs/etc/* /etc 1.82 @@ -394,7 +404,7 @@ 1.83 Please insert a blank disk in floppy drive.\n 1.84 " 12 70 1.85 [ $? -eq 0 ] || return 1.86 - dd if=/media/cdrom/boot/memtest of=/dev/fd0 1.87 + ddq if=/media/cdrom/boot/memtest of=/dev/fd0 1.88 } 1.89 1.90 pxe() 1.91 @@ -424,7 +434,7 @@ 1.92 Please insert a blank disk in floppy drive.\n 1.93 " 12 70 1.94 [ $? -eq 0 ] || return 1.95 - dd if=/media/cdrom/boot/?pxe of=/dev/fd0 1.96 + ddq if=/media/cdrom/boot/?pxe of=/dev/fd0 1.97 } 1.98 1.99 gotposixovl() 1.100 @@ -435,7 +445,7 @@ 1.101 1.102 xfile() 1.103 { 1.104 - [ -n "$(which $1)" ] && echo -en "\"$2\" \"$3\"" 1.105 + [ "$(which $1)" ] && echo -en "\"$2\" \"$3\"" 1.106 } 1.107 1.108 cdfile() 1.109 @@ -466,19 +476,20 @@ 1.110 Please insert a floppy in drive now.\n 1.111 " 10 70 1.112 [ $? -eq 0 ] || return 1.113 - dd if=/mnt/$ISO of=/dev/fd0 bs=1 count=512 \ 1.114 + ddq if=/mnt/$ISO of=/dev/fd0 bs=1 count=512 \ 1.115 skip=$(( $(get 66 /mnt/$ISO) - $sz )) 1.116 - echo "$ISO" | dd of=/dev/fd0 bs=512 seek=1 count=1 1.117 - dd if=/mnt/$ISO of=/dev/fd0 bs=1 count=$sz seek=2 \ 1.118 + echo "$ISO" | ddq of=/dev/fd0 bs=512 seek=1 count=1 1.119 + ddq if=/mnt/$ISO of=/dev/fd0 bs=1 count=$sz seek=2 \ 1.120 skip=$(( $(get 66 /mnt/$ISO) - $sz + 512 )) 1.121 } 1.122 1.123 usbdev() 1.124 { 1.125 + echo "Wait 5 seconds for USB devices..." 1.126 sleep 5 1.127 DEV="$(grep -l 1 /sys/block/*/removable | \ 1.128 sed 's|/sys/block/\(.*\)/removable|\1|')" 1.129 - [ -n "$DEV" ] || return 1.130 + [ "$DEV" ] || return 1.131 exec 3>&1 1.132 device=`$DIALOG --clear \ 1.133 --title " Select your USB key " \ 1.134 @@ -499,14 +510,51 @@ 1.135 --title " Create a USB boot key " \ 1.136 --yes-label "Continue" --yesno \ 1.137 "\nThe USB key will be used like a CD-ROM. You will not be able to write 1.138 -any data on it.\n\n 1.139 +any data on the boot partition.\n\n 1.140 +An extra FAT32 partition will be created with the remaining free space.\n\n 1.141 You should choose 'USB key read/write installation' to be 1.142 able to save the package updates or your own configuration and data files.\n\n 1.143 Please plug your USB stick in now.\n 1.144 -" 13 70 1.145 +" 16 70 1.146 [ $? -eq 0 ] || return 1.147 usbdev || return 1.148 - dd if=/mnt/$ISO of=$device 1.149 + 1.150 + # perform dd in progess bar 1.151 + max=$(($(stat -c %s /mnt/$ISO)/1024/1024)) 1.152 + mkfifo /tmp/fifodd 1.153 + dialog --gauge " The ISO image transfer can be long. Please wait..." \ 1.154 + 6 70 0 < /tmp/fifodd & 1.155 + i=0; ddq if=/mnt/$ISO bs=1024k | ( 1.156 + while ddq bs=1024k count=1 ; do 1.157 + i=$(($i + 1)) 1.158 + [ $i -gt $max ] && break 1.159 + echo $((($i*100)/$max)) > /tmp/fifodd 1.160 + done ) > $device 1.161 + 1.162 + # partition + fat32 format for the remining space 1.163 + od -j 466 -N 12 -t u2 -An $device | { read dx cx ol oh ll lh 1.164 + if [ $dx -eq $((0x3F17)) ]; then 1.165 + cx=$(($cx & 0xFF00)) 1.166 + ofs=$(($ll+($lh<<16))) 1.167 + n=$(($(cat /sys/block/${device#/dev/}/size)-$ofs)) 1.168 + m=$(($cx+($n/8))) 1.169 + [ $m -gt $((0x3FF00)) ] && m=$((0x3FF00)) 1.170 + m=$((($m & 0xFF00)+(($m>>16)<<6))) 1.171 + words2bin 0 $((0x101+$cx)) 0x3F0B $((32+$m)) \ 1.172 + $ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \ 1.173 + ddq bs=1 seek=446 of=$device 1.174 + if [ "$(which mkdosfs 2> /dev/null)" ]; then 1.175 + losetup -o $((512*$ofs)) /dev/loop0 $device 1.176 + mkdosfs -n "SLITAZ BOOT" /dev/loop0 1.177 + words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \ 1.178 + ddq bs=1 seek=28 of=/dev/loop0 1.179 + losetup -d /dev/loop0 1.180 + fi 1.181 + fi ; } 1.182 + 1.183 + # kill dialog --gauge 1.184 + sleep 1 1.185 + rm /tmp/fifodd 1.186 } 1.187 1.188 usbkey() 1.189 @@ -630,7 +678,7 @@ 1.190 cat > /tmp/dialog <<EOT 1.191 $DIALOG --clear \ 1.192 --title " Welcome to SliTaz " \ 1.193 - --menu "" 21 70 15 \ 1.194 + --menu "" 23 70 17 \ 1.195 $(xfile tazkeymap "tazkeymap" "Select keyboard ($keymap)") \ 1.196 $(xfile tazlocale "tazlocale" "Select locale ($locale)") \ 1.197 $(cdfile boot/bzImage "live" "SliTaz RAM boot") \