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

Обновлено: 06.07.2024

Войти

Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal

Исполняем жёсткие ссылки

Если вдруг кому-нибудь прийдётся писать что-либо на PHP и в особенности, если будет необходимость запускать внешние программы для каких-либо целей, то следующее руководство для вас.
Имеем: Windows 2003 Server + Internet Information Server 6.0 + PHP 5.0Задача: Необходимость создать хардлинк (от англ. hard link - жёсткая ссылка) на файл, находящийся на отличной от расположения директории "Inetpub" партиции.Что такое жёсткая ссылка? В общем-то, как я понял, после кошмарного количества убитого времени, это дополнительное имя файла, на который она ссылается. Точнее сказать, жёсткая ссылка следит не за именем файла, а за закреплённым за файлом идентификатором (в UNIX-системах этот идентификатор назывется inode). Недостатком этого рода ссылок является то, что они живут только в пределах одной партиции, одной файловой системы, так как на каждом разделе жёсткого диска имеется своя собственная, независимая ФС, которая и присваивает всем файлам свои ID, в независимости от того, какие ID были присвоены файлам на другой партиции. Недостатком номер два является невозможность создавать ссылки на директории, обьяснения этому я так и не нашёл.Почему именно hardlink? Да потому что Windows 2003 Server не в состоянии создать обыкновенную символьную ссылку через консоль. Вот и приходится извращаться как только можно.Скрипт, в общем-то, совершенно простой, но для того, чтобы заставить его работать, пришлось снова потанцевать с бубном вокруг монитора.

// Генерируем строку длинной 32 символа, состоящую из символов указанных в переменной $letters$letters = 'abcdef0123456789';srand((double) microtime() * 1000000);$string = '';for ($i = 1; $i <= rand(32,32); $i++) // Файл, для которого будет создан хардлинк$file = "F:\\archive\\somefile.mpeg";// Адрес, где будет создан хардлинк и под каким именем$hlink = "F:\\tmpfiles\\$string\\somefile.mpeg";/ / Создаём директорию с именем $stringif(!exec("mkdir \"F:\\tmpfiles\\$string\"",$status_dir,$e rror_dir))elseif($error_dir) print_r($status_dir);// Создаём хардлинкif(!exec("fsutil hardlink create $hlink $file",$status,$error))elseif($error) print_r($status);

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

Не могу создать директорию "F:\tmpfiles\fae72cba8a3bacb8a3b892"Arra y ( )Не могу создать хардлинк!Array ( )

mkdir "F:\tmpfiles\fae72cba8a3bacb8a3b892\"fsu til hardlink create "F:\tmpfiles\fae72cba8a3bacb8a3b892\some file.mpeg" "F:\archive\somefile.mpeg"

"Hardlink created for D:\temp\link.to.file.avi <<===>> D:\files\file.avi".

Для этого открываем файл %windir%\php.ini, ищём строку safe_mode = On, и изменяем эту директриву на Off. Затем сохраняем файл и перезагружаем web-сервисы. Радуйтесь, если это поможет!В противном случае, пытаемся заменить exec() на system(), добавить в самое начало команды start (start mkdir. ), попытаться поразному экранировать слеши. Ежели и это бессильно перед вашими проблемами, то вам на следующей абзац.Else - дело в правах. Кому нужно что раздать? IUSR'y права на чтение папки archive и права на запись в папку tmpfiles? Или на выполнение программы fsutil? Чёрт его знает. Что я только не пробывал. Как не мучался. Оказалось всё гораздо проще!Нужно было дать права IUSR (Internet Guest Account) на исполнение %windir%/system32/cmd.exe!Но, если будет сделан только этот шаг, то вы получите следующую ошибку:

Array ( [0] => The FSUTIL utility requires that you have administrative privileges. )

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

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

Я знаю только одну файловую систему. Тот, который начинается с root ( / ). Это утверждение, что жесткие ссылки не могут охватывать файловые системы, не имеет смысла для меня.

Надеюсь, я смогу ответить на это так, чтобы это имело смысл для вас. Файловая система в Linux, как правило, состоит из раздела, который отформатирован одним из различных способов (должен любить!), В котором вы храните свои файлы. Будь то ваши системные файлы или ваши личные файлы . все они хранятся в файловой системе. Эту часть вы, похоже, поняли.

Но что делать, если вы разбили свой жесткий диск на несколько разделов (например, Apple Pie разрезать на части) или добавили дополнительный жесткий диск (возможно, USB-накопитель?). Ради аргумента, у них всех также есть файловые системы.

Когда вы смотрите на файлы на вашем компьютере, вы видите визуальное представление данных в файловой системе вашего раздела. Каждое имя файла соответствует тому, что называется инодом, и именно там ваши данные за кулисами действительно живут. Жесткая ссылка позволяет вам иметь несколько «имен файлов» (из-за отсутствия лучшего описания), которые указывают на один и тот же индекс. Это работает, только если эти жесткие ссылки находятся в одной файловой системе. Вместо этого символическая ссылка указывает на «имя файла», которое затем связывается с индексом, содержащим ваши данные. Простите мою грубую работу, но, надеюсь, это объясняет лучше.

Здесь, image.jpg и image2.jpg указывают непосредственно на ваши данные. Они оба жесткие ссылки. Тем не мение.

В этом (сыром) примере image2.jpg не указывает на ваши данные, он указывает на image.jpg . который является ссылкой на ваши данные.

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

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

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

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

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

Вот основные особенности символических ссылок:

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

Теперь давайте рассмотрим жесткие ссылки.

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

