The chief difference between defining a mount in `fstab` versus `autofs`
is that the kernel dedicates resources to keep `fstab` mounts in place
all the time. Conversely, `autofs` mounts are "on-demand" and are better
suited for NFS or DVD drives.
Understanding the `fstab`
-------------------------
Here's a sample `fstab`:
# Sample fstab
# default = rw, suid, dev, exec, auto, nouser, and async
# Device Mount Point FS Type Options Dump? fsck
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
| Column | What it is |
|--------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Device** | Name of the block device (like `/dev/sdc1`, etc.) You can also use `LABEL=` or `UUID=` |
| **Mount Point** | Where to mount the device |
| **FS (FileSystem) Type** | Can be `ext2`, `ext3`, `reiserfs`, `vfat` and `swap` (many others depending upon kernel support.) The interesting one is `auto`, whereby the kernel attempts to detect the filesystem automagically. This is good for CD/DVD-ROMs and (gasp!) floppies. Use an actual FStype for all others |
| **Options** | For a much more comprehensive list of options, see `man mount`. Here are some common ones:
| |`auto`/`noauto` - Mount/do not mount at boot
| |`user`/`nouser` - Should normal users be able to mount? If so, use **user**. Else, it's **nouser**
| |`exec`/`noexec` - Execute binaries off the device? **noexec** off a Linux root partition might be unpleasant...
| |`ro` - Mount as read-only
| |`rw` - Mount as read/write
| |`sync`/`nosync` - Changes to device are done synchronously with **sync** (written at the same time the command is issued). Good for USB sticks and (gasp!) floppies. **nosync** may be preferable for HDD performance. |
| **Dump** | This is a small backup utility. Set to `0` almost all the time. |
| **fstab** | Determine the order in which to check filesystems on devices. `0` will cause it to ignore it. |
Using better device identifiers
-------------------------------
Given that the device names might change due to myriad factors (e.g.
plug HDD into a different USB or SATA port), it's a better idea to use
the device label or, even better, the device's UUID. I'm going to deal
with UUIDs in this example.
### Figure out the device's UUID
UNIX-like simplicity itself.
[user@example ~]# ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 user user 10 Jun 25 11:00 43b64bd4-ee2b-4e4d-b2af-e868cb47d596 -> ../../sda1
lrwxrwxrwx 1 user user 10 Jun 25 11:00 7c488bee-a567-4432-bdbe-c30e9d33a927 -> ../../sdb5
lrwxrwxrwx 1 user user 10 Jun 25 11:00 c1e9157e-6572-4ec1-b1d0-8adb97052a59 -> ../../sdd1
lrwxrwxrwx 1 user user 10 Jun 28 10:25 edabbb0e-d87a-4c5b-a9aa-492e553c98d1 -> ../../sdc5
You can see what each device is using `fdisk -l /dev/sdc5` or, since you
know the UUID:
[user@example ~]# fdisk -l /dev/disk/by-uuid/edabbb0e-d87a-4c5b-a9aa-492e553c98d1
Disk /dev/disk/by-uuid/edabbb0e-d87a-4c5b-a9aa-492e553c98d1: 1000.2 GB, 1000202208768 bytes
255 heads, 63 sectors/track, 121600 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
### Create the `fstab` entry
UUID=edabbb0e-d87a-4c5b-a9aa-492e553c98d1 /media/usbdrive ext3 defaults 0 0
Et voila!
### Problems with this approach
You might see a "**special device
UUID=edabbb0e-d87a-4c5b-a9aa-492e553c98d1 does not exist**" when you
reboot your system, especially when dealing with external drives. Some
people report that specifying the full path helps (e.g.
`UUID=/dev/disk/by-uuid/...`) but I haven't had any luck with this.
Essentially, and to keep things simple, you could still keep the `fstab`
entry and issue a `mount -a` to mount all the devices you've specified
*after* booting up. While there's really no 'fix' to this AFAIK (even
using `LABEL=` doesn't help), you could alternately add a quick line to
`/etc/rc.local`.
echo -e "Waiting for external drives to mount..." && sleep 30 && echo -e "Done waiting."
This *has* worked for me, even though I see the "special device" error
at startup.
Miscellaneous
-------------
* `blkid` is another way to figure out UUIDs.
[user@example ~]# blkid
/dev/mapper/VolGroup00-LogVol01: TYPE="swap"
/dev/mapper/VolGroup00-LogVol00: UUID="5aafa32b-d5c0-40a7-9a6a-417b8a9c7832" TYPE="ext3"
/dev/sda1: LABEL="/boot" UUID="43b64bd4-ee2b-4e4d-b2af-e868cb47d596" TYPE="ext3"
/dev/hda: LABEL="CentOS_5.3_Final" TYPE="iso9660"
/dev/VolGroup00/LogVol00: UUID="5aafa32b-d5c0-40a7-9a6a-417b8a9c7832" TYPE="ext3"
/dev/VolGroup00/LogVol01: TYPE="swap"
/dev/sdc5: UUID="edabbb0e-d87a-4c5b-a9aa-492e553c98d1" TYPE="ext3" SEC_TYPE="ext2"
/dev/sdb5: LABEL="/rsync_drive_3" UUID="7c488bee-a567-4432-bdbe-c30e9d33a927" TYPE="ext3"
/dev/sdd1: UUID="c1e9157e-6572-4ec1-b1d0-8adb97052a59" TYPE="ext3"
* To see the changes you've made to `fstab` without rebooting your
system, use `mount -a`
* Samba shares with spaces in them can get a little tricky. I've tried
single, double quotes with no success. Octal representation of a
space (`\040`) seemed to work :) Here's an example:
//19.67.18.160/Lab\040Documents /media/secretary cifs rw,credentials=/media/secretary.credentials 0 0
I've stored the credentials for the connection in the file
`/media/secretary.credentials`. It has `600` permissions and looks like
this:
username=nikhil
password=OMG_FLUFFY_PUPPIES