GNU/Linux | Notes
2.34K subscribers
116 photos
8 files
82 links
Open Source, Dotfiles, Debian/Ubuntu, Software, Linux, Scripts, Notes, Terminal, Shell, Gnu, Tools, Games, Fun, Free Software Movement.

Автор: Кирилл Рехов
Почта: krekhov.dev@gmail.com
Кто я: https://xn--r1a.website/krxnotes/246
GitHub: https://github.com/krekhovx
Download Telegram
Что такое монолитное ядро?

Монолитное ядро - это архитектура операционной системы, при которой ядро системы является единым целым и работает в одном адресном пространстве. Все основные компоненты системы, такие как драйверы устройств, файловая система, управление памятью и прочее, интегрированы непосредственно в ядро и выполняются в режиме ядра, то есть с максимальными привилегиями.

Это противоположно микроядерной архитектуре, где эти компоненты выполняются отдельно как пользовательские процессы. Примерами операционных систем с монолитным ядром являются: Linux, Windows и macOS.

#kernel #theory
Что такое linux-headers?

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

Пользовательские программы обращаются к /usr/include заголовкам.
Модули ядра обращаются к /usr/src/linux-headers-$(uname -r) заголовкам.

#kernel #theory
Встроенные и загружаемые модули ядра

Встроенные модули
- это те, которые встроены в ядро на этапе его сборки.

Загружаемые модули - обычно от сторонних поставщиков, могут существовать только отдельно и загружаться в память на этапе исполнения.

Показывает загружаемые модули:
$ lsmod


Показывает встроенные модули:
$ cat /lib/modules/$(uname -r)/modules.builtin


Показывает как встроенные так и загружаемые модули:
$ ls /sys/module


Встроенные модули отмечаются как: CONFIG_SCSI=y (встроенная в ядро функциональность), а загружаемые как CONFIG_SCSI=m (отдельные .ko файлы, которые запускает kmod при необходимости).

CONFIG_SCSI взят для примера.

Некоторые модули не видны в выводе lsmod, но видны в modinfo потому что они являются (builtin).

#kernel #utils
Замена системных вызовов с помощью модулей ядра

Из книги https://tldp.org/LDP/lkmpg/2.6/lkmpg.pdf:
You can even write modules to replace the kernel's system calls, which we'll do shortly. Crackers often make use of this sort of thing for backdoors or trojans, but you can write your own modules to do more benign things, like have the kernel write Tee hee, that tickles! everytime someone tries to delete a file on your system.

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

#kernel #books
Что такое GRUB?

GRUB (GRand Unified Bootloader)
в основном предназначен для загрузки операционной системы. Он управляет процессом загрузки, позволяя пользователю выбрать операционную систему или ядро, которое он хочет загрузить, и затем передает управление этому выбранному ядру.

Основная функция загрузчика Linux включает в себя возможность выполнять следующие задачи:
* выбирать одно из нескольких ядер;
* переключаться между наборами параметров ядра;
* разрешить пользователю вручную переопределять и редактировать имена и параметры образов ядра;
* обеспечить поддержку загрузки других операционных систем;

Файл конфигурации GRUB, который отображается при нажатии кнопки e в меню GRUB, можно прочитать в файле /boot/grub/grub.cfg на диске. Однако, не рекомендуется редактировать этот файл напрямую, так как он обычно генерируется автоматически с помощью команды update-grub, которая использует шаблоны и настройки из /etc/default/grub и скриптов в /etc/grub.d/

1. GRUB не участвует в процессе выключения. Его роль ограничивается начальной фазой загрузки системы.
2. Процесс выключения (или перезагрузки) управляется самим операционным ядром (kernel) и операционной системой, которые выполняют последовательность действий для корректного завершения всех процессов, демонтирования файловых систем и отключения питания.

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

#kernel #theory
Что такое Аудит и для чего он нужен?

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

Ни одно из названных событий не может произойти без использования системных вызовов ядра. Чтобы их отслеживать, достаточно просто перехватывать соответствующие системные вызовы. Именно это и делает подсистема аудита. Когда я работал системным программистом, то часто приходилось взаимодействовать с аудитом (для отладки).

$ apt-get install -y auditd
$ systemctl status auditd


Конфигурация: /etc/audit/auditd.conf

Выполнить программу и отследить ее события (работает наподобие strace):
$ autrace <path-to-program>

После autrace:
$ ausearch -i -p <pid>


События 1000 пользователя:
$ ausearch -ui 1000


Поиск событий по коду выхода:
$ ausearch -i -e -13


Искать события open:
$ ausearch -ui 1000 -sc open


Номера всех системных вызовов:
$ ausyscall --dump


#kernel #security #utils
Kernel panic - это критическая ошибка в операционной системе, когда система не может продолжать работу из-за серьезных проблем. Часто это связано с аппаратными сбоями, такими как неисправность оперативной памяти, процессора. Также это может быть вызвано невозможностью найти и смонтировать корневую файловую систему, запуском некорректных драйверов или ошибок в процессе инициализации (initramfs). Система может пытаться использовать несуществующие ресурсы, что приводит к этому состоянию.

#kernel #theory
——— НАВИГАЦИЯ ———

Git: #git
Жвачка: #fun
Ядро: #kernel
Разное: #misc
ПО: #software
Игры: #games
Книги: #books
Люди: #people
Сборка: #build
Утилиты: #utils
Python: #python
Теория: #theory
Debian: #debian
Новости: #news
Оболочка: #shell
Память: #memory
СПО: #opensource
Терминал: #terminal
Мои мысли: #thoughts
Безопасность: #security
Информация канала: #info
Конфигурационные файлы: #dotfiles

Кто я: https://xn--r1a.website/krxnotes/246
Откуда берется информация: https://xn--r1a.website/krxnotes/500

Поддержать канал:
2202 2036 6907 4603

Спасибо, что читаете!
Кризис в продвижении Rust в ядро из-за опасений усложнения сопровождения

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

https://www.opennet.ru/opennews/art.shtml?num=62685

#kernel #news
Библиотечные функции и системные вызовы

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

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

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

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

#kernel #theory
Частый вопрос на позицию системного инженера Linux

В Linux нет технологии которая бы позволяла залезть процессу в память другого процесса. Но почему это может GDB (GNU Debugger)? Это возможно благодаря тому, что GDB использует отладочные интерфейсы ядра Linux (например, системный вызов ptrace), которые позволяют отслеживать и изменять состояние других процессов, включая доступ к их памяти для чтения и записи. Таким образом, хотя само ядро Linux не предоставляет прямого доступа к памяти других процессов, GDB может использовать специальные механизмы для отладки и анализа процессов.

Файл /proc/sys/kernel/yama/ptrace_scope контролирует степень безопасности работы ptrace.
- Значение 0: Разрешает отладку всех процессов
- Значение 1: Разрешает отладку только процессов с тем же UID
- Значение 2: Запрещает отладку процессов с другим UID

#kernel #theory #security
Компоненты ядра операционной системы Linux

1. Process Scheduler (SCHED)
Планировщик процессов, отвечает за контроль над доступом процессов к CPU. Обеспечивает такое поведение ядра, при котором все процессы имеют справедливый доступ к центральному процессору.

2. Memory Manager (MM)
Менеджер памяти, обеспечивает различным процессам безопасный доступ к основной памяти системы. Кроме того, MM обеспечивает работу виртуальной памяти, которая позволяет процессам использовать больше памяти, чем реально доступно в системе. Выделенная, но неиспользуемая память вытесняется на файловую систему, и при необходимости - возвращается из неё обратно в память (swapping).

3. Virtual File System (VFS)
Уровень абстракции поверх конкретной реализации файловой системы. Целью VFS является обеспечение единообразного доступа клиентских приложений к различным типам файловых систем.

4. Network Interface (NET)
Сетевые интерфейсы, обеспечивает работу с различными сетевыми стандартами и сетевым оборудованием.

5. Inter-Process Communication (IPC)
Межпроцессное взаимодействие, обмен данными между потоками одного или разных процессов, реализуется посредством механизмов, предоставляемых ядром OC или процессом.

#kernel #theory
strace

Отследить работу процесса a.out:
$ strace a.out


Вывод в файл log:
$ strace -o my-log a.out


Отслеживание конкретного процесса:
$ strace -p <pid>


Отследить встроенную команду:
$ strace bash -c 'cd /tmp'


Например, команда 'mount -t nfs ...' возвращает отрицательный статус, можно проанализировать вывод утилиты strace:
$ strace -o mount.strace -s1024 -f -i -k -n mount -t nfs <path> <to-path>


Разбор:
-s1024 длина сообщений будет полная, а не обрезанная (32 длиной).
-f отслеживать дочерние процессы (если они будут созданы - fork()).
-i указатель инструкции во время системного вызова.
-k трассировка выполнения отслеживаемых процессов.
-n номера системных вызовов.

Данные трюки я использовал при отладке ПО. Работая системным программистом часто приходилось пользоваться strace. Если strace не работает, можно обратиться к файлу /proc/sys/kernel/yama/ptrace_scope, про него описано в man 2 ptrace.

#kernel #utils
Как смотреть журналы (dmesg и journalctl)

journalctl
- системный журнал (читает /var/log/journal).

Вывод в реальном времени:
$ journalctl -f


Отобразить сегодняшние записи:
$ journalctl -S today


Вывести только err уровень:
$ journalctl -S today -p err


err, warning уровни:
$ journalctl -S today -p 3..4


Показывает журнал конкретного сервиса:
$ journalctl -u <name>.service


dmesg - системный журнал ядра (читает /var/log/kern.log или напрямую из ядра).

less вывод:
$ dmesg -H


Читабельный формат:
$ dmesg -T


Показывает уровень (приоритет):
$ dmesg -x


Вывод в реальном времени:
$ dmesg -w


В сумме:
$ dmesg -HTx


Зачистить dmesg:
$ dmesg -C


#kernel #utils
LFS (Linux From Scratch)

LFS (Linux From Scratch) — это проект (и книга), который учит создавать Linux-дистрибутив буквально с нуля — вы компилируете и собираете каждый компонент вручную, начиная с ядра, libc, bash, gcc и далее.

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

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

- Система после сборки обычно не содержит ничего лишнего, только самые необходимые компоненты — всё остальное вы добавляете самостоятельно.

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

- На основе LFS можно строить свои собственные дистрибутивы, полностью контролируя набор программ и конфигураций.

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

Ссылка: https://www.linuxfromscratch.org

Ссылка: https://ru.wikipedia.org/wiki/Linux_From_Scratch

Перевод книги на русский: https://book.linuxfromscratch.ru

#kernel #books #build
kernel-hardening-checker

Это инструмент и библиотека для Linux, предназначенная для проверки конфигурации ядра на соответствие рекомендациям по усилению безопасности (security hardening) и противодействию эксплойтам. Он позволяет выявить, какие конфигурации ядра включены, а какие нет, помогая администраторам настроить систему на более безопасный уровень работы.

Установка:
# Пакет проходит проверку и скоро появится в ветке sid (unstable)

Проверяет указанный файл конфигурации ядра Linux на включённые меры харденига и выводит отчёт с рекомендациями, опция -c указывает путь к конфигу:
$ kernel-hardening-checker -c /boot/config-6.1.0-32-amd64


> GitHub

#kernel #security #utils #opensource #software