Learning Platform
Глоссарий Troubleshooting
Урок 01.03 · 14 мин
Начальный
Setupstrace/procМетодикаLinux

Как учиться — 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. Вариантов несколько:

Окружения для курса -- какое выбрать
Native LinuxUbuntu/Debian/Fedora установлен на основной машине или dual-boot. Лучший вариант: всё работает out of the box, perf и strace без ограничений
WSL2Windows Subsystem for Linux v2: реальное Linux-ядро, /proc есть. Ограничения: nested virtualization для KVM, perf может не работать без CONFIG_PERF_EVENTS в hyper-v kernel. Для большинства уроков хватает
VirtualBox/VMwareVM на любой ОС. Полноценный Linux. Минусы: производительность чуть хуже, занимает диск. Плюсы: можно ломать систему и пересоздавать
Docker containerdocker run --privileged --pid=host ubuntu bash. Работает на любой ОС. Минус: контейнер делит ядро с хостом, некоторые тулзы (strace на других процессах) требуют --cap-add
Cloud VPSDigitalOcean, Hetzner, AWS EC2 t3.micro. От 4$ в месяц. Плюс: полноценная Linux система с правами. Минус: платное
Multipass / LimaMultipass от Canonical (для Ubuntu) или Lima (для Mac). Облегчённый VM-менеджер. multipass launch + multipass shell. Полноценный Linux, без ручной настройки

Лучший вариант для большинства — 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Трассирует system calls процесса. Показывает все syscalls и их аргументы. Главный тулз для понимания, что делает программа на уровне ядра
ltraceТрассирует библиотечные вызовы (libc и др.). Полезно для понимания, что делает программа на уровне libc, до syscalls
lsofList Open Files: показывает все открытые файлы в системе или у процесса. Незаменимо для дебага fd-leak
htopИнтерактивный top: дерево процессов, цвета, скроллинг, легко искать. Замена top для повседневного использования
iotoptop для I/O: показывает, какой процесс активно читает/пишет диск. Требует root
vmstatVirtual memory statistics: процессы, память, swap, I/O, CPU усреднённо. vmstat 1 -- обновление каждую секунду
perfПрофилировщик: CPU events, sampling, flame graphs. Главный инструмент performance-инженера в Linux
bpftraceDTrace-like для Linux: tracing на eBPF. Можно делать tracing скрипты для произвольных kernel events
gdb / valgrindgdb -- отладчик, valgrind -- проверка памяти (leaks, invalid access). Используем эпизодически в модулях про память

После установки убедитесь, что всё работает:

# Проверим, что 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

Что вы только что увидели:

  1. ls открыл /etc/ld.so.cache — кэш динамических библиотек.
  2. Открыл libselinux.so.1 — shared library.
  3. Открыл / для чтения содержимого.
  4. Записал результат в 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 -- что где
/proc/[pid]/Информация о процессе. Один поддиректория на каждый процесс в системе. Например /proc/1234/. Что в ней -- разобрано ниже
/proc/self/Симлинк на /proc/[pid] текущего процесса. Удобно: можно cat /proc/self/maps -- увидеть карту памяти вашего shell
/proc/cpuinfoИнформация о CPU: модель, частота, кэши, флаги (avx, sse и др.). Один блок на каждое логическое CPU/гипертред
/proc/meminfoИнформация о памяти: total, free, cached, buffers, swap. То, что free -h показывает в более удобном виде
/proc/loadavgТекущий load average: 1min, 5min, 15min, runnable/total processes, last PID. Источник информации для uptime и top
/proc/mountsВсе mount-points в системе. Что primary где смонтировано, какая ФС, какие опции. Полезно для дебага mount-проблем
/proc/net/Сетевые таблицы и состояние: tcp, udp, route, arp. То, на чём работают netstat и ss под капотом
/proc/sys/Kernel параметры (sysctl). Можно читать и (с правами) писать -- меняет поведение ядра. /proc/sys/vm/swappiness -- сколько ядро любит swap

Что внутри /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 минут материала):

Структура изучения одного урока
1. Прочитать теориюОдин проход целиком, без задержек. Понять общую структуру -- что разбираем, какие концепции, как связано. 5 минут
2. Эксперименты в терминалеОткрыть терминал, выполнить все примеры из урока (strace, /proc и т.д.). НЕ просто скопировать -- понять каждую строку вывода. 10 минут
3. Попробуй самСделать упражнение раздела 'Попробуй сам'. Цель -- применить, что узнали, на своём примере. 5-10 минут
4. Knowledge Check + QuizОтветить на KnowledgeCheck в конце урока. Пройти quiz. Если что-то неясно -- вернуться к материалу. 5 минут

