Другое

Решение проблем Simple-CDD preseed packages postinst

Полное руководство по решению проблем с Simple-CDD: настройка preseed, автоматическая установка пакетов и выполнение postinst скриптов в Debian 12.

Как решить проблемы со сборкой дистрибутива через Simple-CDD (preseed, packages, postinst)?

Подготовил донорскую систему - Debian 12 Bookworm. Использую Simple-CDD для создания сборки, подготовил соответствующую структуру файлов и каталогов:

  • profiles/custom.packages
  • profiles/custom.preseed
  • profiles/custom.postinst
  • profiles/custom.extra

Цель:

  1. Устанавливать дистрибутив с минимально необходимыми настройками: имя хоста, пользователь (вместо root), IP-адрес, разметка диска - все остальное автоматом.
  2. Оффлайн установка (с образа) минимального набора пакетов, например: iftop
  3. Конфигурация системы скриптами (postinst)

При сборке проверяю - все файлы на месте, он их добавляет в образ. Столкнулся с несколькими проблемами:

  1. Preseed - если указываю в установщике, в параметрах запуска конкретно свой .preseed - он запускается, подставляет где-то нужные параметры, но:
    1.1. Строки:

    d-i debian-installer/language string ru
    d-i debian-installer/country string RU
    d-i debian-installer/locale string ru_RU.UTF-8
    

    выбирают значение по умолчанию, но не выбирают значение автоматически. Требуется подтверждение выбора. Как от этого избавиться? Параметр d-i debconf/priority string critical не помог.

    1.2. По идее, Simple-CDD должен использовать следующую логику при сборке: взять из каталога default.preseed и дописать туда строки из custom.preseed. Даже если есть default.preseed - он ничего не дописывает, если смотреть получившийся файл в образе. Получается, что в меню выбора установки нужно явно указывать preseed файл. Можно ли от этого избавиться?

    Хотя где-то написано, что после загрузки профиля…

    profiles/default.preseed is loaded after the debian-installer CD is mounted.
    other profiles preseed files are loaded when the simple-cdd-profile .udeb is installed. some questions may have to be passed at the boot prompt(see below), as they are asked before any of the preseed files are loaded.

  2. При сборке образа выкачиваются нужные пакеты и зависимости, создается зеркало на образе (ISO:/pool/main). Вижу там нужные пакеты, но при установке дистрибутива они не устанавливаются.

  3. Скрипт из custom.postinst не выполнился. Сейчас там простая команда на создание каталога в домашней директории пользователя.

Из описания к Simple-CDD:

  • *.packages: packages installed when the profile is selected. Do not include packages such as linux-image or grub, as debian-installer will handle these specially.
  • *.postinst: profile-specific post-install script. runs in the “finish-install” phase of debian-installer.

Для решения проблем со сборкой дистрибутива через Simple-CDD в Debian 12 необходимо правильно настроить preseed-файлы, управление пакетами и postинсталляционные скрипты. Вот подробное решение каждой из ваших проблем:

Проблема 1: Настройка языка в preseed без подтверждения

Чтобы полностью автоматизировать выбор языка без подтверждения, используйте следующие параметры в вашем custom.preseed:

bash
# Полная автоматизация выбора языка
d-i debian-installer/language string ru
d-i debian-installer/country string RU
d-i debian-installer/locale string ru_RU.UTF-8
d-i console-setup/ask_detect boolean false
d-i console-setup/modelcode string pc105
d-i console-setup/variant RUSSIAN
d-i console-setup/layout RU
d-i console-setup/layoutcode string ru
d-i keymap select ru

Для автоматической установки через Simple-CDD добавьте параметр --locale при сборке:

bash
build-simple-cdd --locale ru_RU --profiles custom

Проблема 2: Объединение preseed-файлов

Simple-CDD действительно загружает default.preseed автоматически, но есть важные нюансы:

  1. Создайте базовый файл profiles/default.preseed со стандартными настройками:
bash
# Базовые настройки для всех профилей
d-i debconf/priority string critical
d-i partman-auto/init_automatically_partition select atomic
d-i partman-auto/method string regular
  1. В custom.preseed используйте директиву #include для объединения файлов:
bash
# Включаем базовые настройки
#include /cdrom/simple-cdd/default.preseed

# Специфичные настройки для custom профиля
d-i netcfg/get_hostname string myserver
d-i netcfg/get_domain string local
  1. При сборке явно указывайте профиль:
bash
build-simple-cdd --profiles custom

Проблема 3: Установка пакетов из образа

Для правильной установки пакетов выполните следующие шаги:

  1. В custom.packages укажите только нужные пакеты (исключая системные):
bash
iftop
htop
vim
curl
  1. При сборке используйте параметр --auto-select-packages:
bash
build-simple-cdd --profiles custom --auto-select-packages
  1. Проверьте содержимое образа:
bash
mount -o loop cdd-test.iso /mnt
ls -la /mnt/pool/main/
  1. Для оффлайн-установки убедитесь, что в preseed есть параметры для использования локального репозитория:
bash
d-i apt-setup/local0/repository string http://cdrom/
d-i apt-setup/local0/comment string Debian 12 Repository

Проблема 4: Запуск postинсталляционных скриптов

Для корректного выполнения скриптов custom.postinst:

  1. Убедитесь, что скрипт имеет правильные права:
bash
chmod +x profiles/custom.postinst
  1. Проверьте содержимое скрипта:
bash
#!/bin/bash
set -e

# Создание каталога для пользователя
mkdir -p /home/user/custom_dir
chown user:user /home/user/custom_dir

# Дополнительные настройки
echo "Custom post-install configuration" >> /etc/motd
  1. При использовании в preseed добавьте:
bash
d-i preseed/late_command string in-target chmod +x /target/usr/bin/simple-cdd-profile-postinst; in-target /usr/bin/simple-cdd-profile-postinst custom

Содержание


Настройка автоматического выбора языка

Для полного исключения ручного выбора языка в установщике Debian используйте комплексный подход:

bash
# В custom.preseed
d-i debian-installer/language string ru
d-i debian-installer/country string RU
d-i debian-installer/locale string ru_RU.UTF-8

# Отключаем детектирование клавиатуры
d-i console-setup/ask_detect boolean false
d-i console-setup/modelcode string pc105
d-i console-setup/variant RUSSIAN
d-i console-setup/layout RU
d-i console-setup/layoutcode string ru

# Выбор раскладки клавиатуры
d-i keymap select ru

# Приоритет вопросов (critical минизирует вопросы)
d-i debconf/priority string critical

Если проблема сохраняется, попробуйте добавить параметры загрузки в меню GRUB:

bash
linux /install.amd/vmlinuz auto priority=critical locale=ru_RU.UTF-8 keyboard-configuration/layoutcode=ru keyboard-configuration/variant=RU keyboard-configuration/modelcode=pc105

Объединение preseed-файлов

Simple-CDD загружает preseed-файлы в определенном порядке:

  1. Сначала default.preseed из /cdrom/simple-cdd/
  2. Затем профили *.preseed из того же каталога

Для корректного объединения:

  1. Создайте файл profiles/default.preseed:
bash
# Базовые настройки безопасности
d-i passwd/root-password-crypted password $6$rounds=4096$xyz
d-i passwd/make-user boolean true
d-i passwd/user-fullname string System Administrator
d-i passwd/username string admin
d-i passwd/user-password-crypted password $6$rounds=4096$xyz

# Сетевые настройки
d-i netcfg/disable_autoconfig boolean true
  1. В custom.preseed используйте:
bash
# Включаем базовые настройки
#include /cdrom/simple-cdd/default.preseed

# Переопределяем или добавляем специфичные параметры
d-i netcfg/get_hostname string myserver
d-i netcfg/get_domain string localdomain
d-i netcfg/get_ipaddress string 192.168.1.100
d-i netcfg/get_netmask string 255.255.255.0
d-i netcfg/get_gateway string 192.168.1.1
d-i netcfg/get_nameservers string 8.8.8.8,8.8.4.4
  1. При сборке используйте:
bash
build-simple-cdd --profiles custom --dist bookworm

Правильная установка пакетов

Для корректной установки пакетов из образа:

  1. Правильный формат custom.packages:
bash
# Только пользовательские пакеты
iftop
htop
vim
curl
wget
tree
  1. Исключите системные пакеты:
bash
# НЕ включайте эти пакеты:
# linux-image-*
# grub-*
# initramfs-tools
# casper
  1. Параметры сборки:
bash
build-simple-cdd \
  --profiles custom \
  --dist bookworm \
  --arch amd64 \
  --auto-select-packages \
  --debian-mirror http://deb.debian.org/debian
  1. Проверьте репозиторий в образе:
bash
# Монтируем образ
mount -o loop cdd-test.iso /mnt

# Проверяем наличие пакетов
ls -la /mnt/pool/main/*/iftop_*

# Проверяем файлы списков репозитория
cat /mnt/dists/bookworm/main/binary-amd64/Packages | grep iftop
  1. Если пакеты не устанавливаются, добавьте в preseed:
bash
d-i apt-setup/disable-cdrom boolean false
d-i apt-setup/use_mirror boolean false
d-i apt-setup/security-updates boolean false

Запуск postинсталляционных скриптов

Для гарантированного выполнения custom.postinst:

  1. Правильные права доступа:
bash
chmod +x profiles/custom.postinst
  1. Структура скрипта:
bash
#!/bin/bash
set -e

# Создание каталога с правильными правами
mkdir -p /home/admin/custom_dir
chown admin:admin /home/admin/custom_dir

# Настройка системы
echo "Custom configuration applied" >> /etc/motd

# Установка дополнительных пакетов если нужно
# apt-get install -y additional-package

# Настройка сети
# cat > /etc/network/interfaces.d/eth0 <<EOF
# auto eth0
# iface eth0 inet static
#     address 192.168.1.100
#     netmask 255.255.255.0
#     gateway 192.168.1.1
# EOF

reboot
  1. Добавьте в preseed команду вызова:
bash
d-i preseed/late_command string \
  in-target chmod +x /target/usr/bin/simple-cdd-profile-postinst; \
  in-target /usr/bin/simple-cdd-profile-postinst custom
  1. Альтернативный метод через debconf:
bash
d-i pkgsel/include string iftop htop vim
d-i pkgsel/upgrade select none
d-i pkgsel/update-policy select unattended-upgrades

# Команда для postinstall
d-i preseed/late_command string \
  cp /cdrom/simple-cdd/custom.postinst /target/usr/local/bin/; \
  in-target chmod +x /usr/local/bin/custom.postinst; \
  in-target /usr/local/bin/custom.postinst

Полный пример конфигурации

Вот полный пример рабочей конфигурации для Simple-CDD:

Структура каталогов:

simple-cdd/
├── profiles/
│   ├── default.preseed
│   ├── custom.packages
│   ├── custom.preseed
│   └── custom.postinst
└── build-simple-cdd.conf

default.preseed:

bash
d-i debconf/priority string critical
d-i partman-auto/init_automatically_partition select atomic
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select atomic
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/confirm boolean true
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true

d-i passwd/root-password-crypted password $6$rounds=4096$salt$hash
d-i passwd/make-user boolean true
d-i passwd/user-fullname string Administrator
d-i passwd/username string admin
d-i passwd/user-password-crypted password $6$rounds=4096$salt$hash

custom.preseed:

bash
#include /cdrom/simple-cdd/default.preseed

# Языковые настройки
d-i debian-installer/language string ru
d-i debian-installer/country string RU
d-i debian-installer/locale string ru_RU.UTF-8
d-i console-setup/ask_detect boolean false
d-i console-setup/modelcode string pc105
d-i console-setup/variant RUSSIAN
d-i console-setup/layout RU
d-i console-setup/layoutcode string ru
d-i keymap select ru

# Сетевые настройки
d-i netcfg/disable_autoconfig boolean true
d-i netcfg/get_hostname string myserver
d-i netcfg/get_domain string localdomain
d-i netcfg/get_ipaddress string 192.168.1.100
d-i netcfg/get_netmask string 255.255.255.0
d-i netcfg/get_gateway string 192.168.1.1
d-i netcfg/get_nameservers string 8.8.8.8,8.8.4.4

# Разметка диска
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select atomic
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/confirm boolean true
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true

# Установка пакетов
d-i pkgsel/include string iftop htop vim curl wget tree
d-i pkgsel/upgrade select none
d-i pkgsel/update-policy select unattended-upgrades

# late command для postinstall
d-i preseed/late_command string \
  cp /cdrom/simple-cdd/custom.postinst /target/usr/local/bin/; \
  in-target chmod +x /usr/local/bin/custom.postinst; \
  in-target /usr/local/bin/custom.postinst

custom.packages:

bash
iftop
htop
vim
curl
wget
tree

custom.postinst:

bash
#!/bin/bash
set -e

echo "Applying custom post-install configuration..."

# Создание каталога
mkdir -p /home/admin/custom_dir
chown admin:admin /home/admin/custom_dir

# Настройка системы
echo "Custom Debian 12 build - $(date)" >> /etc/motd

# Конфигурация сети
cat > /etc/network/interfaces.d/eth0 <<EOF
auto eth0
iface eth0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
EOF

echo "Custom configuration completed successfully."

Команда сборки:

bash
build-simple-cdd \
  --profiles custom \
  --dist bookworm \
  --arch amd64 \
  --auto-select-packages \
  --debian-mirror http://deb.debian.org/debian \
  --locale ru_RU.UTF-8

Устранение неполадок

Если preseed не применяется полностью:

  1. Проверьте синтаксис preseed-файла:
bash
debconf-get-selections < profiles/custom.preseed
  1. Добавьте отладочную информацию в preseed:
bash
d-i preseed/late_command string \
  echo "Preseed debug info" > /target/tmp/preseed.log; \
  echo "Date: $(date)" >> /target/tmp/preseed.log; \
  echo "Hostname: $(hostname)" >> /target/tmp/preseed.log;

Если пакеты не устанавливаются:

  1. Проверьте содержимое образа:
bash
apt-cdrom -m -d /mnt add
  1. Добавьте в preseed принудительную установку:
bash
d-i apt-setup/use_mirror boolean false
d-i apt-setup/disable-cdrom boolean false
d-i apt-setup/security-updates boolean false

Если postinst не выполняется:

  1. Проверьте права доступа к скрипту
  2. Добавьте логирование:
bash
d-i preseed/late_command string \
  cp /cdrom/simple-cdd/custom.postinst /target/usr/local/bin/; \
  in-target chmod +x /usr/local/bin/custom.postinst; \
  in-target /usr/local/bin/custom.postinst 2>&1 | tee /tmp/postinst.log;
  1. Проверьте выполнение в установленной системе:
bash
cat /target/tmp/postinst.log

Заключение

  1. Для автоматизации выбора языка используйте комплексный подход с параметрами языка, локали и клавиатуры в preseed-файле, а также параметр --locale при сборке.

  2. Simple-CDD автоматически загружает default.preseed, но для надежности используйте директиву #include явного объединения файлов.

  3. Для корректной установки пакетов указывайте только пользовательские пакеты в *.packages файлах и используйте параметр --auto-select-packages при сборке.

  4. Postинсталляционные скрипты будут выполняться автоматически, если у них есть права на выполнение и они правильно вызываются через d-i preseed/late_command в preseed-файле.

  5. Всегда проверяйте синтаксис preseed-файлов и добавляйте логирование для отладки сложных сценариев.

При следовании этим рекомендациям вы сможете создать полностью автоматизированный установочный образ Debian 12 с нужными настройками и пакетами.

Источники

  1. Debian preseed.cfg - Language not set - Server Fault
  2. 12.3. Automated Installation - Debian Handbook
  3. Using pre-seeding and boot params for completely un-attended Debian install - Unix Stack Exchange
  4. debian-urna/simple-cdd/profiles/default.preseed - GitHub
  5. Simple-CDD/Howto - Debian Wiki
  6. How do I configure a preseed to skip the language support question? - Ask Ubuntu
  7. Prevent Language selection at ubuntu installation - Unix Stack Exchange
  8. Set language in preseed for debian-installer for console - Stack Overflow
  9. Simple-CDD - Debian Wiki
Авторы
Проверено модерацией
Модерация