💡 Полезные Советы

Процесс загрузки Linux‑системы

31.01.26
9

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

1. BIOS/UEFI: старт системы

После включения процессор начинает выполнять код встроенной прошивки материнской платы - BIOS или UEFI.

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

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

2. MBR/GPT: первая стадия загрузки

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

MBR (Master Boot Record) - классическая схема, занимает первые 512 байт диска.

GPT (GUID Partition Table) - современная схема, логически отделяет таблицу разделов и код загрузки.

В этой области лежит крошечный фрагмент кода - первая стадия загрузчика. Его возможности ограничены: он только считывает таблицу разделов и находит место, где расположена "вторая стадия" полноценного загрузчика (обычно на разделе /boot).

3. Загрузчик (GRUB/LILO): выбор и запуск ядра

Дальше управление получает загрузчик второго этапа - чаще всего GRUB.

Он уже умеет работать с файловыми системами и конфигурационными файлами.

Типичные задачи загрузчика:

  • Показать меню с вариантами загрузки (разные ядра, режим восстановления, другие ОС).
  • По выбору пользователя загрузить в память образ ядра Linux и initramfs (initial RAM filesystem).
  • Передать управление загруженному ядру.

В системах с dual‑boot GRUB может не только загружать Linux, но и "передавать эстафету" загрузчику Windows (chainloading).

4. initramfs: временная файловая система в памяти

После загрузки в память ядро получает вместе с ним образ initramfs - это небольшая файловая система, расположенная в оперативной памяти.

Зачем она нужна:

  • На "настоящем" корневом разделе (/) лежат драйверы и модули, но чтобы его смонтировать, эти драйверы уже должны быть доступны.
  • initramfs решает эту проблему, предоставляя ядру временный root с необходимыми модулями, скриптами и утилитами.

Типичный сценарий работы initramfs:

  1. Ядро монтирует initramfs как временную корневую файловую систему и запускает из неё скрипт /init.
  2. /init подгружает модули ядра, настраивает RAID, LVM, расшифровывает шифрованные разделы и ищет постоянный корневой раздел.
  3. После нахождения и монтирования «настоящего» root выполняется переход (switch_root/pivot_root) на него, и система готова стартовать основную init‑систему.

По сути initramfs - одноразовая мини‑система, которая существует только во время старта и "исчезает" после перехода на основной root.

5. Ядро Linux: инициализация системы

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

На этом этапе формируется базовый программный "скелет" системы: ядро уже умеет работать с устройствами и файловыми системами и готово запускать пользовательские процессы.

Когда корневой раздел смонтирован, ядро запускает первый пользовательский процесс с PID 1 - init‑систему.

6. Init‑система: запуск служб и пользовательской среды

Init‑система - это первый процесс в пространстве пользователя, который отвечает за запуск всех остальных сервисов и подготовку окружения для пользователя.

В современных дистрибутивах чаще всего используется systemd, но исторически применялись и другие варианты:

SysV init - набор shell‑скриптов и runlevel’ов (0,1,3,5 и т.д.), запускающих службы в определённом порядке.

Upstart - событийная система, где службы стартуют в ответ на события (запуск системы, поднятие сети и т.п.).

systemd - современная система с unit‑файлами, параллельным запуском служб, зависимостями и мощным журналированием.

Основные задачи init‑системы:

  • Запустить системные службы (журналы, сеть, диспетчер входа, SSH, cron и др.).
  • Смонтировать дополнительные файловые системы.
  • Запустить графический сервер и рабочее окружение пользователя либо выдать текстовое приглашение логина.

Как только init‑система завершит свои задачи, пользователь видит приглашение к входу или рабочий стол - на этом процесс загрузки считается завершённым.

Глоссарий терминов

