In Linux, the hard link, in general, is just the same file that the link refers to.
As opposed to the hard link – the symlink is kind of “soft link”.
Let’s check the details but first – a few words about inodes as they are the best way to demonstrate the difference.
This post originally was posted in this blog at 08/13/2013 in Russian.
Contents
The Inode
The simplest way to display the difference is by using the inode – index descriptor.
The inode
is a filesystem object containing information about user and group owning a file, file’s permissions, size, type, timestamps with last file’s access (atime, access time
), its modifications (mtime, modification time
), inode’s itself modifications time (ctime, changing time
), and a counter for hard links to this file.
Each inode object has own unique ID assigned during filesystem creation.
For example, let’s check some file using the ls
utility with the -i
option – this will display us information about inodes used for those files:
[simterm]
# ls -lih | grep file 475949 -rw-r--r-- 1 root setevoy 0B Aug 13 11:51 file1 475950 -rw-r--r-- 1 root setevoy 0B Aug 13 11:51 file2 475951 -rw-r--r-- 1 root setevoy 0B Aug 13 11:51 file3
[/simterm]
- the very first column displays inode’s number per file – 475949.
- the second column give us information about file’s permissions – – -rw-r–r–: owner – read/write, group – read, others – read.
- the third column here is hard links counter – 1.
Next ones are the owner, group, size, mtime
and the file name.
Inodes and the “No Space Left on Device” issue
A bit out of the scope on this post – but related to inodes and their role in filesystems.
Sometimes could happen a “weird” thing: an operating system can report that “No Space Left on Device” – but df
or du
will show you a lot of available free space on a partition.
One of the possible reasons is exactly the lack of inodes: they are created during partition creation and have a limited number.
So when all inodes on a partition will be in use – OS will tell you “No Space Left on Device“.
You always can check available inodes using the df
tool with the -i
option, e.g:
[simterm]
$ df -i /dev/sdb4 Filesystem Inodes IUsed IFree IUse% Mounted on dev 2042653 523 2042130 1% /dev
[/simterm]
Here – I can have maximum 2.042.653 files and/or directories on the /dev/sdb4
partition.
But for now we are interested in the inode’s number and hard links counter in the ls -lih
from the previous topic so let’s go further to see about hard links.
The Hard link
So – what is the “hard link”?
In fact – that’s the same file just with another name.
Let’s create a new hard link with the ln
tool.
It’s syntax is:
[simterm]
$ ln destitation_file hard_link
[/simterm]
For example – create a file-link with the hardlink1 name which will point to the already existing file with the file1 name:
[simterm]
$ ln file1 hardlink1
[/simterm]
Now to make sure they are the same filesystem objects – check their inodes. In this current case it is 475949:
[simterm]
$ ls -lih | grep 475949 475949 -rw-r--r-- 2 root setevoy 0B Aug 13 11:51 file1 475949 -rw-r--r-- 2 root setevoy 0B Aug 13 11:51 hardlink1
[/simterm]
So as you see here – we have two files with different names but with the same inode number.
Now let’s add one more hard link and check the hard links counter again:
[simterm]
$ ln file1 hardlink2 $ ls -lih | grep 475949 475949 -rw-r--r-- 3 root setevoy 0B Aug 13 11:51 file1 475949 -rw-r--r-- 3 root setevoy 0B Aug 13 11:51 hardlink1 475949 -rw-r--r-- 3 root setevoy 0B Aug 13 11:51 hardlink2
[/simterm]
Now it is 3 now instead of 2.
It’s even could be better to name this counter as a “file names counter” instead of the “hard links counter” because actually, we have one object just with different names.
The symlink
Now let’s check the symlinks.
You can create symlinks using the same ln
tool with the -s
(symlink) option with the following syntax:
[simterm]
# ln -s file1 symlink1
[/simterm]
Here we created a new (!) filesystem object with the symlink1 name which points to the already existing file file1:
[simterm]
# ls -lih | grep sym 475948 lrwxr-xr-x 1 root setevoy 5B Aug 13 12:02 symlink1 -> file1
[/simterm]
Pay your attention to the l letter at the start of the permissions attributes column – here it is displaying that this file is exactly a symlink to another file and also you can see in its name column – symlink1 -> file1.
Most common attributes which can be displayed by the ls
here are:
-
: simple filed
: directoryl
: symlinks
: socket
Now let’s compare both files inode-numbers:
[simterm]
# ls -li ... 475949 -rw-r--r-- 3 root setevoy 0 Aug 13 11:51 file1 ... 475949 -rw-r--r-- 3 root setevoy 0 Aug 13 11:51 hardlink1 475949 -rw-r--r-- 3 root setevoy 0 Aug 13 11:51 hardlink2 ... 475948 lrwxr-xr-x 1 root setevoy 5 Aug 13 12:02 symlink1 -> file1
[/simterm]
Well – they are different because for the filesystem they are different objects and own has a dedicated set of attributes.
Hard link vs symlink – key differences
And now let’s check some main differences between such filesystem objects and how do they differ in a way to manipulate them.
- a hard link cannot be pointed to a file on another filesystem as an inode can’t belong to the another FS, but with a symlink – this can be done
- if you’ll edit a hard link – both the hard link and a destination file will be changed, but in the case with a symlink – you can change the symlink’s name, attributes or even delete or just “change a direction” to another file without affecting the original file (but keep in mind that exactly editing a symlink will change your origin file – as in fact you’ll edit the linked object)
- you can’t have a hard link to any directory – only to a regular file, check this answer for more details
Removing links
A few more words about deleting links as this can be not always obvious.
When you’ll delete a hard link – the original file will exist until at least 1 hard link to it present on a filesystem, but can “change” its location if the original file was removed and there is still a hard link in another place.
When you’ll delete a file which has a symlink – this symlink just will become broken but will stay on a filesystem as an independent object.
Let’s check with some examples.
Delete the file1, on which the symlink1 object is referenced:
[simterm]
# rm file1
[/simterm]
The symlink itself still present:
[simterm]
# ls -la | grep file1 lrwxr-xr-x 1 root setevoy 5 Aug 13 12:02 symlink1 -> file1
[/simterm]
But the file1 is absent:
[simterm]
# file file1 file1: cannot open `file1' (No such file or directory)
[/simterm]
And the symlink1 is broken now:
[simterm]
# file symlink1 symlink1: broken symbolic link to `file1'
[/simterm]
Hope this helps you get more about filesystems and links.