Команда ln в Linux. Создание мягких и жестких ссылок

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

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

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

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

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

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

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

mklink /H C:\Folder1\LinkFileName C:\Folder\FileName

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

windows-hardlink-and-symlink-001.pngСсылки можно создавать и при помощи PowerShell, для этого воспользуйтесь командой:

New-Item -ItemType HardLink -Path C:\Folder1\LinkFileName -Target C:\Folder\FileName

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

windows-hardlink-and-symlink-002.pngМожно ли сделать жесткую ссылку на директорию? Нет, только на файлы.

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

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

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

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

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

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

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

mklink /J D:\LinkFolder C:\Folder

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

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

windows-hardlink-and-symlink-004.png

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

New-Item -ItemType Junction -Path D:\LinkFolder -Target C:\Folder

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

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

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

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

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

mklink C:\Folder1\LinkFileName C:\Folder\FileName

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

windows-hardlink-and-symlink-005.pngДля создания символической ссылки на директорию добавьте ключ /D:

mklink /D D:\LinkFolder C:\Folder

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

New-Item -ItemType SymbolicLink -Path C:\Folder1\LinkFileName -Target C:\Folder\FileName

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

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

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

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

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

В этом руководстве вы узнаете, как использовать команду ln для создания символических ссылок в Linux.

Команда Ln


Команда Ln для создания символических ссылок

Чтобы использовать команду ln, откройте окно терминала и введите команду в следующем формате:

ln [-sf] [source] [destination]
  • По умолчанию команда ln создает hard link (жесткая ссылка).
  • Используйте параметр -s, чтобы создать символическую ссылку, она же soft link.
  • Параметр -f заставит команду перезаписать уже существующий файл.
  • Source – это файл или каталог, на который делается ссылка.
  • Destination – это место для сохранения ссылки – если это поле не заполнено, символическая ссылка сохраняется в текущем рабочем каталоге.

Например, создайте символическую ссылку с помощью:

ln -s test_file.txt link_file.txt

Это создает символическую ссылку link file.text, которая указывает на testfile.txt.

Чтобы проверить, создана ли символическая ссылка, используйте команду ls:

ls -l link_file.txt

ls -l link_file.txt


Создать символическую ссылку на каталог Linux

Символическая ссылка может относиться к каталогу. Чтобы создать символическую ссылку на каталог в Linux:

ln -s /mnt/external_drive/stock_photos ~/stock_photos

В этом примере создается символическая ссылка с именем stock_photos в домашнем каталоге ~ /. Ссылка относится к каталогу stock_photos на внешнем диске external_drive.

ln -s /mnt/external_drive/stock_photos ~/stock_photos

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


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

Вы можете получить сообщение об ошибке, как показано на изображении ниже:

File exists

Сообщение об ошибке означает, что в месте назначения уже есть файл с именем link_file.txt. Используйте параметр -f, чтобы система перезаписывала целевую ссылку:

ln -sf test_file.txt link_file.txt

ln -sf test_file.txt link_file.txt

Примечание. Использование опции -f навсегда удалит существующий файл.


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

Если исходный файл будет перемещен, удален или станет недоступным (например, сервер отключится), ссылку нельзя будет использовать. Чтобы удалить символическую ссылку, используйте команду rm (remove) или unlink:

rm link_file.txt
unlink link_file.txt

No such file


Soft Links против Hard Links

Команду ln можно использовать для создания двух разных типов ссылок:

  • Hard Links (жесткие ссылки)
  • Soft Links (символические или мягкие ссылки)

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

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

Вот несколько важных аспектов символической ссылки:

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

Жесткие ссылки (Hard Links)

Когда файл хранится на жестком диске, происходит несколько вещей:

  • Данные физически записываются на диск.
  • Создается справочный файл, называемый индексом, который указывает на расположение данных.
  • Имя файла создается для ссылки на данные inode.

Жесткая ссылка работает путем создания другого имени файла, которое ссылается на данные inode исходного файла. На практике это похоже на создание копии файла.

Вот несколько важных аспектов жестких ссылок:

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