BIOS и UEFI - "Начальники железа"

  • BIOS (Basic Input/Output System - базовая система ввода‑вывода)
    Представьте BIOS как "бригадира" на стройке. Когда вы включаете компьютер, он просыпается первым, проверяет, что все рабочие (железо) на месте и в состоянии работать, а затем показывает, откуда начинать строительство (загрузку системы).
    Это старая технология: она простая, но имеет ограничения (например, не видит очень большие современные диски и имеет примитивный текстовый интерфейс).
  • UEFI (Unified Extensible Firmware Interface)
    Это "современный менеджер" на замену старому бригадиру BIOS. Он делает то же самое (проверяет железо и ищет загрузчик), но гораздо умнее:
    • Понимает мышку и имеет красивый графический интерфейс.
    • Видит диски огромного объёма (больше 2 ТБ).
    • Умеет загружаться быстрее и безопаснее (Secure Boot).
      Сегодня почти на всех новых компьютерах стоит именно UEFI, хотя по привычке мы часто называем его BIOS.
  • POST (Power-On Self Test)
    Это "утренняя перекличка" железа. Сразу после включения BIOS/UEFI быстро проверяет основные узлы:
    • Оперативная память (RAM) - целая ли?
    • Видеокарта - работает ли вывод на экран?
    • Клавиатура - подключена ли?
      Если всё хорошо - компьютер пикнет один раз или просто покажет логотип. Если что-то сломалось - начнёт пищать кодами ошибок (например, три длинных гудка - проблема с памятью).

Разметка диска: MBR и GPT
Чтобы компьютер понял, где на диске лежат файлы, диск нужно разметить.

  • MBR (Master Boot Record - главная загрузочная запись)
    Старый способ разметки, как старая карта города.
    • Ограничение: видит диск размером максимум 2 Терабайта.
    • Может иметь всего 4 главных раздела (например, диск C, D, E и F).
    • Хранит информацию о разделах только в одном месте (в самом начале диска) - если это место повредится, можно потерять все данные.
      Загрузчик при такой разметке часто "втискивается" прямо в эти первые байты диска.
  • GPT (GUID Partition Table - таблица разделов GUID)
    Современная "карта города".
    • Понимает диски любого реального размера (хоть 100 ТБ).
    • Позволяет создать огромное количество разделов (теоретически - бесконечно, практически - 128 и больше).
    • Хранит копии таблицы разделов в начале и в конце диска - если начало повредится, данные можно восстановить из копии.
      Обычно используется в паре с UEFI.

Загрузчики в мир ОС

  • Загрузчик (Bootloader)
    Это маленькая программа-посредник. BIOS/UEFI слишком примитивен, чтобы разбираться в файлах операционной системы. Поэтому он запускает загрузчик, а уже загрузчик знает: "Ага, ядро Linux лежит вот в этой папке на этом диске, сейчас я его прочитаю и запущу".
    Примеры: GRUB (для Linux), Windows Boot Manager (для Windows).
  • GRUB (GRand Unified Bootloader)
    Самый популярный и мощный загрузчик в мире Linux.
    Его суперсилы:
    • Умеет загружать почти любую операционную систему.
    • Показывает меню при включении компьютера, где вы можете выбрать: "Загрузить Ubuntu", "Загрузить Windows" или "Восстановить систему".
    • Если что-то сломалось, у него есть своя командная строка, через которую иногда можно починить загрузку вручную.
  • Chainloading (Цепная загрузка)
    Это когда один загрузчик не грузит систему сам, а передает управление другому загрузчику.
    Представьте: вы выбрали в меню GRUB пункт «Windows». GRUB не умеет запускать ядро Windows напрямую, он просто говорит: «Эй, загрузчик Windows, твой выход!», и передаёт управление ему. Для пользователя это выглядит просто как выбор пункта меню.

