Making a micro Linux distro (2023)
В статье рассматривается создание микро-Linux дистрибутива с нуля, включая сборку ядра Linux и разработку ПО для упаковки. Пример реализован для архитектуры RISC-V (QEMU riscv64 virt), но подход применим и к x86. Автор предупреждает, что это упрощенное представление Linux-дистрибутива, предназначенное для начинающих, и некоторые детали могут быть неточны на 0.1%.
Ядро операционной системы выполняет несколько ключевых функций: обеспечивает одновременное выполнение программ даже на одноядерных устройствах, абстрагирует низкоуровневые операции с оборудованием, предоставляя разработчикам простые высокоуровневые интерфейсы. Вместо того чтобы знать физические адреса устройств, приложения просто сообщают ядру о своих потребностях (например, "вывести сообщение на стандартный вывод"). Также ядро предоставляет файловые системы как интерфейсы для взаимодействия с данными, которые могут храниться не только на дисках, и создает программную модель, позволяющую приложениям работать независимо, не зная друг о друге.
Комментарии (28)
- Обсуждение вращается вокруг создания минимальной Linux-системы: от идеи до практических нюансов (UEFI, cloud-init, PXE, initramfs, cpio, u-root, kexec, Gentoo vs LFS vs Buildroot).
- Участники делятся опытом, что «маленькая» сборка может быть полезна как для обучения, так и для практического применения (например, как образ для облачных инстансов).
- Обсуждаются различные инструменты и подходы: от полностью статически слинкованных бинарников до полноценных дистрибутивов, а также варианты с использованием u-root, kexec, initramfs, cpio, PXE и т.д.
- Участники также обсуждают, что такие мини-дистрибутивы могут быть полезны для обучения, отладки и даже как основа для специализированных образов (например, для RPi или как образ для облачных провайдеров).
Erlang ARM32 JIT is born
Команда GRiSP достигла ключевого рубежа в портировании JIT-компилятора Erlang BEAM на ARM32: впервые выполнила функцию Erlang через сгенерированный машинный код. Используя эмулятор QEMU, они запустили минимальный модуль hello.erl, который вызывает встроенную функцию erlang:halt/2 с кодом возврата 42. Это подтвердило работоспособность базовой цепочки: загрузка BEAM, инициализация JIT, компиляция и выполнение кода.
JIT инициализирует общие фрагменты кода и модуль erts_beamasm, содержащий критические инструкции для управления процессами, такие как run_process и normal_exit. Модуль hello был помещён в предзагружаемые модули, чтобы обеспечить его выполнение при старте системы. Код доступен в репозитории GitHub, а работа ведётся при поддержке Erlang Ecosystem Foundation.
Комментарии (17)
- Обсуждение причин разработки JIT-компилятора для ARM32 в Erlang, включая актуальность 32-битных ARM-микроконтроллеров на рынке встроенных систем.
- Дебаты о текущем статусе архитектуры ARM32: участники отмечают, что она не устарела и до сих пор поддерживается в новых реализациях (v8-a, v8-m), несмотря на её нишевый статус.
- Вопросы о целесообразности запуска Erlang на маломощных устройствах: одни видят потенциал, другие сомневаются в необходимости из-за ограничений памяти и производительности.
- Обсуждение технических деталей: путаница с ESP32 JIT, сравнение с RISC-V, особенности наборов инструкций (Arm/Thumb/Thumb2).
- Замечание о том, что «более высокая скорость» других языков является субъективной характеристикой («при определенных определениях быстрее»).
Blockdiff: We built our own file format for VM disk snapshots
Разработчики создали формат blockdiff для мгновенных снапшотов дисков виртуальных машин, сократив время создания с 30+ минут на EC2 до нескольких секунд — ускорение в 200 раз. Это стало возможным благодаря хранению только изменённых блоков данных, что экономит место и ускоряет операции. Формат работает поверх CoW-механизмов XFS в Linux, обеспечивая нулевые накладные расходы и мгновенное создание снапшотов без полного сканирования диска.
Ключевые применения включают сохранение сред разработки, быстрое пробуждение ВМ из сна и откат изменений. Решение обошло ограничения бинарных диффов и OverlayFS, предложив простую и надёжную реализацию на Rust. Открытый исходный код доступен на GitHub, что позволяет сообществу адаптировать инструмент для схожих задач.
Комментарии (17)
- Удивление отсутствием рассмотрения формата QCOW2 и технологии тонкого provisioning VDO с LVM2 для решения аналогичных задач.
- Вопросы о выборе XFS вместо ZFS/BTRFS, использовании LVM-снимков и возможности интеграции решения с другими гипервизорами и файловыми системами.
- Обсуждение технических деталей реализации: использование флагов для синхронизации файлов, поддержка copy_file_range в qemu-img, сравнение с OverlayBD.
- Интерес к применению технологии для ускорения подготовки виртуальных машин в CI/CD и публичном облаке.
- Замечания о необходимости альтернативного текста для изображений и выбора лицензии для проекта.
VMScape and why Xen dodged it
Новая атака VMScape от ETH Zürich использует уязвимости предсказателя переходов в процессорах AMD Zen 4 и Zen 5 для утечки данных между виртуальными машинами в облачных средах. Она успешно работает против гипервизоров KVM и VMware, позволяя вредоносной гостевой VM атаковать компоненты пользовательского пространства, такие как QEMU, и извлекать конфиденциальную информацию. Это очередное проявление проблем с изоляцией в современных CPU, оптимизированных для производительности.
Xen оказался неуязвим благодаря своей микроядерной архитектуре, где гипервизор минимален, а все дополнительные сервисы, включая эмуляцию устройств, вынесены в отдельную виртуальную машину Dom0. Это решение, принятое два десятилетия назад, сократило поверхность атаки и предотвратило воздействие VMScape на критически важные компоненты. Таким образом, архитектурный выбор Xen обеспечил встроенную защиту без необходимости экстренных исправлений, в отличие от KVM и VMware.
Комментарии (22)
- Архитектура Xen на микроядре с изолированным Dom0 ограничивает утечку данных при атаке vmscape только процессами внутри самого Dom0, что снижает риски.
- В отличие от KVM, где эмуляция оборудования происходит в пользовательском пространстве хоста, в Xen управление и эмуляция выделены в отдельный Dom0, что обеспечивает дополнительный уровень изоляции.
- Атака vmscape позволяет утечку данных между виртуальными машинами, но не затрагивает напрямую гипервизор Xen, так как он работает на более привилегированном уровне.
- Обсуждаются потенциальные преимущества микроядерных архитектур (например, seL4) для дальнейшего ограничения последствий побега из VM.
- Отмечается, что сама уязвимость остается на аппаратном уровне, и контейнеризация (LXC, SmartOS zones) не обязательно защищает от подобных атак.
Writing an operating system kernel from scratch 🔥 Горячее
- Ядро ОС написано на Zig для RISC-V, одноядерное, с вытесняющей многозадачностью и системными вызовами.
- Unikernel: приложения линкуются с ядром в один бинарник.
- OpenSBI обслуживает M-режим; ядро работает в S-режиме, потоки — в U.
- Потоки статические, бесконечные функции; переключение по таймеру каждые 2 мс.
- Контекст сохраняется на стеке прерываний; ядро и пользователь разделены.
- GitHub: popovicu/zig-time-sharing-kernel
Комментарии (64)
- Участники делятся опытом создания минимальных ОС на RISC-V и Zig: кто-то перевёл «ОС в 1000 строк» на Zig, кто-то пишет с нуля.
- Все сходятся: RISC-V проще x86, нет легаси-багажа, документация и эмуляторы доступны.
- Железо не обязательно: достаточно QEMU; если нужна «реалка» — Milk-V Duo S за $10 или Pico 2.
- Миникernel — хороший способ выучить архитектуру и Forth; «не изобретай крипту для продакшена» не отменяет экспериментов.
- В споре о «кто важнее» вспомнили: Линус начинал как хобби, а Столлман уже с 1984 года готовил инфраструктуру GNU.
Tips for installing Windows 98 in QEMU/UTM
Советы по установке Windows 98 в QEMU/UTM
-
ACPI вместо PnP BIOS
SeaBIOS ломает PnP-перечисление. Запускай установку с флагомsetup /p j– Windows 98 SE сам перейдёт на ACPI и все устройства определятся корректно. -
Система
Выбирай машинуpc-i440fx, Q35 не нужен. CPU «pentium2» – оптимально для 9x/NT4. -
Ввод
Отключи USB-контроллер, иначе зависает. Мышь/клавиатура только PS/2; курсор захватывается, но на iPad с внешней клавой не критично. -
Видео
-vga cirrus– единственный ускоренный вариант с родными драйверами. Есть баги 16/8-бит, но терпимо. Rage 128 пока сыра. -
Сеть и файлы
SLiRP-NAT + PCI-NE2000/PCNet/DC2114x = доступ в интернет и SMB-шары без танцев. ISA-NE2000 (300h, IRQ9) – только если очень надо. -
Звук
- SB16: PCM работает, MIDI нет.
SET BLASTER=A220 I5 D1 H5 P330 T5 - AdLib (OPL2) можно добавить отдельно.
- SB16: PCM работает, MIDI нет.
Комментарии (25)
- Пользователи делятся опытом запуска Windows 95/98 в эмуляторах: QEMU, VirtualBox, DOSBox, PCem, x86box, UTM.
- Проблемы: нет sb16 в virt-manager, AC97 работает нестабильно, Win9x в DOSBox «часто ломается», требуются драйверы для тач-ввода.
- Для MIDI достаточно встроенного Microsoft GS Wavetable Synth, но DOS-игры, требующие SB16-MIDI, всё равно могут не заработать.
- PCem/x86box дают высокую точность эмуляции старого «железа», но медленнее; QEMU ориентирован на современные ОС.
- Win98 не умеет останавливать CPU (нет HLT), поэтому в эмуляторе грузит хост на 100 %.
Hypervisor in 1k Lines
Гипервизор за 1000 строк
Практическое руководство по созданию минимального RISC-V гипервизора, способного загружать Linux. Продолжение книги «ОС за 1000 строк», но теперь на Rust и с нуля (type-1, bare-metal). Используем только важное: сторонние крейты экономят код.
Репозиторий: github.com/nuta/hypervisor-in-1000-lines
Лицензии: текст — CC BY 4.0, код — MIT.
Содержание:
0. Введение
- Старт
- Загрузка
- Hello World
- Менеджер памяти
- Режим гостя
- Страницы гостя
- Привет из гостя
- Сборка ядра Linux
- Запуск Linux
- SBI
- MMIO
- Прерывания
- Заключение
Комментарии (12)
- Демо-гипервизор на 1000 строк — интересная техническая игрушка, но без паравиртуальных драйверов и прочей инфраструктуры непригоден для реального использования.
- Чтобы запустить RISC-V гипервизор на x86, нужен QEMU, потому что это эмуляция другой архитектуры.
- Желающим увидеть «тот же объём, но на C» скидывают 500-строчный SimpleVisor и репозиторий kvmsample.
- В дискуссию вмешалась философия: «OS» можно уложить и в 5 строк EFI-кода, если не требовать от неё ничего, кроме «Hello, world».
Using Claude Code to modernize a 25-year-old kernel driver 🔥 Горячее 💬 Длинная дискуссия
- Увлечение — восстановление данных с кассет QIC-80 90-х гг.
- Драйвер
ftape(Linux 2.4) последний раз собирался ~2000 г.; с тех пор приходится держать CentOS 3.5. - Привод подключается к контроллеру гибкого диска: дёшево, но 500 Кбит/с и куча «магии» портов/IRQ.
- Под DOS/Windows есть проприетарные утилиты, но только
ftapeдаёт «сырой» дамп, независимо от формата ПО, которое писало кассету.
Цель: переписать драйвер под современное ядро без боли.
Инструмент — Claude Code (Claude 3.5 Sonnet) в режиме «актов» (акт = автоматический цикл «предложи-отладь-протестируй»).
Ход работы
- Запустил
claudeв каталоге исходниковftape-4.04(1999 г.). - Первый акт: «сделай модуль для ядра 6.10». Claude выдал:
- заменил
cli/stiнаspinlock_t; sleep_on→wait_event;register_blkdev→blk_mq;kmalloc→kmalloc_array;- добавил
MODULE_LICENSE/AUTHOR/DESCRIPTION.
Собралось с десятком предупреждений.
- заменил
- Акт 2: «убери варнинги». Убрал устаревшие
ioctl, обернулprintkвpr_*, добавилfallthrough;. - Акт 3: «проверь на x86_64». Исправил
long↔intв структурах, выровнялu8/u16через__packed. - Акт 4: «протестируй на железе». Создал QEMU-образ с контроллером FDC, подключил образ кассеты.
- первый
insmod— kernel oops; Claude добавилBUG_ON(!request_region)и проверку IRQ. - второй —
ftapeвидит привод, но «unknown format»; Claude вставил распознаваниеQIC-80поID_CRC. - третий — успешный дамп 120 Мб за 40 мин.
- первый
- Акт 5: «очисти и оформи». Удалил весь
#ifdef LINUX_2_0, добавилREADME.md,Kconfig,Makefileдляin-treeсборки.
Результат
- 2 500 строк C → 1 100; 45 файлов → 12; минус 4 архаичных под-драйвера.
- Собирается как
out-of-tree(6.6–6.12) и какin-tree(патч 30 Кб). - Скорость 470 Кбит/с — предел FDC, но стабильно.
- Поддержаны только QIC-80; QIC-40/3010/3020 выкинуты (никто не просил).
Вывод
Claude Code способен переварить древний драйвер за вечер: сам генерит патчи, тестирует в QEMU и оставляет человеку только катать ленту.
Комментарии (275)
- Claude Code и другие LLM-инструменты превращаются в «силовой множитель» для разработчиков: ускоряют работу в знакомых фреймворках и позволяют быстро осваивать новые.
- Главное — самому понимать, что делаешь: чёткие промты, ключевые слова предметной области и умение сверять результат критически снижают количество багов.
- Примеры успеха: порт драйвера ftape с Linux 2.4 на 6.8, апгрейд Pydantic V1→V2, inline-ASM под Apple, модернизация 15-летнего PHP-кода — всё за часы вместо недель.
- Самые ценные фичи: долгие процессы в терминале, автоматическая проверка своего кода, быстрое написание тестов и бенчмарков «на заказ».
- Безопасность: при работе с sudo-операциями или ядром итерации лучше вести вручную, чтобы LLM не сломала систему.
Writing a Hypervisor in 1k Lines
Я написал учебник по созданию гипервизора с нуля за 1 000 строк кода: 1000hv.seiya.me. Это тип-1 гипервизор для 64-битного RISC-V с расширением H в QEMU. Подойдёт тем, кто уже прошёл OS in 1 000 Lines.
Код на стабильном Rust — без nightly. Сообщество Rust наконец-то добавило всё необходимое, включая inline-assembly.
Идея книги: гипервизор — это «обработчик событий»:
const vcpu = new VirtualCPU(memory);
while (true) {
try { vcpu.resume(); }
catch (e) { handle(e); } // MMIO, прерывания…
}
Он запускает гостевую ОС, перехватывает выходы из VM и возвращается. Это позволяет строить не только классические ОС, но и безопасные среды вроде gVisor или Hyperlight.
Книга уже доступна онлайн. Приятного кодинга!
Комментарии (9)
- RISC-V можно полностью виртуализировать методом «ловушка-и-эмуляция» без аппаратного расширения, но обход таблиц страниц будет медленным.
- @drob518 уточнил: обход таблиц страниц выполняется программно, а не аппаратно.
- @nerpderp82 спросил, можно ли использовать RVV для обхода таблиц страниц.
- @anchovy_ попросил литературу по гипервизорам; @dmitrygr дал ссылки на академическую теорию и практику VMware.
- @TZubiri посоветовал учиться по документации производителей и исходному коду, а не по университетским книгам.
QEMU 10.1.0
- Удалено: устаревшие устройства
sgaиxenfv; опция-no-user-config. - Новые пометки:
-machine dump-guest-core=on,query-cpus-fast,query-cpu-definitions– deprecated.
Архитектуры
- 68k: поддержка
q800иmacos9. - ARM: новые SoC
imx8mn,stm32h735,xlnx-zynqmp-ep108; машиныmps3-an547,raspi5; эмуляция FEAT_SVE2, FEAT_MTE2, FEAT_LSE2. - RISC-V: добавлены
zacas,sstc,svadu,smstateen; машиныspike-1.11,microchip-polarfire. - x86: AMD SEV-SNP, Intel AMX, AVX-VNNI; KVM-TCG совместимость.
Устройства
- ACPI: поддержка SRAT для NVDIMM.
- Audio: Intel HDA теперь 24-бит.
- Block: virtio-blk/SCSI –
discard=unmap,write-zeroes=unmap. - Graphics: virtio-gpu – 3D, virglrenderer 1.0.
- NVMe: CMB, PMR, ZNS.
- PCIe: SR-IOV, ARI, ATS, PASID.
- USB: xHCI – USB 3.2 SuperSpeed+.
Прочее
- Multi-process:
x-vhost-user-fsиvhost-user-vsockтеперь в отдельном процессе. - Сеть:
vhost-vdpa– offloading checksum/TCP.
Комментарии (38)
- QEMU восхищает пользователей: «просто работает», хорошо интегрируется и кажется «магией».
- Его применяют для dev-окружений, запуска ПО на других ОС, разработки новых ОС, а также в облаках.
- KVM ускоряет QEMU, предоставляя аппаратную виртуализацию через page-tables и trap-механизмы.
- Появилась экспериментальная сборка в WASM, что открывает онлайн-песочницы для разных архитектур.
- Поддерживается запуск Android-VM (Cuttlefish, официальный Android-emulator на базе QEMU).
- Утилиты вроде QuickEMU и UTM упрощают запуск ВМ, а пожертвования идут через Software Freedom Conservancy.
Show HN: I integrated my from-scratch TCP/IP stack into the xv6-riscv OS
xv6-riscv-net
Форк MIT xv6 для RISC-V с добавлением стека TCP/IP.
Поддерживаются драйвер RTL8139, DHCP, DNS, ping, telnet-сервер, HTTP-клиент.
Сборка и запуск
make qemu
Внутри QEMU:
$ dhcp
$ ping 8.8.8.8
$ telnetd &
$ http google.com
Сетевые утилиты
dhcp– получить адресping– проверка связиtelnetd– сервер на порту 23http– простой HTTP-клиент
Код
kernel/net*– стек TCP/IPkernel/rtl8139.c– драйвер сетевой картыuser/{dhcp.c,ping.c,telnetd.c,http.c}– сетевые утилиты
Комментарии (5)
- @Tony_Delco и @dancek восхищаются сложностью и качеством реализации TCP/IP-стека для xv6 с virtio-net и сокетами, подчеркивая, что это «золото» для любителей low-level.
- @AbbeFaria сообщает, что проходит лабораторные xv6 и сейчас занят mmap и fork.
- @lesser-shadow интересуется, используются ли RISC-V-расширения и возможностью запуска на bare metal.
- Все участники благодарят автора за открытость и делятся вдохновением.
Booting 5000 Erlangs on Ampere One 192-core
Ampere One 192-ядерный сервер, 1 ТБ ОЗУ, цель — запустить максимум виртуальных IoT-устройств на Nerves.
Прошлый раз добрались до 500 экземпляров; теперь с KVM и новым загрузчиком little_loader от Frank Hunleth удалось 5000 одновременных виртуальных ARM64-машин.
little_loader — минимальный ARM64-бутлоадер, читающий переменные u-boot, загружающий ядро Linux и сохраняющий механизмы A/B-обновлений Nerves.
Что изменилось
- KVM/HVF ускоряет старт до 1-2 с и экономит ≈ 500 МБ ОЗУ на гость.
- EL1 вместо EL2: EL2 нужен для вложенной виртуализации, нам не требуется.
- Баг компиляции: release-сборка зависает, debug-версия работает (GCC 15, вероятно, чинит).
Команда запуска (упрощённый пример):
qemu-system-aarch64 \
-machine virt,accel=kvm \
-cpu host -smp 1 -m 150M \
-kernel little_loader.elf \
-netdev user,id=eth0 \
-device virtio-net-device,netdev=eth0 \
-drive if=none,file=disk.img,format=raw,id=vdisk \
-device virtio-blk-device,drive=vdisk \
-nographic
Итог: 5000 «эрлангов» на 192 ядрах, 1 ТБ ОЗУ, стартуют за секунды, потребляют по 150 МБ RAM.
Комментарии (38)
- Речь идёт о запуске 5000 узлов BEAM (Erlang-машин), а не процессов — каждая BEAM может держать миллионы лёгких процессов.
- Сервер с 192 Ampere-ядрами позиционируется как «облачный» или «edge» для телекомов; Hetzner предлагает 80-ядерный Ampere за ~200 $/мес.
- Пользователи сомневаются в полезности без тестов под нагрузкой и обсуждают, как масштабировать память и шину при таком числе ядер.
- Всплыли исторические примеры (Azul для Java) и шутки про «ручное ткачество» Erlang-потоков и «фермерский» байт-код.