1

I was wondering why every file has 1 link to itself.

I'll try to be more clear.

By inserting from bash the command " ls -l " you'll end up with a list of files each preceded by different data divided in columns. The number of links to a file is in the third column. Can someone explain me why a file has that information setted to 1 instead of 0?

I get why the directories have two, if you explore one you'll find the " . " and the " . . " subdirectories, the former points at the directory itself, while the latter to the previous directory, but the file can't contain the " . " subdirectory since it's a file, so shouldn't it be 0?

B.Castarunza
  • 135
  • 12

3 Answers3

2

Because there is nothing special about the first hard link (soft links are different, they're really just special files containing the textual target) to a file, it's just a directory entry that refers to the inode behind it.

This is a consequence of the decision to separate data (inode) from references to the data (directory entry).

So don't think of the file being one directory entry, with other files linked to it. Think instead of the data in the file being the thing, with as many directory entries as you need referring to it. When you hard-link directory entry a to an existing b, you're really linking it to the inode behind b, and they are equals in every sense of the word. The data is only ever destroyed when the final hard link to it is disconnected.

paxdiablo
  • 854,327
  • 234
  • 1,573
  • 1,953
  • I loved your explanation, thank you a lot. So let me get this straight, if we are talking about directories then the first hard link it's from the directory entry to the entry's data (inode) a.k.a. the " . ", while the second link is the link between the previous directory and the entry's data i.e. the " . . ". The latter what kind of link is? In case of subdirectories, what kind are their links? If I added a symbolic link would the counter increase? – B.Castarunza Jun 23 '20 at 10:48
  • someone told me it counts the hard links – B.Castarunza Jun 23 '20 at 23:07
  • @B.Castarunza: symbolic links have no effect on the link count, they were added much later. But keep this in mind: an inode (be it a directory or a regular file) *has* no inherent name, it's just data on the disk, identified by an inode number. A directory entry is what maps a name (including `.` and `..`) to an inode. The command `mkdir /tmp/qq` will create that directory with two links from directory entries, `/tmp/dd` and `/tmp/dd/.`, and the link count for `/tmp` will increase due to `/tmp/dd/..`. A file, made from `touch /tmp/ff` will have only one, from directory entry `/tmp/ff`. – paxdiablo Jun 24 '20 at 00:08
  • Or, perhaps clearer. The link count is simply the number of directory entries that refer to the underlying data/inode. That count (functionally) "belongs" to the inode itself rather than the individual directory entries that reference it. – paxdiablo Jun 24 '20 at 00:14
  • Gotcha, so every hard link to the inode will have the same counter value – B.Castarunza Jun 24 '20 at 02:54
1

The filename you see is a hard link to the underlying object that represents the file, and ones with 0 links get automatically removed by the filesystem.

Shawn
  • 47,241
  • 3
  • 26
  • 60
0

You have misinterpreted the number of links pointing to the file's inode, with the fact of having a link pointint to itself (see below).

Just consider the possibility of having a link... a link is an entry in a directory, that associates a name with an inode. The inode represents all the administrative data that is stored in a file (or a directory) and stores things like the permission bits, the dates of last read, last write or last inode change, pointers to the file's data blocks, etc.

There's one integer field in each inode that reflects the number of links that point to it (and this is what ls shows). This is needed for efficiency reasons, as it is redundant information. Just navigating the whole filesystem we can determine the number of directory entries that point to the same inode... but that is impractical to do, so the link count is maintained each time a node is linked or unlinked. So the next question is: Why is the number of directory entries pointing to the file's inode necessary? There's a bookkeeping reason. In order to detect when it reaches zero, as because of that, the kernel keeps the number of links pointing to an inode so it can free all the blocks belonging to the inode and the inode itself in order to recover the data after a file is removed (unlinked) the last time (when the counter gets down to zero)

Normally, a file has at least one such link, but it can have more. If you execute a command like:

ln foo bar

you are creating an alias for file foo, that now is called also bar. If you make your directory listing now, you'll see both file entries having 2 in the number of links field. More on, if you execute

ls -li foo bar

you'll see a first column, showing the inode number (this is a unique id for a file in a filesystem) of both files as the same inode... If you change the permissions to one of the links, you'll see the other file name his permissions changed also... this is because both filenames are aliases for the same file.

With respect with my first paragraph, a number of links is not the same thing as pointing to itself. Every directory has an entry that points to the directory's inode of the directory itself. This is the entry . that every directory has (this entry allows you to execute the ls command without parameters, for example, as when you don't specify parameters, the ls command uses . as the directory to list) and that makes that a directory has always 2 as a minimum (the 1 you observed for a file, plus the link of the . directory every directory has, for that number (check this and you'll see that this is an invariant of unix systems) Directories have 2 + number_of_subdirectories in its inode (one for the entry in the parent directory pointing to the directory itself, one for the directory entry . in the directory itself, and one for each subdirectories' entry .. parent directory, in the subdirectories of this directory) Check the numbers, it doesn't fail. And for files is the number of links (or aliases) a file can have. You cannot see files with 0 links as you are listing a directory, those files, case of existing, are being handled by the kernel, in the task of erasing them (freeing the blocks they used) Directories cannot have different aliases or names as files in order to conserve the hierarchical directory structure, only the two exceptions for . and .. are permitted and these are maintained (and enforced) by the kernel.

Luis Colorado
  • 10,974
  • 1
  • 16
  • 31