Внутренности Linux: Ядро и его помощники

  • Ядро (Kernel)
    Это "мозг" операционной системы.
    Ядро - это самая главная программа, которая управляет всем компьютером.
    • Оно решает, какой программе дать поработать процессором прямо сейчас.
    • Оно выделяет память программам и следит, чтобы они не мешали друг другу.
    • Оно общается с железом (дисками, видеокартой, мышкой).
      Пользователь с ядром напрямую не общается - для этого есть оболочки и программы.
  • Драйвер
    Это "словарь" или "инструкция" для ядра.
    Ядро само по себе не знает, как управлять конкретной моделью видеокарты NVIDIA или принтером Canon. Драйвер - это модуль, который объясняет ядру: "Чтобы напечатать страницу на этом принтере, нужно отправить вот такие команды в порт USB".
    Без драйверов железо просто "мертвый груз".
  • initramfs (Initial RAM Filesystem)
    Это "аварийный чемоданчик" для старта ядра.
    Проблема: чтобы прочитать файлы с диска, ядру нужен драйвер диска. Но драйвер диска сам лежит на диске! Как его прочитать, если мы еще не умеем читать диск?
    Решение: initramfs - это маленький архив, который загрузчик кладёт в оперативную память вместе с ядром. В нём уже лежат самые важные драйверы. Ядро сначала открывает этот архив, берёт оттуда драйвер диска, а уже потом может читать настоящий большой диск с системой.
  • Root (Корень, /)
    Это главная папка всей системы Linux.
    В Windows есть диски C:, D:, E:. В Linux всё начинается от одного корня - символа /.
    Все остальные диски и флешки "подключаются" (монтируются) внутрь папок в этом корне. Когда система загружена, именно в корне лежат все ваши программы, настройки и файлы.

Init-системы: "Управляющие процессами"
После того как ядро запустилось, оно запускает самый первый процесс (PID 1). Этот процесс должен запустить всё остальное (сеть, звук, экран входа в систему). Это и есть Init-система.

  • SysV init (System V init)
    Классический, "дедовский" метод.
    • Работает по строгой очереди: сначала запусти сеть, потом (когда сеть готова) запусти SSH, потом запусти веб-сервер.
    • Использует простые и понятные скрипты (текстовые файлы с командами).
    • Минус: загрузка идёт медленно, потому что процессы ждут друг друга.
  • systemd
    Современный стандарт (используется в Ubuntu, Debian, CentOS, Fedora).
    • Умеет запускать всё параллельно: сеть и звук грузятся одновременно, не ожидая друг друга, если не зависят друг от друга.
    • Очень мощная и сложная: умеет перезапускать упавшие службы, следить за логами, управлять таймерами.
    • Многие критикуют её за сложность ("комбайн, который делает всё"), но она де-факто стандарт сегодня.
  • Upstart
    Попытка сделать что-то среднее между старым SysV и новым systemd.
    Главная идея - "события". Не просто "запусти сеть", а "если вставили сетевой кабель - запусти настройку сети".
    Сейчас почти не используется, так как systemd победила в "войне init-систем".

Шпаргалка по chmod: права доступа в Linux простым языком

27.01.26
15

В Linux права считаются простой арифметикой. Вы просто складываете числа для нужных действий.

1. Базовые значения

ЧислоДействиеАнгл.Описание
4ЧтениеReadМожно открыть и посмотреть файл
2ЗаписьWriteМожно изменять или удалять файл
1ВыполнениеeXecuteМожно запустить файл (скрипт/программу)

2. Полная таблица (как на твоем скрине)

Чтобы получить комбинированные права, просто сложите цифры (например: Чтение + Запись = 4 + 2 = 6).

ЧислоСимволыРасшифровка (Права)Формула
0---Нет правНичего
1--xТолько выполнение1
2-w-Только запись2
3-wxЗапись + Выполнение2 + 1
4r--Только чтение4
5r-xЧтение + Выполнение4 + 1
6rw-Чтение + Запись4 + 2
7rwxПолные права (всё вместе)4 + 2 + 1

В командах вы обычно видите три цифры подряд, например 755. Они обозначают права для трех категорий пользователей по очереди:

  1. Владелец (Owner) - тот, кто создал файл.

  2. Группа (Group) - коллеги/команда владельца.

  3. Остальные (Others) - все прочие пользователи системы.

Пример: chmod 755 filename

  • 7 (Владелец): rwx (Может всё: читать, писать, запускать).

  • 5 (Группа): r-x (Может читать и запускать, но не редактировать).

  • 5 (Остальные): r-x (Могут читать и запускать, но не редактировать).

Популярные комбинации

  • chmod 777 - Разрешено всё и всем (опасно для безопасности, используйте с осторожностью).

  • chmod 755 - Стандарт для программ и скриптов (владелец меняет, остальные только запускают).

  • chmod 644 - Стандарт для обычных документов (владелец читает/пишет, остальные только читают).

  • chmod 600 - Секретный файл (только владелец может читать и писать, остальные даже не откроют).

  • chmod +x - Сделать файл исполняемым (добавляет "x" всем).

💡 Важное применительно к папка(директориям)

  1. Папка без x (Execute) - бесполезна!

    • Если у папки есть права rw- (6), но нет x, вы сможете сделать ls (увидеть имена файлов), но не сможете открыть ни один файл внутри, не сможете зайти в нее (cd) и получить доступ к подпапкам.

    • Поэтому для папок почти всегда нужно давать минимум 5 (r-x) или 7 (rwx). Права 6 (rw-) для папок встречаются крайне редко.

  2. Право удалять файлы (w на папку)

    • Чтобы удалить файл, вам не нужны права на запись в сам файл. Вам нужны права на запись (w) в папку, где этот файл лежит.

    • Пример: Вы можете удалить чужой файл, защищенный от записи (r--), если у вас есть полные права (rwx) на папку, в которой он находится.

  3. Комбинация wx (3) для папок

    • Это называется "Drop Box" (почтовый ящик). Вы можете положить туда файл (создать), но не можете посмотреть (ls), что там еще лежит (нет r). Используется редко, например, для папки lost+found.
       

Шпаргалка по systemctl: Управление службами в Linux

25.01.26
141

systemd - это система инициализации и управления службами в Linux. Основная утилита для взаимодействия с ней - systemctl. С её помощью мы запускаем веб-серверы, базы данных, ботов и настраиваем их автозагрузку.

Примечание.

systemd - это центральный механизм, который отвечает за запуск Linux после включения компьютера и за управление всеми службами (демонами), работающими в системе.
Когда Linux загружается, именно systemd:
•     запускает сетевые службы
•     поднимает базы данных
•     стартует веб‑серверы
•     следит за зависимостями
•     перезапускает упавшие процессы
•     управляет логами
Чтобы взаимодействовать с systemd, используется команда systemctl - это как "пульт управления" всеми службами.

В командах ниже замените name на имя вашей службы (например, nginx, docker, postgresql или my-bot).

1. Управление состоянием (прямо сейчас)

Базовые команды для включения и выключения.

КомандаОписание
systemctl start nameЗапустить службу.
systemctl stop nameОстановить службу.
systemctl restart nameПерезапустить (Stop + Start). Используется, если служба зависла или нужно применить серьезные изменения.
systemctl reload nameПеречитать конфигурацию без остановки. Идеально для веб-серверов (Nginx/Apache) при правке конфигов.
systemctl status nameПоказать статус. Самая важная команда: показывает, запущена ли служба, последние логи и ошибки.

Примечание.

Не обязательно писать .service в конце имени (например, можно писать sudo systemctl start nginx вместо nginx.service).

2. Автозагрузка (при включении ПК)

Эти команды определяют, будет ли служба стартовать сама после перезагрузки сервера.

КомандаОписание
systemctl enable nameВключить автозагрузку. Создает симлинк в системе.
systemctl disable nameВыключить автозагрузку. Служба не запустится сама после ребута.
systemctl enable --now nameКиллер-фича: Включает автозагрузку И сразу запускает службу. (2 команды в одной).
systemctl is-enabled nameПроверить, включена ли автозагрузка сейчас.

Диагностика и поиск проблем

Если что-то сломалось, эти команды помогут понять, где именно.

  • systemctl --failed Показать список всех служб, которые упали с ошибкой. С этого стоит начинать починку системы.

  • systemctl list-units --type=service Показать вообще все активные службы в системе.

Иерархия каталогов Linux: что где лежит и зачем это нужно

25.01.26
74

В Linux нет дисков C: или D:. Есть только один корень - /. Все остальные диски, флешки и устройства подключаются как папки в эту структуру.

Шпаргалка

