tazusb annotate tazusb @ rev 41

Fix typos
author Paul Issott <paul@slitaz.org>
date Wed Mar 11 18:22:28 2009 +0000 (2009-03-11)
parents 0f20a4a82c78
children f3d586458585
rev   line source
spode@0 1 #!/bin/sh
spode@0 2 # Tazusb - SliTaz LiveUSB
spode@0 3 #
spode@0 4 # Tazusb is an utility to generate, configure and manipulate SliTaz LiveUSB
spode@0 5 # bootable media and/or USB /home partition, such as flash keys, SD card or
spode@0 6 # USB harddisk.
spode@0 7 #
spode@0 8 # Authors : Christophe Lincoln (Pankso) <pankso@slitaz.org>
spode@0 9 # Andrew Miller (Spode) <spode@spodesabode.com>
spode@0 10 #
erjo@33 11 VERSION=1.2.2
spode@0 12
spode@0 13 COMMAND=$1
spode@0 14 TARGET_ROOT=/media/flash
spode@0 15 DRIVE_NAME=`cat /proc/sys/dev/cdrom/info | grep "drive name" | cut -f 3`
spode@0 16 CDROM=/dev/$DRIVE_NAME
spode@0 17
spode@0 18 #
spode@0 19 # Tazusb functions
spode@0 20 #
spode@0 21
spode@0 22 # Print the usage.
spode@0 23 usage ()
spode@0 24 {
spode@0 25 echo -e "\nSliTaz Live USB - Version: $VERSION\n
spode@0 26 \033[1mUsage: \033[0m `basename $0` [command] [compression|device]
spode@0 27 \033[1mCommands: \033[0m\n
spode@0 28 usage Print this short usage.
spode@0 29 writefs Write the current filesystem to rootfs.gz.
spode@0 30 tazSupported compression: lzma. gzip, none.
pankso@3 31 format Format and label device with ext3 filesystem
pankso@3 32 (for LiveUSB or /home).
pankso@13 33 gen-liveusb Generate a bootable LiveUSB using files from the LiveCD.
paul@26 34 gen-swap Create or recreate and activate additional swap memory.
paul@26 35 gen-iso2usb Generate a bootable LiveUSB using files from ISO file.
paul@26 36 clean Remove old backup filesystems to free disk space.\n"
spode@0 37 }
spode@0 38
spode@0 39 # Status function.
spode@0 40 status()
spode@0 41 {
spode@0 42 local CHECK=$?
spode@0 43 echo -en "\\033[70G[ "
spode@0 44 if [ $CHECK = 0 ]; then
spode@0 45 echo -en "\\033[1;33mOK"
spode@0 46 else
spode@0 47 echo -en "\\033[1;31mFailed"
spode@0 48 fi
spode@0 49 echo -e "\\033[0;39m ]"
spode@0 50 }
spode@0 51
spode@0 52 # Exit if user is not root.
spode@0 53 check_root()
spode@0 54 {
spode@0 55 if test $(id -u) != 0 ; then
spode@0 56 echo -e "\nThis program requires being run as root.\n"
spode@0 57 exit 0
spode@0 58 fi
spode@0 59 }
spode@0 60
paul@41 61 # Display a list of available partitions.
hacker@12 62 fdisk_list()
hacker@12 63 {
pankso@16 64 echo "----"
hacker@12 65 fdisk -l | grep ^/dev/sd*
pankso@16 66 echo "----"
hacker@12 67 }
hacker@12 68
hacker@12 69 # We need a USB media to install.
hacker@12 70 ask_for_device()
hacker@12 71 {
hacker@12 72 echo -n "\
hacker@12 73 Please specify the target USB device to $COMMAND. You can type 'list' to
hacker@12 74 get a list of devices, type 'exit' or give an empty value to exit.
hacker@12 75
hacker@12 76 Device to use : "; read anser
hacker@12 77 while [ "$anser" == "list" ]; do
hacker@12 78 fdisk_list
hacker@12 79 echo -n "Device to use : "; read anser
hacker@12 80 done
hacker@12 81 if [ "$anser" = "" -o "$anser" = "exit" ]; then
hacker@12 82 echo -e "\nNo specified device or exit.\n"
hacker@12 83 exit 0
hacker@12 84 else
hacker@12 85 DEVICE=$anser
hacker@12 86 fi
hacker@12 87 }
hacker@12 88
spode@0 89 # Verify a device exists before format or install
spode@0 90 check_for_device()
spode@0 91 {
spode@9 92 IFDEV=`fdisk -l | grep $DEVICE`
spode@9 93 if [ -z "$IFDEV" ]; then
spode@0 94 echo -e "\nUnable to find device: $DEVICE\n"
spode@0 95 exit 0
spode@0 96 fi
spode@0 97 }
spode@0 98
paul@41 99 # gets the UUID and filesystem type
spode@0 100 get_part_info()
spode@0 101 {
spode@9 102 UUID=`blkid -s UUID -o value $DEVICE`
spode@9 103 FSTYPE=`blkid -s TYPE -o value $DEVICE`
spode@0 104 }
spode@0 105
spode@0 106 # Format target device and label partition.
spode@0 107 mkfs_ext3()
spode@0 108 {
spode@0 109 echo -n "Please specify a label for the partition (TazUSB): "
spode@0 110 read label
spode@0 111
spode@0 112 if [ -z $label ]; then
spode@0 113 label=TazUSB
spode@0 114 fi
spode@0 115
spode@0 116 echo "Label : $label"
spode@9 117 echo "Mkfs : mkfs.ext3 -L \"$label\" $DEVICE"
spode@0 118 echo "" && sleep 2
spode@9 119 mkfs.ext3 -L "$label" $DEVICE
spode@0 120
spode@0 121 }
spode@0 122
spode@0 123 # Mount an existing USB device.
spode@0 124 unmount_target_usb()
spode@0 125 {
spode@0 126 # If mount point is in use, unmount
spode@0 127 if mount | grep $TARGET_ROOT; then
spode@0 128 umount $TARGET_ROOT
spode@0 129 fi
spode@0 130
spode@0 131 # Device could be mounted elsewhere, so unmount
spode@9 132 if mount | grep $DEVICE; then
spode@0 133 echo "Unmounting USB target device..."
spode@9 134 umount $DEVICE
spode@0 135 fi
spode@0 136 }
spode@0 137
spode@0 138 # Mount an existing USB device.
spode@0 139 mount_target_usb()
spode@0 140 {
spode@0 141 echo "Mounting USB target device..."
spode@0 142 mkdir -p $TARGET_ROOT
spode@9 143 mount $DEVICE $TARGET_ROOT 2>/dev/null
spode@0 144 }
spode@0 145
spode@0 146 # Mount SliTaz LiveCD to get needed files.
spode@0 147 mount_cdrom()
spode@0 148 {
spode@0 149 echo "Mounting cdrom device..."
spode@0 150
spode@0 151 if mount | grep /media/cdrom; then
spode@0 152 umount /media/cdrom
spode@0 153 fi
spode@0 154
spode@0 155 mkdir -p /media/cdrom
hacker@12 156 mount -r -t iso9660 $CDROM /media/cdrom 2>/dev/null
spode@0 157
spode@0 158 if [ ! -f /media/cdrom/boot/rootfs.gz ]; then
hacker@12 159 echo -e "\nUnable to mount cdrom or to find a filesystem on it (rootfs.gz).\n"
spode@0 160 exit 0
spode@0 161 fi
spode@0 162 }
spode@0 163
erjo@24 164 # Mount SliTaz ISO to get needed files.
erjo@24 165 mount_iso()
erjo@24 166 {
erjo@24 167 if mount | grep /media/cdrom ; then
erjo@24 168 umount /media/cdrom
erjo@24 169 fi
erjo@24 170
erjo@24 171 test -d /media/cdrom || mkdir -p /media/cdrom
erjo@24 172
erjo@34 173 # Add support to other distros.
erjo@34 174 if [ ! -f /etc/slitaz-version ]; then
erjo@34 175 OPTIONS="-o loop"
erjo@34 176 else
erjo@34 177 OPTIONS=""
erjo@34 178 fi
erjo@34 179
erjo@24 180 echo "Mounting `basename $ISO`..."
erjo@34 181 mount $OPTIONS $ISO /media/cdrom 2>/dev/null
erjo@24 182
erjo@24 183 if [ ! -f /media/cdrom/boot/rootfs.gz ]; then
erjo@24 184 echo -e "\nUnable to mount iso or to find a filesystem on it (rootfs.gz).\n"
erjo@24 185 exit 0
erjo@24 186 fi
erjo@24 187 }
erjo@24 188
erjo@24 189
spode@0 190 # All needed files are in the boot direcory of the cdrom.
spode@0 191 copy_cdrom_files()
spode@0 192 {
spode@0 193 echo -n "Copying needed files from cdrom..."
spode@0 194 mkdir -p $TARGET_ROOT/boot
spode@0 195 cp /media/cdrom/boot/bzImage $TARGET_ROOT/boot
spode@0 196 cp /media/cdrom/boot/rootfs.gz $TARGET_ROOT/boot
spode@0 197 status
spode@0 198 }
spode@0 199
spode@0 200 install_mbr()
spode@0 201 {
spode@0 202 # MBR
pankso@11 203 DISK=${DEVICE%[1-99]}
pascal@22 204 if [ -f /usr/share/boot/mbr.bin ]; then
pankso@11 205 echo -n "Installing a new MBR to: $DISK"
pascal@22 206 cat /usr/share/boot/mbr.bin > $DISK
spode@0 207 status
spode@0 208 else
spode@0 209 # Skip MBR install (tazpkg get-install syslinux-extra ? and then cat)
hacker@12 210 echo "No new MBR installed to: $DISK"
spode@0 211 fi
spode@0 212 }
spode@0 213
spode@0 214 # ext/syslinux install
spode@0 215 install_boot()
spode@0 216 {
MikeDSmith25@31 217 # Decide if we're installing syslinux or extlinux
spode@0 218 if [ "$FSTYPE" = "vfat" ]; then
spode@0 219 ST=syslinux
spode@9 220 STC="syslinux -d /boot/syslinux/ $DEVICE"
spode@0 221 STE=cfg
spode@0 222 else
spode@0 223 ST=extlinux
spode@0 224 STC="extlinux --install $TARGET_ROOT/boot/$ST"
spode@0 225 STE=conf
spode@0 226 fi
spode@0 227
spode@0 228 echo "Installing bootloader: $ST"
spode@0 229 mkdir -p $TARGET_ROOT/boot/$ST
spode@0 230 $STC
spode@0 231
erjo@23 232 # Use existing isolinux.cfg for extlinux.conf or syslinux.cfg
erjo@23 233 cp /media/cdrom/boot/isolinux/isolinux.cfg $TARGET_ROOT/boot/$ST/$ST.$STE
erjo@25 234 sed -i -e "s/isolinux.msg/$ST.msg/" $TARGET_ROOT/boot/$ST/$ST.$STE
erjo@23 235
MikeDSmith25@31 236 # Add home= to append in extlinux or syslinux.cfg
erjo@23 237 sed -i -e "s/\(append.*\)/\1 home=$UUID/" $TARGET_ROOT/boot/$ST/$ST.$STE
erjo@23 238
pankso@16 239 # Splash screen and help files.
erjo@23 240 cp /media/cdrom/boot/isolinux/isolinux.msg $TARGET_ROOT/boot/$ST/$ST.msg
erjo@23 241 sed -i s/'SliTaz GNU\/Linux'/'SliTaz GNU\/Linux LiveUSB'/ $TARGET_ROOT/boot/$ST/$ST.msg
pankso@16 242 cp /media/cdrom/boot/isolinux/splash.lss $TARGET_ROOT/boot/$ST
pankso@16 243 cp /media/cdrom/boot/isolinux/*.txt $TARGET_ROOT/boot/$ST
erjo@23 244 cp /media/cdrom/boot/isolinux/*.cfg $TARGET_ROOT/boot/$ST
pascal@29 245 cp /media/cdrom/boot/isolinux/*.inc $TARGET_ROOT/boot/$ST
erjo@23 246 cp /media/cdrom/boot/isolinux/*.kbd $TARGET_ROOT/boot/$ST
erjo@23 247 cp /media/cdrom/boot/isolinux/*.c32 $TARGET_ROOT/boot/$ST
erjo@23 248
erjo@23 249 # Modifing all cfg files.
erjo@23 250 for cfg in $TARGET_ROOT/boot/$ST/*.cfg
erjo@23 251 do
erjo@23 252 sed -i s/isolinux.msg/$ST.msg/ $cfg
erjo@23 253 done
erjo@23 254
MikeDSmith25@31 255 # Modifing include file if exists.
erjo@30 256 if [ -f $TARGET_ROOT/boot/$ST/common.inc ]; then
erjo@30 257 sed -i -e "s/isolinux.msg/$ST.msg/" $TARGET_ROOT/boot/$ST/common.inc
erjo@30 258 fi
erjo@23 259
spode@0 260 }
spode@0 261
spode@0 262 # Let user exit or reboot.
spode@0 263 exit_or_reboot()
spode@0 264 {
pankso@16 265 echo "==============================================================================="
spode@0 266 echo ""
spode@0 267 echo -n "Do you want to exit Tazusb or reboot system (Exit/reboot) ? "
spode@0 268 read anser
spode@0 269 if [ "$anser" == "reboot" ]; then
spode@0 270 umount $TARGET_ROOT
spode@0 271 umount /media/cdrom
spode@0 272 reboot || reboot -f
spode@0 273 else
pankso@37 274 umount $TARGET_ROOT
spode@0 275 umount /media/cdrom
spode@0 276 echo ""
spode@0 277 exit 0
spode@0 278 fi
spode@0 279 }
spode@0 280
spode@0 281 set_bootable()
spode@0 282 {
spode@0 283 # As the boot flag is toggable, need to check it before hand
pankso@16 284 DISK=${DEVICE%[1-99]}
pankso@16 285 ISSET=`fdisk -l $DISK | grep $DEVICE | grep "\*"`
spode@0 286
spode@0 287 # If not set, set bootable
pankso@16 288 if [ "$ISSET" == "" ]; then
pankso@16 289 umount $TARGET_ROOT 2>/dev/null
pankso@16 290 echo -n "Setting $DEVICE as bootable..."
pankso@16 291 fdisk $DISK >/dev/null << EOF
spode@0 292 a
spode@0 293 1
spode@0 294 w
spode@0 295 EOF
pankso@16 296 status
spode@0 297 fi
spode@0 298 }
spode@0 299
paul@41 300 # Generate a virtual swap file in /home/swap. SliTaz boot scripts
paul@41 301 # will activate it, useful for low memory systems
pankso@13 302 gen_swap_file()
pankso@13 303 {
pankso@13 304 echo ""
pankso@13 305 echo -en "\033[1mGen swap\033[0m
pankso@13 306 ===============================================================================
paul@26 307 Generate a swap file in /home/swap that will be activated on each boot to have
pankso@13 308 more memory available (Empty value to exit).
pankso@13 309
pankso@13 310 Swap file in Mb : "
pankso@13 311 read size
pankso@13 312 if [ -z "$size" ]; then
pankso@13 313 echo -e "\nEmpty value. Exiting...\n"
pankso@13 314 exit 0
pankso@13 315 fi
pankso@13 316 cd /home
pankso@13 317 # Sanity check
pankso@13 318 if [ -f swap ]; then
pankso@13 319 swapoff swap 2>/dev/null
pankso@13 320 fi
pankso@13 321 # DD to gen a virtual disk.
pankso@13 322 dd if=/dev/zero of=swap bs=1M count=$size
pankso@13 323 # Make swap filesystem.
pankso@13 324 mkswap swap
pankso@13 325 swapon swap
pankso@13 326 echo ""
pankso@13 327 }
pankso@13 328
paul@26 329 # Clean out old backups to save disk space
paul@26 330 clean_usb()
paul@26 331 {
paul@26 332 echo ""
paul@26 333 echo -en "\033[1mClean\033[0m
paul@26 334 ===============================================================================
paul@26 335 Remove old rootfs.gz.unixtimestamp backup filesystems to free up disk space.\n\n"
MikeDSmith25@31 336 # Locate and interactively remove old filesystems from /home directory
paul@26 337 for file in `find /home/boot/rootfs.gz.[0-9]*`
paul@26 338 do
paul@26 339 echo -n "Do you wish to remove: `basename $file` (Yes/no/exit) ? "
paul@26 340 read answer
paul@26 341 case $answer in
paul@26 342 e|E|"exit"|Exit)
paul@26 343 exit 0 ;;
paul@26 344 y|Y|yes|Yes)
paul@26 345 rm -f $file ;;
paul@26 346 *)
paul@26 347 echo -en "No filesystems selected, exiting...\n" ;;
paul@26 348 esac
paul@26 349 done
paul@26 350 }
paul@26 351
spode@0 352 #
spode@0 353 # Tazusb sequence
spode@0 354 #
spode@0 355
spode@0 356 case $COMMAND in
spode@0 357 writefs)
MikeDSmith25@31 358 # Writefs to rootfs.gz
spode@0 359 check_root
spode@0 360 if [ -z $2 ]; then
spode@0 361 COMPRESSION=none
spode@0 362 else
spode@0 363 COMPRESSION=$2
spode@0 364 fi
MikeDSmith25@31 365 # Start info
spode@0 366 echo ""
spode@0 367 echo -e "\033[1mWrite filesystem\033[0m
spode@0 368 ===============================================================================
spode@0 369 The command writefs will write all the current filesystem into a suitable cpio
spode@0 370 archive (rootfs.gz) usable on a bootable LiveUSB media.
spode@0 371
spode@0 372 Archive compression: $COMPRESSION"
spode@0 373 echo ""
spode@0 374
MikeDSmith25@31 375 # Clear out tazpkg cache
spode@0 376 rm /var/cache/tazpkg/* -r -f
spode@0 377
MikeDSmith25@31 378 # Optionally remove sound card selection
pankso@35 379 echo -n "Do you wish to remove the sound card selection (No/yes/exit) ? "
pankso@5 380 read anser
pankso@5 381 case $anser in
pankso@5 382 e|E|"exit"|Exit)
pankso@35 383 exit 0 ;;
pankso@5 384 y|Y|yes|Yes)
pankso@5 385 echo -n "Removing current sound card selection..."
pankso@5 386 rm -f /var/lib/sound-card-driver
pankso@35 387 rm -f /etc/asound.state ;;
pankso@5 388 *)
pankso@35 389 echo -n "Keeping current sound card selection..." ;;
pankso@35 390 esac
pankso@35 391 status
pankso@35 392 # Optionally remove screen resolution
pankso@35 393 echo -n "Do you wish to remove the screen resolution (No/yes/exit) ? "
pankso@35 394 read anser
pankso@35 395 case $anser in
pankso@35 396 e|E|"exit"|Exit)
pankso@35 397 exit 0 ;;
pankso@35 398 y|Y|yes|Yes)
pankso@35 399 echo -n "Removing current screen resolution..."
pankso@35 400 rm -f /etc/X11/screen.conf ;;
pankso@35 401 *)
pankso@35 402 echo -n "Keeping current screen resolution..." ;;
pankso@5 403 esac
spode@0 404 status
spode@0 405
MikeDSmith25@31 406 # Create list of files
pascal@27 407 find /bin /etc /init /sbin /var /dev /lib /root /usr >/tmp/list
spode@0 408
pascal@27 409 for dir in /home /proc /sys /tmp /mnt /media /media/cdrom /media/flash /media/usbdisk
spode@0 410 do
spode@0 411 echo $dir >>/tmp/list
spode@0 412 done
spode@0 413
MikeDSmith25@31 414 # Generate initramfs with specified compression
spode@0 415 if [ "$COMPRESSION" = "lzma" ]; then
spode@0 416 echo -n "Creating rootfs.gz with lzma compression... "
spode@0 417 cat /tmp/list | cpio -o -H newc | lzma e -si -so > /rootfs.gz
spode@0 418
spode@0 419 elif [ "$COMPRESSION" = "gzip" ]; then
spode@0 420 echo -n "Creating rootfs.gz with gzip compression... "
spode@0 421 cat /tmp/list | cpio -o -H newc | gzip -9 > /rootfs.gz
spode@0 422
spode@0 423 else
spode@0 424 echo -n "Creating rootfs.gz without compression... "
spode@0 425 cat /tmp/list | cpio -o -H newc > /rootfs.gz
spode@0 426 fi
spode@0 427
MikeDSmith25@31 428 # Get initramfs size
spode@0 429 size=`du -sh /rootfs.gz | cut -f 1`
spode@0 430
MikeDSmith25@31 431 # If the bootable medium is where it should be, copy across
spode@0 432 if (test -e /home/boot/bzImage); then
spode@0 433 echo "Moving rootfs.gz to media. Remember to unmount for delayed writes!"
spode@0 434
MikeDSmith25@31 435 # Move the old filesystem with the unix timestamp for reference
spode@0 436 if (test -e /home/boot/previous.gz); then
spode@0 437 mv /home/boot/previous.gz /home/boot/rootfs.gz.$(date +%s)
spode@0 438 fi
spode@0 439
spode@0 440 mv /home/boot/rootfs.gz /home/boot/previous.gz
spode@0 441 mv /rootfs.gz /home/boot/.
spode@0 442 else
spode@0 443 echo "rootfs.gz is located in /"
spode@0 444 fi
spode@0 445
spode@0 446 echo "==============================================================================="
spode@0 447 echo "Root filesystem size: $size"
spode@0 448 echo ""
pankso@14 449 echo -en "----\nENTER to continue..."; read i
spode@0 450 ;;
spode@0 451 format)
spode@0 452 # Format a partitions in ext3.
spode@0 453 check_root
spode@0 454 echo ""
spode@0 455 echo -e "\033[1mFormat a device\033[0m"
spode@0 456 echo "==============================================================================="
spode@0 457 DEVICE=$2
spode@0 458 if [ -z $DEVICE ]; then
hacker@12 459 ask_for_device
hacker@12 460 check_for_device
hacker@12 461 else
hacker@12 462 echo "Device : $DEVICE"
spode@0 463 fi
spode@0 464 mkfs_ext3
spode@0 465 echo "==============================================================================="
spode@9 466 echo "Device $label ($DEVICE) is ready to use as LiveUSB and/or /home partition."
spode@0 467 echo ""
spode@0 468 ;;
spode@0 469 gen-liveusb)
spode@0 470 # Generate a LiveUSB media using files from a LiveCD.
spode@0 471 check_root
spode@0 472 echo ""
spode@0 473 echo -e "\033[1mGen a LiveUSB media\033[0m"
spode@0 474 echo "==============================================================================="
spode@0 475 DEVICE=$2
spode@0 476 if [ -z $DEVICE ]; then
hacker@12 477 ask_for_device
spode@0 478 fi
spode@0 479
spode@0 480 check_for_device
pankso@11 481 mount_cdrom
spode@0 482 get_part_info
spode@0 483 unmount_target_usb
spode@0 484 install_mbr
spode@0 485 set_bootable
spode@0 486 mount_target_usb
spode@0 487 copy_cdrom_files
spode@0 488 install_boot
spode@0 489 exit_or_reboot
spode@0 490 ;;
pankso@13 491 gen-swap)
pankso@13 492 check_root
pankso@13 493 gen_swap_file
pankso@13 494 ;;
erjo@24 495 gen-iso2usb)
erjo@24 496 check_root
erjo@24 497
erjo@24 498 # Check if file exists
erjo@24 499 ISO=$2
erjo@24 500 if [ -z $ISO ] || [ ! -f $ISO ]; then
erjo@24 501 echo -e "\nPlease specify a valid filename on the command line.\n"
erjo@24 502 exit 1
erjo@24 503 fi
erjo@24 504 echo ""
erjo@24 505 echo -e "\033[1mCopy ISO file to SliTaz LiveUSB media\033[0m"
erjo@24 506 echo "==============================================================================="
erjo@24 507 echo ""
erjo@24 508 DEVICE=$3
erjo@24 509 if [ -z $DEVICE ]; then
erjo@24 510 ask_for_device
erjo@24 511 fi
erjo@24 512 check_for_device
erjo@24 513 mount_iso
erjo@24 514 get_part_info
erjo@24 515 unmount_target_usb
erjo@24 516 install_mbr
erjo@24 517 set_bootable
erjo@24 518 mount_target_usb
erjo@24 519 copy_cdrom_files
erjo@24 520 install_boot
erjo@24 521 exit_or_reboot
pankso@37 522 losetup -d /dev/loop0
paul@26 523 ;;
paul@26 524 clean)
paul@28 525 check_root
paul@28 526 clean_usb
paul@28 527 ;;
spode@0 528 usage|*)
spode@0 529 # Display usage by default.
spode@0 530 usage
spode@0 531 ;;
spode@0 532 esac
spode@0 533
spode@0 534 exit 0