Для кучи проектов, как для работы, так и для дома я использую Debian. Однако, когда работаешь со встраиваемыми системами (напр. ARM СнК) под рукой нет установочного диста debian… Да и вообще привода для чтения дисков. Корневая ФС формируется вручную, отдельно собирается вручную ядро. Впрочем, как обычно.
Процесс не особенно быстрый, если следовать официальной документации на debootstrap и multistrap, а новичкам просто взрывает мозг. (К сожалению, я уже тут не нуб зеленый, старею)
Самое неприятное, что мало просто сформировать корневую ФС, надо ее еще настроить более или менее вменяемым способом, напр. выставить пароль по умолчанию, сгенерировать ssh ключи, прописать fstab… В общем, обычный набор действий.
В большом Ынтерпрайзе ™ существуют такие инструменты, как vagrant который создает базовую виртуальную машину заданной конфигурации и chef или puppet, которые собственно ее настраивают. Хотя нам никто не запрещает использовать chef или chef-solo на armhf плате (а почему бы и нет?) нам все равно нужен какой-то базовый образ, который мы будем в дальнейшем настраивать, так?
С chef’ом я пока работал достаточно мало, потому про него писать пока не буду, а вот быстрый и удобный способ создания корневой ФС это то, о чем я хотел бы рассказать. Особенно после моих многочисленных экспериментов с multistrap, debootstrap и скриптами их вызывающими. После нескольких неудачных попыток я выдавил из себя обертку, которая позволяет быстро сделать и настроить корневую ФС заданной конфигурации.
Фактически, процесс выглядит так:
- Мы создаем файлик multistrap.conf, можно с наследованием, как рекомендует официальная документация
- Создаем маленький файлик под названием Skyfile
- Используем обертку skyforge которая нам, собственно сварит корневую файловую систему
Типичный Skyfile выглядит как-то так:
#The basic multistrap stuff MULTISTRAP armel debian-devel.conf RUN DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C /var/lib/dpkg/info/dash.preinst install RUN DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C dpkg --configure -a #Install a proper resolv.conf from host INSTALL /etc/resolv.conf #Install my GPG Key APT_KEY http://acme.inc/repo/repository.gpg #Basic system setup PASSWD 12345678 HOSTNAME shade LOCALE en_US.UTF8 UTF8 IFACE_STATIC eth0 192.168.20.9 255.255.255.0 192.168.20.1 8.8.8.8 #IFACE_DHCP eth0 #Enable root access over ssh RUN sed 's/PermitRootLogin without-password/PermitRootLogin yes/' -i etc/ssh/sshd_config REMOVE /etc/resolv.conf STORE rootfs.tgz |
Чтобы его собрать достаточно выполнить:
skyforge build |
И получить готовый обрат корневой файловой системы. Полный список доступных команд есть в документации к обертке.
Окей, обычный шелл скрипт, в чем «инновационность»? А удобство решения в том, что скрипт skyforge сохраняет снэпшот состояния на каждую строчку, которую выполняет. Когда мы отредактируем Skyfile будет проведен откат до нужного места и выполнены только те команды, что добавились/изменились. При этом гарантируется, что окружение в котором будет запущена каждая строчка будет идентичным, как если бы мы запускали сборку с самого начала. Практически также, как работает докер.
Это очень удобно, так как:
- Мы избегаем излишнего потребления кофе, который пьем пока multistrap выкачает пакеты через медленный рабочий прокси в сотый раз
- Не насилуем зеркала debian в тысячный раз выкачивая пакеты, проверяя то, как работает сборка
- Можем быстро набросать сложный Skyfile
Под капотом SkyForge использует OverlayFS для снепшотов. Опционально — tar архивы. (Если включить вручную, так как небыстро и требует много места). А с OverlayFS снепшоты делаются мгновенно.
Взять skyforge и попробовать можно здесь:
https://github.com/nekromant/skyforge/tree/ng