Главная Темы Тема 1: Основы Linux
$
Главная Темы Упражнения Шпаргалка Ресурсы
01
Основы Linux

Основы Linux и операционных систем

Что такое ОС, как устроен Linux, зачем нужны дистрибутивы — объясняем с нуля.

🕐 ~15 мин чтения 🟢 Уровень: новичок
💡
Что узнаешь из этой темы:
  • Что делает ОС и зачем она вообще нужна
  • Чем настольная, серверная и мобильная ОС отличаются друг от друга
  • Кто, когда и зачем создал Linux
  • Как устроено ядро Linux и что такое модули
  • Что такое дистрибутив и какой выбрать новичку

🖥️ Что такое операционная система?

Компьютер — это железо: процессор, память, диск. Программы хотят этим железом управлять, но не знают как. Операционная система — посредник между программами и железом.

👤 Пользователь + приложения браузер, терминал, редактор...
↕️ API — системные вызовы (syscall)
🧠 Ядро ОС управление памятью, процессами, устройствами
↕️ Драйверы устройств
⚙️ Железо CPU, RAM, SSD, GPU, сетевая карта

Программа не обращается к диску напрямую — она говорит ОС: «Сохрани этот файл», а ОС уже разбирается с железом сама. Это называется системный вызов (syscall).

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

ОС выполняет две главных задачи ядра:

🔌 Доступ к железу

Предоставляет программам доступ к устройствам через удобный API

⚖️ Распределение ресурсов

Решает, какая программа использует процессор, память и устройства

📊 Типы операционных систем

ОС создаются под разные задачи — поэтому смартфон, ноутбук и серверный шкаф работают на разных системах.

🖥️

Настольные

Для личных компьютеров. Удобный интерфейс, широкий выбор программ.

Windows 11 macOS Ubuntu Desktop
📱

Мобильные

Для смартфонов и планшетов. Оптимизированы под сенсорный экран и батарею.

Android iOS
🗄️

Серверные

Часто без графики вообще. Главное — стабильность и производительность под нагрузкой.

Ubuntu Server RHEL / CentOS

Встраиваемые

Для умных устройств: часы, роутеры, холодильники. Работают на минимуме ресурсов.

FreeRTOS QNX
🌍
Факт: Все 500 самых мощных суперкомпьютеров в мире работают на Linux. Сервера Google, Amazon, Яндекс — тоже Linux. Даже Android внутри — это Linux.

🐧 Что такое Linux?

Linux (GNU/Linux) — это семейство Unix-подобных операционных систем на базе ядра Linux. В отличие от Windows и macOS, Linux — это свободное программное обеспечение: его исходный код открыт, изучай и изменяй как хочешь.

Linux — не одна программа, а ядро. Поверх ядра собираются дистрибутивы: ядро + утилиты GNU + пакетный менеджер + (опционально) графический интерфейс.

1
Открытый код

Любой может посмотреть, как работает система, и улучшить её

2
Бесплатно

Большинство дистрибутивов можно скачать и использовать без ограничений

3
Гибкость

Работает от смартфона до суперкомпьютера и умной лампочки

4
Безопасность

Открытость кода означает: уязвимости быстрее находят и закрывают

📜 История Linux

В 1991 году финский студент Линус Торвальдс написал ядро ОС для своего ПК с процессором Intel 80386. За основу взял учебную ОС MINIX. Ядро он выложил в открытый доступ.

Параллельно с 1983 года программист Ричард Столлман развивал проект GNU — набор свободных утилит для Unix-систем. Когда ядро Торвальдса соединили с утилитами GNU, получили полноценную ОС — отсюда полное название GNU/Linux.

1991 Линус Торвальдс анонсировал ядро Linux (25 августа)
1992 Ядро перелицензируется под лицензией GNU GPL (свободное ПО)
1993 100+ разработчиков. Выпуск первых дистрибутивов: Slackware, Debian
1994 Выпуск версии ядра 1.0
1998 IBM, Compaq, Oracle объявляют о поддержке Linux
2013 Android на базе Linux занимает 75% рынка смартфонов
2017 Все 500 суперкомпьютеров из топ-500 работают на Linux
2022 Выпуск ядра версии 6.0

🧩 Архитектура: как устроена ОС

ОС делится на две части:

🔵 Ядро (Kernel)

Главная программа. Запускается при старте компьютера, работает всегда. Управляет памятью, процессами, устройствами.

🟢 Утилиты и приложения

Всё остальное: командная оболочка, файловые менеджеры, браузеры. Запускаются ядром.

Типы ядер

Тип Как устроено Плюс Минус Примеры
Монолитное Всё в одном: файловая система, драйверы, сеть — в одном пространстве памяти Быстро Ошибка в одном модуле может уронить всю систему Linux, FreeBSD, Cisco IOS
Микроядро Ядро минимально. Остальное — отдельные сервисы Изоляция: сбой одного сервиса не роняет систему Медленнее из-за взаимодействия между сервисами Minix, GNU Mach, QNX
Гибридное Компромисс: часть функций в ядре, часть снаружи Баланс скорости и безопасности Сложнее в разработке Windows NT, macOS (XNU)
Встраиваемое Специально для устройств с малым объёмом памяти Работает на слабом железе Очень ограниченный функционал FreeRTOS, Zephyr
🐧
У Linux монолитное ядро, но с поддержкой модулей — отдельных кусков кода, которые подключаются «на лету». Это даёт скорость монолитного ядра при гибкости микроядерного.

🔧 Модули ядра Linux

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

Конфигурация модулей хранится в:

  • /sys/module — информация о загруженных модулях
  • /etc/modprobe.d — правила загрузки модулей
  • /etc/modules-load.d — список модулей, загружаемых при старте системы

Команды для работы с модулями

Управление модулями ядра
user@linux:~$
lsmod
# Показывает список всех загруженных в данный момент модулей ядра
Module Size Used by nfs 348160 0 fscache 393216 1 nfs ...
user@linux:~$
modinfo nfs
# Показывает подробную информацию о модуле: автор, версия, параметры
filename: /lib/modules/.../nfs.ko author: Trond Myklebust ... license: GPL
user@linux:~$
sudo insmod /path/to/module.ko
# Загружает модуль в ядро из указанного файла .ko
user@linux:~$
sudo rmmod nfs
# Выгружает (удаляет) модуль из ядра. Система не перезагружается
user@linux:~$
uname -r
# Показывает версию запущенного в данный момент ядра Linux
5.15.0-94-generic

⚡ Многозадачность

Многозадачность — способность ОС запускать несколько программ одновременно (или создавать иллюзию одновременности). Существует два вида:

😬 Кооперативная

Программа сама решает, когда «уступить» процессор другим. Если программа зависла — зависает вся система.

Устаревший подход
✅ Вытесняющая

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

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

🌿 Дистрибутивы Linux

Дистрибутив — это готовая ОС на базе ядра Linux. Он включает:

  • 🐧 Ядро Linux
  • 📁 Файловую систему
  • 💬 Командную оболочку (bash, zsh и др.)
  • 🔧 Служебные утилиты
  • 📦 Пакетный менеджер — для установки программ

Дистрибутивы делятся на семейства по пакетному менеджеру и философии.

Семейство Debian apt / dpkg

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

Ubuntu — самый популярный дистрибутив. Хорош для обучения и серверов.
Linux Mint — похож на Windows. Отлично подходит, если только переходишь с Windows.
Debian — прародитель семейства. Очень стабильный, популярен на серверах.
sudo apt install nginx — пример установки программы
Семейство Red Hat yum / dnf / rpm

Корпоративный стандарт. Упор на стабильность и безопасность. Популярен в бизнесе.

RHEL (Red Hat Enterprise Linux) — платный. Используется в банках и крупных компаниях.
Rocky Linux / AlmaLinux — бесплатные аналоги RHEL. Популярны на серверах.
Fedora — свежие технологии, опережает другие. Для энтузиастов.
sudo dnf install nginx — пример установки программы
Семейство Arch pacman

Для опытных пользователей. Максимальный контроль — ставишь только то, что выбрал сам.

Arch Linux — «сделай сам». Устанавливаешь вручную каждый компонент.
Manjaro — Arch с удобным установщиком. Компромисс между гибкостью и простотой.
sudo pacman -S nginx — пример установки программы
🚀
Что выбрать для обучения? Ubuntu Server 22.04 LTS — это стандарт в обучении DevOps и на рынке труда. LTS = поддержка 5 лет, ничего не сломается внезапно.
Семейство Пакетный менеджер Формат пакетов Для кого
Debian / Ubuntu apt, dpkg .deb Новички, серверы, разработка
Red Hat / CentOS yum, dnf, rpm .rpm Корпорации, enterprise-серверы
Arch / Manjaro pacman .pkg.tar.zst Опытные пользователи

🏋️ Практические упражнения

Задания проверяются в реальной Linux-системе (VM, VPS, WSL). Прежде чем смотреть решение — попробуй сам.

01

Базовая настройка системы

Новичок ~30 мин

Задача:

  1. Установить Linux (Ubuntu Desktop/Server, WSL или VM)
  2. Настроить сеть, проверить подключение к интернету
  3. Обновить систему
  4. Сгенерировать SSH-ключ и подключиться по SSH
  5. Изменить hostname системы
  6. Изменить часовой пояс (timezone)
  7. Установить баннер при логине (MOTD)

Результат: скриншоты подключения по SSH с видимым MOTD.

💡 Показать решение по шагам
Шаг 1

Проверить и настроить сеть

network check
user@linux:~$
ip addr show
# Смотрим список интерфейсов и IP-адреса
user@linux:~$
ping -c 4 8.8.8.8
# Проверяем доступность интернета (-c 4 = 4 пакета)
user@linux:~$
curl -I https://google.com
# Проверяем HTTP-доступность — если ответил 200/301, интернет есть
Шаг 2

Обновить систему

system update
user@linux:~$
sudo apt update
# Обновляем индекс пакетов — список доступных версий
user@linux:~$
sudo apt upgrade -y
# Устанавливаем все доступные обновления (-y = без вопросов)
Шаг 3

Сгенерировать SSH-ключ

SSH keygen
user@linux:~$
ssh-keygen -t ed25519 -C "myserver"
# Создаёт пару ключей ed25519 (современный алгоритм). Нажми Enter для дефолтного пути
user@linux:~$
cat ~/.ssh/id_ed25519.pub
# Это публичный ключ — его копируют на сервер: ~/.ssh/authorized_keys
user@linux:~$
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@SERVER_IP
# Копирует публичный ключ на сервер — после этого логин без пароля
Шаг 4

Изменить hostname

hostname
user@linux:~$
hostnamectl set-hostname myserver
# Изменяет имя хоста. Изменение сохраняется после перезагрузки
user@linux:~$
hostnamectl status
# Проверяем результат: Static hostname, Operating System, Kernel
Шаг 5

Изменить часовой пояс

timezone
user@linux:~$
timedatectl list-timezones | grep Moscow
# Ищем нужную зону. Для России: Europe/Moscow, Asia/Novosibirsk и т.д.
user@linux:~$
sudo timedatectl set-timezone Europe/Moscow
# Устанавливаем часовой пояс
user@linux:~$
timedatectl status
# Проверяем: Local time и Time zone должны совпадать с нашим выбором
Шаг 6

Настроить MOTD (баннер при входе)

MOTD
user@linux:~$
sudo nano /etc/motd
# Открываем файл баннера в редакторе. Пишем любой текст
======================================== Добро пожаловать на myserver! Сегодня: $(date) Думай, прежде чем sudo. ========================================
user@linux:~$
sudo chmod 644 /etc/motd
# Убеждаемся что права правильные. Теперь при SSH-логине покажется этот баннер
02

Изучение характеристик системы

Новичок ~20 мин

Задача: Определить и записать с помощью команд:

  1. Версию ядра Linux
  2. Количество доступной и используемой памяти (RAM)
  3. Список предустановленных пакетов
  4. Тип загрузчика и его конфигурацию (GRUB/EFI)
  5. Лог последних загрузок системы
💡 Показать решение по шагам
Шаг 1

Версия ядра

kernel info
user@linux:~$
uname -r
# Только версия ядра, например: 5.15.0-94-generic
user@linux:~$
uname -a
# Полная информация: версия, дата сборки, архитектура
user@linux:~$
cat /etc/os-release
# Информация о дистрибутиве: имя, версия Ubuntu/Debian и т.д.
Шаг 2

Память и процессор

memory & CPU
user@linux:~$
free -h
# Оперативная память: total, used, free, available (реально свободно)
total used free available Mem: 7.7Gi 1.2Gi 5.1Gi 6.1Gi Swap: 2.0Gi 0Ki 2.0Gi
user@linux:~$
lscpu | grep -E "CPU|Core|Thread|Arch"
# Краткое: количество ядер, потоков, архитектура
Шаг 3

Загрузчик и модули ядра

bootloader & modules
user@linux:~$
ls /boot/grub/
# Проверяем наличие GRUB — значит это Legacy Boot
user@linux:~$
ls /boot/efi/
# Если есть — это EFI/UEFI Boot
user@linux:~$
cat /boot/grub/grub.cfg | head -30
# Конфигурация GRUB (начало файла)
user@linux:~$
lsmod | head -20
# Первые 20 загруженных модулей ядра
Шаг 4

Логи загрузки

boot logs
user@linux:~$
last -n 10
# Последние 10 входов в систему и перезагрузки
user@linux:~$
journalctl -b 0 --no-pager | head -50
# Логи текущей загрузки (-b 0). -b -1 — предыдущая загрузка
user@linux:~$
systemd-analyze
# Время загрузки системы: firmware + loader + kernel + userspace
user@linux:~$
dpkg -l | wc -l
# Количество установленных пакетов в системе
03

