Unix provides two different kinds of links:
Actually, every directory has at least two names. See the last section of this article.
You obviously can't do without copies of files: copies are important whenever users need their own "private version" of some master file. However, links are equally useful. With links, there's only one set of data and many different names that can access it. Section 10.5 shows how to make links.
With a hard link, the two filenames are identical in every way. You can delete one without harming the other. The system deletes the directory entry for one filename and leaves the data blocks (which are shared) untouched. The only thing rm does to the inode is decrement its "link count," which (as the name implies) counts the number of hard links to the file. The data blocks are only deleted when the link count goes to zero -- meaning that there are no more directory entries that point to this inode. Section 9.24 shows how to find the hard links to a file.
With a symbolic link, the two filenames are really not the same. Deleting the link with rm leaves the original file untouched, which is what you'd expect. But deleting or renaming the original file removes both the filename and the data. You are left with a link that doesn't point anywhere. Remember that the link itself doesn't have any data associated with it. Despite this disadvantage, you rarely see hard links on Unix versions that support symbolic links. Symbolic links are so much more versatile that they have become omnipresent.
Let's finish by taking a look at the ls listing for a directory. This directory has a file named file with another hard link to it named hardlink. There's also a symlink to file named (are you ready?) symlink:
$ ls -lai total 8 140330 drwxr-xr-x 2 jerry ora 1024 Aug 18 10:11 . 85523 drwxr-xr-x 4 jerry ora 1024 Aug 18 10:47 .. 140331 -rw-r--r-- 2 jerry ora 2764 Aug 18 10:11 file 140331 -rw-r--r-- 2 jerry ora 2764 Aug 18 10:11 hardlink 140332 lrwxrwxrwx 1 jerry ora 4 Aug 18 10:12 symlink -> file
You've seen ls's -l option(Section 50.2) and, probably, the -a option (Section 8.9) for listing "dot files." The -i option lists the i-number (Section 14.2) for each entry in the directory; see the first column. The third column has the link count: this is the number of hard links to the file.
When you compare the entries for file and hardlink, you'll see that they have a link count of 2. In this case, both links are in the same directory. Every other entry (i-number, size, owner, etc.) for file and hardlink is the same; that's because they both refer to exactly the same file, with two links (names).
A symbolic link has an l at the start of the permissions field. Its i-number isn't the same as the file to which it points because a symbolic link takes a separate inode; so, it also takes disk space (which an extra hard link doesn't). The name has two parts: the name of the link (here, symlink) followed by an arrow and the name to which the link points (in this case, file). The symlink takes just four characters, which is exactly enough to store the pathname (file) to which the link points.
While we're at it, here's a section that isn't about linking to files or making symbolic links. Let's look at the first two entries in the previous sample directory in terms of links and link counts. This should help to tie the filesystem together (both literally and in your mind!).
You've seen . and .. in pathnames (Section 1.16); you might also have read an explanation of what's in a directory (Section 10.2). The . entry is a link to the current directory; notice that its link count is 2. Where's the other link? It's in the parent directory:
$ ls -li .. total 2 140330 drwxr-xr-x 2 jerry ora 1024 Aug 18 10:11 sub 85524 drwxr-xr-x 2 jerry ora 1024 Aug 18 10:47 sub2
Look at the i-numbers for the entries in the parent directory. Which entry is for our current directory? The entry for sub has the i-number 140330, and so does the . listing in the current directory. So the current directory is named sub. Now you should be able see why every directory has at least two links. One link, named ., is to the directory itself. The other link, in its parent, gives the directory its name.
Every directory has a .. entry, which is a link to its parent directory. If you look back at the listing of our current directory, you can see that the parent directory has four links. Where are they?
When a directory has subdirectories, it will also have a hard link named .. in each subdirectory. You can see earlier, in the output from ls -li .., that the parent directory has two subdirectories: sub and sub2. That's two of the four links. The other two links are the . entry in the parent directory and the entry for the parent directory (which is named test in its parent directory):
-d Section 8.5
% ls -dli ../. ../../test 85523 drwxr-xr-x 4 jerry ora 1024 Aug 18 10:47 ../. 85523 drwxr-xr-x 4 jerry ora 1024 Aug 18 10:47 ../../test
As they should, all the links have the same i-number: 85523. Make sense? This concept can be a little abstract and hard to follow at first. Understanding it will help you, though -- especially if you're a system administrator who has to understand fsck's output because it can't fix something automatically or use strong medicine like clri. For more practice, make a subdirectory and experiment in it the way shown in this article.
--JP and ML
Copyright © 2003 O'Reilly & Associates. All rights reserved.