Difference between revisions of "Install linux on a USB disk"

From Linuxintro
imported>ThorstenStaerk
Line 34: Line 34:
 
  dd if=usbstick.i686-0.0.1.raw of=/dev/sdh
 
  dd if=usbstick.i686-0.0.1.raw of=/dev/sdh
  
= the cloning approach =
+
Hey, stuble must be your middle name. Great post!
The cloning approach is the manual approach where you clone your harddisk to a USB harddisk and then write a bootsector using [[grub]].
 
 
 
== Boot your favorite Linux ==
 
This has been tested with [[SUSE]] [[Linux]] 10.0 and [[Ubuntu]] 7.04.
 
 
 
== Connect the USB disk ==
 
Attach the USB disk and type <tt>[[dmesg]]</tt>. At the end of the messages, you will find something like "Attached SCSI device to /dev/sda". Then you know your USB disk's device name is /dev/sda. In this tutorial, we assume the device name is /dev/sda.
 
 
 
== Partition the USB disk ==
 
[[fdisk]] /dev/sda
 
In this tutorial, we will assume you create a partition /dev/sda1 for your root ( / ) directory.
 
 
 
== Format the USB disk ==
 
[[mkfs]] -t [[ext3]] /dev/sda1
 
 
 
== Clone your system ==
 
Copy over all files from / to your USB disk. See also [[Cloning]].
 
[[mkdir]] -p /mnt/sda1
 
[[mount]] /dev/sda1 /mnt/sda1
 
[[cd]] /
 
[[tar]] -c [[Bash_operators#.24.28.29|$(]][[ls]] -1 [[piping||]] [[grep]] -Ev "[[regex|proc|sys|tmp|media|mnt]]"[[Bash_operators#.24.28.29|)]] [[piping||]] (cd /mnt/sda1; tar -xv)
 
 
 
'''You should know''' that you will need the /dev folder to create the ramdisk later. You can also use tar -cl ('''l'''ocal filesystems only), but that might exclude your /boot partition.
 
 
 
== Make your USB disk bootable ==
 
Here are two possibilities for making the disk bootable, it is not unusual that one fails. Try the uppermost first. We assume your USB disk is drive ''/dev/sdx'' mounted to ''/mnt/sdx''.
 
 
 
=== Possibility (1) ===
 
$ [[cp -pr]] ''/dev/sdx*'' ''/mnt/sdx1''/dev
 
$ [[cd]] ''/mnt/sdx1''
 
$ [[chroot]] .
 
Now make sure you can access all devices from /boot/grub/device.map.
 
$ mount /proc
 
$ grub-install ''/dev/sdx''
 
$ exit
 
 
 
=== Possibility (2) ===
 
$ grub-install --recheck --root-directory=''/mnt/sdx1'' ''/dev/sdx''
 
Probing devices to guess BIOS drives. This may take a long time.
 
Installation finished. No error reported.
 
This is the contents of the device map /mnt/sda1/boot/grub/device.map.
 
Check if this is correct or not. If any of the lines is incorrect,
 
fix it and re-run the script `grub-install'.
 
 
(fd0)  /dev/fd0
 
(hd0)  /dev/hda
 
(hd1)  /dev/hdb
 
(hd2)  ''/dev/sdx''
 
 
 
=== TroubleShooting ===
 
==== The file /boot/grub/stage1 not read correctly ====
 
* '''Symptome''' is that grub-install fails with the message
 
The file /boot/grub/stage1 not read correctly
 
 
 
* '''Reason''' can be that your partition type is incorrect, e.g. like this:
 
$ fdisk -l
 
 
Disk ''/dev/sdx'': 160.0 GB, 160041885696 bytes
 
255 heads, 63 sectors/track, 19457 cylinders
 
Units = cylinders of 16065 * 512 = 8225280 bytes
 
 
    Device Boot      Start        End      Blocks  Id  System
 
''/dev/sdx1''  *          1      19456  156280288+  '''c  W95 FAT32 (LBA)'''
 
 
* '''Solution''' can be to correct your partition type to 83 (Linux) using [[fdisk]].
 
 
 
== Edit your initial ramdisk ==
 
The initial ramdisk ([[initrd]]) must contain the modules needed to load usb storage. We will use [[mkinitrd]] to rebuild your initial ramdisk. First, change to your system on the USB disk:
 
cd ''/mnt/sdx1''
 
chroot .
 
mount /proc
 
Now have a look at the drivers that are loaded by the initial ramdisk.
 
 
 
=== SUSE ===
 
For [[SUSE]], your drivers file is /etc/sysconfig/kernel.
 
You will find a line starting with INITRD_MODULES= in /etc/sysconfig/kernel. It should look like this:
 
INITRD_MODULES="jbd reiserfs ext3 usbcore usb_storage scsi_mod sd_mod uhci_hcd ehci-hcd sbp2 sr_mod"
 
it can also contain more modules. Verify this line exists, then, create the initial ramdisk:
 
mkinitrd
 
 
 
=== Ubuntu ===
 
For [[Ubuntu]], your drivers file is /etc/modules. It should look at least like this (it can also contain more modules):
 
<pre>
 
# /etc/modules: kernel modules to load at boot time.
 
#
 
# This file contains the names of kernel modules that should be loaded
 
# at boot time, one per line. Lines beginning with "#" are ignored.
 
 
 
fuse
 
lp
 
usb_storage
 
uhci_hcd
 
usbcore
 
usbhid
 
sr_mod
 
sd_mod
 
scsi_mod
 
</pre>
 
After you verified the file exists, create your [[initrd]] with the command:
 
mkinitramfs -o /boot/initrd.img
 
 
 
== Use a unique device name ==
 
If you now boot from your USB disk, it might be that it appears under another name than /dev/sda. To circumvent this problem, we will now use the disk's unique ID instead of /dev/sda. Try
 
[[hwinfo]] --[[partition]]
 
You will get a line similar to the following:
 
  Device Files: ''/dev/sda1'', /dev/disk/by-id/usb-CompanyXXXXXX,_Inc._USB_Mass_Stor
 
age_Device_100-part1, /dev/disk/by-path/pci-0000:00:1d.7-usb-0:3:1.0-scsi-0:0:0:
 
0-part1, ''/dev/disk/by-uuid/84ff6790-9b69-4401-9ba2-43d044af1d30'', /dev/disk/by-la
 
bel/Whatever
 
Now you know your partition is not only accessible via ''/dev/sda1'', but also via ''/dev/disk/by-uuid/84ff6790-9b69-4401-9ba2-43d044af1d30''.
 
 
 
=== /etc/fstab ===
 
You can now edit the [[fstab]] on your USB disk:
 
[[kwrite]] /mnt/sda1/etc/fstab
 
there is one line for the mountpoint '''/''', maybe:   
 
''/dev/sda1''              /              ext2            defaults        1  1
 
In our example, you would change this line to
 
''/dev/disk/by-uuid/84ff6790-9b69-4401-9ba2-43d044af1d30''  /  ext2  defaults  1  1
 
 
 
=== /boot/grub/menu.lst ===
 
In /mnt/sda1/boot/grub/menu.lst, you will find some lines telling the kernel where to find the root (/) file system, maybe:
 
kernel          /boot/vmlinuz-2.6.20-16-generic root=''/dev/sda1'' ro quiet splash
 
not to boot from the wrong partition, you can also replace them:
 
kernel          /boot/vmlinuz-2.6.20-16-generic root=UUID=''84ff6790-9b69-4401-9ba2-43d044af1d30'' ro quiet splash
 
 
 
== Try booting from your disk ==
 
If there are problems, continue with TroubleShooting.
 
 
 
== TroubleShooting ==
 
=== GRUB - nothing else ===
 
* When booting from USB, I get a line saying
 
GRUB
 
nothing else.
 
: This can be a problem with your device map. Keep in mind that, when booting from USB, your USB disk corresponds to (hd0), the first harddisk. grub-install will tell you where its device map is - try correcting it.
 
 
 
=== Error 17 after boot menu ===
 
* After choosing an item from the [[grub]] menu, I get a line saying
 
Error 17: Cannot mount selected partition
 
: most probably, your device order has changed. For example, if you [[installed linux]] from CD and your IDE harddisk was device 0, it may now be device 1 after [[Booting from USB]]. In this case change
 
root (hd''1'',1)
 
to
 
root (hd''0'',1)
 
Please note that ''1'' is simply an example for a partition, it may also be any other number.
 
 
 
=== Error 17 before boot menu ===
 
* Instead of getting the [[grub]] menu, I get a line saying nothing else but
 
Error 17
 
: most probably, your device order has changed and grub searches its menu (stage) on the wrong disk. You will have to do grub-install again.
 
 
 
=== Waiting for /dev/sda to appear ===
 
* After selecting the boot entry in the [[grub]] menu, you get some lines of messages then the [[boot process]] stops with the message
 
Waiting for ''/dev/sda'' to appear
 
: your USB disk is recognized and supported by your [[BIOS]], but your [[initrd]]'s drivers do not recognize it. You will have to edit your initial ramdisk to contain the correct drivers, as discussed under [[initrd]].
 
 
 
=== No bootable partition in table ===
 
* After starting the computer, you get a line saying
 
No bootable partition in table
 
: you do not have a partition that is marked as bootable. Use [[fdisk]]'s "a" command to set the bootable flag of ''/dev/sda1''.
 
 
 
== What comes next ==
 
Now that you can boot from your USB disk, you should be aware that you cannot write very often to a specific sector, so you should make /tmp a [[ramdisk]] like this:
 
mount -t tmpfs tmpfs /tmp -o size=512M
 
 
 
 
 
'''How do you like this site?'''
 
<html>
 
<form action="http://www.linuxintro.org/feedback.php">
 
<textarea name=feedbacktext cols="30" rows="5">
 
</textarea>
 
<button>submit</button>
 
</form>
 
</html>
 
 
 
[[Category:Guides]]
 

Revision as of 05:29, 22 May 2011

Modern computers can boot from USB storage like disks and sticks. This article shows how to install Linux on a USB disk so that you can boot from it. It lists 3 approaches:

approach time to succeed remarks
Unetbootin ? works with all distributions supported by unetbootin
Knoppix 10 min only works with Knoppix
SUSE Studio 1 hour only works with SUSE distros
Cloning-approach 2 hours work with almost all distributions


the unetbootin approach

Download unetbootin from http://unetbootin.sourceforge.net. Start it and select which distribution you want to have installed on what disk.

the knoppix approach

Boot your system from knoppix, then open a console and enter

flash-knoppix

Then select a harddisk or a USB Flash drive. This will be made boot Knoppix.

additional information

Make sure you have a graphical display. This installer will give a lot more messages than the text-based installer.

TroubleShooting

  • Your USB Flash drive must be vfat-formatted. Otherwise, flash-knoppix will not work.

the SUSE Studio approach

Go to www.susestudio.com. Choose your favorite SUSE, add packages as you like. Tell the web site to build a USB stick from it. Download the image and put it onto your USB stick.

For example, if your USB stick is /dev/sdh, use something like

dd if=usbstick.i686-0.0.1.raw of=/dev/sdh

Hey, stuble must be your middle name. Great post!