Thanks to some good Q&A around here and this page, I now understand links. I see hard links refer the same inode by a different name, and copies are different nodes, with different names. Plus soft links have the original file name and path as their inode, so if the file is moved, the link breaks.So, I tested what I've learnt with some file (saluton_mondo.cpp below), made a hard and a soft link and a copy.jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp-rw-rw-r-- 1 jmcf125 jmcf125 205 Ag 27 16:10 copy-rw-rw-r-- 2 jmcf125 jmcf125 205 Ag 25 13:34 hard-rw-rw-r-- 2 jmcf125 jmcf125 205 Ag 25 13:34 saluton_mondo.cpplrwxrwxrwx 1 jmcf125 jmcf125  17 Ag 27 16:09 soft -> saluton_mondo.cppI found awkward that the hard link, however, has the same size as the original and, logically, the copy. If the hard link and the original share the same inode, that has the data, and only differ by the filename, shouldn't the hard link take only the space of its name, instead of 205 bytes? Or is that the size of the original file that ls -lh returns? But then how can I know what space does the filename take? Here it says hard links have no size. Is their file name kept alongside the original file name? Where is the file name of hard links stored?
Why do hard links seem to take the same space as the originals?
linux;symlink;hard link;copy
A file is an inode with meta data among which a list of pointers to where to find the data.In order to be able to access a file, you have to link it to a directory (think of directories as phone directories, not folders), that is add one or more entries to one of more directories to associate a name with that file.All those links, those file names point to the same file. There's not one that is the original and the other ones that are links. They are all access points to the same file (same inode) in the directory tree. When you get the size of the file (lstat system call), you're retrieving information (that metadata referred to above) stored in the inode, it doesn't matter which file name, which link you're using to refer to that file.By contrast symlinks are another file (another inode) whose content is a path to the target file. Like any other file, those symlinks have to be linked to a directory (must have a name) so you can access them. You can also have several links to a symlinks, or in other words, symlinks can be given several names (in one or more directories).$ touch a$ ln a b$ ln -s a c$ ln c d$ ls -li [a-d]10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> aAbove the file number 10486707 is a regular file. Two entries in the current directory (one with name a, one with name b) link to it. Because the link count is 2, we know there's no other name of that file in the current directory or any other directory. File number 10502404 is another file, this time of type symlink linked twice to the current directory. Its content (target) is the relative path a.Note that if 10502404 was linked to another directory than the current one, it would typically point to a different file depending on how it was accessed.$ mkdir 1 2$ echo foo > 1/a$ echo bar > 2/a$ ln -s a 1/b$ ln 1/b 2/b$ ls -lia 1 21:total 9210608644 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../10504186 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a2:total 9210608674 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../10539044 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a$ cat 1/bfoo$ cat 2/bbarFiles have no names associated with them other than in the directories that link them. The space taken by their names is the entries in those directories, it's accounted for in the file size/disk usage of the directories.You'll notice that the system call to remove a file is unlink. That is, you don't remove files, you unlink them from the directories they're referenced in. Once unlinked from the last directory that had an entry to a given file, that file is then destroyed (as long as no process has it opened).