В чем разница между символической ссылкой и жесткой ссылкой? - PullRequest
699 голосов
/ 09 октября 2008

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

Ответы [ 21 ]

4 голосов
/ 13 декабря 2017

Hard link vs Soft link

Жесткая ссылка и мягкая ссылка может быть легко объяснена этим изображением.

3 голосов
/ 24 декабря 2015

С MSDN ,

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

Символическая ссылка - это объект файловой системы, который указывает на другой объект файловой системы. Указываемый объект называется целью.

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

Символические ссылки предназначены для помощи в миграции и применении. совместимость с операционными системами UNIX. Microsoft реализовала его символические ссылки функционируют так же, как ссылки UNIX.

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

Пример абсолютной символической ссылки

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

Пример относительных символических ссылок

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

Жесткая ссылка

A hard link - это представление файловой системы файла, по которому более одного пути ссылаются на один файл в одном томе .

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

mklink /H Link_name target_path

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

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

Junction

NTFS поддерживает другой тип ссылки, называемый junction. MSDN определяет это следующим образом:

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

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

Команда для создания соединения в окнах, перейдите к месту создания ссылки и затем введите:

mklink /J link_name target_path
3 голосов
/ 28 ноября 2014

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

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

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

3 голосов
/ 04 ноября 2009

Также:

  1. Производительность чтения жестких ссылок лучше, чем символических ссылок (микро-производительность)
  2. Символические ссылки могут быть скопированы, с контролем версий, и т.д. Другими словами, они являются фактическим файлом. С другой стороны, жесткая ссылка - это что-то на несколько более низком уровне, и вы обнаружите, что по сравнению с символическими ссылками меньше инструментов, которые предоставляют средства для работы с жесткими ссылками как с жесткими ссылками, а не с обычными файлами
2 голосов
/ 18 июля 2016

Запись каталога является ссылкой на структуру:

struct dentry{
    ino_t ino;
    char  name[256];
}

ino - это номер inode, имя - это имя файла, структура inode может выглядеть следующим образом:

struct inode{
      link_t nlink; 
      ...
}

например, вы создали файл / 1, запись в каталоге может выглядеть так:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

структура inode может быть такой:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

затем вы создаете жесткую ссылку (может быть / 100), запись в каталоге может выглядеть так:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

структура inode может быть такой:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

затем вы создаете символическую ссылку (может быть / 200) на файл 1, запись в каталоге может выглядеть так:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

структура inode может выглядеть так:

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */
2 голосов
/ 05 августа 2013

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

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

2 голосов
/ 16 января 2012

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

У меня есть файл f6 в моем текущем каталоге, а также каталог с именем t2.

Файлы с именами f1 и ./t2/f2 являются символическими ссылками на f6.

Файл с именами f7 и ./t2/f8 - это жесткие ссылки f6.

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

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

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

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

Поскольку жесткие ссылки могут быть созданы в одной и той же файловой системе, мы можем искать все жесткие ссылки без использованной опции -L (с опцией -xdev) в той же файловой системе / точке монтирования. Это сохраняет ненужный поиск в разных точках монтирования.

Таким образом, поиск жестких ссылок несколько быстрее, чем поиск программных ссылок (пожалуйста, исправьте ошибку или нет).

1 голос
/ 25 ноября 2014

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

0 голосов
/ 22 мая 2018

Мои два цента на использование:

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

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

Изменения, сделанные в /short/file.txt, будут применены к исходному файлу.

Жесткие ссылки могут использоваться для перемещения по большим файлам:

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

ln /myapp/dev/application.bin /myapp/prd/application.bin

Мгновенное копирование в другую папку, и исходный файл (на /myapp/dev) можно перемещать или удалять, не касаясь файла на /myapp/prd

0 голосов
/ 19 февраля 2018

В этом ответе, когда я говорю файл, я имею в виду местоположение в памяти

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

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

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

...