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 +