Жесткие ссылки считаются нормальными файлами?

21

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

Мне было интересно, потому что я делаю bash-скрипт, который должен регистрировать файлы определенного типа и принимать соответствующие решения. Технически это не важно для моего проекта, но мне было любопытно.

Кроме того, если они считаются обычными файлами, то есть ли способ проверить, не являются ли эти файлы жестко связанными без анализа ls -i? И есть ли способ проверить, жестко ли связан какой-нибудь произвольный файл X с каким-либо другим произвольным файлом Y без использования find -iкоманды?

Мистер Минти Фреш
источник
5
С жесткими ссылками «X» на самом деле не связано с «Y». «X» и «Y» - это один и тот же файл.
Иордания
6
Все «обычные файлы» в каталоге являются жесткими ссылками. Некоторые такие файлы имеют более одного.
Эндрю Хенле
@ AndrewHenle Ух ты, хорошая мысль. Это именно то, что я искал, так что спасибо.
Мистер Минти Фреш
2
@ Mr.MintyFresh В частности, нет различия между «оригиналом» и «ссылкой», как для символических ссылок.
Random832

Ответы:

38

В системах в стиле Unix структура данных, которая представляет объекты файловой системы (другими словами, данные о файле), хранится в так называемом «inode».

Имя файла - это просто ссылка на этот индекс и называется «жесткой ссылкой». Нет разницы между именем файла и любой последующей ссылкой. Поэтому ответ «да»: жесткая ссылка - это обычный файл, и действительно, обычный файл - это жесткая ссылка.

Команда lsпокажет вам, сколько жестких ссылок существует на файл.

Например:

seumasmac@comp:~$ echo Hello > /tmp/hello.txt
seumasmac@comp:~$ ls -l /tmp/hello.txt 
-rw-rw-r-- 1 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

Здесь мы создали файл с именем /tmp/hello.txt. В 1выводе from ls -lуказывается, что существует 1 жесткая ссылка на этот файл. Эта жесткая ссылка - само имя файла /tmp/hello.txt.

Если мы сейчас создадим еще одну жесткую ссылку на этот файл:

seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt
seumasmac@comp:~$ ls -l /tmp/hello*
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/helloagain.txt
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

Теперь вы можете видеть, что оба имени файла указывают на наличие двух жестких ссылок на файл. Ни одно из них не является «правильным» именем файла, они оба одинаково действительны. Мы можем видеть, что они оба указывают на один и тот же индекс (в данном случае 5374043):

seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt  5374043 /tmp/hello.txt

Существует распространенное заблуждение, что это не так для каталогов. Я слышал, что люди говорят, что количество ссылок, возвращаемых lsдля каталога, равно количеству подкаталогов, в том числе .и ..является неправильным . Или, по крайней мере, хотя он даст вам правильный номер, это верно по неправильным причинам!

Если мы создадим каталог и сделаем, ls -ldмы получим:

seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct  4 13:20 /tmp/testdir

Это показывает, что есть 2 жесткие ссылки на этот каталог. Эти:

/tmp/testdir
/tmp/testdir/.

Обратите внимание, что /tmp/testdir/..это не ссылка на этот каталог, это ссылка на /tmp. И это говорит вам, почему работает функция «количество подкаталогов». Когда мы создаем новый подкаталог:

seumasmac@comp:~$ mkdir /tmp/testdir/dir2
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 3 seumasmac seumasmac 4096 Oct  4 13:24 /tmp/testdir

you can now see there are 3 hard links to /tmp/testdir directory. These are:

/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..

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

seumasmac
источник
Я понимаю, как работают метаданные, иноды и жесткие ссылки. Мне просто нужно было уточнить, был ли жесткий связанный файл засчитан как обычный файл. Это только показывает мне, что ответ «да» из-за столбца, посвященного этому, что неявно указывает, что это является родным для всех файлов. Извините, но мне придется понизить это :(
Мистер Минти Фреш
Это хорошо, я уверен, что это будет полезной информацией для кого-то еще.
seumasmac
Интересное редактирование с помощью системы жестких ссылок dotglob, я никогда не знал, что она делает это.
Мистер Минти Фреш
Я уточнил жесткие ссылки == обычный файл абзаца.
seumasmac
1
Особенно похоже на предложение: «Ни одно из них не является« правильным »именем файла, они оба одинаково действительны». Это важный компонент для понимания жестких ссылок. Очень красиво написано.
Wildcard
4

Жесткие ссылки считаются нормальными файлами?

Жесткие ссылки считаются тем, с чем они связаны. Вы можете ссылаться на что-нибудь в той же файловой системе.

mkdir test
cd !$

>file
ln -s file sym
mknod pipe p

ln file file2
ln -P sym sym2
ln pipe pipe2

ls -al

# sockets, too:
cat >tsock.c <<\EOD
#include <sys/socket.h>
#include <sys/un.h>
int main(int n, char **a)
{
        struct sockaddr_un test = { AF_UNIX, "socket" };
        int testfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
        bind(testfd,(struct sockaddr *)&test,sizeof test);
}
EOD
make tsock
./tsock

ln socket socket2

ls -al

# even devices if you want:
sudo mknod mytty c 5 0
ln mytty mytty2
sudo chmod 666 mytty

ls -al
# notice permissions are on an object not on the links to it:
echo Hi, Kilroy! >mytty2  

Каждая жесткая ссылка на что-либо эквивалентна, базовый объект остается неизменным до тех пор, пока на него есть какая-либо (edit: non-symbolic) ссылка (даже дескриптор открытого файла, за что я смущаюсь, потому что я очень благодарен).

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

Существуют (многие не-unix) файловые системы, которые не работают таким образом, включая те, которые называют то, что они предлагают, в качестве замены «жестких ссылок». OS X добавила эквивалент в HFS + (который не имеет их изначально), если я правильно помню, я не знаю, насколько точно он сохраняет семантику здесь.

jthill
источник
а что на ./tsockсамом деле делает?
mikeserv
@mikeserv Это программа make-a-socket выше, она просто сбрасывает ссылку на сокет с именем "socket" в своем текущем каталоге.
jthill
хорошо, но, возможно, мне следовало бы прояснить, как мало я знаю о сокетах. я думаю, что понимаю ссылки достаточно хорошо, и поэтому он просто дает тому же сокету новое имя, верно? это не имеет особого значения для сокетов или чего-то еще, да? извините за мое невежество.
mikeserv
1
@mikeserv Сокет - это чисто исполняемая сущность. socket()создает фактический сокет, bind()дает ему конкретное имя, connect()соединяет созданный вами сокет с каким-либо именованным сокетом. Разные виды сокетов используют разные виды имен, например, интернет-сокеты используют интернет-адреса, но все они имеют общий API (включая read()и write(), мне грустно, что вы не можете open()использовать сокет файловой системы, и ОС или libc делают socket()и connect()для вас) , man 7 socketимеет больше, все сетевые протоколы делают для fidgety manpage.
jthill
1
@mikeserv Видите, я могу написать pty и pts и, возможно, даже ptmx в хороший день, но это все. :-) По крайней мере, 5,0 узел работает везде, где я могу найти, это тип устройства control-tty. Я получил это только с помощью ls -l / dev / tty, думаю, мне там повезло.
до