Могут ли файлы с разными именами быть жестко связаны?

Я – новый пользователь Linux, изучающий Arch Linux и недавно Linux From Scratch (7.7). Я установил новую установку AL для моего хоста LFS; Я вручную (а также с предоставленным сценарием bash ) проверил необходимые пакеты на моем хосте. В моем случае я уверен, что разрешил все расхождения, за исключением ссылки / usr / bin / yacc на / usr / bin / bison.

Предоставленный скрипт приводит к тому, что yacc is bison (GNU Bison) 3.0.4 , в отличие от /usr/bin/yacc -> /usr/bin/bison . Поскольку последний был выходным форматом для проверочных символических ссылок, я предположил, что скрипт говорит мне, что yacc подготовлен, но использует другую ссылку. Я больше разбирался в файловых системах Linux и упустил поверхностное понимание того, что фактические данные описываются inodes (метаданные), на которые в свою очередь указывают (абстрактные) файлы, с которыми мы взаимодействуем. Файлы, которые просто указывают на тот же индекс, считаются жесткими ссылками (хотя, я думаю, файлы не зависят друг от друга). Я побежал sudo ls -il /usr/bin | less sudo ls -il /usr/bin | less и найдено, что yacc и bison имели несколько разные номера inode (152077 и 152078 соответственно). Означает ли это, что они не связаны друг с другом, или я неправильно истолковываю вывод сценария и нуждаюсь в исправлении?

Изменить: соответствующие команды из сценария bash:

 bison --version | head -n1 if [ -h /usr/bin/yacc ]; then echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`"; elif [ -x /usr/bin/yacc ]; then echo yacc is `/usr/bin/yacc --version | head -n1` else echo "yacc not found" fi 

Когда вы сделали ls -il /usr/bin , вы указали имена файлов и соответствующие номера индексов. В этом контексте, вероятно, лучше всего думать о «имени файла» как отдельном от «inode» и думать об inode как файле.

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

С этой точки зрения каждое имя файла является просто «жесткой ссылкой». Каталог просто соответствует именам файлов и номерам inode. Между «реальным именем файла» и «жесткой ссылкой» не проводится никакого различия. Таким образом, ваши имена файлов /usr/bin/yacc и /usr/bin/bison сопоставляются с разными номерами inode, это означает, что эти два имени относятся к различным метаданным и различным файлам. Говоря небрежно, файлы не являются жесткими ссылками в том смысле, что только одно имя файла соответствует каждому из двух инодов, но из технического смысла оба имени файла являются жесткими ссылками, каждая из них представляет собой единственную жесткую ссылку на индексный дескриптор.

Что касается вашего скрипта и «почти идентичных номеров inode», то yacc и bison связаны. На моем ноутбуке Arch:

 1032 % ls -li /usr/bin/yacc /usr/bin/bison 1215098 -rwxr-xr-x 1 root root 394152 Jan 23 2015 /usr/bin/bison* 1215097 -rwxr-xr-x 1 root root 41 Jan 23 2015 /usr/bin/yacc* 1033 % file /usr/bin/yacc /usr/bin/yacc: POSIX shell script, ASCII text executable 1034 % cat /usr/bin/yacc #! /bin/sh exec '/usr/bin/bison' -y "$@" 

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

Но yacc связан с bison в том, что это скрипт оболочки, который вызывает bison . Вот почему ваш скрипт дает вывод что-то вроде:

 bison (GNU Bison) 3.0.4 yacc is bison (GNU Bison) 3.0.4 

Ваш скрипт вызывает /usr/bin/yacc который на самом деле просто выполняет /usr/bin/bison .

Если два файла имеют разные номера inode, они не имеют жесткой привязки. Это определение жестких ссылок – это один и тот же файл (такие же метаданные, включая номер inode) в разных местах файловой системы (разные имена или разные каталоги).

Bison – это реализация yacc. Точнее, bison -y эмулирует POSIX yacc . У вас может быть другая реализация yacc как /usr/bin/yacc . В вашем случае, похоже, вы дважды установили Bison, один раз, как /usr/bin/yacc и один раз как /usr/bin/bison . Они могут быть или не быть построены таким же образом. Проверьте скрипты сборки.

В тире, ksh или bash вы можете использовать [ /usr/bin/yacc -ef /usr/bin/bison ] для проверки того, являются ли /usr/bin/yacc и /usr/bin/bison одним и тем же файлом (т. Е. re цепей символических ссылок (возможно, длины 0), ведущих к жестким ссылкам одного и того же файла).