ДиректорияОписаниеПримеры содержимого
/binОсновные команды (binaries)ls, cp, cat, bash
/sbinСистемные команды (system binaries)fdisk, reboot, iptables
/bootФайлы загрузчика системыЯдро Linux, GRUB
/etcКонфигурационные файлыНастройки сети, пользователей, служб
/devФайлы устройств (devices)Диски (sda), терминалы (tty), null
/homeДомашние папки пользователейДокументы, загрузки, настройки пользователя
/rootДомашняя папка суперпользователя (root)Личная папка суперпользователя (root)
/libСистемные библиотекиФайлы .so, модули ядра
/optСтороннее ПО (optional)Крупные программы (Chrome, Telegram, Zoom)
/mntВременное монтированиеТочки для ручного подключения дисков
/mediaАвтоматическое монтированиеФлешки, CD-диски (подключаются сами)
/procИнформация о процессах и ядреВиртуальная ФС (инфо о CPU, памяти)
/tmpВременные файлы (temporary)Очищается при перезагрузке
/usrПрограммы и утилиты (resources)Вторичная иерархия: софт, иконки, мануалы
/varИзменяемые данные (variable)Логи (/var/log), кэш, почта, сайты (/var/www)

1. Самое важное для запуска

  • /boot - сердце загрузки. Здесь живет ядро Linux (vmlinuz) и загрузчик GRUB. Если удалить - система не встанет.

  • /bin и /sbin - здесь живут команды.

    • В /bin - общие (типа ls, cat), доступные всем.

    • В /sbin - для админа (типа fdisk, iptables), нужны права root.

  • /lib - библиотеки, без которых программы из папок выше не запустятся (аналог .dll в Windows).

2. Пользователи и настройки

  • /home - ваши личные файлы. Аналог C:\Users.

  • /root - личная комната Администратора. Она отделена от /home, чтобы, если раздел с пользователями забьется или сломается, админ все равно мог войти в систему.

  • /etc - пульт управления. Здесь лежат текстовые файлы с настройками всей системы (сеть, fstab, конфиги программ).

3. Софт и приложения

  • /usr - (Unix System Resources). Самая большая папка. Здесь лежат установленные программы (/usr/bin), их библиотеки (/usr/lib) и документация. По сути, это аналог Program Files.

  • /opt - для "большого" стороннего софта, который ставится одним куском (например, Google Chrome, Telegram, проприетарные базы данных).

4. Данные и временные файлы

  • /var - (Variable). Всё, что постоянно меняется: логи системы (/var/log), кэш, очереди печати, файлы веб-сайта (/var/www).

  • /tmp - временная свалка. Очищается при каждой перезагрузке. Не храните здесь ничего важного!

5. Устройства и Система

  • /dev - в Linux всё есть файл, даже ваше "железо". Жесткий диск - это файл (/dev/sda), терминал - файл.

  • /proc - это иллюзия. Файлов там на самом деле нет, это интерфейс к ядру. Через эту папку можно посмотреть информацию о процессоре (/proc/cpuinfo) или памяти.

FAQ: В чем разница между /mnt и /media?

Частый вопрос новичков.

  • /media - система использует сама. Вставили флешку - она появилась тут автоматически.

  • /mnt - для ручной работы. Админ использует её, чтобы временно подключить диск для восстановления или настройки.

Полезный совет

Если вы забыли, для чего нужна папка, в Linux есть встроенная справка. Просто введите в терминале: man hier (от слова hierarchy) - и получите подробнейшее описание стандарта файловой системы.

А как прописать разрешение экрана в cmdline? Raspberry Pi 4 или 5

24.01.26
22

Прописывать разрешение именно через cmdline.txt имеет смысл, если вы используете современные версии Ubuntu с драйверами KMS (Kernel Mode Setting), и стандартные настройки в config.txt игнорируются системой. Это заставляет ядро Linux принудительно использовать указанный режим.

 

Вставьте SD-карту в компьютер, откройте раздел boot (или system-boot) и найдите файл cmdline.txt.

В конец той же самой единственной строки (через пробел) нужно добавить команду в формате: video=<Port>:<Resolution>@<RefreshRate><Option> например:

video=HDMI-A-1:1920x1080@60D

Для Raspberry Pi 4 и 5 (порт возле питания - HDMI-1):

HDMI-A-1 - имя порта (для первого micro-HDMI).