Рекомендуем

Товарищи, добрый день.  Хотя эта тема и не самая популярная, но она мне очень много раз выручала, поэтому я не могу о ней не написать. Итак, что значит термин «символьная ссылка» я возьму из энциклопедии Wikipedia:

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

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

:/>  Как восстановить календарь на андроид

Создать символьную ссылку очень просто и сейчас я вам это докажу. Открываем командную строку, нажимаем Win+R, вводим cmd и жмём ОК. Хотя если вы собираетесь работать с системными файлами, может понадобиться командная строка с правами администратора.

Создать символьную ссылку очень просто и сейчас я вам это докажу. Открываем командную строку, нажимаем Win+R, вводим cmd и жмём ОК.

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

mklink /j "путь, где будет создана символьная ссылка" "путь, где находятся исходный файл или папка"

где /j — атрибут создания соединения для каталога. Если вы создаете ссылку на файл, атрибут ставить не надо.

К примеру, если я хочу создать символьную ссылку на папку mklink на локальном диске E, как папку mk на диске С, мне нужно ввести следующую команду (и да, символьная ссылка может называться не так, как исходный файл (папка):

mklink /j "C:\mk" "E:\mklink"

002

В результате мы получим вот это.

003

Если же мы хотим создать символьную ссылку на файл, например на файл 1.txt, хранящийся в корне диска E. для использования в виде файла 2.txt. скажем в папке mslink на диске C, команда будет выглядеть вот так:

mklink "C:\mslink\2.txt" "E:\1.txt"

004

А на выходе получим вот это.

005

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

Материал сайта geekteam.pro

Время на прочтение

Третий отрывок из перевода первой части руководства. Предыдущие: первый, второй.

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

Создание ссылок и удаление файлов

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

Мы уже упоминали термин «ссылка», когда рассказывали о взаимоотношениях между директориями (их именами) и инодами (индексным номерами, лежащими в основе файловой системы, которых мы не замечаем). Вообще в Linux существует два типа ссылок. Тип, о котором мы уже говорили ранее, называется «жесткие ссылки». Каждый инод может иметь произвольное число жестких ссылок. Когда уничтожается последняя жесткая ссылка, и не одна программа не держит файл открытым, то Linux автоматически удаляет его. Новые жесткие ссылки можно создать воспользовавшись командой ln:

$ cd /tmp
$ touch firstlink
$ ln firstlink secondlink
$ ls -i firstlink secondlink
15782 firstlink 15782 secondlink

Как видите, жесткие ссылки работают на уровне инодов, для указания конкретного файла. В Linux системах, для жестких ссылок есть несколько ограничений. В частности, можно создавать жесткие ссылки только на файлы, не на директории. Да-да, именно так; хотя “.” и “..” являются созданными системой жесткими ссылками на директории, вам (даже от имени пользователя «root») не разрешается создавать любые свои собственные. Второе ограничение жестких ссылок состоит в том, что нельзя связать ими несколько файловых систем. Это значит, что у вас не получится создать жесткую ссылку с /usr/bin/bash на /bin/bash и если ваши директории / и /usr находятся в разных файловых системах (разделах — прим. пер.).

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

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

Символические ссылки можно создать передав для ln опцию -s.

$ ln -s secondlink thirdlink
$ ls -l firstlink secondlink thirdlink
-rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 firstlink -rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 secondlink lrwxrwxrwx 1 agriffis agriffis 10 Dec 31 19:39 thirdlink -> secondlink

В выводе ls -l символьные ссылки можно отличить тремя способами. Во-первых, обратите внимание на символ l в первой колонке. Во-вторых, размер символической ссылки равен количеству символов в ней (secondlink в нашем случае). В-третьих, последняя колонка в выводе показывает куда ведет ссылка с помощью интуитивного обозначения “->”.

Симлинки детально

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

Предположим, что мы хотим создать ссылку в /tmp, которая указывает на /usr/local/bin. Нам следует набрать:

$ ln -s /usr/local/bin bin1
$ ls -l bin1
lrwxrwxrwx 1 root root 14 Jan 1 15:42 bin1 -> /usr/local/bin

Либо, альтернативный вариант:

$ ln -s ../usr/local/bin bin2
$ ls -l bin2
lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin

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

$ ls -l bin2
lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin


$ mkdir mynewdir
$ mv bin2 mynewdir
$ cd mynewdir
$ cd bin2
bash: cd: bin2: No such file or directory

Потому, что директории /tmp/usr/local/bin не существует, мы больше не можем переместиться в bin2; другими словами, bin2 сейчас сломана.

По этой причине, избегать создания ссылок с относительной информацией о пути, иногда будет хорошей идеей. Тем не менее, существует множество случаев, где относительные символические ссылки крайне удобны. Рассмотрим пример в котором мы хотим создать альтернативное имя для программы в /usr/bin:

# ls -l /usr/bin/keychain 
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain

От имени суперпользователя мы хотим короткий синоним для keychain, такой, как kc. В этом примере у нас есть root-доступ, о чем свидетельствует измененное на “#” приветствие bash. Нам нужен root-доступ потому, что обычные пользователи не имеют прав создавать файлы в /usr/bin. От имени суперпользователя мы можем создать альтернативное имя для keychain следующим образом:

# cd /usr/bin
# ln -s /usr/bin/keychain kc
# ls -l keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain


# ls -l kc

lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain

В этом примере мы создали символьную ссылку под названием kc, которая указывает на файл /usr/bin/keychain.

Пока это решение будет работать, но создаст проблему, если мы решим переместить оба файла, /usr/bin/keychain и /usr/bin/kc в /usr/local/bin:

# mv /usr/bin/keychain /usr/bin/kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain


# ls -l /usr/local/bin/kc

lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain

Поскольку мы использовали абсолютный путь для символической ссылки kc, то она все еще ссылается на /usr/bin/keychain, которого не существует с тех пор как мы переместили /usr/bin/keychain в /usr/local/bin.

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

# cd /usr/bin
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx 1 root root 8 Jan 5 12:40 kc -> keychain


# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain

-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain

# ls -l /usr/local/bin/kc

lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> keychain

Теперь, мы можем запустить программу keychain набрав /usr/local/bin/kc. /usr/local/bin/kc указывает на программу keychain в той же директории, где находится kc.

rm

Итак, мы знаем как использовать cp, mv и ln, настало время узнать о том, как можно удалять объекты из файловой системы. Обычно это делается с помощью команды rm. Чтобы удалить файлы, просто укажите их в командной строке:

$ cd /tmp
$ touch file1 file2
$ ls -l file1 file2
-rw-r--r-- 1 root root 0 Jan 1 16:41 file1 -rw-r--r-- 1 root root 0 Jan 1 16:41 file2


$ rm file1 file2
$ ls -l file1 file2
ls: file1: No such file or directory
ls: file2: No such file or directory

Имейте ввиду, что под Linux, однажды удаленный файл, обычно исчезает на века. Поэтому многие начинающие системные администраторы используют опцию -i, когда удаляют файлы. Опция -i сообщает rm удалять файлы в интерактивном режиме — это значит спрашивать перед удалением любого файла. Например:

$ rm -i file1 file2
rm: remove regular empty file `file1'? y
rm: remove regular empty file `file2'? y

В примере выше команда rm запрашивает подтверждение на удаление каждого из указанных файлов. В случае согласия, я должен был вводить «y» и нажать enter, дважды. Если бы я ввел «n», то файл бы остался цел. Или, если я сделал что-нибудь не так, я мог бы нажать Control-C и сбросить выполнение команды rm -i целиком — всяко до того, как это могло нанести какой-нибудь ущерб моей системе.

alias rm="rm -i"

rmdir

Для удаления директорий у вас имеется два варианта. Вы можете удалить все объекты внутри директории и затем воспользоваться rmdir для удаления самой директории:

$ mkdir mydir
$ touch mydir/file1
$ rm mydir/file1
$ rmdir mydir

Этот метод широко известен под названием «способ удаления директорий для лохов». Все реальные пацаны и админы-гуру съевшие пользователя собаку на этом деле, используют гораздо более удобную команду rm -rf, описанную далее.

Самый лучший способ удалить директорию состоит в использовании опций «рекурсивного принуждения» (recursive force) команды rm, чтобы приказать ей удалять указанную директорию, также как и объекты содержащиеся внутри:

$ rm -rf mydir

Обычно, rm -rf является наиболее предпочтительным методом для удаления древа директорий. Будьте очень осторожны, когда пользуетесь rm -rf, так как ее мощь может быть использована по обе стороны: добра и зла. =)


Об авторах

Daniel Robbins

Chris Houser

Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure.

Aron Griffis

Эйрон Гриффис живет на территории Бостона, где провел последнее десятилетие работая в Hewlett-Packard над такими проектами, как сетевые UNIX-драйвера для Tru64, сертификация безопасности Linux, Xen и KVM виртуализация, и самое последнее — платформа HP ePrint. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».

Время на прочтение

Причиной написания была эта статья Ссылки в Windows, символические и не только. Ее и можно почитать для ознакомление с тем, что такое жёсткие и символические ссылки в ntfs.
Я же продолжу и поделюсь некоторыми фактами о не очевидном поведении этих ссылок.

Сразу сделаю замечание. Если с жёсткими ссылками (Hard Links) неоднозначность вроде не наблюдается, то с мягкими или символическими ссылками есть путаница. Так вот я далее буду говорить о тех символических ссылках которые делаются программой Junction ( а также Alax.Info NTFS Links, Link Shell Extension и т.п.)
Подопытными программами были: Total Commander, Far, Frigate3, Servant Salamander, WinDirStat и Explorer в Windows XP.

Рекурсия.

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

Поиск.

Создадим каталог
X:\000
В нем создадим файл text.txt и символическую ссылку 111 на этот же каталог X:\000
Вот что выдадут при поиске файла наши подопытные файл-менеджеры кроме Far-а
X:\000\text.txt
X:\000\111\text.txt
X:\000\111\111\text.txt
X:\000\111\111\111\text.txt
X:\000\111\111\111\111\text.txt
X:\000\111\111\111\111\111\text.txt
X:\000\111\111\111\111\111\111\text.txt
X:\000\111\111\111\111\111\111\111\text.txt
X:\000\111\111\111\111\111\111\111\111\text.txt
X:\000\111\111\111\111\111\111\111\111\111\text.txt
X:\000\111\111\111\111\111\111\111\111\111\111\text.txt
X:\000\111\111\111\111\111\111\111\111\111\111\111\text.txt
X:\000\111\111\111\111\111\111\111\111\111\111\111\111\text.txt
X:\000\111\111\111\111\111\111\111\111\111\111\111\111\111\text.txt
X:\000\111\111\111\111\111\111\111\111\111\111\111\111\111\111\text.txt
X:\000\111\111\111\111\111\111\111\111\111\111\111\111\111\111\111\text.txt

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

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

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

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

При копировании ссылок подопытные файл-менеджеры вели себя по разному.
* Far — копировал символические ссылки как ссылки. Т.е. делал копию ссылки и не ее содержимого.
* Explorer на каждую ссылку задавал вопрос — копировать ее как каталог или как ссылку. Но я подозреваю что такое умное поведение ему придала установленная утилита Alax.Info NTFS Links. Проверить как ведет себя Explorer на windows xp без всяких расширений я не смог, а на windows 2000 explorer ведет при копировании себя как far.
* Все остальные подопытные копировали ссылки как каталоги.
При копировании ссылок нужно понимать, что это такое. Если ссылки копировать как файлы, то я например не смогу скопировать свою папочку «ИНТЕРНЕТ» в ближайшее время. Если же копировать ссылки как ссылки, то может оказаться, что скопированный на другой hdd в фаре каталог с фильмами у друга не откроется, так как внутри были символьные ссылки. А то куда они ссылались осталось на другом hdd. В общем при копировании наиболее правильно ведет себя Explorer в установленным правильным расширением.

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

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

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

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

Параноикам.

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

Выводы.

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

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

UPD: Эксперименты проводились в Microsoft Windows XP Home Edition 32bit SP3
Total Commander 7.04a
Far 1.70
Servant Salamander 2.0
WinDirStat 1.1.2.80 (Unicode)
Frigate 3.21.2.71
Explorer 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 тоже преподнесут сюрприз неоднозначным поведением в разных программах. Ибо проблема в основном не в ссылках, а в том что некоторые программисты про них забывают.

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

Символические ссылки используются в Windows довольно часто для системных файлов и каталогов. Пользователь может их применять, когда нужно перенести часть “тяжелых” файлов на другой диск, но чтобы Windows считала, что файлы все еще находятся в исходном каталоге (например в ситуациях, когда нужно экономить место на SSD, перенеся некоторые каталоги на более медленный и емкий SSD, не нарушая работоспособности программ). Можно использовать симлинки на SMB файловом сервере, когда каталоги с разных LUN должны быть доступны через одну точку входа.

В Windows есть три типа файловых ссылок для NTFS томов: жесткие, мягкие (симлинки), точки соединения (Junction point).

  • Hard Links (жесткие ссылки) – могут указывать только на локальный файл, но не на папку. Такой файл – это ссылка на другой файла на этом же диске без фактического дублирования самого файла. У него отображается такой же размер и свойства, как у целевого файла (но реальное место на диске он не занимает);
  • Junction Points (Directory Hard Link, точка соединения) – могут указывать только на папку (на этом же или на другом разделе);
  • Symbolic Links (мягкая ссылка, симлинк) – могут указывать на локальный файл, папку и сетевой каталог на удаленном компьютере (UNC), поддерживаются относительные пути.

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

Как создать символическую ссылку в Windows?

Для создания символических и жестких ссылок в Windows можно использовать встроенную утилиты mklink или PowerShell.

mklink утилита для создания симлинков в windows

Синтаксис у утилиты
mklink
простой. Чтобы создать символическую ссылку на файл, нужно указать имя ссылки и целевой объект, на который она должна указывать. Можно указать тип ссылки:
/D
— символьная (мягкая) ссылка на каталог,
/H
— жесткая ссылка,
/J
– точка соединения (Junction point).

Чтобы использовать mklinkдля создания символических ссылок нужно запустить командную строку с правами администратора. Иначе при запуске команды появится ошибка “
You do not have sufficient privilege to perform this operation
”.

параметр групповой политики Create Symbolic Links

Создадим в каталоге C:\PS символическую ссылку на файл notepad.exe:

mklink C:\PS\note.exe c:\Windows\System32\notepad.exe

Должно появится сообщение:

symbolic link created for C:\PS\note.exe <<===>> c:\Windows\System32\notepad.exe

Теперь для запуска процесса notepad.exe можно использовать символическую ссылку note.exe.

Теперь создадим в этом каталоге симлинк на другой каталог на этом же диcке:

пример использования mklink для создание символьных ссылок в windows

Теперь при переходе в каталог C:\PS\Downloads вы будете видеть содержимое каталога, на который он ссылается.

символическая ссылка на каталог в windows

Выведем содержимое каталога C:\PS:

Как вы видите, в атрибутах некоторых файлов указано, что это symlink/simlinkd. Также указан объект, на который они ссылаются. В Windows File Explorer симлинки отображаются с иконками ярлыков, а в их свойствах можно посмотреть целевой объект на который они ссылаются. Dir вывести информацию о всех symlink в папке

Также можно создать символически ссылки в Windows 10 с помощью PowerShell (в этом примере я использую относительные пути, чтобы создать символическую ссылку):

New-Item -ItemType SymbolicLink -Path ".\test\tmpfiles" -Target "..\tmp\files"

создать SymbolicLink с помощью powershell

Можно создать символическую ссылку на сетевую папку на удаленном компьютере/сервере. Адрес сетевой папки нужно указывать в формате UNC. Следующий пример создаст симлинк на сетевой каталог на сервере:

Например, подключим административную шару C$ с удаленного компьютера по IP адресу:

mklink /D c:\remotePC\server1 \\192.168.31.15\С$

Если при доступе к сетевой папке через симлинк, вы получили ошибку

The symbolic link cannot be followed because its type is disabled

проверьте разрешенные способы использования символических ссылок на вашем компьютере:

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.

fsutil behavior query SymlinkEvaluation

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

fsutil behavior set SymlinkEvaluation R2R:1
fsutil behavior set SymlinkEvaluation R2L:1

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

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

Del c:\ps\note.exe
RD c:\ps\downloads

Как найти и вывести все символические ссылки на диске?

В Windows нет простых инструментов для просмотра и управления всеми симлинками на диске.

Вы можете вывести список всех символических ссылок на диске с помощью команды:

  • /A
    – вывести файлы с атрибутом L (симлинк);
  • /S
    –выполнить команду рекурсивно для всех вложенных каталогов;
  • C:\
    — укажите имя диска, на котором нужно найти все символические ссылки (если вы не хотите сканировать весь диск, укажите путь к нужному каталогу)

вывести все симлинке на диске в windows

Также можно вывести список всех символических ссылок на диске с помощью PowerShell. Для этого нужно просканировать все каталоги и найти NTFS объекты с атрибутом ReparsePoint:

Нет ничего, на что бы ни дерзнуло воображение человека (Лукреций).

Как создать символическую ссылку для каталога в Linuxymlink, также известная как символическая ссылка в Linux, создает ссылку на файл или каталог для облегчения доступа. Другими словами, символические ссылки — это ссылки, указывающие на другой файл или папку в вашей системе, очень похожие на ярлыки в Windows. Некоторые пользователи называют символические ссылки софт-ссылками. Прежде чем двигаться дальше, давайте подробно рассмотрим программные и жесткие ссылки.

Жесткие ссылки: Жесткие ссылки — это ссылки, которые отражают или копируют исходный файл. Жесткие ссылки имеют одинаковые номера inode.

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

Изучение создания символической ссылки в Linux — отличный способ улучшить работу с терминалом Linux. Итак, давайте изучим шаги, необходимые для создания программных ссылок в Linux.

Как создать символическую ссылку (софт-ссылку) в Linux

Чтобы создать символическую ссылку или мягкую ссылку, мы используем команду ln. Ниже приведен синтаксис для создания символической ссылки:

$ ln -s [path of the target file/directory] [symbolic name]

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

Чтобы проверить номера inode, используйте команду, указанную ниже:

Как создать символическую ссылку (мягкую ссылку) на файл

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

$ ln -s [path of the target file] [символическое имя]

Мы создали каталог «my_folder», содержащий текстовый файл «my_doc.txt». Теперь, чтобы создать символическую ссылку на файл «my_doc.txt», мы будем использовать:

$ ln -s my_folder/my_doc.txt my_document

Чтобы проверить это, используйте:

Как видно из вышеприведенного вывода, «my_document» указывает на файл «my_folder/my_doc.txt». И символическая ссылка, и исходный файл будут иметь разные номера inode. Чтобы проверить используемые номера inode:

Жесткие ссылки всегда будут иметь одинаковые номера inode. Для проверки мы создали жесткую ссылку на файл «my_doc.txt» и назвал его «my_document_2»:

Из вывода видно, что исходный файл и жесткая ссылка имеют одинаковые номера inode.

Как создать символическую ссылку (мягкую ссылку) папки/каталога

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

$ ln -s my_folder my_doc_folder

Приведенная выше команда создаст папку с символической ссылкой в ​​текущем каталоге. Чтобы проверить это, используйте:

Теперь проверьте номера inode:

Как перезаписать символическую ссылку (мягкую ссылку) в Linux

Если вы попытаетесь обновить символическую ссылку с тем же именем, которое уже существует, вы получите сообщение об ошибке:

$ ln -s my_folder_2/my_doc_2.txt my_document

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

$ ln -sf my_folder_2/my_doc_2.txt my_document