Этот тип ссылок реализован на более низком уровне файловой системы. Файл размещен только в определенном месте жесткого диска. Но на это место могут ссылаться несколько ссылок из файловой системы. Каждая из ссылок - это отдельный файл, но ведут они к одному участку жесткого диска. Файл можно перемещать между каталогами, и все ссылки останутся рабочими, поскольку для них неважно имя. Рассмотрим особенности:

  • Работают только в пределах одной файловой системы;
  • Нельзя ссылаться на каталоги;
  • Имеют ту же информацию inode и набор разрешений что и у исходного файла;
  • Разрешения на ссылку изменяться при изменении разрешений файла;
  • Можно перемещать и переименовывать и даже удалять файл без вреда ссылке.

Использование ссылок в Linux

Теоретические отличия вы знаете, но осталось закрепить все это на практике, поэтому давайте приведем несколько примеров работы со ссылками в Linux. Для создания символических ссылок существует утилита ln. Ее синтаксис очень прост:

$ ln опции файл_источник файл_ссылки

Рассмотрим опции утилиты:

  • -d - разрешить создавать жесткие ссылки для директорий суперпользователю;
  • -f - удалять существующие ссылки;
  • -i - спрашивать нужно ли удалять существующие ссылки;
  • -P - создать жесткую ссылку;
  • -r - создать символическую ссылку с относительным путем к файлу;
  • -s - создать символическую ссылку.

Создание символических ссылок

Сначала создайте папку test и перейдите в нее:

mkdir test && cd test


Затем создайте файл с именем source с каким-либо текстом:

echo "текст текст текст текст" > source
$ cat source


Файл готов, дальше создадим символическую ссылку Linux, для этого используется команда ln с опцией -s:

ln -s source softlink


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


Как видите, нет никакой разницы между ней и исходным файлом. Но утилита ls покажет что это действительно ссылка:


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

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


Вы получите ошибку, что такого файла не существует, потому что мы действительно удалили исходный файл. Если вы удалите ссылку, то исходный файл останется на месте.

Создание жестких ссылок

Снова создайте файл source с произвольным текстом:

echo "текст текст текст текст" > source
$ cat source


Теперь создадим жесткую ссылку Linux. Для этого достаточно вызвать утилиту без параметров:

ln source hardlink

Посмотрите содержимое файла:


Данные те же самые, а если мы посмотрим вывод утилиты ls, то увидим что inode и права доступа тоже совпадают:


Если для одного из файлов поменять разрешения, то они изменяться и у другого. Теперь удалите исходный файл:

Затем посмотрите содержимое:


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

Выводы

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

На завершение видео про ссылки в Linux:

symlink

Если вам когда-то приходилось просматривать расположения файлов штатных программ Windows, то возможно вы замечали одну странность. Некоторые файлы приложений дублируются, причем несколько раз. Например, в 64-разрядной Windows 8.1 обнаруживается целых 6 исполняемых файлов Блокнота notepad.exe, находящихся в разных каталогах системного раздела. Зачем вообще нужно такое странное дублирование?

А необходимо оно для обеспечения совместимости со сторонними приложениями, использующими Блокнот для каких-то своих нужд. Причина проста – в разных программах прописанный путь к Блокноту может отличаться, и чтобы исключить проблемы, разработчики Microsoft решили разместить notepad.exe в нескольких местах. То же самое касается ряда других штатных приложений, например, WordPad.

4233670_1

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

На самом деле дублирование совсем необязательно должно иметь место. То, что вы видите и определяете как реальный файл, в действительности может оказаться Hard Link — ссылкой особого типа, используемой для формирования путей к какому-нибудь файлу. Такие ссылки называются жесткими. Любопытно, что файл в NTFS может иметь до 1023 жестких ссылок, и все они будут выглядеть как его точная копия за исключением имени и размера. Как и ярлыки, жесткие ссылки могут иметь разные имена.

Зато содержимое и атрибуты у них общие, и если вы измените их в одной такой ссылке, то изменения коснуться всех остальных ссылок, даже тех, которые были удалены в Корзину. Что касается размера жестких ссылок, то это всего лишь одна видимость. Не имеющие практически никакого веса, ссылки этого типа определяются Проводником как имеющие реальный вес файлы, что иногда вызывает у пользователей немало вопросов и затруднений при ручной очистке ряда системных каталогов, того же Winsxs. Есть у Hard Link и свои ограничения. Так, создавать жесткие ссылки можно только на файлы и только в пределах одного тома.

К счастью, сталкиваться с жесткими ссылками рядовым пользователям приходится нечасто, иначе это наверняка бы привело к неразберихе и серьезным проблемам. Описывать все особенности поведения жестких ссылок мы не будем, так как это заняло бы слишком много времени. Вместо этого предлагаем вам создать Hard Link самостоятельно и поэкспериментировать с ними. Вот вам пример. Создайте на рабочем столе простой текстовый файл file1.txt и что-нибудь напишите в него. Теперь откройте командную строку и создайте на него пару жестких ссылок с именами file2.txt и file2.txt. Вот так:

cd %userprofile%\desktop

fsutil hardlink create file2.txt file1.txt

fsutil hardlink create file3.txt file1.txt

4233670_2

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

Вам может быть интересно: Как убрать рекомендуем из пуска

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

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

Использование Symbolic Link может иметь смысл при необходимости получения доступа к одному файлу из разных мест. Создаются символьные ссылки командой mklink:

mklink D:\file2.txt %userprofile%\desktop\file1.txt

4233670_4

Первым после команды идет путь к символьной ссылке, вторым – путь к оригинальному файлу. Если нужно создать символьную ссылку для каталога, используется та же команда mklink, но с ключом \d.

mklink \d D:\folder2 %userprofile%\desktop\folder1

4233670_5

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

Читайте также: