惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42
美团技术团队
NISL@THU
NISL@THU
C
Cisco Blogs
SecWiki News
SecWiki News
N
Netflix TechBlog - Medium
Forbes - Security
Forbes - Security
Cloudbric
Cloudbric
雷峰网
雷峰网
T
Tailwind CSS Blog
博客园 - 司徒正美
The Register - Security
The Register - Security
L
LangChain Blog
S
Security Affairs
Hacker News - Newest:
Hacker News - Newest: "LLM"
B
Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Threat Research - Cisco Blogs
I
InfoQ
S
Schneier on Security
L
Lohrmann on Cybersecurity
量子位
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Martin Fowler
Martin Fowler
Schneier on Security
Schneier on Security
F
Fortinet All Blogs
TaoSecurity Blog
TaoSecurity Blog
K
Kaspersky official blog
Google DeepMind News
Google DeepMind News
Cisco Talos Blog
Cisco Talos Blog
PCI Perspectives
PCI Perspectives
Attack and Defense Labs
Attack and Defense Labs
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
D
Docker
N
News | PayPal Newsroom
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
H
Hacker News: Front Page
云风的 BLOG
云风的 BLOG
Microsoft Security Blog
Microsoft Security Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
Webroot Blog
Webroot Blog
MongoDB | Blog
MongoDB | Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Installer на стероидах. Модификация установочных образов Astra linux
medved0001 · 2026-05-18 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение16 мин

Охват и читатели10K

FAQ

Модификация установочных образов Astra linux

Модификация установочных образов Astra linux

У каждого своё чувство перфекционизма. В этой статье я покажу примеры модификации live installer Astra linux, чтобы вы могли создать автономный дистрибутив своей мечты.

В репозитории также есть инструкция для Debian installer.

Также в репозитории есть видеофайлы к некоторым частям инструкции.

ВАЖНО!!! Раздел 1 и 2 не зависят от версии Astra linux. Раздел 3 может быть частично неприменим к версиям инсталлятора ниже/выше (следите за обновлениями в репозитории). Текущая инструкция писалась на live installer 1.8.5.46.


1. Описание файлов скриптов

1.1. copy-source-installer.sh

Скрипт для копирования содержимого установочного диска в каталог сборки.

При запуске рядом с файлом скрипта создаются следующие новые каталоги:

  • iso-in – Содержит iso файлы;

  • iso-temp – Содержит каталоги сборки со скопированным содержимым iso файла;

  • iso-mount – Каталог для монтирования iso файлов;

  • repo – Каталог для создания в нём репозиториев.

Источник копирования определяется в следующем порядке:

  1. Если файлу скрипта передан путь к iso при запуске, то монтирование его в '$isomountpath' и использование в качестве источника копирования, если в нем есть каталоги EFI,dists,pool. Например,

    ./copy-source-installer.sh "/opt/install.iso"
  2. Если путь к источнику копирования пуст, то проверка /media/cdrom на наличие каталогов EFI,dists,pool. Если они существуют, т.е подключен диск инсталлятора, то задается вопрос использовать ли /media/cdrom в качестве источника копирования.

  3. Если путь к источнику копирования пуст, то создание списка iso файлов из каталога '$isoinpath' и предложение выбрать файл для монтирования. Если в смонтированном iso есть каталоги EFI,dists,pool, то использовать его в качестве источника копирования.

  4. Если путь к источнику копирования пуст и установлен zenity, то предлагается выбрать iso файл для монтирования через диалоговое окно. Если в смонтированном iso есть каталоги EFI,dists,pool, то использовать его в качестве источника копирования.

После определения источника копирования будет задан вопрос "Хотите ввести имя каталога назначения сами?". В случае отказа, имя каталога, куда будет скопировано содержимое iso, будет сформировано по условию команды скрипта.

Для live инсталлятора "live-installer_$(date +"%Y%m%d-%H%M%S.%3N")".

Для debian инсталлятора "debian-installer_$(date +"%Y%m%d-%H%M%S.%3N")".

Изображения

1.2. create-deb.sh

Скрипт для перепаковки deb пакетов.

При запуске рядом с файлом скрипта создаются следующие новые каталоги:

  • Deb-in - Каталог с deb пакетами для распаковки;

  • Deb-out - Каталог с собранными deb пакетами;

  • Deb-temp - Каталог с распакованными deb пакетами.

