МЕНЮ

Linux ядро для чайников. Процессы и потоки в системе Линукс.Архитектура операционной системы Linux разительно отличается от устройства уже знакомой нам по предыдущим урокам Винды. В ней значительно больше нюансов касающихся, как особенностей работы ядра. Так и процесса загрузки, о котором мы сегодня поговорим в самых мельчайших подробностях. BIOS, UEFI, init процессы, systemd, состояние процессов. Про всё это и многое другое вы узнаете, посмотрев до конца сегодняшний выпуск. В общем, если вы давно хотели разобраться в Линухе, самое время устроиться по удобней, наполнить бокальчик чем-нибудь прохладительным, и приготовиться к погружению в айтишный мир душноты и занудства. Погнали.

И начнём мы с наиболее важных софт-скиллов любого уважающего себя айтишника. Помимо того, что крутой IT-спец, всегда готов немножечко подушнить, в его арсенале непременно должны быть умения:

●     Анализировать исходные данные и составлять индивидуальный план своего развития;

●     Предлагать оптимальные решения и корректировать их в процессе реализации;

●     Ну и конечно иметь под рукой план «Б» на случай, если, в какой-то момент что-то пойдёт не по плану.

И я сейчас не только о рабочих задачах. Я в целом о вашей карьере и жизненной ситуации. Как вы знаете, за последние несколько месяцев часть IT-специалистов выдохнула, другая часть напряглась, а третья, увы отправилась искать себя на заграничном поприще.

И хоть, сам я продолжаю работать в России и не собираюсь уезжать за её пределы, как минимум из патриотических соображений. Ибо искренне верю в то, что это наш родной дом и только мы способны изменить в нём всё к лучшему, я прекрасно понимаю и тех, кто желает диверсифицировать риски.

Ибо иметь под рукой “план Б” — это хорошая гарантия вашей стабильности и уверенности в завтрашнем дне. Благо сегодня айтишники нужны абсолютно везде, а в Европе, скажу по секрету, они на особом счету.

И если вы по каким-то причинам, хотите работать или уже работаете на удалёнке попутно задумываясь о переезде, то я бы присматривался к чему-то поближе к РФ. Чтобы иметь возможность навещать родных, не отдавая за авиабилеты треть годовой зарплаты. 

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

Как вы уже догадались, это Финляндия, и здесь любой IT-спец может получить вид на жительство для себя и своей семьи по стартап-программе. Для этого нужно лишь представить свой проект стартапа, и когда его одобрят, можно готовиться к переезду в Европу.

Если вы хорошенько погуглите, то узнаете, что Финский вид на жительство даёт множество преимуществ:

●     Жизнь в Европе, но при этом рядом с Россией;

●     Путешествия и работа в ЕС без виз;

●     Бесплатное образование и мед.услуги;

●     Возможность получать государственные пособия;

●     Ну и конечно высокий уровень жизни.

Как я уже говорил, для получения ВНЖ нужно предоставить проект своего стартапа и получить одобрение от Финляндии. Если у вас уже есть своя бизнес-идея или компания, можно рассказать об этом проекте.

А если вы пока только задумываетесь о своём деле, то проект можно разработать с нуля. От подачи проекта до получения ВНЖ проходит в среднем 1-2 месяца.

Эту задачу может взять на себя эмиграционный центр Миркиа. Они специализируются на подготовке документов и берут на себя всю юридическую часть. Миркиа помогли уже более чем 1000 клиентов.

Они работают по официальному договору и предоставляют полное сопровождение на каждом этапе.

Кроме Финляндии Mircare помогают также получить вид на жительство в:

●     Дании

●     Франции,

●     Германии,

●     Нидерландах,

●     Португалии,

●     Черногории,

●     И Люксембурге.

Вы можете задать любые вопросы экспертам Миркиа. В описании закреплена ссылка на бесплатную консультацию. Так что, если вас реально прижало или посещают навязчивые мысли о переезде, можете выяснить что да как.

Задача Linux, как и любой другой операционной системы в первую очередь состоит в абстрагировании пользователей и пользовательских программ от аппаратного обеспечения.

Во-вторых, ОС представляет некий единый интерфейс взаимодействия с аппаратной частью. Управление ресурсами системы. Распределение этих ресурсов между программами.

Обеспечение безопасности. Пользовательский интерфейс. Работа сети. Ну и прочие, чуть менее важные вещи. Хоть ядро Линукс и является монолитом, в данной ОС существует возможность загружать дополнительный код в ядро.

Этот функционал называется модуль ядра. Как правило это драйверы, относящиеся к аппаратной части. Помним, что есть kernel space и user space. Пространство ядра и пространство пользователя.

