How to configure, boot, and upgrade Raspbmc on a USB key/hard-drive

How to configure, boot, and upgrade Raspbmc on a USB key/hard-drive.

So first, some explanations

Once you’ve imaged your SD card with the Rpi installer, you end up with 3 partitions :

  • One vfat sized 63 MB
  • One swap partiton sized 122MB
  • One Ext4 partition that fits the remaining space of your SD card.

The vfat (or FAT32 ) partition contains the bootstrap files, firmware, kernel and boot arguments. It HAS to stay on the SD card. This is due to the hardware of the Pi and the fact that we’re bootstrapping from a GPU. This one stays where it is.

The Swap space is used by Unix-like systems to cache unused RAM data when this last one gets full. It is recommended to be twice the size of you ram when less than 1GB.
Since we’re moving to a large HD, we can enlarge the original 122 MB one to reach 256MB
This one will move to HD.

The Ext4 partition contains the debian system files that serve as a software base for xbmc to run. This one is moving too.

Separate Home folder

Raspbmc being at alpha stage, it means that you might have to go through the process of re-imaging your SD card, and recreating your filesystems a lot.

We could set up our filesystem so that when you’ll upgrade you system files, all your media files, but more important, all your settings would survive an update or re-imaging.

For this, we’ll have to create another partition that will hold your personal ‘Home’ folder.

Some stuff you need to know

The raspbmc image default id infos are :

login : pi
pasword: raspberry

These commands should be run from your default user location. To make sure you’re there :

pi@raspbmc: ~$ cd ~

Most of the commands described here need the ‘sudo’ prefix in order to work !
If you get a ‘permission denied’ or ‘command not found’ error message, it is likely that you forgot the ‘sudo’ prefix.

Let’s go

What you need

  • A Raspberry Pi (duh)
  • A SD Card with Raspbmc set up
  • A USB Hard drive with an external PU ( or USB key )

IMPORTANT : The steps described here will DESTROY the data that resides on your hard drive ! Make sure to backup everything important.

An important step is to disable udevd before connecting your USB drive. Udev is the daemon that’s in charge of detecting new devices. It will prevent us from going to a lot of hassle with it trying to mount our new filesystems :

pi@raspbmc:~$ sudo service udev stop

We can also stop xbmc :

pi@raspbmc:~$ sudo initctl stop xbmc

Step 1 : Setup your hard-drive

First, we need to set up your hard drive with the right file system.
Use another computer to SSH into your Rpi, since there is no option to boot on CLI, without XBMC launching for the moment.

Once you ssh’d into you Rpi, you can check your hard-drive is there by listing present devices :

pi@raspbmc:~$  ls /dev/sda

It should issue a line saying ”/dev/sda”. If otherwise, you might want to check your HD is spinning, USB connections, etc. You can also try to increment the last letter in ‘sda’, in the alphabetic order – ie ‘sdb’, ‘sdc’, etc.

Once you made sure /dev/sda is your HD alright, we’re going to partition it this way :

  • A SWAP partition sized 256 MB
  • A root partition sized 8 GB (yeah we’ve got lot of space)
  • A /home partition that will fit the remainder of the disk

Let’s unmount all partitions on sda :

pi@raspbmc:~$  sudo umount /dev/sda*

Using the ‘cfdisk’ utility :

pi@raspbmc:~$  sudo cfdisk -z /dev/sda

You should now see a nice text user interface that lists what’s on your disk right now, with a menu on the bottom of the screen.

– Select ‘New’ then hit return. Choose ‘Primary’, then enter the size of the swap in MB : 256, and choose to place it on the beginning of the disk.
Once you’ve done that, select ‘Type’ in the bottom menu and hit return. You should now see a list of possible types to choose from. This is a numbered list, so to choose SWAP type, we shall enter ’82’, and validate.

– Select the free space with the down arrow key, and do it again, this time with 8000Mb size, and type Linux : ’83’.

– Repeat, with default proposed size.

You should now write down what partitions the different device files refers to, just in case.

It should be :

  • /dev/sda1 == SWAP (256MB)
  • /dev/sda2 == / (8 GB)
  • /dev/sda3 == /home (remainder of the disk)

Once done, you MUST select ‘Write’ in the bottom menu and confirm by answering ‘yes’ to the question that you’ll make sure to read and check.

You’re back at the cli. Now, we have defined our partitions, but the filesystems (fs) were not created yet. That’s what we’re going to do with the mkfs utilies. The swap uses a different utility.

Build the SWAP fs :

pi@raspbmc:~$  sudo mkswap /dev/sda1

Build the Ext4 fs :

pi@raspbmc:~$  sudo mkfs.ext4 /dev/sda2
pi@raspbmc:~$  sudo mkfs.ext4 /dev/sda3

If you get an error message telling you ‘/dev/sdX’ doesn’t exist, you can unplug, then replug your USB drive. Then check that ‘dev/sdX’ is accessible by entering :

pi@raspbmc:~$  ls /dev/sdX

It should be noted that you do not want to see any /dev/sdaX in the ouptut of

pi@raspbmc:~$  df -h

yet. If you do, you have to unmount then by issuing :

pi@raspbmc:~$  sudo umount /dev/sda*

( The wildcard is literal ! )

That’s it for this step. We now have a nice setup hard drive.
To check for this, we can issue the command :

pi@raspbmc:~$ sudo fdisk -l /dev/sda

that should print something like :

Disk /dev/sda: 200.0 GB, 200049647616 bytes
255 heads, 63 sectors/track, 24321 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000baa4f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1           1           12814      524288   82  Linux swap / Solaris
/dev/sda2           12814       13834     8192000   83  Linux
/dev/sda3           13834       24322    84243456   83  Linux

Step 2 : Copy the system files

In order to copy the files from the SD to the USB HD, we’ll have to do some mounting .
We create the directories that will hold our mounts , then mount the corresponding partitions :

pi@raspbmc:~$ sudo mkdir /tmp/sys && sudo mount /dev/sda2 /tmp/sys
pi@raspbmc:~$ sudo mkdir /tmp/home && sudo mount /dev/sda3 /tmp/home

Beware ! These directories will disappear upon reboot, as they are place in the ‘/tmp’ folder.

Should I use ‘dd’ or ‘rsync’ ?

I’ve seen several answers that mentioned the use of ‘dd’ commands to copy your system files. I personally don’t think it’s a good idea, nor the good tool.

I’ll just copy what was said on another thread :

Unless there is a good reason for using ‘dd’, I would recommend using rsync.
‘dd’ copies a disk bit-by-bit, thus it’s very slow, plus it can be very dangerous to play with when you don’t know what you’re doing.

I’ll add that if you want to duplicate a mounted filesystem you’re working off, you have to use the rsync method.

Let’s install that sweet utility :

pi@raspbmc:~$ sudo apt-get install rsync

A. Personal folder and user settings

We’ll begin easy, and copy the user settings on our home, reimaging-proof partition, with rsync first :

pi@raspbmc:~$ sudo rsync -avh /home/pi/ /tmp/home/pi/

We use 3 options here :

-a : archive mode : it will preserve owner,group,permissions,links and devices information, and perform recursively. This is REQUIRED.
-v : Because we want more output of the progress
-h : Because we want human readable output !

Let’s get rid of this one for now :

pi@raspbmc:~$ sudo umount /tmp/home

B. System files

We’ll continue a little harder now .
Since the filesystem we want to copy the files from is running ( your Rpi is on right ?), we’ll have to remount it elsewhere in order to rsync it without falling into a deadly recursive loop.

Plus, we don’t want to rsync what’s in the ‘/home/pi’ folder sinc we just rsynced it :

EDIT : And obviously, we don’t want to rsync the ‘/tmp’ folder, since we’re working there :/
We also can exclude the ‘/boot’ folder, as it won’t be of any use on the HD.

We remount the FS :

pi@raspbmc:~$ sudo mkdir /tmp/sd_sys && sudo mount --bind / /tmp/sd_sys

We rsync, without ‘/home’ , ‘/tmp’, ‘/boot’ contents :

pi@raspbmc:~$ sudo rsync -avh --exclude 'home/pi' --exclude 'tmp/' --exclude 'boot/' /tmp/sd_sys/ /tmp/sys/

This is where you could optionally use the ‘-u’ option, so that when you upgrade the system files from the SD card next time, only files that were modified are updated.

We yet have to recreate the folders we excluded during rsync :

pi@raspbmc:~$ sudo mkdir /tmp/sys/boot /tmp/sys/tmp

You can check all went well by issuing :

pi@raspbmc:~$ df -h /dev/sda2

It should show a use of at least a few hundreds MB.

You can also :

pi@raspbmc:~$ ls -lah /tmp/sys

which should answer something like:

total 89K
drwxr-xr-x 23 root root 4.0K Jun  7 09:15 .
drwxr-xr-x 23 root root 4.0K Jun  7 09:15 ..
drwxr-xr-x  2 root root 4.0K Jun  7 21:38 bin
drwxr-xr-x  2 root root 1.0K Jan  1  1970 boot
drwxr-xr-x 12 root root 3.2K Jan  1  1970 dev
drwxr-xr-x 76 root root 4.0K Jun  8 15:18 etc
drwxr-xr-x  3 root root 4.0K Jun  7 00:45 home
drwxr-xr-x 12 root root 4.0K May 30 03:25 include
drwxr-xr-x 11 root root 4.0K Jun  7 23:18 lib
drwx------  2 root root  16K Jun  7 08:51 lost+found
drwxr-xr-x 10 root root 4.0K Jun  7 00:46 media
drwxr-xr-x  2 root root 4.0K May  7 15:28 mnt
drwxr-xr-x  4 root root 4.0K Jun  7 09:21 opt
dr-xr-xr-x 70 root root    0 Jan  1  1970 proc
drwx------  4 root root 4.0K Jun  7 22:20 root
drwxr-xr-x  2 root root 4.0K Jun  7 00:49 sbin
drwxr-xr-x  4 root root 4.0K Jun  7 00:49 scripts
drwxr-xr-x  2 root root 4.0K Jul 21  2010 selinux
drwxr-xr-x  3 root root 4.0K Jun  7 00:45 srv
drwxr-xr-x 12 root root    0 Jan  1  1970 sys
drwxrwxrwt  6 root root 4.0K Jun  8 15:17 tmp
drwxr-xr-x 10 root root 4.0K Jun  7 00:39 usr
drwxr-xr-x 13 root root 4.0K Jun  7 00:39 var

Yay, we’re done with that !

Step 3 : Setup the new Swap file and System files

In order for Gnu/Linux to find our newly created Swap file and system files, we have to tell him where it is.

For that, we have to declare it in the file ‘/tmp/sys/etc/fstab’.

pi@raspbmc:~$ sudo nano /tmp/sys/etc/fstab

You should have something that looks like :

proc            /proc           proc    defaults         0       0
/dev/mmcblk0p1  /boot           vfat    defaults         0       0
/dev/mmcblk0p2  none            swap    sw               0       0
/dev/mmcblk0p3  /               ext4    defaults,noatime 0       0

Edit the three last lines so that they look like :

proc            /proc    proc    defaults         0       0
/dev/mmcblk0p1  /boot    vfat    defaults         0  0 # SD card bootstrap files
/dev/sda1       none     swap    sw               0  0 # New swap file
/dev/sda2       /        ext4    defaults,noatime 0  0 # New System files
/dev/sda3       /home    ext4    defaults,noatime 0  0 # New User personal folder

Once this done, save by hitting ‘Ctrl’+’O’, then ‘Return’.
You can then quit by hitting ‘Ctrl’+’X’.

You can unmount all these now :

pi@raspbmc:~$ sudo umount /tmp/sys /tmp/home /tmp/sd_sys

You might see an error related to /tmp/home not being mounted. This is of no importance here.
We just want to make sure everything’s unmounted.

Step 4 : Tel the Rpi where to find what

In order for the Rpi to boot on the right partition, we have to tell it in the ‘/boot/cmdline.txt’ file :

pi@raspbmc:~$ sudo nano /boot/cmdline.txt

Edit :

dwc_otg.lpm_enable=0 root=/dev/mmcblk0p3 rootfstype=ext4 rootwait quiet

To look like this:

dwc_otg.lpm_enable=0 root=/dev/sda2 rootfstype=ext4 rootwait quiet

It should be noted here that we’ve modified the ‘root=’ argument, so that it looks for our file system on ‘/dev/sda2’. That’s the partition we set up in Step 1. We could also use another
technic to refer to our partitions by their UUID. Let me know if you’d like to see me describe this here.

Step 5 : Reboot !

Hopefully, if you followed all these steps carefully, after issuing :

pi@raspbmc:~$ sudo reboot

Your Rpi should boot fine, and you should notice some improvements in terms of reactivity.

A new issue of :

pi@raspbmc:~$ df -h

should echo something like:

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             7.7G  826M  6.5G  12% /
tmpfs                  62M     0   62M   0% /lib/init/rw
udev                   10M  168K  9.9M   2% /dev
tmpfs                  62M  4.0K   62M   1% /dev/shm
/dev/sda3              80G  264M   75G   1% /home
/dev/mmcblk0p1         63M  6.0M   58M  10% /boot

You can check that the swap file in use is our new one by issuing

pi@raspbmc:~$ sudo swapon -s

It should answer with :

Filename                Type        Size    Used    Priority
/dev/sda1                               partition    249948    0    -1

What if I want to upgrade Raspbmc ?

If you were in the need to upgrade raspbmc, you’d simply reimage the sd card, that would boot on the system files that are on the SD card. You would then have to reproduce Step 2.A, Step 3 and Step 4.

It should be mentionned that you do not need to do this if you upgrade with a nightly build, as it is my understanding that it will only replace the xbmc binaries in /opt.

You could even use the ‘-u’ option on rsync the first time you copy system files. That way, only the files that were modified since last rsync gets updated.

I’ve been careful not to let any typo or mistake slip in but you always forget some. Be sure to let me know if you find one, or have any suggestions/remarks.
Should also mention english is not my native language, hence the numerous mistakes and bad grammar.

Hope it’s useful !

Modified post from this source.

Print Friendly
  • John O’Brien

    great step by step tutorial…. used it to switch raspbian to a USB HDD, raspbian sets up a swap file on /var/swap…. suppose i should get rid of that…. SD cards have a finite lifespan and i’d rather have the read only boot stuff on the card and everything else on the drive….

  • Lukasz Soltykowski

    Could you please describe UUID method as well?

  • Timme

    Hi Thank you for the Tutorial
    I’d really like to know the UUID method as well

  • Mark_in_Hollywood

    Love the Tutorial. One question: the cfdisk does not allow me to setup the 8000 partition, saying “No primary partitions are marked bootable. DOS MBR cannot boot this. — Create new partition from free space” and no other partition brings a “Type” option. I’m cutting and pasting from this page.

  • Mark_in_Hollywood

    Following along, I saw your work with this comment, “Sam’s Note: Remember, kernel-vfat-latest.tar.gz overwrites cmdline.txt, where you edited– so be sure to chattr +i it – cheers” What does this mean? I use (or used) the nightly since yesterday. Do I need to fix this?

  • dlabaaalle

    Your how-to is a pleasure to follow. Thanks ! :)

  • Pingback: raspberry pi – essentials | brruchstücke()