tazusb annotate tazusb @ rev 16

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