Как учиться — Linux VM, эксперименты со strace, чтение /proc
Курс по ОС без работающего Linux под рукой — это как курс по плаванию без бассейна. Можно прочитать, что такое страничная память, но без cat /proc/[pid]/maps и strace вы не почувствуете, как это устроено в реальности. В этом уроке — как настроить рабочую среду, какие тулзы поставить и какая методика дает максимум на час времени.
Принцип простой: каждая концепция — эксперимент в терминале. Прочитали про fork? Запустите C-программу с fork() и посмотрите в ps. Прочитали про память? Откройте /proc/self/maps и разберите по строчкам. Это в десять раз эффективнее простого чтения.
Какое окружение нужно
Курс предполагает Linux. Не macOS, не Windows, не WSL1. Конкретно — Linux с полноценным /proc, strace, perf, и желательно правом sysctl и unshare. Вариантов несколько:
Лучший вариант для большинства — WSL2 на Windows или Multipass/Lima на macOS. Если у вас уже есть Linux на ноутбуке — работайте на нём.
Что НЕ подойдёт:
- macOS native. Многие команды другие или отсутствуют (
/proc— нет!,strace— нет, естьdtrussс другим синтаксисом). Можно использовать как хост для VM, но не основная среда. - Online-терминалы (replit, gitpod). Чаще всего без
/proc, без прав наstrace, безperf. Для самых базовых уроков ОК, для остальных — нет.
Рекомендуемый дистрибутив
Ubuntu 22.04 LTS или 24.04 LTS. Почему: самая распространённая, самая большая комьюнити, большая часть туториалов и Stack Overflow ответов написаны под Ubuntu. Альтернативы: Debian 12 (стабильнее, чуть старее софт), Fedora 40 (новее софт, чуть ближе к bleeding edge).
Дистрибутивы Linux: Debian, RHEL, Arch, AlpineКакие тулзы установить
Ниже — набор тулзов, которые используются в курсе постоянно. Один раз поставьте — и работайте.
# Ubuntu/Debian:
sudo apt update
sudo apt install -y \
build-essential \
strace \
ltrace \
sysstat \
procps \
htop \
iotop \
lsof \
psmisc \
linux-tools-common linux-tools-generic \
bpfcc-tools \
bpftrace \
binutils \
gdb \
valgrind \
python3 python3-pip
# Fedora:
sudo dnf install -y \
@development-tools \
strace ltrace \
sysstat \
procps-ng \
htop iotop \
lsof \
psmisc \
perf \
bcc-tools bpftrace \
binutils \
gdb \
valgrind \
python3 python3-pip
Что для чего:
После установки убедитесь, что всё работает:
# Проверим, что strace работает на простой команде:
strace -c ls > /dev/null 2>&1 && echo "[OK] strace works"
# Проверим, что perf работает (может потребовать настроек kernel.perf_event_paranoid):
perf stat -e cpu-cycles ls > /dev/null 2>&1 && echo "[OK] perf works"
# Если ошибка Permission denied, выполните:
# sudo sysctl -w kernel.perf_event_paranoid=1
# Проверим bpftrace:
sudo bpftrace -e 'BEGIN { printf("[OK] bpftrace works\n"); exit() }' 2>/dev/null
Главный принцип: эксперимент к каждой концепции
Главный «секрет» курса — не просто читать материал, а проверять каждое утверждение в терминале. Когда вы прочитали «процесс имеет fd-таблицу», не идите дальше, пока не сделали:
# Посмотрим fd-таблицу вашего shell:
ls -la /proc/$$/fd/
# Что-то вроде:
# lrwx------ 1 user user 64 May 18 14:00 0 -> /dev/pts/0
# lrwx------ 1 user user 64 May 18 14:00 1 -> /dev/pts/0
# lrwx------ 1 user user 64 May 18 14:00 2 -> /dev/pts/0
# lrwx------ 1 user user 64 May 18 14:00 255 -> /dev/pts/0
Каждая строка — открытый файл. fd 0/1/2 — это stdin/stdout/stderr (показывают на ваш терминал). fd 255 — bash для своих нужд. Это конкретно. Это можно потрогать.
Так строится интуиция: за каждым словом в материале стоит реальный объект в системе, который можно увидеть и понять.
Главный инструмент N1: strace
strace — это магнитофон, который записывает все syscalls процесса. Если вы хотите понять, что физически делает программа — запустите её через strace. Пример:
# Что делает простой `ls`?
strace -e openat,read,write,close ls / 2>&1 | head -30
Вывод — что-то вроде:
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
read(3, "{cache content}", 832) = 832
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "{ELF data}", 832) = 832
...
openat(AT_FDCWD, "/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
{читает содержимое директории...}
write(1, "bin boot dev etc home lib\n", 31) = 31
close(3) = 0
Что вы только что увидели:
lsоткрыл/etc/ld.so.cache— кэш динамических библиотек.- Открыл
libselinux.so.1— shared library. - Открыл
/для чтения содержимого. - Записал результат в fd=1 (stdout) — это вы видите на экране.
Теперь вы знаете не только «ls показывает файлы», а что физически происходит. И этот подход работает с любой программой.
Полезные паттерны strace
# Все syscalls c подсчётом времени:
strace -c command
# Только определённые syscalls (по категории):
strace -e trace=file command # все file-related
strace -e trace=network command # все network-related
strace -e trace=process command # fork, exec, exit, wait
# Конкретные syscalls:
strace -e openat,close,read,write command
# С подсветкой времени:
strace -tt command
# Прикрепиться к запущенному процессу:
strace -p <PID>
# С перехватом дочерних процессов:
strace -f command
# Запись в файл (полезно для длинных трасс):
strace -o trace.log command
Главный инструмент N2: чтение /proc
/proc — это псевдо-файловая система, через которую Linux показывает состояние ядра и процессов. Это не настоящая файловая система на диске — это интерфейс, который ядро создаёт on the fly.
Что внутри /proc/[pid]
Самые важные файлы:
# Замените 1234 на любой PID в вашей системе. Можно $$ для вашего shell.
PID=$$ # PID текущего shell
ls /proc/$PID/
# Самые важные:
cat /proc/$PID/status # Человекочитаемое состояние процесса
cat /proc/$PID/cmdline # Командная строка запуска (\0 разделитель)
cat /proc/$PID/maps # Карта виртуальной памяти процесса
cat /proc/$PID/stat # Состояние в одну строку (для top, ps)
ls -la /proc/$PID/fd/ # Открытые файловые дескрипторы
cat /proc/$PID/limits # Ulimits процесса
ls -la /proc/$PID/cwd # Текущая директория
ls -la /proc/$PID/exe # Бинарь процесса
Пример /proc/self/status:
Name: bash
State: S (sleeping)
Tgid: 12345
Pid: 12345
PPid: 1
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
VmPeak: 12340 kB
VmSize: 12340 kB
VmRSS: 4000 kB
Threads: 1
Каждое поле — информация о процессе, которую ps и top собирают именно отсюда. После курса вы сможете прочитать любое поле и понять, что оно значит.
Методика прохождения урока
Эффективный подход к каждому уроку (15-20 минут материала):
Не пропускайте шаг 2. Это главное отличие осознанного обучения от поверхностного. Когда вы своими глазами видите вывод /proc/[pid]/maps — виртуальная память перестаёт быть абстракцией.
Темп: один урок в день — комфортно. Два урока в день — быстро, но возможно. Больше — не успеете отрефлексировать. Курс рассчитан на 50 часов = около 100 уроков. При темпе 5 уроков в неделю — 20 недель. При темпе 10 уроков в неделю — 10 недель.
Полезные привычки
Несколько привычек, которые ускорят прохождение и сделают знание устойчивее:
-
Ведите заметки. Не «конспектируйте материал», а записывайте, что узнали для себя нового. Один файл, формат «тема — что узнал». Полезно перед собеседованиями.
-
Не копируйте команды бездумно. Перед каждой командой попробуйте предсказать, что она покажет. Сверьте с реальностью. Так строится интуиция.
-
Когда что-то странное — лезьте в man.
man fork,man 2 read,man 5 proc(5 — секция про форматы файлов, включая /proc). Самый качественный источник для Linux. -
Используйте
man -k. Поиск по описаниям всех man-страниц. Например,man -k swapпокажет все программы про swap. -
Когда тулза говорит что-то непонятное — посмотрите в /proc. Часто проще понять источник данных, чем дискомфорт от чужой интерпретации.
-
Делайте
straceна свои скрипты. Запустите свой Python-скрипт черезstrace -f -e openat,read,write python script.pyи посмотрите, что физически делает. Многое прояснится.
Чего НЕ делать
Несколько антипаттернов в обучении ОС:
-
Не лезьте сразу в исходники ядра. Это занимает огромное время и для Junior не даст пропорциональной отдачи. Сначала — широкая база, потом — detail-by-detail.
-
Не пытайтесь запомнить все номера syscalls и флаги. Их сотни. Запомните принципы и тулзы, чтобы быстро найти нужное.
-
Не игнорируйте упражнения «попробуй сам». Чтение без практики работает в 3 раза хуже.
-
Не делайте всё за один раз. Распределите курс на 2-3 месяца. Промежутки между уроками — это когда мозг «утрясывает» материал.
-
Не сравнивайте с senior-ами на форумах. Они изучали 10 лет. Вам сейчас нужно начать. К знаниям вернётесь через год.
Попробуй сам
Настройте окружение прямо сейчас:
# 1. Проверьте, что вы в Linux:
uname -a
# Должно быть Linux. Если Darwin (macOS) или Microsoft (WSL1) -- настройте VM/WSL2.
# 2. Проверьте, что есть /proc:
ls /proc/ | head
# Должны быть числа (PIDs) и системные файлы (cpuinfo, meminfo и т.д.)
# 3. Проверьте strace:
strace -c true 2>&1 | tail -5
# 4. Создайте файл для заметок:
mkdir -p ~/os-notes
echo "# OS Fundamentals notes" > ~/os-notes/README.md
echo "" >> ~/os-notes/README.md
echo "## Lesson 00.03 - How to study" >> ~/os-notes/README.md
# 5. Сделайте свой первый эксперимент:
cat /proc/self/status | head -10
# Сохраните вывод в заметки. Это PID, состояние и базовые поля вашего shell.
Если эти команды отработали без ошибок — вы готовы. Если что-то не сработало — решите эти проблемы сейчас (Stack Overflow, Reddit r/linux), потому что в следующих уроках без рабочего окружения будет тяжело.