mirror of
https://github.com/Linux4Yourself/book.git
synced 2025-01-24 23:32:18 +08:00
174 lines
21 KiB
Markdown
174 lines
21 KiB
Markdown
# Строение GNU/Linux. Часть 1.
|
||
|
||
Дистрибутив по Linux for yourself собрать нельзя, не умея читать документацию, искать нужную информацию в интернете и не зная строение Linux. Именно о строении и пойдёт речь в этой статье. Первая часть даст базовые сведения, а в следующих частях структура типичного Linux-дистрибутива будет рассмотрена подробнее.
|
||
|
||
Книга *Linux for yourself* старается придерживаться стандартов `FHS` и `LSB` (о них далее).
|
||
|
||
## Термины
|
||
* `FHS` (`Filesystem Hierarchy Standart`) - документ, который определяет схему директорий в UNIX-системах. FHS разработан, чтобы предоставить общую схему для упрощения независимой от дистрибутива разработки `программного обезпечения` (далее - `ПО`). Другими словами, это стандарт, унифицирующий местонахождение файлов и каталогов с общим назначением в файловой системе UNIX. Таблицу директорий и другую информацию вы сможете лицезреть [здесь](partition_catalogs).
|
||
* `LSB` (`Linux Standart Base`) - совместный проект дистрибутивов Linux при организации Linux Foundation, целью которого является стандартизация их внутренней инфраструктуры. Цель LSB - разработать и продвигать набор стандартов, который увеличит совместимость различных дистрибутивов Linux и даст возможность запускать приложения на любой совместимой системе; помимо этого, LSB помогает сконцентрировать усилия в привлечении разработчиков к написанию и портированию ПО. LSB сертифицирует стандартные библиотеки, пару утилит, структуру иерархии `файловой системы` (далее - `ФС`), уровни запуска, et cereta.
|
||
* `конфиг` - сленговое. Означает "конфигурационный файл"
|
||
* `юзер` - сленговое. Означает "пользователь"
|
||
* `ФС` - сокращение от "файловая система"
|
||
|
||
## Filesystem Hierarhy Standart
|
||
В данном разделе речь пойдёт про иерархию ФС Linux. Может быть применимо и к другим UNIX-Like системам и дистрибутивам, главное, чтобы они соответствовали стандарту `FHS`. Всякие Gobo Linux не рассматриваем.
|
||
|
||
## Независимые классификации в FHS
|
||
Спецификация FHS основывается на идее существования двух независимых классификаций файлов: разделяемых и неразделяемых, а так же изменяемые и статичные. Разделяемые данные могут распространяться на несколько хостов; неразделяемые специфичны для конкретного хоста (например, конфиги). Соответственно, изменяемые файлы изменяются, а статичные - нет (за исключением установки и обслуживания системы).
|
||
|
||
Резюме. 4 возможные комбинации + нужные директории.
|
||
|
||
| - | Разделяемые | Неразделяемые |
|
||
|--------------|:-----------:|:-------------:|
|
||
| статичные | /usr /opt | /etc /boot |
|
||
| изменяемые | /var/mail | /var/run|
|
||
|
||
## Само строение ОС
|
||
### Процесс загрузки
|
||
> В данной статье загрузка ПК, BIOS, UEFI и прочее будет пропущено, ибо это не тема этой статьи.
|
||
|
||
Начнём с загрузчика. Их очень много - `GRUB2`, `rEFInd`, `systemd-boot`, `syslinux` и другие. Но самым популярным является, конечно, `GRUB2`.
|
||
Задача загрузчика - инициализировать ядро Linux (в нашем случае). В помощь ядру загрузчик обычно использует начальный образ загрузки - `initrd` или `initfarms`, представляющий собой архив с образом файловой системы, разворачивающейся в ОЗУ в начале загрузки. В `initrd`/`initfarms` находятся нужные драйверы, скрипты и прочее, что необходимо для инициальзации оборудования и прочих целей.
|
||
|
||
***
|
||
После начального образа загружается ядро. Находится в `/boot`, в своём названии имеет `vmlinuz`:
|
||
* `vm` - поддержка виртуальной памяти
|
||
* `linu` - когда-то называлось `linux`, но позже сократилось до текущего состояния, потому что необходимо указать факт сжатия ядра (следующий пункт)
|
||
* `z` - указатель того, что файл с ядром сжат (формат сжатия обычно `zlib`. Не всегда используется именно это сжатие, иногда можно встретить `LZMA` или `BZIP2`, поэтому некоторые ядра называют просто `zImage`).
|
||
|
||
Ядро Linux является `монолитным`.
|
||
|
||
**Плюсы монолитного ядра**
|
||
* Более прямой доступ к аппаратным средствам
|
||
* Проще обмен данными между процессами
|
||
* Процессы реагируют быстрее
|
||
|
||
**Минусы монолитного ядра**
|
||
* Большой размер
|
||
* Занимает много оперативной памяти
|
||
* Менее безопасно
|
||
|
||
Монолитное ядро больше и несколько сложнее других видов ядер. Ну и вспомните спор Таненбаума и Торвальдса. Но у Linux есть достоинство - это *модули ядра*. Подключать нужные модули можно буквально на лету. Вы можете запускать процессы сервера, подключать виртуализацию, а также полностью заменить ядро без перезагрузки. Например, команда
|
||
```
|
||
modprobe qemu-nbd
|
||
```
|
||
Подключит соответствующий модуль `qemu-nbd`.
|
||
|
||
|
||
GNU/Linux состоит из четырёх основных частей:
|
||
* `Ядро Linux` — основная интересующая нас часть; ядро создаёт абстрактный слой и является «посредником» между первыми двумя частями и hardware-частью компьютера;
|
||
Hardware controllers (контроллеры оборудования) — подсистема, охватывающая все возможные физические устройства, такие как CPU, устройства памяти, жёсткие диски, сетевые карты — все они являются частью этой подсистемы.
|
||
* `O/S services` (службы операционной системы) — службы, которые обычно считаются частью операционной системы. Например, оконные менеджеры. Ну и программный интерфейс ядра (компиляторы и прочее)
|
||
* `User applications` (пользовательские приложения) — набор пользовательских приложений, который в разных дистрибутивах Linux может быть разным. Например, в Linux For Yourself предложен самый небольшой набор ПО, которого хватит для корректной работы операционной системы.
|
||
|
||
![kernel1](pic/kernel1.jpg)
|
||
|
||
Каждая подсистема может взаимодействовать только с двумя соседними, расположенными непосредственно «выше» и «ниже» её уровня. Кроме того, зависимости между этими подсистемами направлены сверху — вниз: слои расположенные выше — зависят от частей ниже, но части, расположенные ниже — не зависят от частей выше их.
|
||
|
||
Ядро Linux состоит из пяти основных подсистем:
|
||
|
||
* `Process Scheduler` (`SCHED`) — планировщик процессов, отвечает за контроль над доступом процессов к CPU. Планировщик обеспечивает такое поведения ядра, при котором все процессы имеют справедливый доступ к центральному процессору.
|
||
* `Memory Manager` (`MM`) — менеджер памяти, обеспечивает различным процессам безопасный доступ к основной памяти системы. Кроме того, MM обеспечивает работу виртуальной памяти, которая позволяет процессам использовать больше памяти, чем реально доступно в системе. Выделенная, но неиспользуемая память вытесняется на файловую систему, и при необходимости — возвращается из неё обратно в память (swapping).
|
||
* `Virtual File System` (`VFS`) — виртуальная файловая система, создаёт абстрактный слой, скрывая детали оборудования, предоставляя общий файловый интерфейс для всех устройств. Кроме того, VFS поддерживает несколько форматов файловых систем, которые совместимы с другими операционными системами.
|
||
* `Network Interface` (`NET`) — сетевые интерфейсы, обеспечивает работу с различными сетевыми стандартами и сетевым оборудованием.
|
||
* `Inter-Process Communication` (`IPC`) — межпроцессная подсистема, поддерживающая несколько механизмов для process-to-process связей в единой Linux-системе.
|
||
|
||
![kernel2](pic/kernel2.gif)
|
||
![kernel3](pic/kernel3.png)
|
||
|
||
Символом ядра Linux является Tux, отличающийся от «обычных» пингвинов жёлтым цветом клюва и лап. Однако, в кач-ве символа Linux 2.6.29 был принят Tuz (тасманский дьявол), изображение которого ранее служило талисманом конференции linux.conf.au 2009. В следующих версиях ядра используется предыдущий пингвин Tux. Его можно наблюдать и поныне.
|
||
|
||
![Tux](pic/Tux.png)
|
||
*Tux*
|
||
|
||
![Tuz](pic/Tuz.png)
|
||
*Tuz*
|
||
|
||
|
||
***
|
||
После ядра стартует `init` - подсистема инициализации в UNIX-ах, которая запускает все остальные процессы. Имеет `PID`=1. Раньше, де-факто стандартным инитом в GNU/Linux был SysVInit. Однако, в самом начале 10-ых были попытки заменить sysvinit на другую систему инициализации. Например, в Ubuntu первое время использовался `upstart` от Canonical, а в Gentoo Linux используется OpenRC. Так же, был создан `systemd`, на который в данный момент перешло большинство дистрибутивов Linux.
|
||
|
||
**Достоинства `systemd`**
|
||
* *агрессивная параллелизация* и прочее, что позволяет существенно ускорить загрузку ОС
|
||
* запуск сервисов по расписанию (вместо `cron`)
|
||
* смена корня (вместо `chroot`)
|
||
* простой и лаконичный синтаксис служб
|
||
|
||
**Недостатки `systemd`**
|
||
* Не *Unix Way*. systemd - монолитная и сложная система, заменяющая собой не только инит, но и планировщик, менеджер сети, утилиту по смене корня системы, просмотрщик логов и пр, что не особо нужно многим пользователям
|
||
* systemd требуется несколько больше ресурсов, чем его менее прожорливым товарищам, из-за чего на старом железе лучше использовать дистрибутив с другой системой инициализации, например, классическим `sysvinit`
|
||
|
||
И теперь про `sysvinit`.
|
||
|
||
**Достоинства `sysvinit`**
|
||
* Устоявшаяся и хорошо понятная система
|
||
* Простая настройка
|
||
* Стабильная и надёжная работа
|
||
|
||
**Недостатки `sysvinit`**
|
||
* Неудобная (а для некоторых ещё и сложная) работа с сервисами
|
||
* Последовательная обработка задач загрузки, что может в некоторых случаях замедлить скорость старта ОС
|
||
|
||
***
|
||
После инита загружается `командная оболочка`, коих так же довольно много:
|
||
* `bourne shell` (sh) - "тот самый"
|
||
* `bourne again shell` (bash) - ставшая классической в Linux оболочка, которая используется во многих дистрибутивах по умолчанию. В Linux for yourself `/bin/sh` является символической ссылкой на `/bin/bash`.
|
||
* `BusyBox` - представляет собой целое пользовательское окружение, в том числе, командную оболочку (вызов: `busybox sh`). Достоинство: малый размер и небольшие требования к аппаратуре.
|
||
* et cetera
|
||
|
||
Коммандная оболочка прописана в стандарте POSIX и необходима для работы системы.
|
||
В Linux for yourself список оболочек содержится в файле `/etc/shells`.
|
||
|
||
***
|
||
Далее идёт графика. О ней можно говорить очень много, ибо тема довольно объёмная, но я опишу всё вкратце.
|
||
|
||
Состоит из следующих компонентов:
|
||
* `Display Server` - дисплейный сервер
|
||
* `Display Manager` - дисплейный менеджер
|
||
* `Desktop Manager` (DE) - рабочее окружение
|
||
|
||
Рабочее окружение (DE) можно разделить на следующее:
|
||
* `WM` (Window Manager) - программа, которая управляет отображением окон в системе GUI (Graphic User Interface) - графическом интерфейсе пользователя.
|
||
* Средство запуска ПО
|
||
* Панель, на которой располагаются апплеты/виджеты:
|
||
* ср-во запуска приложений
|
||
* апплет переключения между открытыми окнами
|
||
* апплет системного трея
|
||
* другие апплеты/виджеты по усмотрению пользователя
|
||
* Файловый менеджер, задача которого - не только работа с файлами, но и управление иконками на рабочем столе
|
||
* Менеджер обоев рабочего стола
|
||
* Приложения по умолчанию (эмулятор терминала, файловый менеджер (см. по списку выше), настройки системы и рабочего окружения, et cereta)
|
||
* et cetera
|
||
|
||
> Хочу заострить ваше внимание на том, что оконный менеджер, панель и некоторые другие компоненты можно использовать и отдельно от рабочего окружения. Например, оконные менеджеры Fluxbox, Openbox, i3-wm, Awesome, Sway и др. используются отдельно от DE. Так же существуют отдельные файловые менеджеры, которые так же поставляются отдельно от рабочего окружения.
|
||
|
||
!> Не путайте понятия "рабочий стол" и "рабочее окружение". Хотя эти два термина похожи, но значения немного разные.
|
||
|
||
***
|
||
Теперь описание компонентов графики.
|
||
|
||
### Display server
|
||
Дисплейный сервер - программа, отвечающая за координацию ввода и вывода своих клиентов с ОС, а так же между оборудованием и ОС. Именно благодаря Display Server вы используете Linux в графическом режиме, а не в TTY. Когда говорят "дисплейный сервер", нередко имеют ввиду `Xorg`, `Wayland`, `Mir` и прочие.
|
||
|
||
### Display Manager
|
||
Первая программа, которая запускается при старте графики. Его основные задачи:
|
||
* запросить аутентификационные данные нужного пользователя (имя, пароль или отпечаток пальца).
|
||
* выбрать, какую среду рабочего стола запустить
|
||
|
||
Примеры DM:
|
||
* LightDM
|
||
* Xdm
|
||
* SDDM (из состава KDE)
|
||
* TDM (из состава Trinity)
|
||
* WDM (из состава Window Maker)
|
||
|
||
Как и упоминалось ранее, дисплейные менеджеры можно использовать и отдельно от DE.
|
||
|
||
### Window Manager
|
||
Я не случайно начал именно с WM. Во-первых, про DE было сказано выше, а во-вторых, оконный менеджер можно использовать отдельно от всего громоздкого рабочего окружения.
|
||
Что такое `WM` было так же сказано выше. Можно выделить три вида оконных менеджеров:
|
||
* `Стековые` (`плавающие`) следуют классической метафоре, которая на данный момент самая удобная и популярная. Классическое расположение окон, которые могут накладываться и перекрывать друг друга.
|
||
* `Фреймовые` WM располагают окна в виде `фреймов` (`плиток`), эти фреймы не способны перекрывать друг друга, подобное поведение встречается в графическом интерфейсе *Windows* 1.x. Наиболее удобно использовать такие оконные менеджеры посредством клавиатуры, хотя поддержка мыши во многих из них так же присутствует.
|
||
* `Динамические` (например, i3wm) - динамически переключаются между двумя режимами, описанными выше (`стековый` и `фреймовый` режимы). Поддержка мыши есть в большинстве из них
|