soft links and hard links in Solaris

A link is a pointer to another file or directory. Links provide a mechanism for multiple file names to reference the same data on disk.

In Solaris, there are two types of links:

  • Soft (symbolic) links
  • Hard links

Soft (symbolic) links

Sometimes symbolic links are used for shortcuts; other times we use them to link to a filename from each user's home directory to a centralized location or file.

For example, perhaps we want to have a common directory named documents where every user stores their documents. This directory exists as /export/data/documents. In each user's directory, we create a link named documents that points to /export/data/documents.

As a user, whenever I store something in the directory named $HOME/documents, the file actually gets directed to /export/data/documents. We can identify links when we perform a long listing on a directory as follows:

Note: Notice the use of the -i option used with the ls command and the results displayed. This option is used to display the inode number (in the left column of the output) that has been assigned to each file and directory. I'll describe why this inode number is relevant to links later in this section when I describe hard links.

$ ls -li $HOME
75264 drwxr--r--   2 mchurchi staff  512 Jun  6 20:36 dir1
78848 drwxrwxr-x   2 mchurchi staff  512 Jun  6 20:38 dir2
82432 drw-r--r--   2 mchurchi staff  512 Jun  6 20:39 dir3
3593 lrwxrwxrwx    1 mchurchi staff   22 Jun 17 17:09 documents -> /export/data/documents
   :
   :

Notice the file that has an l as the first character of column 2 indicates this is a soft or symbolic link. The sixth field shows a file size of 22 bytes and the last field shows which file or directory this link is pointing to. Each file has a unique inode number identified in column 1; the importance of this column is discussed later in this chapter.

When storing a file in $HOME/documents, the system is redirecting it to be stored in /export/data/documents. Now when changing to the /export/data/documents directory and issuing the ls -li command:

$ cd /export/data/documents
$ ls -li
125461   drwxr-xr-x   2 root     other    512 Jun 17 17:09 documents

Notice that the file that has a d as the first character of column 2. This is the directory that the $HOME/documents link points to. The first column shows the inode number, and the sixth column shows the file size as 512 bytes.

Symbolic links can point to files anywhere on the network. The file or directory could exist in another file system, on another disk, or on another system on the network.

The syntax for creating a symbolic link is as follows:

ln -s <source-file> <link-name>

For example, you might have a file named file1 that has the following contents:

This is the contents of file1

To create a symbolic link named link1, which will be linked to the existing file named file1, you issue the following command:

$ ln -s file1 link1

Now when you list the contents of the directory you see two files:

3588 -rw-r--r--   1 mchurchi staff         30 Jun 17 17:51 file1
3594 lrwxrwxrwx   1 mchurchi staff          5 Jun 17 18:09 link1 -> file1

See the link named link1 pointing to file1? If you display the contents of link1, it shows the following:

$ cat link1
This is the contents of file1

If you remove file1, the source file, link1 will still exist, but it points to a file that does not exist and you get the error:

$ cat link1
cat: Cannot open link1

When you re-create file1, link1 will contain data again.

Hard links

A hard link is more difficult to determine, because they are not so obvious when viewed with the ls -li command. For example, when you go to the /etc/rc2.d directory and type:

$ ls -li
total 102
   :
   :
2123 -rwxr--r--   5 root     sys         1718 Jan 21  2005 S47pppd
2102 -rwxr--r--   2 root     sys          327 Jan 21  2005 S70uucp
1368 -rwxr-xr-x   2 root     other       1558 Jan  9  2005 S72autoinstall
 241 -rwxr--r--   2 root     sys         1262 Jan 21  2005 S73cachefs.daemon
1315 -rwxr--r--   2 root     sys         1028 Jan 21  2005 S81dodatadm.udaplt
 237 -rwxr--r--   2 root     sys          256 Jan 21  2005 S89PRESERVE
2103 lrwxrwxrwx   1 root     root          31 Aug 10 09:49 S89bdconfig ->\
../init.d/buttons_n_dials-setup
1898 -rwxr--r--   5 root     sys         3506 Jan 10  2005 S90wbem
2100 -rwxr--r--   5 root     sys         1250 Jan 10  2005 S90webconsole
   :
   :

The first character in the second column of information displays the file type as a regular file (-). The third column, link count, shows a number greater than 1. It displays the number of links used by this inode number. These are hard links, but they are not identified as links and the display does not show which file they are linked to.

Think of a hard link as a file that has many names. In other words, they all share the same inode number. Looking at the file named S90wbem in the previous listing, we see an inode number of 1898. List all file names in this file system that share this inode number as follows:

# find / -mount -inum 1898 -ls
1898  4 -rwxr--r--   5 root   sys    3506 Jan 10  2005 /etc/init.d/init.wbem
1898  4 -rwxr--r--   5 root   sys    3506 Jan 10  2005 /etc/rc0.d/K36wbem
1898  4 -rwxr--r--   5 root   sys    3506 Jan 10  2005 /etc/rc1.d/K36wbem
1898  4 -rwxr--r--   5 root   sys    3506 Jan 10  2005 /etc/rc2.d/S90wbem
1898  4 -rwxr--r--   5 root   sys    3506 Jan 10  2005 /etc/rcS.d/K36wbem

All six of these files have the same inode number; therefore, they are the same file. You can delete any one of the filenames, and the data will still exist.

In this example, the file is named file1 in $HOME:

$ ls -l file1
3588 -rw-r--r--   3 mchurchi staff         30 Jun 17 17:51 file1
$ cat file1
This is the contents of file1

The syntax for creating a hard link is as follows:

ln <source-file> <link-name>

To create a hard link named link1, which will be linked to the existing file named file1, issue the following command:

$ ln file1 link1

Now when I list the contents of the directory, I see two files:

3588 -rw-r--r--   2 mchurchi staff         30 Jun 17 17:51 file1
3588 -rw-r--r--   2 mchurchi staff         30 Jun 17 17:51 link1

Both files share the same inode number, the number of links is two, and the file size is 30 bytes. If I display the contents of link1, it shows the following:

$ cat link1
This is the content of file1

If I remove file1, the source file, link1 still exists and still contains the data. The data will not be deleted until I destroy the last file that shares this inode number.

A hard link cannot span file systems; it can only point to another file located within its file system. The reason is that hard links all share an inode number. Each file system has its own set of inode numbers; therefore, a file with inode number 3588 in the /export/home file system may not even exist in the /var file system.

An advantage of a symbolic link over a hard link is that you can create a symbolic link to a file that does not yet exist. You cannot create a hard link unless the source file already exists. Here's what happens when you create a symbolic link to a file that does not exist:

Removing a Link

Remove a link using the rm command as follows:

rm <linkname>

For example, to remove the link named link1, type

$ rm link1

Note: Removing Files and Links When you remove a file, it's always a good idea to remove the symbolic links that pointed to that file, unless you plan to use them again if the file gets re-created.

Another advantage of symbolic links over hard links is that a symbolic link can link directories or files, whereas a hard link can link only files.