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 #
|
hacker@12
|
11 VERSION=20080312
|
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 {
|
hacker@12
|
62 echo ""
|
hacker@12
|
63 fdisk -l | grep ^/dev/sd*
|
hacker@12
|
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_
|
spode@0
|
206 display display.txt
|
spode@0
|
207 default slitaz
|
pankso@3
|
208 timeout 20
|
spode@0
|
209 label slitaz
|
spode@0
|
210 kernel /boot/bzImage
|
spode@0
|
211 append initrd=/boot/rootfs.gz rw root=/dev/null home=$UUID
|
spode@0
|
212
|
spode@0
|
213 label previous
|
spode@0
|
214 kernel /boot/bzImage
|
spode@0
|
215 append initrd=/boot/previous.gz rw root=/dev/null home=$UUID
|
spode@0
|
216
|
spode@0
|
217 _EOT_
|
spode@0
|
218
|
spode@0
|
219 # display.txt
|
spode@0
|
220 cat > $TARGET_ROOT/boot/$ST/display.txt << "EOT"
|
spode@0
|
221 _______. __ __ .___________. ___ ________
|
spode@0
|
222 / || | | | | | / \ | /
|
spode@0
|
223 | (----`| | | | `---| |---` / ^ \ `---/ /
|
spode@0
|
224 \ \ | | | | | | / /_\ \ / /
|
spode@0
|
225 .----) | | `----.| | | | / _____ \ / /----.
|
spode@0
|
226 |_______/ |_______||__| |__| /__/ \__\ /________|
|
spode@0
|
227
|
spode@0
|
228
|
spode@0
|
229 SliTaz GNU/Linux LiveUSB
|
spode@0
|
230 Simple Light Incredible Temporary Autonomus Zone
|
spode@0
|
231
|
spode@0
|
232
|
spode@0
|
233 EOT
|
spode@0
|
234 status
|
spode@0
|
235 }
|
spode@0
|
236
|
spode@0
|
237 # Let user exit or reboot.
|
spode@0
|
238 exit_or_reboot()
|
spode@0
|
239 {
|
spode@0
|
240 echo ""
|
spode@0
|
241 echo -n "Do you want to exit Tazusb or reboot system (Exit/reboot) ? "
|
spode@0
|
242 read anser
|
spode@0
|
243 if [ "$anser" == "reboot" ]; then
|
spode@0
|
244 umount $TARGET_ROOT
|
spode@0
|
245 umount /media/cdrom
|
spode@0
|
246 reboot || reboot -f
|
spode@0
|
247 else
|
spode@0
|
248 umount /media/cdrom
|
spode@0
|
249 echo "==============================================================================="
|
spode@0
|
250 echo ""
|
spode@0
|
251 exit 0
|
spode@0
|
252 fi
|
spode@0
|
253 }
|
spode@0
|
254
|
spode@0
|
255 set_bootable()
|
spode@0
|
256 {
|
spode@0
|
257 # As the boot flag is toggable, need to check it before hand
|
spode@0
|
258 ISSET=`fdisk -l $DEVICE | grep $DEVICE | grep "*"`
|
spode@0
|
259
|
spode@0
|
260 # If not set, set bootable
|
spode@0
|
261 if [ -z "$ISSET" ]; then
|
spode@0
|
262 umount $DEVICE
|
spode@9
|
263 echo "Setting $DEVICE as bootable..."
|
spode@0
|
264 fdisk $DEVICE >/dev/null << EOF
|
spode@0
|
265 a
|
spode@0
|
266 1
|
spode@0
|
267 w
|
spode@0
|
268 EOF
|
spode@0
|
269 status
|
spode@0
|
270 fi
|
spode@0
|
271 }
|
spode@0
|
272
|
pankso@13
|
273 # Generate a virtual swap file in /home/swap. SliTaz boot script
|
pankso@13
|
274 # will active it, usefull for low memory system
|
pankso@13
|
275 gen_swap_file()
|
pankso@13
|
276 {
|
pankso@13
|
277 echo ""
|
pankso@13
|
278 echo -en "\033[1mGen swap\033[0m
|
pankso@13
|
279 ===============================================================================
|
pankso@13
|
280 Generate a swap file in /home/swap that will be activate on each boot to have
|
pankso@13
|
281 more memory available (Empty value to exit).
|
pankso@13
|
282
|
pankso@13
|
283 Swap file in Mb : "
|
pankso@13
|
284 read size
|
pankso@13
|
285 if [ -z "$size" ]; then
|
pankso@13
|
286 echo -e "\nEmpty value. Exiting...\n"
|
pankso@13
|
287 exit 0
|
pankso@13
|
288 fi
|
pankso@13
|
289 cd /home
|
pankso@13
|
290 # Sanity check
|
pankso@13
|
291 if [ -f swap ]; then
|
pankso@13
|
292 swapoff swap 2>/dev/null
|
pankso@13
|
293 fi
|
pankso@13
|
294 # DD to gen a virtual disk.
|
pankso@13
|
295 dd if=/dev/zero of=swap bs=1M count=$size
|
pankso@13
|
296 # Make swap filesystem.
|
pankso@13
|
297 mkswap swap
|
pankso@13
|
298 swapon swap
|
pankso@13
|
299 echo ""
|
pankso@13
|
300 }
|
pankso@13
|
301
|
spode@0
|
302 #
|
spode@0
|
303 # Tazusb sequence
|
spode@0
|
304 #
|
spode@0
|
305
|
spode@0
|
306 case $COMMAND in
|
spode@0
|
307 writefs)
|
spode@0
|
308 #writefs to rootfs.gz
|
spode@0
|
309 check_root
|
spode@0
|
310 if [ -z $2 ]; then
|
spode@0
|
311 COMPRESSION=none
|
spode@0
|
312 else
|
spode@0
|
313 COMPRESSION=$2
|
spode@0
|
314 fi
|
spode@0
|
315 #start info
|
spode@0
|
316 echo ""
|
spode@0
|
317 echo -e "\033[1mWrite filesystem\033[0m
|
spode@0
|
318 ===============================================================================
|
spode@0
|
319 The command writefs will write all the current filesystem into a suitable cpio
|
spode@0
|
320 archive (rootfs.gz) usable on a bootable LiveUSB media.
|
spode@0
|
321
|
spode@0
|
322 Archive compression: $COMPRESSION"
|
spode@0
|
323 echo ""
|
spode@0
|
324
|
spode@0
|
325 #clear out tazpkg cache
|
spode@0
|
326 rm /var/cache/tazpkg/* -r -f
|
spode@0
|
327
|
spode@0
|
328 #optionally remove sound card selection
|
spode@0
|
329 echo -n "Do you wish to remove the sound card selection (Yes/no/exit) ? "
|
pankso@5
|
330 read anser
|
pankso@5
|
331 case $anser in
|
pankso@5
|
332 e|E|"exit"|Exit)
|
pankso@5
|
333 exit 0
|
pankso@5
|
334 ;;
|
pankso@5
|
335 y|Y|yes|Yes)
|
pankso@5
|
336 echo -n "Removing current sound card selection..."
|
pankso@5
|
337 rm -f /var/lib/sound-card-driver
|
pankso@5
|
338 rm -f /etc/asound.state
|
pankso@5
|
339 ;;
|
pankso@5
|
340 *)
|
pankso@5
|
341 echo -n "Keeping current sound card selection..."
|
pankso@5
|
342 ;;
|
pankso@5
|
343 esac
|
spode@0
|
344 status
|
spode@0
|
345
|
spode@0
|
346 #create list of files
|
spode@0
|
347 find /bin /etc /init /sbin /var /dev /lib /mnt /root /usr >/tmp/list
|
spode@0
|
348
|
spode@0
|
349 for dir in /home /proc /sys /tmp /media /media/cdrom /media/flash /media/usbdisk
|
spode@0
|
350 do
|
spode@0
|
351 echo $dir >>/tmp/list
|
spode@0
|
352 done
|
spode@0
|
353
|
spode@0
|
354 #gen initramfs with specified compression
|
spode@0
|
355 if [ "$COMPRESSION" = "lzma" ]; then
|
spode@0
|
356 echo -n "Creating rootfs.gz with lzma compression... "
|
spode@0
|
357 cat /tmp/list | cpio -o -H newc | lzma e -si -so > /rootfs.gz
|
spode@0
|
358
|
spode@0
|
359 elif [ "$COMPRESSION" = "gzip" ]; then
|
spode@0
|
360 echo -n "Creating rootfs.gz with gzip compression... "
|
spode@0
|
361 cat /tmp/list | cpio -o -H newc | gzip -9 > /rootfs.gz
|
spode@0
|
362
|
spode@0
|
363 else
|
spode@0
|
364 echo -n "Creating rootfs.gz without compression... "
|
spode@0
|
365 cat /tmp/list | cpio -o -H newc > /rootfs.gz
|
spode@0
|
366 fi
|
spode@0
|
367
|
spode@0
|
368 #get initramfs size
|
spode@0
|
369 size=`du -sh /rootfs.gz | cut -f 1`
|
spode@0
|
370
|
spode@0
|
371 #if the bootable medium is where it should be, copy across
|
spode@0
|
372
|
spode@0
|
373 if (test -e /home/boot/bzImage); then
|
spode@0
|
374 echo "Moving rootfs.gz to media. Remember to unmount for delayed writes!"
|
spode@0
|
375
|
spode@0
|
376 #move the old filesystem with the unix timestamp for reference
|
spode@0
|
377 if (test -e /home/boot/previous.gz); then
|
spode@0
|
378 mv /home/boot/previous.gz /home/boot/rootfs.gz.$(date +%s)
|
spode@0
|
379 fi
|
spode@0
|
380
|
spode@0
|
381 mv /home/boot/rootfs.gz /home/boot/previous.gz
|
spode@0
|
382 mv /rootfs.gz /home/boot/.
|
spode@0
|
383 else
|
spode@0
|
384 echo "rootfs.gz is located in /"
|
spode@0
|
385 fi
|
spode@0
|
386
|
spode@0
|
387 echo "==============================================================================="
|
spode@0
|
388 echo "Root filesystem size: $size"
|
spode@0
|
389 echo ""
|
spode@0
|
390 ;;
|
spode@0
|
391 format)
|
spode@0
|
392 # Format a partitions in ext3.
|
spode@0
|
393 check_root
|
spode@0
|
394 echo ""
|
spode@0
|
395 echo -e "\033[1mFormat a device\033[0m"
|
spode@0
|
396 echo "==============================================================================="
|
spode@0
|
397 DEVICE=$2
|
spode@0
|
398 if [ -z $DEVICE ]; then
|
hacker@12
|
399 ask_for_device
|
hacker@12
|
400 check_for_device
|
hacker@12
|
401 else
|
hacker@12
|
402 echo "Device : $DEVICE"
|
spode@0
|
403 fi
|
spode@0
|
404 mkfs_ext3
|
spode@0
|
405 echo "==============================================================================="
|
spode@9
|
406 echo "Device $label ($DEVICE) is ready to use as LiveUSB and/or /home partition."
|
spode@0
|
407 echo ""
|
spode@0
|
408 ;;
|
spode@0
|
409 gen-liveusb)
|
spode@0
|
410 # Generate a LiveUSB media using files from a LiveCD.
|
spode@0
|
411 check_root
|
spode@0
|
412 echo ""
|
spode@0
|
413 echo -e "\033[1mGen a LiveUSB media\033[0m"
|
spode@0
|
414 echo "==============================================================================="
|
spode@0
|
415 DEVICE=$2
|
spode@0
|
416 if [ -z $DEVICE ]; then
|
hacker@12
|
417 ask_for_device
|
spode@0
|
418 fi
|
spode@0
|
419
|
spode@0
|
420 check_for_device
|
pankso@11
|
421 mount_cdrom
|
spode@0
|
422 get_part_info
|
spode@0
|
423 unmount_target_usb
|
spode@0
|
424 install_mbr
|
spode@0
|
425 set_bootable
|
spode@0
|
426 mount_target_usb
|
spode@0
|
427 copy_cdrom_files
|
spode@0
|
428 install_boot
|
spode@0
|
429 exit_or_reboot
|
spode@0
|
430 ;;
|
pankso@13
|
431 gen-swap)
|
pankso@13
|
432 check_root
|
pankso@13
|
433 gen_swap_file
|
pankso@13
|
434 ;;
|
spode@0
|
435 usage|*)
|
spode@0
|
436 # Display usage by default.
|
spode@0
|
437 usage
|
spode@0
|
438 ;;
|
spode@0
|
439 esac
|
spode@0
|
440
|
spode@0
|
441 exit 0
|