itmo_conspects

Администрирование в ОС Linux

Операционная система - это базовое системное программное обеспечение, управляющее работой вычислительного узла и реализующее универсальный интерфейс между аппаратным обеспечением, программным обеспечением и пользователем

Возможности по изменению аппаратного обеспечения часто ограничены, поэтому на практике стремятся извлечь максимальную производительность и гибкость за счёт программного обеспечения и грамотного администрирования ОС

Курс разделен на несколько блоков:

  1. Работа с файлами
  2. Файловые системы
  3. Процессы и управление ресурсами
  4. Межпроцессорное взаимодействие
  5. Загрузка операционной системы
  6. Механизмы контейнеризации
  7. Управление пользовательским ПО
  8. Графические среды

Лекция 1. Введение в Linux

Linux (в части случаев GNU/Linux) - это семейство открытых и свободных Unix-подобных операционных систем на базе ядра Linux, включающих набор утилит и программ проекта GNU, а также другие системные и прикладные компоненты

Linux начал своё развитие в 1991 году, когда Линус Торвальдс, будучи студентом Хельсинкского университета, опубликовал первую версию ядра Linux как учебный и исследовательский проект

Со временем вокруг ядра Linux сформировалось большое сообщество разработчиков, а сам Linux стал использоваться в серверах, настольных системах, мобильных и других устройствах

Разделяют бесплатное ПО, открытое ПО и свободное ПО

Бесплатное ПО (Freeware) - программное обеспечение, распространяющееся бесплатно конечному пользователю в виде исполняемых файлов

Открытое ПО (Open-Source Software) - программное обеспечение с открытым исходным кодом, чаще всего распространяющимся по разрешительной лицензии

Свободное ПО (Free and Open-Source Software, FOSS) - открытое программное обеспечение, лицензия которого заставляет авторов производных от него работ лицензировать их под той же свободной лицензией

Linux является свободным программным обеспечением и распространяется под лицензией GNU General Public License 2.0. Это означает, что операционная система Linux гарантирует пользователю 4 свободы, сформулированные Ричардом Столлманом, основателем проекта GNU:

Лицензия GNU General Public License 2.0 накладывает обязательство на то, что производные работы также должны распространяться на условиях этой лицензии

Linux включает набор утилит и программ GNU, такие как Bash или GNU Compiler Collection, которые тоже являются свободным ПО

Linux распространяется не только в виде ядра, но и в виде дистрибутивов - готовых комплектов программного обеспечения, включающих ядро, системные утилиты, менеджер пакетов, установщик и часто графическую среду. Сейчас популярные дистрибутивы - это Debian, Ubuntu, Fedora, Arch Linux и другие

Дистрибутивы Linux бесплатные, но не все. Так, например, Red Hat Enterprise Linux распространяется по платной модели, имея открытый код, но за плату предлагается расширенная корпоративная поддержка и сервис


Ключевые отличия свободного ПО и проприетарного ПО заключаются:


Долгое время наиболее популярной настольной операционной системой остаётся Microsoft Windows. Рассмотрим ключевые концептуальные отличия Linux от Windows:

Лекция 2. Файлы и права доступа

В Linux и других Unix-подобных системах все объекты являются файловыми дескрипторами, то есть все действия совершаются через универсальный интерфейс

Файловый дескриптор - это идентификатор, за которым закреплен определенный поток ввода и вывода. Через файловые дескрипторы в Linux можно работать:

Получаем единый набор операций с файловым дескриптором: открытие, чтение, запись и закрытие

Всего можно выделить 7 типов файлов:


Используя команду ls -l, можно посмотреть на информацию о файлах в каталоге, например:

crw-r--r--   1 root      root       10,   235 Feb 13 17:59 autofs
drwxr-xr-x   2 root      root             180 Feb 13 17:59 block
crw-rw----   1 root      disk       10,   234 Feb 13 17:59 btrfs-control
drwxr-xr-x   3 root      root              60 Feb 13 17:59 bus
drwxr-xr-x   2 root      root            4920 Feb 13 17:59 char
crw-------   1 root      root        5,     1 Feb 13 17:59 console
lrwxrwxrwx   1 root      root              11 Feb 13 17:59 core -> /proc/kcore
drwxr-xr-x  14 root      root             280 Feb 13 17:59 cpu
crw-------   1 root      root       10,   259 Feb 13 17:59 cpu_dma_latency

Первый столбец обозначает тип файла и его модификаторы доступа. Первая буква - это тип файла, так:

Следующие 9 букв задают права доступа для файла. В Linux действует ролевая модель доступа, поэтому есть такие понятия:

Так модификаторы доступа делятся на три тройки букв, каждая тройка из которых показывает права для определенной выборки пользователей

Так -rwxr-xr-x означает регулярный файл, читать и исполнять который могут все, а записывать только владелец

Права доступа проверяются слева направо. Так, если файл имеет права ----r-xr-x, то его владелец не сможет с ним ничего сделать, несмотря на то, что он находится в группе файла

