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