Как удалить Symlink (Soft Link) в Linux

Во многих случаях вам необходимо удалить ненужные символические ссылки из вашей системы. Чтобы удалить символическую ссылку, мы используем команду «unlink», синтаксис которой приведен ниже:

$ unlink [symlink name]

Давайте удалим символические ссылки, которые мы создали в приведенных выше примерах. Чтобы отключить символическую ссылку файла, используйте:

И чтобы отключить символическую ссылку каталога:

Мы также можем использовать команду «rm» для удаления символических ссылок.

$ rm my_document my_doc_folder

Преимущество «rm» перед «unlink» состоит в том, что вы можете удалить несколько символических ссылок с помощью команды «rm», что невозможно с помощью команды «unlink».

Обратите внимание, что независимо от того, используете ли вы команду «unlink» или «rm», не используйте завершающую косую черту «/», даже если это каталог.

Заключение

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

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

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

415 Unsuрроrtеd Меdiа Туре – не-е-е, вчетвером не интерестно.

Команда ln в Linux. Создание мягких и жестких ссылоксылка — это ссылка на другой файл. Ссылки дают одному и тому же файлу несколько имен и позволяют им жить в двух или более местах одновременно.

Есть два типа ссылок:

  • Мягкая ссылка или символическая ссылка: это просто ярлык к исходному файлу.
  • Жесткая ссылка: указывает на место в памяти исходного файла.

Жесткие и программные ссылки создаются с помощью команды ln.

В этой статье мы покажем вам, как использовать команду ln для создания различных типов ссылок в Linux.

Примеры команды ln

Синтаксис команды ln прост:

 ln [option] target_file link_name

Позвольте нам показать вам несколько примеров использования команды ln для создания ссылок в Linux.

Чтобы создать жесткую ссылку на файл, вы можете использовать команду ln без таких параметров:

 ln target_file link_name

Чтобы создать символическую ссылку на файл, используйте параметр -sс именем целевого файла и именем ссылки.

 ln -s target_file link_name

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

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

Даже если ваш терминал не отображает мягкие ссылки другого цвета, вы можете идентифицировать ссылки таким образом.

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

 ln -s target_directory link_name

Вы заметите, что цвет мягкой ссылки и жесткой ссылки обычно различается в терминале Linux. Жесткая ссылка на каталог невозможна (обычно).

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

ln: failed to create symbolic link 'soft-link-to-file': File exists

Для этого команда ln имеет две опции:

  • -i: Интерактивный режим спросит вас, хотите ли вы перезаписать существующую ссылку.
  • -f: Принудительный режим просто обновляет существующую ссылку без какого-либо подтверждения.

Предположим, вы хотите принудительно обновить символическую ссылку. Вот что вы можете сделать:

ln -sf new_file existing_soft_link

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

Получение оригинального файла по цепочке ссылок

Обычно, когда вы используете команду ls с опцией -l, она показывает файл, на который она указывает.

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

Чтобы найти исходный файл из цепочки ссылок, вы можете использовать readlink -f следующим способом:

readlink -f soft_link

Параметр -f означает «следовать», как в «следовать цепочке».

Зачем нам нужны ссылки?

Теперь, когда вы знаете, как создавать ссылки, давайте вкратце, зачем нам ссылки? Какой практической цели они служат?

Там может быть несколько вариантов использования. Допустим, вы загрузили программное обеспечение, которое поставляется с его кодом и исполняемым файлом. Вы держите все это в /optкаталоге. Но чтобы запустить программу из любого места, вам нужно поместить ее исполняемый файл в каталог /usr/bin.

Если вы переместите исполняемый файл в этот каталог, он может не работать, поскольку ему необходим доступ к некоторому коду, и он не найдет путь к этим файлам из каталога /usr/bin. Здесь вы можете создать ссылку на этот исполняемый файл в каталоге /usr/bin.

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

Ссылки являются неотъемлемой частью Linux. Вы найдете их во многих местах в ваших системах. Просто посмотрите в каталог /lib, и вы увидите множество мягких ссылок.

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

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