Работа с NTFS-ссылками [Philip Wiki]

Что это такое

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

Алгоритм действий

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

Например, у нас есть несистемный том «Common (F:)». Назовем созданное в нем хранилище так же как и то, из которого мы будем перемещать папки (AppData), а для отличия добавим пробел да букву диска – «App Data (F)». Открыв созданный каталог, организуем там 2 подпапки:

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

Теперь надо переместить нужные подпапки из «Roaming» диска C (пункт А) в «Roaming» диска F (пункт Б).

Перемещать директорию «Microsoft» нельзя, да это и не даст никакого полезного эффекта – там информация, которая в после переустановки системы не понадобится.

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

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

Жесткие ссылки (hard links)

Жёсткие ссылки (hard links) – это просто файловые записи, ссылающиеся на одно и то же место в области данных.

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

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

Жесткие связи поддерживаются в NTFS, начиная с NT 4.0.

Зачем операционной системе нужны эти точки соединения

Как уже было сказано выше, иерархическая структура системной оболочки стала кардинально отличаться от «Windows XP», а символьные связи, расставленные в нужных местах, успешно устраняют это отличие.Сравним иерархию системных разделов «XP» и «10».

Источники

http://www.computerra.ru
https://www.wikipedia.org
http://habrahabr.ru

Как создать жесткие ссылки

Мы выяснили, что Microsoft использует жесткие ссылки для обеспечения совместимости (пример с блокнотами) и безотказного обслуживания операционной системы (пример с папкой winsxs). Предлагаю вам самостоятельно создать жесткие ссылки и поиграть с ними.

Жесткие ссылки необязательно должны иметь такие же имена, как файл, на который они указывают. Это легко проверить:

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

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

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

fsutil hardlink list %windir%notepad.exe

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

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

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

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

Как ускорить свою работу с помощью ссылок

В комментариях все к той же записи про AppPath читатель jakv поделился своим опытом использования ссылок.

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

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

Вы уже видели, как создает ссылки fsutil. Давайте теперь сделаем это командой mklink.

:: Символическая ссылка на файл
mklink D:MyToolspe.exe D:Sysinternalsprocexp.exe
:: Жесткая ссылка на файл
mklink /h D:MyToolspe1.exe D:Sysinternalsprocexp.exe

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

В отдельном столбце проводника я отобразил атрибуты файлов, чтобы показать, что буква L обозначает символическую ссылку. Вы также можете добавить столбец «Цель ссылки», чтобы посмотреть, куда она ведет. Этот рисунок также хорошо подчеркивает разницу между жесткими и символическими ссылками. Первые являются полноценными файлами, а вторые больше похожи на ярлыки.

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

:/>  Программа Switch Virtual Router для раздачи Wi-Fi в Windows 10. Настройка Hotspot через программу

Карты для автономного использования

Если вы скачивали карты каких-либо регионов через «Параметры», то все они хранятся локально по адресу C:ProgramDataMicrosoftMapData.

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

Копирование символических ссылок


При копировании ссылок подопытные файл-менеджеры вели себя по разному.

*

Far — копировал символические ссылки как ссылки. Т.е. делал копию ссылки и не ее содержимого.

*

Explorer на каждую ссылку задавал вопрос — копировать ее как каталог или как ссылку. Но я подозреваю что такое умное поведение ему придала установленная утилита Alax.Info NTFS Links. Проверить как ведет себя Explorer на windows xp без всяких расширений я не смог, а на windows 2000 explorer ведет при копировании себя как far.

*

Все остальные подопытные копировали ссылки как каталоги.

При копировании ссылок нужно понимать, что это такое. Если ссылки копировать как файлы, то я например не смогу скопировать свою папочку «ИНТЕРНЕТ» в ближайшее время. Если же копировать ссылки как ссылки, то может оказаться, что скопированный на другой hdd в фаре каталог с фильмами у друга не откроется, так как внутри были символьные ссылки.

Тут я решил проверить, а поддерживают ли архиваторы символические ссылки. Оказалось что нет. Все архиваторы из моей коллекции (в том числе 7Z, winrar ) не сохраняют символические ссылки. К сожалению в моей коллекции не оказалось портированных архиваторов вроде tar-а. Надеюсь, что программы из линукса опять помогут.

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

Офисный пакет

Контейнеры «Roaming» и «Local» имеют подпапки «Microsoft», которые не стоит трогать целиком, а вот некоторое внутреннее содержимое стоит перенаправить.

Это различные вспомогательные папки классического (не APPs) пакета «Microsoft Office», если конечно вы им пользуетесь:

  • Шаблоны. Содержит основной рабочий шаблон Normal.dotm, используемый редактором «WinWord» по умолчанию, а также темы.
  • UProof. Здесь хранятся пользовательские орфографические словари.
  • QuickStyles. Тут – шаблоны экспресс-стилей.
  • Office (Local). Содержат файлы настроек для всех приложений пакета и некоторые другие данные.

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

