Жесткие и символические ссылки в linux

В чем разница между жесткими ссылками, символическими ссылками и соединениями

Поскольку эта запись логически завершает серию статей о ссылках NTFS, хотелось бы подвести итог и сопоставить их возможности.

Создание и удаление связей

Команда mklink в Windows 7 и Vista умеет создавать все три типа связей. Жесткие ссылки можно создать только на файлы, но не на папки — для этого исторически существуют соединения.

Символические ссылки совмещают в себе свойства соединений и жестких ссылок. Для пользовательских задач их вполне достаточно, и в большинстве случаев не возникает необходимости в применении других способов.

Удаление ссылок в Windows 7 и Vista не несет в себе особых сюрпризов, поскольку целевые файлы и папки остаются в целости и сохранности. Внимательным нужно быть лишь при рекурсивном удалении файлов из папки командой del /s, т.к. при этом будут удалены все файлы в целевой папке.

Сравнительная таблица

Для полноты картины в таблице отражены некоторые возможности, которых я не касался в своих материалах.

Возможность Символическая(symbolic link) Жесткая(hard link) Соединение(junction)
Файловая система NTFS NTFS NTFS
Ссылка на локальную папку Да Нет Да
Ссылка на локальный файл Да Да Нет
Ссылка на сетевую папку или файл Да (UNC путь) Нет Нет
Относительный путь в ссылке Да Нет Нет
Связь между томами* Да(абсолютные ссылки) Нет Да(локальные тома)
Команда для просмотра ссылок dir fsutil dir

* Не путайте том с диском или разделом. Тома могут включать в себя несколько разделов или даже дисков. Подробнее читайте в статье о конфигурировании динамических томов (мой перевод 2006 года:)

Различные типы связей между папками и файлами дают файловой системе NTFS преимущества, которые Microsoft использует для обеспечения совместимости приложений и стабильной работы Windows. В немалой степени именно по этой причине уже третье поколение систем Microsoft не устанавливается на файловую систем FAT32.

Что такое символические ссылки

Символические ссылки – это, по сути, расширенные ярлыки. Создайте символическую ссылку на отдельный файл или папку, и эта ссылка будет выглядеть так же, как файл или папка для Windows, хотя это только ссылка, указывающая на файл или папку.

Например, предположим, что у вас есть программа, которая использует файлы в папке C:\Program. А Вам хотелось бы сохранить этот каталог в D:\Refuse, но программа требует, чтобы её файлы были в C:\Program. Вы можете перенести исходный каталог из C:\Program в D:\Refuse, а затем создать символическую ссылку C:\Program, указав на D:\Refuse. Когда вы перезапустите программу, она попытается получить доступ к своему каталогу в C:\Program. Windows автоматически перенаправит её на D:\Refuse, и всё будет работать так, как если бы оно было в C:\Program.

Этот трюк можно использовать для всех целей, включая синхронизацию любой папки с такими программами, как Dropbox, Google Drive и OneDrive.

Существует два типа символических ссылок: жесткая и мягкая. Мягкие символические ссылки работают аналогично стандартным ярлыкам. Когда вы открываете мягкую ссылку на папку, вы будете перенаправлены в папку, где хранятся файлы. Однако, жесткая ссылка заставляет его выглядеть так, как будто файл или папка действительно существуют в местоположении символической ссылки, и ваши приложения не будут знать о подмене. В большинстве ситуаций жесткие символические ссылки более полезны.

Обратите внимание, что Windows фактически не использует термины «жесткая ссылка» и «мягкая ссылка». Вместо этого используются термины «жесткая ссылка» и «символическая ссылка»

В документации Windows «символическая ссылка» – это то же самое, что «мягкая ссылка». Тем не менее, mklink-команда может создавать как жесткие ссылки, так и софт-ссылки (известные как «символические ссылки» в Windows).

Сколько места на диске занимают жесткие ссылки

Нисколько! В файловой системе NTFS каждый файл можно считать жесткой ссылкой на самого себя. На файл может ссылаться сколько угодно жестких ссылок (точнее, не больше 1023). Они могут запускать его из разных расположений, и при этом неотличимы друг от друга в проводнике и результатах команды dir.

Самым ярким примером непонимания принципов работы и назначения жестких ссылок являются руководства по чистке папки winsxs. О ней меня недавно просил рассказать читатель блога Антон, и вот представился случай.