Не пропускайте шаг 2. Это главное отличие осознанного обучения от поверхностного. Когда вы своими глазами видите вывод /proc/[pid]/maps — виртуальная память перестаёт быть абстракцией.

Темп: один урок в день — комфортно. Два урока в день — быстро, но возможно. Больше — не успеете отрефлексировать. Курс рассчитан на 50 часов = около 100 уроков. При темпе 5 уроков в неделю — 20 недель. При темпе 10 уроков в неделю — 10 недель.


Полезные привычки

Несколько привычек, которые ускорят прохождение и сделают знание устойчивее:

  1. Ведите заметки. Не «конспектируйте материал», а записывайте, что узнали для себя нового. Один файл, формат «тема — что узнал». Полезно перед собеседованиями.

  2. Не копируйте команды бездумно. Перед каждой командой попробуйте предсказать, что она покажет. Сверьте с реальностью. Так строится интуиция.

  3. Когда что-то странное — лезьте в man. man fork, man 2 read, man 5 proc (5 — секция про форматы файлов, включая /proc). Самый качественный источник для Linux.

  4. Используйте man -k. Поиск по описаниям всех man-страниц. Например, man -k swap покажет все программы про swap.

  5. Когда тулза говорит что-то непонятное — посмотрите в /proc. Часто проще понять источник данных, чем дискомфорт от чужой интерпретации.

  6. Делайте strace на свои скрипты. Запустите свой Python-скрипт через strace -f -e openat,read,write python script.py и посмотрите, что физически делает. Многое прояснится.


Чего НЕ делать

Несколько антипаттернов в обучении ОС:

  1. Не лезьте сразу в исходники ядра. Это занимает огромное время и для Junior не даст пропорциональной отдачи. Сначала — широкая база, потом — detail-by-detail.

  2. Не пытайтесь запомнить все номера syscalls и флаги. Их сотни. Запомните принципы и тулзы, чтобы быстро найти нужное.

  3. Не игнорируйте упражнения «попробуй сам». Чтение без практики работает в 3 раза хуже.

  4. Не делайте всё за один раз. Распределите курс на 2-3 месяца. Промежутки между уроками — это когда мозг «утрясывает» материал.

  5. Не сравнивайте с 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), потому что в следующих уроках без рабочего окружения будет тяжело.


Проверка знанийKnowledge check
Junior спрашивает: 'У меня MacBook. Могу я просто использовать macOS? Там же тоже Unix, и есть многие команды.'
ОтветAnswer
Технически можно, но для этого курса это плохая идея. Несколько причин: (1) Главное: на macOS НЕТ /proc. Вообще. Это не Linux-инновация и не POSIX-стандарт -- это специфическая для Linux/Solaris псевдо-ФС. На macOS вместо неё sysctl и launchctl. Курс активно использует /proc для большинства уроков -- без него половина материала бесполезна. (2) strace на macOS не существует. Вместо него dtruss (на основе DTrace), но он требует отключения SIP, синтаксис другой, документация хуже. То же про ltrace, perf, vmstat, iotop -- либо нет, либо отличается. (3) Многие системные вызовы и их семантика отличаются. В Linux есть epoll -- в macOS kqueue. Linux fork() -- copy-on-write -- в macOS реализация совместима, но в деталях разная. SIGCHLD, SIGUSR -- немного отличаются. (4) Файловая система: Linux ext4/xfs/btrfs -- macOS APFS/HFS+. Mount options и поведение -- разное. (5) Init система: Linux systemd -- macOS launchd. Boot процесс -- совершенно разный (EFI у обоих, но дальше всё разное). Что делать: используйте macOS как ХОСТ (он отлично работает), а Linux -- в VM через UTM/Multipass/Lima/Docker. Multipass -- проще всего: 'brew install multipass', 'multipass launch', 'multipass shell' -- и вы в чистой Ubuntu. Все команды курса работают. Можно ломать и пересоздавать. Когда курс закончите, опционально посмотрите macOS-эквиваленты -- это полезно знать как fun fact, но не как основу.

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 5. Какой набор инструментов является минимально необходимым для прохождения практической части курса?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 3