Перенаправление папок при помощи символических ссылок

Небольшое вступление

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

Перенаправление многих пользовательских директорий можно осуществить штатными средствами, но это всего лишь малая толика из того, что рекомендуется хранить в несистемном дисковом разделе. Каждая программа и утилита, которую вы запускаете (кроме портативных конечно), организовывает в контейнерах «Roaming» и «Local» (родительская директория – «AppData») свои собственные хранилища, где осуществляет запись/чтение данных, необходимых для сохранения настроек интерфейса, параметров работы, а также многого другого.

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

Если же перенаправить все хранилища программных настроек заблаговременно, то они будут защищены от потери, по крайней мере «с этой стороны». Но это не вся выгода – после переустановки ОС соединение с ними легко восстанавливается повторным созданием символьных связей.

Поиск.

Создадим каталог

X:00


В нем создадим файл text.txt и символическую ссылку 111 на этот же каталог X:00

Вот что выдадут при поиске файла наши подопытные файл-менеджеры кроме Far-а

X:00text.txt

X:00111text.txt


X:00111111text.txt

X:00111111111text.txt

X:00111111111111text.txt

X:00111111111111111text.txt


X:00111111111111111111text.txt

X:00111111111111111111111text.txt

X:00111111111111111111111111text.txt

X:00111111111111111111111111111text.txt


X:00111111111111111111111111111111text.txt

X:00111111111111111111111111111111111text.txt

X:00111111111111111111111111111111111111text.txt

X:00111111111111111111111111111111111111111text.txt


X:00111111111111111111111111111111111111111111text.txt

X:00111111111111111111111111111111111111111111111text.txt

Радует что рекурсия прервалась так рано. Но все равно такое поведение неправильно и может привести к ошибкам. Тут мы нашли один и тот же файл 16 раз. Многие программы для поиска дубликатов предложат удалить этот файл, как дубликат. Хотя на самом деле файл вполне уникален. А вот Far, оказывается, при поиске вообще не переходит по символическим ссылкам.

Послесловие

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

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

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

:/>  Использование символических и жестких ссылок в Windows -

Жесткие ссылки
Увеличить рисунок

Программы

По моему мнению, на данный момент, лучшей программой для работы с ntfs-ссылками является Link Shell Extension (LSE).

Размер каталога

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

image


Среди подопытных программ правильно определили размер только WinDirStat и Explorer.

С эксплорером все понятно — он и реализация символических ссылок в windows детище одной и той же фирмы и было бы странно если они неправильно использовали свой же механизм ссылок. А вот WinDirStat так хорошо знаком со ссылками, наверное потому, что родом из Linux.

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

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

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

В Windows 7 и Windows 8 блокнот присутствует в обеих папках, но на диске размещен только один файл notepad.exe.

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

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

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

Рекурсия.

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

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

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

Символическая ссылка (символьная ссылка, symbolic links) — доступна с Windows Vista. Может указывать и на файлы, и на директории.

Стоит заметить, что при доступе по сети, символические (symbolic) ссылки разрешаются на стороне клиента, в отличие от точки соединения (junctions). Т.е. для публикации каталогов в сети желательно использовать именно junctions-связи.

Сравнение разновидностей ссылок

Для примера возьмем символьные связи, создаваемые самой системой. Откроем контейнер пользовательского профиля и включим отображение скрытых элементов (Виндоус 10 – команда на ленте, Виндоус 7 – через «Параметры папки»). Для наглядности сгруппируем элементы по их атрибутам.

Группа «HSDLI» собрала объекты, которые необходимы старым программам для совместимости с новыми версиями «Windows». Они относятся к символическим связям, но имеют более раннее происхождение и называются «Junction Point». Иными словами, их можно назвать подвидом символических ссылок, обладающим урезанными возможностями.

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

Рассмотрим свойства двух разновидностей символьных связей, сделанных для одного каталога «Roaming». Первая создана системой в виде «Junction Point», вторая сформирована пользователем и представляет собой «Symbolic Link».

Как видно на иллюстрации, во втором варианте присутствует вкладка «Ярлык», такая же, как у обычной иконки с Рабочего стола. Помимо этого в первом варианте отсутствует информация о пути к реальному хранилищу – цели ссылки. То есть, его свойства более близки к параметрам настоящей директории, а значит, воспринимаются Проводником точнее.

Теперь зайдем в каталог «AppData», создадим простой ярлык для папки «Roaming» c именем «Application Data», а затем переместим его в родительский каталог. Сгруппируем содержимое окна по типу.

Видно, что Проводник воспринимает ярлыком лишь тот объект, который таковым непосредственно и является – два других воспринимаются как директории.Откроем «Свойства» обыкновенного ярлыка и сравним их с параметрами символической ссылки.

