Difference between soft links and hard links in Linux

Soft Link

A soft link (symbolic link or a symlink) makes it possible to associate one file with another. It is similar to a shortcut in MS Windows where the actual file is resident somewhere in the directory structure but you may have multiple shortcuts or pointers with different names pointing to it. This means accessing the file via the actual file name or any of the shortcuts would yield an identical result. Each soft link has a unique inode number.

A soft link can cross file system boundaries and can be used to link directories.

To create a soft link for unix-admin as sys-admin in the same directory, use the ln command with the -s option:

$ cd /home/geek/
$ ln -s unix-admin sys-admin

where:

  • unix-admin is an existing file
  • sys-admin is soft linked to unix-admin

After you have created the link, issue ll with -i option. Notice the letter l as the first character in the second column of the output. Also, notice an arrow pointing from the linked file to the original file. This indicates that sys-admin is merely a pointer to unix-admin. The -i option displays associated inode numbers in the first column.

$ ll -i
3674110 lrwxrwxrwx 1 geek geek 10 Jan 12 11:03 sys-admin -> unix-admin
3674109 -rw-rw-r-- 1 geek geek 0 Jan 12 11:03 unix-admin

If you remove the original file (unix-admin in this example), the link sys-admin will stay but points to something that does not exist.

Hard Link

A hard link associates two or more files with a single inode number. This allows the files to have identical permissions, ownership, timestamp, and file contents. Changes made to any of the files are reflected on the other linked files. All files actually contain identical data.

A hard link cannot cross file system boundaries and cannot be used to link directories.

The following example uses the ln command and creates a hard link for “ubuntu-rocks” file located under /home/geek to “debian-os” in the same directory. Note that “debian-os” file does not exist, but it will be created.

$ cd /home/geek/
$ ln ubuntu-rocks debian-os

After creating the link, run ll with the -i option:

$ ll -i
3674110 -rw-rw-r-- 2 geek geek 40 Jan 12 11:15 debian-os
3674110 -rw-rw-r-- 2 geek geek 40 Jan 12 11:15 ubuntu-rocks

Look at the first and the third columns. The first column indicates that both files have identical inode numbers and the third column tells that each file has two hard links. “ubuntu-rocks”’ points to “debian-os” and vice versa. If you remove the original file (ubuntu-rocks in this example), you will still have access to the data through the linked file debian-os.

Related Post