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