tazusb annotate tazusb @ rev 3

Fix usage output (80 cols is standard) add timeout at boot
author Christophe Lincoln <pankso@slitaz.org>
date Wed Mar 05 11:28:30 2008 +0100 (2008-03-05)
parents 068f0611d8b5
children 189f70337617
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 #
spode@0 11 VERSION=20080304
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).
spode@0 33 gen-liveusb Generate a bootable LiveUSB using files from the LiveCD.\n"
spode@0 34 }
spode@0 35
spode@0 36 # Status function.
spode@0 37 status()
spode@0 38 {
spode@0 39 local CHECK=$?
spode@0 40 echo -en "\\033[70G[ "
spode@0 41 if [ $CHECK = 0 ]; then
spode@0 42 echo -en "\\033[1;33mOK"
spode@0 43 else
spode@0 44 echo -en "\\033[1;31mFailed"
spode@0 45 fi
spode@0 46 echo -e "\\033[0;39m ]"
spode@0 47 }
spode@0 48
spode@0 49 # Exit if user is not root.
spode@0 50 check_root()
spode@0 51 {
spode@0 52 if test $(id -u) != 0 ; then
spode@0 53 echo -e "\nThis program requires being run as root.\n"
spode@0 54 exit 0
spode@0 55 fi
spode@0 56 }
spode@0 57
spode@0 58 # Verify a device exists before format or install
spode@0 59 check_for_device()
spode@0 60 {
spode@0 61 DEVID=`fdisk -l | grep -w $DEVICE | cut -d: -f1 | cut -d/ -f3`
spode@0 62 if [ -z "$DEVID" ]; then
spode@0 63 echo -e "\nUnable to find device: $DEVICE\n"
spode@0 64 exit 0
spode@0 65 fi
spode@0 66
spode@0 67 PARTID=/dev/"$DEVID"1
spode@0 68 }
spode@0 69
spode@0 70 #gets the UUID and filesystem type
spode@0 71 get_part_info()
spode@0 72 {
spode@0 73 UUID=`blkid -s UUID -o value $PARTID`
spode@0 74 FSTYPE=`blkid -s TYPE -o value $PARTID`
spode@0 75 }
spode@0 76
spode@0 77 # Format target device and label partition.
spode@0 78 mkfs_ext3()
spode@0 79 {
spode@0 80 echo -n "Please specify a label for the partition (TazUSB): "
spode@0 81 read label
spode@0 82
spode@0 83 if [ -z $label ]; then
spode@0 84 label=TazUSB
spode@0 85 fi
spode@0 86
spode@0 87 echo "Label : $label"
spode@0 88 echo "Mkfs : mkfs.ext3 -L \"$label\" $PARTID"
spode@0 89 echo "" && sleep 2
spode@0 90 mkfs.ext3 -L "$label" $PARTID
spode@0 91
spode@0 92 }
spode@0 93
spode@0 94 # Mount an existing USB device.
spode@0 95 unmount_target_usb()
spode@0 96 {
spode@0 97 # If mount point is in use, unmount
spode@0 98 if mount | grep $TARGET_ROOT; then
spode@0 99 umount $TARGET_ROOT
spode@0 100 fi
spode@0 101
spode@0 102 # Device could be mounted elsewhere, so unmount
spode@0 103 if mount | grep $PARTID; then
spode@0 104 echo "Unmounting USB target device..."
spode@0 105 umount $PARTID
spode@0 106 fi
spode@0 107 }
spode@0 108
spode@0 109 # Mount an existing USB device.
spode@0 110 mount_target_usb()
spode@0 111 {
spode@0 112 # If mount point is in use, unmount
spode@0 113 if mount | grep $TARGET_ROOT; then
spode@0 114 umount $TARGET_ROOT
spode@0 115 fi
spode@0 116
spode@0 117 # Device could be mounted elsewhere, so unmount
spode@0 118 if mount | grep $PARTID; then
spode@0 119 umount $PARTID
spode@0 120 fi
spode@0 121
spode@0 122 echo "Mounting USB target device..."
spode@0 123 mkdir -p $TARGET_ROOT
spode@0 124 mount $PARTID $TARGET_ROOT 2>/dev/null
spode@0 125 }
spode@0 126
spode@0 127 # Mount SliTaz LiveCD to get needed files.
spode@0 128 mount_cdrom()
spode@0 129 {
spode@0 130 echo "Mounting cdrom device..."
spode@0 131
spode@0 132 if mount | grep /media/cdrom; then
spode@0 133 umount /media/cdrom
spode@0 134 fi
spode@0 135
spode@0 136 mkdir -p /media/cdrom
spode@0 137 mount -t iso9660 $CDROM /media/cdrom
spode@0 138
spode@0 139 if [ ! -f /media/cdrom/boot/rootfs.gz ]; then
spode@0 140 echo -e "\nUnable to find a filesystem on the cdrom (rootfs.gz).\n"
spode@0 141 exit 0
spode@0 142 fi
spode@0 143 }
spode@0 144
spode@0 145 # All needed files are in the boot direcory of the cdrom.
spode@0 146 copy_cdrom_files()
spode@0 147 {
spode@0 148 echo -n "Copying needed files from cdrom..."
spode@0 149 mkdir -p $TARGET_ROOT/boot
spode@0 150 cp /media/cdrom/boot/bzImage $TARGET_ROOT/boot
spode@0 151 cp /media/cdrom/boot/rootfs.gz $TARGET_ROOT/boot
spode@0 152 status
spode@0 153 }
spode@0 154
spode@0 155 install_mbr()
spode@0 156 {
spode@0 157 # MBR
spode@0 158 if [ -f /usr/share/syslinux/mbr.bin ]; then
spode@0 159 echo -n "Installing a new MBR to: $DEVICE"
spode@0 160 cat /usr/share/syslinux/mbr.bin > $DEVICE
spode@0 161 status
spode@0 162 else
spode@0 163 # Skip MBR install (tazpkg get-install syslinux-extra ? and then cat)
spode@0 164 echo "No new MBR installed to: $DEVICE"
spode@0 165 fi
spode@0 166 }
spode@0 167
spode@0 168 # ext/syslinux install
spode@0 169 install_boot()
spode@0 170 {
spode@0 171 #decide if we're installing syslinux or extlinux
spode@0 172 if [ "$FSTYPE" = "vfat" ]; then
spode@0 173 ST=syslinux
spode@0 174 STC="syslinux -d /boot/syslinux/ $PARTID"
spode@0 175 STE=cfg
spode@0 176 else
spode@0 177 ST=extlinux
spode@0 178 STC="extlinux --install $TARGET_ROOT/boot/$ST"
spode@0 179 STE=conf
spode@0 180 fi
spode@0 181
spode@0 182 echo "Installing bootloader: $ST"
spode@0 183 mkdir -p $TARGET_ROOT/boot/$ST
spode@0 184 $STC
spode@0 185
spode@0 186 # extlinux.conf / syslinux.cfg
spode@0 187 cat > $TARGET_ROOT/boot/$ST/$ST.$STE << _EOT_
spode@0 188 display display.txt
spode@0 189 default slitaz
pankso@3 190 timeout 20
spode@0 191 label slitaz
spode@0 192 kernel /boot/bzImage
spode@0 193 append initrd=/boot/rootfs.gz rw root=/dev/null home=$UUID
spode@0 194
spode@0 195 label previous
spode@0 196 kernel /boot/bzImage
spode@0 197 append initrd=/boot/previous.gz rw root=/dev/null home=$UUID
spode@0 198
spode@0 199 _EOT_
spode@0 200
spode@0 201 # display.txt
spode@0 202 cat > $TARGET_ROOT/boot/$ST/display.txt << "EOT"
spode@0 203 _______. __ __ .___________. ___ ________
spode@0 204 / || | | | | | / \ | /
spode@0 205 | (----`| | | | `---| |---` / ^ \ `---/ /
spode@0 206 \ \ | | | | | | / /_\ \ / /
spode@0 207 .----) | | `----.| | | | / _____ \ / /----.
spode@0 208 |_______/ |_______||__| |__| /__/ \__\ /________|
spode@0 209
spode@0 210
spode@0 211 SliTaz GNU/Linux LiveUSB
spode@0 212 Simple Light Incredible Temporary Autonomus Zone
spode@0 213
spode@0 214
spode@0 215 EOT
spode@0 216 status
spode@0 217 }
spode@0 218
spode@0 219 # Let user exit or reboot.
spode@0 220 exit_or_reboot()
spode@0 221 {
spode@0 222 echo ""
spode@0 223 echo -n "Do you want to exit Tazusb or reboot system (Exit/reboot) ? "
spode@0 224 read anser
spode@0 225 if [ "$anser" == "reboot" ]; then
spode@0 226 umount $TARGET_ROOT
spode@0 227 umount /media/cdrom
spode@0 228 reboot || reboot -f
spode@0 229 else
spode@0 230 umount /media/cdrom
spode@0 231 echo "==============================================================================="
spode@0 232 echo ""
spode@0 233 exit 0
spode@0 234 fi
spode@0 235 }
spode@0 236
spode@0 237 set_bootable()
spode@0 238 {
spode@0 239 # As the boot flag is toggable, need to check it before hand
spode@0 240 ISSET=`fdisk -l $DEVICE | grep $DEVICE | grep "*"`
spode@0 241
spode@0 242 # If not set, set bootable
spode@0 243 if [ -z "$ISSET" ]; then
spode@0 244 umount $DEVICE
spode@0 245 echo "Setting $PARTID as bootable..."
spode@0 246 fdisk $DEVICE >/dev/null << EOF
spode@0 247 a
spode@0 248 1
spode@0 249 w
spode@0 250 EOF
spode@0 251 status
spode@0 252 fi
spode@0 253 }
spode@0 254
spode@0 255 #
spode@0 256 # Tazusb sequence
spode@0 257 #
spode@0 258
spode@0 259 case $COMMAND in
spode@0 260 writefs)
spode@0 261 #writefs to rootfs.gz
spode@0 262 check_root
spode@0 263 if [ -z $2 ]; then
spode@0 264 COMPRESSION=none
spode@0 265 else
spode@0 266 COMPRESSION=$2
spode@0 267 fi
spode@0 268 #start info
spode@0 269 echo ""
spode@0 270 echo -e "\033[1mWrite filesystem\033[0m
spode@0 271 ===============================================================================
spode@0 272 The command writefs will write all the current filesystem into a suitable cpio
spode@0 273 archive (rootfs.gz) usable on a bootable LiveUSB media.
spode@0 274
spode@0 275 Archive compression: $COMPRESSION"
spode@0 276 echo ""
spode@0 277
spode@0 278 #clear out tazpkg cache
spode@0 279 rm /var/cache/tazpkg/* -r -f
spode@0 280
spode@0 281 #optionally remove sound card selection
spode@0 282 echo -n "Do you wish to remove the sound card selection (Yes/no/exit) ? "
spode@0 283 read answer
spode@0 284 answer=`echo "$answer:0:1}" | tr A-Z a-z`
spode@0 285
spode@1 286 if [ "$answer" = "e" ]; then
spode@0 287 exit 0
spode@0 288 fi
spode@0 289
spode@0 290 if [ "$answer" = "y" ]; then
spode@0 291 echo -n "Removing current sound card selection..."
spode@0 292 rm -f /var/lib/sound-card-driver
spode@0 293 rm -f /etc/asound.state
spode@0 294 else
spode@0 295 echo -n "Keeping current sound card selection..."
spode@0 296 fi
spode@0 297 status
spode@0 298
spode@0 299 #create list of files
spode@0 300 find /bin /etc /init /sbin /var /dev /lib /mnt /root /usr >/tmp/list
spode@0 301
spode@0 302 for dir in /home /proc /sys /tmp /media /media/cdrom /media/flash /media/usbdisk
spode@0 303 do
spode@0 304 echo $dir >>/tmp/list
spode@0 305 done
spode@0 306
spode@0 307 #gen initramfs with specified compression
spode@0 308 if [ "$COMPRESSION" = "lzma" ]; then
spode@0 309 echo -n "Creating rootfs.gz with lzma compression... "
spode@0 310 cat /tmp/list | cpio -o -H newc | lzma e -si -so > /rootfs.gz
spode@0 311
spode@0 312 elif [ "$COMPRESSION" = "gzip" ]; then
spode@0 313 echo -n "Creating rootfs.gz with gzip compression... "
spode@0 314 cat /tmp/list | cpio -o -H newc | gzip -9 > /rootfs.gz
spode@0 315
spode@0 316 else
spode@0 317 echo -n "Creating rootfs.gz without compression... "
spode@0 318 cat /tmp/list | cpio -o -H newc > /rootfs.gz
spode@0 319 fi
spode@0 320
spode@0 321 #get initramfs size
spode@0 322 size=`du -sh /rootfs.gz | cut -f 1`
spode@0 323
spode@0 324 #if the bootable medium is where it should be, copy across
spode@0 325
spode@0 326 if (test -e /home/boot/bzImage); then
spode@0 327 echo "Moving rootfs.gz to media. Remember to unmount for delayed writes!"
spode@0 328
spode@0 329 #move the old filesystem with the unix timestamp for reference
spode@0 330 if (test -e /home/boot/previous.gz); then
spode@0 331 mv /home/boot/previous.gz /home/boot/rootfs.gz.$(date +%s)
spode@0 332 fi
spode@0 333
spode@0 334 mv /home/boot/rootfs.gz /home/boot/previous.gz
spode@0 335 mv /rootfs.gz /home/boot/.
spode@0 336 else
spode@0 337 echo "rootfs.gz is located in /"
spode@0 338 fi
spode@0 339
spode@0 340 echo "==============================================================================="
spode@0 341 echo "Root filesystem size: $size"
spode@0 342 echo ""
spode@0 343 ;;
spode@0 344 format)
spode@0 345 # Format a partitions in ext3.
spode@0 346 check_root
spode@0 347 echo ""
spode@0 348 echo -e "\033[1mFormat a device\033[0m"
spode@0 349 echo "==============================================================================="
spode@0 350 DEVICE=$2
spode@0 351 if [ -z $DEVICE ]; then
spode@0 352 echo -e "\nPlease specify a device to format: tazusb $COMMAND /dev/name\n"
spode@0 353 exit 0
spode@0 354 fi
spode@0 355 check_for_device
spode@0 356 echo "Device : $DEVICE"
spode@0 357 mkfs_ext3
spode@0 358 echo "==============================================================================="
spode@0 359 echo "Device $label ($PARTID) is ready to use as LiveUSB and/or /home partition."
spode@0 360 echo ""
spode@0 361 ;;
spode@0 362 gen-liveusb)
spode@0 363 # Generate a LiveUSB media using files from a LiveCD.
spode@0 364 check_root
spode@0 365 echo ""
spode@0 366 echo -e "\033[1mGen a LiveUSB media\033[0m"
spode@0 367 echo "==============================================================================="
spode@0 368 DEVICE=$2
spode@0 369 if [ -z $DEVICE ]; then
spode@0 370 echo -e "\No device specified. Usage: tazusb $CAMMAND /dev/name\n"
spode@0 371 exit 0
spode@0 372 fi
spode@0 373
spode@0 374 check_for_device
spode@0 375 get_part_info
spode@0 376 unmount_target_usb
spode@0 377 install_mbr
spode@0 378 set_bootable
spode@0 379 mount_target_usb
spode@0 380 mount_cdrom
spode@0 381 copy_cdrom_files
spode@0 382 install_boot
spode@0 383 exit_or_reboot
spode@0 384 ;;
spode@0 385 usage|*)
spode@0 386 # Display usage by default.
spode@0 387 usage
spode@0 388 ;;
spode@0 389 esac
spode@0 390
spode@0 391 exit 0