wok annotate syslinux/stuff/tools/isohybrid.sh @ rev 19428

syslinux/isohybrid: random uuid in gpt
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Oct 01 10:31:58 2016 +0200 (2016-10-01)
parents 31e215a4b9bb
children 42d854b45556
rev   line source
pascal@4513 1 #!/bin/sh
pascal@4513 2
pascal@7859 3 if [ "$1" == "--build" ]; then
pascal@7859 4 cat >> $0 <<EOM
pascal@7859 5 $(for i in fx fx_f fx_c px px_f px_c ; do
pascal@7860 6 cat mbr/isohdp$i.bin /dev/zero | dd bs=1 count=512 2> /dev/null
pascal@7859 7 done | gzip -9 | uuencode -m -)
pascal@4513 8 EOT
pascal@4513 9 EOM
pascal@7859 10 sed -i '/--build/,/^fi/d' $0
pascal@4513 11 exit
pascal@4513 12 fi
pascal@7859 13 iso=
pascal@7859 14 heads=64 # zipdrive-style geometry
pascal@7859 15 sectors=32
pascal@7859 16 partype=23 # "Windows hidden IFS"
pascal@19425 17 entry=
pascal@7859 18 id=$(( ($RANDOM <<16) + $RANDOM))
pascal@7859 19 offset=0
pascal@7859 20 partok=0
pascal@7859 21 hd0=0
pascal@8974 22 always=0
pascal@4513 23
pascal@7859 24 while [ -n "$1" ]; do
pascal@8974 25 case "${1/--/-}" in
pascal@8974 26 -a*) always=1;;
pascal@8974 27 -ct*) hd0=2;;
pascal@8974 28 -e*) entry=$2; shift;;
pascal@8974 29 -f*) hd0=1;;
pascal@8974 30 -h) heads=$2; shift;;
pascal@8974 31 -i*) id=$(($2)); shift;;
pascal@8974 32 -noh*) hd0=0;;
pascal@8974 33 -nop*) partok=0;;
pascal@8974 34 -o*) offset=$(($2)); shift;;
pascal@8974 35 -p*) partok=1;;
pascal@8974 36 -s) sectors=$2; shift;;
pascal@8974 37 -t*) partype=$(($2 & 255)); shift;;
pascal@8974 38 *) iso=$1;;
pascal@7859 39 esac
pascal@7859 40 shift
pascal@7859 41 done
pascal@7859 42
pascal@7859 43 if [ ! -f "$iso" ]; then
pascal@4513 44 cat << EOT
pascal@8403 45 usage: $0 [options] isoimage
pascal@8403 46 options:
pascal@8403 47 -h <X> Number of default geometry heads
pascal@8403 48 -s <X> Number of default geometry sectors
pascal@8403 49 -e --entry Specify partition entry number (1-4)
pascal@8403 50 -o --offset Specify partition offset (default 0)
pascal@8403 51 -t --type Specify partition type (default 0x17)
pascal@8403 52 -i --id Specify MBR ID (default random)
pascal@8403 53 --forcehd0 Assume we are loaded as disk ID 0
pascal@8403 54 --ctrlhd0 Assume disk ID 0 if the Ctrl key is pressed
pascal@8403 55 --partok Allow booting from within a partition
pascal@8974 56 --always Do not abort on errors
pascal@4513 57 EOT
pascal@4513 58 exit 1
pascal@4513 59 fi
pascal@7859 60
pascal@7859 61 ddq()
pascal@7859 62 {
pascal@7859 63 dd "$@" 2> /dev/null
pascal@7859 64 }
pascal@4513 65
pascal@4513 66 readiso()
pascal@4513 67 {
pascal@7859 68 ddq bs=2k skip=$1 count=1 if=$iso | ddq bs=1 skip=$2 count=$3
pascal@4513 69 }
pascal@4513 70
pascal@4513 71 # read a 32 bits data
pascal@7859 72 read32()
pascal@4513 73 {
pascal@13660 74 readiso $1 $2 4 | od -N 4 -t u4 -An
pascal@4513 75 }
pascal@4513 76
pascal@19425 77 # read a 16 bits data
pascal@19425 78 read16()
pascal@19425 79 {
pascal@19425 80 readiso $1 $2 2 | od -N 2 -t u2 -An
pascal@19425 81 }
pascal@19425 82
pascal@19425 83 # read a 8 bits data
pascal@19425 84 read8()
pascal@19425 85 {
pascal@19425 86 readiso $1 $2 1 | od -N 1 -t u1 -An
pascal@19425 87 }
pascal@19425 88
pascal@4513 89 # write a 32 bits data
pascal@7859 90 store32()
pascal@4513 91 {
pascal@19425 92 n=$2; for i in 0 8 16 24; do
pascal@19425 93 printf '\\\\x%02X' $((($n >> $i) & 255))
pascal@8399 94 done | xargs echo -en | ddq bs=1 conv=notrunc of=$iso seek=$(($1))
pascal@4513 95 }
pascal@4513 96
pascal@19425 97 store32sw()
pascal@19425 98 {
pascal@19425 99 n=$2; for i in 24 16 8 0; do
pascal@19425 100 printf '\\\\x%02X' $((($n >> $i) & 255))
pascal@19425 101 done | xargs echo -en | ddq bs=1 conv=notrunc of=$iso seek=$(($1))
pascal@19425 102 }
pascal@19425 103
pascal@19425 104 crc32()
pascal@19425 105 {
pascal@19425 106 t0=00000000; t1=77073096; t2=EE0E612C; t3=990951BA;
pascal@19425 107 t4=076DC419; t5=706AF48F; t6=E963A535; t7=9E6495A3;
pascal@19425 108 t8=0EDB8832; t9=79DCB8A4; t10=E0D5E91E; t11=97D2D988;
pascal@19425 109 t12=09B64C2B; t13=7EB17CBD; t14=E7B82D07; t15=90BF1D91;
pascal@19425 110 t16=1DB71064; t17=6AB020F2; t18=F3B97148; t19=84BE41DE;
pascal@19425 111 t20=1ADAD47D; t21=6DDDE4EB; t22=F4D4B551; t23=83D385C7;
pascal@19425 112 t24=136C9856; t25=646BA8C0; t26=FD62F97A; t27=8A65C9EC;
pascal@19425 113 t28=14015C4F; t29=63066CD9; t30=FA0F3D63; t31=8D080DF5;
pascal@19425 114 t32=3B6E20C8; t33=4C69105E; t34=D56041E4; t35=A2677172;
pascal@19425 115 t36=3C03E4D1; t37=4B04D447; t38=D20D85FD; t39=A50AB56B;
pascal@19425 116 t40=35B5A8FA; t41=42B2986C; t42=DBBBC9D6; t43=ACBCF940;
pascal@19425 117 t44=32D86CE3; t45=45DF5C75; t46=DCD60DCF; t47=ABD13D59;
pascal@19425 118 t48=26D930AC; t49=51DE003A; t50=C8D75180; t51=BFD06116;
pascal@19425 119 t52=21B4F4B5; t53=56B3C423; t54=CFBA9599; t55=B8BDA50F;
pascal@19425 120 t56=2802B89E; t57=5F058808; t58=C60CD9B2; t59=B10BE924;
pascal@19425 121 t60=2F6F7C87; t61=58684C11; t62=C1611DAB; t63=B6662D3D;
pascal@19425 122 t64=76DC4190; t65=01DB7106; t66=98D220BC; t67=EFD5102A;
pascal@19425 123 t68=71B18589; t69=06B6B51F; t70=9FBFE4A5; t71=E8B8D433;
pascal@19425 124 t72=7807C9A2; t73=0F00F934; t74=9609A88E; t75=E10E9818;
pascal@19425 125 t76=7F6A0DBB; t77=086D3D2D; t78=91646C97; t79=E6635C01;
pascal@19425 126 t80=6B6B51F4; t81=1C6C6162; t82=856530D8; t83=F262004E;
pascal@19425 127 t84=6C0695ED; t85=1B01A57B; t86=8208F4C1; t87=F50FC457;
pascal@19425 128 t88=65B0D9C6; t89=12B7E950; t90=8BBEB8EA; t91=FCB9887C;
pascal@19425 129 t92=62DD1DDF; t93=15DA2D49; t94=8CD37CF3; t95=FBD44C65;
pascal@19425 130 t96=4DB26158; t97=3AB551CE; t98=A3BC0074; t99=D4BB30E2;
pascal@19425 131 t100=4ADFA541; t101=3DD895D7; t102=A4D1C46D; t103=D3D6F4FB;
pascal@19425 132 t104=4369E96A; t105=346ED9FC; t106=AD678846; t107=DA60B8D0;
pascal@19425 133 t108=44042D73; t109=33031DE5; t110=AA0A4C5F; t111=DD0D7CC9;
pascal@19425 134 t112=5005713C; t113=270241AA; t114=BE0B1010; t115=C90C2086;
pascal@19425 135 t116=5768B525; t117=206F85B3; t118=B966D409; t119=CE61E49F;
pascal@19425 136 t120=5EDEF90E; t121=29D9C998; t122=B0D09822; t123=C7D7A8B4;
pascal@19425 137 t124=59B33D17; t125=2EB40D81; t126=B7BD5C3B; t127=C0BA6CAD;
pascal@19425 138 t128=EDB88320; t129=9ABFB3B6; t130=03B6E20C; t131=74B1D29A;
pascal@19425 139 t132=EAD54739; t133=9DD277AF; t134=04DB2615; t135=73DC1683;
pascal@19425 140 t136=E3630B12; t137=94643B84; t138=0D6D6A3E; t139=7A6A5AA8;
pascal@19425 141 t140=E40ECF0B; t141=9309FF9D; t142=0A00AE27; t143=7D079EB1;
pascal@19425 142 t144=F00F9344; t145=8708A3D2; t146=1E01F268; t147=6906C2FE;
pascal@19425 143 t148=F762575D; t149=806567CB; t150=196C3671; t151=6E6B06E7;
pascal@19425 144 t152=FED41B76; t153=89D32BE0; t154=10DA7A5A; t155=67DD4ACC;
pascal@19425 145 t156=F9B9DF6F; t157=8EBEEFF9; t158=17B7BE43; t159=60B08ED5;
pascal@19425 146 t160=D6D6A3E8; t161=A1D1937E; t162=38D8C2C4; t163=4FDFF252;
pascal@19425 147 t164=D1BB67F1; t165=A6BC5767; t166=3FB506DD; t167=48B2364B;
pascal@19425 148 t168=D80D2BDA; t169=AF0A1B4C; t170=36034AF6; t171=41047A60;
pascal@19425 149 t172=DF60EFC3; t173=A867DF55; t174=316E8EEF; t175=4669BE79;
pascal@19425 150 t176=CB61B38C; t177=BC66831A; t178=256FD2A0; t179=5268E236;
pascal@19425 151 t180=CC0C7795; t181=BB0B4703; t182=220216B9; t183=5505262F;
pascal@19425 152 t184=C5BA3BBE; t185=B2BD0B28; t186=2BB45A92; t187=5CB36A04;
pascal@19425 153 t188=C2D7FFA7; t189=B5D0CF31; t190=2CD99E8B; t191=5BDEAE1D;
pascal@19425 154 t192=9B64C2B0; t193=EC63F226; t194=756AA39C; t195=026D930A;
pascal@19425 155 t196=9C0906A9; t197=EB0E363F; t198=72076785; t199=05005713;
pascal@19425 156 t200=95BF4A82; t201=E2B87A14; t202=7BB12BAE; t203=0CB61B38;
pascal@19425 157 t204=92D28E9B; t205=E5D5BE0D; t206=7CDCEFB7; t207=0BDBDF21;
pascal@19425 158 t208=86D3D2D4; t209=F1D4E242; t210=68DDB3F8; t211=1FDA836E;
pascal@19425 159 t212=81BE16CD; t213=F6B9265B; t214=6FB077E1; t215=18B74777;
pascal@19425 160 t216=88085AE6; t217=FF0F6A70; t218=66063BCA; t219=11010B5C;
pascal@19425 161 t220=8F659EFF; t221=F862AE69; t222=616BFFD3; t223=166CCF45;
pascal@19425 162 t224=A00AE278; t225=D70DD2EE; t226=4E048354; t227=3903B3C2;
pascal@19425 163 t228=A7672661; t229=D06016F7; t230=4969474D; t231=3E6E77DB;
pascal@19425 164 t232=AED16A4A; t233=D9D65ADC; t234=40DF0B66; t235=37D83BF0;
pascal@19425 165 t236=A9BCAE53; t237=DEBB9EC5; t238=47B2CF7F; t239=30B5FFE9;
pascal@19425 166 t240=BDBDF21C; t241=CABAC28A; t242=53B39330; t243=24B4A3A6;
pascal@19425 167 t244=BAD03605; t245=CDD70693; t246=54DE5729; t247=23D967BF;
pascal@19425 168 t248=B3667A2E; t249=C4614AB8; t250=5D681B02; t251=2A6F2B94;
pascal@19425 169 t252=B40BBE37; t253=C30C8EA1; t254=5A05DF1B; t255=2D02EF8D;
pascal@19425 170 crc=$((0xFFFFFFFF))
pascal@19425 171 dd if=$iso bs=1 skip=$(($1)) count=$(($2)) 2> /dev/null | \
pascal@19425 172 od -v -w1 -t u1 -An | {
pascal@19425 173 while read n; do
pascal@19425 174 local x=$((($crc ^ $n) & 255))
pascal@19425 175 eval x=0x\$t$x
pascal@19425 176 crc=$(((($crc >> 8) & 0x00FFFFFF) ^ $x))
pascal@19425 177 done
pascal@19425 178 echo $(($crc ^ 0xFFFFFFFF))
pascal@19425 179 }
pascal@19425 180 }
pascal@19425 181
pascal@7859 182 main()
pascal@4513 183 {
pascal@7859 184 uudecode | gunzip | ddq bs=512 count=1 of=$iso conv=notrunc \
pascal@7859 185 skip=$(( (3*$partok) + $hd0))
pascal@7859 186 store32 432 $(($lba * 4))
pascal@7859 187 store32 440 $id
pascal@8400 188 store32 508 0xAA550000
pascal@19425 189 e=$(( ((${entry:-1} -1) % 4) *16 +446))
pascal@8400 190 store32 $e 0x10080
pascal@7859 191 esect=$(( ($sectors + ((($cylinders -1) & 0x300) >>2)) <<16))
pascal@7859 192 ecyl=$(( (($cylinders -1) & 0xff) <<24))
pascal@7859 193 store32 $(($e + 4)) $(($partype + (($heads - 1) <<8) +$esect +$ecyl))
pascal@7859 194 store32 $(($e + 8)) $offset
pascal@7859 195 store32 $(($e + 12)) $(($cylinders * $heads * $sectors))
pascal@19425 196 if [ -n "$efi_ofs" ]; then
pascal@19425 197 [ $(read16 0 1024) -eq 35615 -a $(read16 11 0) -ne 35615 ] &&
pascal@19425 198 ddq bs=512 conv=notrunc skip=2 seek=44 count=20 if=$iso of=$iso
pascal@19425 199 store32 $((446+16)) $((0xFFFFFE00))
pascal@19425 200 store32 $((446+16+4)) $((0xFFFFFEEF))
pascal@19425 201 store32 $((446+16+8)) $efi_ofs
pascal@19425 202 store32 $((446+16+12)) $efi_len
pascal@19425 203 uudecode <<EOT | unlzma | ddq bs=512 seek=1 of=$iso conv=notrunc
pascal@19425 204 begin-base64 644 -
pascal@19428 205 XQAAgAD//////////wAikYVN1N2VY3JXMnUMJn1RCdQOHN33EegtIBhrUQ7Q
pascal@19428 206 JNaW37NYVuUAmqtISPiCdgAxPRlBS0xDlmAPPOCSZXmEFz9jEkXSzmsGn6+o
pascal@19428 207 7SMAKMfvpMa3U1bJv/napT+/NFttJSJSx0xJA3em3KJcZsO66vaYeJC5tE+3
pascal@19428 208 T0p9AJtSH6X8SMic3vU3hYWwHsYnsmeoGmsy4EJba9Wf/0liMQA=
pascal@19425 209 ====
pascal@19425 210 EOT
pascal@19425 211 lastlba=$((($cylinders * $heads * $sectors) -1))
pascal@19425 212 usablelba=34
pascal@19425 213 store32 $((0x218)) 1
pascal@19425 214 store32 $((0x220)) $lastlba
pascal@19425 215 store32 $((0x228)) $usablelba
pascal@19425 216 store32 $((0x230)) $(($lastlba-$usablelba+1))
pascal@19425 217 store32 $((0x428)) $(($lastlba-0x800))
pascal@19425 218 store32 $((0x4A0)) $efi_ofs
pascal@19425 219 store32 $((0x4A8)) $(($efi_ofs+$efi_len-1))
pascal@19425 220 store32 $((0x258)) $(crc32 0x400 0x4000)
pascal@19425 221 store32 $((0x210)) $(crc32 0x200 $(read32 0 $((0x20C))))
pascal@19425 222 store32sw $((0x1008)) $(($efi_ofs/4))
pascal@19425 223 store32sw $((0x1054)) $(($efi_len/4))
pascal@19428 224 for i in 238 410 490 ; do
pascal@19428 225 ddq if=/dev/urandom count=16 bs=1 conv=notrunc \
pascal@19428 226 of=$iso seek=$((0x$i))
pascal@19428 227 done
pascal@19425 228 fi
pascal@4513 229 }
pascal@4513 230
pascal@7859 231 abort()
pascal@7859 232 {
pascal@7859 233 echo "$iso: $1"
pascal@8974 234 [ $always -eq 0 ] && exit 1
pascal@7859 235 }
pascal@7859 236
pascal@7859 237 [ "$(readiso 17 7 23)" == "EL TORITO SPECIFICATION" ] ||
pascal@7859 238 abort "no boot record found."
pascal@7859 239 cat=$(read32 17 71)
pascal@7859 240 [ $(read32 $cat 0) -eq 1 -a $(read32 $cat 30) -eq $(( 0x88AA55 )) ] ||
pascal@7859 241 abort "invalid boot catalog."
pascal@19425 242 efi_ofs=
pascal@19425 243 if [ $(read8 $cat 65) -eq 239 ]; then
pascal@19425 244 [ -n "$entry" ] && echo "$iso: efi boot ignore --entry $entry" && entry=
pascal@19425 245 partype=0
pascal@19425 246 efi_len=$(read16 $cat 102)
pascal@19425 247 efi_ofs=$((4*$(read32 $cat 104)))
pascal@19425 248 fi
pascal@7859 249 lba=$(read32 $cat 40)
pascal@7859 250 [ $(read32 $lba 64) -eq 1886961915 ] ||
pascal@7859 251 abort "no isolinux.bin hybrid signature in bootloader."
pascal@4513 252 size=$(stat -c "%s" $iso)
pascal@7859 253 trksz=$(( 512 * $heads * $sectors ))
pascal@7859 254 cylinders=$(( ($size + $trksz - 1) / $trksz ))
pascal@7859 255 pad=$(( (($cylinders * $trksz) - $size) / 512 ))
pascal@7859 256 [ $pad -eq 0 ] || ddq bs=512 count=$pad if=/dev/zero >> $iso
pascal@4513 257 if [ $cylinders -gt 1024 ]; then
pascal@4513 258 cat 1>&2 <<EOT
pascal@4513 259 Warning: more than 1024 cylinders ($cylinders).
pascal@4513 260 Not all BIOSes will be able to boot this device.
pascal@4513 261 EOT
pascal@4513 262 cylinders=1024
pascal@4513 263 fi
pascal@4513 264
pascal@7859 265 main <<EOT