Чем отличается жесткая ссылка от символьной ссылки
Перейти к содержимому

Чем отличается жесткая ссылка от символьной ссылки

  • автор:

Записки IT специалиста

Работаем с жесткими и символическими ссылками в Windows

  • Автор: Уваров А.С.
  • 11.05.2022

windows-hardlink-and-symlink-000.pngЖесткие и символические ссылки давно знакомы и активно используются Linux-администраторами, в то время как их Windows коллеги используют их гораздо реже, а некоторые вообще не знают о такой возможности. Тем не менее такая возможность в Windows существует и позволяет значительно упростить некоторые сценарии работы с папками и файлами. В данной статье мы рассмотрим все виды ссылок, доступные в среде ОС Windows, а также разные способы работы с ними, начиная от командной строки и заканчивая PowerShell.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

Жесткие ссылки (HardLink)

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

Мы можем переименовывать, копировать, перемещать (в пределах логического тома) ссылки — размер занимаемого места при этом не изменится. При удалении ссылок файл продолжает существовать до тех пор, пока не будет удалена последняя жесткая ссылка на него. Фактически отличить, где находится оригинальный файл, а где жесткая ссылка невозможно, по сути, файл на разделе это и есть жесткая ссылка.

Жесткая ссылка может существовать только в пределах логического тома, поддерживается файловыми системами NTFS и ReFS начиная со сборки 19536.

Для создания жесткой ссылки можно воспользоваться утилитой mklink:

Где ключ /H предписывает создать именно жесткую ссылку, далее следует путь к новому файлу и целевому файлу, на который мы делаем ссылку. Путь можно указывать как абсолютные, так и относительные, в имени создаваемого файла не забывайте указывать расширение.

windows-hardlink-and-symlink-001.png

Ссылки можно создавать и при помощи PowerShell, для этого воспользуйтесь командой:

Команда другая, но принцип тот же самый: -ItemType — тип создаваемой ссылки, в нашем случае жесткая ссылка, -Path — путь к создаваемому файлу ссылки, -Target — файл на который мы делаем ссылку.

windows-hardlink-and-symlink-002.png

Можно ли сделать жесткую ссылку на директорию? Нет, только на файлы.

Вроде бы все понятно, но если внимательный читатель заглянет в свойства папки с жесткой ссылкой, то он увидит, что ее размер равен исходному файлу, если сделаем в ней еще одну жесткую ссылку — двум исходным файлам. Как так? Не стоит переживать, все нормально. Для операционной системы жесткая ссылка ничем не отличается от обычного файла и при подсчете свободного места учитывается размер каждой ссылки, но на самом деле на диске хранится единственная копия. В этом можно убедиться, если одновременно с созданием жестких ссылок контролировать свободное место на диске.

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

windows-hardlink-and-symlink-003.png

Какой вывод можно сделать из того, что мы увидели и где нам могут пригодиться жесткие ссылки? Прежде всего для предоставления пользователям доступа к объемным архивам, образам или инсталляционным пакетам. Скажем у вас есть файловый сервер и несколько отделов, каждому из которых нужно предоставить доступ к одному и тому же большому файлу. При этом вы можете не бояться, что кто-то удалит файл, он удалит его только у себя в директории, для остальных пользователей он останется доступен.

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

Точки соединения (Junction)

Очень старая технология, поддерживаемая еще начиная с Windows 2000, позволяет сделать один из каталогов псевдонимом другого каталога. Чем-то напоминает символические ссылки, но в крайне упрощенном варианте. В качестве цели можно использовать только локальные папки, но при этом нет ограничения по размещению их на одном томе. Т.е. целевая папка может находиться на диске C:, а точка соединения для нее на диске D: и все будет работать. Точки соединения поддерживаются файловыми системами NTFS и ReFS.

Для создания точки соединения можно использовать mklink:

Ключ /J указывает на создание точки соединения, далее следует папка каталога-псевдонима и папка целевого каталога. При любом изменении целевого каталога (перемещение, переименование, удаление) точка соединения перестает работать.

Обратите внимание, что данная папка в проводнике отображается как ярлык, а выводе команды dir как точка соединения.

windows-hardlink-and-symlink-004.png

Это же действие в PowerShell:

Комментировать здесь особо нечего, краткость не входит в число добродетелей PowerShell, но не оставляет места догадкам, все просто и понятно.

Зачем сейчас нужны точки соединения? После появления в NT 6.0 настоящих символических ссылок не нужны, но вы можете встретиться с ними как в устаревших системах, так и в современных, где они могут присутствовать в виде наследия. Поэтому знать о них и уметь с ними работать современному администратору надо.

Символические ссылки (SymbolicLink)

Пожалуй, самый популярный вид связи, позволяет создавать множество псевдонимов для файлов или каталогов размещая их на любых поддерживаемых локальных файловых системах. В качестве цели могут быть использованы как локальные, так и сетевые объекты. При создании символической ссылки можно использовать как абсолютные, так и относительные пути. Но в последнем случае вы не можете перемещать ссылку — она перестанет работать. Символические ссылки поддерживаются начиная с NT 6.0 (Vista и Server 2008) и работают с файловыми системами NTFS и ReFS.

Для создания символических ссылок можно использовать mklink, без параметров она создает симлинк для файла:

При создании ссылки не забываем указать расширения для файла. Как и в случае с точкой соединения символическая ссылка отображается в виде ярлыка и обозначается в выводе команды dir:

windows-hardlink-and-symlink-005.png

Для создания символической ссылки на директорию добавьте ключ /D:

В PowerShell все проще, тип объекта будет определен автоматически:

Если в качестве цели указан файл — будет создана ссылка на файл, каталог — ссылка на каталог.

При переименовании, перемещении или удалении исходного файла или каталога все символические ссылки работать перестанут:

windows-hardlink-and-symlink-006.png

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

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал

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

В UNIX-системах, к которым относится и Linux, используется принцип «все является файлом» (собственно файлы, диски, устройства и т.д.). Для расширения возможностей управления доступом к файлам и устройствам используется механизм ссылок. Существуют жесткие и символические ссылки. В данном руководстве мы на простых примерах рассмотрим различия между ними.

Для создания ссылок используется команда ln. Ее синтаксис следующий:

Жесткие ссылки

Жесткая ссылка работает как зеркальная копия оригинального файла. Эти ссылки используют одни и те же индексные дескрипторы (иноды). Изменения в одном из файлов, связанных жесткой ссылкой, отразятся в другом. При удалении жесткой ссылки с другим файлом ничего не произойдет. Жесткие ссылки не могут связывать различные файловые системы. Синтаксис для создания жесткой ссылки следующий

В качестве источника может быть только файл, но не каталог.

Примеры жестких ссылок

Создадим директорию Test и файл sample1 внутри нее:

Теперь создадим жесткую ссылку на sample1 и назовем ее sample 2:

При помощи опции –i команды ls отобразим номера инодов для обоих файлов:

Получим следующий результат:

Из результата видно, что у обоих файлов sample1 и sample2 один номер инода (13058490). Кроме того, у файлов одинаковый размер и права доступа.

Теперь удалим оригинальный sample1

После удаления связанного жесткой ссылкой оригинального файла проверим содержимое «ссылки» sample2:

Должно быть выведено содержимое файла, в примере это «тестовый файл».

  1. Исходя из рассмотренных примеров можно сделать следующий вывод:
  2. Жесткие ссылки используют один номер инода.
  3. Команда ls -l показывает все ссылки, а в столбце ссылок выводит их количество.
  4. У файлов ссылок есть реальное содержимое
  5. Удаление любой ссылки уменьшает количество ссылок, но никак не влияет на другие ссылки.
  6. Нельзя создать жесткую ссылку на директорию.
  7. Даже при удалении оригинального файла жесткая ссылка будет показывать содержимое.

Символические ссылки

Символическая, или мягкая ссылка – это действительно ссылка на оригинальный файл (аналогичная ярлыкам в Windows-системах). Символическая ссылка указывает на оригинальный файл, поэтому при удалении этого файла символическая ссылка перестанет работать. При удалении символической ссылки с файлом ничего не произойдет. Это связано с тем, что инод самого файла или директории отличается от инода файла, создаваемого для символической ссылки. Символические ссылки могут связывать разные файловые системы.

Синтаксис для создания символической ссылки такой же как и для создания жесткой ссылки, только используется опция «-s»

В качестве источника может быть файл или каталог.

Примеры символических ссылок

Создадим символическую ссылку (опция -s) на sample2 из предыдущего раздела при помощи следующей команды:

Отобразим номера инодов для обоих файлов:

Результат будет следующим:

Видно, что номера инодов разные, а у символической ссылки другие права доступа (rwxrwxrwx), перед которыми указано l, так как это символическая ссылка.

Теперь можно вывести содержимое файла и символической ссылки:
$ cat sample2
$ cat sample3

Удалим оригинальный файл

А затем проверим содержимое директории Test:

В ней еще будет символическая ссылка sample3, но при попытке вывести ее содержимое вы получите сообщение об отсутствии такого файла или директории:

Таким образом, основные особенности символических ссылок следующие:

  1. Символические ссылки используют различные номера инодов.
  2. Команда ls -l показывает все ссылки со значением 1 во втором столбце, а ссылка указывает на оригинальный файл.
  3. Символическая ссылка содержит путь к оригинальному файлу, но не его содержимое.
  4. Удаление символической ссылки ни на что не влияет, но при удалении оригинального файла она становится «пустой» ссылкой на несуществующий файл.
  5. Можно создать символическую ссылку на директорию.

Заключение

Мы разобрали ключевые различия между жесткими и символическими ссылками. Это поможет вам лучше разобраться с доступом к файлам и запуском программ. Для более подробной информации о команде ln и ее опциях можно обратиться к соответствующей man-странице.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Чем отличается жесткая ссылка от символьной ссылки

Разрывающаяся цепь

В одном из предыдущих постов я описывал процесс создания символических ссылок в Windows, где упомянул, что помимо них существуют ещё жёсткие ссылки. Там же я обещал отдельно рассказать об их отличии друг от друга.

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

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

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

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

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

clip_image001

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

clip_image002

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

clip_image003

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

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

clip_image004

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

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

clip_image005

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

clip_image006

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

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

clip_image007

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

Выводы

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

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

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

Полезная статья? Их будет больше, если вы поддержите меня!

Жесткие и Символьные ссылки в Linux

Ссылка в Unix-подобных системах — это своего рода указатель, напоминающий указатели в языках программирования, с той лишь разницей, что он указывает на файл или каталог. Ссылки позволяют нескольким именам файлов ссылаться на один и тот же файл, расположенный где-то в другом месте. В Linux-системах существуют два разных типа ссылок: символьная (или «мягкая», «символическая») ссылка и жесткая ссылка. На этом уроке мы разберем, чем символьная ссылка отличается от жесткой, и как с ними работать.

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

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

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

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

$ ln целевой_файл имя_ссылки

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

$ ln file1 hardlink1

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

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

$ ln file1 hardlink2
$ ls –lih

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

Символьная ссылка (Symbolic link)

Символьная ссылка (сокр. «symlink» от англ «symbolic link«), в отличие от жесткой ссылки, указывает не на индексный номер файла, а на его имя (путь). В каком-то роде символьная ссылка является аналогом ярлыка в Windows-системах.

Символьную ссылку можно создать с помощью той же команды ln , добавив к ней опцию -s :

$ ln -s file1 symlink1

При этом будет создан новый (!) объект файловой системы с именем symlink1, указывающий на существующий файл file1:

Буква l в группе прав доступа к файлу сигнализирует нам о том, что этот файл является символьной ссылкой на другой файл, что также отражено в имени файла — symlink1 -> file1 .

Сравним индексные номера file1, hardlink1, hardlink2 и symlink1:

Видно, что индексный номер symlink1 отличается от других номеров, так как для файловой системы это уже два независимых объекта. Также заметно и различие в наборе прав.

Жесткие ссылки vs. Символьные ссылки

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

Жесткие ссылки:

не могут пересекать границы файловой системы (т.е. жесткая ссылка работает только в пределах своей файловой системы);

нельзя использовать с директориями;

имеют inode и разрешения исходного файла;

разрешения будут обновляться при изменении разрешения исходного файла;

связаны с содержимым исходного файла. Если вы создадите жесткую ссылку на файл и измените содержимое файла (или ссылки), то изменения будут присутствовать в обоих объектах;

с помощью жесткой ссылки вы можете просматривать содержимое файла, даже если исходный файл перемещен или удален.

Символьные ссылки:

могут пересекать границы файловой системы;

можно использовать с директориями;

имеют свои собственные (отдельные) inode и права доступа;

разрешения не будут обновляться;

связаны только с именем (путем) исходного файла, а не с его содержимым; удаление символьной ссылки не приводит к удалению файла;

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

Удаление ссылок

Если вы удалите жесткую ссылку, то связанный с ней файл будет существовать, пока существует хотя бы одна жесткая ссылка на него. Если вы удалите исходный файл, но при этом в другом месте сохранится жесткая ссылка на него, то «сменится» каталог размещения файла. В качестве примера добавим в наш file1 строку «Welcome to Ravesli.com» , удалим файл, а затем попробуем обратиться к жесткой ссылке hardlink2:

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

При удалении файла, на который указывает символьная ссылка, сама ссылка просто станет нерабочей. Например, удалим файл file1, на который у нас есть символьная ссылка symlink1:

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

$ file file1
file1: cannot open `file1′ (No such file or directory)
diego@debian:

$ file symlink1
symlink1: broken symbolic link to file1
diego@debian:

Заключение

Ссылки являются неотъемлемой частью Linux-систем и часто помогают в навигации и изучении файловой системы. Если у вас остались какие-то вопросы, то не стесняйтесь задавать их в комментариях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *