5.4 Урок 1
Сертифікат: |
Linux Essentials |
---|---|
Версія: |
1.6 |
Розділ: |
5 Безпека та дозволи на файли |
Тема: |
5.4 Спеціальні каталоги та файли |
Урок: |
1 з 1 |
Вступ
У Linux все розглядається як файл. Однак до деяких файлів особливе ставлення через місце їх зберігання, наприклад тимчасові файли, або через спосіб взаємодії з файловою системою, наприклад посилання. У цьому уроці ми дізнаємося, де знаходяться такі файли, як вони працюють і як ними керувати.
Тимчасові файли
Тимчасові файли – це файли, які використовуються програмами для зберігання даних, які потрібні лише на короткий час. Це можуть бути дані запущених процесів, журнали збоїв, файли-шаблони з автозбереження, проміжні файли, які використовуються під час перетворення файлів, файли кешу тощо.
Розташування тимчасових файлів
Версія 3.0 Стандарт ієрархії файлової системи (FHS, Filesystem Hierarchy Standard) визначає стандартні розташування для тимчасових файлів у системах Linux. Кожне місце розташування має різну мету та поведінку, тому розробникам рекомендується дотримуватися умов, встановлених FHS під час запису тимчасових даних на диск.
/tmp
-
Відповідно до FHS, програми не повинні вважати, що файли, записані тут, будуть збережені між викликами програми. Рекомендація полягає в тому, щоб цей каталог був очищений (усі файли стерті) під час завантаження системи, хоча це не є обов’язковим.
/var/tmp
-
Інше місце для тимчасових файлів, але його не слід очищати під час завантаження системи, тобто файли, збережені тут, зазвичай зберігаються між перезавантаженнями.
/run
-
Цей каталог містить дані змінних часу виконання, які використовуються запущеними процесами, наприклад файли ідентифікаторів процесу (
.pid
). Програми, яким потрібно більше одного файлу під час виконання, можуть створювати тут підкаталоги. Це розташування повинно бути очищено під час завантаження системи. Колись задачі цього каталогу виконував/var/run
, а в деяких системах/var/run
може бути символьним посиланням на/run
.
Зауважте, що ніщо не заважає програмі створювати тимчасові файли в інших місцях системи, але рекомендовано дотримуватися умов, встановлених FHS.
Дозволи на тимчасові файли
Наявність загальносистемних тимчасових каталогів у багатокористувацькій системі створює певні проблеми щодо дозволів доступу. Спочатку можна подумати, що такі каталоги будуть “доступними для запису всім”, тобто будь-який користувач міг би записувати або видаляти в них дані. Але якби це було так, як ми могли б запобігти стиранню або зміні файлів, створених іншим користувачем?
Рішення — це спеціальний дозвіл під назвою sticky-біт, який застосовується як до каталогів, так і до файлів. Однак з міркувань безпеки ядро Linux ігнорує sticky-біт, коли він застосовується до файлів. Коли цей спеціальний біт встановлений для каталогу, він не дозволяє користувачам видаляти або перейменовувати файл у цьому каталозі, якщо вони не є власниками файлу.
Каталоги з встановленим sticky-біт показують t
, що замінює x
у дозволі для інших у виведенні команди ls -l
. Наприклад, давайте перевіримо дозволи для каталогів /tmp
і /var/tmp
:
$ ls -ldh /tmp/ /var/tmp/ drwxrwxrwt 25 root root 4,0K Jun 7 18:52 /tmp/ drwxrwxrwt 16 root root 4,0K Jun 7 09:15 /var/tmp/
Як ви можете бачити, якщо t
замінює x
у дозволі для інших, обидва каталоги мають встановлений sticky-біт.
Щоб встановити sticky-біт у каталозі за допомогою chmod
у числовому режимі, використовуйте чотиризначне позначення та 1
як першу цифру. Наприклад:
$ chmod 1755 temp
встановить sticky-біт для каталогу з назвою temp, а дозволи — rwxr-xr-t.
При використанні символьного режиму використовуйте параметр t
. Отже, +t
, щоб встановити sticky-біт, і -t
, щоб його вимкнути. Таким чином:
$ chmod +t temp
Поняття про посилання
Ми вже говорили, що в Linux все розглядається як файл. Але існує спеціальний тип файлу, який називається посилання (link), і є два типи посилань у системі Linux:
- Символьні посилання
-
також називаються м’які посилання (soft links), вони вказують на шлях до іншого файлу. Якщо ви видалите файл, на який вказує посилання (цей файл називається target), воно все одно буде існувати, але воно “перестане працювати”, оскільки тепер вказує на “об’єкт, якого не існує”.
- Жорсткі посилання
-
Подумайте про жорстке посилання як другу назву для вихідного файлу. Вони не є дублікатами, а натомість являються додатковим записом у файловій системі, що вказує на те саме місце (inode) на диску.
Tip
|
Inode — це структура даних, яка зберігає атрибути для об’єкта (наприклад, файлу чи каталогу) у файловій системі. Серед цих атрибутів є ім’я файлу, дозволи, право власності та на яких блоках диска зберігаються дані для об’єкту. Думайте про це як про запис в індексі, звідси й назва, яка походить від “індексного вузла”. |
Робота з жорсткими посиланнями
Створення жорстких посилань
Команда для створення жорсткого посилання в Linux цє ln
. Основний синтаксис:
$ 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 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 77K jun 17 17:25 recipes.txt 5388837 lrwxrwxrwx 1 carol carol 12 jun 24 10:12 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
-
Параметр
-i
дляls
Відповіді до вправ посібника
-
Уявіть, що програмі потрібно створити одноразовий тимчасовий файл, який більше ніколи не знадобиться після закриття програми. Який правильний каталог для створення цього файлу?
Оскільки ми не піклуємось про файл після завершення роботи програми, правильний каталог
/tmp
. -
Який тимчасовий каталог повинен бути очищений під час процесу завантаження?
Каталог
/run
або, у деяких системах,/var/run
. -
Який параметр для
chmod
у символьному режимі, щоб увімкнути sticky-біт для каталогу?Символом для sticky-біту в символьному режимі є
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 77K jun 17 17:25 recipes.txt 5388837 lrwxrwxrwx 1 carol carol 12 jun 24 10:12 rezepte.txt -> receitas.txt
Пам’ятайте, що жорстке посилання
receitas.txt
вказує на той самий inode, що йrecipes.txt
. Що станеться з програмним посиланнямrezepte.txt
, якщо назвуreceitas.txt
буде видалено? Чому?Програмне посилання
rezepte.txt
перестане працювати. Це пов’язано з тим, що м’які посилання вказують на імена, а не на inodes, і ім’я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 rigues rigues 4,0K jun 17 17:27 . 5245554 drwxr-xr-x 5 rigues rigues 4,0K jun 17 17:29 .. 5388840 -rw-rw-r-- 1 rigues rigues 2,8M jun 17 15:45 compressed.zip 5388833 -rw-r--r-- 4 rigues rigues 77K jun 17 17:25 document.txt 5388837 -rw-rw-r-- 1 rigues rigues 216K jun 17 17:25 image.png 5388833 -rw-r--r-- 4 rigues rigues 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 rigues rigues 19 Jun 24 11:12 clients.txt lrwxrwxrwx 1 rigues rigues 11 Jun 24 11:13 partners.txt -> clients.txt
Які права доступу для
partners.txt
? Чому?Дозволи доступу для
partners.txt
єrw-r—r--
, оскільки посилання завжди успадковують ті самі права доступу, що має цільовий файл.