Создание загрузочного образа сервера Debian с нуля

Как сделать образ сервера debian

Как сделать образ сервера debian

Загрузочный образ Debian – это не просто ISO-файл, а инструмент для развёртывания серверной инфраструктуры с минимальными зависимостями и максимальной гибкостью. В отличие от готовых сборок, собственный образ позволяет исключить ненужные пакеты (например, systemd-timesyncd или avahi-daemon), настроить ядро под специфическое оборудование и интегрировать критически важные драйверы на этапе установки. Это особенно актуально для серверов с аппаратными RAID-контроллерами (LSI MegaRAID, Adaptec) или сетевыми картами, требующими проприетарных модулей (ixgbe для Intel X550, bnx2x для Broadcom).

Процесс начинается с выбора базовой версии Debian. Для серверов рекомендуется использовать Debian 12 «Bookworm» с длительным сроком поддержки (LTS) или Debian 11 «Bullseye», если требуется совместимость с устаревшим ПО. Минимальный образ можно собрать на основе debootstrap, но для полноценного загрузочного носителя потребуется live-build – инструмент, позволяющий автоматизировать создание ISO с предустановленными пакетами, конфигурацией сети и даже предустановленными SSH-ключами. Пример минимального списка пакетов для сервера: linux-image-amd64, grub-efi, openssh-server, sudo, locales и ifupdown (вместо systemd-networkd для простоты отладки).

Ключевой этап – настройка preseed.cfg, который автоматизирует ответы на вопросы установщика. Например, для бездисковой установки на RAID-массив с LVM необходимо указать параметры разбиения дисков (d-i partman-auto/method string lvm), исключить подтверждение форматирования (d-i partman-lvm/confirm boolean true) и задать пароль root в зашифрованном виде (d-i passwd/root-password-crypted password $6$...). Для сетевой загрузки через PXE потребуется интеграция initrd с поддержкой nfsroot или isc-dhcp-server, а также настройка pxelinux.cfg/default с указанием пути к образу и параметров ядра (ip=dhcp root=/dev/nfs nfsroot=192.168.1.1:/srv/debian).

Оптимизация образа включает удаление временных файлов (apt clean), сжатие initramfs (COMPRESS=xz в /etc/initramfs-tools/initramfs.conf) и отключение ненужных сервисов (systemctl mask apt-daily.timer). Для проверки целостности образа используйте sha256sum и тестирование в виртуальной среде (QEMU с параметрами -m 2048 -enable-kvm). Готовый ISO можно записать на USB-накопитель с помощью dd if=debian-server.iso of=/dev/sdX bs=4M status=progress, но для серверов с UEFI обязательно проверьте наличие раздела EFI в образе (fdisk -l debian-server.iso).

Выбор и подготовка базового ISO-образа Debian для серверной установки

Для серверной установки Debian используйте минимальный образ *netinst* (сетевой установщик) с официального зеркала: debian-XX.X.X-amd64-netinst.iso, где XX.X.X – актуальная версия (например, 12.5.0). Этот образ весит ~300–500 МБ и содержит только базовые пакеты, что снижает риск уязвимостей и упрощает настройку под конкретные задачи. Избегайте образов *live* или *DVD-1* – они включают ненужные для сервера компоненты (графические окружения, офисные пакеты). Проверьте контрольную сумму SHA256 после загрузки: sha256sum debian-XX.X.X-amd64-netinst.iso – результат должен совпадать с данными на официальной странице. Для виртуализации (KVM, Proxmox) или bare-metal установки на современное оборудование выбирайте архитектуру *amd64*; для legacy-систем (до 2010 года) – *i386*.

Подготовьте загрузочный носитель с помощью dd или специализированных инструментов: dd if=debian-XX.X.X-amd64-netinst.iso of=/dev/sdX bs=4M status=progress && sync, где /dev/sdX – целевой диск (например, /dev/sdb). Для UEFI-систем убедитесь, что носитель отформатирован в FAT32 и содержит раздел ESP. При установке на RAID или LVM заранее создайте таблицу разделов с помощью fdisk или parted, так как netinst не поддерживает автоматическое разбиение для этих конфигураций. Если планируется установка без доступа к интернету, используйте образ *DVD-1* (4–5 ГБ), но вручную удалите лишние пакеты после установки: apt purge --auto-remove task-desktop task-laptop.

Настройка сетевых параметров и репозиториев в процессе создания образа

Настройка сетевых параметров и репозиториев в процессе создания образа

В chroot-окружении настройте сетевые интерфейсы через /etc/network/interfaces. Для статического IP используйте конфигурацию вида:

auto eth0

iface eth0 inet static

address 192.168.1.100

netmask 255.255.255.0

gateway 192.168.1.1

