In computing, a hard link is a directory entry (in a directory-based file system) that associates a name with a file. Thus, each file must have at least one hard link. Creating additional hard links for a file makes the contents of that file accessible via additional paths (i.e., via different names or in different directories). This causes an alias effect: a process can open the file by any one of its paths and change its content. By contrast, a soft link or “shortcut” to a file is not a direct link to the data itself, but rather a reference to a hard link or another soft link.

Every directory is itself a special file, only it contains a list of file names. Hence, multiple hard links to directories are possible, which could create a circular directory structure, rather than a branching structure like a tree. For that reason, some file systems forbid the creation of hard links to directories.

POSIX-compliant operating systems, such as Linux, Android, macOS, and the Windows NT family, support multiple hard links to the same file, depending on the file system. For instance, NTFS and ReFS support hard links, while FAT does not.

Operation

Let two hard links, named "LINK A.TXT" and "LINK B.TXT", point to the same physical data. A text editor opens "LINK A.TXT", modifies it and saves it. When the editor (or any other app) opens "LINK B.TXT", it can see those changes made to "LINK A.TXT", since both file names point to the same data. So from a user's point of view this is one file with several filenames. Editing any filename modifies "all" files, however deleting "any" filename except the last one keeps the file around.

However, some editors, such as GNU Emacs, break the hard link concept. When opening a file for editing, e.g.,  "LINK B.TXT", emacs renames "LINK B.TXT" to "LINK B.TXT~", loads "LINK B.TXT~" into the editor, and saves the modified contents to a newly created "LINK B.TXT". Now, "LINK A.TXT" and "LINK B.TXT" no longer shares the same data. (This behavior can be changed using the emacs variable backup-by-copying.)

Any number of hard links to the physical data may be created. To access the data, a user only needs to specify the name of any existing link; the operating system will resolve the location of the actual data. Even if the user deletes one of the hard links, the data is still accessible through any other link that remains. Once the user deletes all of the links, if no process has the file open, the operating system frees the disk space that the file once occupied.

Reference counting 

Most file systems that support hard links use reference counting. The system stores an integer value with each logical data section that represents the total number of hard links that have been created to point to the data. When a new link is created, this value is increased by one. When a link is removed, the value is decreased by one. When the counter becomes zero, the operating system frees the logical data section. (The OS may not to do so immediately, e.g., when there are outstanding file handles open, for performance reasons, or to enable the undelete command.)

This is a simple method for the file system to track the use of a given area of storage, as zero values indicate free space and nonzero values indicate used space. The maintenance of this value guarantees that there will be no dangling hard links pointing nowhere. The data section and the associated inode are preserved as long as a single hard link (directory reference) points to it or any process keeps the associated file open.

On POSIX-compliant operating systems, the reference count for a file or directory is returned by the stat() or fstat() system calls in the st_nlink field of struct stat.

Limitations 
To prevent loops in the filesystem, and to keep the interpretation of the "" file (parent directory) consistent, operating systems do not allow hard links to directories. UNIX System V allowed them, but only the superuser had permission to make such links. Mac OS X v10.5 (Leopard) and newer use hard links on directories for the Time Machine backup mechanism only.