Доступны следующие действия:

  1. Распаковать Deb пакет;

  2. Запаковать Deb пакет;

  3. Распаковать все Deb пакеты;

  4. Запаковать все Deb пакеты.

При запаковке всех DEB пакетов имена файлов формируются на основе информации из файла control в следующем формате: имя-пакета_версия_архитектура.deb

1.3. create-iso-live-installer.sh

Скрипт для перепаковки live installer Astra linux.

При запуске рядом с файлом скрипта создаются следующие новые каталоги:

  • iso-temp - Содержит каталоги сборки со скопированным содержимым iso файла;

  • iso-out - Каталог с собранными iso файлами;

  • repo - Содержит каталоги репозиториев (может содержать символьные ссылки);

  • live-squashfs - Содержит каталоги с распакованным squashfs образами.

Доступны следующие действия:

  1. Скопировать репозиторий в каталог сборки;

  2. Распаковать filesystem.squashfs;

  3. Запаковать filesystem.squashfs;

  4. Собрать iso;

  5. Установить xorriso, squashfs-tools и grub-pc-bin.

Изображение

2. Модификация репозитория

Информация в данном разделе нужна вам, только если вы хотите изменить содержимое репозитория установочного диска, например, для удаления лишних пакетов, чтобы уменьшить размер образа, или изменения списка категорий ПО и их содержимого для выбора при установке.

2.1. Создание и экспорт ключа подписи

Создайте или импортируйте ключ для подписи репозитория через KGpg или терминал (выставьте абсолютное доверие к ключу и назначьте его используемым по умолчанию). Экспортируйте открытый ключ, который будет использоваться для доступа к репозиторию, в файл.

Создание ключа

gpg --full-generate-key

Экспорт публичного ключа

gpg --armor --export "имя-ключа" > public-key.asc

Экспорт приватного ключа

gpg --armor --export-secret-keys "имя-ключа" > private-key.asc

Импорт ключа

gpg --import key.asc

Назначить абсолютное доверие указанному ключу

echo -e "5\ny\n" | gpg --command-fd 0 --edit-key "ИД-ключа" trust

Информация об открытых ключах

gpg --list-keys

Информация о закрытых ключах

gpg --list-secret-keys

Если вам нужен бинарный формат ключа при экспорте, то уберите опцию --armor.

Если нужно изменить ключ по умолчанию в неинтерактивном режиме, то замените/добавьте значение ИД-ключа в строке default-key в файле .gnupg/gpg.conf в домашнем каталоге пользователя.

Если вы запускаете KGpg или fly-admin-repo из терминала и у вас возникает ошибка при запросе пароля к ключу, то введите в терминале export GPG_TTY=$(tty). Это должно перенаправить запрос пароля ключа в терминал.

Изображения
Готовый ключ

Готовый ключ

2.2. Создание репозитория и импорт пакетов

2.2.1. fly-admin-repo

Описанный способ изменения репозитория через fly-admin-repo удобен тем, что визуально видно все пакеты с неудовлетворенными зависимостями.

  1. Запустите fly-admin-repo и создайте репозиторий.

    • Укажите путь до каталога, где будет находится репозиторий (путь к созданному скриптом (copy-source-installer.sh / create-iso-debian-installer.sh / create-iso-live-installer.sh ) каталогу repo);

    Вы можете создать каталог в любом удобном для вас месте, а потом сделать символьную ссылку на данный каталог в каталоге repo.

    • Заполните поля с информацией о репозитории в соответствии с исходным репозиторием;

    • Поставьте галочки на «Создать Contents-*.gz file» и «Подписать репозиторий».

    Изображения
  2. Выполните импорт репозитория: Файл -→Импорт-→Импорт репозитория

    Выберите для импорта каталог pool c установочного диска или каталога сборки.

    Ожидайте, пока репозиторий импортируется

    Изображения

2.2.2. Терминальные команды

  1. Установите пакет reprepro: sudo apt install reprepro

  2. Создайте каталог репозитория: mkdir -p /путь-к-репозиторию/conf

  3. Создайте distributions (конфигурационный файл репозитория).

    Пример команды (ваш конфигурационный файл может отличаться от приведенной мной команды):

    echo -e 'Origin: Debian\nCodename: 1.8_x86-64\nSuite: stable\nVersion: 1.8.5\nArchitectures: amd64\nComponents: main contrib non-free non-free-firmware\nUDebComponents: main contrib non-free non-free-firmware\nSignWith: yes\nContents: . .gz' > /путь-к-репозиторию/conf/distributions

    Подробное описание всех опций конфигурационного файла, параметров вызова команды и переменных окружения см. в справочной системе man: man reprepro.

  4. Для инициализации нового репозитория выполните команду (будут созданы необходимые базы данных и каталоги):

    reprepro --ask-passphrase -b <путь_к_репозиторию> export
  5. Наполнить репозиторий пакетами из каталога pool:

    find "путь-к-каталогу-pool" -name "*.deb" -exec reprepro --ask-passphrase -b "путь-к-репозиторию" includedeb "Codename-репозитория" {} \;
    find "путь-к-каталогу-pool" -name "*.udeb" -exec reprepro --ask-passphrase -b "путь-к-репозиторию" includeudeb "Codename-репозитория" {} \;

    Импорт репозитория довольно длительный процесс (рекомендуется сохранить пароль от ключа подписи в связке ключей).

    После импорта репозитория вы можете вносить в него любые необходимые вам изменения. При добавлении/удалении пакетов помните о зависимостях.

2.3. Пересборка tasksel-data и других deb пакетов

Если вы делали изменения в репозитории, то необходимо пересобрать deb пакет tasksel-data, как минимум для того, чтобы добавить в него открытый ключ вашего репозитория.

  1. Запустите скрипт create-deb.sh. Рядом с файлом скрипта будут созданы необходимые каталоги (подробнее в разделе описания скриптов).

  2. Скопируйте deb пакет tasksel-data из репозитория в каталог Deb-in (пример пути к файлу в репозитории .../pool/main/t/tasksel/tasksel-data_2.78+astra254_all.deb).

  3. Распакуйте пакет. Содержимое распакуется в каталог Deb-temp.

  4. Выполните необходимые вам изменения и соберите пакет. Собранный пакет будет в каталоге Deb-out.

    В каталоге распакованного пакета создайте каталог «/etc/apt/trusted.gpg.d» и поместите в него файл открытого ключа, которым вы подписали репозиторий (т.е. у вас будет путь «каталог-распакованного-пакета/etc/apt/trusted.gpg.d»).

2.3.1. Изменение списка категорий и ПО для установки

В этом же пакете tasksel-data в файле debian-tasks.desk при необходимости редактируется список категорий и их содержимого для выбора при установке.

Файл находится по следующему пути: «/usr/share/tasksel/debian-tasks.desk» в каталоге распакованного пакета tasksel-data. Вы можете отредактировать состав пакетов в существующих категориях этого файла, удалить ненужные категории, добавить свои.

Изображения
Пример

Пример

Пункт Relevance действует для дистрибутива с установщиком Debian. В live он тоже обязателен для корректности файла, но не используется установщиком (Для live installer позиция пункта в меню выбора соответствует расположению категории в файле debian-tasks.desk).

Relevance – это сортировка пунктов при выводе в инсталляторе. Чем значение выше, тем выше будет этот пункт. Разные категории могут иметь один и тот же номер, тогда порядок этих категорий будет выставлен автоматически между всеми категориями с этим номером.

Test-new-install задает состояние категории по умолчанию.

  • mark mark — категория выбрана;

  • show show — категория не выбрана;

  • install install — категория устанавливается автоматически.

Description — отображаемое имя категории. Допустимо использовать дефис для связки слов, например: «WEB-сервер», «Chromium-gost». Если предполагается до/после дефиса ставить пробел, то используйте тире для корректного отображения.

«Draw.io — программа для создания диаграмм и схем»

вместо

«Draw.io - программа для создания диаграмм и схем»

При изменении debian-tasks.desk не забудьте загрузить в репозиторий все указанные вами новые пакеты и зависимости к ним.

Скачать указанные пакеты и все зависимости к ним:

sudo apt -d install имена-пакетов

Скачать зависимости к пакетам расположенным в файловой системе (откройте терминал, где расположены deb пакеты и выполните команду):