Помимо этих 9 модификаторов есть еще 3 скрытых:

Права можно установить для файла с помощью команды chmod (от change mode):

chmod права файл

Права указываются:

Второй столбец - это число жесткий ссылок на файл

Третий столбец из вывода ls -l указывает на владельца файла, а четвертый - на группу владельца (так как пользователь может состоять в нескольких группах). Сменить владельца можно с помощью команды chown (от change owner):

# меняет владельца на pelmeshke
chown pelmeshke /var/log/mylogs/app.log

# меняет владельца на pelmeshke и группу на supercoolusers
chown pelmeshke:supercoolusers /var/log/mylogs/app.log

# меняет владельца на pelmeshke рекурсивно 
# для всех файлов и каталогов в /var/log/mylogs
chown -R pelmeshke /var/log/mylogs/

По умолчанию, при создании пользователя в Linux ядро создает группу с таким же именем. Для смены группы файла есть команда chgrp (от change group):

# меняет группу на supercoolusers
chgrp supercoolusers /var/log/mylogs/app.log

Лекция 3. Файловые системы

Файловая система - это способ организации информации на носителе данных

Файловая система выполняет такие функции:

Файловая система является посредником в общении между пользователем, использующим ОС, и жестким диском

Позднее число файловых систем стало настолько большим, что в архитектуре операционных систем стала появляется виртуальная файловая система - стандартизованный интерфейс между системными вызовами и конкретной файловой системой

Взаимодействие с хранилищами


Файловые системы могут использовать множество методов организации:

  1. Линейное размещение
  2. Связный список
  3. Таблица аллокаций файлов
  4. Индексные дескрипторы

Подробнее об этом описано в курсе “Операционные системы”

Современные операционные системы используют файловые системы с индексными дескрипторами для дисков, на которых установлена система. Так, Windows использует NTFS (New Technology File System), а для Linux рекомендуется ext4 (от Fourth Extended, Четвертая расширенная файловая система)

В файловой системе ext4 в начале блочного устройства есть участок с названием суперблок (Superblock). Суперблок - это структура, состоящая из данных, которые определяют организацию данных:

Поле Тип данных Назначение
s_inodes_count __le32 Общее количество индексных дескрипторов
s_blocks_count_lo __le32 Общее количество блоков (младшие 32 бита)
s_r_blocks_count_lo __le32 Зарезервированные блоки (младшие 32 бита)
s_free_blocks_count_lo __le32 Свободные блоки (младшие 32 бита)
s_free_inodes_count __le32 Количество свободных индексных дескрипторов
s_first_data_block __le32 Первый блок данных
s_log_block_size __le32 Логарифм размера блока в килобайтах по основанию 2
s_log_cluster_size __le32 Логарифм размера кластера в килобайтах по основанию 2
s_blocks_per_group __le32 Блоков в группе
s_clusters_per_group __le32 Кластеров в группе
s_inodes_per_group __le32 Индексных дескрипторов в группе
s_mtime __le32 Время последнего монтирования
s_wtime __le32 Время последней записи
s_mnt_count __le16 Счётчик монтирований после проверки диска
s_max_mnt_count __le16 Максимальное число монтирований, после который нужна проверка диска
s_magic __le16 Магическое число, для ext4 - это 0xEF53
s_state __le16 Состояние файловой системы
s_errors __le16 Поведение при ошибках
s_minor_rev_level __le16 Минорная версия
s_lastcheck __le32 Время последней проверки
s_checkinterval __le32 Интервал проверки
s_creator_os __le32 Операционная система, создавшая раздел (Linux - это 0x0000, FreeBSD - это 0x0003)
s_first_ino __le32 Первый незарезервированный индексный дескриптор
s_inode_size __le16 Размер индексного дескриптора (обычно 256 байт)
s_block_group_nr __le16 Номер группы (для копии суперблока)
s_uuid __u8[16] UUID файловой системы
s_volume_name char[16] Имя тома

… и много других

Здесь __le16, __le32 - беззнаковые целые числа, записанные в Little-endian, размером 16 бит и 32 бита соответственно, __u8[16] - 16-байтный массив беззнаковый 8-битных чисел, а char[16] - символьная последовательность

Источник: https://docs.kernel.org/next/filesystems/ext4/super.html

Со временем появилась идея размещать блоки больших файлов рядом друг с другом, чтобы уменьшать движение читающей головки жесткого диска по секторам

Для решения этого появились группы блоков. Группы содержат свои битовые карты, таблицы индексных дескрипторов и блоки данных

Первая группа под индексом 0 хранит суперблок и таблицу дескрипторов блочных групп (Block Group Descriptors) - структуры с данными полями:

Поле Тип данных Назначение
bg_block_bitmap_lo __le32 Номер блока битовой карты блоков (младшие 32 бита)
bg_inode_bitmap_lo __le32 Номер блока битовой карты дескрипторов (младшие 32 бита)
bg_inode_table_lo __le32 Первый блок таблицы индексных дескрипторов (младшие 32 бита)
bg_free_blocks_count_lo __le16 Количество свободных блоков в группе
bg_free_inodes_count_lo __le16 Количество свободных дескрипторов в группе
bg_used_dirs_count_lo __le16 Количество каталогов в группе
bg_flags __le16 Флаги состояния группы
bg_exclude_bitmap_lo __le32 Блок битовой карты снимков исключения (Exclusion Snapshot)
bg_block_bitmap_csum_lo __le16 Контрольная сумма битовой карты блоков
bg_inode_bitmap_csum_lo __le16 Контрольная сумма битовой карты дескрипторов
bg_itable_unused_lo __le16 Количество неинициализированных индексных дескрипторов
bg_checksum __le16 Контрольная сумма дескриптора группы

… и другие поля

Последующие группы могут хранить также избыточные копии суперблока и таблицы дескрипторов групп, но система будет обращаться к ним в том случае, если начало диска было повреждено

Источник: https://docs.kernel.org/next/filesystems/ext4/group_descr.html

Далее идет битовая карта блоков (Block Bitmap). В ней один бит, равный 1, обозначает, занят ли конкретный блок с тем же индексом

Затем расположена подобная битовая карта для индексных дескрипторов (Inode Bitmap), где бит 1 обозначает, занят ли индексный дескриптор в таблице дескрипторов

Источник: https://docs.kernel.org/next/filesystems/ext4/bitmaps.html

После этого расположена сама таблица индексных дескрипторов. Таблица представляет собой массив дескрипторов, где индекс - это номер индексного дескриптора

Для специальных индексных дескрипторов выделены особые индексы:

9-ый и 10-ый дескрипторы зарезервированы и используются для функций, который обозначены ? в документации, а 11-ый дескриптор - первый не зарезервированный, но обычно используется для каталога /lost+found/, который предназначен для восстановленный утилитой fsck файлов после сбоя

Источник: https://www.kernel.org/doc/html//latest/filesystems/ext4/special_inodes.html

Наконец, после таблицы индексных дескрипторов дальше идут сами блоки данных

Разметка в ext4


В файловой системе ext3 добавилась система журналирования - способ восстановления данных в результате нештатной работы ОС или диска

Всего есть три типа журналов в ext3:

  1. Journal - самый медленный, но самый надежный журнал. Сначала в журнал пишутся блоки данных, потом они копируются в нужное место, а дескриптор изменяется
  2. Ordered - то же самое, но записываем только метаданные файла, что быстрее
  3. Writeback - сначала пишем весь файл, а потом изменяем все метаданные в дескрипторе и журнале

В системе ext4 добавилось много новых функций, которые убирали ограничения старых версий системы:


Хорошей практикой является разделение диска на 6 разделов:

В корневом каталоге Linux создает множество подкаталогов для работы системы, структура которых подчиняется стандарту (FHS) Filesystem Hierarchy Standard:

Лекция 4. Процессы

Процесс - совокупность набора исполняемых команд, ассоциированных с ним ресурсов и контекста исполнения, находящиеся под управлением операционной системы

Сам же процесс в Linux хранится структурой task_struct с множеством полей, таких как:

В Linux процессы порождаются с помощью других процессов, таким образом, образуя дерево

Дерево процессов

Дерево как структура было выбрано по нескольким причинам:

Первый процесс - это процесс init или systemD, который является корнем одного поддерева процессов

Создание процесса

Для создания процессов могут использоваться три системных вызова:

Жизненный цикл процесса

У процесса в Linux есть состояние в зависимости от того, исполняется ли он прямо сейчас, ждет потока ввода/вывода или находится вне оперативной памяти. Состояние помогает при управлении планировании исполнения процессов:

Жизненный цикл процесса в Linux

Подробнее о состояниях процессов описано в курсе “Операционные системы”

Завершение процесса

После того, как процесс окончил исполнения (то есть вызвал системный вызов _exit(status_code)), процесс переходит в состояние “Зомби”. В нем он будет находится до тех пор, пока родительский процесс не прочитает код выхода процесса. Родитель может сделать это несколькими способами:

Демоны

Отдельное место в Linux занимают демоны. Демон (Daemon) - это фоновый процесс, который работает непрерывно и независимо от пользовательской сессии. Он ожидает событий или запросов и обрабатывает их без участия пользователя

Название “демон” происходит из греческой мифологии — демон был фоновым духом, действующим от имени других

Стандартные потоки ввода, вывода и ошибок у демонов перенаправлены в /dev/null. Вместо них демоны используют системный журнал или собственный файл с логами. Также демоны записывают свои идентификаторы процессов, чтобы другие процессы знали, как к ним обратиться

Первый демон, появляющийся при запуске Linux, - это поток [kthreadd] с идентификатором 2. Он является корнем поддерева фоновых потоков ядра, таких как [kswapd0] - демон для страничного обмена, [migration/0] - демон для переноса процессов между ядрами и так далее


Для создания демонов можно: