Автор Гілка: Symlink, hardlink, inode....  (Прочитано 3020 раз)

Відсутній Дмитро Ковальов

  • Кореспондент
  • ***
  • дописів: 236
  • Карма: +0/-0
Symlink, hardlink, inode....
« : 2004-03-18 10:55:52 »
Симлінки, хардлінки, айноди -- що це все таке, і як в цьому
розібратись?


Айнод


Перш за все почнемо з айнода (inode). Inode походить від "Index NODE" або "індексний вузол" українською. По суті -- це просто число, часто дуже велике. Всі файли в файловій системі Юнікса мають один і тільки один відповідний айнод. Якщо трохи спростити, то про айнод можна думати просто як про номер файла. В айноді зберігається така інформація, як тип файла (звичайний файл, тека, симлінк, пристрій), положення на диску (номер блока), розмір, дозволи доступу, тощо.

Кожна файлова система має обмежену, фіксовану кількість айнодів, яка визначається при створенні файлової системи на диску (newfs в Юніксах, чи mkfs в Лінаксах). Що відбувається, коли айноди закінчуються? Наприклад, я хочу створити дуже багато маленьких файлів. Відбувається цікаве -- місця на диску повно, а створити ще один файл неможливо. З'являється повідомлення "out of inodes". Єдиним виходом з цієї ситуації (крім очевидного - не створювати стільки файлів) буде
переформатування диску з більшою кількістю айнодів.

Відсутній Дмитро Ковальов

  • Кореспондент
  • ***
  • дописів: 236
  • Карма: +0/-0
Файл (Symlink, hardlink, inode....)
« Відповідей #1 : 2004-03-18 11:01:47 »
Файл в Юніксі

Що таке файл в Юніксі? Це айнод, на який наліплена лейбочка: етикетка. Тобто, це айнод з назвою. Етикетка, яка "приліплена" до номера (а не навпаки) і є назвою файла. Чи може файл мати більше однієї назви? Так може, про це йтиметься далі в розділі про жорсткі посилання.

Чи можна побачити айнод, або як дізнатися, який айнод відповідає саме цьому файлу? Це буде параметр "-i" в команді ls. Ось, наприклад, як виглядає айнод цього файла:

$ ls -i sym-hard_links-inode.txt
6017890 sym-hard_links-inode.txt

Є інші команди, які використовують айноди. Наприклад, команда find може знайти файл по його айноду:

$ find . -inum 6017890
./sym-hard_links-inode.txt
$

Коли це може бути потрібним? Наприклад виникають інколи ситуації з сервером NFS, який видає помилки типу "сталася помилка в файлі з айнодом 89310498019384". Який це файл, можна визначити тільки через команду find, подану вище.

Відсутній Дмитро Ковальов

  • Кореспондент
  • ***
  • дописів: 236
  • Карма: +0/-0
Тека  (Symlink, hardlink, inode....)
« Відповідей #2 : 2004-03-18 11:36:38 »
Тека (directory) в Юніксі


Що таке тека в Юніксі? Це самий звичайний файл особливого типу -- типу "тека". Як вже згадувалось раніше -- тип файлу задається айнодом. В цьому файлі записується сама звичайна табличка: назва файла -> айнод.

Власне про теку немає що більше і сказати. Табличка вона і є табличка.

Відсутній Дмитро Ковальов

  • Кореспондент
  • ***
  • дописів: 236
  • Карма: +0/-0
Re: Symlink, hardlink, inode....
« Відповідей #3 : 2004-03-18 11:39:26 »
Хардлінки  і як файл може мати багато назв

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

І загалом, навіть, якщо Ви цього і не підозрюєте, це відбувається на кожному кроці в Юніксі.

Подивіться на цей вивід команди ls. Я вже писав, що "ls -i" показує айнод файла. Додам тільки, що параметр '-d' означає: "якщо аргумент до команди ls є текою, показати тільки її назву, і не показувати її зміст".


$ ls -ldi /
      2 drwxr-xr-x   22 root     root         4096 Mar 14 01:08 /
$ cd /etc
$
$ ls -ldi ..
      2 drwxr-xr-x   22 root     root         4096 Mar 14 01:08 ..
$ cd /
$ ls -ldi .
      2 drwxr-xr-x   22 root     root         4096 Mar 14 01:08 .
$

Зверніть увагу, що в усіх трьох випадках команда ls показала, що теки "/", тека "." коли ми знаходимось в "/",  і тека "..", коли ми знаходимось в "/etc", вказують на один і той же айнод (2). Тобто, це і є той випадок, коли один і той же айнод виступає як кілька різних файлів. Це і називається жорсткими посиланнями, "хард-лінками" або hard-link. З цього має бути зрозумілим, що тека "." є хард-лінком на саму себе, а тека ".." -- посиланням на теку, що лежить рівнем вище.

Третій стовпчик виводу команди в усіх трьох випадках також однаковий -- число 22. Цей стовпчик показує кількість "лейбочок" навішених на айнод. В нашому випадку, це означає, що на теку "/" посилається з 22 різних місць. Це стає зрозумілим, якщо зробити таке:

$ ls  / | wc -w
     21

Тобто, "в корені" у нас існує 21 тека. В кожній з них є "..", а це означає, що з кожної теки, яка лежить "в корені" веде посилання на "/". Ще одне посилання, це "/" -> "."


« Змінено: 2004-03-18 11:42:26 від dmytro »