Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PR_СП_лекции_укр.doc
Скачиваний:
6
Добавлен:
22.04.2019
Размер:
697.34 Кб
Скачать

2.1.2 Права доступу до файлів

Кожен файл в ОС UNIX містить набір прав доступу, по якому визначається, як користувач взаємодіє з даним файлом. Цей набір зберігається в індексному дескрипторі даного файлу у вигляді цілого значення, з якого зазвичай використовується 12 бітів. Причому кожен біт використовується як перемикач, вирішуючи (значення 1) або забороняючи (значення 0) той або інший доступ.

0644

Три перших біта встановлюють різні види поведінки при виконанні. Що залишилися дев'ять діляться на три групи по три, визначаючи права доступу для власника, групи і решти користувачів. Кожна група задає права на читання, запис і виконання.

Права доступу можна дізнатися за допомогою команди

ls l

r - Біт читання для всіх типів файлів має одне і те ж значення: він дозволяє читати вміст файлу (отримувати лістинг каталога командою ls).

w - Біт запису також має одне і те ж значення: він дозволяє редагувати цей файл. Для каталога – це можливість міняти його вміст, тобто створювати і видаляти файли.

x - Якщо для деякого файлу встановлений біт виконання, то файл може виконуватися як команда. У разі установки цього біта для каталога, цей каталог можна зробити поточним (перейти в нього командою cd).

s - Встановлений біт зміни ідентифікатора користувача SUID означає, що доступний користувачеві на виконання файл виконуватиметься з правами (з ефективним ідентифікатором) власника, а не користувача, що викликав файл (як це зазвичай відбувається).

S - Встановлений біт зміни ідентифікатора групи SGID означає, що доступний користувачеві на виконання файл виконуватиметься з правами (з ефективним ідентифікатором) групи-власника, а не користувача, що викликав файл (як це зазвичай відбувається).

Прикладом може бути утиліта passwd, що дозволяє користувачеві міняти свій пароль. Для зміни пароля потрібно редагувати вміст файлу /etc/passwd і /etc/shadow. Надати права всім змінювати вміст цих файлів неможливо. Установка SUID для утиліти passwd дозволяє вирішити цю проблему. Власником файлу /usr/bin/passwd, в якому зберігається утиліта є суперкористувач. Хто б не запустив утиліту на виконання, на час роботи даної програми отримує права суперкористувача, а значить, може проводити зміни в системних файлах.

Якщо битий SGID встановлений для файлу, не доступного для виконання, він означає обов'язкове блокування, тобто незмінність прав доступу на читання і запис поки файл відкритий певною програмою.

t - Встановлений клейкий біт має сенс для каталога. Файл в цьому каталозі може бути видалений або перейменований тільки в наступних випадках:

  • користувачем-власником файлу;

  • користувачем-власником каталога;

  • якщо файл доступний користувачеві на запис;

  • користувачем root.

Прикладом може служити каталог /tmp, який відкритий на запис для всіх користувачів, але, в якому небажано видаляти чужі тимчасові файли.

2.1.3 Cистемные структури керування файлами

Індексні дескриптори

Загальним елементом у всіх 4-х типах файлів є те, що вони управляються через INODE, що є інформаційним ядром для файлів будь-якого типу, містить всі необхідні інформаційні дані й використовується системою.

Файли і їхні імена жорстко пов'язані з INODE. З одним INODE може бути зв'язано кілька імен, але кожн активний INODE зв'язується тільки з одним файлом. Це забезпечує доступ до одного фізичного файлу через кілька імен, пов'язаних із загальним INODE.

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

В UNIX мінімальною величиною фізичного зберігання даних є блок, розмір якого фіксується в кожній конкретній системі залежно від обсягу використовуваних дисків. Характерними є блоки в 512 або 1024 байта. Можливе використання логічних блоків, які як правило містять у собі два або більше фізичних блоки.

INODE's завжди резидентны на диску, а при роботі з конкретними файлами їх INODE's переміщаються в ОЗУ.

Зміст скільки-небудь на диску INODE:

di_mode унікальний номер

file mode прапори прав доступу

di_count ідентифікатор користувача

di_uid ідентифікатор власника

di_gid ідентифікатор групи

di_size розмір файлу

di_addr[0]. адреса блоку даних

di_addr[n] адреса блоку даних

di_atime час останнього звертання до файлу

di_mtime час останньої модифікації файлу

di_ctime час останньої модифікації індексного

дескриптора

У кодах ядра посилання на INODE завжди починаються з посилання "di_". Вся інформація в INODE має тип "integer".

file mode - 2-х байтовый прапор, де перших 9 байтів задають право доступу (read/write) або дозвіл на виконання (файл типу exe). Ця інформація представляється у вигляді 3-х бітових полів, що задають зазначені права, відповідно для власника файлу, для груп директорій або для всіх директорій файлової системи. Наступний байт містить 4 біти, що визначають вид здійсненного (exe) файлу й тип файлу ( щовипливають 4 біти).

link count - поле, що вказує скільки директорій посилається на даний файл. Якщо в цьому полі коштує 0, то INODE не приєднаний ні до якого файлу, тобто файлу немає. Для директорій ця величина завжди => 2 (для батьківської директорії й для себе принаймні). Ця величина инкрементируется, якщо INODE одержує ім'я-синонім і декрементируется, якщо такоеимя вбирається.

group id - групи ідентифікаторів директорій, пов'язаних з файлом.

file size - розмір файлу в байтах, або 0 для спеціальних файлів.

Інші параметри ясні по своєму змісті.

З одним INODE може бути зв'язане декілька імен, але кожен активний INODE зв'язується тільки з одним файлом. Це забезпечує доступ до одного фізичного файлу через декілька імен, пов'язаних із загальним INODE.

Ядро UNIX містить таблицю i_list – список всіх активних INODE's. Таблиця i_list розташована на жорсткому диску і зберігається після виключення комп'ютера.

Для управління відкритими файлами ОС UNIX надає два базисні механізми: дескриптори (описувачі) файлу і потоки (файлові покажчики).

Дескриптори

Дескриптор файлу - це ціле число без знаку, за допомогою якого процес звертається до відкритого файлу.

FILE

Для кожного відкритого файлу в системі створюється структура fiIe, яка описує як відкритий файл, так і операції, які процес збирається проводити з файлом

Структура file містить такі поля, як:

  • ознака режиму відкриття;

  • покажчик на структуру vnode;

  • поточний зсув у файлі;

  • лічильник посилань на дану структуру;

  • покажчик на структуру, що містить права процесу, що відкрив файл (ця структура знаходиться в дескрипторі процесу);

  • покажчики на попередню і подальшу структури file, що зв'язують всі такі структури в подвійний список.

Для потокових файлів (наприклад, каналів і сокетів) поняття зсуву не підтримується, оскільки довільний доступ до цих файлів неможливий.

Обидва об'єкти відбиваються в спеціальних системних таблицях після відкриття файлу. Таблиця відкритих файлів створюється в оперативній пам'яті під час завантаження системи. Таблиця файлових дескрипторів створюється для кожного процесу. Зв'язок між таблицями:

Малюнок 2.1 – Системні структури керування файлами

Таблиця файлових дескрипторів

Дескриптори файлів виконують роль індексів таблиці дескрипторів, яка створюється ядром для кожного процесу. При відкритті файлу в цій таблиці шукається вільний осередок, в неї заноситься посилання на структуру file.

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

Програма може використовувати дескриптори файлів з номерами 0..N. N визначене в include-файле <sys/param.h>.

[Щоб набути фактичного значення числа N, можна викликати функцію sysconf з аргументом _SC_OPEN_MAX, наприклад, так:

printf(“_SC_OPEN_MAX = %ld\n”, sysconf(_SC_OPEN_MAX));

У операційній системі Linux 2.4 ми отримаємо число 1024, в FREEBSD — 957, в Solaris — 256.]

Дескриптори є локальними для кожної програми. Тобто якщо дві програми відкрили один і той же файл - дескриптори цього файлу в кожній з них не обов'язково співпадуть (хоча і можуть). Назад: однакові дескриптори (номери) в різних програмах не обов'язково позначають один і той же файл. Декілька або один процесів можуть відкрити один і той же файл одночасно кілька разів. При цьому буде створено декілька структур, що "пов'язують" (по одній для кожного відкриття); кожна з них матиме СВІЙ покажчик читання/запису. Можлива і ситуація, коли декілька дескрипторів посилаються до однієї структури.

Таблиця відкритих файлів

Система має таблицю відкритих файлів. Об'єкти цієї таблиці є покажчиками на структуру file.

При закритті файлу зв'язна структура в ядрі знищується, осередок в таблиці вважається вільним, тобто зв'язок програми і файлу розривається.

При створенні процесу йому автоматично надаються три зумовлені потоки. Ці потоки оголошені в заголовному файлі "stdio.h".

FILE * stdin стандартний вхідний потік, який є нормальним джерелом введення для програми.

FILE * stdout потік стандартного виводу, який використовується для нормального виведення програми.

FILE * stderr стандартний потік помилки, який використовується для повідомлень про помилки і діагностики, виданою програмою.

Стандартним потокам відповідають стандартні дескриптори.

0 — вхідному потоку або STDIN_FILENO

1 — вихідному потоку або STDOUT_FILENO

2 — потоку помилок або STDERR_FILENO

У нормальному інтерактивному режимі роботи стандартний потік введення зв'язує процес з клавіатурою, а стандартні потоки виводу і виведення помилок – з поточним терміналом.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]