суббота, марта 29, 2008

Сим- и хардлинки

Давно уже обещал знакомым написать про симлинки - что такое и зачем оно обычному человеку. Но как-то всё не находилось времени, а когда было время - не было желания. Но наконец-то я дозрел и добрался до етой темы :).
Что такое симлинки и хардлинки (они же символические ссылки и жёсткие ссылки) линуксоиды (более-менее опытные) знают. А виндузятники - нет (по большей части) и соответственно не пользуются ими. Восполнить етот пробел и подарить всем ещё кусочек щастья и призвана ета статья :)
Есть два вида линков - симлинки и хардлинки. Но начну я с файлов вообще.

Что такое файл.


Прежде всего надо различать содержимое файла, и указатель на него. Под указатели на файл отведена специальная таблица в файловой системе (дальше - ФС). Ето, к примеру, FAT в FAT12, FAT16, FAT32 и $MSFT в NTFS. В Ext2/Ext3 ето называется суперблок (кажется, утверждать не буду). В любом типе ФС есть ета таблица. При форматировании создаётся именно она. Кстати, папка - ето тоже файл, но специальный - он может содержать в себе только другие файлы.
Помимо информации о местоположении содержимого файла, указатель на файл содержит ещё много всякого: атрибуты, права, информацию о владельце и прочее. Что именно - зависит от ФС. Бывает, что в указателе лежит и само содержимое файла (только в NTFS и ReiserFS) - ето в случае, если файл короткий и вмещается в кластер после информации о файле.

Хардлинк


Так вот, хардлинк - ето и есть файл, в смысле указателя. За исключением одной хитрой особенности - на одно и тоже место на винте (читай: на одно и тоже содержимое) можно сделать несколько ссылок. То есть в разных каталогах (к примеру), лежат разные файлы, с разными именами, которые сылаются на один и тот же физический файл. И изменив один из них, увидим такие же изменения во втором. Более того, после создания второго (третьего и какого угодно по счёту) хардлинка невозможно выяснить, какой из хардлинков был первым, главным. Они все равноправны. При удалении одного из хардлинков, файл остаётся жить на винте до тех пор, пока число хардлинков (есть специальный счётчик для каждого файла) не станет равно нулю.

Симлинк


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

Особенности


Симлинки можно создавать куда угодно. Харлинки - только на файл в пределах раздела. Под линуксом можно создавать и симлинки и хардлинки на файлы и папки. Под виндой - хардлинки только на файлы, симлинки - только на папки.

Для чего ето нужно


Вообще говоря, так сходу и не могу сказать, для чего ето нужно... Можно прекрасно обходиться без етих премудростей. Но с ними иногда бывает легче жить.
Хардлинки
С хардлинками просто - економия места. Самый яркий пример - инсталляционный компакт-диск с несколькими виндами, объём данных на котором составляет около 1.5 ГБ. На обычный компакт, при удачном стечении обстоятельств можно впихнуть около 800 МБ, а тут 1.5 ГБ, что в два раза больше. Как так? А вот так - одинаковые файлы (а в инсталляшке WinXP Home и WinXP Pro их очень много) не пишутся по несколько раз, а просто создаются хардлинки. ФС на компашках ISO9660 позволяет ето сделать, то есть она поддерживает хардлинки. Хотя возможно ето поддерживает расширение Joilet, а не сама ISO9660, но тут ето неважно.
Также на линуксах часто встречается такая фишка: файлы gzip и gunzip - ето физически один файл, хотя и вполняет разные действия. Вместо двух файлов мы имеем только один, економя таким образом место.
Опять же, можно завести папочку для бакупа каких-то важных файлов, но кидать туда не сам файл, а только хардлинк на него. Плюс - економия места в два раза. Кого ето нынче волнует? У мня винт - почти терабайт! Какая економия, зачем она мне? Да, вот же люди :). А если у тебя важный файлик - не документ полмегабайтный, а киношка в HDTV-формате весом 1.5 ГБ? Или ещё что поболее весом? Да ещё в количестве пицот штук? То-то же ;)
Так же мне один раз ето помогло при написании программы на Дельфи, когда в проекте участвовало много дллок, и перед запуском программы приходилось свежеоткомпиленные дллки ручками копировать в папку с программой. Я долго париться не стал, создал хардлинки на все нужные дллки в нужную папку и - вуаля! Не надо больше копировать, в папке с программой лежат самые свежие версии.
Симлинки
Тут с теорией посложней, поетому просто приведу примеры из своей практики:

1. Есть у мня программа - клиент жабера Psi. Всем хороша, кроме одного - папку с конфигами и логами создаёт в домашней папке пользователя. Под линуксом ето хорошо, удобно и привычно, но под виндой - нет. Под виндой я привык, чтобы все программы свои конфиги хранили при себе - мне так проще их потом копировать на другую машину при переезде. И программы себе подбираю соответственно (об етом наверно будет отдельный пост). Так вот, под виндой она хранит свои конфиги в папке "C:\Documents and Settings\username\PsiData", или, если быть точнее, в %USERPROFILE%\PsiData. А я при переезде постоянно забываю копировать её, через что каждый раз настраиваю Psi заново. Как-то раз мен ето надоело, и я просто создал в %USERPROFILE% симлинк на папку C:\Ok\Sys\psi11\PsiData. Понятно, что тут (C:\Ok\Sys\psi11) у мня живёт сам Псай. Теперь, после переезда мно просто нужно снова создать етот симлинк и все мои настройки работатют на новом месте. Согласитесь, ето удобнее, чем каждый раз настраивать Псай, не говоря уже о потере истории.
2. На работе наконец-то выделили мне мой комп. Ну я разбил винт по типу (10/10/остатки) на (винь/линь/хранилище). И при переезде с временного ноута обнаружилась одна фигня - в 10 ГБ я не влезаю своей папкой C:\Ok. Перенести её на другой винт - тяжело, многие программы привязаны именно к етой папке, и придётся их перенастраивать, а мне ето лишний гемморой нафиг не сдался, да и вообще - лень :). Сделал так - пихнул содержимое самых толстых папок (dnl и tmp) на хранилище, а в папке c:\ok создал симлинки на них. Была мысль сделать так со всей папкой Ok, но к тому времени оттуда уже был запущен TC, так что возиться не стал.

Как ето делать


Да, всё ето клёво, мы прониклись твоими идеями, но как создавать ети самые... Линки?
И на етот вопрос есть у мня ответ :). Даже три:
1. Плагин к TotalCommander'у NTFS Links. Как инсталлить и работать с ним - подробно описано в ридми.
2. Утилка для командной строки от Sysinternals. Лежит тут (прямой линк), пользоваться просто.
3. Примочка к Проводнику aka Explorer'у. Сначала льём и ставим либы (прямой линк). После льём и ставим саму программу (прямой линк).

Всё


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

При написании статьи использовались материалы из хелпа к плагину для TotalCommander'а NTFS Links от Власова Константина

Дальше...