tazlito rev 111
tazlito: add ROOTFS_SELECTION support for flavors
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sat Oct 03 21:59:10 2009 +0200 (2009-10-03) |
parents | c80d5cd9e93c |
children | 3ae4c0880027 |
files | tazlito |
line diff
1.1 --- a/tazlito Thu Oct 01 22:08:34 2009 +0200 1.2 +++ b/tazlito Sat Oct 03 21:59:10 2009 +0200 1.3 @@ -159,8 +159,8 @@ 1.4 genisohooks() 1.5 { 1.6 local here=`pwd` 1.7 - cd $ROOTFS 1.8 for i in $(ls etc/tazlito/*.$1 2> /dev/null); do 1.9 + cd $ROOTFS 1.10 . $i $ROOTCD 1.11 done 1.12 cd $here 1.13 @@ -293,6 +293,11 @@ 1.14 echo $n 1.15 } 1.16 1.17 +lzma_switches() 1.18 +{ 1.19 + echo "-d$(lzma_history_bits $1) -mt$(grep ^processor < /proc/cpuinfo | wc -l)" 1.20 +} 1.21 + 1.22 # Pack rootfs 1.23 pack_rootfs() 1.24 { 1.25 @@ -302,7 +307,7 @@ 1.26 cat > $2 1.27 elif [ -x /usr/bin/lzma -a "$COMPRESSION" != "gzip" ]; then 1.28 echo -n "Generating lzma'ed initramfs... " 1.29 - lzma e -si -so -d$(lzma_history_bits $1) > $2 1.30 + lzma e -si -so $(lzma_switches $1) > $2 1.31 else 1.32 echo -n "Generating gziped initramfs... " 1.33 gzip -9 > $2 1.34 @@ -316,7 +321,7 @@ 1.35 rm -f $DISTRO/gen 1.36 # Some packages may want to alter rootfs 1.37 genisohooks rootfs 1.38 - cd $ROOTFS 1.39 + cd $1 1.40 echo "" 1.41 1.42 # Link duplicate files 1.43 @@ -337,17 +342,17 @@ 1.44 ) 1.45 1.46 # Use lzma if installed 1.47 - pack_rootfs . $DISTRO/$INITRAMFS 1.48 + pack_rootfs . $DISTRO/$(basename $1).gz 1.49 cd $DISTRO 1.50 - mv $INITRAMFS $ROOTCD/boot 1.51 + mv $(basename $1).gz $ROOTCD/boot 1.52 } 1.53 1.54 distro_sizes() 1.55 { 1.56 echo "Build date : `date +%Y%m%d\ \at\ \%H:%M:%S`" 1.57 - echo "Packages : `ls -1 $ROOTFS$INSTALLED | wc -l`" 1.58 - echo "Rootfs size : `du -sh $ROOTFS | awk '{ print $1 }'`" 1.59 - echo "Initramfs size : `du -sh $ROOTCD/boot/$INITRAMFS | awk '{ print $1 }'`" 1.60 + echo "Packages : `ls -1 $ROOTFS*$INSTALLED/*/receipt | wc -l`" 1.61 + echo "Rootfs size : `du -csh $ROOTFS*/ | awk '{ s=$1 } END { print s }'`" 1.62 + echo "Initramfs size : `du -csh $ROOTCD/boot/rootfs*.gz | awk '{ s=$1 } END { print s }'`" 1.63 echo "ISO image size : `du -sh $ISO_NAME.iso | awk '{ print $1 }'`" 1.64 echo "================================================================================" 1.65 echo "Image is ready: $ISO_NAME.iso" 1.66 @@ -409,6 +414,8 @@ 1.67 # Remove duplicate files 1.68 mergefs() 1.69 { 1.70 + echo -n "Merge $(basename $1) ($(du -hs $1 | awk '{ print $1}')) into " 1.71 + echo -n "$(basename $2) ($(du -hs $2 | awk '{ print $1}'))" 1.72 # merge symlinks files and devices 1.73 ( cd $1; find ) | while read file; do 1.74 if [ -L $1/$file ]; then 1.75 @@ -436,6 +443,7 @@ 1.76 fi 1.77 done 1.78 true 1.79 + status 1.80 } 1.81 1.82 cleanup_merge() 1.83 @@ -475,6 +483,87 @@ 1.84 done 1.85 } 1.86 1.87 +# Display package list with version, set packed_size and unpacked_size 1.88 +get_pkglist() 1.89 +{ 1.90 +packed_size=0; unpacked_size=0 1.91 +grep -v ^# $FLAVORS_REPOSITORY/$1/packages.list > $TMP_DIR/flavor.pkg 1.92 +while read pkg; do 1.93 + set -- $(get_size $pkg) 1.94 + packed_size=$(( $packed_size + $1 )) 1.95 + unpacked_size=$(( $unpacked_size + $2 )) 1.96 + for i in $(grep ^$pkg /var/lib/tazpkg/packages.list); do 1.97 + echo $i 1.98 + break 1.99 + done 1.100 +done < $TMP_DIR/flavor.pkg 1.101 +rm -f $TMP_DIR/flavor.pkg 1.102 +} 1.103 + 1.104 +# Update isolinux config files for multiple rootfs 1.105 +update_bootconfig() 1.106 +{ 1.107 + echo -n "Update boot config files" 1.108 + grep -l 'include common' $1/*.cfg | \ 1.109 + while read file ; do 1.110 + awk -v n=$(echo $2 | awk '{ print NF/2 }') '{ 1.111 +if (/label/) label=$0; 1.112 +else if (/kernel/) kernel=$0; 1.113 +else if (/append/) { 1.114 + i=index($0,"rootfs.gz"); 1.115 + append=substr($0,i+9); 1.116 +} 1.117 +else if (/include/) { 1.118 + for (i = 1; i <= n; i++) { 1.119 + print label i 1.120 + print kernel; 1.121 + initrd="initrd=/boot/rootfs" n ".gz" 1.122 + for (j = n - 1; j >= i; j--) { 1.123 + initrd=initrd ",/boot/rootfs" j ".gz"; 1.124 + } 1.125 + printf "\tappend %s%s\n",initrd,append; 1.126 + print ""; 1.127 + } 1.128 + print; 1.129 +} 1.130 +else print; 1.131 +}' < $file > $file.$$ 1.132 + mv -f $file.$$ $file 1.133 + done 1.134 + cat >> $1/common.cfg <<EOT 1.135 + 1.136 +label slitaz 1.137 + kernel /boot/isolinux/ifmem.c32 1.138 + append$(echo $2 | awk '{ 1.139 + for (i=1; i<=NF; i++) 1.140 + if (i % 2 == 0) printf " slitaz%d",i/2 1.141 + else printf " %s",$i 1.142 +}') noram 1.143 + 1.144 +label noram 1.145 + config noram.cfg 1.146 + 1.147 +EOT 1.148 + cat > $1/noram.cfg <<EOT 1.149 +display isolinux.msg 1.150 +say Not enough RAM to boot slitaz. 1.151 +default reboot 1.152 +label reboot 1.153 + com32 reboot.c32 1.154 + 1.155 +implicit 0 1.156 +prompt 1 1.157 +timeout 80 1.158 +F1 help.txt 1.159 +F2 options.txt 1.160 +F3 isolinux.msg 1.161 +F4 display.txt 1.162 +F5 enhelp.txt 1.163 +F6 enopts.txt 1.164 +EOT 1.165 + status 1.166 +} 1.167 + 1.168 #################### 1.169 # Tazlito commands # 1.170 #################### 1.171 @@ -564,7 +653,7 @@ 1.172 # 1.173 check_root 1.174 verify_rootcd 1.175 - gen_initramfs 1.176 + gen_initramfs $ROOTFS 1.177 gen_livecd_isolinux 1.178 distro_stats 1.179 ;; 1.180 @@ -860,7 +949,11 @@ 1.181 grep ^Description $TMP_DIR/$FLAVOR.desc | \ 1.182 sed 's/.*: \(.*\)$/SHORT_DESC="\1"/' >> \ 1.183 $FLAVORS_REPOSITORY/$FLAVOR/receipt 1.184 - grep ^Rootfs $TMP_DIR/$FLAVOR.desc | \ 1.185 + grep -q '^Rootfs list' $TMP_DIR/$FLAVOR.desc && \ 1.186 + grep '^Rootfs list' $TMP_DIR/$FLAVOR.desc | \ 1.187 + sed 's/.*: \(.*\)$/ROOTFS_SELECTION="\1"/' >> \ 1.188 + $FLAVORS_REPOSITORY/$FLAVOR/receipt 1.189 + grep '^Rootfs size' $TMP_DIR/$FLAVOR.desc | \ 1.190 sed 's/.*: \(.*\)$/ROOTFS_SIZE="\1"/' >> \ 1.191 $FLAVORS_REPOSITORY/$FLAVOR/receipt 1.192 grep ^Initramfs $TMP_DIR/$FLAVOR.desc | \ 1.193 @@ -905,19 +998,17 @@ 1.194 [ -s $FLAVORS_REPOSITORY/$FLAVOR/mirrors ] && 1.195 cp $FLAVORS_REPOSITORY/$FLAVOR/mirrors \ 1.196 $TMP_DIR/$FLAVOR.mirrors 1.197 - packed_size=0; unpacked_size=0 1.198 - grep -v ^# $FLAVORS_REPOSITORY/$FLAVOR/packages.list > \ 1.199 - $TMP_DIR/$FLAVOR.pkg 1.200 - while read pkg; do 1.201 - set -- $(get_size $pkg) 1.202 - packed_size=$(( $packed_size + $1 )) 1.203 - unpacked_size=$(( $unpacked_size + $2 )) 1.204 - for i in $(grep ^$pkg /var/lib/tazpkg/packages.list); do 1.205 - echo $i 1.206 - break 1.207 - done 1.208 - done > $TMP_DIR/$FLAVOR.pkglist < $TMP_DIR/$FLAVOR.pkg 1.209 - rm -f $TMP_DIR/$FLAVOR.pkg 1.210 + [ -s $FLAVORS_REPOSITORY/$FLAVOR/packages.list ] && 1.211 + get_pkglist $FLAVOR > $TMP_DIR/$FLAVOR.pkglist 1.212 + if grep -q ^ROOTFS_SELECTION \ 1.213 + $FLAVORS_REPOSITORY/$FLAVOR/receipt; then 1.214 + . $FLAVORS_REPOSITORY/$FLAVOR/receipt 1.215 + set -- $ROOTFS_SELECTION 1.216 + [ -n "$FRUGAL_RAM" ] || FRUGAL_RAM=$1 1.217 + [ -f $FLAVORS_REPOSITORY/$2/packages.list ] || 1.218 + tazlito extract-flavor $2 1.219 + get_pkglist $2 > $TMP_DIR/$FLAVOR.pkglist 1.220 + fi 1.221 for i in rootcd rootfs; do 1.222 [ -d $FLAVORS_REPOSITORY/$FLAVOR/$i ] || \ 1.223 continue 1.224 @@ -939,6 +1030,7 @@ 1.225 fi 1.226 VERSION="" 1.227 MAINTAINER="" 1.228 + ROOTFS_SELECTION="" 1.229 ROOTFS_SIZE="$(cent2human $unpacked_size) (estimated)" 1.230 INITRAMFS_SIZE="$(cent2human $packed_size) (estimated)" 1.231 ISO_SIZE="$(cent2human $iso_size) (estimated)" 1.232 @@ -956,9 +1048,12 @@ 1.233 [ -n "$FRUGAL_RAM" ] && cat >> $TMP_DIR/$FLAVOR.desc <<EOT 1.234 LiveCD RAM size : $FRUGAL_RAM 1.235 EOT 1.236 + [ -n "$ROOTFS_SELECTION" ] && cat >> $TMP_DIR/$FLAVOR.desc <<EOT 1.237 +Rootfs list : $ROOTFS_SELECTION 1.238 +EOT 1.239 cat >> $TMP_DIR/$FLAVOR.desc <<EOT 1.240 Build date : $(date +%Y%m%d\ \at\ \%H:%M:%S) 1.241 -Packages : $(grep -v ^# $FLAVORS_REPOSITORY/$FLAVOR/packages.list | wc -l) 1.242 +Packages : $(grep -v ^# $TMP_DIR/$FLAVOR.pkglist | wc -l) 1.243 Rootfs size : $ROOTFS_SIZE 1.244 Initramfs size : $INITRAMFS_SIZE 1.245 ISO image size : $ISO_SIZE 1.246 @@ -1005,6 +1100,10 @@ 1.247 done < $TMP_DIR/$FLAVOR.mirrors 1.248 tazpkg recharge 1.249 fi 1.250 + rm -f /etc/tazlito/rootfs.list 1.251 + grep -q '^Rootfs list' $TMP_DIR/$FLAVOR.desc && 1.252 + grep '^Rootfs list' $TMP_DIR/$FLAVOR.desc | \ 1.253 + sed 's/.*: \(.*\)$/\1/' > /etc/tazlito/rootfs.list 1.254 echo -n "Update tazlito.conf..." 1.255 [ -f tazlito.conf ] || cp /etc/tazlito/tazlito.conf . 1.256 cat tazlito.conf | grep -v "^#VOLUM_NAME" | \ 1.257 @@ -1238,8 +1337,48 @@ 1.258 echo "Executing distro script..." 1.259 sh $DISTRO_SCRIPT $DISTRO 1.260 fi 1.261 - # Initramfs and ISO image stuff. 1.262 - gen_initramfs 1.263 + if [ -s /etc/tazlito/rootfs.list ]; then 1.264 + [ -f $ROOTCD/boot/isolinux/ifmem.c32 ] || 1.265 + cp /boot/isolinux/ifmem.c32 $ROOTCD/boot/isolinux 1.266 + n=0 1.267 + last=$ROOTFS 1.268 + while read flavor; do 1.269 + n=$(($n+1)) 1.270 + echo "Building $flavor rootfs..." 1.271 + download $flavor.flavor 1.272 + zcat $flavor.flavor | cpio -i $flavor.pkglist 1.273 + sed 's/.*/&.tazpkg/' < $flavor.pkglist \ 1.274 + > $DISTRO/list-packages0$n 1.275 + mkdir ${ROOTFS}0$n 1.276 + cd $PACKAGES_REPOSITORY 1.277 + yes y | tazpkg install-list \ 1.278 + $DISTRO/list-packages0$n --root=${ROOTFS}0$n 1.279 + rm -rf ${ROOTFS}0$n/boot 1.280 + status 1.281 + cd $DISTRO 1.282 + mv $flavor.pkglist ${ROOTFS}0$n/etc/tazlito/distro-packages.list 1.283 + rm -f $flavor.flavor install-list 1.284 + mergefs ${ROOTFS}0$n $last 1.285 + last=${ROOTFS}0$n 1.286 + done <<EOT 1.287 +$(awk '{ for (i = 4; i <= NF; i+=2) print $i; }' < /etc/tazlito/rootfs.list) 1.288 +EOT 1.289 + i=$(($n+1)) 1.290 + while [ $n -gt 0 ]; do 1.291 + mv ${ROOTFS}0$n ${ROOTFS}$i 1.292 + echo "Compression ${ROOTFS}0$n ($(du -hs ${ROOTFS}$i | awk '{ print $1 }')) ..." 1.293 + gen_initramfs ${ROOTFS}$i 1.294 + n=$(($n-1)) 1.295 + i=$(($i-1)) 1.296 + done 1.297 + mv $ROOTFS ${ROOTFS}$i 1.298 + gen_initramfs ${ROOTFS}$i 1.299 + update_bootconfig $ROOTCD/boot/isolinux \ 1.300 + "$(cat /etc/tazlito/rootfs.list)" 1.301 + else 1.302 + # Initramfs and ISO image stuff. 1.303 + gen_initramfs $ROOTFS 1.304 + fi 1.305 gen_livecd_isolinux 1.306 distro_stats 1.307 cleanup 1.308 @@ -1364,7 +1503,7 @@ 1.309 fi 1.310 1.311 shift # skip merge 1.312 - append="append $(( (${1%M} - 3) * 1024 )) slitaz1" 1.313 + append="$1 slitaz1" 1.314 shift # skip size1 1.315 mkdir -p $TMP_DIR/mnt $TMP_DIR/rootfs1 1.316 1.317 @@ -1402,16 +1541,14 @@ 1.318 shift # skip rootfs N-1 1.319 p=$n 1.320 n=$(($n + 1)) 1.321 - append="$append $(( (${1%M} - 3) * 1024 )) slitaz$n" 1.322 + append="$append $1 slitaz$n" 1.323 shift # skip size N 1.324 mkdir -p $TMP_DIR/rootfs$n 1.325 echo -n "Extract $1" 1.326 extract_rootfs $1 $TMP_DIR/rootfs$n && 1.327 [ -d $TMP_DIR/rootfs$n/etc ] 1.328 status || cleanup_merge 1.329 - echo -n "Merge rootfs$n into rootfs$p" 1.330 mergefs $TMP_DIR/rootfs$n $TMP_DIR/rootfs$p 1.331 - status 1.332 echo "Create rootfs$p.gz" 1.333 pack_rootfs $TMP_DIR/rootfs$p $TMP_DIR/iso/boot/rootfs$p.gz 1.334 status 1.335 @@ -1420,61 +1557,7 @@ 1.336 pack_rootfs $TMP_DIR/rootfs$n $TMP_DIR/iso/boot/rootfs$n.gz 1.337 status 1.338 rm -f $TMP_DIR/iso/boot/rootfs.gz 1.339 - 1.340 - echo -n "Update boot files" 1.341 - grep -l 'include common' $TMP_DIR/iso/boot/isolinux/*.cfg | \ 1.342 - while read file ; do 1.343 - awk -v n=$n '{ 1.344 -if (/label/) label=$0; 1.345 -else if (/kernel/) kernel=$0; 1.346 -else if (/append/) { 1.347 - i=index($0,"rootfs.gz"); 1.348 - append=substr($0,i+9); 1.349 -} 1.350 -else if (/include/) { 1.351 - for (i = 1; i <= n; i++) { 1.352 - print label i 1.353 - print kernel; 1.354 - initrd="initrd=/boot/rootfs" n ".gz" 1.355 - for (j = n - 1; j >= i; j--) { 1.356 - initrd=initrd ",/boot/rootfs" j ".gz"; 1.357 - } 1.358 - printf "\tappend %s%s\n",initrd,append; 1.359 - print ""; 1.360 - } 1.361 - print; 1.362 -} 1.363 -else print; 1.364 -}' < $file > $file.$$ 1.365 - mv -f $file.$$ $file 1.366 - done 1.367 - cat >> $TMP_DIR/iso/boot/isolinux/common.cfg <<EOT 1.368 -label slitaz 1.369 - kernel /boot/isolinux/ifmem.c32 1.370 - $append noram 1.371 - 1.372 -label noram 1.373 - config noram.cfg 1.374 - 1.375 -EOT 1.376 - cat >> $TMP_DIR/iso/boot/isolinux/noram.cfg <<EOT 1.377 -display isolinux.msg 1.378 -say Not enough RAM to boot slitaz. 1.379 -default reboot 1.380 -label reboot 1.381 - com32 reboot.c32 1.382 - 1.383 -implicit 0 1.384 -prompt 1 1.385 -timeout 80 1.386 -F1 help.txt 1.387 -F2 options.txt 1.388 -F3 isolinux.msg 1.389 -F4 display.txt 1.390 -F5 enhelp.txt 1.391 -F6 enopts.txt 1.392 -EOT 1.393 - status 1.394 + update_bootconfig $TMP_DIR/iso/boot/isolinux "$append" 1.395 echo "Generate $ISO" 1.396 create_iso $ISO $TMP_DIR/iso 1.397 rm -rf $TMP_DIR 1.398 @@ -1499,7 +1582,7 @@ 1.399 (zcat $i || unlzma -c $i || cat $i) \ 1.400 2>/dev/null > $TMP_DIR/rootfs 1.401 lzma e $TMP_DIR/rootfs $i \ 1.402 - -d$(lzma_history_bits $TMP_DIR/rootfs) 1.403 + $(lzma_switches $TMP_DIR/rootfs) 1.404 status 1.405 done 1.406 1.407 @@ -1518,3 +1601,4 @@ 1.408 esac 1.409 1.410 exit 0 1.411 +