жёсткая ссылка (hardlink)

Thank you for reading this post, don't forget to subscribe!

Фай­ло­вая систе­ма Linux име­ет два основ­ных ком­по­нен­та: пул бло­ков дан­ных, в кото­рых хра­нят­ся дан­ные, и систе­ма баз дан­ных для управ­ле­ния этим пулом дан­ных. Индекс подо­бен индек­су для этой систе­мы баз данных.

 

Что такое жесткая ссылка в Linux?

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

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

Мы соби­ра­ем­ся объ­яс­нить это вам с пра­виль­ны­ми диа­грам­ма­ми. Давай­те возь­мем эту струк­ту­ру ката­ло­гов, например:

Кор­не­вой ката­лог содер­жит ката­ло­ги dir_1 и dir_2. Ката­лог dir_1 содер­жит фай­лы file_1 и file_2, тогда как dir_2 содер­жит файл file_3 и жест­кую ссыл­ку на файл 2.

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

Если вам нужен доступ к фай­лу 3, абсо­лют­ный путь будет /dir_2/file_3. Здесь вы може­те про­чи­тать это сле­ду­ю­щим обра­зом: вы начи­на­е­те с inode 2 (root все­гда inode 2) и сле­ду­ет за стрел­кой к его бло­ку дан­ных. Этот блок дан­ных содер­жит инфор­ма­цию об inode dir_2 (inod 27 в нашем примере).

Теперь вы смот­ри­те на индекс 27. Это тип – ката­лог. Вы сле­ду­е­те за его бло­ком дан­ных, кото­рый име­ет инфор­ма­цию об inode file_3 (inode 88). Вы смот­ри­те на индекс 88. Это тип фай­ла, и если вы про­сле­ду­е­те к его бло­ку дан­ных, вы полу­чи­те доступ к содер­жи­мо­му файла.

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

Вам долж­но быть инте­рес­но узнать коли­че­ство ссы­лок на изоб­ра­же­нии выше. Это осо­бен­но важ­но, когда вы име­е­те дело с жест­кой ссыл­кой. Коли­че­ство ссы­лок – это коли­че­ство запи­сей ката­ло­га, кото­рые ука­зы­ва­ют на индекс. Возь­ми­те, напри­мер, индекс 27 для dir_2. inode 27 нахо­дит­ся один раз в бло­ке дан­ных кор­не­во­го ката­ло­га и один раз в сво­ем соб­ствен­ном бло­ке дан­ных (спе­ци­аль­ный ката­лог). И, сле­до­ва­тель­но, он име­ет коли­че­ство ссы­лок 2.

Обра­ти­те вни­ма­ние, что все фай­лы име­ют коли­че­ство ссы­лок 1, кро­ме file_2? Если файл име­ет коли­че­ство ссы­лок боль­ше 1, это озна­ча­ет, что суще­ству­ют жест­кие ссыл­ки «на этот файл». Посколь­ку жест­кие ссыл­ки ука­зы­ва­ют на тот же inode (в нашем при­ме­ре 17), что и целе­вой файл, вы полу­ча­е­те 2 спис­ка ката­ло­гов для 17 (в бло­ке дан­ных dir_1 и dir_2).

 

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

Вы може­те исполь­зо­вать сле­ду­ю­щую коман­ду для созда­ния жест­кой ссылки:

 

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

Если вы исполь­зу­е­те коман­ду ls -li (опция -i пока­зы­ва­ет номер индек­са), вы уви­ди­те, что коли­че­ство ссы­лок рав­но 2. Чис­ло ссы­лок нахо­дит­ся после поля раз­ре­ше­ния файла.

 

У обо­их оди­на­ко­вый номер индек­са 134195, очевидно.

Что нужно помнить о жестких ссылках

Теперь, когда у вас есть хоро­шее пред­став­ле­ние о жест­ких ссыл­ках в Linux, давай­те пой­дем дальше.

Удаление целевого файла не приведет к удалению его данных, если у него есть жесткая ссылка

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

Уда­ле­ние фай­лов в Linux в основ­ном не свя­зы­ва­ет. Пред­по­ло­жим, вы уда­ли­ли file_1 с помо­щью коман­ды rm. Ядро Linux обна­ру­жит , что file_2 соот­вет­ству­ет INode 16. Это уда­лит file_2 запись из спис­ка dir_1 и умень­шить inode 16 посчи­та­ет ссыл­ку на 1. Теперь у inode 16 счет­чик ссы­лок равен 0, ядро зна­ет, что нет ссы­лок на этот inode, поэто­му мож­но без­опас­но уда­лить inode и уда­лить свя­зан­ный с ним блок данных.

Теперь ска­жи­те, что вы уда­ли­те file_2. Ядро уда­лит файл file_2 из спис­ка dir_1 и перей­дет в индекс 17. Это умень­шит коли­че­ство ссы­лок в узле 17, умень­шив его до 1. Так как чис­ло ссы­лок не рав­но нулю, ядро не уда­лит индекс или дан­ные, свя­зан­ные с ним. И, сле­до­ва­тель­но, если вы полу­ча­е­те доступ к жест­кой ссыл­ке, вы все рав­но може­те полу­чить доступ к дан­ным, даже если исход­ный файл был удален.

Вы не долж­ны созда­вать жест­кую ссыл­ку на каталог

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

 

Поче­му жест­кие ссыл­ки не раз­ре­ше­ны для ката­ло­га? Это пото­му, что исполь­зо­ва­ние жест­ких ссы­лок на ката­лог могут сло­мать фай­ло­вую систе­му. Тео­ре­ти­че­ски вы може­те создать жест­кую ссыл­ку на ката­ло­ги, исполь­зуя опцию -d или -F. Но боль­шин­ство дис­три­бу­ти­вов Linux это­го не допу­стят, даже если вы явля­е­тесь поль­зо­ва­те­лем root.

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

Давай­те еще раз посмот­рим на жест­кую ссыл­ку, кото­рую мы созда­ли ранее:

 

Они име­ют иден­тич­ные атри­бу­ты, но вы може­те дога­дать­ся, какая ссыл­ка осно­ва­на на име­ни в при­ве­ден­ном выше при­ме­ре, но что, если имя не было оче­вид­ным? Как бы вы узна­ли, если бы их име­на были target_1 и target_2?

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

 

Бонусный совет: как найти все жесткие ссылки на данный файл

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

Один из спо­со­бов най­ти это – исполь­зо­вать номер индек­са фай­ла. Вы може­те исполь­зо­вать коман­ду ls -i или коман­ду stat для полу­че­ния номе­ра индекса.

Полу­чив номер индек­са, вы може­те уви­деть все ссыл­ки, свя­зан­ные с ним, с помо­щью коман­ды find.