В вычислительной технике жесткая ссылка — это запись каталога (в файловой системе на основе каталогов ), которая связывает имя с файлом . Таким образом, каждый файл должен иметь по крайней мере одну жесткую ссылку. Создание дополнительных жестких ссылок для файла делает содержимое этого файла доступным через дополнительные пути (т. е. через другие имена или в других каталогах). [1] Это вызывает эффект псевдонима : процесс может открыть файл по любому из его путей и изменить его содержимое. Напротив, мягкая ссылка или «ярлык» на файл — это не прямая ссылка на сами данные, а скорее ссылка на жесткую ссылку или другую мягкую ссылку.
Каждый каталог сам по себе является специальным файлом во многих системах, содержащим список имен файлов вместо других данных. Следовательно, возможны множественные жесткие ссылки на каталоги, которые могут создать кольцевую структуру каталогов, а не разветвленную структуру, как дерево . По этой причине некоторые файловые системы запрещают создание дополнительных жестких ссылок на каталоги.
Операционные системы , совместимые с POSIX , такие как Linux , Android , macOS и семейство Windows NT , [2] поддерживают несколько жестких ссылок на один и тот же файл в зависимости от файловой системы. Например, NTFS и ReFS поддерживают жесткие ссылки, [3] а FAT — нет.
Пусть две жесткие ссылки, названные "LINK A.TXT" и "LINK B.TXT", указывают на одни и те же физические данные. Текстовый редактор открывает "LINK A.TXT", изменяет его и сохраняет. Когда редактор (или любое другое приложение) открывает "LINK B.TXT", он может видеть эти изменения, внесенные в "LINK A.TXT", поскольку оба имени файла указывают на одни и те же данные. Так что с точки зрения пользователя это один файл с несколькими именами файлов. Редактирование любого имени файла изменяет "все" файлы, однако удаление "любого" имени файла, кроме последнего, сохраняет файл.
Однако некоторые редакторы, такие как GNU Emacs , нарушают концепцию жесткой ссылки. При открытии файла для редактирования, например, "LINK B.TXT", emacs переименовывает "LINK B.TXT" в "LINK B.TXT~", загружает "LINK B.TXT~" в редактор и сохраняет измененное содержимое в недавно созданный "LINK B.TXT". Теперь "LINK A.TXT" и "LINK B.TXT" больше не используют одни и те же данные. (Это поведение можно изменить с помощью переменной emacs backup-by-copying
.)
Может быть создано любое количество жестких ссылок на физические данные. Чтобы получить доступ к данным, пользователю нужно только указать имя любой существующей ссылки; операционная система определит местоположение фактических данных. Даже если пользователь удалит одну из жестких ссылок, данные по-прежнему будут доступны через любую другую оставшуюся ссылку. После того, как пользователь удалит все ссылки, если ни один процесс не открыл файл, операционная система освободит дисковое пространство, которое когда-то занимал файл.
Большинство файловых систем , поддерживающих жесткие ссылки, используют подсчет ссылок . Система хранит целочисленное значение с каждым логическим разделом данных , которое представляет собой общее количество жестких ссылок, созданных для указания на данные. При создании новой ссылки это значение увеличивается на единицу. При удалении ссылки значение уменьшается на единицу. Когда счетчик становится равным нулю, операционная система освобождает логический раздел данных. (ОС может не сделать этого немедленно, например, когда открыты необработанные дескрипторы файлов, по соображениям производительности или для включения команды восстановления .)
Это простой метод для файловой системы отслеживать использование заданной области хранения, поскольку нулевые значения указывают на свободное пространство, а ненулевые значения указывают на используемое пространство. Поддержание этого значения гарантирует, что не будет никаких висячих жестких ссылок, указывающих в никуда. Раздел данных и связанный с ним inode сохраняются до тех пор, пока на него указывает одна жесткая ссылка (ссылка на каталог) или какой-либо процесс сохраняет связанный файл открытым.
В операционных системах, совместимых с POSIX , количество ссылок на файл или каталог возвращается системными вызовами stat() или fstat() в st_nlink
поле struct stat
.
Чтобы предотвратить зацикливание в файловой системе и сохранить единообразие интерпретации файла " " ..
(родительского каталога), операционные системы обычно не допускают жестких ссылок на каталоги. UNIX System V допускает их, но только суперпользователь имеет право создавать такие ссылки. [4] Mac OS X v10.5 (Leopard) и более новые версии используют жесткие ссылки на каталоги только для механизма резервного копирования Time Machine . [5]
Жесткие ссылки могут быть созданы только для файлов на одном и том же томе, т. е. в пределах одной и той же файловой системы. (Разные тома могут иметь разные файловые системы. Нет гарантии, что файловая система целевого тома совместима с жесткими ссылками.)
Максимальное количество жестких ссылок на один файл ограничено размером счетчика ссылок. В Unix-подобных системах счетчик равен 4 294 967 295 (на 32-разрядных машинах) или 18 446 744 073 709 551 615 (на 64-разрядных машинах). В некоторых файловых системах количество жестких ссылок ограничено более строго их форматом на диске. Например, начиная с Linux 3.11, файловая система ext4 ограничивает количество жестких ссылок на файл до 65 000. [6] Ограничения Windows устанавливают ограничение в 1024 жестких ссылок на файл на томах NTFS . [7]
В Linux Weekly News Нил Браун критиковал жесткие ссылки как требующие большого обслуживания, поскольку они усложняют разработку программ, обрабатывающих деревья каталогов, включая архиваторы и инструменты использования диска. Эти приложения должны заботиться об удалении дубликатов файлов, которые связаны несколько раз в иерархии . Браун отмечает, что Plan 9 от Bell Labs , предполагаемый преемник Unix, не включает концепцию жесткой ссылки. [8]
Windows NT 3.1 и более поздние версии поддерживают жесткие ссылки в файловой системе NTFS . [9] Windows 2000 представляет CreateHardLink()
функцию создания жестких ссылок, но только для файлов, а не для каталогов. [10] Функция DeleteFile()
может их удалять.
Чтобы создать жесткую ссылку в Windows, конечные пользователи могут использовать:
fsutil
(представлена в Windows 2000 ) [11]mklink
команда командной строки Windows (представлена в Windows Vista и Windows Server 2008 ) [12]New-Item
PowerShell [ 13]Чтобы проверить файл на наличие жестких ссылок, конечные пользователи могут использовать:
fsutil
]Get-Item
PowerShell Get-ChildItem
и представляют каждый файл с объектом; PowerShell добавляет свойство LinkType только для чтения к каждому из них. Это свойство содержит HardLink
строку " ", если связанный файл имеет несколько жестких ссылок. [14]Хранилище компонентов Windows использует жесткие ссылки для отслеживания различных версий компонентов, хранящихся на жестком диске.
В Unix-подобных системах link()
системный вызов может создавать дополнительные жесткие ссылки на существующие файлы. Для создания жестких ссылок конечные пользователи могут использовать:
New-Item
PowerShell [13]Чтобы проверить файл на наличие жестких ссылок, конечные пользователи могут использовать:
stat
ls -l
Get-Item
и (см. выше) [14]Get-ChildItem
Программное обеспечение для эмуляции или совместимости Unix-подобных систем, работающее в Microsoft Windows, например Cygwin и Subsystem for UNIX-based Applications , позволяет использовать интерфейсы POSIX.
OpenVMS поддерживает жесткие ссылки в файловой системе ODS-5 . [15] В отличие от Unix, VMS может создавать жесткие ссылки на каталоги.
freedup
команда освобождает место на диске, заменяя дублирующиеся хранилища данных автоматически сгенерированными жесткими ссылками.Устанавливает жесткую ссылку между существующим файлом и новым файлом. Эта функция поддерживается только в файловой системе NTFS и только для файлов, а не для каталогов.
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка )Если ваше местоположение находится на диске FileSystem, допускаются следующие значения: Если ваше местоположение находится на диске FileSystem, допускаются следующие значения: File[,] Directory[,] Junction[,] HardLink