В 1-м случае заблокированных элементов нет, во 2-м – заблокировано все, кроме кнопки «Расположение файла» да поля с наименованием объекта на вкладке «Общие». Это говорит о том, что символьная связь формируется «намертво» – изменить в ней что-либо невозможно, за исключением имени.

:/>  СДМ ГРУПП: отзывы сотрудников о работодателе

Проведем для наглядности небольшой эксперимент.

Создадим папку с именем «А», а также символическую ссылку на нее, но под другим названием (Б), так как в противном случае это нам не удастся – невозможно сформировать 2 директории с одинаковыми именами. Теперь сотворим простой ярлык для этой же папки – его наименованием может стать как «А», так и «Б». Системе это безразлично, ибо она воспринимает их, как 2 совершенно разных элемента.

Далее переименуем исходную папку (АБ) и попробуем открыть его с помощью «Symbolic Link» (Б). Операция стала невозможной, так как путь к цели стал иным, а соединение с ней разорвалась. Теперь испытаем обычный ярлык – переход происходит без проблем. Активировав его «Свойства», можно увидеть, что первоначальный путь к хранилищу автоматически изменился.

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

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

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

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

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

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

Точка монтирования (junction points)

NTFS начиная с версии NT 5.0 (Windows 2000/XP) поддерживает точки монтирования (точки соединения, точки монтирования каталогов, junction points, directory junctions). Точки монтирования каталогов в Windows 2000/XP известны как «directory junctions» — технология, позволяющая отображать любые локальные папки на любые другие локальные папки. Например, если папка D:SYMLINK указывает на C:WINNTSYSTEM32 в качестве своей цели, то программа, обращающаяся к D:SYMLINKDRIVERS, будет на самом деле обращаться к C:WINNTSYSTEM32DRIVERS.

Напрямую делать точки соединения на папки CD-ROM нельзя, но можно это ограничение обойти, смонтировав CD-ROM диск на папку NTFS-раздела.

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

Не удаляйте точку соединения с помощью проводника, команды del /s или других средств файловой системы, рекурсивно работающих с деревьями каталогов. Данные средства воздействуют на целевой каталог и все его подкаталоги. Для безопасного удаления точек соединения рекомендуется использовать только специальные утилиты для работы с точками соединения (начиная с Windows 7 Проводник позволяет безопасно удалять точки соединения).

Точка монтирования тома (volume mount point)

Всего существует два вида точек монтирования: точка монтирования каталога (junction point, о ней писалось выше) и точка монтирования тома (volume mount point). Различает их только источник монтирования (как следует из названия – каталок и том).

Удаление символических ссылок.

При удалении символических ссылок отличились Frigate3 и Servant Salamander. Они не только удалили ссылку, но и заботливо очистили содержимое каталога на который она ссылалась. Остальные подопытные удалили только ссылку.

Выводы.

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

ЗЫ. Оказывается не хватает кармы, что бы писать в тематический блог. Ну да ладно. Может и тут кому полезно будет.

UPD: Эксперименты проводились в Microsoft Windows XP Home Edition 32bit SP3Total Commander 7.04aFar 1.70Servant Salamander 2.0WinDirStat 1.1.2.80 (Unicode)Frigate 3.21.2.71Explorer 6.00.2900.5512

Учел замечание Busla и поменял перевод Symbolic link на более распространенный вариант.

UPD2:Дабы еще раз уточнить о чем речь и убрать разногласия в терминологии посеянные с легкой руки MS.Полистав msdn я так понял, что в конце концов в MS пришли к единому мнению. Вроде как. И в Windows Vista сделали некие symbolic link которые создаются функцией CreateSymbolicLink .

А те символьные == символические == мягкие ссылки которые были (и есть) в ранних версиях Windows (2000,XP) являются некими reparse point. И создаются примерно так:memset(reparseInfo, 0, sizeof(*reparseInfo));reparseInfo->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;

reparseInfo->ReparseTargetLength =_tcslen(targetNativeFileName) * sizeof(WCHAR);reparseInfo->ReparseTargetMaximumLength =reparseInfo->ReparseTargetLength sizeof(WCHAR);_tcscpy(reparseInfo->ReparseTarget, targetNativeFileName);reparseInfo->ReparseDataLength = reparseInfo->ReparseTargetLength 12;

DeviceIoControl(hFile,FSCTL_SET_REPARSE_POINT,reparseInfo,reparseInfo->ReparseDataLength REPARSE_MOUNTPOINT_HEADER_SIZE,NULL,0,&returnedLength,NULL);

Так вот, поскольку у меня не виста, речь идет о reparse point. Хотя я предполагаю, что и symbolic link тоже преподнесут сюрприз неоднозначным поведением в разных программах. Ибо проблема в основном не в ссылках, а в том что некоторые программисты про них забывают.

Оставьте комментарий

Adblock
detector