Page 1
Стандартный

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

Механизм ссылок и в Windows, и Linux позволяет существенно упростить организацию файлов и каталогов, предоставляя доступ к файлам, находящимся в “неудобном” месте в плане доступности на жестком диске.

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

Ссылки бывают двух типов (в Windows так же различают junction point и symbolic link):

  • Символьные. Сюда относятся Junction points и Symbolic link
  • Жесткие. Hardlinks

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

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

Википедия

Символьная ссылка лишь указывает на исходный файл. Но не надо путать символьную ссылку с ярлыками. Ярлыки – файлы с расширением .destkop в Linux и .lnk в Windows для файлов и директорий. Работа с ярлыками реализована с помощью высокоуровневого ПО (т.е. при написании программ придется особым образом распознавать и обрабатывать ярлыки), тогда как работа с символическими ссылками и жесткими реализована в драйверах файловых систем, что тоже не со всех сторон есть хорошо, т.к. большинство программ не распознает символические ссылки, что приводит к рекурсии. Например, если в каталоге будет ссылка на сам каталог, то поиск в исходном каталоге рекурсивно зациклится. Так же symlink’и не ограничены действием в пределах разных разделов, чем не могут похвастаться жесткие ссылки.

Junction Points

Теперь поговорим о Junction Points в NTFS. Это классное нововведение появилось в NTFS 5 вместе с Windows NT. Junction Points позволяют имитировать присутствие каталога на каком либо разделе. Это возможность мне очень помогла недавно, но об этом позже.

Рассмотрим на примере. У нас есть каталог D:\Folder, и есть junction point (символьная ссылка) C:\FolderJP, у которой указан целевой объект D:\Folder. Обращаясь к C:\FolderJP\AnotherFolder фактически мы обращаемся к D:\Folder\AnotherFolder. И программа, обращающаяся к данному каталогу, будет считать, что она обращается к логическому диску C, а не к D, где на самом деле находится исходный каталог.

snap1

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

На этом о символических ссылках всё. Для меня всё. О символических ссылках можно еще много интересностей написать, но мне лень. Я хотел уделить особое внимание именно Junction Points, что я и сделал.

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

Жёсткой ссылкой (англ. hard link) в UFS-совместимых файловых системах называется структурная составляющая файла — описывающий его элемент каталога.

Файл в UFS представляет собой структуру блоков данных на диске, имеющую уникальный индексный дескриптор (или i-node) и набор атрибутов (метаинформацию).

Снова Википедия

Каждый файл представляет собой область данных на жестком диске компьютера или на другом носителе информации, которую можно найти по имени. В файловых системах Linux  и Windows содержимое файла связывается с его именем при помощи жестких ссылок. Создание файла с помощью любой программы означает, что будет создана жесткая ссылка – имя файла, и открыта новая область данных на диске. Причем количество ссылок на одну и ту же область данных (файл) не ограничено, то есть у файла может быть несколько имен. На самом деле вся информация о файлах хранится в индексных дескрипторах.  Один файл, один дескриптор, множество возможных имен привязанных к индексному дескриптору. Все дескрипторы пронумерованы. И выходит так что все операции с файловой системой (создание, удаление, перемещение файлов) производятся с индексными дескрипторами. Пока существует хотя бы одна жесткая ссылка на файл, этот файл существует. Как только число ссылок на файл станет равным 0, содержимое файла удалится.

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

Если мы изменяем файл, обращаясь к нему по какой-либо hardlink, мы изменяем именно сам файл. Об этом стоит помнить. Таким образом жесткая ссылка – одно имя из возможного множества.

Как создать ссылку

И Windows и Linux предоставляют системные утилиты для создания ссылок.

Для Windows начиная с Win Vista  – это утилита mklink для создания символьных и жестких ссылок

Для всех версий Linux – системная утилита ln

 Сторонний софт для Windows

Расширения для Explorer

NTFS Link и NTFS Links два практически ничем не отличающихся плагина.

Link Shell Extension – еще один аналог

Консольная утилита от всеми любимого Руссиновича:

Junction

 Классные Junction Points

Использование Junction Point меня не так давно очень выручило. Мне необходимо было поставить Qt вместе с QtCreator’ом под Вендой. Но о УЖАС! места на диске C:\ катастрофически мало осталось!1

Что же делать?! Qt то мне нужно, а никуда кроме системного раздела эта редиска ставится не хочет – спросил себя я.

Немного посидев я вспомнил о ссылках в Windows. Поскреб по сусекам инфу и нашёл решение! На помощь мне пришли junction points, которые обманули беднягу компилятор и всех его  друзей.

А для такого ловкого обмана я всего лишь

  • установил Qt на диск C:\ (благо хватило место установить его, но ведь с несколькими сотнями мегабайт на системной диске нормально не поработаешь)
  • переместил папку Qt на другой диск, на котором было достаточно места
  • воспользовался утилитой Руссиновича

  • запустил Qt Creator и скомпилил Hello World!
  • ???????
  • Работает!

Спасибо за Внимание!

Источники:

http://habrahabr.ru/post/50878/ - “Ссылки в Windows, символьные и не только”

http://habrahabr.ru/post/51294/ – “Непредсказуемые символические (символьные) ссылки в Windows”

 

UPD:

Как оказалось встроенная в OS Win утилита mklink вполне себе годна, начиная с Win7. Поэтому можно не совершать лишних движения по поиску утилиты Junction от Руссиновича, а просто использовать стандартную Win утилиту.