dns-nameservers 8.8.8.8 8.8.4.4.

Для DHCP достаточно iface eth0 inet dhcp. Проверьте доступность сети командой ping -c 3 deb.debian.org перед настройкой репозиториев.

Редактируйте /etc/apt/sources.list, указав зеркала с минимальной задержкой. Для Debian 12 (Bookworm) используйте:

deb http://deb.debian.org/debian bookworm main contrib non-free-firmware

deb http://security.debian.org/debian-security bookworm-security main contrib non-free-firmware

deb http://deb.debian.org/debian bookworm-updates main contrib non-free-firmware.

Исключите deb-src, если не планируете сборку пакетов из исходников. Обновите индексы репозиториев командой apt update и установите критически важные пакеты (apt install -y openssh-server sudo curl) до выхода из chroot.

Установка и конфигурация минимального набора пакетов для серверной среды

Минимальный набор пакетов для серверной среды Debian формируется на базе debootstrap с добавлением критически важных компонентов. Начните с установки базовой системы через:

  • debootstrap --arch=amd64 bookworm /mnt http://deb.debian.org/debian – для стабильной ветки (12.x).
  • --variant=minbase – исключает рекомендуемые зависимости, сокращая образ на ~30%.

После монтирования /proc, /sys и /dev в целевую директорию (chroot /mnt), установите ядро и загрузчик:

  1. apt install --no-install-recommends linux-image-amd64 grub2 – ядро версии 6.1.x (по умолчанию в Bookworm).
  2. grub-install /dev/sdX – замените sdX на целевой диск (например, vda для KVM).
  3. update-grub – генерирует конфигурацию загрузчика.

Для сетевой связности добавьте ifupdown и настройте интерфейсы вручную. Пример конфигурации /etc/network/interfaces для статического IP:

auto eth0
iface eth0 inet static
address 192.168.1.10/24
gateway 192.168.1.1
dns-nameservers 8.8.8.8 1.1.1.1

Установите resolvconf для управления DNS (apt install resolvconf) и отключите systemd-resolved, если не требуется динамическое разрешение имен (systemctl disable systemd-resolved). Для IPv6 добавьте аналогичный блок с inet6.

Базовый набор инструментов включает:

  • openssh-server – доступ по SSH с предварительной генерацией ключей (ssh-keygen -t ed25519).
  • sudo – для делегирования прав без root (usermod -aG sudo username).
  • locales – минимальная локаль en_US.UTF-8 (dpkg-reconfigure locales).
  • tzdata – временная зона (ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime).

Отключите ненужные сервисы по умолчанию:

systemctl disable --now avahi-daemon cups cron atd

Для мониторинга установите htop и net-tools (ifconfig, netstat), но избегайте rsyslog – используйте journald с ограничением размера логов (journalctl --vacuum-size=100M).

Оптимизируйте APT для серверного использования:

  • Отключите рекомендуемые пакеты в /etc/apt/apt.conf.d/01norecommends:
APT::Install-Recommends "false";
APT::Install-Suggests "false";
  • Настройте кеширование пакетов (apt install apt-cacher-ng) для локального зеркала.
  • Обновите списки пакетов и очистите кеш:
apt update && apt full-upgrade -y && apt autoremove --purge -y && apt clean

Для автоматических обновлений установите unattended-upgrades и настройте в /etc/apt/apt.conf.d/50unattended-upgrades:

Unattended-Upgrade::Origins-Pattern {
"origin=Debian,codename=${distro_codename},label=Debian-Security";
};
Unattended-Upgrade::Remove-Unused-Dependencies "true";

Завершите конфигурацию созданием образа:

  1. Размонтируйте файловые системы:
umount -R /mnt
  1. Создайте сжатый образ через tar или dd:
tar -czvf debian-server-minimal.tar.gz -C /mnt .
# или для raw-образа:
dd if=/dev/sdX bs=4M status=progress | gzip > debian-server.img.gz

Для виртуальных сред (KVM/QEMU) используйте virt-sparsify для уменьшения размера образа:

virt-sparsify --compress debian-server.img debian-server-sparse.qcow2

Автоматизация начальной настройки с помощью preseed-файла или cloud-init

Preseed-файлы в Debian позволяют полностью автоматизировать установку системы, включая разбиение дисков, выбор пакетов и настройку пользователей. Для генерации базового шаблона используйте команду debconf-get-selections --installer > preseed.cfg, затем отредактируйте его, добавив критические параметры:

  • d-i partman-auto/disk string /dev/sda – принудительное использование конкретного диска;
  • d-i partman-auto/method string lvm – автоматическое создание LVM-разметки;
  • d-i pkgsel/include string openssh-server sudo – установка необходимых пакетов без запроса.