Hard links can be created to files only on the same volume, i.e., within the same file system. (Different volumes may have different file systems. There is no guarantee that the target volume's file system is compatible with hard linking.)

The maximum number of hard links to a single file is limited by the size of the reference counter. On Unix-like systems the counter is 4,294,967,295 (on 32-bit machines) or 18,446,744,073,709,551,615 (on 64-bit machines). In some file systems, the number of hard links is limited more strictly by their on-disk format. For example, as of Linux 3.11, the ext4 file system limits the number of hard links on a file to 65,000. Windows limits enforces a limit of 1024 hard links to a file on NTFS volumes.

On Linux Weekly News, Neil Brown criticized hard links as high-maintenance, since they complicate the design of programs that handle directory trees, including archivers and disk usage tools. These apps must take care to de-duplicate files that are linked multiple times in a hierarchy. Brown notes that Plan 9 from Bell Labs, the intended successor to Unix, does not include the concept of a hard link.

Platform support
Windows NT 3.1 and later support hard links on the NTFS file system. Windows 2000 introduces a CreateHardLink() function to create hard links, but only for files, not directories. The DeleteFile() function can remove them.

To create a hard link on Windows, end-users can use:
 The fsutil utility (introduced in Windows 2000)
 The mklink internal command of Windows Command Prompt (introduced in Windows Vista and Windows Server 2008)
 The New-Item cmdlet of PowerShell

To interrogate a file for its hard links, end-users can use:
 The fsutil utility
 The Get-Item and Get-ChildItem cmdlets of PowerShell. These cmdlets represent each file with an object; PowerShell adds a read-only LinkType property to each of them. This property contains the  string if the associated file has multiple hard links.

The Windows Component Store uses hard links to keep track of different versions of components stored on the hard disk drive.

On Unix-like systems, the  system call can create additional hard links to existing files. To create hard links, end-users can use:
 The ln utility
 The link utility
 The New-Item cmdlet of PowerShell

To interrogate a file for its hard links, end-users can use:
 The stat command
 The ls -l command
 The Get-Item and Get-ChildItem cmdlets of PowerShell (see above)

Unix-like emulation or compatibility software running on Microsoft Windows, such as Cygwin and Subsystem for UNIX-based Applications, allow the use of POSIX interfaces. 

OpenVMS supports hard links on the ODS-5 file system. Unlike Unix, VMS can create hard links to directories.

See also
 Symbolic link: Points to a hard link, not the file data itself; hence, it works across volumes and file systems.
NTFS links: Details the four link types that the NTFS supports—hard links, symbolic links, junction points, and volume mount points
 Shortcut: A small file that points to another in a local or remote location
Alias: macOS implementation of a shortcut
 Shadow: OS/2 implementation of a shortcut
 freedup – The freedup command frees-up disk space by replacing duplicate data stores with automatically generated hard links

References

Computer file systems
컴퓨팅에서 하드 링크(hard link)는 파일 시스템의 파일의 이름과 연결되는 디렉터리 엔트리이다. 모든 디렉터리 기반의 파일 시스템들은 각 파일의 원래 이름을 제공하는 (적어도) 하나의 하드 링크가 있어야 한다. "하드 링크"라는 용어는 동일한 파일에 대해 일반적으로 하나 이상의 하드 링크를 허용하는 파일 시스템에만 사용된다.

하드 링크를 만드는 것은 하나의 파일에 여러 이름을 제공하는 효과가 있으며(예: 여러 디렉터리에서의 다른 이름) 그 이름들 모두 독립적으로 디스크의 동일 데이터에 연결되는데, 이들 중 어느 것도 서로 의존하지 않는다.

이 때는 앨리어스(alias) 효과가 있다. 예를 들어, 파일이 해당 이름 중 하나에 의해 열려있는 경우 내용에 대한 변경이 생기며 이 변경사항은 파일이 다른 이름에 의해 열릴 때 보이게 된다. 대조적으로 파일에 대한 심볼릭 링크나 바로 가기는 데이터 그 자체에 대한 직접적인 링크가 아니며 파일 이름의 텍스트를 포함하는 짧은 파일 또는 특정 디렉토리 내의 다른 파일 이름에 대한 직접 접근을 제공하는 위치이다. 심볼릭 링크와 관련한 이름은 하드 링크일 수도 있고 다른 소프트 링크일 수도 있다. 이 경우에도 앨리어스를 만들기는 하지만 다른 방식으로 만들어진다.

모든 디렉터리는 그 자체로 파일이며, 파일 시스템에 의해 유지보수되는 파일 이름의 목록을 담고 있다는 점이 특이점이다. 디렉터리들 그 자체가 파일이므로 디렉터리에 대한 복수의 하드 링크가 가능하기 때문에 트리와 같은 가지 구조가 아니라 디렉터리 구조 내에서 루프를 만들 수 있다. 이러한 까닭에 디렉터리에 대한 하드 링크를 만드는 것은 가능하면 삼가는 것이 좋다.

하드 링크, 즉, 동일 파일에 대한 여러 디렉터리 엔트리는 POSIX 호환 및 POSIX 부분 호환 운영 체제들에 의해 지원되며, 여기에는 리눅스, 안드로이드, macOS, 또 윈도우 NT 4.0, 이후의 윈도우 NT 운영 체제가 있다.

지원은 또한 사용되는 파일 시스템의 종류에 따라 다르다. 이를테면 NTFS 파일 시스템은 하드 링크를 지원하지만, FAT와 ReFS는 지원하지 않는다.

사용 
유닉스 계열 운영 체제와 같은 POSIX 호환 및 POSIX 부분 호환 운영 체제에서 기존 파일에 대한 추가적인 하드 링크들은  시스템 호출을 사용하거나 ln과 link 명령 줄 유틸리티를 사용하여 만든다. stat 명령어는 얼마나 많은 하드 링크가 지정 파일을 가리키는지 알려준다. 링크 카운트는 ls -l의 출력에도 포함된다.

마이크로소프트 윈도우에서 하드 링크는 윈도우 NT 이후 운영 체제(예: 윈도우 비스타)에서는 mklink /H 명령어를, 초기 운영 체제 (윈도우 XP, 윈도우 서버 2003)에서 fsutil.exe hardlink create 명령어를 사용하여 만들 수 있다.

윈도우 2000 이상의 윈도우 API에는 하드 링크를 만들기 위한 CreateHardLink() 호출, 이들을 제거하기 위한 DeleteFile(), 연결된 하드 링크의 수를 결정하는 GetFileInformationByHandle()을 포함한다. 하드 링크는 NTFS 파티션이 필요하다. 윈도우 비스타를 기점으로 하드 링크는 하드 디스크 드라이브에 저장된 각기 다른 버전의 DLL을 추적하기 위해 윈도우 컴포넌트 스토어(WinSxS)가 사용한다.  시그윈, Subsystem for UNIX-based Applications 등 윈도우에서 실행되는 유닉스 계열 에뮬레이션 또는 호환성 소프트웨어는 윈도우 하에서 POSIX 인터페이스를 사용할 수 있게 해준다.

링크 해제(unlinking) 과정은 연결된 데이터를 파괴하지 않고 볼륨 상의 데이터의 이름으로부터 이름의 연결을 해제한다. 적어도 포인트에 대한 링크가 하나라도 존재하는 한 데이터는 계속 접근이 가능하다. 마지막 링크가 제거되면 공간 할당은 해제되는 것으로 간주된다.

예 

오른쪽 그림에서처럼 "LINK A.TXT", "LINK B.TXT"라는 두 개의 하드 링크가 동일한 물리적 데이터를 가리키고 있다고 하자.

파일 "LINK A.TXT"를 편집기로 열고 수정, 저장하면 "LINK B.TXT"의 내용을 보려고 열 때(POSIX 시스템에서 연결된 파일 서술자는 원래의 파일이 이동되더라도 파일을 연 뒤에는 유효한 채로 남아있다.) 변경사항이 반영된 것으로 나타나는데, 이는 두 파일 이름이 POSIX 시스템에서 동일한 데이터를 가리키기 때문이다. 파일이 "LINK B.TXT" 또는 데이터와 연결된 다른 이름으로 열더라도 결과는 동일하다.

그러나 이맥스와 같은 일부 편집기들은 하드 링크 개념을 무너뜨린다. 편집을 위해 "LINK B.TXT"를 열면 이맥스는 먼저 "LINK B.TXT"를 "LINK B.TXT~"로 이름을 바꾸고 "LINK B.TXT~"를 편집기로 불러들이고 수정된 내용을 새로 만든 "LINK B.TXT"로 저장한다. 이러한 접근을 사용하면 두 개의 하드 링크가 "LINK A.TXT"와 "LINK B.TXT~"(백업 파일)로 된다. 즉, "LINK B.TXT"는 하나의 링크만 가지고 있으므로 더 이상 "LINK A.TXT"와 동일한 데이터를 공유하지 않는다. (이 동작은 이맥스 변수 backup-by-copying을 사용하여 변경할 수 있다.)

물리 데이터에 대해 어떠한 수의 하드 링크라도 만들 수 있다. 데이터에 접근하기 위해 사용자는 기존 링크의 이름을 지정만 하면 되며, 이 때 운영 체제는 실제 데이터의 위치를 찾아준다.

POSIX unlink 함수를 사용하여(이를테면, UNIX rm 명령을 사용하여) 링크 중 하나가 제거되면 데이터는 남아있는 다른 링크를 통해 접근을 계속할 수 있다. 모든 링크가 제거되고 어떠한 프로세스도 파일을 열고 있지 않다면 데이터에 의해 차지된 공간은 나중에 다시 사용할 수 있도록 해제된다. 이러한 시맨틱은 이들을 사용하는 프로세스에 영향을 주지 않고 열려 있는 파일을 삭제할 수 있게 한다. 이 기법은 비정상 종료를 포함하여 프로그램 종료 시 임시 파일이 삭제되는 것을 보증하기 위해 흔히 사용된다.

같이 보기 
 팻 링크
 심볼릭 링크 또는 소프트 링크(soft link): 하드 링크와 달리 파일 데이터 자체가 아닌 실제 파일명의 텍스트만 제공한다.
 NTFS 정션 포인트 – NTFS 구현체
 alias (Mac OS)
 shadow (OS/2) – OS/2 구현체

각주 

파일 시스템