wok-next view syslinux/stuff/iso2exe/taziso @ rev 17659
syslinux/taziso: kexec do not load zImage
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sun Feb 15 11:18:31 2015 +0100 (2015-02-15) |
parents | 953935d518fb |
children | 0a62ae54d391 |
line source
1 #!/bin/sh
3 [ $(id -u) -eq 0 ] || exec su -c "$0 $@"
5 DIALOG=dialog
7 ddq()
8 {
9 dd $@ 2> /dev/null
10 }
12 get()
13 {
14 od -v -j $1 -N ${4:-${3:-2}} -t u${3:-2} -w${3:-2} -An $2 2>/dev/null ||
15 hexdump -v -s $1 -n ${4:-${3:-2}} -e "\"\" 1/${3:-2} \" %d\n\"" $2
16 }
18 bytes2bin()
19 {
20 for i in $@ ; do
21 printf '\\\\x%02X' $(($i&255))
22 done | xargs echo -en
23 }
25 words2bin()
26 {
27 for i in $@ ; do
28 printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255))
29 done | xargs echo -en
30 }
32 gettazboot()
33 {
34 echo "Creating $(basename $1) ..."
35 if [ $(get 0 $ISO) -eq 23117 ]; then
36 O=$(($(get 66 $ISO) - 0xC0))
37 L=$(($(get 20 $ISO) - 0xC0 - $(get 24 $ISO) - $O))
38 S=$((32+$L))
39 P=$((($S+511)/512))
40 E=$((4096-(32*$P)))
41 words2bin 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \
42 -2 0 256 -16 28 0x6C53 0x5469 0x7A61 > $1
43 ddq bs=1 count=$L skip=$(echo $O) if=$ISO >> $1
44 else
45 wget -O $1 http://mirror.slitaz.org/boot/tazboot.exe
46 fi
47 }
49 uncpio()
50 {
51 [ -s "$1" ] || return
52 echo -en "\n Extracting $(basename $1) ..."
53 case $(get 0 $1) in
54 *35615) ( zcat || gunzip ) ;;
55 *14333) unxz ;;
56 *\ 93) unlzma ;;
57 *) cat ;;
58 esac < $1 | ( cd ${2:-/} ; cpio -idmu > /dev/null 2>&1 )
59 }
61 dotwait()
62 {
63 echo -n "${1:-Install filesystem}.."
64 touch /tmp/wait
65 while [ -e /tmp/wait ]; do
66 echo -n "." > /dev/tty
67 sleep 1
68 done &
69 }
71 getuuid()
72 {
73 dev=$(mount | sed "/ $(echo $mnt | sed 's|/|\\/|g') /!d;s/ .*//;s|/dev/||;q")
74 [ "$dev" ] &&
75 blkid | sed "/$dev:/!d;s/.* UUID=.\\([^ ]*\\)\".*/\\1/" ||
76 echo "/dev/hda1"
77 }
79 tazusbinitfs()
80 {
81 PAD=$(($(stat -c %s $1) % 4))
82 [ $PAD -ne 0 ] && ddq if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1
83 mkdir -p /tmp/fs$$/etc /tmp/fs$$/lib /tmp/fs$$/home
84 cp -a /etc/locale.conf /tmp/fs$$/etc 2> /dev/null
85 cp -a /etc/keymap.conf /tmp/fs$$/etc 2> /dev/null
86 cat > /tmp/fs$$/init1 <<EOT
87 #!/bin/sh
88 sed -i 's|sbin/init|init2|' /init
89 exec /init
90 EOT
91 cat > /tmp/fs$$/init2 <<EOT
92 #!/bin/sh
94 mount -t proc /proc /proc
95 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
96 v=\$(sed '/\\/home=/!d;s|.*/home=\\([^ ]*\\).*|\\1|' /proc/cmdline /cmdline 2> /dev/null)
97 mount / -o remount,rw
98 mkdir /mnt/dos
99 rm -f /cmdline 2> /dev/null
100 mount / -o remount,ro
101 mnt=/mnt/dos/\${v#*/}
102 dev=\$( (blkid /dev/[sh]d* || blkid) | grep \${v%%/*} | sed 's/:.*//;q')
103 echo "Mount \$dev in /mnt/dos for \$v..." | tee -a /run/boot.log
104 mount \$dev /mnt/dos
105 if [ ! -d /mnt/dos/slitaz ]; then
106 umount /mnt/dos 2> /dev/null
107 (blkid /dev/[sh]d* || blkid) | while read dev line; do
108 case "\$line" in
109 *ntfs*|*vfat*|*msdos*) ;;
110 *) continue ;;
111 esac
112 mount \${dev%:} /mnt/dos
113 [ -d /mnt/dos/slitaz ] && break
114 umount /mnt/dos
115 done
116 fi
117 mount.posixovl -F \$mnt -- -oallow_other -odefault_permissions -osuid
118 mount --bind \$mnt /home
119 umount /proc
120 exec /sbin/init
121 EOT
122 chmod 755 /tmp/fs$$/init?
123 ( cd /tmp/fs$$ ; find * | cpio -o -H newc ) | gzip -9 >> $1
124 rm -rf /tmp/fs$$
125 }
127 mkinitrd()
128 {
129 echo -en "\nCreating $(basename $1) "
130 fs=/tmp/fs$$
131 for i in bin lib dev proc tmp mnt etc ; do
132 mkdir -p $fs/$i
133 done
134 for i in /dev/console /dev/null /dev/tty /dev/tty0 /dev/tty1 /dev/tty2 \
135 /dev/fuse /dev/hd* /dev/sd* ; do
136 cp -a $2$i $fs/dev/
137 done
138 for i in /bin/busybox $(which mount.posixovl) $(which blkid); do
139 cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $i | \
140 sed 's|.*=> \(.*/lib/l[^ ]*\).*|\1|;/^\//!d') $fs/lib
141 cp $i $fs/bin
142 done
143 cp -a /lib/ld-* $fs/lib
144 for i in $(busybox | sed '/Current/,$!d'); do
145 [ -e $fs/bin/${i%,} ] || ln -s busybox $fs/bin/${i%,}
146 done
147 ln -s /proc/mounts $fs/etc/mtab
148 sed 's/ .*//' /proc/modules | while read mod ; do
149 find /lib/modules/ | grep $mod.ko | \
150 sed 's|.*|cp & $fs/lib|' | sh
151 done
152 cat > $fs/init <<EOT
153 #!/bin/sh
155 arg()
156 {
157 grep -q \$1 /proc/cmdline &&
158 val="\$(sed "s/.*\$1=\\([^ ]*\\).*/\\1/" < /proc/cmdline)" &&
159 echo "\$2 \$val"
160 }
162 mount -t proc /proc /proc
163 arg debug "shell" && debug=true && set -x
164 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
165 arg mount "Mount device"
166 mount \$( (blkid /dev/[sh]d* || blkid) | grep \$val | sed 's/:.*//;q') /mnt
167 arg subroot "Change root to directory"
168 if [ -d /mnt/\$val ]; then
169 umount /mnt 2> /dev/null
170 (blkid /dev/[sh]d* || blkid) | while read dev line; do
171 case "\$line" in
172 *ntfs*|*vfat*|*msdos*) ;;
173 *) continue ;;
174 esac
175 mount \${dev%:} /mnt
176 [ -d /mnt/\$val ] && break
177 umount /mnt
178 done
179 fi
180 mount.posixovl -F /mnt/\$val -- -oallow_other -odefault_permissions -osuid
181 mount --bind /mnt /mnt/\$val/mnt/dos
182 mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val
183 LDSO=\$(ls /mnt/\$val/lib/ld-* | sed q)
184 export LD_LIBRARY_PATH=\$val/lib:\$val/usr/lib:/lib
185 [ "$debug" = "true" ] && sh
186 umount /proc
187 exec /bin/switch_root /mnt \${LDSO#/mnt/} \$val/usr/sbin/chroot \$val /sbin/init
188 EOT
189 chmod +x $fs/init
190 ( cd $fs ; find * | cpio -o -H newc ) | lzma e $1 -si 2> /dev/null
191 rm -rf $fs /tmp/wait
192 }
194 ls_r()
195 {
196 ls -r $@ 2> /dev/null || ls $@
197 }
199 doinstall()
200 {
201 mkdir -p $mnt/slitaz/boot $mnt/slitaz/mnt/dos
202 if ! mount.posixovl -F $mnt/slitaz -- \
203 -oallow_other -odefault_permissions -osuid; then
204 echo "Can't install SliTaz. Abort."
205 sleep 5
206 return 1
207 fi
208 dotwait "Install root filesystem in /slitaz.."
209 if [ "$1" ]; then
210 ls_r /media/cdrom/boot/rootfs*gz | \
211 xargs cat > $mnt/slitaz/boot/rootfs.gz
212 tazusbinitfs $mnt/slitaz/boot/rootfs.gz
213 initrd=rootfs.gz
214 extraargs="/home=$(getuuid)/slitaz rdinit=/init1"
215 else
216 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
217 uncpio $i $mnt/slitaz
218 done
219 for i in $packages_list; do
220 tazpkg get-install $i --root=$mnt/slitaz
221 done
222 for i in $packages_dir/*.tazpkg; do
223 [ -s "$i" ] &&
224 tazpkg install $i --root=$mnt/slitaz
225 done
226 cp -a /etc/locale.conf $mnt/slitaz/etc 2> /dev/null
227 cp -a /etc/keymap.conf $mnt/slitaz/etc 2> /dev/null
228 mkinitrd $mnt/slitaz/boot/initrd $mnt/slitaz
229 initrd=initrd
230 extraargs="mount=$(getuuid) subroot=slitaz"
231 fi
232 echo -en "\nInstall boot files..."
233 for i in /media/cdrom/boot/bzImage /media/cdrom/boot/*pxe* \
234 /media/cdrom/boot/isolinux/he* /media/cdrom/boot/isolinux/opt* \
235 /media/cdrom/README /media/cdrom/boot/memtest* ; do
236 [ -s $i ] && cp $i $mnt/slitaz/boot
237 done
238 for i in $mnt/slitaz/boot/memtest $mnt/slitaz/boot/*pxe* ; do
239 [ $(get 0 $i 2> /dev/null || echo 0) -eq 23117 ] &&
240 mv $i $i.exe
241 done
242 gettazboot $mnt/slitaz/boot/tazboot.exe
243 unix2dos > $mnt/slitaz/boot/tazboot.cmd <<EOT
244 kernel=/slitaz/boot/bzimage
245 initrd=/slitaz/boot/$initrd
246 rw root=/dev/null $extraargs autologin
247 EOT
248 unix2dos $mnt/slitaz/boot/he* $mnt/slitaz/boot/opt* \
249 $mnt/slitaz/boot/README
250 [ -d $mnt/slitaz/usr/sbin -a ! -x $mnt/slitaz/usr/sbin/mount.posixovl ] &&
251 cp $(which mount.posixovl) $mnt/slitaz/usr/sbin
252 rm -f /tmp/wait
253 umount $mnt/slitaz
254 return 0
255 }
257 windev()
258 {
259 DEV="$(blkid | grep -iE "(msdos|vfat|ntfs)" | sed 's/:.*//;s|/dev/||')"
260 [ "$DEV" ] || return
261 cat > /tmp/dialog$$ <<EOT
262 $DIALOG --clear \
263 --title " Select your Windows partition " \
264 --menu "\nPlease select the Windows partition according to its known size.
265 The datas will be kept untouched.\n" \
266 17 70 8 \
267 $(for i in $DEV ; do
268 label="$(blkid | sed "/$i:/!d;s/.*://;s/[^ ]*UUID=[^ ]* //g;s/LABEL=//")"
269 echo -n "/dev/$i \"$(($(cat /sys/block/*/$i/size)/2048))MB $label\" "
270 done)
271 EOT
272 exec 3>&1
273 [ $? -eq 0 ] || return
274 device=$(. /tmp/dialog$$ 2>&1 1>&3)
275 exec 3>&-
276 rm -f /tmp/dialog$$
277 mnt=/tmp/mnt$$
278 mkdir -p $mnt && mount $device $mnt
279 }
281 extra_packages()
282 {
283 packages_list=
284 packages_dir=
285 $DIALOG --clear \
286 --title " Extra packages " \
287 --defaultno --yesno \
288 "
289 Do you want to add extra packages ?
290 " 7 70
291 [ $? -eq 0 ] || return
292 [ -s /var/lib/tazpkg/packages.txt ] || tazpkg recharge
293 if [ -s /media/cdrom/boot/vmlinuz-$(uname -r) ]; then
294 cat > /tmp/dialog$$ <<EOT
295 $DIALOG --clear \
296 --title " Select the packages " \
297 --separate-output \
298 --cancel-label "Skip" \
299 --checklist "Please select the packages you want to install. Try with the first letter." \
300 23 78 20 \\
301 EOT
302 awk -F\| '{ printf "%s \"%s\" off ",$1,$3 }' \
303 /var/lib/tazpkg/packages.desc >> /tmp/dialog$$
304 sh /tmp/dialog$$ 2> /tmp/dialog.out$$
305 [ $? -eq 0 ] && packages_list="$(cat /tmp/dialog.out$$)"
306 fi
307 cat > /tmp/dialog$$ <<EOT
308 $DIALOG --clear \
309 --title "Please select the directory with every custom packages to install." \
310 --cancel-label "Skip" \
311 --dselect $PWD 13 78
312 EOT
313 sh /tmp/dialog$$ 2> /tmp/dialog.out$$
314 [ $? -eq 0 ] && packages_dir="$(cat /tmp/dialog.out$$)"
315 rm -f /tmp/dialog$$ /tmp/dialog.out$$
316 }
318 _install()
319 {
320 extra_packages
321 $DIALOG --clear \
322 --title " SliTaz UMSDOS way installation " \
323 --yes-label "Install" --yesno \
324 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
325 DOS/Windows partition. You will see your files from /mnt/dos.\n\n
326 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
327 To uninstall SliTaz, you have only to remove this directory.
328 The file \\boot.ini or \\config.sys may be modified too.\n\n
329 SliTaz may run slowly on 'UMSDOS way' installation due to the
330 posixovl filesystem. The 'TAZUSB way' installation runs faster.\n\n
331 To do a traditional installation with disk partitioning,
332 start SliTaz Live with 'SliTaz RAM boot' menu.\n
333 " 19 70
334 [ $? -eq 0 ] || return
335 doinstall
336 }
338 readtazbootconf()
339 {
340 kernel="$(sed '/^kernel=/!d;s/.*=//' $mnt/slitaz/boot/tazboot.cmd)"
341 initrd="$(sed '/^initrd=/!d;s/.*=//' $mnt/slitaz/boot/tazboot.cmd)"
342 cmdline="$(sed '/^kernel=/d;/^initrd=/d' $mnt/slitaz/boot/tazboot.cmd)"
343 }
345 bootinstalled()
346 {
347 [ "$(which kexec)" ] || return
348 [ -x $mnt/slitaz$1 ] || return
349 [ -s $mnt/slitaz/boot/tazboot.cmd ] || return
350 readtazbootconf
351 kexec -l $kernel --initrd $initrd --command-line "$cmdline" || return
352 umount $mnt
353 rm -rf $mnt
354 umount -d /media/cdrom
355 kexec -e
356 }
358 mkzip()
359 {
360 device=
361 packages_list=
362 packages_dir=
363 mnt=/tmp/mnt$$
364 mkdir -p $mnt
365 $1 || return
366 wget -O $mnt/slitaz/boot/grldr http://mirror.slitaz.org/boot/grldr
367 readtazbootconf
368 cat > $mnt/slitaz/boot/menu.lst <<EOT
369 title SliTaz
370 kernel $kernel $cmdline
371 initrd $initrd
373 EOT
374 while read file title; do
375 file=$(ls $mnt/slitaz/boot/*$file* 2> /dev/null)
376 [ -s "$file" ] && cat >> $mnt/slitaz/boot/menu.lst <<EOT
377 title $title
378 kernel ${file#$mnt}
380 EOT
381 done <<EOT
382 memtest MemTest
383 pxe Web boot
384 EOT
385 unix2dos $mnt/slitaz/boot/menu.lst
386 unix2dos > $mnt/slitaz/boot/install.txt <<EOT
387 For DOS users (real mode only):
389 Start SliTaz with \\slitaz\\boot\\tazboot.exe
392 For NT/2000/XP users:
394 1- Move the files grldr and menu.lst into the root directory
396 C:\\> copy \\slitaz\\boot\\grldr \\
397 C:\\> copy \\slitaz\\boot\\menu.lst \\
399 2- Remove boot.ini attributes
401 C:\\> attrib -r -h -s boot.ini
403 3- Append the following line to boot.init
405 C:\\grldr="slitaz"
407 4- Restore boot.ini attributes
409 C:\\> attrib +r +h +s boot.ini
411 See http://diddy.boot-land.net/grub4dos/files/README_GRUB4DOS.txt
412 EOT
413 ( cd $mnt ; zip -r9 $(basename $ISO .iso).zip slitaz )
414 mv $mnt/*.zip .
415 umount $mnt
416 rm -rf $mnt
417 }
419 install()
420 {
421 windev || return
422 packages_list=
423 packages_dir=
424 _install && bootinstalled /sbin/init
425 umount $mnt
426 rm -rf $mnt
427 }
429 inst2zip()
430 {
431 mkzip _install
432 }
434 _installtaz()
435 {
436 $DIALOG --clear \
437 --title " SliTaz TAZUSB way installation " \
438 --yes-label "Install" --yesno \
439 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
440 DOS/Windows partition. You will see your files from /mnt/dos.\n\n
441 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
442 To uninstall SliTaz, you have only to remove this directory.
443 The file \\boot.ini or \\config.sys may be modified too.\n\n
444 The filesystem is loaded entirely into memory upon boot to
445 increase responsiveness. Only /home lands on hard disk.\n\n
446 To do a traditional installation with disk partitioning,
447 start SliTaz Live with 'SliTaz RAM boot' menu.\n
448 " 19 70
449 [ $? -eq 0 ] || return
450 doinstall tazusblike
451 }
453 installtaz()
454 {
455 windev || return
456 packages_list=
457 packages_dir=
458 _installtaz && bootinstalled /boot/bzimage
459 umount $mnt
460 rm -rf $mnt
461 }
463 insttaz2zip()
464 {
465 mkzip _installtaz
466 }
468 bootiso()
469 {
470 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
471 grep -q ' lm ' /proc/cpuinfo && [ -s ${i}64 ] && i=${i}64
472 cat $i
473 n=$((4 - ($(stat -c %s $i) % 4)))
474 [ $n -eq 4 ] || dd if=/dev/zero bs=1 count=$n
475 done > /tmp/initrd$$
476 kernel=/media/cdrom/boot/bzImage
477 grep -q ' lm ' /proc/cpuinfo && [ -s ${kernel}64 ] && kernel=${kernel}64
478 . /etc/locale.conf
479 kexec -l $kernel --initrd /tmp/initrd$$ --command-line \
480 "root=/dev/null autologin lang=$LANG kmap=$(cat /etc/keymap.conf)" &&
481 umount -d /media/cdrom
482 rm -f /tmp/initrd$$
483 kexec -e
484 }
486 tazboot()
487 {
488 $DIALOG --clear \
489 --title " SliTaz bootloader for DOS " \
490 --yes-label "Install" --yesno \
491 "\nThe file TAZBOOT.EXE will be created in the top directory. It supports
492 any linux kernel, multiple initramfs, a kernel command line and
493 an ISO image file loopback (retrieves files from an ISO file).\n\n
494 Usage: tazboot.exe [[@commands]|[kernel=<bzimage>]
495 [initrd=<rootfs>[,<rootfs2>...]] [bootfrom=<isofile>] cmdline args ...]\n\n
496 Defaults: tazboot @tazboot.cmd or tazboot kernel=bzImage auto\n\n\
497 Examples for tazboot.cmd:\n\n\
498 bootfrom=\\isos\\slitaz-4.0.iso\n\
499 kernel=boot/bzImage\n\
500 initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz\n\
501 rw root=/dev/null autologin\n\n\
502 kernel=\\slitaz\\vmlinuz root=/dev/sda5 ro\n\n
503 Unlike GRUB4DOS, it doesn't require unfragmented ISO image files.\n
504 " 24 78
505 [ $? -eq 0 ] || return
506 gettazboot tazboot.exe
507 }
509 md5()
510 {
511 dotwait "Checking files"
512 ( cd /media/cdrom ; ${1:-md5sum -c md5sum*} ) > /tmp/data
513 rm -f /tmp/wait
514 $DIALOG --clear \
515 --title " Checked files " \
516 --textbox /tmp/data 24 78
517 rm -f /tmp/data
518 }
520 gotcdfile()
521 {
522 for i in "/media/cdrom/$1" "/media/cdrom/*/$1" \
523 "/media/cdrom/*/isolinux/$1" ; do
524 file=$(ls $i 2> /dev/null | sed q)
525 [ -s "$file" ] && break
526 done
527 }
529 sha()
530 {
531 gotcdfile 'sha*sum*'
532 sha=$(basename $file)
533 md5 "${sha%sum*}sum -c ${file#/media/cdrom/}"
534 }
536 readme()
537 {
538 gotcdfile 'README*'
539 $DIALOG --clear \
540 --title " Readme " \
541 --textbox $file 24 78
542 }
544 bzimage()
545 {
546 $DIALOG --clear \
547 --title " Create linux.exe ? " \
548 --yes-label "Install" --yesno \
549 "\nLinux.exe launches the linux kernel under DOS (in real mode only).
550 The cmdline arguments are supported except initrd=,
551 vga= (you can try 'rdev -v') and mem= (partially).
552 \nExample:\nC:\\> linux.exe root=/dev/hda2 ro panic=60\n
553 " 12 70
554 [ $? -eq 0 ] || return
555 cp /media/cdrom/boot/bzImage linux.exe
556 }
558 memtest()
559 {
560 $DIALOG --clear \
561 --title " Create memtest.exe ? " \
562 --yes-label "Install" --yesno \
563 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
564 computers. BIOS based memory tests are a quick, cursory check and often
565 miss many of the failures that are detected by Memtest86.\n
566 " 12 70
567 [ $? -eq 0 ] && gotcdfile 'memtest*' && cp $file memtest.exe
568 }
570 mkfat12()
571 {
572 [ $(($(get 0 $1) - 0x5A4D)) -eq 0 ] || return
573 J=$(($(get 3 $1 1) + 0x02))
574 R=$((1 + $(get 497 $1 1) + 1 + ($(get 500 $1)-1)/32))
575 [ $R -lt 2500 ] || return
576 [ $((($(get 500 $1)-1) & 31)) -lt 30 ] &&
577 ddq if=$file bs=32 count=1 seek=$(($R*16 - 1)) of=/dev/fd0
578 G="18 0 2 0 0 0 0 0"
579 [ $J -gt 25 ] || G=""
580 F=0
581 for i in 1 2 3; do
582 F=$((((2880-$R-$F-$F)*3+1023)/1024))
583 done
584 bytes2bin 0xEB $J 0x90 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 \
585 0 2 2 $(($R%256)) $(($R/256)) 2 64 0 64 11 0xF0 $F 0 \
586 $G | ddq bs=1 of=/dev/fd0
587 ddq if=/dev/zero bs=512 count=$((4+$F+$F)) seek=$R of=/dev/fd0
588 for i in $R $(($R+$F)) ; do
589 bytes2bin 0xF0 0xFF 0xFF | ddq bs=512 seek=$i of=/dev/fd0
590 done
591 echo -n $(basename $1) | ddq bs=1 seek=3 count=8 of=/dev/fd0
592 }
594 mkfloppy()
595 {
596 dotwait "Create a $(basename $1) boot floppy"
597 ddq if=$1 of=/dev/fd0
598 mkfat12 $1
599 rm -f /tmp/wait
600 }
602 fdmemtest()
603 {
604 $DIALOG --clear \
605 --title " Create a Memtest86 boot floppy " \
606 --yes-label "Create floppy" --yesno \
607 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
608 computers. BIOS based memory tests are a quick, cursory check and often
609 miss many of the failures that are detected by Memtest86.\n\n
610 Please insert a blank disk in floppy drive.\n
611 " 12 70
612 [ $? -eq 0 ] && gotcdfile 'memtest*' && mkfloppy $file
613 }
615 pxe()
616 {
617 gotcdfile '?pxe'
618 $DIALOG --clear \
619 --title " Create $(basename $file).exe ? " \
620 --yes-label "Install" --yesno \
621 "\nBoot your operating system from the internet and enjoy a full system
622 working entirely in RAM with speed and stability in mind. The Linux Kernel
623 and the complete SliTaz compressed root filesystem will be loaded into RAM
624 from the Web using PXE and HTTP protocols.\n
625 " 12 70
626 [ $? -eq 0 ] || return
627 cp $file $(basename $file).exe
628 }
630 fdpxe()
631 {
632 $DIALOG --clear \
633 --title " Create a SliTaz Web boot floppy " \
634 --yes-label "Create floppy" --yesno \
635 "\nBoot your operating system from the internet and enjoy a full system
636 working entirely in RAM with speed and stability in mind. The Linux Kernel
637 and the complete SliTaz compressed root filesystem will be loaded into RAM
638 from the Web using PXE and HTTP protocols.\n\n
639 Please insert a blank disk in floppy drive.\n
640 " 12 70
641 [ $? -eq 0 ] && gotcdfile '?pxe' && mkfloppy $file
642 }
644 gotposixovl()
645 {
646 mount.posixovl 2>&1 | grep -qi usage &&
647 echo -en "\"$1\" \"$2\""
648 }
650 gotposixovlzip()
651 {
652 [ "$(which zip)" ] && gotposixovl "$1" "$2"
653 }
655 xfile()
656 {
657 [ "$(which $1)" ] && echo -en "\"$2\" \"$3\""
658 }
660 cdfile()
661 {
662 gotcdfile "$1" && echo -en "\"$2\" \"$3\""
663 }
665 isbzImage()
666 {
667 [ $(get 514 $file 4) -eq 1400005704 ] &&
668 [ $(($(get 529 $file 1) & 1)) -eq 1 ]
669 }
671 cdfilex()
672 {
673 gotcdfile "$1" &&
674 [ "$(which kexec)" ] &&
675 isbzImage &&
676 echo -en "\"$2\" \"$3\""
677 }
679 cdfilef()
680 {
681 [ -e /sys/block/fd0 ] && cdfile "$@"
682 }
684 cdexe()
685 {
686 gotcdfile "$1" &&
687 [ $(get 0 $file 2>/dev/null || echo 0) -eq 23117 ] &&
688 echo -en "\"$2\" \"$3\""
689 }
691 misspkg()
692 {
693 for i in zip kexec-tools posixovl ; do
694 [ -d /var/lib/tazpkg/installed/$i/ ] && continue
695 [ "$1" != "install" ] &&
696 echo -en "\"$1\" \"$2\"" && return
697 tazpkg get-install $i
698 done
699 }
701 missing()
702 {
703 misspkg install
704 }
706 ishybrid()
707 {
708 C=$((2048*$(get $(((17*2048) + 71)) $ISO 4)))
709 [ $(get $C $ISO 4) -eq 1 ] || return
710 [ $(get $(($C+30)) $ISO 4) -eq $((0x88AA55)) ] || return
711 C=$((2048*$(get $(($C+40)) $ISO 4)))
712 [ $(get $(($C+64)) $ISO 4) -eq 1886961915 ] &&
713 echo -en "\"$1\" \"$2\""
714 }
716 isiso()
717 {
718 [ $(get 32769 $ISO 4) -eq 808469571 ] &&
719 echo -en "\"$1\" \"$2\""
720 }
722 gotisomd5()
723 {
724 [ "$(which md5sum 2> /dev/null)" ] &&
725 [ $(get 0 $ISO) -eq 23117 ] &&
726 [ $(get 18 $ISO) -ne 0 ] && echo -en "\"$1\" \"$2\""
727 }
729 isomd5()
730 {
731 dotwait "Checking iso image"
732 [ "$(ddq if=$ISO bs=2k skip=16 \
733 count=$(echo $(get 32848 $ISO 4)) | md5sum)" == \
734 "$(ddq if=$ISO bs=16 count=1 skip=2047 | od -N 16 -t x1 -An | \
735 sed 's/ //g') -" ] && echo "OK" || echo "ERROR"
736 echo -en "\rChecking iso hybrid boot..."
737 n=$(($(get 2 $ISO)-1+($(get 4 $ISO)-1)*512))
738 if [ $n -lt 40000 -a $n -gt 32768 ]; then
739 s=$(get 0 $ISO 2 $n | awk '{ i+= $0 } END { print i }')
740 [ $(((1+$s+$(get $(($n+1)) $ISO 1)) % 65536)) -eq 0 ] &&
741 echo "OK" || echo "ERROR"
742 fi
743 rm -f /tmp/wait
744 echo -e "\rPress RETURN to continue."
745 read n
746 }
748 usbdev()
749 {
750 dotwait "Wait 5 seconds for USB devices"
751 sleep 5
752 rm -f /tmp/wait
753 DEV="$(grep -l 1 /sys/block/*/removable | \
754 sed 's|/sys/block/\(.*\)/removable|\1|')"
755 grep -qs 1 /sys/block/$DEV/ro && return
756 [ "$DEV" ] || return
757 cat > /tmp/dialog$$ <<EOT
758 $DIALOG --clear \
759 --title " Select your USB key " \
760 --menu "\nPlease select the USB key according to its known size.\n\n" \
761 14 70 4 \
762 $(for i in $DEV ; do
763 echo -n "/dev/$i \"$(($(cat /sys/block/$i/size)/2048))MB $(cat /sys/block/$i/device/model 2> /dev/null)\" "
764 done) \
766 EOT
767 exec 3>&1
768 device=$(. /tmp/dialog$$ 2>&1 1>&3)
769 rm -f /tmp/dialog$$
770 retval=$?
771 exec 3>&-
772 rm -f /tmp/dialog$$
773 [ $retval -eq 0 ]
774 }
776 tazusbmsg()
777 {
778 [ "$(which tazusb 2> /dev/null)" ] || return
779 echo "You should choose 'USB key read/write installation' to be
780 able to save the package updates or your own configuration and data files.\n\n"
781 }
783 usbbootkey()
784 {
785 $DIALOG --clear \
786 --title " Create a USB boot key " \
787 --yes-label "Continue" --yesno \
788 "\nThe USB key will be used like a CD-ROM. You will not be able to write
789 any data on the boot partition.\n\n
790 An extra FAT32 partition will be created with the remaining free space.\n\n
791 $(tazusbmsg)Please plug your USB stick in now.\n
792 " 16 70
793 [ $? -eq 0 ] || return
794 usbdev || return
796 # perform dd in progess bar
797 max=$(($(stat -c %s $ISO)/2048))
798 i=0; ddq if=$ISO bs=1024k | (
799 while ddq bs=1024k count=1 ; do
800 i=$(($i + 1))
801 [ $i -gt $max ] && break
802 echo $((($i*100)/$max)) | dialog --gauge \
803 " The ISO image transfer can be long. Please wait..." \
804 6 70 0 > /dev/tty 2>&1
805 done ) > $device
807 # partition + fat32 format for the remining space
808 get 446 $device 2 12 | xargs echo | { read dx cx ol oh ll lh
809 if [ $dx -eq $((0x3F17)) ]; then
810 cx=$(($cx & 0xFF00))
811 ofs=$(($ll+($lh<<16)))
812 n=$(($(cat /sys/block/${device#/dev/}/size)-$ofs))
813 m=$(($cx+($n/8)))
814 [ $m -gt $((0x3FF00)) ] && m=$((0x3FF00))
815 m=$((($m & 0xFF00)+(($m>>16)<<6)))
816 words2bin 0 $((0x101+$cx)) 0x3F0B $((32+$m)) \
817 $ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \
818 ddq bs=1 seek=446 of=$device
819 if [ "$(which mkdosfs 2> /dev/null)" ]; then
820 losetup -o $((512*$ofs)) /dev/loop2 $device
821 mkdosfs -n "SLITAZ BOOT" /dev/loop2
822 words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \
823 ddq bs=1 seek=28 of=/dev/loop2
824 losetup -d /dev/loop2
825 fi
826 fi ; }
827 }
829 usbkey()
830 {
831 $DIALOG --clear \
832 --title " Create a SliTaz USB key " \
833 --yes-label "Continue" --yesno \
834 "\nUnlike a hard drive install, the filesystem is kept in a compressed
835 rootfs.gz. The filesystem is loaded entirely into memory upon boot.
836 This should increase responsiveness, protect the filesystem against
837 accidental corruption and reduce read/writes to the USB drive.
838 Once setup, the tazusb utility can rewrite the root filesystem
839 with any changes you have made since booting up,
840 giving the effective benefits of a hard drive install.\n\n
841 /home is mounted on boot using the UUID of your particular flash drive.
842 Unlike a device name, the UUID has the benefit of never changing from machine
843 to machine.\n\n
844 Please plug your USB stick in now.\n
845 " 19 70
846 [ $? -eq 0 ] || return
847 usbdev || return
848 exec 3>&1
849 format=`$DIALOG --clear \
850 --title " Select the filesystem " \
851 --radiolist "\nPlease select the filesystem type to create.\n\n\
852 The filesystem creation will erase all the data \
853 in the USB key." 14 70 4 \
854 "none" "Do not erase the USB key" on \
855 "ext3" "Ext3 journaling filesystem" off \
856 "ext2" "Ext2 filesystem" off \
857 "fat32" "Windows FAT32 filesystem" off \
858 2>&1 1>&3`
859 retval=$?
860 exec 3>&-
861 [ $retval -eq 0 ] || return
862 [ "$format" != "none" ] && tazusb format $device "SliTaz" $format
863 tazusb gen-iso2usb $ISO $device
864 }
866 dokexec()
867 {
868 kexec -l $file || return
869 umount -d /media/cdrom
870 kexec -e
871 }
873 runmemtest()
874 {
875 gotcdfile 'memtest*' && dokexec
876 }
878 runpxe()
879 {
880 gotcdfile '?pxe' && dokexec
881 }
883 quit()
884 {
885 umount -d /media/cdrom
886 exit
887 }
889 ISO="$1"
890 [ -z "$(isiso 2> /dev/null)" ] && echo "Usage : $0 file.iso" && exit 1
891 mount -o loop,ro $ISO /media/cdrom
893 while true; do
894 cat > /tmp/dialog$$ <<EOT
895 $DIALOG --clear \
896 --title " SliTaz ISO tool " \
897 --menu "" 23 70 17 \
898 $(cdfile 'README*' "readme" "Show the README file") \
899 $(gotisomd5 "isomd5" "Check the ISO image") \
900 $(cdfile 'md5sum*' "md5" "Check the ISO files") \
901 $(cdfile 'sha*sum*' "sha" "Check the ISO files") \
902 $(cdfilex boot/bzImage "bootiso" "Boot the ISO image") \
903 $(gotposixovl "install" "Hard disk installation (UMSDOS way)") \
904 $(gotposixovl "installtaz" "Hard disk installation (TAZUSB way)") \
905 $(gotposixovlzip "inst2zip" "ZIP installation archive (UMSDOS way)") \
906 $(gotposixovlzip "insttaz2zip" "ZIP installation archive (TAZUSB way)") \
907 $(xfile tazusb "usbkey" "USB key read/write installation") \
908 $(ishybrid "usbbootkey" "USB boot key (read only)") \
909 "tazboot" "Get tazboot.exe Linux loader" \
910 $(cdexe boot/bzImage "bzimage" "Get linux DOS/EXE file") \
911 $(cdexe 'memtest*' "memtest" "Get Memtest86 DOS/EXE file") \
912 $(cdfilef 'memtest*' "fdmemtest" "Create a Memtest86 boot floppy") \
913 $(cdfilex 'memtest*' "runmemtest" "Start Memtest86") \
914 $(cdexe '?pxe' "pxe" "Get SliTaz Web boot DOS/EXE utility") \
915 $(cdfilef '?pxe' "fdpxe" "Create a SliTaz Web boot floppy") \
916 $(cdfilex '?pxe' "runpxe" "Start the SliTaz Web boot utility") \
917 $(misspkg "missing" "Install packages to get more options") \
918 "quit" "Quit this utility"
919 EOT
920 exec 3>&1
921 value=$(. /tmp/dialog$$ 2>&1 1>&3)
922 retval=$?
923 exec 3>&-
924 rm -f /tmp/dialog$$
925 [ $retval -eq 0 ] || continue
926 $value
927 done