Для загрузки preseed-файла через сеть добавьте в параметры загрузчика preseed/url=http://example.com/preseed.cfg. Убедитесь, что файл доступен по HTTP/HTTPS без аутентификации, иначе установщик прервется с ошибкой.

Cloud-init – альтернатива preseed для облачных сред и виртуализации. Конфигурация задается в YAML-файле user-data, который поддерживает модули для:

  1. Настройки сети (network-config): статические IP, VLAN, bonding;
  2. Создания пользователей и SSH-ключей (users): ssh_authorized_keys для беспарольного доступа;
  3. Установки пакетов (packages): список пакетов для apt;
  4. Выполнения скриптов (runcmd): команды после первой загрузки.

Пример минимальной конфигурации для cloud-init:

#cloud-config
users:
- name: admin
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
packages:
- qemu-guest-agent
- fail2ban
runcmd:
- [ systemctl, enable, --now, qemu-guest-agent ]

Для проверки корректности cloud-init используйте cloud-init schema --config-file user-data. В виртуальных средах (KVM, Proxmox) передавайте user-data через метаданные ISO-образа или NoCloud datasource. В облаках (AWS, OpenStack) файл автоматически подтягивается из сервиса метаданных. При отладке логов используйте journalctl -u cloud-init и /var/log/cloud-init.log.

Ключевое отличие preseed и cloud-init: первый работает только на этапе установки, второй – после загрузки системы. Для гибридных сценариев (например, установка на bare metal с последующей облачной интеграцией) комбинируйте оба подхода: preseed для базовой установки, cloud-init для динамической настройки. В Debian 12 cloud-init по умолчанию не устанавливается – добавьте его в список пакетов preseed или через late_command:

d-i preseed/late_command string \
in-target apt-get install -y cloud-init; \
in-target systemctl enable cloud-init

Создание пользовательских скриптов для пост-установочной конфигурации

Создание пользовательских скриптов для пост-установочной конфигурации

Начните с проверки зависимостей. В первом скрипте добавьте проверку наличия интерпретатора и прав выполнения: #!/bin/bash
if [ "$(id -u)" -ne 0 ]; then
echo "Требуются права root" >&2
exit 1
fi
. Для Python используйте #!/usr/bin/env python3 и модуль argparse для обработки аргументов командной строки, если скрипт предполагает интерактивность.

Автоматизируйте установку пакетов через apt с предварительным обновлением списков репозиториев. Пример для минимального набора инструментов: apt update && apt install -y curl wget git tmux htop fail2ban ufw. Исключите интерактивные диалоги, добавив DEBIAN_FRONTEND=noninteractive перед командами apt, чтобы избежать остановок на запросах подтверждения.

Конфигурируйте сервисы через шаблоны файлов. Храните эталонные конфиги в /usr/local/etc/templates/ и копируйте их в /etc/ с заменой переменных. Например, для sshd_config: sed -e "s/^#PermitRootLogin.*/PermitRootLogin no/" \

-e "s/^#PasswordAuthentication.*/PasswordAuthentication no/" \

/usr/local/etc/templates/sshd_config > /etc/ssh/sshd_config. Перезапускайте сервисы только после проверки синтаксиса: sshd -t && systemctl restart sshd.

Создавайте пользователей и группы с заранее определёнными UID/GID, чтобы избежать конфликтов в кластерных средах. Используйте groupadd -g 2000 devops && useradd -u 2000 -g devops -m -s /bin/bash devops. Для SSH-доступа добавляйте публичные ключи из заранее подготовленного файла: mkdir -p /home/devops/.ssh && cat /usr/local/etc/keys/devops.pub >> /home/devops/.ssh/authorized_keys && chown -R devops:devops /home/devops/.ssh.

Настройте брандмауэр ufw с минимальным набором правил. Пример для веб-сервера: ufw default deny incoming

ufw default allow outgoing

ufw allow 22/tcp

ufw allow 80/tcp

ufw allow 443/tcp

ufw --force enable. Логируйте все изменения в файл /var/log/post-install.log с временными метками: exec >> /var/log/post-install.log 2>&1
echo "$(date '+%Y-%m-%d %H:%M:%S') - Настройка ufw завершена"
.

Завершите скрипты проверкой успешности выполнения. Добавьте в конец каждого блока команду if [ $? -ne 0 ]; then
echo "Ошибка в блоке [имя_блока]" >&2
exit 1
fi
. Для комплексных сценариев используйте set -e в начале скрипта, чтобы прервать выполнение при первой ошибке. Храните резервные копии изменённых файлов в /var/backups/post-install/ с датой в имени: cp /etc/ssh/sshd_config /var/backups/post-install/sshd_config_$(date +%F).bak.

Вопрос-ответ:

Ссылка на основную публикацию