Question: Say I just create directory newDirectory and then I do ls -ld command. I see that the number of hard links is 2. What exactly makes the hard link 2 from the start? Also is the number of subdirectories in the current directory equal to the number of hard links - 2?

Answer: 
[Historically](https://www.bell-labs.com/usr/dmr/www/cacm.html), the first Unix filesystem created two entries in every directory: `.` pointing to the directory itself, and `..` pointing to its parent. This provided an easy way to traverse the filesystem, both for applications and for the OS itself.

Thus each directory has a link count of 2+n where n is the number of subdirectories. The links are the entry for that directory in its parent, the directory's own `.` entry, and the `..` entry in each subdirectory. For example, suppose this is the content of the subtree rooted at `/parent`, all directories:

```
/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

```

Then `dir` has a link count of 5: the `dir` entry in `/parent`, the `.` entry in `/parent/dir`, and the three `..` entries in each of `/parent/dir/sub1`, `/parent/dir/sub2` and `/parent/dir/sub3`. Since `/parent/dir/sub1` has no subdirectory, its link count is 2 (the `sub1` entry in `/parent/dir` and the `.` entry in `/parent/dir/sub1`).

To minimize the amount of special-casing for the root directory, which doesn't have a “proper” parent, the root directory contains a `..` entry pointing to itself. This way it, too, has a link count of 2 plus the number of subdirectories, the 2 being `/.` and `/..`.

Later filesystems have tended to keep track of parent directories in memory and usually don't need `.` and `..` to exist as actual entries; typical modern unix systems treat `.` and `..` as special values as part of the filesystem-type-independent filesystem code. Some filesystems still include `.` and `..` entries, or pretend to even though nothing appears on the disk.

Most filesystems still report a link count of 2+n for directories regardless of whether `.` and `..` entries exist, but there are exceptions, for example btrfs doesn't do this and changing this [has been marked as a rejected idea](https://btrfs.wiki.kernel.org/index.php/Project_ideas#Track_link_count_for_directories) in the [btrfs wiki](https://btrfs.wiki.kernel.org/index.php/Main_Page).
This depends on the filesystem. BTRFS breaks with this convention.

```none
# dd if=/dev/zero of=btrfs.img bs=114294784 count=1
1+0 records in
1+0 records out
114294784 bytes (114 MB, 109 MiB) copied, 0.172979 s, 661 MB/s

```

```none
# mkfs.btrfs btrfs.img 
btrfs-progs v4.20.1 
See http://btrfs.wiki.kernel.org for more information.

Label:              (null)
UUID:               ad5f6c58-ec7a-41db-9d19-ec98db96d725
Node size:          16384
Sector size:        4096
Filesystem size:    109.00MiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         DUP              32.00MiB
  System:           DUP               8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  1
Devices:
   ID        SIZE  PATH
    1   109.00MiB  btrfs.img

```

```none
# mount btrfs.img /mnt

```

```none
# mkdir -p /mnt/{1,2,3}/{1,2,3}

```

```none
# find /mnt/ -links 2

```

```none
# find /mnt/ -links 1
/mnt/
/mnt/1
/mnt/1/1
/mnt/1/2
/mnt/1/3
/mnt/2
/mnt/2/1
/mnt/2/2
/mnt/2/3
/mnt/3
/mnt/3/1
/mnt/3/2
/mnt/3/3

```

The links counter has no meaning for directories on a BTRFS:

```none
# find /mnt/ -printf '%n %p\n'
1 /mnt/
1 /mnt/1
1 /mnt/1/1
1 /mnt/1/2
1 /mnt/1/3
1 /mnt/2
1 /mnt/2/1
1 /mnt/2/2
1 /mnt/2/3
1 /mnt/3
1 /mnt/3/1
1 /mnt/3/2
1 /mnt/3/3

```