Проводник видит папку winsxs так:

Но в реальности папка содержит немного уникальных файлов, которые изначально занимают на диске в среднем 400 Мб. Эта цифра относится к Windows Vista, и логично предположить, что в Windows 7 дело обстоит примерно так же (по крайней мере, понятен порядок цифры).

Все остальные файлы с помощью жестких ссылок проецируются в папки Windows, System32 и т.д. Появление папки winsxs связано с изменением платформы Windows, которая теперь складывается из компонентов как дом из кирпичей. По сравнению с Windows XP такая модель упрощает развертывание и обслуживание WIM-образов. Это верно даже после установки системы, поскольку она представляет собой образ, примененный к диску. Например, список компонентов и их состояние можно посмотреть командой

Dism /online /Get-Features

Может показаться, что зачистка папки winsxs никак не нарушает нормальную работу системы. Так, Антон лишился только русского языка в Internet Explorer, причем с его слов исключительно по невнимательности. Однако нарушения нормальной работы Windows не всегда заметны, если они происходят под капотом системы.

Так, содержимое папки winsxs используется для проверки системных файлов (SFC), а хранящиеся в ней версии файлов обеспечивают подбор наиболее подходящей версии при установке и удалении обновлений.

Подробнее о назначении папки winsxs вы можете узнать из блогов создателей Windows и команды Windows Server Core (EN), а я предлагаю вернуться к разговору о жестких ссылках.

Преданья старины глубокой

Два файла notepad.exe обеспечивают совместимость приложений, играя ту же роль, что и некоторые подразделы App Paths.

Сторонние программы

В данном случае речь идет о совместимости со сторонними программами, в которых жестко прописан путь к блокноту. Например, многие установщики программ до сих пор открывают readme.txt именно в нем, и кто его знает, как разработчики это прописали.

Все дело в том, что в Windows 3.0  местом хранения блокнота была папка Windows, а в Windows NT 3.х – папка System32. Несмотря на то, что обе системы давно стали пыльной историей, блокнот до сих пор размещают в обеих папках. Интересно, что делается это не во всех операционных системах Microsoft, а если и делается, то различными способами!

Реализация в разных операционных системах

В Windows XP и Windows Vista в обеих папках лежит по файлу notepad.exe. А разработчики Windows Server 2008 решили убрать блокнот из папки Windows, оставив его только в System32. Наверное, они сочли, что на серверной системе устанавливается меньше прикладных программ, и вероятность попадания на несовместимую программу намного ниже.

Судя по тому, что в  следующих серверах от этой идеи не отказались, расчет оправдался. Любопытно, что после включения компонента Desktop Experience блокнот все-таки появляется в папке Windows (спасибо за информацию, Morpheus).

Его наличие в разных папках обеспечивают жесткие ссылки (hard links), которые и станут основными героинями сегодняшнего разговора. Аналогично, в серверных системах после включения компонента создается именно жесткая ссылка на notepad.exe, а не копия файла. Кстати, программа write тоже дублируется жесткой ссылкой.

Не совсем понятно, почему это решение не внедрили еще в Vista, но совершенно ясно, почему так не сделали в XP. Дело в том, что жесткие ссылки являются свойством файловой системы NTFS, а ХР можно было устанавливать еще и на FAT32.

Дальше в программе

Cравнение жёстких и символических ссылок

Покажем, как работают жёсткие и символические ссылки и различия в их поведении на примере. Для этого запустим консоль (терминал) Mac OS X или другой *nix системы. Здесь будет использоваться терминал Mac OS X, однако, используемые команды должны работать в любой *nix системе (Linux, AIX и т.д.).

Для начала, создадим файл file.a а содержимым «aaa»:

Shell

echo «aaa» > file.a

1 echo»aaa»>file.a

Затем, создадим на него две ссылки: символическую и жёсткую:

Shell

ln -s file.a link1
ln file.a link2

1
2

ln-sfile.alink1

lnfile.alink2

Теперь попробуем прочитать содержимое файла по обеим ссылкам:

Shell

cat link1
aaa
cat link2
aaa

1
2
3
4

catlink1

aaa

catlink2

aaa

Обе ссылки работают нормально.

А сейчас, удалим оригинальный файл и попробуем прочитать по ссылкам его содержимое ещё раз.

Shell

rm file.a
cat link1
cat: link1: No such file or directory
cat link2
aaa

1
2
3
4
5

rmfile.a

catlink1

catlink1No such fileordirectory

catlink2

aaa

Первая (символическая) ссылка оказывается битой, а по второй (жёсткой) ссылке по-прежнему находится файл с содержимым «aaa»:

Создадим новый файл с тем же именем file.a, но с другим содержимым:

Shell

echo «bbb» > file.a

1 echo»bbb»>file.a

А теперь снова попробуем прочитать его содержимое по ссылкам.

Shell

cat link1
bbb
cat link2
aaa

1
2
3
4

catlink1

bbb

catlink2

aaa

Первая (символическая) ссылка снова работает, и по ней находится новый файл, с содержимым «bbb». А вот вторая (жёсткая) ссылка всё ещё указывает на старый файл с содержимым «aaa».

В графическом интерфейсе Mac OS X папка, где мы проводили этот эксперимент, будет выглядеть следующим образом:

Система называет символьную ссылку «псевдонимом» файла. А вот жёсткую ссылку она воспринимает так же, как и обычный файл.

Жесткая ссылка (Hard link)

Предположим, вы захотели скопировать файл. В процессе копирования будет создан новый файл. Его непосредственные данные запишутся в свободное место на диске, а самому файлу система назначит уникальный идентификатор — индексный номер (сокр. «inode» от англ. «index node«).

Создавая жесткую ссылку (англ. «hard link») на файл, мы привязываемся к его индексному номеру, получая тот же самый файл (с новым именем), на который указывает ссылка, но без физического создании копии.

Для создания жесткой ссылки используется команда ln (от англ. «link»), имеющая довольно простой синтаксис:

Для примера создадим ссылку с именем hardlink1, указывающую на уже существующий файл file1:

Чтобы убедиться, что файл file1 и ссылка hardlink1, по сути, являются одним и тем же объектом файловой системы — сравним их индексные номера, выполнив команду  вместе с опциями (отображать расширенную информацию), (выводить inode) и (использовать буквы для обозначения размера):

Результат:

Как можно заметить, file1 и hardlink1 имеют общий индексный номер — . Теперь давайте создадим еще одну ссылку и посмотрим, как поведет себя счетчик ссылок (число, следующее за группой установленных ):

Результат:

Обратите внимание, теперь счетчик ссылок показывает цифру 3 вместо 2

Управление политикой

В этом разделе описываются различные функции и средства, доступные для управления этой политикой.

Перезагрузка устройства не требуется для того, чтобы этот параметр политики был эффективным.

Изменения прав пользователя вступают в силу при его следующем входе в учетную запись.

Групповая политика

Параметры применяются в следующем порядке с помощью объекта групповой политики (GPO), который перезаписывал параметры на локальном компьютере при следующем обновлении групповой политики:

  • Параметры локальной политики
  • Параметры политики сайта
  • Параметры политики домена
  • Параметры политики подразделения

Когда локальный параметр серый, он указывает, что GPO в настоящее время контролирует этот параметр.

Средства командной строки

Этот параметр можно использовать в сочетании с параметром символической системы файлов ссылок, которым можно управлять с помощью средства командной строки для управления типами symlinks, разрешенными на устройстве. Дополнительные сведения введите в командной подсказке.

Как проверить статус доступа к символическим ссылкам

Тут в ход вступает знакомая нам утилита fsutil, о которой я уже рассказывал. Недавние примеры ее применения:

  • Слишком длинный целевой путь
  • Robocopy и примеры использования с параметрами
  • Как перенести ost файл IMAP почты в Outlook

Чтобы просмотреть текущий статус параметров Symlink в вашей системе, выполните следующую команду из командной строки с повышенными привилегиями (администратора):

fsutil behavior query SymlinkEvaluation

  • Local to local symbolic links are enabled — говорит, что локальные символические ссылки, открываются локально
  • Local to remote symbolic links are enabled — говорит, что локальные символические ссылки, открываются удаленно
  • Remote to local symbolic links are disabled — Удаленные символические ссылки открываются локально, это нужно включить
  • Remote to remote symbolic links are disabled — Удаленные символические ссылки открываются удаленно, это нужно включить

Чтобы устранить ошибку «the symbolic link cannot be followed because its type is disabled» нужно включить четвертый пункт «Remote to remote symbolic links are disabled». Для этого выполните команду:

fsutil behavior set SymlinkEvaluation R2R:1

Это включит удаленные символьные ссылки на удаленном хосте. Вы не увидите никакого ответа, если команда была успешной. Чтобы убедиться, что настройка обновлена, введите оценочный запрос еще раз.

Если вам также необходимо включить оценку удаленного и локального канала, вы можете заменить R2R:1 на R2L:1 в команде настройки поведения.

fsutil behavior set SymlinkEvaluation R2L:1

Справочники

Это право пользователя определяет, могут ли пользователи создавать символическую ссылку с устройства, на которое они вошли.

Символическая ссылка — это объект файловой системы, который указывает на другой объект файловой системы. Объект, на который указывается, называется целевой. Символические ссылки прозрачны для пользователей. Ссылки отображаются как обычные файлы или каталоги, и пользователь или приложение могут действовать точно так же. Символические ссылки предназначены для обеспечения совместимости миграции и приложений с UNIX операционными системами. Корпорация Майкрософт реализовала символические ссылки, чтобы функционировать так же, как UNIX ссылки.

Рекомендации

Только доверенные пользователи должны получить это право пользователя. Символические ссылки могут подвергать уязвимости безопасности в приложениях, которые не предназначены для их обработки.

Значения по умолчанию

По умолчанию члены группы Администраторы имеют это право.

В следующей таблице приведены фактические и действующие значения по умолчанию для этой политики. Значения по умолчанию также можно найти на странице свойств политики.

Тип сервера или объект групповой политики Значение по умолчанию
Default Domain Policy Не определено
Политика контроллера домена по умолчанию Не определено
Параметры по умолчанию для автономного сервера Не определено
Действующие параметры по умолчанию для контроллера домена Администраторы
Действующие параметры по умолчанию для рядового сервера Администраторы
Действующие параметры по умолчанию для клиентского компьютера Администраторы

Что такое ссылка на файл в Linux

Ссылка на файл в Linux — это указатель на файл. Если проводить аналогию с Windows, то ссылки чем-то похожи на ярлыки. То есть вы создаете ссылку, которая указывает на какой-либо файл или директорию, и можете разместить эту ссылку в другом каталоге. Обращаясь к такой ссылке, вы будете обращаться к настоящему файлу или каталогу.

Ссылки в Linux бывают двух типов: символические и жесткие. Не смотря на то, что оба типа называются ссылками, они имеют существенные отличия друг от друга

Поэтому очень важно понимать, как создавать и использовать тот или иной тип ссылок

Что такое символические ссылки

Символическая ссылка (symbolic link) — это специальный файл, который является ссылкой на другой файл или каталог (их еще называют целевым файлом, целевым каталогом).

Символические ссылки также называют символьными, мягкими ссылками (soft links) или сим-ссылками (sym-link).

Важно понимать, что символическая ссылка не содержит в себе внутри копии самого файла, на которую она указывает. Она является всего лишь указателем на файл

Не смотря на это, символическая ссылка обладает собственными правами доступа, так как сама является небольшим файлом, который содержит путь до целевого файла.

Возвращаясь к аналогии с ярлыками в Windows, символические ссылки это своего рода ярлыки на файлы. Можно создавать несколько символических ссылок на один файл и эти ссылки могут иметь разные имена.

Связь между символической ссылкой и файлом, на который она указывает, является «мягкой». Если удалить символическую ссылку, то файл, на который она указывает, не удаляется.

Если удалить файл, на который указывает ссылка, то сама ссылка не обновляется и остается на диске. При этом она указывает на уже несуществующий файл. Аналогично, если переименовать или переместить целевой файл, то ссылка не обновляется автоматически.

При создании символических ссылок можно указывать относительный путь до целевого файла. В таком случае ссылка считает, что относительный путь указан относительно каталога, в котором создана сама ссылка (но не относительно каталога, из которого она была создана).

Схематично отношение между файлом, символической ссылкой и данными, которые хранятся в файле, можно показать следующим образом:

Что такое жесткие ссылки

Жесткая ссылка (hard link) является своего рода синонимом для существующего файла. Когда вы создаете жесткую ссылку, создается дополнительный указатель на существующий файл, но не копия файла.

Жесткие ссылки выглядят в файловой структуре как еще один файл. Если вы создаете жесткую ссылку в том же каталоге, где находится целевой файл, то они должны иметь разные имена. Жесткая ссылка на файл должна находится в той же файловой системе, где и другие жесткие ссылки на этот файл.

В Linux каждый файл имеет уникальный идентификатор — индексный дескриптор (inode). Это число, которое однозначно идентифицирует файл в файловой системе. Жесткая ссылка и файл, для которой она создавалась имеют одинаковые inode. Поэтому жесткая ссылка имеет те же права доступа, владельца и время последней модификации, что и целевой файл. Различаются только имена файлов. Фактически жесткая ссылка это еще одно имя для файла.

Жесткие ссылки нельзя создавать для директорий.

Жесткая ссылка не может указывать на несуществующий файл.

Жесткие ссылки появились раньше, чем символические, но сейчас уже устаревают. В повседневной работе жесткие ссылки используются редко.

Схематично отношение между исходным файлом, жесткой ссылкой и данными можно показать следующей схемой:

Отличия символических ссылок от жестких

Кратко подведем итог, написанного выше.

Символическая ссылка:

  • Указывает на целевой файл или каталог. Фактически является небольшим файлом, содержащим путь до целевого файла.
  • Не содержит внутри себя содержимого самого файла. Содержит путь к целевому файлу.
  • Имеет собственные права доступа, которые не распространяются на целевой файл.
  • Удаление / переименование / перемещение целевого файла не обновляет автоматически ссылку. Ссылка начинает указывать на несуществующий файл, становится неработающей.
  • Изменение прав доступа у целевого файла не обновляет права доступа у ссылки.
  • Может быть создана для директории.
  • Ссылка и целевой файл имеют разные файловые индексы (inode) в файловой системе.
  • Может указывать на несуществующий файл.
  • Символическая ссылка может использовать относительный путь до целевого файла.

Жесткая ссылка:

  • Является своего рода еще одним именем на файл.
  • Не может указывать на директорию.
  • Нельзя создавать жесткие ссылки между файлами разных файловых систем.
  • Не может указывать на несуществующий файл.
  • Жесткая ссылка и файл, для которого она создавалась, имеют одинаковые индексы (inode) в файловой системе.

Как увидеть жесткие ссылки

Символические ссылки легко определить – в файловом менеджере их видно по значку, а в результатах команды dir напротив ссылок пишется SYMLINK. Жесткие ссылки не очевидны, в прямом смысле этого слова.

Проверить уникальность блокнота можно в командной строке, . Команда fsutil покажет вам жесткие ссылки на файл:

fsutil hardlink list %windir%\notepad.exe

Сюрприз! Блокнотов в Windows 7 не два, а четыре! Как видите, еще два обнаруживаются в папке winsxs.

А в 64-разрядной Windows 7 их вообще шесть.Увеличить рисунок

Это связано с тем, что в папке System32 лежат 64-разрядные версии файлов, в том числе блокнот (я выделил еще одну занятную нестыковку Windows, уходящую корнями в прошлое).  А в папке SysWOW64 хранится 32-разрядная версия notepad.exe, которая имеет свою жесткую ссылку в папке winsxs, в чем вы можете убедиться самостоятельно.

Внушительное количество жестких ссылок подводит нас к вопросу использования ими дискового пространства.

Выводы

Чтобы полностью удалить информацию, содержащуюся в файле, для которого создано несколько жёстких ссылок, необходимо удалить каждую их них. Также, жёсткая ссылка, в силу своей природы (указывание непосредственно на область диска, где находится информация), никогда не будет «битой». Эти свойства жёстких ссылок активно используются в *nix операционных системах.

Символическая ссылка, де-факто, является «ярлыком» для файла, и в случае удаления последнего может перестать работать, т.к. будет указывать на уже несуществующий файл.

Возможностью создания символических ссылок в Windows я воспользовался для более удобной организации проектных файлов при разработке нового дизайна этого сайта. Об этой своей маленькой хитрости, позволившей мне «обмануть» один плагин для PhpStorm от JetBrains, я расскажу в следующем посте.

поддержите

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Советчик
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: