Чи вважаються жорсткі посилання звичайними файлами?


21

Мені було цікаво, чи існує спосіб зареєструвати це, але оскільки більшість сучасних пошукових систем не дуже добре працюють із фразами довжиною близько 5 слів, мені потрібна допомога в цьому.

Мені це було цікаво, тому що я роблю сценарій bash, який повинен реєструвати файли як певні типи та приймати рішення відповідно. Це технічно не важливо для мого проекту, але мені було цікаво.

Крім того, якщо вони вважаються звичайними файлами, то чи існує спосіб перевірити, чи ці файли жорстко пов'язані без необхідності розбору ls -i? І чи є спосіб перевірити, чи якийсь довільний файл, X, важко пов'язаний з яким-небудь іншим довільним файлом, Y, без використання find -iкоманди?


5
З жорсткими посиланнями "X" насправді не пов'язаний з "Y". "X" і "Y" - це один і той же файл.
jordanm

6
Всі "звичайні файли" в каталозі є посиланнями. Деякі такі файли мають більше одного.
Ендрю Генле

@AndrewHenle Вау, хороший момент. Це саме та річ, яку я шукав, тому дякую.
Містер Мінті Фреш

2
@ Mr.MintyFresh Зокрема, немає відмінності між "оригіналом" та "посиланням", як це існує для символічних посилань.
Випадково832

Відповіді:


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У висновку 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

тепер ви бачите, що обидві назви файлів вказують, що на файл є 2 жорстких посилання. Жодне з них не є "належним" ім'ям файлу, вони обоє однаково справедливі. Ми можемо бачити, що вони обоє вказують на один і той же індед (у даному випадку 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

тепер ви можете бачити, що є три жорсткі посилання на /tmp/testdirкаталог. Це:

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

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


Я розумію, як працюють метадані, inode та жорстке посилання. Мені просто потрібно було прояснити, чи важко пов'язаний файл вважався звичайним файлом. Це лише показує мені, що відповідь "так" через колонку, присвячену цьому, що неявно вказує на те, що вона є власною для всіх файлів. Так вибачте, але мені доведеться підкреслити це :(
Містер Мінті Фреш

Це добре, я впевнений, що це буде корисною інформацією для когось іншого.
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  

Кожне тверде посилання на що-небудь еквівалентне, основний об'єкт тримається навколо, якщо на ньому взагалі є якесь (редагування: несимволічне) посилання (навіть дескриптор відкритого файлу, за що я зніяковіє, тому дуже вдячний).

Система буде застосовувати правила щодо посилань на каталоги, ви отримуєте одне іменоване посилання на каталог, і система автоматично додає вкладене .посилання та будь-які ..посилання підкаталогів (зауважте, що .у ls's вище два посилання), але це явна перевірка, на деяких модифікованих Користувачі привілейованих систем, які обіцяють обіцяти не обіцяти циклів, можуть додавати нові посилання самі. Файлова система не хвилює, вона може представляти довільні графіки каталогів просто чудово, але ніхто не хоче з ними мати справу.

Є (безлічі не unix) файлових систем, які не працюють таким чином, в тому числі такі, що називають те, що вони пропонують, як замінник "жорстких посилань". OS X збила еквівалент HFS + (який не має їх у початковому розумінні), якщо я пам'ятаю правильно, я не знаю, наскільки вірно він зберігає тут семантику.


що ./tsockнасправді робить?
mikeserv

@mikeserv Це програма make-a-socket вгорі, вона просто скидає сокетне посилання під назвою "socket" у поточному каталозі.
jthill

добре, але, можливо, я повинен був би зрозуміти, як мало я знаю про розетки. Я думаю, що я досить добре розумію посилання, і це просто дає тому ж розетці нове ім'я, правда? це не має особливого значення для розеток чи чогось іншого, так? вибачте за моє незнання.
mikeserv

1
@mikeserv Сокет - сутність простого виконання. socket()створює фактичну розетку, bind()дає їй конкретну назву, connect()підключає сокет, який ви зробили, до якогось названого сокета. Різні типи сокетів використовують різні типи імен, наприклад, Інтернет-розетки використовують Інтернет-адреси, але всі вони мають спільний API (в тому числі read()і write(), мені сумно, що ви не open()можете роз'єму файлової системи, socket()а connect()для вас потрібна ОС або libc ) . man 7 socketБільше того, всі мережеві протоколи роблять для непоказної сторінки.
jthill

1
@mikeserv Дивіться, я можу писати pty і pts, і, мабуть, навіть ptmx в хороший день, але це про це. :-) принаймні 5,0 вузол працює скрізь, де я можу знайти, це тип контролюючого пристрою. Я отримав це лише з ls -l / dev / tty, здогадуюсь, мені там пощастило.
jthill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.