Difference between symbolic link and hard link
What is the difference between symbolic link and hard link?
Explaining the difference between a symbolic link or a symlink and a hard link is easy and vital to knowing about how Linux/Unix environments work.
Understanding the difference between a symbolic link and a hard link is also important for web server maintenance and understanding how modern websites work.
What is symbolic link or symlink?
Symbolic link, often called symlink or softlink, is very similar to what we know from Windows - a shortcut. They are kind of shortcuts in the Linux/Unix world. Well, symbolic link can exist in the Windows world too, but for the simplicity of our explanation, let’s just work with the comparison that symlink is kind of a shortcut for now. We will get into more details later. Symbolic link contains information about the destination of the target file.
What is hard link?
Hard link (often also called hardlink) is a bit different object when compared to a symlink. Hard link is a directory reference or pointer to a file. Hardlink is a label stored in a directory structure that refers the operating system to the file data when it is accessed. The important part is that hard link is closely tied together with its originating file. If you make changes to a hard link, you automatically make changes to the underlying file that the hardlink is attached to.
Hard link can only refer to data that exists on the same file system.
Many of us are used to Windows where files live in folders. Files in Linux/Unix are not stored in directories. Files in Linux are assigned an inode number which Linux uses to locate files. Each file can have multiple hard links which are located in various directories. A file does not get deleted until there are no remaining hard links to it.
Differences between symbolic link and hard link
Let’s summarize our findings. The list bellow summarizes some differences between symlink and hard link:[list=1]
Hardlink or hardlinks cannot be created for directories (folders). Hard link can only be created for a file.
Symbolic links or symlinks can link to a directory (folder).
Removing the original file that your hard link points to does not remove the hardlink itself; the hardlink still provides the content of the underlying file.
If you remove the hard link or the symlink itself, the original file will stay intact.
[*]Removing the original file does not remove the attached symbolic link or symlink, but without the original file, the symlink is useless (the same concept like Windows shortcut).
In case you are interested getting to know even more details, this list is expanded more on the the Mklink page. The concept is simply that hard links are tied to their sources more rigidly.
What is the difference between symlink and shortcut?
We mentioned that symlinks are like shortcuts. They are like shortcuts but with some small differences. Symbolic links are automatically resolved by the file system. Any software programs, upon accessing a symbolic link, will see the target instead, whether the program is aware of symbolic links or not. On the other hand, shortcuts are treated like ordinary files by the files system and by software programs that are not aware of them. Only software programs that understand shortcuts (such as Windows) treat shortcuts as references to other files. Shortcuts can point to files or directories that exist in another file system or on the network. The difference between symbolic link and shortcut is clearer from the example mentioned at the bottom of this article, respectively as shown in the big print screen on the Mklink page.
How to create a hard link or hardlink?
In Linux, you would use the ln command to create a hard link.
$ ln fileA fileB
where fileA is the original file and fileB is the name you want to give to the hardlink. Let’s do some research now. You have the original file and one hard link that is attached to it. Now, you look at these two objects with the ls command:
$ ls -il fileA fileB
You can see in the output of this command that both files fileA and fileB have the same inode number (the first number on the line). In addition to having the same inode, both files have the same file permissions and the same size. Because that size is reported for the same inode, we can see that a hard link does not occupy any extra space on your space.
If you now remove the original file and open the hard link, you will still be able to see the content of the original file.
Note, hard link cannot be created to a folder. If you try creating a hard link to a folder, you will get “Access denied.”
How to create a symlink?
Let’s demonstrate this with an example. When talking about Linux, you would use the ln command with the -s parameter. You would do something like:
$ ln -s fileA fileB
where fileA is the original file and fileB is the name you want to give to the symbolic link. Now, let’s take a look at these two objects with the ls command again:
$ ls -il fileA fileB
You can see that you get different result as compared to when we displayed the hard link. The first difference between symlink and the original file is the inode number. The inode is different for the original file and for the symbolic link. Next, you can also notice that there is the pipe symbol “l” before the permissions on the symlink line. Also, the symbolic link has different permissions than the original file (because it is just a symbolic link). The content of the symlink is just a string pointing to the original file. The size of the symlink is not the same as the size of the original file. The symbolic link is a separate entity and as such occupies some space on your hard drive. You can see at the end of the line where the symlink points to.
You can access the content of the original file directly by calling the original file or by calling the symbolic link. You will see the same result.
Now if you remove the original file, the symlink will still be there. If you try to access the content of the original file through the symbolic link after removing the original file, you will get a message saying there is no such file or directory.
Can I make a symlink to a hard link?
Yes. The hard link functions the same way like the original file; therefore, you can make symlinks to it. You would use in our example the following command:
$ ln -s fileB fileC
where fileB would be the name of the hard link, and fileC would be the name of your new symlink.