Это разные режимы выполнения кода. Разграничиваются они на уровне процессора. В пространстве ядра выполняется код операционной системы. Соответственно этот код имеет доступ ко всем машинным инструкциям.

Пространство пользователей в свою очередь взаимодействует с ядром через механизм системных вызовов. Системные вызовы это некий интерфейс взаимодействия пользовательского кода с ядром.

Существует более 300 различных системных вызовов. Запуск процесса, сетевое взаимодействие и т.д. Системные библиотеке представленные на схеме обеспечивают промежуточную абстракцию над системными вызовами.

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

Существуют утилиты (например system trace), позволяющие оттрассировать системные вызовы. Это позволит нам увидеть, какие вызовы были запущены в процессе выполнения той или иной программы.

Т.е. мы можем присоединиться к уже запущенной программе, указав идентификатор процесса и с помощью трассировщика увидеть её системные вызовы.

Загрузка

Отлично. Теперь давайте поговорим про процесс загрузки. Загрузка (она же boot) представляет собой процесс запуска устройств и загрузки ОС. В этот момент происходит обнаружение и (само)настройка всех компонентов системы.

В процессе загрузки происходит инициализация аппаратной части, проверка её работоспособности. Далее управление передаётся загрузчику, который затем загружает ядро в память.

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

Конечно, же если речь идёт о загрузке, на ум сразу приходит BIOS. Это низкоуровневая система, которая сегодня уже устарела, т.к. была разработана аж в 80-х годах.

В те времена, в момент включения компьютера управление передавалось коду записанному в специальном чипе на материнской плате. С его помощью производилась первичная диагностика системы и управление передавалось загрузчику, который находился в секторе MBR.

Это загрузочная область master boot record. Она занимает первые 512 байт на диске и за счёт того, что это её потолок, такая схема накладывает определённые ограничения.

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

Загрузка UEFI происходит в следующем порядке. На первой фазе Security передаётся управление доверенному коду. На этом этапе проверяется целостность загрузочных разделов, чтобы убедиться в отсутствии вредоносного кода.

Далее Pre EFI Initialization запускает инициализацию устройств. Затем происходит загрузка сервисов и поиск устройств загрузки.

Ну и в заключительной стадии в дело вступает его величество GRUB, основное назначение которого – это загрузка ядра операционной системы и выбор режима загрузки.

В принципе, в теории UEFI даёт возможность загрузки системы без ГРАБА. Во всяком случае все возможности, будь то доступ к соответствующему разделу в системе или ядру у этой истории есть. 

Но GRUBчик использовать всё же надёжней. Сам код приложения находится в директории загрузчика. Для каждой системы полный путь этого каталога будет разумеется отличаться. Boot/grub, либо grub2.

Сами настройки ГРАБА осуществляются в /etc/default/grub. Можно отредактировать как через nano, таким с помощью VIMа. Главное не забыть применить обновления изменений и отправить тачку в ребут.

Также выполнять команды grub возможно интерактивно, во время загрузки. Для этого необходимо нажать “с” в меню GRUB.

В случае с виртуальной машиной может потребоваться при загрузке нажать “Shift” и держать, пока не появится меню GRUBа.

У меня кстати есть видео, как используя это меню, можно в два счёта восстановить забытый пароль от компьютера в случае, если загрузчик GRUB не был запаролен учтивым администратором.

Init

Init процесс – это самый первый процесс, который запускает ядро. Этот процесс особый, т.к. его нельзя запустить в уже работающей системе. Выполняет он функцию инициализации верхнеуровневых вещей.

Т.е. ядро уже существует, и нам нужно смонтировать файловые системы, запустить службы, инициализировать сеть, графическую оболочку и т.д. За всё это дело, как раз и отвечает Init процесс.

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

Также существуют различные инициализации Init процесса. В BSD-системах своя система запуска, есть устаревшая System V, в которой все службы запускаются последовательно.

Ну и SystemD, отличительной особенностью которой является упрощённый процесс загрузки, параллельный запуск служб и запись событий в системный журнал.

Если говорить про настройку SystemD, то следует отметить наличие модулей. Каждый из которых описан в своём собственном unit-файле. Существуют различные типы модулей. Модули служб.

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

Для управления модулями используется утилита systemctl. На слайде представлены основные команды. Статус показывает состояние модуля. Т.е. с помощью этой команды можно определить запущена служба в данный момент или нет.

Пример сервиса SSH. Раздел Unit является универсальным для всех модулей. В нашем случае тут есть Description - описание службы. After - запуск после этой службы. ConditionPathExists - условная зависимость.

Касательно раздела Service. Тут при старте запускается строка. Для релоада используется sshd минус t. Раздел Install описывает настройки, которые важны при инсталляции службы, вызове команды systemsctl enable.

Также в systemd есть журнал логов в бинарном формате journalctl. Это база данных в которой хранятся сообщения ядра и служб, начиная с загрузки и заканчивая завершением работы. Настройки лежат в /etc/systemd/journald.conf

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

Процессы

В операционной системе есть фундаментальное понятия потоков, машинных инструкций выполняющихся друг за другом и процессов.

Процесс – это программа во время выполнения ИЛИ сущность, представляющая понятие активности/работы с точки зрения операционной системы.

Один процесс может содержать несколько потоков. Основные ресурсы процесса: память, процессорное время и оборудование (например, устройства ввода-вывода).

В системе процессы могут прибывать в различном состоянии. Момент создания – new. Runnable – готовность к выполнению. Slepping – состояние ожидания ввода-вывода.

Если процесс завершился успешно он из состояния Running переходит в Terminated. Тоже происходит, если мы сами его завершили посредством передачи соответствующего сигнала.

Ну и состояние Stopped, как понятно из названия отвечает за остановку процесса. Эт когда у нас в терминале комп бухгалтерии пинговался и мы такие внезапно решили прервать сию действо нажав CTRL+Z.

Для того, чтобы смотреть процессы в Linux существует утилита PS. Она поддерживает различные варианты ключей. Например –а, отвечает за вывод всех.

Соответственно наиболее важные поля, которые вам понадобятся для работы с тем или иным процессом это идентификатор, устройство на котором он был запущен, статус, время использования CPU и команда применяемая для запуска.

Параметры в PS можно передавать в различных стилях. В зависимости от этого у него будет разное поведение. Это нужно для обратной совместимости.

Помимо этого можно послать сигнал (signal). Т.е. - уведомить процесс о каком-либо событии. В качестве источников сигналов может выступать терминал (Ctrl-C, Ctrl-Z), процесс (kill()) и даже ядро.

С последним и первым всё плюс-минус понятно. Утилита kill позволяет отправлять сигналы. Подробнее можете почитать в документации man-сигнал. Их овермного. Есть даже пользовательские сигналы, поведение которых никто не описывает.

Они предназначены для того, чтобы разработчик сам определял поведение программы при получении сигнала. Самый известный пример сигнала это, наверное, kill. Он завершает процесс на уровне ядра.

Т.е. прибивает его независимо от того, в каком бы состоянии он находился. Запрос INT, отправляемый в терминал нажатием комбинации CTRL+C. Ну и Term – запрос на завершение программы.

В отличие от килла это корректный запрос. Т.е. программа аккуратно завершает свою работу, сохраняет состояние, закрывает все файлы и только после этого завершается.

Процессы могут выполняться в фоне. Это функция командной оболочки. Для этого в конце команды добавляется амперсанд. Такой процесс отвязывается от текущего терминала и запускается в фоне. 

Также интерпретатор позволяет переводить ввод-вывода в файл. Есть стандартный поток вывода, стандартный поток ошибок. Единица и двойка тут – это специальные файловые дескрипторы.

Единичный знак больше означает, что будет создан файл, либо перезаписано его содержимое. Два знака означает дописывать в конец файла.

Ну и мы можем отдельно переводить ввод-вывода программы и вывода ошибок в разные файлы. Или можем объединять их в один, вот таким образом.

Окей друзья. Нынче мы рассмотрели базовое представление загрузки. Узнали что это за звери такие эти UEFI, GRUB, init и systemd, а также познакомились с процессами в операционной системе Linux.

Для закрепления полученных знаний переходите к выполнению домашней работы. Ссылка на неё, как обычно, будет в описании под этим видосом. Всю домашку проверяю я лично.

Причём абсолютно бесплатно. Исключительно из любви к нашему IT-шному делу. Поэтому не жидитесь. Если нравится контент на канале – поставьте лайк и оставьте развёрнутый комментарий.

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

Ну а бывалым камрадам, по традиции, удачи, успеха, и самое главное, отличного настроения. Помните главное правило. Информационная безопасность – превыше всего. С вами, как обычно, был Денчик. До новых встреч, мои кайфные друже. Всем пока.

Не можешь понять, куда делись видео по взломам и хакингу? Они переехали в наш уютный паблик в телеге

telegram chanel

Хочешь больше контента? Подписывайся на YouTube-канал!

Курс «Диплом за неделю»

Пособие «Библия вардрайвинга»

Курс Cisco «CCNA: Introduction to Networks»

© 2024. IT-спец. Денис Курец.