ComputersGeneralLinux

Adding a USB external disk drive as permanent drive in Linux

This mini-tutorial goes through the steps needed to add a USB external disk drive as a permanent disk on a Linux computer.

This is something that I did recently on my home server computer. It already has two internal disk drives, but due to the size of my photo and video collection needed some more storage. I therefore added a 250GB external disk drive that I had available and moved my photo files onto that disk instead.

These steps were all performed on Ubuntu 9.10 Karmic Koala Linux distribution. These are all standard Linux commands so should work whatever your distribution. If you distribution does not have cfdisk by default then you can use fdisk, but it is much easier to use cfdisk if that is available.

Always make sure you have a backup of all data before starting this process. This is a destructive process and it is essential you have a backup in case of problems.

Trust me the backup is really important. I know from personal experience. Even when you know what you are doing it is easy to make a mistake and lose data. You have been warned.

Note that during this tutorial I have removed some superfluous entries from the command output to shorten this and to only show the important information.

Before install external disk

The following commands show the state of the system before the install. The internal disks have drive letters reflecting their install on the internal IDE system. Drive sda is the first drive and sdb is the second. The root file system / is on disk sda5, this is the first logical partition as when originally installed the first partition was used by Windows. Windows has since been removed and I now have a physical partition spare on the first hard disk, but that is no big enough for the amount of storage I need. For the purposes of this sda1 is ignored.

Note that I’ve already moved /data/music onto the second internal drive, so that is under /dev/sdb1 and the home directory is under /dev/sdb1. It’s not quite so easy with an external drive as the drive name can change so we are going to use the UUID when we actually configure the hard disk drive to mount in fstab, this is the way that Ubuntu configures the internal drives as well which makes sense as it means that on a server with swappable disk drives it may mean that the dev letters change, but the UUID is always unique to the disk.

We can see the existing files with the mount command.

$ mount

/dev/sda5 on / type ext3 (rw,relatime,errors=remount-ro)
/dev/sdb1 on /data/music type ext3 (rw,relatime)
/dev/sdb2 on /home type ext3 (rw,relatime)

We can see the disk space in use using the df command.

$ df

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda5             19307400  15075600   3251036  83% /
/dev/sdb1             38448276  25272824  11222352  70% /data/music
/dev/sdb2             40330060  33747364   4534008  89% /home

When we connect the external device it is detected and mounted. The additional entry on the mount command is shown below:

/dev/sdc1 on /media/6048-2458 type vfat (rw,nosuid,nodev,uhelper=devkit,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,flush)

Note that in this case we are going to completely remove the data on this drive and replace it with the ext3 filesystem. The ext3 filesystem type will have better support for file permissions, but if there is a requirement to access the disk from another operating system (such as Windows) then vfat may be a better choice.

First unmount the disk – close any file browser window that may have automatically opened and then

sudo umount /dev/sdc1

This could also be done using /media/6048-2458, but I will be using the sdc1 later on. Make sure that you use the correct device name as listed in the mount command.

If the disk was not mounted then you need to find another way of identifying the disk label. This is best done using

sudo -f /var/log/syslog


Dec 28 15:20:03 linuxserver1 kernel: [ 6068.364445] scsi6 : SCSI emulation for USB Mass Storage devices
Dec 28 15:20:03 linuxserver1 kernel: [ 6068.364626] usb-storage: device found at 11
...
Dec 28 15:20:08 linuxserver1 kernel: [ 6073.424555]  sdc: sdc1

Note that this indicates it has found disk sdc (/dev/sdc) with a partition /dev/sdc1.

Now edit the partition of the existing disk using cfdisk. This is not needed if you are keepin the same partition type, but in this case we are changing from vfat to ext3.

sudo cfdisk /dev/sdc

Note that this used /dev/sdc. I have dropped the last digit which refers to the partition – sdc refers to the entire disk.

                       cfdisk (util-linux-ng 2.16)

                              Disk Drive: /dev/sdc
                       Size: 250059350016 bytes, 250.0 GB
             Heads: 255   Sectors per Track: 63   Cylinders: 30401

    Name        Flags      Part Type  FS Type          [Label]        Size (MB)
 ------------------------------------------------------------------------------
    sdc1        Boot        Primary   W95 FAT32                       250056.74



     [ Bootable ]  [  Delete  ]  [   Help   ]  [ Maximize ]  [  Print   ]
     [   Quit   ]  [   Type   ]  [  Units   ]  [  Write   ]

                 Toggle bootable flag of the current partition