sudo apt -d install ./*deb

Скачанные пакеты будут расположены в каталоге: /var/cache/apt/archives

Рекомендуется выкачивать пакеты на чистой системе, чтобы автоматически скачались все зависимости к ним.

2.3.2. Локализация списка категорий

Если в debian-tasks.desc вы используете английские названия категорий, то для локализации на русский, если это необходимо, внесите изменения в файл локализации debian-tasks.mo. Вы можете использовать нужный язык в названии категорий прямо в debian-tasks.desc, если нет необходимости в многоязычности.

Файлы с расширением .mo являются скомпилированными бинарными файлами локализации, которые используются программами для отображения интерфейса на разных языках. Напрямую редактировать их текстовым редактором нельзя.

  1. Перейдите в каталог с нужным файлом локализации в распакованном tasksel-data, например, .../usr/share/locale/ru/LC_MESSAGES/

    Изображения
    1. Декомпиляция в формат .po

      msgunfmt debian-tasks.mo -o debian-tasks.po
      Изображения
  2. Редактирование текста.

    В файле найдите нужную строку msgid (оригинал) и измените соответствующее ей значение msgstr (перевод).

    Если в debian-tasks.desc были добавлены новые категории, то добавьте для них перевод по аналогии с имеющимися записями.

    Изображения
    1. Обратная компиляция в .mo

      msgfmt debian-tasks.po -o debian-tasks.mo
Изображения

3. Пересборка/модификация live инсталлятора

  1. Скопируйте содержимое инсталлятора в каталог сборки. Доступен удобный скрипт copy-source-installer.sh (подробнее в разделе описания скриптов).

  2. Запустите скрипт create-iso-live-installer.sh. Рядом с файлом скрипта будут созданы необходимые каталоги (подробнее в разделе описания скриптов).

  3. Если необходимо изменить состав пакетов репозитория или отредактировать списки категорий ПО в файле debian-tasks.desk, то выполните инструкции из раздела «2. Модификация репозитория» и «3.1.1. Доп. Действия для live installer при модификации репозитория».

  4. Если необходимо выполнить команды в финале установки, выполните инструкции из раздела «3.1.2. Выполнение команд в финале установки».

  5. Если необходимо установить/удалить ПО в live систему, то читайте раздел «3.1.3. Установка/Удаление ПО в live системе».

  6. Если необходимо скопировать файлы в устанавливаемую систему, то читайте раздел «3.1.4. Механизм копирования файлов в устанавливаемую систему».

  7. Перед сборкой iso выполните пункт «Установить xorriso, squashfs-tools и grub-pc-bin», если данные пакеты еще не установлены.

  8. Если вы изменили репозиторий, то выполните пункт «Скопировать репозиторий в каталог сборки».

  9. Соберите iso.

    ПРИМЕЧАНИЕ! В каталоге репозитория installer-live есть примеры изменений.

    Изображения (сборка iso)

3.1. Внесение изменений в squashfs

  1. Для перепаковки squashfs установите пакет squashfs-tools.

  2. Выполните действие «Распаковать filesystem.squashfs».

    Изображения
    1. Внесите необходимые вам изменения в распакованное содержимое.

    Важно!!! При изменении python и yaml файлов соблюдайте форматирование в файле.

    В Python отступы критически важны. После двоеточия (например, if условие:) следует блок кода, который должен быть сдвинут вправо относительно строки с if на четыре пробела (или один табулятор). Эти отступы определяют тело блока, и все строки внутри блока должны иметь одинаковый отступ. Например:

    def условие:
        строка 1
        строка 2
        if условие:
            строка 1
            строка 2
            if условие:
                строка 1
                строка 2
    

    В каталоге installer-live/filesystem.squashfs репозитория есть полные файлы для примера изменений.

  3. Когда все необходимые вам изменения будут сделаны, выполните действие «Запаковать filesystem.squashfs»

    Изображения

3.1.1. Доп. Действия для live installer при модификации репозитория

Распакуйте filesystem.squashfs, если вы этого еще не сделали.

Необходимо добавить в каталог (.../squashfs-root/etc/apt/trusted.gpg.d) файл открытого ключа, которым подписан репозиторий (его же вы добавляли в пакет tasksel-data).

Изображения

Дальнейшие действия в этом разделе нужны вам, только если вы изменяли список категорий ПО в файле debian-tasks.desk пакета tasksel-data.

В каталоге installer-live/filesystem.squashfs репозитория есть полные файлы для примера изменений.

Актуализируйте (добавьте/удалите) категории ПО в файлах:

  • «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer/settings/task.py». Добавить нужные вам строки в массив name_by_id в class Task(Component) по аналогии с имеющимися:

    'Имя-категории': 'Наименование категории на английском',

    Имя категории соответствует имени в debian-tasks.desk.

    Например:

    'ya-browser': 'Yandex browser',
    Изображения
  • «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer_converter/tasksel.py».

    Добавить нужные вам строки в массив vocabulary по аналогии с имеющимися:

    'Имя-категории': ['Наименование на английском', 'Имя-категории', 'Наименование на русском'],

    Пример строки:

    'Fly': ['Fly desktop', 'Fly', 'Графический интерфейс Fly'],
    Изображения
    Изображения (пример списка в инсталляторе)

3.1.2. Выполнение команд в финале установки

В этом разделе я покажу, как добавить выполнение своих скриптов на финальном этапе установки используя механизм настройки параметров безопасности, доступный в инсталляторе.

Инсталлятор запускает скрипты параметров безопасности напрямую из /usr/sbin устанавливаемой системы, т. е. нужно, чтобы необходимые вам скрипты существовали в устанавливаемой системе в момент вызова. Смотрите раздел «3.1.4. Механизм копирования файлов в устанавливаемую систему» с описанием возможных вариантов.

ВАЖНО! Имя файла скрипта должно соответствовать имени задачи, которая будет добавлена в необходимые файлы далее. Инсталлятор вызывает скрипт из /usr/sbin по имени задачи с передаваемым параметром enable/disable в зависимости от того выбрана задача или нет. Например:

chroot /target/bin/bash -c '/usr/sbin/custom-change-remote-con-settings enable'

Базовый шаблон скрипта следующий:

#!/bin/bash

if [[ "$1" = "enable" ]]; then

  ваш код

else

  ваш код

fi
Изображения
В инсталляторе вызов выглядит так

В инсталляторе вызов выглядит так

Отредактируйте следующие файлы (соблюдайте синтаксис и форматирование):

  • «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer_converter/convert.py».

    Добавьте необходимые вам строки в массив vocabulary в def additional_settings:

    'имя-задачи': ['имя-задачи', 'Наименование на английском', 'Наименование на русском'],
    
    'astra-mic-control': ['astra-mic-control', 'Enable Mandatory Integrity Control', 'Мандатный контроль целостности'],
    Изображения
  • «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer/settings/security_feature.py»

    Добавьте необходимые вам строки в массив name_by_id в class SecurityFeature(Component) соблюдая форматирование:

    'имя-задачи': 'Наименование на английском',
    
    'astra-mic-control': 'Mandatory integrity control',
    Изображения
  • «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer/configs/common/common.conf.yaml»

    Добавьте необходимые вам строки в раздел security_features соблюдая форматирование (Порядок отображения и выполнения зависит от порядка расположения задач в данном файле):

    - id: имя-задачи
        name:
          ~: Наименование на английском
          ru_RU: Наименование на русском
        desc:
          ~: Описание на английском
          ru_RU: Описание на русском
    - id: astra-mic-control
        name:
          ~: Mandatory integrity control
          ru_RU: Мандатный контроль целостности
        desc:
          ~: Enables mandatory integrity control
          ru_RU: Включает механизм мандатного контроля целостности
    Изображения

    При необходимости вы можете указать включен ли пункт по умолчанию и виден ли он в списке. Это делается в разделе modes. Настройка выполняется отдельно для каждого уровня защищенности. Пример (custom-exec-latest-cmd будет принудительно выполнен. В списке его видно не будет):

    - id: custom-exec-latest-cmd
            selected: True
            enabled: True
            visible: False
    - id: custom-change-remote-con-settings
            selected: True
            enabled: True
    Изображения
    Изображения (пример списка в инсталляторе)

ВАЖНО! После установки выбранных категорий пакетов, в какой-то момент репозиторий внутри устанавливаемой системы становится недоступен. Если вам в скриптах нужен доступ к репозиторию диска, то его необходимо заново инициализировать следующим способом.

Добавьте новую функцию в конец файла соблюдая форматирование:

  • «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer/setup/common/disk.py»

    def update_cd_repo_in_target(self) -> None:
        Logger.log('Update CD repo in target system')
        self.chroot.run_command('apt-cdrom add --no-mount; apt update')
  • «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer/setup/common/setup_builder.py»

    @staticmethod
    def update_cd_repo_in_target(disk: 'DiskInstall') -> ProgressStep:
        return ProgressStep(
            name="update_cd_repo_in_target",
            description=_('Update cd repo in target system'),
            action=disk.update_cd_repo_in_target,
            weight=1.0
        )

Вставьте до .add_step(StepFactory.security_settings(self.security)):

  • «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer/setup/common/setup.py»

    .add_step(StepFactory.update_cd_repo_in_target(self.disk))
    Изображения (как инициализация репозитория выглядит в логе установки)

В архиве after-install.tar.gz доступны следующие примеры скриптов (скрипты начинающиеся с custom-in-system не могут быть установлены из инсталлятора. Не все ПО из-за особенностей их postinstall скриптов может быть установлено во время установки системы):

  • custom-change-remote-con-settings — настройка удаленных подключений;

  • custom-enable-composit — скрипт заглушка. Будет описан отдельно;

  • custom-enable-fstrim — настройка fstrim;

  • custom-exec-latest-cmd — различные настройки;

  • custom-install-ad-sssd — установка fly-admin-ad-sssd-client;

  • custom-install-assistant — установка Ассистент;

  • custom-install-bitrix — установка bitrix

  • custom-install-cryptopro — установка КриптоПро;

  • custom-install-gosplugin — установка Госплагин;

  • custom-install-grandsmeta — установка Гранд-Смета;

  • custom-install-kvm — установка KVM;

  • custom-install-kvm-guest — установка гостевых дополнений KVM;

  • custom-install-mount-autofs — установка и настройка autofs;

  • custom-install-mount-pam — установка и настройка pam-mount;

  • custom-install-mount-smb — настройка smb точек монтирования;

  • custom-install-r7office — установка R7-office

  • custom-install-spo-anketa — установка СПО Анкета;

  • custom-install-spravki-bk — установка Справки-БК

  • custom-install-virtualbox — установка virtualbox

  • custom-in-system-change-conf.sh — изменение различных настроек;

  • custom-in-system-install-carma — установка EOS Карма;

  • custom-in-system-install-kesl — установка KESL;

  • custom-in-system-install-recordsupport — установка плагина фиксации действий;

  • custom-in-system-install-sbis — установка sbis;

  • custom-repo-frozen-astra — добавление frozen репозитория astra;

  • custom-repo-local — добавление своего репозитория;

  • custom-repo-local-astra — добавления локального репозитория astra;

  • custom-transfer-system-to-btrfs-subvolume — получение нужной информации перед переносом на btrfs subvolume;

  • custom-update-chromiumgost — обновление chromium-gost из репозитория github.

custom-enable-composit является скриптом заглушкой. Для того, чтобы управлять состоянием композита добавьте следующие строки сразу после открытия функции def enable_composit_manager (отредактируйте форматирование остальных строк в функции, после добавления) в файле «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer/setup/common/disk.py»:

selected_features = {feature.ident for feature in SettingsManager.security.selected_features()}
if 'custom-enable-composit' in selected_features:
Изображения

3.1.3. Установка/Удаление ПО в live системе

Перейдите в каталог с распакованным live образом и откройте в нем терминал. Выполните команду sudo -s, чтобы переключиться на пользователя root.

Если нужно установить ПО из сетевых репозиториев, то нужно добавить их в распакованный live (пример добавления frozen репозиториев):

echo -e 'deb https://dl.astralinux.ru/astra/frozen/1.8_x86-64/1.8.5/main-repository/ 1.8_x86-64 contrib main non-free non-free-firmware\ndeb https://dl.astralinux.ru/astra/frozen/1.8_x86-64/1.8.5/extended-repository/ 1.8_x86-64 contrib main non-free non-free-firmware' > ./squashfs-root/etc/apt/sources.list.d/astra-frozen.list

Создайте файл resolv.conf для дальнейшего успешного наложения файла:

echo '' > ./squashfs-root/etc/resolv.conf

Выполняем наложение необходимых файлов/каталогов, чтобы chroot и сеть в нем работали корректно:

for i in dev dev/pts sys proc run etc/resolv.conf; do mount --bind -v /$i ./squashfs-root/$i; done
Изображения

Выполняем chroot в распакованный live образ

chroot ./squashfs-root

Далее, подключившись к live через chroot, вы можете выполнять любые нужные вам команды. Пример установки пакетов из репозитория:

apt update && apt -y install ldmtool blivet-gui binutils rsync exfatprogs gvfs gvfs-backends gvfs-fuse

Пример установки пакетов из файла (заранее скопируйте необходимые deb файлы в како-либо каталог внутри распаковонного live):

apt -y install /tmp/deb/*.deb

Удалим каталог с файлами установки пакетов (у вас может не быть его или путь будет другой):

rm -fR /tmp/deb

Для выхода из chroot выполните команду exit.

Далее необходимо отмонтировать смонтированные ранее в live файлы/каталоги:

for i in dev/pts dev sys proc run etc/resolv.conf; do umount -l -v ./squashfs-root/$i; done

3.1.4. Механизм копирования файлов в устанавливаемую систему

Есть 2 варианта копирования файлов в устанавливаемую систему.

Вариант 1:

Вы можете создать deb пакет и установить его, указав, например, в категории hidden пакета tasksel-data. Для модификации пакета читайте раздел «2. Модификация репозитория».

Вариант 2:

Вы можете использовать придуманный мной алгоритм копирования файлов в устанавливаемую систему.

  1. Создайте в корне iso каталог extra-source.

  2. В этом каталоге будут расположены:

    • Каталог dir_contents. Содержимое каталога будет скопировано в устанавливаемую систему, в тот момент, когда вы вызовете нужную функцию. Подходит для копирования файлов/каталогов в устанавливаемую систему, когда не важно сохранение исходных прав, либо нужные права будут выставлены отдельным скриптом.

    • Архив after-install.tar.gz. Содержимое архива будет распаковано в target системе через chroot (с сохранением всех исходных прав в архиве) после установки выбранных категорий пакетов. Т.е. если файл/каталог существует, то он будет заменен и права будут соответствовать правам в архиве. Учитывайте это при создании архива. Чтобы распаковать пример архива из репозитория с сохранением всех прав, запустите от имени root команду:

      mkdir -p after-install && tar xpvfz "after-install.tar.gz" -C ./after-install

      Создать архив с сохранением всех прав вы можете запустив fly-fm от root и через контекстное меню выполнить упаковку в tar.gz.

  3. Добавьте в конец файла новые функции соблюдая форматирование:

    • «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer/setup/common/disk.py»

      def copy_dir_contents_to_target_system(self) -> None:
          Logger.log('Copy extra source to target system')
          run_command(f'extra_dir="/run/live/medium/extra-source/dir_contents"; [[ -d "$extra_dir" ]] && cd "$extra_dir" || exit 0; cp -R -v -f * "/target/"')
      
      def copy_extra_source_disk_to_system_after_install(self) -> None:
          Logger.log('Copy extra source to target system')
          run_command(f'extra_file="/run/live/medium/extra-source/after-install.tar.gz"; [[ -f "$extra_file" ]] && cp -f -v "$extra_file" /target/tmp/ || exit 0')
          self.chroot.run_command('extra_file="/tmp/after-install.tar.gz"; [[ -f "$extra_file" ]] && tar xpvfz "$extra_file" -C / || exit 0')
      
    • «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer/setup/common/setup_builder.py»

      @staticmethod
      def copy_extra_source(disk: 'DiskInstall') -> ProgressStep:
          def action():
                  disk.copy_dir_contents_to_target_system()
                  disk.copy_extra_source_disk_to_system_after_install()
      
          return ProgressStep(
                  name="copy_extra_source",
                  description=_('Copy extra source to target system'),
                  action=action,
                  weight=1.0
          )
      
  4. «.../squashfs-root/usr/lib/python3/dist-packages/astra_installer/setup/common/setup.py»

    Вставьте в def createsteps(self) после .add_step(StepFactory.tasks(self.tasks)):

    .add_step(StepFactory.copy_extra_source(self.disk))
Изображения (как выглядит в логе установки)

ВАЖНО! В установщике замечено следующее поведение.

Если в /etc/skel вы создадите каталог .config/rusbitech, то установщику нужно, чтобы там существовал файл fly-xkbmap.conf, иначе при настройке пользователя будет ошибка. Потом вы можете удалить этот файл из /etc/skel/.config/rusbitech.

Изображения

Ссылка на репозиторий: Gitflic

Ссылка на Яндекс.Диск: repo-rezerv