1920x1080 - разрешение.

@60 - частота обновления.

D - важный флаг (Digital), который принудительно включает выход, даже если монитор не распознан (нет EDID). Полезно при переходниках, KVM, старых мониторах, телевизорах.

 

Linux: Почему sudo echo >> не работает и как писать в системные файлы правильно

19.01.26
27

Вы наверняка сталкивались с этой классической ошибкой новичка. Вы пытаетесь добавить строку в конфиг, но получаете Permission denied, даже используя sudo.

Как делать не надо

Допустим, мы хотим добавить репозиторий:

sudo echo "deb http://nginx.org/packages/mainline/ubuntu/ jammy nginx" >> /etc/apt/sources.list.d/nginx.list

Результат: bash: /etc/apt/sources.list.d/nginx.list: Permission denied

Почему так происходит?

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

  1. Оболочка сначала обрабатывает оператор >>.
  2. Именно оболочка (bash/zsh), а не sudo, пытается открыть файл на запись.
  3. Оболочка запущена от вашего текущего пользователя (не root), поэтому прав на запись нет.

  4. Команда sudo применяется только к echo, но не к самому процессу записи в файл.

Решение: Команда tee

Используйте утилиту tee. Она читает данные из стандартного ввода и записывает их в файл, при этом выводя их на экран.

Правильный синтаксис:

echo "Hello world" | sudo tee -a /tmp/testfile.txt
  • | (пайп) передает текст команде справа.

  • sudo запускает tee с правами суперпользователя.

  • -a (append) - критически важный флаг. Он добавляет текст в конец файла. Без него tee перезапишет файл целиком!

Мини-демонстрация

Попробуем на безопасном примере:

# Пишем
echo "Hello world" | sudo tee -a /tmp/testfile.txt

# Проверяем
cat /tmp/testfile.txt

Вывод: Hello world

Продвинутый уровень: Полезные сценарии

Вот как решать более сложные задачи, с которыми echo уже не справляется.

1. Безопасное добавление нескольких строк (Here-Doc)

Если нужно записать целый блок конфига, не нужно делать десять echo. Используйте конструкцию EOF в связке с tee:

cat <<EOF | sudo tee -a /etc/sysctl.conf
# Улучшение сетевых настроек
net.ipv4.tcp_window_scaling = 1
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
EOF

Это чисто, читаемо и выполняется одной транзакцией, не перезаписывает файл.

2. Удаление или замена строк (sed)

Для удаления строк перенаправление не нужно, так как sed умеет редактировать файлы "на месте" (in-place).

Удалить конкретную строку (например, с ошибочным репозиторием):

# Удаляет все строки, содержащие "google-chrome"
sudo sed -i '/google-chrome/d' /etc/apt/sources.list

Заменить одно значение на другое:

# Заменяет "PermitRootLogin yes" на "PermitRootLogin no"
sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

Важно: Флаг -i изменяет исходный файл. Всегда делайте бэкап перед запуском!

3. Обработка данных и запись в защищённый файл (ss + awk + tee)

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

Пример: Сохранить список портов, на которых слушают сервисы.

# awk фильтрует данные, а tee записывает их с правами root
ss -tuln | awk '/LISTEN/ {print $5}' | sudo tee /var/log/active_ports.log > /dev/null

Заметка: > /dev/null в конце нужен, если вы не хотите, чтобы tee дублировал результат вам в консоль.

4. Как делать бэкап "на лету"

При изменении конфигов через sed или tee хорошим тоном считается создание резервной копии.

С sed это очень просто - добавьте расширение после флага -i:

# Создаст файл /etc/hosts.bak перед изменением
sudo sed -i.bak 's/old-ip/new-ip/' /etc/hosts

Где это пригодится?

  • Apt: Добавление репозиториев в /etc/apt/sources.list.d/

  • Config: Изменение настроек в /etc/nginx/, /etc/apache2/

  • System: Тюнинг ядра в /etc/sysctl.conf

  • Security: Добавление лимитов в /etc/security/limits.conf

  • Keys: Запись бинарных ключей: cat key.gpg | sudo tee /usr/share/keyrings/app.gpg