Огляд типової системи Linux
«І побачив Бог усе, що вчинив. І ото, вельми добре воно!»
Буття 1:31^bible
Цей розділ дає загальний огляд систем Linux. Спочатку описані основні служби, виконувані операційною системою. За тим подається опис програм, що втілюють ці службові процеси, без особливої деталізації. Метою цього розділу є дати уявлення про систему в цілому, з тим, аби описати подробиці вже у відповідних розділах.
UNIX (Юнікс) та юніксоподібні операційні системи (наприклад, Linux) складаються з ядра та системних програм. Для виконання Вашої щоденної роботи існують прикладні програми. Ядро є серцем операційної системи. Його часто вважають самою операційною системою, але це не так. Операційна система виконує набагато більше службових завдань, аніж ядро.
Ядро слідкує за файлами на диску, запускає програми та виконує їх одночасно одна з одною, відпускає різним процесам пам'ять та інші ресурси, отримує пакети від мережі та надсилає пакети до неї і т. д. Саме по собі ядро виконує небагато роботи, але воно надає інструменти, за допомогою яких можуть бути збудовані всі служби. Воно також запобігає прямому доступу до обладнання, змушуючи будь-кого, хто намагається скористатися обладнанням, використовувати надані ядром інструменти. Таким чином ядро забезпечує певний рівень захисту користувачів один від одного. Інструменти, пропоновані ядром, використовуються через системні виклики.
Системні програми використовують інструменти, пропоновані ядром, для реалізації різноманітних служб, які мають бути присутні в операційній системі. Системні програми, а також всі інші програми виконуються «поверх ядра», у так званому режимі користувача. Різниця між системною та прикладною програмою полягає насамперед у намірі, з яким її використовують: прикладні програми існують для виконання корисних завдань (або для гри, якщо програма є грою), тоді як системні програми забезпечують роботу системи. Текстовий редактор - прикладна програма; mount - системна програма. Щоправда, іноді межа між двома типами програм є досить нечіткою і важлива тільки для тих, кому неодмінно треба розкладати все по поличках.
Операційна система може також містити компілятори та відповідні їм бібліотеки (у Linux, наприклад, це GCC та бібліотека C), хоча не кожна мова програмування обов'язково має бути частиною операційної системи. Документація, а іноді навіть і ігри теж можуть бути інтеґровані в систему. Як правило, операційну систему завжди визначали обсягом вмісту інсталяційного диску або дисків; з Linux вже так чітко це визначити не можна, бо інсталяційні диски різних дистрибутивів часто включають в себе різні набори прикладних програм, які можна також завантажити і окремо з FTP-сайтів по всьому світу.
2.2. Важливі частини ядра
Ядро Linux складається з декількож важливих частин: управління процесами, управління пам'яттю, драйверів обладнання, драйверів файлової системи, управління мережевими підключеннями та деяких інших дрібниць. На схемі 2-1 нижче показані деякі з них:
Схема 2-1: Найбільш важливі частини ядра Linux
Либонь, найважливішими частинами ядра (бо без них ніщо інше не працює) є управління процесами та управління пам'яттю. Управління пам'яттю займається відведенням відрізків пам'яті та простору підкачки процесам, частинам ядра та буферному кешу. Управління процесами створює процеси та робить можливою багатозадачність шляхом переключення активних процесів на процесорі.
На найнижчому рівні ядро містить по драйверу обладнання для кожного з типів обладнання, яке воно підтримує. Оскільки на світі існує багато різних пристроїв, кількість драйверів для них є значною. Існують, наприклад, такі види пристроїв, які не відрізняються один від одного нічим іншим, окрім того, яким чином їх контролює програмне забезпечення. Схожості дають можливість поділяти драйвери на загальні класи, які підтримують схожі операції; кожний член класу користується тим самим інтерфейсом до решти ядра, однак відрізняється у тому, що він має зробити для виконання цієї операції. Наприклад, всі драйвери дисків для решти ядра виглядають однаково: наприклад, всі вони мають такі операції, як «запустити дисковод», «прочитати сектор X» та «записати до сектора X».
Деякі програмні служби, що виконуються самим ядром, мають схожі властивості, а отже, можуть бути поділені на (абстраговані у) класи. Наприклад, різноманітні мережеві протоколи можуть бути абстраговані в один програмний інтерфейс - бібліотеку сокета BSD. Іншим прикладом є шар віртуальної файлової системи (VFS), який абстрагує операції файлової системи від конкретного способу їх втілення. Кожний тип файлової системи здійснює втілення кожної операції файлової системи. Коли якийсь суб'єкт намагається використати файлову систему, запит іде через VFS, яка скеровує його до відповідного драйвера файлової системи.
2.3. Важливі служби системи UNIX
Цей розділ описує деякі з основних служб UNIX, але не надто деталізовано. В подальших розділах їх описано докладніше.
2.3.1. init
Найбільш важливу функцію в системі UNIX виконує init. В будь-якій системі UNIX init запускається як перший процес - це останнє, що виконує ядро, запустившись. Коли init запускається, вона продовжує процес завантаження системи, виконуючи різноманітні стандартні завдання, необхідні для запуску системи (перевіряє і монтує файлові системи, запускає служби і т.д.).
Конкретний список того, що робить init, залежить від того, якого вона різновиду; можна вибрати один з декількох. init зазвичай забезпечує концепцію однокористувацького режиму, в якому ніхто не може увійти в систему, а командна оболонка в консолі використовується адміністратором. Звичайним є багатокористувацький режим. Деякі різновиди init узагальнюють це як рівні виконання; однокористувацький і багатокористувацький режими вважаються двома рівнями виконання, але можуть бути і додаткові - наприклад, на консолі може виконуватися X.
Linux дозволяє до 10 рівнів виконання, від 0 до 9, але за замовчуванням визначені лише декілька. Нульовий рівень виконання визначається як «зупинка системи». Перший рівень виконання визначається як «однокористувацький режим». Рівень виконання 3 визначається як «багатокористувацький режим», і саме у цей рівень завантажується система в нормальних умовах. П'ятий рівень виконання, як правило, нічим не відрізняється від третього, хіба що додатково запускається ще й графічний інтерфейс. Шостий рівень виконання визначається як «перезавантаження системи». Інші рівні виконання залежать від того, як їх визначено у відповідному дистрибутиві, і різниця між різними дистрибутивами може бути досить значною. Заглянувши до файлу /etc/inittab, можна скласти собі уявлення про те, які рівні виконання є визначеними наперед і як само вони визначені.
В процесі звичайної роботи init забезпечує роботу getty (це дозволяє користувачам увійти в систему) і «всиновлює» осиротілі процеси (процеси, чиї материнські процеси було завершено; в UNIX всі процеси має бути вибудувано в єдине дерево, тому «сиріт» необхідно «всиновити»).
Коли роботу системи завершують, саме init відповідає за припинення всіх процесів, відмонтування всіх файлових систем та зупинку процесора, поряд з іншими завданнями, на які її було сконфігуровано.
2.3.2. Вхід з терміналів
Входи з терміналів (через послідовні лінії) та консолі (коли не запущено X) дозволяє виконувати програма getty. init запускає окрему сесію getty для кожного терміналу, після чого стає можливим вхід. getty читає ім'я користувача та виконує програму login, яка читає пароль. Якщо ім'я користувача і пароль правильні, login запускає оболонку. Коли оболонка завершує роботу, наприклад, якщо користувач виходить з системи, або коли login зупиняється через те, що ім'я користувача та пароль не підійшли, init помічає це та запускає нову сесію getty. Ядро не має про вхід користувача жодного уявлення, це все виконується системними програмами.
2.3.3. syslog
Ядро та багато системних програм продукують повідомлення про помилки, попередження і т. п. Часто буває важливо, аби ці повідомлення можна було прочитати пізніше, навіть значно пізніше, а отже - їх необхідно записати у файл. Програма, яка цим займається, називається syslog. Її можна налаштувати таким чином, що вона сортуватиме повідомлення по різних файлах залежно від того, яка програма їх надсилає, або від важливості повідомлення. Наприклад, повідомлення від ядра часто тримаються в окремому файлі, оскільки ці повідомлення є більш важливими і їх треба регулярно читати, аби помітити проблеми.
Детальніше про це - у ?розділі 15.
2.3.4. Періодичне виконання команд: cron та at
Як у користувачів, так і в адміністратора часто виникає необхідність виконувати якісь команди з певною періодичністю. Наприклад, системний адміністратор може забажати виконати команду очистки тек, де зберігаються тимчасові файли (/tmp та /var/tmp), від старих файлів, для того щоб запобігти переповненню диска, адже не всі програми коректно виконують очистку за собою.
Робить це служба під назвою cron. Кожний користувач може мати власний файл crontab, в який він може вписати команди, які він хоче виконати, та час, коли ці команди виконуватимуться. Служба cron слідкує за тим, аби запустити ці команди у визначений час.
Служба at схожа на cron, але вона виконує команду лише один раз, не повторюючи її.
Пізніше ми розкажемо про це більше. Більш докладну інформацію ви знайдете на man-сторінках cron(1), crontab(1), crontab(5), at(1) і atd(8).
Ми розкажемо про це у ?розділі 13.
2.3.5. Графічний інтерфейс
UNIX та Linux не включають користувацький інтерфейс в ядро; натомість, вони дозволяють втілювати його за допомогою програм користувацького рівня. Це стосується як текстових, так і графічних середовищ.
Таке рішення робить систему гнучкішою, але має той недолік, що для кожної програми відносно легко можна реалізувати її власний інтерфейс, що робить вивчення системи важчим.
Графічне середовище, яке найчастіше використовується у Linux, має назву X Window System (скорочено X). X також не є повноцінним графічним інтерфейсом, а лише надає віконну систему -- інструменти, за допомогою яких, у свою чергу, можна такий інтерфейс побудувати. Популярними віконними менеджерами для X є: fvwm, icewm, blackbox та windowmaker. Є також два популярних стільничних менеджера: KDE та Gnome.