At the moment it shows a single FAT32 partition. This can be deleted and then a new file system created using the new command. I selected primary which is fine if you only want a single partition (or even up to 4). The default partition size is the entire disk so accept that.

                          cfdisk (util-linux-ng 2.16)

                              Disk Drive: /dev/sdc
                       Size: 250059350016 bytes, 250.0 GB
             Heads: 255   Sectors per Track: 63   Cylinders: 30401

    Name        Flags      Part Type  FS Type          [Label]        Size (MB)
 ------------------------------------------------------------------------------
    sdc1                    Primary   Linux                           250056.74



     [ Bootable ]  [  Delete  ]  [   Help   ]  [ Maximize ]  [  Print   ]
     [   Quit   ]  [   Type   ]  [  Units   ]  [  Write   ]

                 Toggle bootable flag of the current partition

As you can see this shows as file type Linux (which is what we want for ext 3) and it has been given the name sdc1.

Then choose write to update the disk. It will ask for confirmation before you lose all the data that is on the disk.

This has not actually formatted the disk it has just set the partition to the correct type.

Now format the disk with the mkfs command. The easiest way is
sudo mkfs.ext3 /dev/sdc1

Note this command will delete all data on the partition without asking for confirmation first. Do not copy and paste this code, instead type it manually, double check what the drive letter and partition is and only then should you press enter.

It will take a short while to create the file system then it should finish with the following (or something similar).

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Next create a directory where the disk will be mounted (known as a mount point). Note that unlike some other operating systems the disk does not get a letter, but instead can be integrated anywhere into the filesystem. In this case I already have a data directory and I am creating the folder /data/photos (previous contents have already been moved elsewhere).

sudo mkdir /data/photos

Linux uses the concept of file and group owner for files and directories. If you are not familiar with this then read Linux Tutorial on file access permissions, before proceeding.

If the disk you were mounting was fat32 then this is where you set permissions for the entire drive, but for a linux filesystem you need to change the permissions once mounted, although there is no hard in changing permissions of the mount point to the normal user that owns the file system.

sudo chown stewart:stewart /data/photos

You could now mount the filesystem using the mount command, but my preferred way is to edit /etc/fstab as this is where we will be permanently mounting it from and we can test the configuration of the fstab this way.

Before we update the fstab we need to identify the UUID for the disk. As previously mentioned we cannot guarantee it will always be called /dev/sdc1 and if the wrong disk was mounted in the wrong place it could have undesired results.

The UUID can be found using the blkid command.

sudo blkid

/dev/sdc1: UUID="a3fc2846-9ed3-4a38-9f79-35a7cb57b2c1" SEC_TYPE="ext2" TYPE="ext3"

Note that the SEC_TYPE shows ext3 and the TYPE shows ext3. This is due to the way that ext3 is just a journalled ext2, but you can ignore that for now. As long as the device name matches you can just copy the UUID.

The UUID is now entered into the fstab file

sudo vi /etc/fstabUUID=a3fc2846-9ed3-4a38-9f79-35a7cb57b2c1 /data/photos ext3 defaults,relatime 0 0

The disk can now be mounted using

sudo mount -a

The -a option means that it will attempt to mount all filesystems listed in fstab. You can check that this was mounted correctly with the mount command without any options.

/dev/sdc1 on /data/photos type ext3 (rw,relatime)

Note that although we used the UUID in the fstab file the mount command show it as /dev/sdc1.

You can also check that the disk that is mounted has the correct space etc using the df command (I’ve used the -m option to show it in MB).

Filesystem           1M-blocks      Used Available Use% Mounted on
/dev/sdc1               234730       188    222619   1% /data/photos

The only file / directory that should show in the /data/photos directory is the Lost+Found directory which is an indication that there is a disk mounted at this point.

drwx------ 2 root root 16384 2009-12-28 15:30 lost+found

The directory file permissions should now be set as appropriate

sudo chown stewart:stewart /data/photos/

At this point it is done. The disk is mounted and it is setup to mount back to the same point when the system is next rebooted. It may however be a good idea to reboot the system at this point. Although this is not neccessary it will act as an additional check to see if you’ve made any mistakes.

sudo shutdown -r now

Assuming all is well from the reboot you can now use this as a part of the normal system. Use either your preferred file manager or the cp command to copy your data onto the new drive and then use as normal.