tazlito view tazlito @ rev 319

tazlito/noram: try hacker mode
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Jun 17 12:46:34 2013 +0200 (2013-06-17)
parents 9a94603ac754
children b3041f9d49ab
line source
1 #!/bin/sh
2 # TazLito - SliTaz Live Tool.
3 #
4 # Tazlito is a tool to help generate and configure SliTaz LiveCD
5 # ISO images. You can create a custom distro in one command from a list of
6 # packages, extract an existing ISO image to hack it, create a new initramfs
7 # and/or a new ISO. Most commands must be run by root, except the stats
8 # and the configuration file manipulation.
9 #
10 # (C) 2007-2012 SliTaz - GNU General Public License.
11 #
12 # Authors : Christophe Lincoln <pankso@slitaz.org>
13 # Pascal Bellard <pascal.bellard@slitaz.org>
14 #
15 VERSION=5.2
17 . /lib/libtaz.sh
19 # Tazlito configuration variables to be shorter
20 # and to use words rather than numbers.
21 COMMAND=$1
22 LIST_NAME=$2
23 TMP_DIR=/tmp/tazlito-$$-$RANDOM
24 TMP_MNT=/media/tazlito-$$-$RANDOM
25 TOP_DIR=`pwd`
26 INITRAMFS=rootfs.gz
27 LOCALSTATE=/var/lib/tazpkg
28 INSTALLED=$LOCALSTATE/installed
29 CACHE_DIR=/var/cache/tazpkg
30 MIRROR=$LOCALSTATE/mirror
31 DEFAULT_MIRROR="http://mirror.slitaz.org/packages/`cat /etc/slitaz-release`/"
33 log=/var/log/tazlito.log
34 if check_root; then
35 echo "" > $log
36 fi
38 # Try to include config file, continue if command is gen-config or exit.
39 # The main config used by default is in /etc/tazlito.
40 if [ -f "/etc/tazlito/tazlito.conf" ] ; then
41 CONFIG_FILE="/etc/tazlito/tazlito.conf"
42 fi
43 # Specific distro config file can be put in a distro tree.
44 if [ -f "$TOP_DIR/tazlito.conf" ] ; then
45 CONFIG_FILE="$TOP_DIR/tazlito.conf"
46 fi
47 if [ ! "$CONFIG_FILE" = "" ] ; then
48 . $CONFIG_FILE
49 else
50 if [ "$COMMAND" = "gen-config" ] ; then
51 continue
52 else
53 echo "Unable to find any configuration file. Please read the docs"
54 echo "or run '`basename $0` gen-config' to get an empty config file."
55 exit 0
56 fi
57 fi
59 # While Tazpkg is not used the default mirror url file does not exist
60 # and user can't recharge the list of flavors.
61 if test $(id -u) = 0 ; then
62 if [ ! -f "$MIRROR" ]; then
63 echo "$DEFAULT_MIRROR" > $MIRROR
64 fi
65 fi
67 # Set the rootfs and rootcd path with $DISTRO
68 # configuration variable.
69 ROOTFS=$DISTRO/rootfs
70 ROOTCD=$DISTRO/rootcd
72 #####################
73 # Tazlito functions #
74 #####################
76 # Print the usage.
77 usage ()
78 {
79 echo -e "\nSliTaz Live Tool - Version: $VERSION\n
80 \033[1mUsage: \033[0m `basename $0` [command] [list|iso|flavor|compression] [dir|iso]
81 \033[1mCommands: \033[0m\n
82 usage Print this short usage.
83 stats View Tazlito and distro configuration statistics.
84 gen-config Generate a new configuration file for a distro.
85 configure Configure the main config file or a specific tazlito.conf.
86 gen-iso Generate a new ISO from a distro tree.
87 gen-initiso Generate a new initramfs and ISO from the distro tree.
88 list-flavors List all available package lists on the mirror.
89 gen-flavor Generate a new live-CD description.
90 gen-liveflavor Generate a live-CD description from current system.
91 show-flavor Show live-CD description.
92 get-flavor Get a flavor's list of packages.
93 upgrade-flavor Update package list to the latest available versions.
94 extract-flavor Extract a (*.flavor) flavor into $FLAVORS_REPOSITORY.
95 pack-flavor Pack (and update) a flavor from $FLAVORS_REPOSITORY.
96 iso2flavor Create a flavor file from a SliTaz iso image.
97 check-list Check a distro-packages.list for updates.
98 extract-distro Extract an ISO to a directory and rebuild LiveCD tree.
99 gen-distro Generate a Live distro and ISO from a list of packages.
100 clean-distro Remove all files generated by gen-distro.
101 check-distro Help to check if distro is ready to release.
102 writeiso Use running system to generate a bootable ISO (with /home).
103 merge Merge multiple rootfs into one iso.
104 deduplicate Deduplicate files in a tree.
105 repack Recompress rootfs into iso with maximum ratio.
106 build-loram Generate a live-CD for low ram systems.
107 frugal-install Frugal install in /boot/frugal from a distro or ISO.
108 emu-iso Emulate an ISO image with Qemu.
109 burn-iso Burn ISO image to a cdrom using Wodim.\n"
110 }
112 yesorno()
113 {
114 echo -n "$1"
115 case "$DEFAULT_ANSWER" in
116 Y|y) answer="y";;
117 N|n) answer="n";;
118 *) read answer;;
119 esac
120 }
122 field()
123 {
124 grep "^$1" "$2" | sed 's/.*: \([0-9KMG\.]*\).*/\1/'
125 }
127 todomsg()
128 {
129 echo -e "\\033[70G[ \\033[1;31mTODO\\033[0;39m ]"
130 }
132 # Download a file from this mirror
133 download_from()
134 {
135 local i
136 local mirrors
137 mirrors="$1"
138 shift
139 for i in $mirrors; do
140 case "$i" in
141 http://*|ftp://*) wget -c $i$@ && break;;
142 *) cp $i/$1 . && break;;
143 esac
144 done
145 }
147 # Download a file trying all mirrors
148 download()
149 {
150 local i
151 for i in $(cat $MIRROR $LOCALSTATE/undigest/*/mirror 2> /dev/null); do
152 download_from "$i" "$@" && break
153 done
154 }
156 # Execute hooks provided by some packages
157 genisohooks()
158 {
159 local here=`pwd`
160 for i in $(ls $ROOTFS/etc/tazlito/*.$1 2> /dev/null); do
161 cd $ROOTFS
162 . $i $ROOTCD
163 done
164 cd $here
165 }
167 cleanup()
168 {
169 if [ -d $TMP_MNT ]; then
170 umount $TMP_MNT
171 rmdir $TMP_MNT
172 rm -f /boot
173 fi
174 }
176 # Echo the package name if the tazpkg is already installed
177 installed_package_name()
178 {
179 local tazpkg
180 local package
181 local VERSION
182 local EXTRAVERSION
183 tazpkg=$1
184 # Try to find package name and version to be able
185 # to repack it from installation
186 # A dash (-) can exist in name *and* in version
187 package=${tazpkg%-*}
188 i=$package
189 while true; do
190 VERSION=""
191 eval $(grep -s ^VERSION= $INSTALLED/$i/receipt)
192 EXTRAVERSION=""
193 eval $(grep -s ^EXTRAVERSION= $INSTALLED/$i/receipt)
194 if [ "$i-$VERSION$EXTRAVERSION" = "$tazpkg" ]; then
195 echo $i
196 break
197 fi
198 case "$i" in
199 *-*);;
200 *) break;;
201 esac
202 i=${i%-*}
203 done
204 }
206 # Check for the rootfs tree.
207 check_rootfs()
208 {
209 if [ ! -d "$ROOTFS/etc" ] ; then
210 echo -e "\nUnable to find a distro rootfs...\n"
211 exit 0
212 fi
213 }
215 # Check for the boot dir into the root CD tree.
216 verify_rootcd()
217 {
218 if [ ! -d "$ROOTCD/boot" ] ; then
219 echo -e "\nUnable to find the rootcd boot directory...\n"
220 exit 0
221 fi
222 }
224 create_iso()
225 {
226 cd $2
227 echo -n "Computing md5..."
228 find * -type f ! -name md5sum -exec md5sum {} \; > md5sum
229 sed -i -e '/ boot\/isolinux\/isolinux.bin$/d' \
230 -e '/ boot\/isolinux\/boot.cat$/d' md5sum
231 status
232 cd - > /dev/null
233 echo ""
234 echo -e "\033[1mGenerating ISO image\033[0m"
235 separator
236 echo "Generating $1"
237 if [ $(ls $2/boot/vmlinuz* $2/boot/bzImage | wc -l) -eq 2 ]; then
238 if cmp $2/boot/vmlinuz* $2/boot/bzImage > /dev/null; then
239 rm -f $2/boot/bzImage
240 ln $2/boot/vmlinuz* $2/boot/bzImage
241 fi
242 fi
243 genisoimage -R -o $1 -b boot/isolinux/isolinux.bin \
244 -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 \
245 -V "$VOLUM_NAME" -p "$PREPARED" -input-charset iso8859-1 \
246 -boot-info-table $2
247 if [ -x /usr/bin/isohybrid ]; then
248 echo -n "Creating hybrid ISO..."
249 /usr/bin/isohybrid $1 -entry 2 2> /dev/null
250 status
251 fi
252 if [ -s /etc/tazlito/info ]; then
253 if [ $(stat -c %s /etc/tazlito/info) -lt $(( 31*1024 )) ]; then
254 echo -n "Storing ISO info..."
255 dd if=/etc/tazlito/info bs=1k seek=1 of=$1 \
256 conv=notrunc 2> /dev/null
257 status
258 fi
259 fi
260 if [ -x /usr/bin/iso2exe ]; then
261 echo -n "Creating EXE header..."
262 /usr/bin/iso2exe $1 2> /dev/null
263 status
264 fi
265 }
267 # Generate a new ISO image using isolinux.
268 gen_livecd_isolinux()
269 {
270 # Some packages may want to alter iso
271 genisohooks iso
272 if [ ! -f "$ROOTCD/boot/isolinux/isolinux.bin" ]; then
273 echo -e "\nUnable to find isolinux binary.\n"
274 cleanup
275 exit 0
276 fi
277 # Set date for boot msg.
278 if grep -q 'XXXXXXXX' $ROOTCD/boot/isolinux/isolinux.*g; then
279 DATE=`date +%Y%m%d`
280 echo -n "Setting build date to: $DATE..."
281 sed -i "s/XXXXXXXX/$DATE/" $ROOTCD/boot/isolinux/isolinux.*g
282 status
283 fi
284 cd $DISTRO
285 create_iso $ISO_NAME.iso $ROOTCD
286 echo -n "Creating the ISO md5sum..."
287 md5sum $ISO_NAME.iso > $ISO_NAME.md5
288 status
289 separator
290 # Some packages may want to alter final iso
291 genisohooks final
292 }
294 lzma_history_bits()
295 {
296 #
297 # This generates an ISO which boots with Qemu but gives
298 # rootfs errors in frugal or liveUSB mode.
299 #
300 #local n
301 #local sz
302 #n=20 # 1Mb
303 #sz=$(du -sk $1 | cut -f1)
304 #while [ $sz -gt 1024 -a $n -lt 28 ]; do
305 #n=$(( $n + 1 ))
306 #sz=$(( $sz / 2 ))
307 #done
308 #echo $n
309 echo 24
310 }
312 lzma_switches()
313 {
314 local proc=$(grep -s '^processor' < /proc/cpuinfo | wc -l)
315 echo "-d$(lzma_history_bits $1) -mt${proc:-1}"
316 }
318 lzma_set_size()
319 {
320 # Update size field for lzma'd file packed using -si switch
321 local n
322 local i
323 return # Need to fix kernel code ?
324 n=$(unlzma -c $1 | wc -c)
325 for i in $(seq 1 8); do
326 printf '\\\\x%02X' $(($n & 255))
327 n=$(($n >> 8))
328 done | xargs echo -en | dd of=$1 conv=notrunc bs=1 seek=5 2> /dev/null
329 }
331 align_to_32bits()
332 {
333 local size
334 size=$(stat -c %s ${1:-/dev/null})
335 [ $((${size:-0} & 3)) -ne 0 ] &&
336 dd if=/dev/zero bs=1 count=$((4 - ($size & 3))) >> $1 2> /dev/null
337 }
339 # Pack rootfs
340 pack_rootfs()
341 {
342 ( cd $1 ; find . -print | cpio -o -H newc ) | \
343 if [ "$COMPRESSION" = "none" ]; then
344 echo "Generating uncompressed initramfs... "
345 cat > $2
346 elif [ -x /usr/bin/lzma -a "$COMPRESSION" != "gzip" ]; then
347 echo -n "Generating lzma'ed initramfs... "
348 lzma e -si -so $(lzma_switches $1) > $2
349 lzma_set_size $2
350 else
351 echo "Generating gziped initramfs... "
352 gzip -9 > $2
353 fi
354 align_to_32bits $2
355 echo 1 > /tmp/rootfs
356 }
358 # Compression functions for writeiso.
359 write_initramfs()
360 {
361 if [ "$COMPRESSION" = "lzma" ]; then
362 echo -n "Creating rootfs.gz with lzma compression... "
363 cat /tmp/list | cpio -o -H newc | lzma e -si -so > /rootfs.gz
364 lzma_set_size /rootfs.gz
365 elif [ "$COMPRESSION" = "gzip" ]; then
366 echo "Creating rootfs.gz with gzip compression... "
367 cat /tmp/list | cpio -o -H newc | gzip -9 > /rootfs.gz
368 else
369 echo "Creating rootfs.gz without compression... "
370 cat /tmp/list | cpio -o -H newc > /rootfs.gz
371 fi
372 align_to_32bits /rootfs.gz
373 echo 1 > /tmp/rootfs
374 }
376 # Deduplicate files (MUST be on the same filesystem).
377 deduplicate()
378 {
379 find "$@" -type f -size +0c -xdev \
380 -exec stat -c '%s-%a-%u-%g %i %h %n' {} \; | sort | \
381 ( save=0; old_attr=""; old_inode=""; old_link=""; old_file=""
382 while read attr inode link file; do
383 [ -L "$file" ] && continue
384 if [ "$attr" = "$old_attr" -a "$inode" != "$old_inode" ]; then
385 if cmp "$file" "$old_file" >/dev/null 2>&1 ; then
386 rm -f "$file"
387 if ln "$old_file" "$file" 2> /dev/null; then
388 inode="$old_inode"
389 [ "$link" = "1" ] &&
390 save="$(($save+(${attr%%-*}+512)/1024))"
391 else
392 cp "$old_file" "$file"
393 fi
394 fi
395 fi
396 old_attr="$attr" ; old_inode="$inode" ; old_file="$file"
397 done
398 echo "$save Kbytes saved in duplicate files."
399 )
400 }
402 # Generate a new initramfs from the root filesystem.
403 gen_initramfs()
404 {
405 # Just in case CTRL+c
406 rm -f $DISTRO/gen
408 # Some packages may want to alter rootfs
409 genisohooks rootfs
410 cd $1
412 # Link duplicate files
413 deduplicate .
415 # Use lzma if installed. Display rootfs size in realtime.
416 rm -f /tmp/rootfs
417 pack_rootfs . $DISTRO/$(basename $1).gz &
418 sleep 2
419 echo -en "\nFilesystem size:"
420 while [ ! -f /tmp/rootfs ]
421 do
422 sleep 1
423 echo -en "\\033[18G`du -sh $DISTRO/$(basename $1).gz | awk '{print $1}'` "
424 done
425 echo -e "\n"
426 cd $DISTRO
427 mv $(basename $1).gz $ROOTCD/boot
428 }
430 distro_sizes()
431 {
432 if [ "$time" ]; then
433 time=$(($(date +%s) - $time))
434 sec=$time
435 div=$(( ($time + 30) / 60))
436 [ "$div" != 0 ] && min="~ ${div}m"
437 echo "Build time : ${sec}s $min"
438 fi
439 cat << EOT
440 Build date : $(date +%Y%m%d)
441 Packages : $(ls -1 $ROOTFS*$INSTALLED/*/receipt | wc -l)
442 Rootfs size : $(du -csh $ROOTFS*/ | awk '{ s=$1 } END { print s }')
443 Initramfs size : $(du -csh $ROOTCD/boot/rootfs*.gz | awk '{ s=$1 } END { print s }')
444 ISO image size : $(du -sh $ISO_NAME.iso | awk '{ print $1 }')
445 ================================================================================
446 Image is ready: $ISO_NAME.iso
448 EOT
449 }
451 # Print ISO and rootfs size.
452 distro_stats()
453 {
454 echo ""
455 echo -e "\033[1mDistro statistics\033[0m ($DISTRO)"
456 separator
457 distro_sizes
458 }
460 # Create an empty configuration file.
461 empty_config_file()
462 {
463 cat >> tazlito.conf << "EOF"
464 # tazlito.conf: Tazlito (SliTaz Live Tool)
465 # configuration file.
466 #
468 # Name of the ISO image to generate.
469 ISO_NAME=""
471 # ISO image volume name.
472 VOLUM_NAME="SliTaz"
474 # Name of the preparer.
475 PREPARED="$USER"
477 # Path to the packages repository and the packages.list.
478 PACKAGES_REPOSITORY=""
480 # Path to the distro tree to gen-distro from a
481 # list of packages.
482 DISTRO=""
484 # Path to the directory containing additional files
485 # to copy into the rootfs and rootcd of the LiveCD.
486 ADDFILES="$DISTRO/addfiles"
488 # Default answer for binary question (Y or N)
489 DEFAULT_ANSWER="ASK"
491 # Compression utility (lzma, gzip or none)
492 COMPRESSION="lzma"
493 EOF
494 }
496 # extract rootfs.gz somewhere
497 extract_rootfs()
498 {
499 (zcat $1 || unlzma -c $1 || cat $1) 2>/dev/null | \
500 (cd $2; cpio -idm > /dev/null)
501 }
503 # Remove duplicate files
504 mergefs()
505 {
506 echo -n "Merge $(basename $1) ($(du -hs $1 | awk '{ print $1}')) into "
507 echo -n "$(basename $2) ($(du -hs $2 | awk '{ print $1}'))"
508 # merge symlinks files and devices
509 ( cd $1; find ) | while read file; do
510 if [ -L $1/$file ]; then
511 [ -L $2/$file ] &&
512 [ "$(readlink $1/$file)" == "$(readlink $2/$file)" ] &&
513 rm -f $2/$file
514 elif [ -f $1/$file ]; then
515 [ -f $2/$file ] &&
516 cmp $1/$file $2/$file > /dev/null 2>&1 && rm -f $2/$file
517 [ -f $2/$file ] &&
518 [ "$(basename $file)" == "volatile.cpio.gz" ] &&
519 [ "$(dirname $(dirname $file))" == \
520 ".$INSTALLED" ] && rm -f $2/$file
521 elif [ -b $1/$file ]; then
522 [ -b $2/$file ] &&
523 [ "$(stat -c '%a:%u:%g:%t:%T' $1/$file)" == \
524 "$(stat -c '%a:%u:%g:%t:%T' $2/$file)" ] &&
525 rm -f $2/$file
526 elif [ -c $1/$file ]; then
527 [ -c $2/$file ] &&
528 [ "$(stat -c '%a:%u:%g:%t:%T' $1/$file)" == \
529 "$(stat -c '%a:%u:%g:%t:%T' $2/$file)" ] &&
530 rm -f $2/$file
531 fi
532 done
534 # cleanup directories
535 ( cd $1; find -type d ) | sed '1!G;h;$!d' | while read file; do
536 [ -d $2/$file ] && rmdir $2/$file 2> /dev/null
537 done
538 true
539 status
540 }
542 cleanup_merge()
543 {
544 rm -rf $TMP_DIR
545 exit 1
546 }
548 human2cent()
549 {
550 case "$1" in
551 *k) echo $1 | sed 's/\(.*\).\(.\)k/\1\2/';;
552 *M) echo $(( $(echo $1 | sed 's/\(.*\).\(.\)M/\1\2/') * 1024));;
553 *G) echo $(( $(echo $1 | sed 's/\(.*\).\(.\)G/\1\2/') * 1024 * 1024));;
554 esac
555 }
557 cent2human()
558 {
559 if [ $1 -lt 10000 ]; then
560 echo "$(($1 / 10)).$(($1 % 10))k"
561 elif [ $1 -lt 10000000 ]; then
562 echo "$(($1 / 10240)).$(( ($1/1024) % 10))M"
563 else
564 echo "$(($1 / 10485760)).$(( ($1/1048576) % 10))G"
565 fi
566 }
568 get_size()
569 {
570 cat $LOCALSTATE/packages.list $TMP_DIR/packages.list 2>/dev/null | awk "{ \
571 if (/^$(echo $1 | sed 's/[$+.\]/\\&/g')$/) get=1; \
572 if (/installed/ && get == 1) { print ; get++ } \
573 }
574 END { if (get < 2) print \" 0.0k (0.0k installed)\" }" | \
575 sed 's/ *\(.*\) .\(.*\) installed./\1 \2/' | while read packed unpacked; do
576 echo "$(human2cent $packed) $(human2cent $unpacked)"
577 done
578 }
580 # Display package list with version, set packed_size and unpacked_size
581 get_pkglist()
582 {
583 packed_size=0; unpacked_size=0
584 grep -v ^# $FLAVORS_REPOSITORY/$1/packages.list > $TMP_DIR/flavor.pkg
585 while read pkg; do
586 set -- $(get_size $pkg)
587 packed_size=$(( $packed_size + $1 ))
588 unpacked_size=$(( $unpacked_size + $2 ))
589 for i in $(grep -hs ^$pkg $LOCALSTATE/packages.list \
590 $TMP_DIR/packages.list); do
591 echo $i
592 break
593 done
594 done < $TMP_DIR/flavor.pkg
595 rm -f $TMP_DIR/flavor.pkg
596 }
598 # Update isolinux config files for multiple rootfs
599 update_bootconfig()
600 {
601 local files
602 echo -n "Updating boot config files..."
603 files="$(grep -l 'include common' $1/*.cfg)"
604 for file in $files ; do
605 awk -v n=$(echo $2 | awk '{ print NF/2 }') '{
606 if (/label/) label=$0;
607 else if (/kernel/) kernel=$0;
608 else if (/append/) {
609 i=index($0,"rootfs.gz");
610 append=substr($0,i+9);
611 }
612 else if (/include/) {
613 for (i = 1; i <= n; i++) {
614 print label i
615 print kernel;
616 initrd="initrd=/boot/rootfs" n ".gz"
617 for (j = n - 1; j >= i; j--) {
618 initrd=initrd ",/boot/rootfs" j ".gz";
619 }
620 printf "\tappend %s%s\n",initrd,append;
621 print "";
622 }
623 print;
624 }
625 else print;
626 }' < $file > $file.$$
627 mv -f $file.$$ $file
628 done
629 sel="$(echo $2 | awk '{
630 for (i=1; i<=NF; i++)
631 if (i % 2 == 0) printf " slitaz%d",i/2
632 else printf " %s",$i
633 }')"
634 [ -s $1/common.cfg ] && cat >> $1/common.cfg <<EOT
636 label slitaz
637 kernel /boot/isolinux/ifmem.c32
638 append$sel noram
640 label noram
641 config noram.cfg
643 EOT
644 # Update vesamenu
645 if [ -s $1/isolinux.cfg ]; then
646 files="$files $1/isolinux.cfg"
647 awk -v n=$(echo $2 | awk '{ print NF/2 }') -v "sel=$sel" '
648 BEGIN {
649 kernel=" COM32 c32box.c32"
650 }
651 {
652 if (/ROWS/) print "MENU ROW " n+$3;
653 else if (/TIMEOUTROW/) print "MENU TIMEOUTROW " n+$3;
654 else if (/TABMSGROW/) print "MENU TABMSGROW " n+$3;
655 else if (/CMDLINEROW/) print "MENU CMDLINEROW " n+$3;
656 else if (/VSHIFT/) {
657 x=$3-n;
658 if (x < 0) x=0;
659 print "MENU VSHIFT " x;
660 }
661 else if (/rootfs.gz/) {
662 linux=""
663 if (/bzImage/) {
664 linux="linux /boot/bzImage "
665 }
666 i=index($0,"rootfs.gz");
667 append=substr($0,i+9);
668 print " kernel /boot/isolinux/ifmem.c32"
669 print " append" sel " noram"
670 print ""
671 print "label noram"
672 print " MENU HIDE"
673 print " config noram.cfg"
674 print ""
675 for (i = 1; i <= n; i++) {
676 print "LABEL slitaz" i
677 print " MENU LABEL SliTaz slitaz" i " Live"
678 print kernel;
679 initrd="initrd=/boot/rootfs" n ".gz"
680 for (j = n - 1; j >= i; j--) {
681 initrd=initrd ",/boot/rootfs" j ".gz";
682 }
683 printf "\tappend %s%s%s\n",linux,initrd,append;
684 print "";
685 }
686 }
687 else if (/bzImage/) kernel=$0;
688 else print;
689 }' < $1/isolinux.cfg > $1/isolinux.cfg.$$
690 mv $1/isolinux.cfg.$$ $1/isolinux.cfg
691 fi
692 [ -s $1/c32box.c32 ] && sed -i -e '/kernel.*ifmem/d' \
693 -e 's/append \([0-9]\)/append ifmem \1/' $1/isolinux.cfg
694 cat > $1/noram.cfg <<EOT
695 implicit 0
696 prompt 1
697 timeout 80
698 F1 help.txt
699 F2 options.txt
700 F3 isolinux.msg
701 F4 display.txt
702 F5 enhelp.txt
703 F6 enopts.txt
705 display isolinux.msg
706 say Not enough RAM to boot slitaz. Trying hacker mode...
707 default hacker
708 label hacker
709 KERNEL /boot/bzImage
710 append rw root=/dev/null vga=normal
712 label reboot
713 EOT
714 if [ -s $1/c32box.c32 ]; then
715 cat >> $1/noram.cfg <<EOT
716 COM32 c32box.c32
717 append reboot
719 label poweroff
720 COM32 c32box.c32
721 append poweroff
723 EOT
724 else
725 echo " com32 reboot.c32" >> $1/noram.cfg
726 fi
727 # Restore real label names
728 [ -s $1/common.cfg ] && files="$1/common.cfg $files"
729 echo $2 | awk '{ for (i=NF; i>1; i-=2) printf "%d/%s\n",i/2,$i }' | \
730 while read pat; do
731 sed -i "s/slitaz$pat/" $files
732 done
733 status
734 }
736 # Install a missing package
737 install_package()
738 {
739 echo -n "Install package $1 "
740 [ -n "$2" ] && echo -n "for kernel $2 "
741 echo -n "?"
742 read answer
743 case "$answer" in
744 y*|Y*|o*|O*)
745 # We dont want package on host cache.
746 echo -n "Getting and installing package: $1"
747 yes y | tazpkg get-install $1 2>&1 >> $log || exit 1
748 status ;;
749 *)
750 return 1 ;;
751 esac
752 }
754 # Check iso for loram transformation
755 check_iso_for_loram()
756 {
757 [ -s $TMP_DIR/iso/boot/rootfs.gz ] ||
758 [ -s $TMP_DIR/iso/boot/rootfs1.gz ]
759 }
761 # Build initial rootfs for loram ISO ram/cdrom/http
762 build_initfs()
763 {
764 urliso="mirror.slitaz.org mirror.switch.ch/ftp/mirror/slitaz \
765 download.tuxfamily.org/slitaz slitaz.c3sl.ufpr.br"
766 version=$(ls $TMP_DIR/iso/boot/vmlinuz-* | sed 's/.*vmlinuz-//')
767 if [ -z "$version" ]; then
768 cat <<EOT
769 Can't find the kernel version.
770 No file /boot/vmlinuz-<version> in ISO image.
771 Abort.
772 EOT
773 exit 1
774 fi
775 [ -s /usr/share/boot/busybox-static ] || install_package busybox-static
776 need_lib=false
777 mkdir -p $TMP_DIR/initfs/bin $TMP_DIR/initfs/dev $TMP_DIR/initfs/run \
778 $TMP_DIR/initfs/mnt $TMP_DIR/initfs/proc $TMP_DIR/initfs/tmp \
779 $TMP_DIR/initfs/sys $TMP_DIR/initfs/lib/modules
780 ln -s bin $TMP_DIR/initfs/sbin
781 ln -s . $TMP_DIR/initfs/usr
782 while [ ! -f /lib/modules/$version/kernel/fs/aufs/aufs.ko.?z ]; do
783 install_package aufs $version || return 1
784 done
785 cp /init $TMP_DIR/initfs/
786 # bootfloppybox will need floppy.ko.?z, /dev/fd0, /dev/tty0
787 cp /lib/modules/$version/kernel/drivers/block/floppy.ko.?z \
788 $TMP_DIR/initfs/lib/modules 2> /dev/null
789 cp -a /dev/tty0 /dev/fd0 $TMP_DIR/initfs/dev 2> /dev/null
790 cp /lib/modules/$version/kernel/fs/aufs/aufs.ko.?z \
791 $TMP_DIR/initfs/lib/modules
792 if [ "$1" == "cdrom" ]; then
793 sed -i '/mod squashfs/d' $TMP_DIR/initfs/init
794 else
795 [ ! -f /usr/sbin/mksquashfs ] && ! install_package squashfs && return 1
796 while [ ! -f /lib/modules/$version/kernel/fs/squashfs/squashfs.ko.?z ]; do
797 install_package linux-squashfs $version || return 1
798 done
799 cp /lib/modules/$version/kernel/fs/squashfs/squashfs.ko.?z \
800 $TMP_DIR/initfs/lib/modules
801 ls /sbin/unsquashfs /usr/lib/liblzma.so* $INSTALLED/squashfs/* | \
802 cpio -o -H newc > $TMP_DIR/initfs/extractfs.cpio
803 fi
804 for i in $(ls /dev/[hs]d[a-f]*); do
805 cp -a $i $TMP_DIR/initfs/dev
806 done
807 if [ "$1" == "http" ]; then
808 mkdir $TMP_DIR/initfs/etc
809 ln -s /proc/mounts $TMP_DIR/initfs/etc/mtab
810 cp /usr/share/udhcpc/default.script $TMP_DIR/initfs/lib/udhcpc
811 sed -i 's|/sbin/||' $TMP_DIR/initfs/lib/udhcpc
812 cp -a /dev/fuse $TMP_DIR/initfs/dev
813 if ! $need_lib && [ -x /usr/share/boot/fusermount-static ]; then
814 cp /usr/share/boot/fusermount-static $TMP_DIR/initfs/bin/httpfs
815 else
816 cp /usr/bin/fusermount $TMP_DIR/initfs/bin
817 need_lib=true
818 fi
819 if ! $need_lib && [ -x /usr/share/boot/httpfs-static ]; then
820 cp /usr/share/boot/httpfs-static $TMP_DIR/initfs/bin/httpfs
821 else
822 [ ! -f /usr/bin/httpfs ] && ! install_package httpfs-fuse && return 1
823 cp /usr/bin/httpfs $TMP_DIR/initfs/bin
824 cp -a /lib/librt* $TMP_DIR/initfs/lib
825 cp -a /lib/libdl* $TMP_DIR/initfs/lib
826 cp -a /lib/libpthread* $TMP_DIR/initfs/lib
827 cp -a /usr/lib/libfuse* $TMP_DIR/initfs/lib
828 cp -a /lib/libresolv* $TMP_DIR/initfs/lib
829 cp -a /lib/libnss_dns* $TMP_DIR/initfs/lib
830 need_lib=true
831 fi
832 cd $TMP_DIR/initfs
833 echo "Getting slitaz-release..."
834 for i in $TMP_DIR/iso/boot/rootfs*.gz; do
835 ( zcat $i 2> /dev/null || unlzma -c $i) | \
836 cpio -idmu etc/slitaz-release > /dev/null
837 done
838 cd - > /dev/null
839 echo "Default urls for /iso/$(cat $TMP_DIR/initfs/etc/slitaz-release)/flavors/slitaz-loram-cdrom.iso /iso/$(cat $TMP_DIR/initfs/etc/slitaz-release)/flavors/slitaz-$(cat $TMP_DIR/initfs/etc/slitaz-release)-loram-cdrom.iso: $urliso"
840 echo -n "List of urls to insert: "
841 read -t 30 urliso2
842 urliso="$urliso2 $urliso"
843 fi
844 if ! $need_lib && [ -x /usr/share/boot/busybox-static ]; then
845 cp /usr/share/boot/busybox-static $TMP_DIR/initfs/bin/busybox
846 sed -i 's/LD_T.*ot/echo ""/;s/".*ld-.*) /"/' $TMP_DIR/initfs/init
847 else
848 cp /bin/busybox $TMP_DIR/initfs/bin
849 need_lib=true
850 fi
851 for i in $($TMP_DIR/initfs/bin/busybox | awk \
852 '{ if (s) printf "%s",$0 } /Currently/ { s=1 }' | sed 's/,//g'); do
853 ln $TMP_DIR/initfs/bin/busybox $TMP_DIR/initfs/bin/$i
854 done
855 for i in /dev/console /dev/loop* /dev/null /dev/tty /dev/zero \
856 /dev/kmem /dev/mem /dev/random /dev/urandom; do
857 cp -a $i $TMP_DIR/initfs/dev
858 done
859 $need_lib && for i in /lib/ld-* /lib/lib[cm].so* /lib/lib[cm]-* ; do
860 cp -a $i $TMP_DIR/initfs/lib
861 done
862 [ "$1" == "http" ] && cat > $TMP_DIR/initfs/init <<EOTEOT
863 #!/bin/sh
865 getarg()
866 {
867 grep -q " \$1=" /proc/cmdline || return 1
868 eval \$2=\$(sed "s/.* \$1=\\\\([^ ]*\\\\).*/\\\\1/" < /proc/cmdline)
869 return 0
870 }
872 copy_rootfs()
873 {
874 total=\$(grep MemTotal /proc/meminfo | sed 's/[^0-9]//g')
875 need=\$(du -c \${path}rootfs* | tail -n 1 | cut -f1)
876 [ \$(( \$total / \$need )) -gt 1 ] || return 1
877 if ! grep -q " keep-loram" /proc/cmdline && cp \${path}rootfs* /mnt; then
878 path=/mnt/
879 return 0
880 else
881 rm -f /mnt/rootfs*
882 return 1
883 fi
884 }
886 echo "Switching / to tmpfs..."
887 mount -t proc proc /proc
888 size="\$(grep rootfssize= < /proc/cmdline | \\
889 sed 's/.*rootfssize=\\([0-9]*[kmg%]\\).*/-o size=\\1/')"
890 [ -n "\$size" ] || size="-o size=90%"
892 while read var default; do
893 eval \$var=\$default
894 getarg \$var \$var
895 done <<EOT
896 eth eth0
897 dns 208.67.222.222,208.67.220.220
898 netmask 255.255.255.0
899 gw
900 ip
901 EOT
902 if [ -n "\$ip" ]; then
903 ifconfig \$eth \$ip netmask \$netmask up
904 route add default gateway \$gw
905 for i in \$(echo \$dns | sed 's/,/ /g'); do
906 echo "nameserver \$i" >> /etc/resolv.conf
907 done
908 else
909 udhcpc -f -q -s /lib/udhcpc -i \$eth
910 fi
911 for i in $urliso ; do
912 [ -n "\$URLISO" ] && URLISO="\$URLISO,"
913 URLISO="\${URLISO}http://\$i/iso/\$(cat /etc/slitaz-release)/flavors/slitaz-loram-cdrom.iso,http://\$i/iso/\$(cat /etc/slitaz-release)/flavors/slitaz-\$(cat /etc/slitaz-release)-loram-cdrom.iso"
914 done
915 getarg urliso URLISO
916 DIR=fs
917 if getarg loram DIR; then
918 DEVICE=\${DIR%,*}
919 DIR=/\${DIR#*,}
920 fi
921 mount -t tmpfs \$size tmpfs /mnt
922 path2=/mnt/.httpfs/
923 path=/mnt/.cdrom/
924 mkdir -p /mnt/.rw \$path \$path2
925 while [ ! -d \$path/boot ]; do
926 for i in \$(echo \$URLISO | sed 's/,/ /g'); do
927 httpfs \$i \$path2 && break
928 done
929 mount -o loop,ro -t iso9660 \$path2/*.iso \$path
930 done
932 memfree=\$(grep MemFree /proc/meminfo | sed 's/[^0-9]//g')
933 umount /proc
934 branch=br=/mnt/.rw:/mnt/.cdrom/\$DIR
935 if [ ! -d /mnt/.cdrom/\$DIR/etc ]; then
936 branch=br=/mnt/.rw
937 for i in \${path}rootfs* ; do
938 fs=\${i#*root}
939 branch=\$branch:/mnt/.\$fs
940 mkdir -p /mnt/.rw/mnt/.\$fs /mnt/.\$fs /mnt/.rw/mnt/.cdrom
941 insmod /lib/squashfs.ko.gz 2> /dev/null
942 mount -o loop,ro -t squashfs \${path}root\$fs /mnt/.\$fs
943 done
944 else
945 mkdir -p /mnt/.rw/mnt/.httpfs
946 fi
947 insmod /lib/aufs.ko.gz
948 mount -t aufs -o \$branch none /mnt
949 [ -x /bin/httpfs ] && sed -i 's/DHCP="yes"/DHCP="no"/' /mnt/etc/network.conf
950 [ \$memfree -lt 30000 ] && sed -i 's/ slim//' /mnt/etc/rcS.conf
951 [ -x /mnt/sbin/init ] && exec /bin/switch_root mnt /sbin/init || sh
952 EOTEOT
953 chmod +x $TMP_DIR/initfs/init
954 for i in $TMP_DIR/initfs/lib/modules/*z ; do
955 unxz $i || gunzip $i || lzma d $i ${i%.gz}
956 rm -f $i
957 done 2> /dev/null
958 ( cd $TMP_DIR/initfs ; find | busybox cpio -o -H newc 2> /dev/null) | \
959 lzma e $TMP_DIR/initfs.gz -si
960 lzma_set_size $TMP_DIR/initfs.gz
961 rm -rf $TMP_DIR/initfs
962 align_to_32bits $TMP_DIR/initfs.gz
963 return 0
964 }
966 # Move each initramfs to squashfs
967 build_loram_rootfs()
968 {
969 rootfs_sizes=""
970 for i in $TMP_DIR/iso/boot/rootfs*.gz; do
971 mkdir -p $TMP_DIR/fs
972 cd $TMP_DIR/fs
973 ( zcat $i 2> /dev/null || unlzma -c $i) | cpio -idm
974 cd - > /dev/null
975 rootfs=$TMP_DIR/$(basename $i)
976 /usr/sbin/mksquashfs $TMP_DIR/fs $rootfs -comp xz -Xbcj x86
977 cd $TMP_DIR
978 rootfs_sizes="$rootfs_sizes $(( $(du -s $TMP_DIR/fs | cut -f1) - $(du -s $rootfs | cut -f1) ))"
979 ( cd $(dirname $rootfs); echo $(basename $rootfs) | \
980 cpio -o -H newc ) > $rootfs.cpio
981 rm -f $rootfs
982 mv $rootfs.cpio $rootfs
983 cd - > /dev/null
984 rm -rf $TMP_DIR/fs
985 done
986 }
988 # Move meta boot configuration files to basic configuration files
989 # because meta loram flavor is useless when rootfs is not loaded in ram
990 unmeta_boot()
991 {
992 local root=${1:-$TMP_DIR/loramiso}
993 if [ -f $root/boot/isolinux/noram.cfg ]; then
994 # We keep enough information to do unloram...
995 [ -s $root/boot/isolinux/common.cfg ] &&
996 sed -i 's/label slitaz/label orgslitaz/' \
997 $root/boot/isolinux/common.cfg
998 set -- $(grep 'append ifmem [0-9]' $root/boot/isolinux/isolinux.cfg)
999 shift
1000 sed -i '/ifmem/{NNNNNNNNd};/^LABEL/{N;/LABEL SliTaz [^L]/{NNNd}}' \
1001 $root/boot/isolinux/isolinux.cfg
1002 [ -n "$3" ] || set -- $(grep 'append [0-9]' $root/boot/isolinux/common.cfg)
1003 sed -i "s/label $3\$/label slitaz/;s|=/boot/rootfs\(.*\).gz |=/boot/rootfs.gz |" \
1004 $root/boot/isolinux/*.cfg
1005 fi
1008 # Move rootfs to squashfs filesystem(s) to the cdrom writeable with aufs.
1009 # These squashfs may be loaded in ram a boot time.
1010 # Rootfs are also copied to cdrom for tiny ramsize systems.
1011 # Meta flavors are converted to normal flavors.
1012 build_loram_cdrom()
1014 build_initfs cdrom || return 1
1015 cp -a $TMP_DIR/iso $TMP_DIR/loramiso
1016 mkdir $TMP_DIR/loramiso/fs
1017 cd $TMP_DIR/loramiso/fs
1018 for i in $( ls ../boot/root* | sort -r ) ; do
1019 ( zcat $i 2> /dev/null || unlzma -c $i ) | cpio -idmu
1020 rm -f $i
1021 done
1022 mkdir -p $TMP_DIR/loramiso/fs/mnt/.cdrom
1023 cd - > /dev/null
1024 mv $TMP_DIR/initfs.gz $TMP_DIR/loramiso/boot/rootfs.gz
1025 unmeta_boot
1026 VOLUM_NAME="SliTaz_LoRAM_CDROM"
1027 sed -i "s|root=|isofs= rodev=/dev/cdrom/fs &|;s/.ive/cdrom/" \
1028 $TMP_DIR/loramiso/boot/isolinux/*.cfg
1029 create_iso $OUTPUT $TMP_DIR/loramiso
1032 # Create http bootstrap to load and remove loram_cdrom
1033 # Meta flavors are converted to normal flavors.
1034 build_loram_http()
1036 build_initfs http || return 1
1037 cp -a $TMP_DIR/iso $TMP_DIR/loramiso
1038 rm -f $TMP_DIR/loramiso/boot/rootfs*
1039 mv $TMP_DIR/initfs.gz $TMP_DIR/loramiso/boot/rootfs.gz
1040 unmeta_boot
1041 create_iso $OUTPUT $TMP_DIR/loramiso
1044 # Update meta flavor selection sizes.
1045 # Reduce sizes with rootfs gains.
1046 update_metaiso_sizes()
1048 for cfg in $(grep -El '(append|ifmem) [0-9]' $TMP_DIR/loramiso/boot/isolinux/*.cfg)
1049 do
1050 local append="$(grep -E '(append|ifmem) [0-9]' $cfg)"
1051 local sizes="$rootfs_sizes"
1052 local new
1053 set -- $append
1054 shift
1055 [ "$1" == "ifmem" ] && shift
1056 new=""
1057 while [ -n "$2" ]; do
1058 local s
1059 case "$1" in
1060 *G) s=$(( ${1%G} * 1024 * 1024 ));;
1061 *M) s=$(( ${1%M} * 1024 ));;
1062 *) s=${1%K};;
1063 esac
1064 sizes=${sizes#* }
1065 for i in $sizes ; do
1066 s=$(( $s - $i ))
1067 done
1068 new="$new $s $2"
1069 shift 2
1070 done
1071 sed -i -e "/append [0-9]/s/append .*/append$new $1/" -e \
1072 "/append ifmem [0-9]/s/append .*/append ifmem$new $1/" $cfg
1073 sed -i 's|\(initrd=\)\(/boot/rootfs.\.gz\)|\1/boot/rootfs.gz,\2|' $cfg
1074 sed -i '/LABEL base/{NNNNp;s|base .ive|cdrom|;s|base|cdrom|;s|,[^ ]*||}' $cfg
1075 done
1078 # Move rootfs to a squashfs filesystem into the initramfs writeable with aufs.
1079 # Meta flavor selection sizes are updated.
1080 build_loram_ram()
1082 build_initfs ram || return 1
1083 build_loram_rootfs
1084 cp -a $TMP_DIR/iso $TMP_DIR/loramiso
1085 rm -f $TMP_DIR/loramiso/boot/bzImage
1086 ln $TMP_DIR/loramiso/boot/vmlinuz* $TMP_DIR/loramiso/boot/bzImage
1087 mv $TMP_DIR/initfs.gz $TMP_DIR/loramiso/boot/rootfs.gz
1088 cp $TMP_DIR/rootfs* $TMP_DIR/loramiso/boot
1089 update_metaiso_sizes
1090 create_iso $OUTPUT $TMP_DIR/loramiso
1093 # Remove files installed by packages
1094 find_flavor_rootfs()
1096 for i in $1/etc/tazlito/*.extract; do
1097 [ -e $i ] || continue
1098 chroot $1 /bin/sh ${i#$1}
1099 done
1101 # Clean hardlinks and files patched by genisofs in /boot
1102 for i in isolinux/isolinux.bin isolinux/boot.cat bzImage ; do
1103 rm -f $1/boot/$i
1104 done
1106 # Clean files generated in post_install
1107 rm -f $1/lib/modules/*/modules.* $1/etc/mtab \
1108 $1/dev/core $1/dev/fd $1/dev/std*
1110 # Verify md5
1111 cat $1$INSTALLED/*/md5sum | \
1112 while read md5 file; do
1113 [ -e $1$file ] || continue
1114 [ "$(cat $1$file | md5sum)" == "$md5 -" ] &&
1115 rm -f $1$file
1116 done
1118 # Check configuration files
1119 for i in $1$INSTALLED/*/volatile.cpio.gz; do
1120 [ -e $i ] || continue
1121 mkdir /tmp/volatile$$
1122 zcat $i | ( cd /tmp/volatile$$ ; cpio -idmu > /dev/null 2>&1 )
1123 ( cd /tmp/volatile$$ ; find * -type f 2> /dev/null) | \
1124 while read file ; do
1125 [ -e $1/$file ] || continue
1126 cmp -s /tmp/volatile$$/$file $1/$file && rm -f $1/$file
1127 done
1128 rm -rf /tmp/volatile$$
1129 done
1131 # Remove other files blindly
1132 for i in $1$INSTALLED/*/files.list; do
1133 for file in $(cat $i); do
1134 [ $1$file -nt $i ] && continue
1135 [ -f $1$file -a ! -L $1$file ] && continue
1136 [ -d $1$file ] || rm -f $1$file
1137 done
1138 done
1140 # Remove tazpkg files and tmp files
1141 rm -rf $1$INSTALLED* $1/tmp $1/var/tmp
1142 rm -f $1$LOCALSTATE/*packages* $1$LOCALSTATE/files.list.lzma \
1143 $1$LOCALSTATE/mirror* $1/var/cache/*/* \
1144 $1/var/lock/* $1/var/log/* $1/var/run/* $1/var/run/*/* \
1145 $1/var/lib/* $1/var/lib/dbus/* 2> /dev/null
1147 # Cleanup directory tree
1148 cd $1
1149 find * -type d | sort -r | while read dir; do
1150 rmdir $dir 2> /dev/null
1151 done
1152 cd - > /dev/null
1155 ####################
1156 # Tazlito commands #
1157 ####################
1159 case "$COMMAND" in
1160 stats)
1161 # Tazlito general statistics from the config file.
1163 echo ""
1164 echo -e "\033[1mTazlito statistics\033[0m
1165 ===============================================================================
1166 Config file : $CONFIG_FILE
1167 ISO name : $ISO_NAME.iso
1168 Volume name : $VOLUM_NAME
1169 Prepared : $PREPARED
1170 Packages repository : $PACKAGES_REPOSITORY
1171 Distro directory : $DISTRO"
1172 if [ ! "$ADDFILES" = "" ] ; then
1173 echo -e "Additional files : $ADDFILES"
1174 fi
1175 separator
1176 echo ""
1177 ;;
1178 list-addfiles)
1179 # Simple list of additional files in the rootfs
1180 echo ""
1181 cd $ADDFILES
1182 find rootfs -type f
1183 echo "" ;;
1184 gen-config)
1185 # Generate a new config file in the current dir or the specified
1186 # directory by $2.
1188 if [ -n "$2" ] ; then
1189 mkdir -p $2 && cd $2
1190 fi
1191 echo -n "Generating empty tazlito.conf..."
1192 empty_config_file
1193 status
1194 echo ""
1195 if [ -f "tazlito.conf" ] ; then
1196 echo "Configuration file is ready to edit."
1197 echo "File location : `pwd`/tazlito.conf"
1198 echo ""
1199 fi
1200 ;;
1201 configure)
1202 # Configure a tazlito.conf config file. Start by getting
1203 # a empty config file and sed it.
1205 if [ -f "tazlito.conf" ] ; then
1206 rm tazlito.conf
1207 else
1208 if test $(id -u) = 0 ; then
1209 cd /etc
1210 else
1211 echo "You must be root to configure the main config file or in"
1212 echo "the same directory of the file you want to configure."
1213 exit 0
1214 fi
1215 fi
1216 empty_config_file
1217 echo""
1218 echo -e "\033[1mConfiguring :\033[0m `pwd`/tazlito.conf"
1219 separator
1220 # ISO name.
1221 echo -n "ISO name : " ; read answer
1222 sed -i s#'ISO_NAME=\"\"'#"ISO_NAME=\"$answer\""# tazlito.conf
1223 # Volume name.
1224 echo -n "Volume name : " ; read answer
1225 sed -i s/'VOLUM_NAME=\"SliTaz\"'/"VOLUM_NAME=\"$answer\""/ tazlito.conf
1226 # Packages repository.
1227 echo -n "Packages repository : " ; read answer
1228 sed -i s#'PACKAGES_REPOSITORY=\"\"'#"PACKAGES_REPOSITORY=\"$answer\""# tazlito.conf
1229 # Distro path.
1230 echo -n "Distro path : " ; read answer
1231 sed -i s#'DISTRO=\"\"'#"DISTRO=\"$answer\""# tazlito.conf
1232 separator
1233 echo "Config file is ready to use."
1234 echo "You can now extract an ISO or generate a distro."
1235 echo ""
1236 ;;
1237 gen-iso)
1238 # Simply generate a new iso.
1240 check_root
1241 verify_rootcd
1242 gen_livecd_isolinux
1243 distro_stats
1244 ;;
1245 gen-initiso)
1246 # Simply generate a new initramfs with a new iso.
1248 check_root
1249 verify_rootcd
1250 gen_initramfs $ROOTFS
1251 gen_livecd_isolinux
1252 distro_stats
1253 ;;
1254 extract-distro)
1255 # Extract an ISO image to a directory and rebuild the LiveCD tree.
1257 check_root
1258 ISO_IMAGE=$2
1259 if [ -z "$ISO_IMAGE" ] ; then
1260 echo -e "\nPlease specify the path to the ISO image."
1261 echo -e "Example : `basename $0` image.iso /path/target\n"
1262 exit 0
1263 fi
1264 # Set the distro path by checking for $3 on cmdline.
1265 if [ -n "$3" ] ; then
1266 TARGET=$3
1267 else
1268 TARGET=$DISTRO
1269 fi
1270 # Exit if existing distro is found.
1271 if [ -d "$TARGET/rootfs" ] ; then
1272 echo -e "\nA rootfs exists in : $TARGET"
1273 echo -e "Please clean the distro tree or change directory path.\n"
1274 exit 0
1275 fi
1276 echo ""
1277 echo -e "\033[1mTazlito extracting :\033[0m `basename $ISO_IMAGE`"
1278 separator
1279 # Start to mount the ISO.
1280 echo ""
1281 echo "Mounting ISO image..."
1282 mkdir -p $TMP_DIR
1283 # Get ISO file size.
1284 isosize=`du -sh $ISO_IMAGE | cut -f1`
1285 mount -o loop $ISO_IMAGE $TMP_DIR
1286 sleep 2
1287 # Prepare target dir, copy the kernel and the rootfs.
1288 mkdir -p $TARGET/rootfs
1289 mkdir -p $TARGET/rootcd/boot
1290 echo -n "Copying the Linux kernel..."
1291 if cp $TMP_DIR/boot/vmlinuz* $TARGET/rootcd/boot 2> /dev/null; then
1292 ln $TARGET/rootcd/boot/vmlinuz* $TARGET/rootcd/boot/bzImage
1293 else
1294 cp $TMP_DIR/boot/bzImage $TARGET/rootcd/boot
1295 fi
1296 status
1297 echo -n "Copying isolinux files..."
1298 cp -a $TMP_DIR/boot/isolinux $TARGET/rootcd/boot
1299 for i in $(ls $TMP_DIR); do
1300 [ "$i" = "boot" ] && continue
1301 cp -a $TMP_DIR/$i $TARGET/rootcd
1302 done
1303 status
1304 if [ -d $TMP_DIR/boot/syslinux ]; then
1305 echo -n "Copying syslinux files..."
1306 cp -a $TMP_DIR/boot/syslinux $TARGET/rootcd/boot
1307 status
1308 fi
1309 if [ -d $TMP_DIR/boot/extlinux ]; then
1310 echo -n "Copying extlinux files..."
1311 cp -a $TMP_DIR/boot/extlinux $TARGET/rootcd/boot
1312 status
1313 fi
1314 if [ -d $TMP_DIR/boot/grub ]; then
1315 echo -n "Copying GRUB files..."
1316 cp -a $TMP_DIR/boot/grub $TARGET/rootcd/boot
1317 status
1318 fi
1320 echo -n "Copying the rootfs..."
1321 cp $TMP_DIR/boot/rootfs.?z $TARGET/rootcd/boot
1322 status
1323 # Extract initramfs.
1324 cd $TARGET/rootfs
1325 echo -n "Extracting the rootfs... "
1326 extract_rootfs ../rootcd/boot/rootfs.gz $TARGET/rootfs
1327 # unpack /usr
1328 for i in etc/tazlito/*.extract; do
1329 [ -f "$i" ] && . $i ../rootcd
1330 done
1331 # Umount and remove temp directory and cd to $TARGET to get stats.
1332 umount $TMP_DIR && rm -rf $TMP_DIR
1333 cd ..
1334 echo ""
1335 separator
1336 echo "Extracted : `basename $ISO_IMAGE` ($isosize)"
1337 echo "Distro tree : `pwd`"
1338 echo "Rootfs size : `du -sh rootfs`"
1339 echo "Rootcd size : `du -sh rootcd`"
1340 separator
1341 echo ""
1342 ;;
1343 list-flavors)
1344 # Show available flavors.
1345 if [ ! -s /etc/tazlito/flavors.list -o "$2" == "--recharge" ]; then
1346 download flavors.list -O - > /etc/tazlito/flavors.list
1347 fi
1348 echo ""
1349 echo -e "\033[1mList of flavors\033[0m"
1350 separator
1351 cat /etc/tazlito/flavors.list
1352 echo ""
1353 ;;
1354 show-flavor)
1355 # Show flavor description.
1356 FLAVOR=${2%.flavor}
1357 if [ ! -f "$FLAVOR.flavor" ]; then
1358 echo "File $FLAVOR.flavor not found."
1359 exit 1
1360 fi
1361 mkdir $TMP_DIR
1362 zcat $FLAVOR.flavor | ( cd $TMP_DIR; cpio -i > /dev/null)
1363 if [ "$3" = "--brief" ]; then
1364 if [ "$4" != "--noheader" ]; then
1365 echo "Name ISO Rootfs Description"
1366 separator
1367 fi
1368 printf "%-16.16s %6.6s %6.6s %s\n" "$FLAVOR" \
1369 "$(field ISO $TMP_DIR/$FLAVOR.desc)" \
1370 "$(field 'Rootfs size' $TMP_DIR/$FLAVOR.desc)" \
1371 "$(grep ^Description $TMP_DIR/$FLAVOR.desc | cut -d: -f2)"
1372 else
1373 separator
1374 cat $TMP_DIR/$FLAVOR.desc
1375 fi
1376 rm -Rf $TMP_DIR
1377 ;;
1378 gen-liveflavor)
1379 # Generate a new flavor from the live system.
1380 FLAVOR=${2%.flavor}
1381 DESC=""
1382 case "$FLAVOR" in
1383 '') echo -n "Flavor name : "
1384 read FLAVOR
1385 [ -z "$FLAVOR" ] && exit 1;;
1386 -?|-h*|--help) echo -e "
1388 SliTaz Live Tool - Version: $VERSION
1389 \033[1mUsage: \033[0m `basename $0` gen-liveflavor flavor-name [flavor-patch-file]
1390 \033[1mflavor-patch-file format: \033[0m
1391 code data
1392 + package to add
1393 - package to remove
1394 ! non-free package to add
1395 ? display message
1396 @ flavor description
1398 \033[1mExample: \033[0m
1399 @ Developer tools for slitaz maintainers
1400 + slitaz-toolchain
1401 + mercurial
1403 exit 1;;
1404 esac
1405 mv /etc/tazlito/distro-packages.list \
1406 /etc/tazlito/distro-packages.list.$$ 2> /dev/null
1407 rm -f distro-packages.list non-free.list 2> /dev/null
1408 tazpkg recharge
1409 [ -n "$3" ] && while read action pkg; do
1410 case "$action" in
1411 +) yes | tazpkg get-install $pkg 2>&1 >> $log || exit 1 ;;
1412 -) yes | tazpkg remove $pkg ;;
1413 !) echo $pkg >> non-free.list ;;
1414 @) DESC="$pkg" ;;
1415 \?) echo -en "$pkg"; read action ;;
1416 esac
1417 done < $3
1418 yes '' | tazlito gen-distro
1419 echo "$DESC" | tazlito gen-flavor "$FLAVOR"
1420 mv /etc/tazlito/distro-packages.list.$$ \
1421 /etc/tazlito/distro-packages.list 2> /dev/null
1422 ;;
1423 gen-flavor)
1424 # Generate a new flavor from the last iso image generated.
1425 FLAVOR=${2%.flavor}
1426 echo ""
1427 echo -e "\033[1mFlavor generation\033[0m"
1428 separator
1429 if [ -z "$FLAVOR" ]; then
1430 echo -n "Flavor name : "
1431 read FLAVOR
1432 [ -z "$FLAVOR" ] && exit 1
1433 fi
1434 check_rootfs
1435 FILES="$FLAVOR.pkglist"
1436 echo -n "Creating file $FLAVOR.flavor..."
1437 for i in rootcd rootfs; do
1438 if [ -d "$ADDFILES/$i" ] ; then
1439 FILES="$FILES\n$FLAVOR.$i"
1440 ( cd "$ADDFILES/$i"; find . | \
1441 cpio -o -H newc 2> /dev/null | gzip -9 ) > $FLAVOR.$i
1442 fi
1443 done
1444 status
1445 answer=`grep -s ^Description $FLAVOR.desc`
1446 answer=${answer#Description : }
1447 if [ -z "$answer" ]; then
1448 echo -n "Description : "
1449 read answer
1450 fi
1451 echo -n "Compressing flavor $FLAVOR..."
1452 echo "Flavor : $FLAVOR" > $FLAVOR.desc
1453 echo "Description : $answer" >> $FLAVOR.desc
1454 ( cd $DISTRO; distro_sizes) >> $FLAVOR.desc
1455 \rm -f $FLAVOR.pkglist $FLAVOR.nonfree 2> /dev/null
1456 for i in $(ls $ROOTFS$INSTALLED); do
1457 eval $(grep ^VERSION= $ROOTFS$INSTALLED/$i/receipt)
1458 EXTRAVERSION=""
1459 eval $(grep ^EXTRAVERSION= $ROOTFS$INSTALLED/$i/receipt)
1460 eval $(grep ^CATEGORY= $ROOTFS$INSTALLED/$i/receipt)
1461 if [ "$CATEGORY" = "non-free" -a "${i%%-*}" != "get" ]
1462 then
1463 echo "$i" >> $FLAVOR.nonfree
1464 else
1465 echo "$i-$VERSION$EXTRAVERSION" >> $FLAVOR.pkglist
1466 fi
1467 done
1468 [ -s $FLAVOR.nonfree ] && $FILES="$FILES\n$FLAVOR.nonfree"
1469 for i in $LOCALSTATE/undigest/*/mirror ; do
1470 [ -s $i ] && cat $i >> $FLAVOR.mirrors
1471 done
1472 [ -s $FLAVOR.mirrors ] && $FILES="$FILES\n$FLAVOR.mirrors"
1473 echo -e "$FLAVOR.desc\n$FILES" | cpio -o -H newc 2>/dev/null | \
1474 gzip -9 > $FLAVOR.flavor
1475 rm `echo -e $FILES`
1476 status
1477 separator
1478 echo "Flavor size : `du -sh $FLAVOR.flavor`"
1479 echo ""
1480 ;;
1481 upgrade-flavor)
1482 # Update package list to the latest versions available.
1483 FLAVOR=${2%.flavor}
1484 if [ -f $FLAVOR.flavor ] || download $FLAVOR.flavor; then
1485 mkdir $TMP_DIR
1486 zcat $FLAVOR.flavor | ( cd $TMP_DIR; cpio -i >/dev/null )
1487 echo -n "Updating $FLAVOR package list..."
1488 [ -s $LOCALSTATE/packages.list ] || tazpkg recharge
1489 packed_size=0; unpacked_size=0
1490 while read org; do
1491 i=0
1492 pkg=$org
1493 while ! grep -q ^$pkg$ $LOCALSTATE/packages.txt; do
1494 pkg=${pkg%-*}
1495 i=$(($i + 1))
1496 [ $i -gt 5 ] && break;
1497 done
1498 set -- $(get_size $pkg)
1499 packed_size=$(( $packed_size + $1 ))
1500 unpacked_size=$(( $unpacked_size + $2 ))
1501 for i in $(grep ^$pkg $LOCALSTATE/packages.list); do
1502 echo $i
1503 break
1504 done
1505 done < $TMP_DIR/$FLAVOR.pkglist \
1506 > $TMP_DIR/$FLAVOR.pkglist.$$
1507 mv -f $TMP_DIR/$FLAVOR.pkglist.$$ $TMP_DIR/$FLAVOR.pkglist
1508 if [ -s $TMP_DIR/$FLAVOR.rootfs ]; then
1509 packed_size=$(($packed_size \
1510 + $(cat $TMP_DIR/$FLAVOR.rootfs | wc -c ) / 100 ))
1511 unpacked_size=$(($unpacked_size \
1512 + $(zcat $TMP_DIR/$FLAVOR.rootfs | wc -c ) / 100 ))
1513 fi
1514 # Estimate lzma
1515 packed_size=$(($packed_size * 2 / 3))
1516 iso_size=$(( $packed_size + 26000 ))
1517 if [ -s $TMP_DIR/$FLAVOR.rootcd ]; then
1518 iso_size=$(($iso_size \
1519 + $(zcat $TMP_DIR/$FLAVOR.rootcd | wc -c ) / 100 ))
1520 fi
1521 sed -i -e '/Image is ready/d' \
1522 -e "s/Rootfs size\( *:\) \(.*\)/Rootfs size\1 $(cent2human $unpacked_size) (estimated)/" \
1523 -e "s/Initramfs size\( *:\) \(.*\)/Initramfs size\1 $(cent2human $packed_size) (estimated)/" \
1524 -e "s/ISO image size\( *:\) \(.*\)/ISO image size\1 $(cent2human $iso_size) (estimated)/" \
1525 -e "s/date\( *:\) \(.*\)/date\1 $(date +%Y%m%d\ \at\ \%H:%M:%S)/" \
1526 $TMP_DIR/$FLAVOR.desc
1527 ( cd $TMP_DIR ; ls | cpio -o -H newc ) | gzip -9 > \
1528 $FLAVOR.flavor
1529 status
1530 rm -Rf $TMP_DIR
1531 fi
1532 ;;
1533 extract-flavor)
1534 # Extract a flavor into $FLAVORS_REPOSITORY.
1535 FLAVOR=${2%.flavor}
1536 if [ -f $FLAVOR.flavor ] || download $FLAVOR.flavor; then
1537 mkdir $TMP_DIR
1538 zcat $FLAVOR.flavor | ( cd $TMP_DIR; cpio -i >/dev/null )
1539 echo -n "Extracting $FLAVOR..."
1540 rm -rf $FLAVORS_REPOSITORY/$FLAVOR 2> /dev/null
1541 mkdir -p $FLAVORS_REPOSITORY/$FLAVOR
1542 cp $TMP_DIR/$FLAVOR.receipt $FLAVORS_REPOSITORY/$FLAVOR/receipt
1543 #~ echo "FLAVOR=\"$FLAVOR\"" > $FLAVORS_REPOSITORY/$FLAVOR/receipt
1544 #~ grep ^Description $TMP_DIR/$FLAVOR.desc | \
1545 #~ sed 's/.*: \(.*\)$/SHORT_DESC="\1"/' >> \
1546 #~ $FLAVORS_REPOSITORY/$FLAVOR/receipt
1547 #~ grep ^Version $TMP_DIR/$FLAVOR.desc | \
1548 #~ sed 's/.*: \(.*\)$/VERSION="\1"/' >> \
1549 #~ $FLAVORS_REPOSITORY/$FLAVOR/receipt
1550 #~ grep ^Maintainer $TMP_DIR/$FLAVOR.desc | \
1551 #~ sed 's/.*: \(.*\)$/MAINTAINER="\1"/' >> \
1552 #~ $FLAVORS_REPOSITORY/$FLAVOR/receipt
1553 #~ grep -q '^Rootfs list' $TMP_DIR/$FLAVOR.desc && \
1554 #~ grep '^Rootfs list' $TMP_DIR/$FLAVOR.desc | \
1555 #~ sed 's/.*: \(.*\)$/ROOTFS_SELECTION="\1"/' >> \
1556 #~ $FLAVORS_REPOSITORY/$FLAVOR/receipt
1557 #~ grep '^Rootfs size' $TMP_DIR/$FLAVOR.desc | \
1558 #~ sed 's/.*: \(.*\)$/ROOTFS_SIZE="\1"/' >> \
1559 #~ $FLAVORS_REPOSITORY/$FLAVOR/receipt
1560 #~ grep ^Initramfs $TMP_DIR/$FLAVOR.desc | \
1561 #~ sed 's/.*: \(.*\)$/INITRAMFS_SIZE="\1"/' >> \
1562 #~ $FLAVORS_REPOSITORY/$FLAVOR/receipt
1563 #~ grep ^ISO $TMP_DIR/$FLAVOR.desc | \
1564 #~ sed 's/.*: \(.*\)$/ISO_SIZE="\1"/' >> \
1565 #~ $FLAVORS_REPOSITORY/$FLAVOR/receipt
1566 for i in rootcd rootfs; do
1567 [ -f $TMP_DIR/$FLAVOR.$i ] || continue
1568 mkdir $FLAVORS_REPOSITORY/$FLAVOR/$i
1569 zcat $TMP_DIR/$FLAVOR.$i | \
1570 (cd $FLAVORS_REPOSITORY/$FLAVOR/$i; \
1571 cpio -idm > /dev/null)
1572 done
1573 [ -s $TMP_DIR/$FLAVOR.mirrors ] &&
1574 cp $TMP_DIR/$FLAVOR.mirrors \
1575 $FLAVORS_REPOSITORY/$FLAVOR/mirrors
1576 [ -s $LOCALSTATE/packages.list ] || tazpkg recharge
1577 while read org; do
1578 i=0
1579 pkg=$org
1580 while ! grep -q ^$pkg$ $LOCALSTATE/packages.txt; do
1581 pkg=${pkg%-*}
1582 i=$(($i + 1))
1583 [ $i -gt 5 ] && break;
1584 done
1585 echo $pkg
1586 done < $TMP_DIR/$FLAVOR.pkglist \
1587 > $FLAVORS_REPOSITORY/$FLAVOR/packages.list
1588 status
1589 rm -Rf $TMP_DIR
1590 fi
1591 ;;
1592 pack-flavor)
1593 # Create a flavor from $FLAVORS_REPOSITORY.
1594 FLAVOR=${2%.flavor}
1595 if [ -s $FLAVORS_REPOSITORY/$FLAVOR/receipt ]; then
1596 mkdir $TMP_DIR
1597 echo -n "Creating flavor $FLAVOR..."
1598 [ -s $LOCALSTATE/packages.list ] || tazpkg recharge
1599 if [ -s $FLAVORS_REPOSITORY/$FLAVOR/mirrors ]; then
1600 cp $FLAVORS_REPOSITORY/$FLAVOR/mirrors \
1601 $TMP_DIR/$FLAVOR.mirrors
1602 for i in $(cat $TMP_DIR/$FLAVOR.mirrors); do
1603 wget -O - $i/packages.list >> $TMP_DIR/packages.list
1604 done
1605 fi
1606 #add distro.sh if exist
1607 if [ -s $FLAVORS_REPOSITORY/$FLAVOR/distro.sh ]; then
1608 cp $FLAVORS_REPOSITORY/$FLAVOR/distro.sh $TMP_DIR/$FLAVOR-distro.sh
1609 fi
1611 # Get receipt in .flavor
1612 if [ -s $FLAVORS_REPOSITORY/$FLAVOR/receipt ]; then
1613 cp $FLAVORS_REPOSITORY/$FLAVOR/receipt $TMP_DIR/$FLAVOR.receipt
1614 fi
1616 # Build the package list.
1618 # On peut inclure une liste venant d'une autre saveur avec le mot clé @include
1619 if [ -s $FLAVORS_REPOSITORY/$FLAVOR/packages.list ]; then
1620 INCLUDE=$(grep '^@include' $FLAVORS_REPOSITORY/$FLAVOR/packages.list)
1621 if [ ! -z "$INCLUDE" ]; then
1622 INCLUDE=${INCLUDE#@include }
1623 [ -s "$FLAVORS_REPOSITORY/$INCLUDE/packages.list" ] && \
1624 get_pkglist $INCLUDE > $TMP_DIR/$FLAVOR.pkglist || \
1625 echo -e "\nERROR: Can't find include package list from $INCLUDE\n"
1626 fi
1627 # Generate the final/initial package list
1628 [ -s $FLAVORS_REPOSITORY/$FLAVOR/packages.list ] && \
1629 get_pkglist $FLAVOR >> $TMP_DIR/$FLAVOR.pkglist
1630 fi
1631 if grep -q ^ROOTFS_SELECTION \
1632 $FLAVORS_REPOSITORY/$FLAVOR/receipt; then
1633 . $FLAVORS_REPOSITORY/$FLAVOR/receipt
1634 set -- $ROOTFS_SELECTION
1635 [ -n "$FRUGAL_RAM" ] || FRUGAL_RAM=$1
1636 [ -f $FLAVORS_REPOSITORY/$2/packages.list ] ||
1637 tazlito extract-flavor $2
1638 get_pkglist $2 > $TMP_DIR/$FLAVOR.pkglist
1639 for i in rootcd rootfs; do
1640 mkdir $TMP_DIR/$i
1641 # Copy extra files from the first flavor
1642 [ -d $FLAVORS_REPOSITORY/$2/$i ] &&
1643 cp -a $FLAVORS_REPOSITORY/$2/$i $TMP_DIR
1644 # Overload extra files by meta flavor
1645 [ -d $FLAVORS_REPOSITORY/$FLAVOR/$i ] &&
1646 cp -a $FLAVORS_REPOSITORY/$FLAVOR/$i $TMP_DIR
1647 [ -n "$(ls $TMP_DIR/$i)" ] &&
1648 ( cd $TMP_DIR/$i ; find . | cpio -o -H newc 2> /dev/null ) | \
1649 gzip -9 >$TMP_DIR/$FLAVOR.$i
1650 rm -rf $TMP_DIR/$i
1651 done
1652 else
1653 for i in rootcd rootfs; do
1654 [ -d $FLAVORS_REPOSITORY/$FLAVOR/$i ] || \
1655 continue
1656 ( cd $FLAVORS_REPOSITORY/$FLAVOR/$i ; \
1657 find . | cpio -o -H newc 2> /dev/null ) | \
1658 gzip -9 >$TMP_DIR/$FLAVOR.$i
1659 done
1660 fi
1661 if [ -s $TMP_DIR/$FLAVOR.rootfs ]; then
1662 packed_size=$(($packed_size \
1663 + $(cat $TMP_DIR/$FLAVOR.rootfs | wc -c ) / 100 ))
1664 unpacked_size=$(($unpacked_size \
1665 + $(zcat $TMP_DIR/$FLAVOR.rootfs | wc -c ) / 100 ))
1666 fi
1667 # Estimate lzma
1668 packed_size=$(($packed_size * 2 / 3))
1669 iso_size=$(( $packed_size + 26000 ))
1670 if [ -s $TMP_DIR/$FLAVOR.rootcd ]; then
1671 iso_size=$(($iso_size \
1672 + $(zcat $TMP_DIR/$FLAVOR.rootcd | wc -c ) / 100 ))
1673 fi
1674 VERSION=""
1675 MAINTAINER=""
1676 ROOTFS_SELECTION=""
1677 ROOTFS_SIZE="$(cent2human $unpacked_size) (estimated)"
1678 INITRAMFS_SIZE="$(cent2human $packed_size) (estimated)"
1679 ISO_SIZE="$(cent2human $iso_size) (estimated)"
1680 . $FLAVORS_REPOSITORY/$FLAVOR/receipt
1681 cat > $TMP_DIR/$FLAVOR.desc <<EOT
1682 Flavor : $FLAVOR
1683 Description : $SHORT_DESC
1684 EOT
1685 [ -n "$VERSION" ] && cat >> $TMP_DIR/$FLAVOR.desc <<EOT
1686 Version : $VERSION
1687 EOT
1688 [ -n "$MAINTAINER" ] && cat >> $TMP_DIR/$FLAVOR.desc <<EOT
1689 Maintainer : $MAINTAINER
1690 EOT
1691 [ -n "$FRUGAL_RAM" ] && cat >> $TMP_DIR/$FLAVOR.desc <<EOT
1692 LiveCD RAM size : $FRUGAL_RAM
1693 EOT
1694 [ -n "$ROOTFS_SELECTION" ] && cat >> $TMP_DIR/$FLAVOR.desc <<EOT
1695 Rootfs list : $ROOTFS_SELECTION
1696 EOT
1697 cat >> $TMP_DIR/$FLAVOR.desc <<EOT
1698 Build date : $(date +%Y%m%d\ \at\ \%H:%M:%S)
1699 Packages : $(grep -v ^# $TMP_DIR/$FLAVOR.pkglist | wc -l)
1700 Rootfs size : $ROOTFS_SIZE
1701 Initramfs size : $INITRAMFS_SIZE
1702 ISO image size : $ISO_SIZE
1703 ================================================================================
1705 EOT
1706 rm -f $TMP_DIR/packages.list
1707 ( cd $TMP_DIR ; ls | cpio -o -H newc 2> /dev/null) | \
1708 gzip -9 > $FLAVOR.flavor
1709 status
1710 rm -Rf $TMP_DIR
1711 else
1712 echo "No $FLAVOR flavor in $FLAVORS_REPOSITORY."
1713 fi
1714 ;;
1715 get-flavor)
1716 # Get a flavor's files and prepare for gen-distro.
1717 FLAVOR=${2%.flavor}
1718 echo -e "\n\033[1mPreparing $FLAVOR distro flavor\033[0m"
1719 separator
1720 if [ -f $FLAVOR.flavor ] || download $FLAVOR.flavor; then
1721 echo -n "Cleaning $DISTRO..."
1722 rm -R $DISTRO 2> /dev/null
1723 mkdir -p $DISTRO
1724 status
1725 mkdir $TMP_DIR
1726 echo -n "Extracting flavor $FLAVOR.flavor... "
1727 zcat $FLAVOR.flavor | ( cd $TMP_DIR; cpio -i >/dev/null )
1728 status
1729 echo -n "Creating distro-packages.list..."
1730 mv $TMP_DIR/$FLAVOR.nonfree non-free.list 2> /dev/null
1731 mv $TMP_DIR/$FLAVOR.pkglist distro-packages.list
1732 status
1733 if [ -f "$TMP_DIR/$FLAVOR-distro.sh" ]; then
1734 echo -n "Extracting distro.sh... "
1735 mv $TMP_DIR/$FLAVOR-distro.sh distro.sh 2> /dev/null
1736 status
1737 fi
1738 if [ -f "$TMP_DIR/$FLAVOR.receipt" ]; then
1739 echo -n "Extracting receipt... "
1740 mv $TMP_DIR/$FLAVOR.receipt receipt 2> /dev/null
1741 status
1742 fi
1743 infos="$FLAVOR.desc"
1744 for i in rootcd rootfs; do
1745 if [ -f $TMP_DIR/$FLAVOR.$i ]; then
1746 echo -n "Adding $i files... "
1747 mkdir -p "$ADDFILES/$i"
1748 zcat $TMP_DIR/$FLAVOR.$i | \
1749 ( cd "$ADDFILES/$i"; cpio -id > /dev/null)
1750 zcat $TMP_DIR/$FLAVOR.$i | cpio -tv 2> /dev/null \
1751 > $TMP_DIR/$FLAVOR.list$i
1752 infos="$infos\n$FLAVOR.list$i"
1753 status
1754 fi
1755 done
1756 if [ -s $TMP_DIR/$FLAVOR.mirrors ]; then
1757 n=""
1758 while read line; do
1759 mkdir -p $LOCALSTATE/undigest/$FLAVOR$n
1760 echo "$line" > $LOCALSTATE/undigest/$FLAVOR$n/mirror
1761 n=$(( $n + 1 ))
1762 done < $TMP_DIR/$FLAVOR.mirrors
1763 infos="$infos\n$FLAVOR.mirrors"
1764 tazpkg recharge
1765 fi
1766 rm -f /etc/tazlito/rootfs.list
1767 grep -q '^Rootfs list' $TMP_DIR/$FLAVOR.desc &&
1768 grep '^Rootfs list' $TMP_DIR/$FLAVOR.desc | \
1769 sed 's/.*: \(.*\)$/\1/' > /etc/tazlito/rootfs.list
1770 echo -n "Updating tazlito.conf..."
1771 [ -f tazlito.conf ] || cp /etc/tazlito/tazlito.conf .
1772 cat tazlito.conf | grep -v "^#VOLUM_NAME" | \
1773 sed "s/^VOLUM_NA/VOLUM_NAME=\"SliTaz $FLAVOR\"\\n#VOLUM_NA/" \
1774 > tazlito.conf.$$ && mv tazlito.conf.$$ tazlito.conf
1775 sed -i "s/ISO_NAME=.*/ISO_NAME=\"slitaz-$FLAVOR\"/" tazlito.conf
1776 status
1777 ( cd $TMP_DIR ; echo -e $infos | cpio -o -H newc ) | \
1778 gzip -9 > /etc/tazlito/info
1779 rm -Rf $TMP_DIR
1780 fi
1781 separator
1782 echo -e "Flavor is ready to be generated by: tazlito gen-distro\n"
1783 ;;
1785 iso2flavor)
1786 if [ -z "$3" -o ! -s "$2" ]; then
1787 cat <<EOT
1788 Usage : tazlito iso2flavor image.iso flavor_name
1790 Create a file flavor_name.flavor from the cdrom image file image.iso
1791 EOT
1792 exit 1
1793 fi
1794 FLAVOR=${3%.flavor}
1795 mkdir -p $TMP_DIR/iso $TMP_DIR/rootfs
1796 mount -o loop,ro $2 $TMP_DIR/iso
1797 if [ -s $TMP_DIR/iso/boot/rootfs1.gz ]; then
1798 echo "META flavors are not supported."
1799 umount -d $TMP_DIR/iso
1800 elif [ ! -s $TMP_DIR/iso/boot/rootfs.gz ]; then
1801 echo "No /boot/rootfs.gz in iso image. Needs a SliTaz iso."
1802 umount -d $TMP_DIR/iso
1803 else
1804 ( unlzma -c $TMP_DIR/iso/boot/rootfs.gz || \
1805 zcat $TMP_DIR/iso/boot/rootfs.gz ) | \
1806 ( cd $TMP_DIR/rootfs ; cpio -idmu > /dev/null 2>&1 )
1807 if [ ! -s $TMP_DIR/rootfs/etc/slitaz-release ]; then
1808 echo "No file /etc/slitaz-release in /boot/rootfs.gz of iso image. Needs a non loram SliTaz iso."
1809 umount -d $TMP_DIR/iso
1810 else
1811 ROOTFS_SIZE=$(du -hs $TMP_DIR/rootfs | awk '{ print $1 }')
1812 RAM_SIZE=$(du -s $TMP_DIR/rootfs | awk '{ print 32*int(($1+36000)/32768) "M" }')
1813 cp -a $TMP_DIR/iso $TMP_DIR/rootcd
1814 ISO_SIZE=$(df -h $TMP_DIR/iso | awk 'END { print $2 }')
1815 BUILD_DATE=$(date +%Y%m%d\ \at\ \%H:%M:%S -r $TMP_DIR/iso/md5sum)
1816 umount -d $TMP_DIR/iso
1817 INITRAMFS_SIZE=$(du -chs $TMP_DIR/rootcd/boot/rootfs.gz | awk '{ s=$1 } END { print $1 }')
1818 rm -f $TMP_DIR/rootcd/boot/rootfs.gz $TMP_DIR/rootcd/md5sum
1819 mv $TMP_DIR/rootcd/boot $TMP_DIR/rootfs
1820 sed 's/.* \(.*\).tazpkg*/\1/' > $TMP_DIR/$FLAVOR.pkglist \
1821 < $TMP_DIR/rootfs$INSTALLED.md5
1822 #[ -s $TMP_DIR/rootfs/etc/tazlito/distro-packages.list ] &&
1823 # mv $TMP_DIR/rootfs/etc/tazlito/distro-packages.list $TMP_DIR/$FLAVOR.pkglist
1824 PKGCNT=$(grep -v ^# $TMP_DIR/$FLAVOR.pkglist | wc -l | awk '{ print $1 }')
1825 find_flavor_rootfs $TMP_DIR/rootfs
1826 [ -d $TMP_DIR/rootfs/boot ] && mv $TMP_DIR/rootfs/boot $TMP_DIR/rootcd
1827 [ -n "$(ls $TMP_DIR/rootfs)" ] && ( cd $TMP_DIR/rootfs ; find * | cpio -o -H newc ) | gzip -9 > $TMP_DIR/$FLAVOR.rootfs
1828 [ -n "$(ls $TMP_DIR/rootcd)" ] && ( cd $TMP_DIR/rootcd ; find * | cpio -o -H newc ) | gzip -9 > $TMP_DIR/$FLAVOR.rootcd
1829 rm -rf $TMP_DIR/rootcd $TMP_DIR/rootfs
1830 VERSION=""; MAINTAINER=""
1831 echo -en "Flavor short description \007: "; read -t 30 DESCRIPTION
1832 if [ -n "$DESCRIPTION" ]; then
1833 echo -en "Flavor version : "; read -t 30 VERSION
1834 echo -en "Flavor maintainer (your email) : "; read -t 30 MAINTAINER
1835 fi
1836 [ -n "$DESCRIPTION" ] || DESCRIPTION="Slitaz $FLAVOR flavor"
1837 [ -n "$VERSION" ] || VERSION="1.0"
1838 [ -n "$MAINTAINER" ] || MAINTAINER="nobody@slitaz.org"
1839 cat > $TMP_DIR/$FLAVOR.desc <<EOT
1840 Flavor : $FLAVOR
1841 Description : $DESCRIPTION
1842 Version : $VERSION
1843 Maintainer : $MAINTAINER
1844 LiveCD RAM size : $RAM_SIZE
1845 Build date : $BUILD_DATE
1846 Packages : $PKGCNT
1847 Rootfs size : $ROOTFS_SIZE
1848 Initramfs size : $INITRAMFS_SIZE
1849 ISO image size : $ISO_SIZE
1850 ================================================================================
1852 EOT
1853 ( cd $TMP_DIR ; ls $FLAVOR.* | cpio -o -H newc ) | gzip -9 > $FLAVOR.flavor
1854 cat <<EOT
1855 Tazlito can't detect each file installed during a package post_install.
1856 You should extract this flavor (tazlito extract-flavor $FLAVOR),
1857 check the files in /home/slitaz/flavors/$(cat /etc/slitaz-release)/$FLAVOR/rootfs tree and remove
1858 files generated by post_installs.
1859 Check /home/slitaz/flavors/$(cat /etc/slitaz-release)/$FLAVOR/receipt too and repack the flavor
1860 (tazlito pack-flavor $FLAVOR)
1861 EOT
1862 fi
1863 fi
1864 rm -rf $TMP_DIR
1865 ;;
1867 check-list)
1868 # Use current packages list in $PWD by default.
1869 DISTRO_PKGS_LIST=distro-packages.list
1870 [ -d "$2" ] && DISTRO_PKGS_LIST=$2/distro-packages.list
1871 [ -f "$2" ] && DISTRO_PKGS_LIST=$2
1872 [ ! -f $DISTRO_PKGS_LIST ] && echo "No packages list found." && exit 0
1873 echo ""
1874 echo -e "\033[1mLiveCD packages list check\033[0m"
1875 separator
1876 for pkg in `cat $DISTRO_PKGS_LIST`
1877 do
1878 if ! grep -q "$pkg" $LOCALSTATE/packages.list; then
1879 echo "Updating: $pkg"
1880 up=$(($up + 1))
1881 fi
1882 done
1883 [ -z $up ] && echo -e "List is up-to-date\n" && exit 0
1884 separator
1885 echo -e "Updates: $up\n" ;;
1886 gen-distro)
1887 # Generate a live distro tree with a set of packages.
1889 check_root
1890 time=$(date +%s)
1892 # Check if a package list was specified on cmdline.
1893 LIST_NAME="distro-packages.list"
1894 CDROM=""
1895 while [ -n "$2" ]; do
1896 case "$2" in
1897 --iso=*)
1898 CDROM="-o loop ${2#--iso=}"
1899 ;;
1900 --cdrom)
1901 CDROM="/dev/cdrom"
1902 ;;
1903 --force)
1904 DELETE_ROOTFS="true"
1905 ;;
1906 *) if [ ! -f "$2" ] ; then
1907 echo -e "\nUnable to find the specified packages list."
1908 echo -e "List name : $2\n"
1909 exit 1
1910 fi
1911 LIST_NAME=$2
1912 ;;
1913 esac
1914 shift
1915 done
1917 if [ -d $ROOTFS ] ; then
1918 # Delete $ROOTFS if --force is set on command line
1919 if [ ! -z $DELETE_ROOTFS ]; then
1920 rm -rf $ROOTFS
1921 unset $DELETE_ROOTFS
1922 else
1923 echo -e "\nA rootfs exists in : $DISTRO"
1924 echo -e "Please clean the distro tree or change directory path.\n"
1925 exit 0
1926 fi
1927 fi
1928 if [ ! -f "$LIST_NAME" -a -d $INSTALLED ] ; then
1929 # Build list with installed packages
1930 for i in $(ls $INSTALLED); do
1931 if grep -q ^_realver $INSTALLED/$i/receipt ; then
1932 VERSION=$(. $INSTALLED/$i/receipt 2>/dev/null ; echo $VERSION)
1933 else
1934 eval $(grep ^VERSION= $INSTALLED/$i/receipt)
1935 fi
1936 EXTRAVERSION=""
1937 eval $(grep ^EXTRAVERSION= $INSTALLED/$i/receipt)
1938 echo "$i-$VERSION$EXTRAVERSION" >> $LIST_NAME
1939 done
1940 fi
1941 # Exit if no list name.
1942 if [ ! -f "$LIST_NAME" ]; then
1943 echo -e "\nNo packages list found or specified. Please read the docs.\n"
1944 exit 0
1945 fi
1946 # Start generation.
1947 echo ""
1948 echo -e "\033[1mTazlito generating a distro\033[0m"
1949 separator
1950 # Misc checks
1951 [ -n "$PACKAGES_REPOSITORY" ] || PACKAGES_REPOSITORY="."
1952 [ -d $PACKAGES_REPOSITORY ] || mkdir -p $PACKAGES_REPOSITORY
1953 # Get the list of packages using cat for a file list.
1954 LIST=`cat $LIST_NAME`
1955 # Verify if all packages in list are present in $PACKAGES_REPOSITORY.
1956 REPACK=""
1957 DOWNLOAD=""
1958 for pkg in $LIST
1959 do
1960 [ "$pkg" = "" ] && continue
1961 pkg=${pkg%.tazpkg}
1962 [ -f $PACKAGES_REPOSITORY/$pkg.tazpkg ] && continue
1963 PACKAGE=$(installed_package_name $pkg)
1964 [ -n "$PACKAGE" -a "$REPACK" = "y" ] && continue
1965 [ -z "$PACKAGE" -a -n "$DOWNLOAD" ] && continue
1966 echo -e "\nUnable to find $pkg in the repository."
1967 echo -e "Path : $PACKAGES_REPOSITORY\n"
1968 if [ -n "$PACKAGE" -a -z "$REPACK" ]; then
1969 yesorno "Repack packages from rootfs (y/N) ? "
1970 REPACK="$answer"
1971 [ "$answer" = "y" ] || REPACK="n"
1972 [ "$DOWNLOAD" = "y" ] && break
1973 fi
1974 if [ -f $MIRROR -a -z "$DOWNLOAD" ]; then
1975 yesorno "Download packages from mirror (Y/n) ? "
1976 DOWNLOAD="$answer"
1977 if [ "$answer" = "n" ]; then
1978 [ -z "$PACKAGE" ] && exit 1
1979 else
1980 DOWNLOAD="y"
1981 [ -n "$REPACK" ] && break
1982 fi
1983 fi
1984 [ "$REPACK" = "n" -a "$DOWNLOAD" = "n" ] && exit 1
1985 done
1987 # Mount cdrom to be able to repack boot-loader packages
1988 if [ ! -e /boot -a -n "$CDROM" ]; then
1989 mkdir $TMP_MNT
1990 if mount -r $CDROM $TMP_MNT 2> /dev/null; then
1991 ln -s $TMP_MNT/boot /
1992 if [ ! -d "$ADDFILES/rootcd" ] ; then
1993 mkdir -p $ADDFILES/rootcd
1994 for i in $(ls $TMP_MNT); do
1995 [ "$i" = "boot" ] && continue
1996 cp -a $TMP_MNT/$i $ADDFILES/rootcd
1997 done
1998 fi
1999 else
2000 rmdir $TMP_MNT
2001 fi
2002 fi
2004 # Root fs stuff.
2005 echo "Preparing the rootfs directory..."
2006 mkdir -p $ROOTFS
2007 for pkg in $LIST
2008 do
2009 [ "$pkg" = "" ] && continue
2010 # First copy and extract the package in tmp dir.
2011 pkg=${pkg%.tazpkg}
2012 PACKAGE=$(installed_package_name $pkg)
2013 mkdir -p $TMP_DIR
2014 if [ ! -f $PACKAGES_REPOSITORY/$pkg.tazpkg ]; then
2015 # Look for package in cache
2016 if [ -f $CACHE_DIR/$pkg.tazpkg ]; then
2017 ln -s $CACHE_DIR/$pkg.tazpkg $PACKAGES_REPOSITORY
2018 # Look for package in running distribution
2019 elif [ -n "$PACKAGE" -a "$REPACK" = "y" ]; then
2020 tazpkg repack $PACKAGE && \
2021 mv $pkg.tazpkg $PACKAGES_REPOSITORY
2022 fi
2023 fi
2024 if [ ! -f $PACKAGES_REPOSITORY/$pkg.tazpkg ]; then
2025 # Get package from mirror
2026 [ "$DOWNLOAD" = "y" ] && \
2027 download $pkg.tazpkg && \
2028 mv $pkg.tazpkg $PACKAGES_REPOSITORY
2029 fi
2030 if [ ! -f $PACKAGES_REPOSITORY/$pkg.tazpkg ]; then
2031 echo "Missing package $pkg."
2032 cleanup
2033 exit 1
2034 fi
2035 done
2036 if [ -f non-free.list ]; then
2037 echo "Preparing non-free packages..."
2038 cp non-free.list $ROOTFS/etc/tazlito/non-free.list
2039 for pkg in $(cat non-free.list); do
2040 if [ ! -d $INSTALLED/$pkg ]; then
2041 if [ ! -d $INSTALLED/get-$pkg ]; then
2042 tazpkg get-install get-$pkg
2043 fi
2044 get-$pkg
2045 fi
2046 tazpkg repack $pkg
2047 pkg=$(ls $pkg*.tazpkg)
2048 grep -q "^$pkg$" $LIST_NAME || \
2049 echo $pkg >>$LIST_NAME
2050 mv $pkg $PACKAGES_REPOSITORY
2051 done
2052 fi
2053 cp $LIST_NAME $DISTRO/distro-packages.list
2054 sed 's/\(.*\)/\1.tazpkg/' < $DISTRO/distro-packages.list > $DISTRO/list-packages
2055 cd $PACKAGES_REPOSITORY
2056 for pkg in $(cat $DISTRO/list-packages)
2057 do
2058 echo -n "Installing package: $pkg"
2059 yes y | tazpkg install $pkg --root=$ROOTFS 2>&1 >> $log || exit 1
2060 status
2061 done
2062 rm -f $ROOTFS/var/lib/tazpkg/packages.*
2063 cd $DISTRO
2064 cp distro-packages.list $ROOTFS/etc/tazlito
2065 # Copy all files from $ADDFILES/rootfs to the rootfs.
2066 if [ -d "$ADDFILES/rootfs" ] ; then
2067 echo -n "Copying addfiles content to the rootfs... "
2068 cp -a $ADDFILES/rootfs/* $ROOTFS
2069 status
2070 fi
2071 echo -n "Root filesystem is generated..." && status
2072 # Root CD part.
2073 echo -n "Preparing the rootcd directory..."
2074 mkdir -p $ROOTCD
2075 status
2076 # Move the boot dir with the Linux kernel from rootfs.
2077 # The boot dir goes directly on the CD.
2078 if [ -d "$ROOTFS/boot" ] ; then
2079 echo -n "Moving the boot directory..."
2080 mv $ROOTFS/boot $ROOTCD
2081 cd $ROOTCD/boot
2082 ln vmlinuz-* bzImage
2083 status
2084 fi
2085 cd $DISTRO
2086 # Copy all files from $ADDFILES/rootcd to the rootcd.
2087 if [ -d "$ADDFILES/rootcd" ] ; then
2088 echo -n "Copying addfiles content to the rootcd... "
2089 cp -a $ADDFILES/rootcd/* $ROOTCD
2090 status
2091 fi
2092 # Execute the distro script used to perform tasks in the rootfs
2093 # before compression. Give rootfs path in arg
2094 [ -z $DISTRO_SCRIPT ] && DISTRO_SCRIPT=$TOP_DIR/distro.sh
2095 if [ -x $DISTRO_SCRIPT ]; then
2096 echo "Executing distro script..."
2097 sh $DISTRO_SCRIPT $DISTRO
2098 fi
2100 # Execute the custom_rules found in receipt.
2102 if [ -s $TOP_DIR/receipt ]; then
2103 if grep -q ^custom_rules $TOP_DIR/receipt; then
2104 echo -e "Executing: custom_rules\n"
2105 . $TOP_DIR/receipt
2106 custom_rules || echo -e "\nERROR: custom_rules failed\n"
2107 fi
2108 fi
2110 if [ -s /etc/tazlito/rootfs.list ]; then
2111 FLAVOR_LIST="$(awk '{ for (i = 2; i <= NF; i+=2) \
2112 printf("%s ",$i) }' < /etc/tazlito/rootfs.list)"
2113 sed -i "s/ *//;s/)/), flavors $FLAVOR_LIST/" \
2114 $ROOTCD/boot/isolinux/isolinux.msg 2> /dev/null
2115 [ -f $ROOTCD/boot/isolinux/ifmem.c32 -o \
2116 -f $ROOTCD/boot/isolinux/c32box.c32 ] ||
2117 cp /boot/isolinux/c32box.c32 $ROOTCD/boot/isolinux 2> /dev/null ||
2118 cp /boot/isolinux/ifmem.c32 $ROOTCD/boot/isolinux
2119 n=0
2120 last=$ROOTFS
2121 while read flavor; do
2122 n=$(($n+1))
2123 echo "Building $flavor rootfs..."
2124 [ -s $TOP_DIR/$flavor.flavor ] &&
2125 cp $TOP_DIR/$flavor.flavor .
2126 [ -s $flavor.flavor ] || download $flavor.flavor
2127 zcat $flavor.flavor | cpio -i \
2128 $flavor.pkglist $flavor.rootfs
2129 sed 's/.*/&.tazpkg/' < $flavor.pkglist \
2130 > $DISTRO/list-packages0$n
2131 mkdir ${ROOTFS}0$n
2132 cd $PACKAGES_REPOSITORY
2133 yes y | tazpkg install-list \
2134 $DISTRO/list-packages0$n --root=${ROOTFS}0$n
2135 rm -rf ${ROOTFS}0$n/boot ${ROOTFS}0$n/var/lib/tazpkg/packages.*
2136 status
2137 cd $DISTRO
2138 if [ -s $flavor.rootfs ]; then
2139 echo "Adding $flavor rootfs extra files..."
2140 zcat $flavor.rootfs | \
2141 ( cd ${ROOTFS}0$n ; cpio -idmu )
2142 fi
2143 mv $flavor.pkglist ${ROOTFS}0$n/etc/tazlito/distro-packages.list
2144 rm -f $flavor.flavor install-list
2145 mergefs ${ROOTFS}0$n $last
2146 last=${ROOTFS}0$n
2147 done <<EOT
2148 $(awk '{ for (i = 4; i <= NF; i+=2) print $i; }' < /etc/tazlito/rootfs.list)
2149 EOT
2150 i=$(($n+1))
2151 while [ $n -gt 0 ]; do
2152 mv ${ROOTFS}0$n ${ROOTFS}$i
2153 echo "Compression ${ROOTFS}0$n ($(du -hs ${ROOTFS}$i | awk '{ print $1 }')) ..."
2154 gen_initramfs ${ROOTFS}$i
2155 n=$(($n-1))
2156 i=$(($i-1))
2157 done
2158 mv $ROOTFS ${ROOTFS}$i
2159 gen_initramfs ${ROOTFS}$i
2160 update_bootconfig $ROOTCD/boot/isolinux \
2161 "$(cat /etc/tazlito/rootfs.list)"
2162 else
2163 # Initramfs and ISO image stuff.
2164 gen_initramfs $ROOTFS
2165 fi
2166 gen_livecd_isolinux
2167 distro_stats
2168 cleanup
2169 ;;
2170 clean-distro)
2171 # Remove old distro tree.
2173 check_root
2174 echo ""
2175 boldify "Cleaning : $DISTRO"
2176 separator
2177 if [ -d "$DISTRO" ] ; then
2178 if [ -d "$ROOTFS" ] ; then
2179 echo -n "Removing the rootfs..."
2180 rm -f $DISTRO/$INITRAMFS
2181 rm -rf $ROOTFS
2182 status
2183 fi
2184 if [ -d "$ROOTCD" ] ; then
2185 echo -n "Removing the rootcd..."
2186 rm -rf $ROOTCD
2187 status
2188 fi
2189 echo -n "Removing eventual ISO image..."
2190 rm -f $DISTRO/$ISO_NAME.iso
2191 rm -f $DISTRO/$ISO_NAME.md5
2192 status
2193 fi
2194 separator
2195 echo "" ;;
2196 check-distro)
2197 # Check for a few LiveCD needed files not installed by packages.
2199 check_rootfs
2200 echo ""
2201 echo -e "\033[1mChecking distro :\033[0m $ROOTFS"
2202 separator
2203 # SliTaz release info.
2204 if [ ! -f "$ROOTFS/etc/slitaz-release" ]; then
2205 echo "Missing release info : /etc/slitaz-release"
2206 else
2207 release=`cat $ROOTFS/etc/slitaz-release`
2208 echo -n "Release : $release"
2209 status
2210 fi
2211 # Tazpkg mirror.
2212 if [ ! -f "$ROOTFS$LOCALSTATE/mirror" ]; then
2213 echo -n "Mirror URL : Missing $LOCALSTATE/mirror"
2214 todomsg
2215 else
2216 echo -n "Mirror configuration exists..."
2217 status
2218 fi
2219 # Isolinux msg
2220 if grep -q "cooking-XXXXXXXX" /$ROOTCD/boot/isolinux/isolinux.*g; then
2221 echo -n "Isolinux msg : Missing cooking date XXXXXXXX (ex `date +%Y%m%d`)"
2222 todomsg
2223 else
2224 echo -n "Isolinux message seems good..."
2225 status
2226 fi
2227 separator
2228 echo ""
2229 ;;
2230 writeiso)
2231 # Writefs to ISO image including /home unlike gen-distro we dont use
2232 # packages to generate a rootfs, we build a compressed rootfs with all
2233 # the current filesystem similar to 'tazusb writefs'.
2235 DISTRO="/home/slitaz/distro"
2236 ROOTCD="$DISTRO/rootcd"
2237 if [ -z $2 ]; then
2238 COMPRESSION=none
2239 else
2240 COMPRESSION=$2
2241 fi
2242 if [ -z $3 ]; then
2243 ISO_NAME="slitaz"
2244 else
2245 ISO_NAME="$3"
2246 fi
2247 check_root
2248 # Start info
2249 echo ""
2250 echo -e "\033[1mWrite filesystem to ISO\033[0m
2251 ===============================================================================
2252 The command writeiso will write the current filesystem into a suitable cpio
2253 archive (rootfs.gz) and generate a bootable ISO image (slitaz.iso).
2255 Archive compression: $COMPRESSION"
2256 echo ""
2258 # Save some space
2259 rm /var/cache/tazpkg/* -r -f
2260 rm -rf /home/slitaz/distro
2262 # Optionally remove sound card selection and screen resolution.
2263 echo "Do you wish to remove the sound card and screen configs ? "
2264 echo -n "Press ENTER to keep or answer (No|yes|exit): "
2265 read anser
2266 case $anser in
2267 e|E|"exit"|Exit)
2268 exit 0 ;;
2269 y|Y|yes|Yes)
2270 echo -n "Removing current sound card and screen configurations..."
2271 rm -f /var/lib/sound-card-driver
2272 rm -f /var/lib/alsa/asound.state
2273 rm -f /etc/X11/xorg.conf ;;
2274 *)
2275 echo -n "Keeping current sound card and screen configurations..." ;;
2276 esac
2277 status
2279 cd /
2280 # Create list of files including default user files since it is defined in /etc/passwd
2281 # and some new users might have been added.
2282 find bin etc init sbin var dev lib root usr home >/tmp/list
2284 for dir in proc sys tmp mnt media media/cdrom media/flash \
2285 media/usbdisk run run/udev
2286 do
2287 echo $dir >>/tmp/list
2288 done
2290 # Generate initramfs with specified compression and display rootfs
2291 # size in realtime.
2292 rm -f /tmp/rootfs
2293 write_initramfs &
2294 sleep 2
2295 cd - > /dev/null
2296 echo -en "\nFilesystem size:"
2297 while [ ! -f /tmp/rootfs ]
2298 do
2299 sleep 1
2300 echo -en "\\033[18G`du -sh /rootfs.gz | awk '{print $1}'` "
2301 done
2302 echo -e "\n"
2304 # Move freshly generated rootfs to the cdrom.
2305 mkdir -p $ROOTCD/boot
2306 mv -f /rootfs.gz $ROOTCD/boot
2308 # Now we need the kernel and isolinux files.
2309 if mount /dev/cdrom /media/cdrom 2>/dev/null; then
2310 cp /media/cdrom/boot/bzImage $ROOTCD/boot
2311 cp -a /media/cdrom/boot/isolinux $ROOTCD/boot
2312 unmeta_boot $ROOTCD
2313 umount /media/cdrom
2314 elif mount |grep /media/cdrom; then
2315 cp /media/cdrom/boot/bzImage $ROOTCD/boot
2316 cp -a /media/cdrom/boot/isolinux $ROOTCD/boot
2317 unmeta_boot $ROOTCD
2318 umount /media/cdrom;
2319 else
2320 echo -e "
2321 When SliTaz is running in RAM the kernel and bootloader files are kept
2322 on the cdrom. Please insert a LiveCD or loop mount the slitaz.iso to
2323 /media/cdrom to let Tazlito copy the files.\n"
2324 echo -en "----\nENTER to continue..."; read i
2325 exit 1
2326 fi
2328 # Generate the iso image.
2329 cd $DISTRO
2330 echo "Generating ISO image..."
2331 genisoimage -R -o $ISO_NAME.iso -b boot/isolinux/isolinux.bin \
2332 -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 \
2333 -V "SliTaz" -input-charset iso8859-1 -boot-info-table $ROOTCD
2334 if [ -x /usr/bin/isohybrid ]; then
2335 echo -n "Creating hybrid ISO..."
2336 /usr/bin/isohybrid $ISO_NAME.iso -entry 2 2> /dev/null
2337 status
2338 fi
2339 echo -n "Creating the ISO md5sum..."
2340 md5sum $ISO_NAME.iso > $ISO_NAME.md5
2341 status
2343 echo "==============================================================================="
2344 echo "ISO image: `du -sh /home/slitaz/distro/$ISO_NAME.iso`"
2345 echo ""
2346 echo -n "Exit or burn ISO to cdrom (Exit|burn)? "; read anser
2347 case $anser in
2348 burn)
2349 eject
2350 echo -n "Please insert a blank cdrom and press ENTER..."
2351 read i && sleep 2
2352 tazlito burn-iso /home/slitaz/distro/$ISO_NAME.iso
2353 echo -en "----\nENTER to continue..."; read i ;;
2354 *)
2355 exit 0 ;;
2356 esac ;;
2357 burn-iso)
2358 # Guess cdrom device, ask user and burn the ISO.
2360 check_root
2361 DRIVE_NAME=`cat /proc/sys/dev/cdrom/info | grep "drive name" | cut -f 3`
2362 DRIVE_SPEED=`cat /proc/sys/dev/cdrom/info | grep "drive speed" | cut -f 3`
2363 # We can specify an alternative ISO from the cmdline.
2364 if [ -n "$2" ] ; then
2365 iso=$2
2366 else
2367 iso=$DISTRO/$ISO_NAME.iso
2368 fi
2369 if [ ! -f "$iso" ]; then
2370 echo -e "\nUnable to find ISO : $iso\n"
2371 exit 0
2372 fi
2373 echo ""
2374 echo -e "\033[1mTazlito burn ISO\033[0m "
2375 separator
2376 echo "Cdrom device : /dev/$DRIVE_NAME"
2377 echo "Drive speed : $DRIVE_SPEED"
2378 echo "ISO image : $iso"
2379 separator
2380 echo ""
2381 yesorno "Burn ISO image (y/N) ? "
2382 if [ "$answer" == "y" ]; then
2383 echo ""
2384 echo "Starting Wodim to burn the iso..." && sleep 2
2385 separator
2386 wodim speed=$DRIVE_SPEED dev=/dev/$DRIVE_NAME $iso
2387 separator
2388 echo "ISO image is burned to cdrom."
2389 else
2390 echo -e "\nExiting. No ISO burned."
2391 fi
2392 echo ""
2393 ;;
2394 merge)
2395 # Merge multiple rootfs into one iso.
2397 if [ -z "$2" ]; then
2398 cat << EOT
2399 Usage: tazlito merge size1 iso size2 rootfs2 [sizeN rootfsN]...
2401 Merge multiple rootfs into one iso. Rootfs are like russian dolls
2402 i.e: rootfsN is a subset of rootfsN-1
2403 rootfs1 is found in iso, sizeN is the RAM size need to launch rootfsN.
2404 The boot loader will select the rootfs according to the RAM size detected.
2406 Example:
2407 $ tazlito merge 160M slitaz-core.iso 96M rootfs-justx.gz 32M rootfs-base.gz
2409 Will start slitaz-core with 160M+ RAM, slitaz-justX with 96M-160M RAM,
2410 slitaz-base with 32M-96M RAM and display an error message if RAM < 32M.
2412 EOT
2413 exit 2
2414 fi
2416 shift # skip merge
2417 append="$1 slitaz1"
2418 shift # skip size1
2419 mkdir -p $TMP_DIR/mnt $TMP_DIR/rootfs1
2421 ISO=$1.merged
2422 # Extract filesystems
2423 echo -n "Mounting $1"
2424 mount -o loop,ro $1 $TMP_DIR/mnt 2> /dev/null
2425 status || cleanup_merge
2426 cp -a $TMP_DIR/mnt $TMP_DIR/iso
2427 rm -f $TMP_DIR/iso/boot/bzImage
2428 ln $TMP_DIR/iso/boot/vmlinuz* $TMP_DIR/iso/boot/bzImage
2429 umount -d $TMP_DIR/mnt
2430 if [ -f $TMP_DIR/iso/boot/rootfs1.gz ]; then
2431 echo "$1 is already a merged iso. Aborting."
2432 cleanup_merge
2433 fi
2434 if [ ! -f $TMP_DIR/iso/boot/isolinux/ifmem.c32 -a
2435 ! -f $TMP_DIR/iso/boot/isolinux/c32box.c32 ]; then
2436 if [ ! -f /boot/isolinux/ifmem.c32 -a
2437 ! -f /boot/isolinux/c32box.c32 ]; then
2438 cat <<EOT
2439 No file /boot/isolinux/ifmem.c32
2440 Please install syslinux package !
2441 EOT
2442 rm -rf $TMP_DIR
2443 exit 1
2444 fi
2445 cp /boot/isolinux/c32box.c32 $TMP_DIR/iso/boot/isolinux 2> /dev/null ||
2446 cp /boot/isolinux/ifmem.c32 $TMP_DIR/iso/boot/isolinux
2447 fi
2449 echo -n "Extracting iso/rootfs.gz"
2450 extract_rootfs $TMP_DIR/iso/boot/rootfs.gz $TMP_DIR/rootfs1 &&
2451 [ -d $TMP_DIR/rootfs1/etc ]
2452 status || cleanup_merge
2453 n=1
2454 while [ -n "$2" ]; do
2455 shift # skip rootfs N-1
2456 p=$n
2457 n=$(($n + 1))
2458 append="$append $1 slitaz$n"
2459 shift # skip size N
2460 mkdir -p $TMP_DIR/rootfs$n
2461 echo -n "Extracting $1"
2462 extract_rootfs $1 $TMP_DIR/rootfs$n &&
2463 [ -d $TMP_DIR/rootfs$n/etc ]
2464 status || cleanup_merge
2465 mergefs $TMP_DIR/rootfs$n $TMP_DIR/rootfs$p
2466 echo "Creating rootfs$p.gz"
2467 pack_rootfs $TMP_DIR/rootfs$p $TMP_DIR/iso/boot/rootfs$p.gz
2468 status
2469 done
2470 echo "Creating rootfs$n.gz"
2471 pack_rootfs $TMP_DIR/rootfs$n $TMP_DIR/iso/boot/rootfs$n.gz
2472 status
2473 rm -f $TMP_DIR/iso/boot/rootfs.gz
2474 update_bootconfig $TMP_DIR/iso/boot/isolinux "$append"
2475 create_iso $ISO $TMP_DIR/iso
2476 rm -rf $TMP_DIR
2477 ;;
2479 repack)
2480 # Repack an iso with maximum lzma compression ratio.
2483 ISO=$2
2485 mkdir -p $TMP_DIR/mnt
2486 # Extract filesystems
2487 echo -n "Mounting $ISO"
2488 mount -o loop,ro $ISO $TMP_DIR/mnt 2> /dev/null
2489 status || cleanup_merge
2490 cp -a $TMP_DIR/mnt $TMP_DIR/iso
2491 umount -d $TMP_DIR/mnt
2493 for i in $TMP_DIR/iso/boot/rootfs* ; do
2494 echo -n "Repacking $(basename $i)"
2495 (zcat $i 2> /dev/null || unlzma -c $i || cat $i) \
2496 2>/dev/null > $TMP_DIR/rootfs
2497 lzma e $TMP_DIR/rootfs $i \
2498 $(lzma_switches $TMP_DIR/rootfs)
2499 align_to_32bits $i
2500 status
2501 done
2503 create_iso $ISO $TMP_DIR/iso
2504 rm -rf $TMP_DIR ;;
2506 build-loram)
2507 # Build a Live CD for low ram systems.
2510 ISO=$2
2511 OUTPUT=$3
2512 if [ -z "$3" ]; then
2513 echo "Usage: tazlito $1 input.iso output.iso [cdrom|smallcdrom|http|ram]"
2514 exit 1
2515 fi
2516 mkdir -p $TMP_DIR/iso
2517 mount -o loop,ro -t iso9660 $ISO $TMP_DIR/iso
2518 loopdev=$(losetup | grep $ISO | cut -d: -f1)
2519 if ! check_iso_for_loram ; then
2520 echo "$2 is not a valid SliTaz live CD. Abort."
2521 umount -d $TMP_DIR/iso
2522 rm -rf $TMP_DIR
2523 exit 1
2524 fi
2526 case "$4" in
2527 cdrom) build_loram_cdrom ;;
2528 http) build_loram_http ;;
2529 *) build_loram_ram ;;
2530 esac
2531 umount $TMP_DIR/iso # no -d: needs /proc
2532 losetup -d $loopdev
2533 rm -rf $TMP_DIR ;;
2536 frugal-install|-fi)
2537 ISO_IMAGE="$2"
2538 echo ""
2539 mkdir -p /boot/frugal
2540 if [ -f "$ISO_IMAGE" ]; then
2541 echo -n "Using ISO image: $ISO_IMAGE"
2542 mkdir -p /tmp/iso && mount -o loop $ISO_IMAGE /tmp/iso
2543 status
2544 echo -n "Installing the Kernel and rootfs..."
2545 cp -a /tmp/iso/boot/bzImage /boot/frugal
2546 if [ -f $DISTRO/rootcd/boot/rootfs1.gz ]; then
2547 cd /tmp/iso/boot
2548 cat $(ls -r rootfs*.gz) > /boot/frugal/rootfs.gz
2549 else
2550 cp -a /tmp/iso/boot/rootfs.gz /boot/frugal
2551 fi
2552 umount /tmp/iso
2553 status
2554 else
2555 echo -n "Using distro: $DISTRO"
2556 cd $DISTRO && status
2557 echo -n "Installing the Kernel and rootfs..."
2558 cp -a $DISTRO/rootcd/boot/bzImage /boot/frugal
2559 if [ -f $DISTRO/rootcd/boot/rootfs1.gz ]; then
2560 cd $DISTRO/rootcd/boot
2561 cat $(ls -r rootfs*.gz) > /boot/frugal/rootfs.gz
2562 else
2563 cp -a $DISTRO/rootcd/boot/rootfs.gz /boot/frugal
2564 fi
2565 status
2566 fi
2567 # Grub entry
2568 if ! grep -q "^kernel /boot/frugal/bzImage" /boot/grub/menu.lst; then
2569 echo -n "Configuring GRUB menu list..."
2570 cat >> /boot/grub/menu.lst << EOT
2571 title SliTaz GNU/Linux (frugal)
2572 root (hd0,0)
2573 kernel /boot/frugal/bzImage root=/dev/null
2574 initrd /boot/frugal/rootfs.gz
2575 EOT
2576 else
2577 echo -n "GRUB menu list is up-to-date..."
2578 fi
2579 status
2580 echo "" ;;
2582 emu-iso)
2583 # Emulate an ISO image with Qemu.
2584 if [ -n "$2" ] ; then
2585 iso=$2
2586 else
2587 iso=$DISTRO/$ISO_NAME.iso
2588 fi
2589 if [ ! -f "$iso" ]; then
2590 echo -e "\nUnable to find ISO : $iso\n"
2591 exit 0
2592 fi
2593 if [ ! -x "/usr/bin/qemu" ]; then
2594 echo -e "\nUnable to find Qemu binary. Please install: qemu\n"
2595 exit 0
2596 fi
2597 echo -e "\nStarting Qemu emulator:\n"
2598 echo -e "qemu $QEMU_OPTS $iso\n"
2599 qemu $QEMU_OPTS $iso ;;
2601 deduplicate)
2602 # Deduplicate files in a tree
2603 shift
2604 deduplicate "$@" ;;
2605 usage|*)
2606 # Clear and print usage also for all unknown commands.
2608 clear
2609 usage ;;
2610 esac
2612 exit 0