104.6 Урок 1
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
104 Пристрої, файлові системи Linux, стандарт ієрархії файлової системи |
Тема: |
104.6 Створення та змінення жорстких та символьних посилань |
Урок: |
1 з 1 |
Вступ
У Linux деякі файли отримують особливу обробку через місце, в якому вони зберігаються, наприклад, тимчасові файли, або через те, як вони взаємодіють з файловою системою у вигляді посилань. У цьому уроці ви дізнаєтеся, що таке посилання та як ними керувати.
Розуміння посилань
Як уже зазначалося, в Linux все розглядається як файл. Але існує особливий тип файлу, який називається посилання, і є два типи посилань у системі Linux:
- Символьні посилання
-
також називаються м’які посилання, вони вказують на шлях до іншого файлу. Якщо ви видалите файл, на який вказує посилання (так звану ціль), посилання все одно буде існувати, але воно «перестане працювати», оскільки тепер вказує на «ніщо».
- Жорсткі посилання
-
Подумайте про жорстке посилання як другу назву для оригінального файлу. Вони не дублікати, а натомість є додатковий запис у файловій системі, що вказує на те саме місце (inode) на диску.
Tip
|
Inode — це структура даних, яка зберігає атрибути для об’єкта (наприклад, файлу чи каталогу) у файловій системі. Серед цих атрибутів є дозволи, право власності та інформація про блоки диску, де зберігаються дані для об’єкта. Думайте про це як про запис в індексі, звідси й назва, яка походить від «index node». |
Робота з жорсткими посиланнями
Створення жорстких посилань
ln
- команда для створення жорсткого посилання в Linux. Основний синтаксис:
$ ln TARGET LINK_NAME
TARGET
має вже існувати (це файл, на який буде вказувати посилання), і якщо ціль не знаходиться в поточному каталозі, або якщо ви хочете створити посилання в іншому місці, ви повинні вказати повний шлях до нього. Наприклад, команда:
$ ln target.txt /home/carol/Documents/hardlink
створить файл під назвою hardlink
у каталозі /home/carol/Documents/
, пов’язаний з файлом target.txt
у поточному каталозі.
Якщо ви пропустите останній параметр (LINK_NAME
), у поточному каталозі буде створено посилання з іменем цілі.
Керування жорсткими посиланнями
Жорсткі посилання — це записи у файловій системі, які мають різні імена, але вказують на ті самі дані на диску. Усі такі імена рівні і можуть використовуватися для звернення до файлу. Якщо змінити вміст для одного з імен, вміст усіх інших імен, які вказують на цей файл, зміниться, оскільки всі ці імена вказують на ті самі дані. Якщо ви видалите одне з імен, інші імена все одно працюватимуть.
Це відбувається тому, що коли ви «видаєте» файл, дані фактично не стираються з диска. Система просто видаляє запис у таблиці файлової системи, що вказує на inode, який відповідає даним на диску. Але якщо у вас є інший запис, який вказує на той самий inode, ви все одно можете дістатися до даних. Подумайте про це як про дві дороги, що сходяться в одній точці. Навіть якщо ви заблокуєте або переспрямуєте одну з доріг, ви все одно зможете дістатися до пункту призначення, використовуючи іншу.
Ви можете перевірити це за допомогою параметра -i
ls
. Розглянемо наступний вміст каталогу:
$ ls -li total 224 3806696 -r--r--r-- 2 carol carol 111702 Jun 7 10:13 hardlink 3806696 -r--r--r-- 2 carol carol 111702 Jun 7 10:13 target.txt
Номер перед дозволами є номером inode. Бачите, що файл hardlink
і файл target.txt
мають однаковий номер (3806696
)? Це тому, що одне є жорстким посиланням на інше.
Але який із них оригінал, а який посилання? Ви не можете точно сказати, оскільки для всіх практичних цілей вони однакові.
Зауважте, що кожне жорстке посилання, яке вказує на файл, збільшує кількість посилань на файл. Це число зазначено відразу після дозволів у вихідних даних ls -l
. За замовчуванням кожен файл має кількість посилань 1
(каталоги мають кількість 2
), і кожне жорстке посилання на нього збільшує цю кількість на одиницю. Отже, це є причиною кількості посилань 2
у файлах у списку вище.
На відміну від символьних посилань, ви можете створювати лише жорсткі посилання на файли, причому як посилання, так і ціль повинні знаходитися в одній файловій системі.
Переміщення та видалення жорстких посилань
Оскільки жорсткі посилання розглядаються як звичайні файли, їх можна видалити за допомогою rm
і перейменувати або перемістити у файловій системі за допомогою mv
. А оскільки жорстке посилання вказує на той самий inode цілі, його можна вільно переміщувати, без страху «зламати» посилання.
Символьні посилання
Створення символьних посилань
Команда, яка використовується для створення символьного посилання, також ln
, але з доданим параметром -s
. Таким чином:
$ ln -s target.txt /home/carol/Documents/softlink
Це створить файл під назвою softlink
у каталозі /home/carol/Documents/
, вказуючи на файл target.txt
у поточному каталозі.
Як і у випадку з жорсткими посиланнями, ви можете пропустити ім’я посилання, щоб створити посилання з такою ж назвою, що й цільове у поточному каталозі.
Керування символьними посиланнями
Символьні посилання вказують на інший шлях у файловій системі. Ви можете створювати програмні посилання на файли і каталоги, навіть у різних розділах. Досить легко помітити символьне посилання за допомогою виводу команди ls
:
$ ls -lh total 112K -rw-r--r-- 1 carol carol 110K Jun 7 10:13 target.txt lrwxrwxrwx 1 carol carol 12 Jun 7 10:14 softlink -> target.txt
У наведеному вище прикладі першим символом у дозволах для файлу softlink
є l
, що вказує на символьне посилання. Крім того, відразу після імені файлу ви бачите назву цілі, на яку вказує посилання, файл target.txt
.
Зауважте, що в списках файлів і каталогів самі програмні посилання завжди показують дозволи rwx
для користувача, групи та інших, але на практиці дозволи доступу для них такі ж, як і для цілі.
Переміщення та видалення символьних посилань
Як і жорсткі посилання, символьні посилання можна видалити за допомогою rm
і перемістити або перейменувати за допомогою mv
. Однак при їх створенні слід бути особливо обережними, щоб уникнути «розриву» посилання, якщо воно переміщено з початкового розташування.
Створюючи символьні посилання, ви повинні знати, що якщо шлях не вказано повністю, розташування цілі інтерпретується як відносне до розташування посилання. Це може створити проблеми, якщо посилання або файл, на який воно вказує, буде переміщено.
Це легше зрозуміти на прикладі. Скажімо, у вас є файл з назвою original.txt
у поточному каталозі, і ви хочете створити символьне посилання на нього під назвою softlink
. Ви можете використати:
$ ln -s original.txt softlink
І, мабуть, все було б добре. Давайте перевіримо за допомогою ls
:
$ ls -lh total 112K -r--r--r-- 1 carol carol 110K Jun 7 10:13 original.txt lrwxrwxrwx 1 carol carol 12 Jun 7 19:23 softlink -> original.txt
Подивіться, як створюється посилання: softlink
вказує на (→
) original.txt
. Однак давайте подивимося, що станеться, якщо перемістити посилання в попередній каталог і спробувати відобразити його вміст за допомогою команди less
:
$ mv softlink ../ $ less ../softlink ../softlink: No such file or directory
Оскільки шлях до original.txt
не вказано, система припускає, що він знаходиться в тому ж каталозі, що й посилання. Коли це більше не відповідає дійсності, посилання перестає працювати.
Щоб запобігти цьому, завжди вказуйте повний шлях до цілі під час створення посилання:
$ ln -s /home/carol/Documents/original.txt softlink
Тоді, куди б ви не перемістили посилання, воно все одно працюватиме, оскільки вказує на абсолютне розташування цілі. Перевірте це за допомогою ls
:
$ ls -lh total 112K lrwxrwxrwx 1 carol carol 40 Jun 7 19:34 softlink -> /home/carol/Documents/original.txt
Вправи до посібника
-
Який параметр використовується для
chmod
у символьному режимі, щоб увімкнути sticky-біт у каталозі? -
Уявіть, що в каталозі
/home/carol/Documents
є файл з іменемdocument.txt
. Яка команда для створення символьного посилання на нього з назвоюtext.txt
у поточному каталозі? -
Поясніть різницю між жорстким посиланням на файл і копією цього файлу.
Дослідницькі вправи
-
Уявіть, що всередині каталогу ви створюєте файл під назвою
recipes.txt
. Усередині цього каталогу ви також створите жорстке посилання на цей файл, яке має назвуreceitas.txt
, і символьне (або м’яке) посилання на нього під назвоюrezepte.txt
.$ touch recipes.txt $ ln recipes.txt receitas.txt $ ln -s recipes.txt rezepte.txt
Вміст каталогу має бути таким:
$ ls -lhi total 160K 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 receitas.txt 5388833 -rw-r--r-- 4 carol carol 0K jun 17 17:25 recipes.txt 5388837 lrwxrwxrwx 1 carol carol 12 jun 17 17:25 rezepte.txt -> receitas.txt
Пам’ятайте, що як жорстке посилання
receitas.txt
вказує на той самий inode, якому призначеноrecipes.txt
. Що станеться з символьним посиланнямrezepte.txt
, якщо файлreceitas.txt
буде видалено? Чому? -
Уявіть, що у вас є флеш-накопичувач, підключений до системи та змонтований у
/media/youruser/FlashA
. Ви хочете створити посилання під назвоюschematics.pdf
у своєму домашньому каталозі, вказуючи на файлesquema.pdf
у корені флеш-накопичувача. Отже, ви вводите команду:$ ln /media/youruser/FlashA/esquema.pdf ~/schematics.pdf
Що сталося? Чому?
-
Розглянемо наступні виведені дані
ls -lah
:$ ls -lah total 3,1M drwxr-xr-x 2 carol carol 4,0K jun 17 17:27 . drwxr-xr-x 5 carol carol 4,0K jun 17 17:29 .. -rw-rw-r-- 1 carol carol 2,8M jun 17 15:45 compressed.zip -rw-r--r-- 4 carol carol 77K jun 17 17:25 document.txt -rw-rw-r-- 1 carol carol 216K jun 17 17:25 image.png -rw-r--r-- 4 carol carol 77K jun 17 17:25 text.txt
-
Скільки посилань вказують на файл
document.txt
? -
Це м’які чи жорсткі посилання?
-
Який параметр слід передати до
ls
, щоб побачити, який inode займає кожен файл?
-
-
Уявіть, що у вашому каталозі
~/Documents
є файл з назвоюclients.txt
, який містить деякі імена клієнтів, і каталог з назвоюsomedir
. Усередині цього каталогу є інший файл також під назвоюclients.txt
. Щоб відтворити цю структуру, скористайтеся наведеними нижче командами.$ cd ~/Documents $ echo "John, Michael, Bob" > clients.txt $ mkdir somedir $ echo "Bill, Luke, Karl" > somedir/clients.txt
Потім ви створюєте посилання всередині
somedir
з назвоюpartners.txt
, що вказує на цей файл, за допомогою команд:$ cd somedir/ $ ln -s clients.txt partners.txt
Отже, структура каталогу така:
Documents |-- clients.txt `-- somedir |-- clients.txt `-- partners.txt -> clients.txt
Тепер ви переміщуєте
partners.txt
зsomedir
до~/Documents
і виводите його вміст.$ cd ~/Documents/ $ mv somedir/partners.txt . $ less partners.txt
Чи працюватиме посилання? Якщо так, то вміст якого файлу буде виведено? Чому?
-
Розглянемо такі файли:
-rw-r--r-- 1 carol carol 19 Jun 24 11:12 clients.txt lrwxrwxrwx 1 carol carol 11 Jun 24 11:13 partners.txt -> clients.txt
Які права доступу для
partners.txt
? Чому?
Підсумки
На цьому уроці ми дізналися:
-
Що таке посилання.
-
Різниця між символьним і жорстким посиланнями.
-
Як створювати посилання.
-
Як перемістити, перейменувати або видалити ці посилання.
На цьому уроці обговорювалися наступні команди:
-
ln
: команда “link”. Сама по собі ця команда створює жорстке посилання. За допомогою перемикача-s
можна створити символьне або м’яке посилання. Пам’ятайте, що жорсткі посилання можуть перебувати лише в одному розділі та файловій системі, а символьні посилання можуть перетинати розділи та файлові системи (навіть мережеве сховище). -
Параметр
-i
дляls
дозволяє переглядати номер inode для файлу.
Відповіді на вправи до посібника
-
Який параметр для
chmod
у символьному режимі треба застосувати, щоб увімкнути stiky-біт у каталозі?Символом stick-біту в символьному режимі є
t
. Оскільки ми хочемо ввімкнути (додати) цей дозвіл до каталогу, параметр має бути+t
. -
Уявіть, що в каталозі
/home/carol/Documents
є файл з іменемdocument.txt
. Яка команда для створення символьного посилання на нього з назвоюtext.txt
у поточному каталозі?ln -s
– це команда для створення символьного посилання. Оскільки ви повинні вказати повний шлях до файлу, на який ви посилаєтеся, команда виглядає наступним чином:$ ln -s /home/carol/Documents/document.txt text.txt
-
Поясніть різницю між жорстким посиланням на файл і копією цього файлу.
Жорстке посилання — це просто інша назва файлу. Незважаючи на те, що воно виглядає як дублікат оригінального файлу, для всіх цілей посилання та оригінал однакові, оскільки вони вказують на ті самі дані на диску. Зміни, внесені до вмісту посилання, будуть відображені в оригіналі, і навпаки. Копія - це повністю самостійна сутність, що займає інше місце на диску. Зміни в копії не будуть відображені на оригіналі, і навпаки.
Відповіді до дослідницьких вправ
-
Уявіть, що всередині каталогу ви створюєте файл під назвою
recipes.txt
. Усередині цього каталогу ви також створите жорстке посилання на цей файл, яке має назвуreceitas.txt
, і символьне (або м’яке) посилання на нього під назвоюrezepte.txt
.$ touch recipes.txt $ ln recipes.txt receitas.txt $ ln -s receitas.txt rezepte.txt
Вміст каталогу має бути таким:
$ ls -lhi total 160K 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 receitas.txt 5388833 -rw-r--r-- 4 carol carol 0K jun 17 17:25 recipes.txt 5388837 lrwxrwxrwx 1 carol carol 12 jun 17 17:25 rezepte.txt -> receitas.txt
Пам’ятайте, що як жорстке посилання
receitas.txt
вказує на той самий inode, якому призначеноrecipes.txt
. Що станеться з символьним посиланнямrezepte.txt
, якщо файлreceitas.txt
буде видалено? Чому?Символьне посилання
rezepte.txt
перестане працювати. Це пов’язано з тим, що м’які посилання вказують на імена, а не на inode, і ім’яreceitas.txt
більше не існує, навіть якщо дані все ще знаходяться на диску під ім’ямrecipes.txt
. -
Уявіть, що у вас є флеш-накопичувач, підключений до системи та змонтований у
/media/youruser/FlashA
. Ви хочете створити посилання під назвоюschematics.pdf
у своєму домашньому каталозі, вказуючи на файлesquema.pdf
у корені флеш-накопичувача. Отже, ви вводите команду:$ ln /media/youruser/FlashA/esquema.pdf ~/schematics.pdf
Що сталося? Чому?
Команда не мала б успіху. Повідомлення про помилку буде
Invalid cross-device link
(Недійсне міжпристроєве посилання), і це пояснює причину: жорсткі посилання не можуть вказувати на ціль в іншому розділі або пристрої. Єдиний спосіб створити таке посилання - це використовувати символьне або м’яке посилання, додавши параметр-s
доln
. -
Розглянемо наступні виведені дані
ls -lah
:$ ls -lah total 3,1M drwxr-xr-x 2 carol carol 4,0K jun 17 17:27 . drwxr-xr-x 5 carol carol 4,0K jun 17 17:29 .. -rw-rw-r-- 1 carol carol 2,8M jun 17 15:45 compressed.zip -rw-r--r-- 4 carol carol 77K jun 17 17:25 document.txt -rw-rw-r-- 1 carol carol 216K jun 17 17:25 image.png -rw-r--r-- 4 carol carol 77K jun 17 17:25 text.txt
-
Скільки посилань вказують на файл
document.txt
?Кожен файл починається з кількості посилань
1
. Оскільки кількість посилань для файлу дорівнює4
, є три посилання, які вказують на цей файл. -
Це м’які чи жорсткі посилання?
Це жорсткі посилання, оскільки м’які посилання не збільшують кількість посилань для файлу.
-
Який параметр слід передати до
ls
, щоб побачити, який inode займає кожен файл?Параметр
-i
. Inode буде показано як перший стовпець у виведенніls
, як показано нижче:$ ls -lahi total 3,1M 5388773 drwxr-xr-x 2 carol carol 4,0K jun 17 17:27 . 5245554 drwxr-xr-x 5 carol carol 4,0K jun 17 17:29 .. 5388840 -rw-rw-r-- 1 carol carol 2,8M jun 17 15:45 compressed.zip 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 document.txt 5388837 -rw-rw-r-- 1 carol carol 216K jun 17 17:25 image.png 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 text.txt
-
-
Уявіть, що у вашому каталозі
~/Documents
є файл з назвоюclients.txt
, який містить деякі імена клієнтів, і каталог з назвоюsomedir
. Усередині цього каталогу є інший файл також під назвоюclients.txt
. Щоб відтворити цю структуру, скористайтеся наведеними нижче командами.$ cd ~/Documents $ echo "John, Michael, Bob" > clients.txt $ mkdir somedir $ echo "Bill, Luke, Karl" > somedir/clients.txt
Потім ви створюєте посилання всередині
somedir
з назвоюpartners.txt
, що вказує на цей файл, за допомогою команд:$ cd somedir/ $ ln -s clients.txt partners.txt
Отже, структура каталогу така:
Documents |-- clients.txt `-- somedir |-- clients.txt `-- partners.txt -> clients.txt
Тепер ви переміщуєте
partners.txt
зsomedir
до~/Documents
і виводите його вміст.$ cd ~/Documents/ $ mv somedir/partners.txt . $ less partners.txt
Чи працюватиме посилання? Якщо так, то вміст якого файлу буде виведено? Чому?
Це «складно», але посилання буде працювати, і виведений файл буде файлом у
~/Documents
, що містить іменаJohn
,Michael
,Bob
.Пам’ятайте, що оскільки ви не вказали повний шлях до цільового
clients.txt
під час створення символьного посиланняpartners.txt
, цільове розташування буде інтерпретовано з відносним розташуванням посилання, яке в даному випадку є поточним каталогом.Коли посилання було переміщено з
~/Documents/somedir
до~/Documents
, воно повинно припинити роботу, оскільки цільова сторінка більше не перебуває в тому самому каталозі, що й посилання. Проте трапилось так, що у~/Documents
є файл з іменемclients.txt
, тож посилання вказуватиме на цей файл, а не на вихідну ціль всередині~/somedir
.Щоб уникнути цього, завжди вказуйте повний шлях до цілі під час створення символьного посилання.
-
Розглянемо такі файли:
-rw-r--r-- 1 carol carol 19 Jun 24 11:12 clients.txt lrwxrwxrwx 1 carol carol 11 Jun 24 11:13 partners.txt -> clients.txt
Які права доступу для
partners.txt
? Чому?Для
partners.txt
дозволи доступуrw-r—r--
, оскільки посилання завжди успадковують ті самі права доступу, що має ціль.