Операционные системы семейства UNIX — 2017
Содержание
Материалы
Arch Linux Wiki и Gentoo Linux Wiki - замечательные и обширные вики в стиле DIY от двух замечательных хардкорных дистрибутивов.
How to Create an Operating System - книга про создание игрушечной UNIX-подобной операционной системы на C++
Writing a Simple Operating System - From Scratch и Попытка реализации и другие ресурсы по разработке ОС с нуля
Бесплатные книги
Ten Steps to Linux Survival (PDF ePub Mobi)
Operating Systems: Three Easy Pieces - книга посвящена устройству операционных систем в разрезах виртуализации, многозадачности и персистентности.
Beej's Guide to Unix IPC - обзор механизмов межпроцессного взаимодействия в UNIX-системах.
Beej's Guide to Network Programming Using Internet Sockets - обзор механизмов сетевого взаимодействия в UNIX-системах.
Файловая система
Filesystem Hierarchy Standard (см. также man hier)
Linux Standard Base (на практике не поддерживается многими дистрибутивами, в т.ч. Debian)
Список Linux Allocated Devices
Shell
Bash Guide - ресурсы по продвинутому использованию Bash (BashFAQ / BashPitfalls). Иногда на ревью я буду напрямую ссылаться на нарушение пунктов BashFAQ/BashPitfalls.
Safe ways to do things in bash
Бесплатная книжка The Linux Command Line
Learn by Example: Linux Command Line
Toybox (замена busybox) и рассуждения о том, что он должен в перспективе в себя включать; в том числе можно использовать как список команд, полезных для ознакомления
Fun Unix Awards - некоторые распространённые ошибки.
ShellCheck - инструмент синтаксического анализа скриптов на предмет частых ошибок. Требуется прохождение вашими скриптами этого теста (или обоснование ложности его срабатывания).
Gallery of Bad Code - больше распространённых ошибок.
ExplainShell - разбор выражений командной оболочки с подбором справочных материалов к их компонентам.
Советы по устранению "башизмов"
Советы по укорачиванию кода на bash (не для промышленного использования).
Command Line Fu - рейтинг однострочных команд.
Awesome Shell - много ссылок.
Флаги для упрощения отладки сценариев
Roundup - юнит-тестирование сценариев командной оболочки.
coreutils in Rust - попытка реализации GNU coreutils на языке Rust.
Google Shell Style Guide - рекомендации по стилю сценариев командной оболочки, принятому в Google.
Q: Где достать примеров?
A1: Advanced Bash Scripting Guide - List of Examples.
A2: /usr/bin$ for file in *; do if [ "$(head -c2 "$file")" = '#!' ]; then echo "$file"; fi; done
Обработка текста
Learn by Example: Command-Line Text Processing
grep(1) -w, --word-regexp The expression is searched for as a word (as if surrounded by `[[:<:]]' and `[[:>:]]'; see re_format(7)).
Ядро
Драйверы устройств
Список Linux Allocated Devices
Получить список Minor и Major всех устройств в /dev:
stat -f "Name: %N%n%tType: %HT%n%tMajor: %Hr%n%tMinor: %Lr%n%n" /dev/*
Занятие 20.12.2017 г.
Файловые системы
Ознакомиться с материалами.
Дополнительные материалы:
Сравнение современных файловых систем
In-band deduplication for btrfs - механизм дедупликации в ФС btrfs.
ADBFS - пример файловой системы пользовательского режима на основе FUSE.
ELF, динамическое связывание
Про ELF-секции и то, как под капотом устроены макросы вроде module_init
Про динамическую линковку и то, как работает PIC
Eщё про ELF, GOT/PLT и низкоуровневые подробности динамической линковки
Про библиотеки-"оборотни" (которые одновременно и исполняемые файлы)
LD_PRELOAD
Иллюстрация механизма LD_PRELOAD
Механизм futex()
futex(2) - подход к решению проблемы производительности мьютексов
Напоследок (развлечения)
Полный перевод Unix-коанов на русский язык
Vim Adventures - игра для изучения редактора Vim (довольно скоро просит денег :)
VimGolf - соревнование по решению задач обработки текста наименьшим числом нажатий клавиш; решения таких задачи в Emacs
Aboriginal Linux - набор скриптов, собирающих Linux-систему, способную пересобраться из исходного кода (deprecated в пользу mkroot)
К выполнению ДЗ
Флаги для упрощения отладки сценариев
EINTR and what is it good for - об обработке возвращаемого значения EINTR по возврату из системных вызовов
sh - shell autoindent (внизу README.md - ссылки на плагины для популярных текстовых редакторов
Online autoindent with shell syntax support
Вместо послесловия
Знаете ли Вы, что...
- bash -c 'echo "$1"' a b c выводит не a (это полезно знать, если запускаете bash -c из xargs, find -exec и т.д.)?
- в bash можно выполнить последнюю команду под sudo с помощью sudo !! или найти предыдущую команду по подстроке после нажатия Ctrl-R (и очень много чего ещё)?
- с помощью программы pv можно наблюдать за потоком данных через pipe, а с помощью программы sponge можно записать в файл, из которого идёт чтение, по завершении его обработки (обе команды нужно устанавливать дополнительно, пакеты обычно называются pv и moreutils соответственно)?
- с помощью программы watch можно запускать команду через промежутки времени, чтобы наблюдать за её выводом (аргументы по умолчанию передаются в sh -c, поэтому работают пайплайны и нужно быть осторожными с escaping; есть интересный режим --difference)?
- с помощью программы tput можно выводить специальные символы управления терминалом, которые будут подбираться по универсальным смысловым описаниям исходя из типа терминала?
- можно устанавливать целые пакеты программ, предназначенных для некоторой цели, с помощью утилиты tasksel (ну или установки метапакетов)?
- установочные пакеты можно создавать самостоятельно без боли и слёз?
- программы, собираемые и устанавливаемые из исходного кода, можно сразу оборачивать в пакеты с возможностью деинсталляции?
- можно настроить систему так, чтобы добавление/расширение/сжатие разделов жёсткого диска (даже за счёт нескольких физических дисков) осуществлялось без необходимости перемещения данных на остальных разделах?
- с помощью команды sudo mknod -m 0666 /tmp/mynull c 1 3 можно создать свою копию устройства /dev/null?
- есть способ перезагрузить зависшую систему, более безопасный, чем hardware reset?
- существуют "оконные менеджеры текстового режима"?
- через SSH можно управлять удалённой системой не только с помощью командной строки, но и запускать графические приложения (подробности)?
- можно заставить команды удалённой SSH-сессии управлять локальным компьютером?
- существует удобное приложение под Android для запуска Linux-дистрибутивов под chroot (требует root-прав на устройстве);
- программы для Linux тоже могут распространяться как один файл, содержащий необходимые зависимости (portable)?
- существует больше двух дюжин тайловых оконных менеджеров?
- содержимое экрана - это тоже файл?
Если Вам интересно узнать про:
- разделы диска и (мульти)загрузку - пригодятся ключевые слова mount, umount, blkid, lsblk (попробуйте опцию -O), sync, partprobe, /etc/fstab, /etc/mtab, Device mapper, LVM, GParted, gdisk, GRUB2, GRUB4DOS, UEFI, rEFInd, ntfs-3g (в частности про общие права доступа к NTFS между ОС);
- быструю синхронизацию файлов и каталогов (с умным механизмом rolling checksum) - ознакомьтесь с rsync (там наконец-то есть правильный progress); кстати, интересный продукт "скрещивания" rsync и git - bup;
- операции, гарантированно выполняемые атомарно - см. этот список;
- выполнение задач по расписанию - см. cron (чтобы долгие задачи выполнялись в "критической секции" и не могли запуститься в нескольких экземплярах одновременно, используйте "мьютексы" на основе файловой системы - flock);
- доступ к SSH по ключам вместо паролей - читайте это руководство; Вам также может пригодиться знание про SSH agent forwarding (когда ключ хранится на одной машине, а используется во всех SSH-сессиях любого уровня вложенности) и способ заставить его работать при переподключениях в screen/tmux;
- обход ограничений сетевых брандмауэров с помощью зашифрованных каналов (тоже ssh!) - читайте про SSH Tunneling;
- создание сервисов (обычно демонов), перезапускаемых после завершения или перезагрузки - см. это руководство;
- работу с пакетами и репозиториями - см. сюда;
- некоторые, местами весьма подробные, детали работы ядра Linux - можно начать отсюда;
- дизайн операционных систем реального времени - соответствующая страница Википедии очень содержательна.
Если Вы готовы учиться постоянно...
...уже доступны некоторые материалы курса для двухгодичной магистратуры!
И просто интересные ссылки:
- fd - find on steroids
- Sortix - "a small self-hosting operating-system aiming to be a clean and modern POSIX implementation"
Архивные материалы
Темы
Домашние задания
Задания сдаются через систему AnyTask.
Курс: "Белорусский государственный университет", далее "БГУ 2017 - Linux".
- Установить UNIX-систему
- Matryoshka: файловая система внутри файла
- Be a shell master: сценарии командной оболочки (запись)
- Pipeline: конвейер команд своими руками
- 100 TB: выделить 100 ТБ памяти
- Guess: guessing game через Unix-сокеты
- /dev/nulll: /dev/null с подсчётом объёма выброшенного мусора
- Brainstorm: kernel-level interpreter
- Be an open source jerk: патчим ПО с открытым исходным кодом (запись)
Система оценки
Для зачёта должны быть сданы как минимум задания 1, 2A, 2B и какое-то из оставшихся.
3 балла из 10 рассчитываются исходя из оценки по курсу машинного обучения (менее 4 - 0, 4-6 - 1, 7-8 - 2, 9-10 - 3).
Оставшиеся баллы напрямую вычисляются на основании суммарного балла из ведомости в Anytask по следующей схеме (т.е., например, получив 2 балла по ML, всё ещё можно получить 8 собственно по Unix и 10 в сумме):
Баллы | Оценка |
---|---|
33+ | 10 |
31-32 | 9 |
29-30 | 8 |
27-28 | 7 |
25-26 | 6 |
23-24 | 5 |
21-22 | 4 |
19-20 | 3 |
17-18 | 2 |
15-16 | 1 |
Менее 15 | 0 |
Расписание
Актуальное расписание см. в соответствующей таблице
Стандарты
POSIX (Portable Operating System Interface)
SUS (Single UNIX Specification) Версия 4, редакция 2016 года
FHS (Filesystem Hierarchy Standard)
Про POSIX с точки зрения доступности стандарта
Контакты
Преподаватель: Картынник Юрий