Работа с процессами

Средний ~25 мин

Задача: Используя утилиту script залогировать:

  1. Вывод всех процессов в системе
  2. Вывод всех процессов текущего пользователя
  3. Запуск процесса top в фоновом режиме (background)
  4. Остановку фонового процесса top

Результат: файл ps-log.txt со всем выводом.

💡 Показать решение по шагам
Шаг 1

Начинаем запись в лог

ps-log.txt
user@linux:~$
script ps-log.txt
# Запускаем запись сессии. Всё что печатаем — пишется в ps-log.txt
Script started, output log file is 'ps-log.txt'.
user@linux:~$
ps aux
# Все процессы в системе: PID, пользователь, CPU%, MEM%, команда
user@linux:~$
ps -u $(whoami)
# Только процессы текущего пользователя (whoami подставит имя)
user@linux:~$
top -b -n 1 &
# Запускаем top в фоне: & — background. -b batch-режим, -n 1 — один снимок
[1] 28471
user@linux:~$
jobs -l
# Видим фоновые задачи и их PID
user@linux:~$
kill %1
# Останавливаем задачу №1 (top). %1 — номер из jobs
[1]+ Terminated top -b -n 1
user@linux:~$
exit
# Завершаем запись. Файл ps-log.txt сохранён
04

Установка пакетов и сервисов

Продвинутый ~60 мин

Часть A — Java:

  1. Установить Java (JDK) из пакетного репозитория apt
  2. Установить вторую версию Java из скачанного архива (tar.gz)
  3. Настроить update-alternatives для переключения между версиями
  4. Залогировать в java-log.txt

Часть B — Nginx:

  1. Установить Nginx
  2. Создать собственный systemd unit-файл для Nginx
  3. Добавить в автозапуск
  4. Залогировать в nginx-log.txt
💡 Показать решение по шагам
Java — Шаг 1

Установка Java из репозитория

java from apt
user@linux:~$
script java-log.txt
# Начинаем запись лога
user@linux:~$
sudo apt install -y openjdk-17-jdk
# Устанавливаем JDK 17 из репозитория Ubuntu
user@linux:~$
java -version
# Проверяем версию
Java — Шаг 2

Установка Java из архива (OpenJDK 21)

java from archive
user@linux:~$
wget https://download.java.net/java/GA/jdk21/fd2272bbf8e04c3dbaee13770090416c/35/GPL/openjdk-21_linux-x64_bin.tar.gz
# Скачиваем архив OpenJDK 21 с официального сайта
user@linux:~$
sudo tar -xzf openjdk-21_linux-x64_bin.tar.gz -C /opt/
# Распаковываем в /opt/. Там будет папка jdk-21/
user@linux:~$
sudo update-alternatives --install /usr/bin/java java /opt/jdk-21/bin/java 100
# Регистрируем JDK 21 в системе alternatives. 100 = приоритет
user@linux:~$
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 50
# Регистрируем JDK 17. Приоритет 50 — ниже чем у 21
Java — Шаг 3

Переключение между версиями

alternatives
user@linux:~$
sudo update-alternatives --config java
# Интерактивное меню: выбираем нужную версию вводом числа
user@linux:~$
java -version
# Проверяем — версия должна измениться
user@linux:~$
exit
# Завершаем запись java-log.txt
Nginx — Шаг 1

Установка Nginx и создание unit-файла

nginx-log.txt
user@linux:~$
script nginx-log.txt
# Начинаем запись
user@linux:~$
sudo apt install -y nginx
# Устанавливаем Nginx
user@linux:~$
sudo systemctl stop nginx && sudo systemctl disable nginx
# Останавливаем системный сервис и убираем из автозапуска
user@linux:~$
sudo nano /etc/systemd/system/my-nginx.service
# Создаём свой unit-файл. Содержимое ниже ↓
[Unit] Description=My Custom Nginx Web Server After=network.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
user@linux:~$
sudo systemctl daemon-reload
# Перечитываем unit-файлы — обязательно после создания нового
user@linux:~$
sudo systemctl start my-nginx && sudo systemctl enable my-nginx
# Запускаем и добавляем в автозапуск наш кастомный сервис
user@linux:~$
sudo systemctl status my-nginx
# Проверяем: должно быть active (running)
user@linux:~$
exit
# Завершаем запись nginx-log.txt
🏋️
Практические упражнения к теме

4 задания: от базовой настройки системы до установки Java и Nginx с кастомным systemd unit-файлом

Перейти к упражнениям →