How to Mount USB Disks on Raspberry Pi

Hard disk dissection by Roberto F.

Hard disk dissection by Roberto F.

I’ve got a Raspberry Pi, and I’ve got an old external hard drive. So what can I do with them? I decided I was going to create a networked shared drive from them, so in this first tutorial, I will show you how to mount the drive on a Linux operating system.  Doing this is easy, but can get a little tricky when you attach and remove drives on the fly.

Linux and Your Drives

The first thing to know about Linux and your drives, or indeed any other piece of hardware, is that Linux will create a file to manage it.  Typically files relating to hardware devices are created under the /dev directory.  So if you connect your drive, Linux will create a new entry here to represent the drive.  This file is special, in that is represents the raw data on the drive itself, so it’s not readily usable. This is the drives block file, as Linux just treats it as containing blocks of data.

Your drive will encode files in a particular way, according to the file-system the drive was formatted with.  For example, the way NTFS (typical of drives formatted under Microsoft Windows) arranges data into files, will differ from the way EXT3 (typical of Linux formatted drives), or even FAT drives.  You’ll need to tell Linux how to interpret the data on the disk, using the corresponding file system.  Doing this allows you to access the data as the files you intend to read and write to.

Linux names these files in an ordered way.  The first drive detected will be called /dev/sda (or /dev/hda) with subsequent disks given subsequent letters (/dev/sdb, /dev/sdc, etc.).  As drives are often divided into several partitions, the partition number is added to the end, so you may end up with multiple entries.  As an example, if I list these devices, you might see something similar to:

gonzales ccollins # ls -al /dev/sd*
brw-rw---- 1 root disk 8,  0 Feb  4 18:42 /dev/sda
brw-rw---- 1 root disk 8,  1 Feb  4 18:42 /dev/sda1
brw-rw---- 1 root disk 8,  2 Feb  4 18:42 /dev/sda2
brw-rw---- 1 root disk 8,  5 Feb  4 18:42 /dev/sda5
brw-rw---- 1 root disk 8, 16 Feb  4 18:42 /dev/sdb
brw-rw---- 1 root disk 8, 17 Feb  4 18:42 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Feb  4 18:42 /dev/sdb2
brw-rw---- 1 root disk 8, 21 Feb  4 18:42 /dev/sdb5
brw-rw---- 1 root disk 8, 32 Feb  4 18:42 /dev/sdc
brw-rw---- 1 root disk 8, 48 Feb  4 18:42 /dev/sdd
brw-rw---- 1 root disk 8, 64 Feb  4 18:46 /dev/sde
brw-rw---- 1 root disk 8, 65 Feb  4 18:46 /dev/sde1
brw-rw---- 1 root disk 8, 69 Feb  4 20:05 /dev/sde5

As you can see, I have several drives connected, some with several partitions.

Step 1 – Connect your drive

The first step in mounting your drive is to connect your drive, and find the block device Linux creates for you.  This can easily be done using the ‘blkid’ utility as root, or use sudo.  Using this I get the following output:

gonzales ccollins # blkid
/dev/sda1: UUID="756dfe8e-1ab6-4933-be98-776e38f97857" TYPE="ext4" 
/dev/sda5: UUID="b1e575f1-ad95-47a9-b0d8-215a15736ed4" TYPE="swap" 
/dev/sdb2: UUID="86B89827B898182F" TYPE="ntfs" 
/dev/sdb5: UUID="CE1E6F081E6EE8C3" TYPE="ntfs" 
/dev/sde5: LABEL="LENOVO_USB_HDD" UUID="BA504FD6504F9851" TYPE="ntfs"

In this case I would like to mount the LENOVO_USB_HDD, so as we go, we will discuss the various options we have.

Step 2 – Create a Mount Point

Linux represents all files under a single directory hierarchy, with the root (/) folder at the top. We will need to let Linux know where we want our drives files to appear on this directory structure. We will create an empty directory as our mount point. This directory can be anywhere in the hierarchy, but typically we use a subdirectory of /media. In my case I created a directory as:

gonzales ccollins # mkdir /media/usbhdd

Step 3 – Edit the fstab file

Now that we know where our block device file lives, and where we want to mount it, we can instruct Linux to mount the drive at that location. This can be done manually each time you want to ‘mount’ and ‘unmount’ the drive as needed, but if you’re doing this frequently, it may be easier to have Linux automate this process for you. This can be done by editing the file system configuration file, /etc/fstab.
As root, open the /etc/fstab file in your favourite editor and add the following line:

/dev/sde5    /media/usbhdd    ntfs    defaults    0    2

The first field here is our block device, the second our mount point, the third shows the file system type to use, the fourth field allows for different ‘mount’ options, the fifth field configures the ‘dump’ command (0 disables this), and finally the sixth field determines in which order the filesystem is checked at boot time (2 here says do it after the boot drive). You can find more information on these fields by checking out the manual (man) pages for fstab and mount.  Save your edits to the /etc/fstab file and exit your editor.

Step 4 – Mount it

Now we can mount the new filesystem by using ‘mount -a’ (as root, or with sudo).  This will mount all file systems listed in the /etc/fstab configuration file.  This step gets automatically done for you at boot time, or when you add the device in future.  So now, you should see your drives files under the mount point directory.

We’re Done? Not Quite!

So the steps outlined so far will work, but can be a little brittle to system changes.  As you add and remove USB drives from your system, Linux won’t guarantee to always create the same block file to represent the same drive.  In our example here, we’re depending on the drive always being available at /dev/sde5.

What would happen if this block file is allocated to a different drive?  What if my drive is given a different block file name, such as /dev/sdf5?  In these cases, the configuration we have specified above may not be suitable, and the files you expect may not appear under the mount point directory.

To fix this, we refer back to Step 1 and the ‘blkid’ utility.  This lists both Universally Unique IDentifiers (UUID) and LABELS which are associated with your drive.  These are specific to your drive, and are guaranteed never to change as you add and remove the drive.  You can use these in the /etc/fstab file to create a more robust mounting mechanism.

We can edit the line we added earlier in the /etc/fstab file to either of the following for the same result:

UUID=756dfe8e-1ab6-4933-be98-776e38f97857    /media/usbhdd    ntfs    defaults    0    2
LABEL=LENOVO_USB_HDD                         /media/usbhdd    ntfs    defaults    0    2

Your UUID and/or label will differ, so use those.  In the first case we’re telling Linux to mount any drive with a corresponding UUID to the mount point.  This will happen regardless of the block file allocated to the drive, so it allows it to change over time.

In the case of a FAT file system drive, such as a thumb drive, you may not have a UUID allocated, so the LABEL directive might suit you better.  The same configuration applies, with Linux mounting any drive with the same label to the mount point, again regardless of the block device allocated.

Further Reading

What I have described here only touches the surface to the configuration options available to you when you add drives to Linux.  I would recommend reading the manual pages for fstab and mount as they work together to enable easier configuration of how your drives files are mounted, which users should be able to mount drives, and what the default permissions for mounted files are going to be.  These are options which you can specify in the fstab file and which are passed to mount when the drive is being added.

About these ads

4 thoughts on “How to Mount USB Disks on Raspberry Pi

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s