← На главную

Филиппо Вальсорда собрал NAS frood на Alpine Linux как единый initramfs

16.06.2026 20:17 · hackernews

У Филиппо Вальсорды NAS по имени frood работает не как обычная система — это один большой initramfs, в котором целиком живёт Alpine Linux. Никакого корневого раздела. Загружается сразу из оперативной памяти. Деплой новой версии — скопировать один файл. Вся конфигурация лежит в git репозитории, который собирает initramfs. Никаких сложных DSL: хочешь файл в /etc/example.conf — кладёшь его в root/etc/example.conf, остальное делают пара сотен строк скриптов. Тестировать следующий деплой можно одной командой qemu.

Филиппо перешёл на эту схему, потому что устал от штатного diskless mode в Alpine. Там система ищет *.apkovl файл с настройками, применяет его, доустанавливает пакеты. Процесс сломался несколько раз: то файловую систему не находил, то пакеты не ставились. Загрузка зависела от пакетного менеджера. К тому же хотелось, чтобы состояние системы отслеживалось в git — Грэм Кристенсен убедительно объяснил это в статье «Erase your darlings». Раньше Филиппо правил всё через Ansible, но получался многослойный ад.

Готовые альтернативы вроде NixOS, gokrazy или buildroot не подошли. Alpine нравится — лёгкая, простая, без GNU. Не нравятся только init и механизм сохранения состояния.

Сборка initramfs строится вокруг скрипта alpine-make-rootfs. Ставится пакет alpine-base (apk, busybox, OpenRC), ядро linux-lts со всеми модулями, а вместо linux-firmware — заглушка linux-firmware-none. Потом всё, кроме boot/, упаковывается в cpio-архив и кладётся рядом с ядром.

Скрипт setup.sh настраивает run-levels OpenRC: devfs, dmesg, hwclock, networking, sshd, tailscale и так далее. Там же задаётся пароль root. В корневом скелете (папка root/) лежат inittab, сетевые конфиги, SSH-ключи и authorized_keys. Чтобы не генерировались лишние host-ключи, в sshd_disable_keygen стоит yes.

Для двух вещей, которым нужна постоянная память — seedrng (начальное зерно ГПСЧ) и Tailscale (состояние) — используется USB-флешка с UUID. Она монтируется по UUID через fstab.

Загрузчик — UEFI с Unified Kernel Image, собранным через ukify. Никакого GRUB или syslinux. Деплой — просто rsync нового UKI в EFI/BOOT/BOOTAA64.EFI. Тестирование — qemu с тем же образом, который получает свой отдельный Tailscale-адрес, так что можно зайти по SSH.

К системе добавлен простой статусный сервис на Go — srvmonitor, слушает порт 80 на Tailscale-IP и отдаёт вывод скриптов из /etc/monitor.d/. Добавляется парой строк в setup.sh и init-скриптом.

Весь проект открыт в репозитории frood. Филиппо не стал превращать его в готовое решение — в нём и так почти ничего нет, а добавление хуков всё усложнит. Проблема с секретами пока не решена: ZFS разблокируется passkey, остальное в .gitignore. В планах — YubiKey с age-plugin-yubikey или TPM для Secure Boot.

Работа поддерживается клиентами Geomys: Interchain, Smallstep, Ava Labs, Teleport, SandboxAQ, Charm, Tailscale и Sentry.

Читать оригинал →