wok-next 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 | c2b42fe954b3 |
children | 18dc23394a2c |
files | syslinux/receipt syslinux/stuff/iso2exe/bootiso.S syslinux/stuff/iso2exe/init syslinux/stuff/iso2exe/iso2exe.sh |
line diff
1.1 --- a/syslinux/receipt Wed Dec 17 19:51:54 2014 +0100 1.2 +++ b/syslinux/receipt Thu Dec 18 11:42:27 2014 +0100 1.3 @@ -29,6 +29,7 @@ 1.4 sed -i 's/ifcpu64.c32/ifcpu64.c32 md5sum.c32/' com32/modules/Makefile 1.5 make clean 1.6 make all 2>&1 | sed 's/NO_WERROR=1/NO_Werror=1/;/syslinux64.exe/d' 1.7 + echo "make core: LDFLAGS=$LDFLAGS" 1.8 make -C core 1.9 make -C com32 1.10 ./isohybrid.sh --build
2.1 --- a/syslinux/stuff/iso2exe/bootiso.S Wed Dec 17 19:51:54 2014 +0100 2.2 +++ b/syslinux/stuff/iso2exe/bootiso.S Thu Dec 18 11:42:27 2014 +0100 2.3 @@ -129,11 +129,11 @@ 2.4 movw $0x100, %si 2.5 movw -126(%si), %ax 2.6 cwd // clear dx 2.7 - pushw %dx // dos exit 2.8 + pushw %dx // dos exit() 2.9 cmpb $0x2F, %al 2.10 movw $0x3000+EXESTR(help), %ax 2.11 - jbe abort 2.12 - int $0x21 2.13 + je abort 2.14 + int $0x21 // get DOS version 2.15 cmpb $3, %al 2.16 movb $EXESTR(noDOS3), %al 2.17 jb abort 2.18 @@ -172,7 +172,7 @@ 2.19 popfw // < 286 : flags[12..15] are forced 1 2.20 pushfw // = 286 : flags[12..15] are forced 0 2.21 popw %bx // > 286 : only flags[15] is forced 0 2.22 - popfw // restore flags 2.23 + popfw // restore flags (IOPL) 2.24 addb %ah, %bh // test F0 and 00 cases 2.25 cmpb %ah, %bh 2.26 movb $EXESTR(no386), %al
3.1 --- a/syslinux/stuff/iso2exe/init Wed Dec 17 19:51:54 2014 +0100 3.2 +++ b/syslinux/stuff/iso2exe/init Thu Dec 18 11:42:27 2014 +0100 3.3 @@ -2,6 +2,11 @@ 3.4 3.5 DIALOG=dialog 3.6 3.7 +ddq() 3.8 +{ 3.9 + dd $@ 2> /dev/null 3.10 +} 3.11 + 3.12 get() 3.13 { 3.14 od -j $1 -N ${3:-2} -t u${3:-2} -An $2 2> /dev/null || 3.15 @@ -28,6 +33,14 @@ 3.16 umount /proc 3.17 } 3.18 3.19 +words2bin() 3.20 +{ 3.21 + for i in $@ ; do 3.22 + printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255)) | \ 3.23 + xargs echo -en 3.24 + done 3.25 +} 3.26 + 3.27 gettazboot() 3.28 { 3.29 echo "Creating $(basename $1) ..." 3.30 @@ -36,12 +49,9 @@ 3.31 S=$((32+$L)) 3.32 P=$((($S+511)/512)) 3.33 E=$((4096-(32*$P))) 3.34 - for i in 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \ 3.35 - -2 0 256 -16 28 0x6C53 0x5469 0x7A61; do 3.36 - printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255)) | \ 3.37 - xargs echo -en 3.38 - done > $1 3.39 - dd bs=1 count=$L skip=$(echo $O) if=/mnt/$ISO >> $1 2> /dev/null 3.40 + words2bin 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \ 3.41 + -2 0 256 -16 28 0x6C53 0x5469 0x7A61 > $1 3.42 + ddq bs=1 count=$L skip=$(echo $O) if=/mnt/$ISO >> $1 3.43 } 3.44 3.45 checkmagic() 3.46 @@ -82,7 +92,7 @@ 3.47 tazusbinitfs() 3.48 { 3.49 PAD=$(($(stat -c %s $1) % 4)) 3.50 - [ $PAD -ne 0 ] && dd if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1 3.51 + [ $PAD -ne 0 ] && ddq if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1 3.52 mkdir -p /tmp/fs/etc /tmp/fs/lib /tmp/fs/home 3.53 cp -a /etc/locale.conf /tmp/fs/etc 2> /dev/null 3.54 cp -a /etc/keymap.conf /tmp/fs/etc 2> /dev/null 3.55 @@ -163,7 +173,7 @@ 3.56 arg subroot "Change root to directory" 3.57 mount.posixovl -F /mnt/\$val -- -oallow_other -odefault_permissions -osuid 3.58 mount --bind /mnt /mnt/\$val/mnt/dos 3.59 -#mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val 3.60 +mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val 3.61 LDSO=\$(ls /mnt/\$val/lib/ld-* | sed q) 3.62 export LD_LIBRARY_PATH=\$val/lib:\$val/usr/lib:/lib 3.63 [ "$debug" = "true" ] && sh 3.64 @@ -195,7 +205,7 @@ 3.65 return 1 3.66 fi 3.67 echo "Install root filesystem in /slitaz..." 3.68 - if [ -n "$1" ]; then 3.69 + if [ "$1" ]; then 3.70 if [ -d /media/cdrom/fs ]; then 3.71 ( cd /mnt/slitaz/fs; find | cpio -o -H newc ) | gzip -9 3.72 else 3.73 @@ -308,7 +318,7 @@ 3.74 cp -a /media/cdrom/fs/. / 3.75 else 3.76 for i in $(ls_r /media/cdrom/boot/rootfs*); do 3.77 - unlzma < $i | (cd / ; cpio -idmu ) 3.78 + uncpio $i 3.79 done 3.80 fi 3.81 cp /tmp/fs/etc/* /etc 3.82 @@ -394,7 +404,7 @@ 3.83 Please insert a blank disk in floppy drive.\n 3.84 " 12 70 3.85 [ $? -eq 0 ] || return 3.86 - dd if=/media/cdrom/boot/memtest of=/dev/fd0 3.87 + ddq if=/media/cdrom/boot/memtest of=/dev/fd0 3.88 } 3.89 3.90 pxe() 3.91 @@ -424,7 +434,7 @@ 3.92 Please insert a blank disk in floppy drive.\n 3.93 " 12 70 3.94 [ $? -eq 0 ] || return 3.95 - dd if=/media/cdrom/boot/?pxe of=/dev/fd0 3.96 + ddq if=/media/cdrom/boot/?pxe of=/dev/fd0 3.97 } 3.98 3.99 gotposixovl() 3.100 @@ -435,7 +445,7 @@ 3.101 3.102 xfile() 3.103 { 3.104 - [ -n "$(which $1)" ] && echo -en "\"$2\" \"$3\"" 3.105 + [ "$(which $1)" ] && echo -en "\"$2\" \"$3\"" 3.106 } 3.107 3.108 cdfile() 3.109 @@ -466,19 +476,20 @@ 3.110 Please insert a floppy in drive now.\n 3.111 " 10 70 3.112 [ $? -eq 0 ] || return 3.113 - dd if=/mnt/$ISO of=/dev/fd0 bs=1 count=512 \ 3.114 + ddq if=/mnt/$ISO of=/dev/fd0 bs=1 count=512 \ 3.115 skip=$(( $(get 66 /mnt/$ISO) - $sz )) 3.116 - echo "$ISO" | dd of=/dev/fd0 bs=512 seek=1 count=1 3.117 - dd if=/mnt/$ISO of=/dev/fd0 bs=1 count=$sz seek=2 \ 3.118 + echo "$ISO" | ddq of=/dev/fd0 bs=512 seek=1 count=1 3.119 + ddq if=/mnt/$ISO of=/dev/fd0 bs=1 count=$sz seek=2 \ 3.120 skip=$(( $(get 66 /mnt/$ISO) - $sz + 512 )) 3.121 } 3.122 3.123 usbdev() 3.124 { 3.125 + echo "Wait 5 seconds for USB devices..." 3.126 sleep 5 3.127 DEV="$(grep -l 1 /sys/block/*/removable | \ 3.128 sed 's|/sys/block/\(.*\)/removable|\1|')" 3.129 - [ -n "$DEV" ] || return 3.130 + [ "$DEV" ] || return 3.131 exec 3>&1 3.132 device=`$DIALOG --clear \ 3.133 --title " Select your USB key " \ 3.134 @@ -499,14 +510,51 @@ 3.135 --title " Create a USB boot key " \ 3.136 --yes-label "Continue" --yesno \ 3.137 "\nThe USB key will be used like a CD-ROM. You will not be able to write 3.138 -any data on it.\n\n 3.139 +any data on the boot partition.\n\n 3.140 +An extra FAT32 partition will be created with the remaining free space.\n\n 3.141 You should choose 'USB key read/write installation' to be 3.142 able to save the package updates or your own configuration and data files.\n\n 3.143 Please plug your USB stick in now.\n 3.144 -" 13 70 3.145 +" 16 70 3.146 [ $? -eq 0 ] || return 3.147 usbdev || return 3.148 - dd if=/mnt/$ISO of=$device 3.149 + 3.150 + # perform dd in progess bar 3.151 + max=$(($(stat -c %s /mnt/$ISO)/1024/1024)) 3.152 + mkfifo /tmp/fifodd 3.153 + dialog --gauge " The ISO image transfer can be long. Please wait..." \ 3.154 + 6 70 0 < /tmp/fifodd & 3.155 + i=0; ddq if=/mnt/$ISO bs=1024k | ( 3.156 + while ddq bs=1024k count=1 ; do 3.157 + i=$(($i + 1)) 3.158 + [ $i -gt $max ] && break 3.159 + echo $((($i*100)/$max)) > /tmp/fifodd 3.160 + done ) > $device 3.161 + 3.162 + # partition + fat32 format for the remining space 3.163 + od -j 466 -N 12 -t u2 -An $device | { read dx cx ol oh ll lh 3.164 + if [ $dx -eq $((0x3F17)) ]; then 3.165 + cx=$(($cx & 0xFF00)) 3.166 + ofs=$(($ll+($lh<<16))) 3.167 + n=$(($(cat /sys/block/${device#/dev/}/size)-$ofs)) 3.168 + m=$(($cx+($n/8))) 3.169 + [ $m -gt $((0x3FF00)) ] && m=$((0x3FF00)) 3.170 + m=$((($m & 0xFF00)+(($m>>16)<<6))) 3.171 + words2bin 0 $((0x101+$cx)) 0x3F0B $((32+$m)) \ 3.172 + $ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \ 3.173 + ddq bs=1 seek=446 of=$device 3.174 + if [ "$(which mkdosfs 2> /dev/null)" ]; then 3.175 + losetup -o $((512*$ofs)) /dev/loop0 $device 3.176 + mkdosfs -n "SLITAZ BOOT" /dev/loop0 3.177 + words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \ 3.178 + ddq bs=1 seek=28 of=/dev/loop0 3.179 + losetup -d /dev/loop0 3.180 + fi 3.181 + fi ; } 3.182 + 3.183 + # kill dialog --gauge 3.184 + sleep 1 3.185 + rm /tmp/fifodd 3.186 } 3.187 3.188 usbkey() 3.189 @@ -630,7 +678,7 @@ 3.190 cat > /tmp/dialog <<EOT 3.191 $DIALOG --clear \ 3.192 --title " Welcome to SliTaz " \ 3.193 - --menu "" 21 70 15 \ 3.194 + --menu "" 23 70 17 \ 3.195 $(xfile tazkeymap "tazkeymap" "Select keyboard ($keymap)") \ 3.196 $(xfile tazlocale "tazlocale" "Select locale ($locale)") \ 3.197 $(cdfile boot/bzImage "live" "SliTaz RAM boot") \
4.1 --- a/syslinux/stuff/iso2exe/iso2exe.sh Wed Dec 17 19:51:54 2014 +0100 4.2 +++ b/syslinux/stuff/iso2exe/iso2exe.sh Thu Dec 18 11:42:27 2014 +0100 4.3 @@ -26,14 +26,15 @@ 4.4 $0 --get init > $TMP/init.exe 4.5 grep -q mount.posixovl.iso2exe $TMP/init.exe && 4.6 cp /usr/sbin/mount.posixovl $TMP/bin/mount.posixovl.iso2exe \ 4.7 - 2> /dev/null && echo "Store mount.posixovl..." 4.8 + 2> /dev/null && echo "Store mount.posixovl ($(wc -c \ 4.9 + < /usr/sbin/mount.posixovl) bytes) ..." 4.10 find $TMP -type f -print0 | xargs -0 chmod +x 4.11 ( cd $TMP ; find * | cpio -o -H newc ) | \ 4.12 lzma e $TMP/rootfs.gz -si 2> /dev/null 4.13 SIZE=$(wc -c < $TMP/rootfs.gz) 4.14 store 24 $SIZE $1 4.15 OFS=$(( $OFS - $SIZE )) 4.16 - printf "Adding rootfs.gz file at %04X...\n" $OFS 4.17 + printf "Adding rootfs.gz file at %04X (%d bytes) ...\n" $OFS $SIZE 4.18 cat $TMP/rootfs.gz | ddq of=$1 bs=1 seek=$OFS conv=notrunc 4.19 rm -rf $TMP 4.20 } 4.21 @@ -41,7 +42,7 @@ 4.22 add_dosexe() 4.23 { 4.24 OFS=$((0x7EE0)) 4.25 - printf "Adding DOS/EXE at %04X...\n" $OFS 4.26 + printf "Adding DOS/EXE at %04X (%d bytes) ...\n" $OFS $((0x8000 - $OFS)) 4.27 $0 --get bootiso.bin 2> /dev/null | \ 4.28 ddq bs=1 skip=$OFS of=$1 seek=$OFS conv=notrunc 4.29 } 4.30 @@ -50,16 +51,16 @@ 4.31 { 4.32 SIZE=$($0 --get boot.com | wc -c) 4.33 OFS=$(( $OFS - $SIZE )) 4.34 - printf "Adding DOS boot file at %04X...\n" $OFS 4.35 + printf "Adding DOS boot file at %04X (%d bytes) ...\n" $OFS $SIZE 4.36 $0 --get boot.com | ddq of=$1 bs=1 seek=$OFS conv=notrunc 4.37 store 66 $(($OFS+0xC0)) $1 4.38 } 4.39 4.40 add_win32exe() 4.41 { 4.42 - printf "Adding WIN32 file at %04X...\n" 0 4.43 ddq if=/tmp/exe$$ of=$1 conv=notrunc 4.44 SIZE=$($0 --get win32.exe 2> /dev/null | tee /tmp/exe$$ | wc -c) 4.45 + printf "Adding WIN32 file at %04X (%d bytes) ...\n" 0 $SIZE 4.46 ddq if=/tmp/exe$$ of=$1 conv=notrunc 4.47 printf "Adding bootiso head at %04X...\n" 0 4.48 $0 --get bootiso.bin 2> /dev/null > /tmp/exe$$ 4.49 @@ -73,7 +74,7 @@ 4.50 store 69 $(($SIZE/512)) $1 8 4.51 store 510 $((0xAA55)) $1 4.52 rm -f /tmp/exe$$ /tmp/coff$$ 4.53 - printf "Moving syslinux hybrid boot record at %04X ...\n" $SIZE 4.54 + printf "Moving syslinux hybrid boot record at %04X (512 bytes) ...\n" $SIZE 4.55 ddq if=$2 bs=1 count=512 of=$1 seek=$SIZE conv=notrunc 4.56 OFS=$(($SIZE+512)) 4.57 } 4.58 @@ -82,13 +83,14 @@ 4.59 { 4.60 SIZE=$($0 --get bootfd.bin 2> /dev/null | wc -c) 4.61 if [ $SIZE -ne 0 ]; then 4.62 - OFS=$(( $OFS - $SIZE + 512 )) 4.63 - printf "Adding floppy bootstrap file at %04X...\n" $OFS 4.64 + SIZE=$(( $SIZE - 512 )) # sector 2 is data 4.65 + OFS=$(( $OFS - $SIZE )) 4.66 + printf "Adding floppy bootstrap file at %04X (%d bytes) ...\n" $OFS $SIZE 4.67 $0 --get bootfd.bin | \ 4.68 ddq of=$1 bs=1 count=512 seek=$OFS conv=notrunc 4.69 $0 --get bootfd.bin | \ 4.70 ddq of=$1 bs=1 skip=1024 seek=$((512 + $OFS)) conv=notrunc 4.71 - store 28 $(($SIZE/512 - 1)) $1 8 4.72 + store 28 $(($SIZE/512)) $1 8 4.73 fi 4.74 } 4.75 case "$1" in 4.76 @@ -206,15 +208,17 @@ 4.77 ddq if=$1 bs=512 count=1 of=/tmp/hybrid$$ 4.78 ddq if=$1 bs=512 skip=2 count=20 of=/tmp/tazlito$$ 4.79 add_win32exe $1 /tmp/hybrid$$ 4.80 - printf "Moving tazlito data record at %04X ...\n" $OFS 4.81 + printf "Moving tazlito data record at %04X (512 bytes) ...\n" $OFS 4.82 ddq if=/tmp/tazlito$$ bs=1 count=512 of=$1 seek=$OFS conv=notrunc 4.83 rm -f /tmp/tazlito$$ /tmp/hybrid$$ 4.84 + HOLE=$(($OFS+512)) 4.85 4.86 # keep the largest room for the tazlito info file 4.87 add_dosexe $1 4.88 add_rootfs $1 4.89 add_doscom $1 4.90 add_fdbootstrap $1 4.91 + printf "%d free bytes in %04X..%04X\n" $(($OFS-$HOLE)) $HOLE $OFS 4.92 store 26 ${RANDOM:-0} $1 4.93 i=66 4.94 n=0