Недавно меня спросили об этом во время собеседования. Я был честен и сказал, что знаю, как ведет себя символическая ссылка и как ее создать, но я не понимаю, как использовать жесткую ссылку и чем она отличается от символической.
Недавно меня спросили об этом во время собеседования. Я был честен и сказал, что знаю, как ведет себя символическая ссылка и как ее создать, но я не понимаю, как использовать жесткую ссылку и чем она отличается от символической.
Ответы:
Под файловой системой файлы представлены inode. (Или это несколько inode? Не уверен.)
Файл в файловой системе - это, по сути, ссылка на индекс.
Таким образом, жесткая ссылка просто создает другой файл со ссылкой на тот же базовый индекс.
Когда вы удаляете файл, он удаляет одну ссылку на основной индекс. Индод удаляется (или удаляется / перезаписывается) только тогда, когда все ссылки на индекс удалены.
Символическая ссылка - это ссылка на другое имя в файловой системе.
После создания жесткой ссылки ссылка делается на индекс. Удаление, переименование или перемещение исходного файла не повлияет на жесткую ссылку, поскольку она ссылается на базовый индекс. Любые изменения в данных в этом узле отражаются во всех файлах, которые ссылаются на этот узел.
Примечание. Жесткие ссылки действительны только в одной файловой системе. Символические ссылки могут охватывать файловые системы, поскольку они являются просто именем другого файла.
Хорошая интуиция, которая может помочь при использовании любой консоли Linux (ish).
Создайте два файла:
$ touch foo; touch bar
Введите некоторые данные в них:
$ echo "Cat" > foo
$ echo "Dog" > bar
(На самом деле, я мог бы использовать echo в первую очередь, поскольку он создает файлы, если они не существуют ... но не обращайте на это внимания.)
И, как и ожидалось:
$cat foo; cat bar
Cat
Dog
Давайте создадим жесткие и мягкие ссылки:
$ ln foo foo-hard
$ ln -s bar bar-soft
Давайте посмотрим, что только что произошло:
$ ls -l
foo
foo-hard
bar
bar-soft -> bar
Изменение имени foo не имеет значения:
$ mv foo foo-new
$ cat foo-hard
Cat
foo-hard указывает на inode, содержимое файла - это не изменилось.
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-soft: No such file or directory
Не удалось найти содержимое файла, поскольку мягкая ссылка указывает на измененное имя, а не на его содержимое.
Аналогично, если foo
удалено, foo-hard
все еще содержит содержимое; если bar
удалено, bar-soft
это просто ссылка на несуществующий файл.
touch blah1; touch blah2
можно сократить доtouch blah1 blah2
Как говорится, картинка стоит тысячи слов. Вот как я это представляю:
Вот как мы доберемся до этой картинки:
Создайте имя myfile.txt
в файловой системе, которое указывает на новый индекс (который содержит метаданные для файла и указывает на блоки данных, которые содержат его содержимое, то есть текст «Hello, World!»:
$ echo 'Hello, World!' > myfile.txt
Создайте жесткую ссылку my-hard-link
на файл myfile.txt
, что означает «создать файл, который должен указывать на тот же индекс, на который myfile.txt
указывает»:
$ ln myfile.txt my-hard-link
Создайте программную ссылку my-soft-link
на файл myfile.txt
, что означает «создать файл, который должен указывать на файл myfile.txt
»:
$ ln -s myfile.txt my-soft-link
Посмотрите, что теперь произойдет, если myfile.txt
удалить (или переместить): по- my-hard-link
прежнему указывает на то же содержимое, и, следовательно, не влияет, в то my-soft-link
время как теперь ничего не указывает. Другие ответы обсуждают плюсы / минусы каждого.
myfile.txt
). Для софт-ссылки это ссылка не на индекс (который содержит данные), а скорее ссылка на путь к файловой системе myfile.txt
(например /home/Documents/myfile.txt
)
Жесткие ссылки полезны, когда исходный файл перемещается. Например, перемещение файла из / bin в / usr / bin или в / usr / local / bin. Любая символическая ссылка на файл в / bin будет нарушена этим, но жесткая ссылка, являющаяся ссылкой непосредственно на inode для файла, не будет заботиться.
Жесткие ссылки могут занимать меньше места на диске, поскольку они занимают только запись в каталоге, тогда как символическая ссылка нуждается в собственном иноде для хранения имени, на которое она указывает.
Жесткие ссылки также занимают меньше времени для устранения - символические ссылки могут указывать на другие символические ссылки, которые находятся в каталогах с символическими ссылками. И некоторые из них могут быть в NFS или других файловых системах с высокой задержкой, что может привести к разрешению сетевого трафика. Жесткие ссылки, всегда находящиеся в одной и той же файловой системе, всегда разрешаются в одном поиске и никогда не связаны с задержкой в сети (если это жесткая ссылка в файловой системе NFS, сервер NFS будет выполнять разрешение, и он будет невидим для клиентская система). Иногда это важно. Не для меня, но я могу представить высокопроизводительные системы, где это может быть важно.
Я также думаю, что такие вещи, как mmap (2) и даже open (2) используют ту же функциональность, что и жесткие ссылки, чтобы поддерживать активный индекс файла, так что даже если файл получает unlink (2) ed, этот индекс остается, чтобы процесс продолжал доступ, и только когда процесс закрывается, файл действительно исчезает. Это позволяет гораздо более безопасные временные файлы (если вы можете заставить атомы открываться и отменять ссылки, которые могут быть в POSIX API, для которых я не помню, тогда у вас действительно есть безопасный временный файл), где вы можете читать / писать ваши данные без доступа к ним. Что ж, это было верно до того, как / proc дал всем возможность взглянуть на ваши файловые дескрипторы, но это уже другая история.
Говоря об этом, восстановление файла, открытого в процессе A, но не связанного в файловой системе, вращается вокруг использования жестких ссылок для воссоздания ссылок inode, поэтому файл не исчезает, когда открывающий его процесс закрывает его или удаляется.
Soft Link :
soft или symbolic - это скорее сокращение к исходному файлу .... если вы удаляете оригинал, ярлык не срабатывает, и если вы удаляете только ярлык, с оригиналом ничего не происходит.
Синтаксис мягкой ссылки :ln -s Pathof_Target_file link
Вывод : link -> ./Target_file
Доказательство: readlink link
Также в ls -l link
выводе вы увидите первую букву в lrwxrwxrwx
виде l, которая указывает на то, что файл является мягкой ссылкой.
Удаление ссылки: unlink link
Примечание: если вы хотите, ваша мягкая ссылка может работать даже после перемещения ее в другое место из текущего каталога. Убедитесь, что вы указали абсолютный путь, а не относительный путь при создании мягкой ссылки. т.е. (начиная с / root / user / Target_file, а не ./Target_file)
Жесткая ссылка:
Жесткая ссылка - это скорее зеркальная копия или несколько путей к одному и тому же файлу. Сделайте что-нибудь с файлом file1, и он появится в файле 2. Удаление одного из них по-прежнему сохраняет в порядке.
Индод (или файл) удаляется только тогда, когда все (жесткие) ссылки или все пути к (одному и тому же файлу) индоду были удалены.
После создания жесткой ссылки ссылка имеет индекс исходного файла. Удаление переименования или перемещение исходного файла не повлияет на жесткую ссылку, так как она ссылается на основной индекс. Любые изменения в данных в этом узле отражаются во всех файлах, которые ссылаются на этот узел.
Синтаксис жесткой ссылки :ln Target_file link
Вывод: Будет создан файл со ссылкой на имя с тем же номером инода, что и в Targetfile.
Доказательство: ls -i link Target_file
(проверьте их иноды)
Удаление ссылки: rm -f link
(Удалить ссылку как обычный файл)
Примечание . Символические ссылки могут охватывать файловые системы, поскольку они являются просто именем другого файла. Принимая во внимание, что жесткие ссылки действительны только в той же файловой системе.
Символьные ссылки имеют некоторые функции, которые отсутствуют:
Вы сразу же знаете, на что указывает символическая ссылка, в то время как с жесткими ссылками вам нужно исследовать всю файловую систему, чтобы найти файлы с одинаковым индексом.
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
жесткие ссылки не могут указывать на каталоги.
Жесткие ссылки имеют два ограничения:
Простой способ увидеть разницу между жесткой ссылкой и символической ссылкой - простой пример. Жесткая ссылка на файл будет указывать на место, где хранится файл, или на индекс этого файла. Символическая ссылка будет указывать на сам файл.
Итак, если у нас есть файл с именем «a» и мы создаем жесткую ссылку «b» и символическую ссылку «c», которые все ссылаются на файл «a»:
echo "111" > a
ln a b
ln -s a c
Вывод "a", "b" и "c" будет:
cat a --> 111
cat b --> 111
cat c --> 111
Теперь давайте удалим файл «a» и посмотрим, что происходит с выходными данными «a», «b» и «c»:
rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
Так что случилось?
Поскольку файл "c" указывает на сам файл "a", если файл "a" будет удален, то файлу "c" будет нечего указывать, фактически он также будет удален.
Однако файл "b" указывает на место хранения или индекс файла "a". Таким образом, если файл «a» удален, он больше не будет указывать на индекс, но, поскольку файл «b» делает это, индекс будет продолжать хранить все содержимое, принадлежащее «a», до тех пор, пока больше не будет жестких ссылок на него.
Символические ссылки ссылаются на путь. Это может быть где угодно в системном дереве файлов, и даже не должно существовать при создании ссылки. Целевой путь может быть относительным или абсолютным.
Жесткие ссылки - это дополнительные указатели на индекс, то есть они могут существовать только на том же томе, что и целевой объект. Дополнительные жесткие ссылки на файл неотличимы от «оригинального» имени, используемого для ссылки на файл.
Я хотел бы указать вам на Википедию:
Несколько моментов:
Жесткие ссылки очень полезны при создании инкрементных резервных копий. Смотрите rsnapshot , например. Идея состоит в том, чтобы сделать копию, используя жесткие ссылки:
Новая резервная копия не займет дополнительного места, кроме внесенных вами изменений, поскольку все инкрементные резервные копии будут указывать на одинаковый набор инодов для файлов, которые не были изменены.
Я добавлю к вопросу Ника: когда жесткие ссылки полезны или необходимы? Единственное приложение, которое мне приходит в голову, в котором символические ссылки не справляются с этой задачей, - это предоставление копии системного файла в изолированной среде.
Символическая ссылка - это объект файловой системы, который указывает на другой объект файловой системы. Указываемый объект называется целью.
Символические ссылки прозрачны для пользователей; ссылки отображаются в виде обычных файлов или каталогов и могут обрабатываться пользователем или приложением точно таким же образом.
Символические ссылки предназначены для облегчения миграции и совместимости приложений с операционными системами 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"
Жесткая связь является файловая система представляет собой файл , с помощью которого более чем один путь ссылается на один файл в том же объеме .
Чтобы создать жесткую ссылку в Windows, перейдите туда, где должна быть создана ссылка, и введите следующую команду:
mklink /H Link_name target_path
Обратите внимание, что вы можете удалять жесткие ссылки в любом порядке, независимо от того, в каком порядке они были созданы. Кроме того, жесткие ссылки не могут быть созданы, когда
NTFS поддерживает другой тип ссылки, называемый junction. MSDN определяет это следующим образом:
Соединение (также называемое мягкой ссылкой) отличается от жесткого соединения тем, что объекты хранения, на которые оно ссылается, являются отдельными каталогами, и соединение может связывать каталоги, расположенные на разных локальных томах на одном компьютере . В противном случае соединения работают идентично жестким ссылкам.
Части, выделенные полужирным шрифтом в жесткой и соединительной частях, показывают принципиальное различие между ними.
Команда для создания соединения в окнах, перейдите туда, где должна быть создана ссылка, а затем введите:
mklink /J link_name target_path
Также:
Просто, жесткая ссылка: это просто добавление нового имени в файл, это означает, что файл может иметь много имен в одно и то же время, все имена равны друг другу, никто не предпочитает, Жесткая ссылка не означает копировать все содержимое файла и сделать новый файл не то, это просто создать альтернативное имя, которое будет известно ..
Символическая ссылка (символическая ссылка): указатель файла на другой файл, если символическая ссылка указывает на существующий файл, который впоследствии удаляется, символическая ссылка продолжает указывать на то же имя файла, даже если имя больше не называет никакого файла.
То, что вы считаете обычным «файлом», на самом деле две разные вещи: данные файла и запись в каталоге. Когда вы создаете жесткую ссылку для файла, вы фактически создаете вторую запись каталога, которая ссылается на те же данные. Обе записи каталога имеют одинаковую функциональность; каждый из них может быть использован для открытия файла, чтобы прочитать его. Таким образом, у вас нет «файла плюс жесткая ссылка», у вас есть «данные файла с двумя записями каталога». То, что вы считаете удалением файла, фактически удаляет запись каталога, и когда удаляется последняя запись каталога для данных, то и сами данные также удаляются. Для обычных файлов, которые имеют только одну запись каталога, удаление записи каталога приведет к удалению данных как всегда. (Пока файл открыт, ОС создает временную ссылку на файл,
В качестве примера создайте файл A.txt, жесткую ссылку B.txt и удалите A.txt. Когда вы создали A.txt, были созданы некоторые данные и запись каталога A.txt. Когда вы создали жесткую ссылку, была создана другая запись каталога B.txt, указывающая на те же самые данные. При удалении A.txt у вас все еще остаются все данные и одна запись каталога B.txt, точно так же, как если бы вы сначала создали файл B.txt.
Мягкая ссылка - это просто (почти) обычный файл, за исключением того, что он содержит не данные, а путь к другой записи каталога. Если вы удалите файл, на который ссылается мягкая ссылка, то мягкая ссылка будет содержать путь, который больше не будет указывать на запись в каталоге; оно сломано. Если вы удаляете программную ссылку, это похоже на удаление любого другого файла, файл, на который она указывает, не изменяется.
Запись в каталоге является ссылкой на структуру:
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 */
В дополнение ко всем приведенным выше ответам разницу в поиске файла с жесткой и мягкой ссылкой можно понять следующим образом:
У меня есть файл 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
опцией) в одной файловой системе / точке монтирования. Это сохраняет ненужный поиск в разных точках монтирования.
Таким образом, поиск по жесткой ссылке несколько быстрее, чем поиск по программным ссылкам (пожалуйста, исправьте, если я ошибаюсь или не ясен).
Символические ссылки дают другое имя файла, аналогично жестким ссылкам. Но файл можно удалить, даже если есть оставшиеся символические ссылки.
Мои два цента на использование:
Мягкие ссылки могут использоваться для сокращения длинных имен путей, то есть:
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
Я просто нашел простой способ понять жесткие ссылки в обычном сценарии, установить программное обеспечение.
Однажды я загрузил программное обеспечение в папку Downloads
для установки. После этого sudo make install
некоторые исполняемые файлы были cp
добавлены в локальную папку bin. Здесь cp
создается жесткая ссылка . Я был счастлив с программным обеспечением, но вскоре понял, что Downloads
это не очень хорошее место в долгосрочной перспективе. Поэтому я mv
переместил папку с программным обеспечением в source
каталог. Ну, я все еще могу запускать программное обеспечение, как и раньше, не беспокоясь о каких-либо целевых ссылках, как в Windows. Это означает, что жесткая ссылка находит непосредственно inode и другие файлы вокруг.
В этом ответе, когда я говорю файл, я имею в виду местоположение в памяти
Все сохраненные данные хранятся в памяти с использованием структуры данных, называемой inode. Каждый inode имеет inodenumber. Номер inode используется для доступа к inode. Все жесткие ссылки на файл могут иметь разные имена, но иметь одинаковый номер inode. Поскольку все жесткие ссылки имеют один и тот же inodenumber (который обеспечивает доступ к одному и тому же inode), все они указывают на одну и ту же физическую память.
Символьная ссылка - это особый вид файла. Поскольку это также файл, он будет иметь имя файла и номер инода. Как сказано выше, номер инода принимает индекс, который указывает на данные. Теперь, что делает символическую ссылку особенной, так это то, что номера inode в символических ссылках обращаются к тем inode, которые указывают «путь» к другому файлу. Более конкретно, номер inode в символической ссылке принимает те inode, которые указывают на другую жесткую ссылку.
когда мы перемещаем, копируем, удаляем файл в графическом интерфейсе, мы играем с жесткими ссылками файла, а не с физической памятью. когда мы удаляем файл, мы удаляем жесткую ссылку файла. мы не стираем физическую память. Если все жесткие ссылки на файл будут удалены, доступ к сохраненным данным будет невозможен, хотя они все еще могут присутствовать в памяти.