Подготовить ISO-образ для автоустановки ОС на выделенный сервер
Вы можете подготовить собственный образ ОС, который будет совместим с механизмом автоустановки ОС на выделенный сервер в Servercore.
Если у вас нет особых требований к ОС, мы рекомендуем использовать стандартные образы — из них можно установить ОС автоустановкой или вручную.
- Создайте ISO-образ.
- Загрузите образ в хранилище S3.
- Получите ссылку на объект в хранилище.
- Добавьте ISO-образ в панель управления.
1. Создать ISO-образ
Размер архива с образом ОС должен быть минимум на 3 ГБ меньше размера оперативной памяти выделенного сервера. Например, если размер оперативной памяти сервера 8 ГБ, размер архива с образом не должен превышать 5 ГБ.
Ubuntu
Debian
Windows Server
VMware ESXi
Рекомендуем выполнять подготовку системы от пользователя root.
-
Для подготовки архива с образом установите ОС без программного RAID и без раздела
swap. Рекомендуем установить ОС автоустановкой на ваш выделенный сервер, тогда некоторые шаги инструкции будут уже выполнены. -
Проверьте состояние пакета
sssdи удалите его, если он установлен:2.1. Проверьте состояние пакета
sssd:dpkg -l sssdЕсли пакет установлен, в ответе появится строка со статусом
ii, напримерii sssd 2.9.1-....2.2. Если пакет
sssdустановлен, удалите его:sudo apt purge -y sssdsudo apt autoremove -y -
Установите обязательные пакеты:
sudo apt install -y \openssh-server \cloud-init \grub2 \grub-efi-amd64-bin \mdadm \nftables -
Обновите ядро ОС до последней стабильной версии:
linux-image-generic-hwe-24.04linux-headers-generic-hwe-24.04 -
Обновите пакеты в системе:
apt update && apt upgrade -y -
Подготовьте сервис
cloud-initк использованию в образе:6.1. Удалите файлы и директории, которые содержат текущую конфигурацию
cloud-init:rm -rf /etc/cloud/cloud.cfg.d /etc/cloud/cloud-init.disabled6.2. Удалите данные с прошлого выполнения
cloud-init:cloud-init clean --logs6.3. Создайте директорию
/etc/cloud/cloud.cfg.d:mkdir -p /etc/cloud/cloud.cfg.d6.4. Создайте файл
/etc/cloud/cloud.cfgтекстовым редакторомvi:vi /etc/cloud/cloud.cfg6.5. Добавьте в файл конфигурацию
cloud-init:Файл
/etc/cloud/cloud.cfgdatasource_list:- NoCloud- Noneusers:- default#disable_root: 1#ssh_pwauth: 0mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2']resize_rootfs_tmp: /devssh_deletekeys: 1ssh_genkeytypes: ['rsa', 'ecdsa', 'ed25519']syslog_fix_perms: ~disable_vmware_customization: falsecloud_init_modules:- disk_setup- growpart- resizefs- set_hostname- update_hostname- update_etc_hosts- users-groups- ssh- apt-configure- bootcmd- ca_certs- rsyslog- write_filescloud_config_modules:- mounts- locale- set-passwords- timezone- runcmd- snap- ssh_import_id- ubuntu_drivers- ntpcloud_final_modules:- package-update-upgrade-install- scripts-per-once- scripts-per-boot- scripts-per-instance- scripts-user- ssh-authkey-fingerprints- keys-to-console- final-message- power-state-change- lxd- puppet- chef- mcollective- salt_minion- phone_homesystem_info:default_user:name: cloud-userlock_passwd: truegecos: Cloud Usergroups: [adm, systemd-journal]sudo: ["ALL=(ALL) NOPASSWD:ALL"]shell: /bin/bashdistro: ubuntupaths:cloud_dir: /var/lib/cloudtemplates_dir: /etc/cloud/templatesssh_svcname: sshdvendor_data:enabled: True# vim:syntax=yaml6.6. Выйдите из текстового редактора
viс сохранением изменений::wq6.7. Создайте файл
cloud-init-local.serviceтекстовым редакторомvi:sudo vi /usr/lib/systemd/system/cloud-init-local.service6.8. Добавьте в файл конфигурацию:
[Unit]Description=Initial cloud-init job (pre-networking)DefaultDependencies=noWants=network-pre.targetAfter=hv_kvp_daemon.serviceAfter=systemd-remount-fs.serviceBefore=NetworkManager.serviceBefore=network-pre.targetBefore=shutdown.targetBefore=sysinit.targetConflicts=shutdown.targetRequiresMountsFor=/var/lib/cloudConditionPathExists=!/etc/cloud/cloud-init.disabledConditionKernelCommandLine=!cloud-init=disabledConditionEnvironment=!KERNEL_CMDLINE=cloud-init=disabled[Service]Type=oneshotExecStartPre=sleep 30ExecStart=/usr/bin/cloud-init init --localRemainAfterExit=yesTimeoutSec=0# Output needs to appear in instance console outputStandardOutput=journal+console[Install]WantedBy=cloud-init.target6.9. Выйдите из текстового редактора
viс сохранением изменений::wq -
Добавьте и настройте скрипт per-boot:
7.1. Создайте файл скрипта
boot_order_sort.shтекстовым редакторомvi:sudo vi /var/lib/cloud/scripts/per-boot/boot_order_sort.sh7.2. Добавьте в файл текст скрипта:
Файл
boot_order_sort.sh#!/bin/bash# Retrieve the output of efibootmgrefi_output=$(efibootmgr -D 2>&1)# Check if the system supports EFIif [[ $? -ne 0 ]]; thenecho "[WARNING] System does not support EFI, boot order will not be changed."exit 0fi# Extract the current boot entry (BootCurrent)current_os=$(echo "$efi_output" | grep -oP '(?<=BootCurrent: )[0-9A-F]{4}')# Extract the boot order (BootOrder)boot_order=$(echo "$efi_output" | grep -oP '(?<=BootOrder: )[0-9A-F,]+')# Declare an associative array to store BootXXXX values and their descriptionsdeclare -A boot_dict# boot_order_sorted will contain the sorted boot order# removed_entries will contain boot numbers that are not in the sorted list (and are removed)boot_order_sorted=()removed_entries=()# Parse all BootXXXX entries with their descriptions (remove 'Boot' prefix and *)boot_entries=$(echo "$efi_output" | grep -oP '(?<=Boot)[0-9A-F]{4}\*?.*')if [[ -z "$boot_entries" ]]; thenecho "[ERROR] No boot entries found in EFI output."exit 1fi# Debug outputecho "[INFO] Current Boot: ${current_os:-None}"echo "[INFO] Boot Order: ${boot_order:-None}"# Loop through and process each boot entrywhile read -r entry; do# Extract the four-digit boot number (excluding 'Boot' and '*')boot_number=$(echo "$entry" | grep -oP '^[0-9A-F]{4}')# Extract the description (everything after the boot number)description=$(echo "$entry" | sed 's/^[0-9A-F]\{4\}\* //')# Ensure the boot_number is not empty and add to the dictionaryif [[ -n "$boot_number" ]]; thenboot_dict["$boot_number"]="$description"fi# Add entries containing "IP4" or "PXE", but not containing "HTTP", to the sorted listif [[ ("$description" =~ "IP4" || "$description" =~ "PXE" || "$description" =~ "IPv4" || "$description" =~ "NIC") && ! "$description" =~ "HTTP" ]]; thenboot_order_sorted+=("$boot_number")fiecho "$boot_number: $description"done <<< "$boot_entries"# Add the current OS to the main list if it existsif [[ -n "$current_os" ]]; thenboot_order_sorted+=("$current_os")fi# Find all entries with the same description as current_os and add them to the sorted listif [[ -n "$current_os" ]]; thencurrent_description="${boot_dict[$current_os]}"for boot_number in "${!boot_dict[@]}"; do# If description matches the current OS but boot number is not the same, add it to the sorted listif [[ "$boot_number" != "$current_os" && "${boot_dict[$boot_number]}" == "$current_description" ]]; thenboot_order_sorted+=("$boot_number")fidonefi# Find all boot numbers that are not in the main sorted list and remove themif [[ ${#boot_dict[@]} -eq 0 ]]; thenecho "[INFO] No boot entries to process."elsefor boot_number in "${!boot_dict[@]}"; doif [[ ! " ${boot_order_sorted[*]} " =~ " $boot_number " ]]; then# Remove the boot entry from the systemefibootmgr -b "$boot_number" -B > /dev/null 2>&1removed_entries+=("$boot_number") # Add removed boot number to the removed entries listecho "[INFO] Removed Boot Entry: $boot_number"fidonefi# Convert the main boot order list to a comma-separated stringif [[ ${#boot_order_sorted[@]} -eq 0 ]]; thenboot_order_sorted_str="None"elseboot_order_sorted_str=$(IFS=,; echo "${boot_order_sorted[*]}")efibootmgr -o "$boot_order_sorted_str" > /dev/null 2>&1echo "[INFO] Updated boot order: $boot_order_sorted_str"fi# Show the final EFI boot entries for verificationefibootmgr -D7.3. Выйдите из текстового редактора
viс сохранением изменений::wq7.4. Установите права на файл
boot_order_sort.sh:sudo chmod 700 /var/lib/cloud/scripts/per-boot/boot_order_sort.sh -
Опционально: настройте SSH. По умолчанию при установке ОС сервис
cloud-initзадает пароль только для пользователяroot. Вы можете использовать собственную схему аутентификации, например запретить вход по паролю и под пользователемroot, создав отдельного пользователя с авторизацией по SSH-ключу. В этом случае парольroot, переданный при установке, будет установлен, но использоваться не будет.8.1. Откройте файл конфигурации
/etc/ssh/sshd_configтекстовым редакторомvi:sudo vi /etc/ssh/sshd_config8.2. Если хотите разрешить вход по SSH от имени пользователя
root, измените или добавьте параметрPermitRootLogin yes.8.3. Если хотите разрешить аутентификацию по паролю, измените или добавьте параметр
PasswordAuthentication yes.8.4. Выйдите из текстового редактора
viс сохранением изменений::wq -
Опционально: настройте
grub:9.1. Откройте файл конфигурации
/etc/default/grubтекстовым редакторомvi:sudo vi /etc/default/grub9.2. Измените или добавьте параметры:
GRUB_DEFAULT=0GRUB_TIMEOUT=5GRUB_DISTRIBUTOR=UbuntuGRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet nomodeset"GRUB_CMDLINE_LINUX="rd.auto=1 net.ifnames=0 biosdevname=0"GRUB_PRELOAD_MODULES="part_gpt part_msdos"GRUB_TIMEOUT_STYLE=menuGRUB_TERMINAL_INPUT=consoleGRUB_GFXMODE=autoGRUB_GFXPAYLOAD_LINUX=keepGRUB_DISABLE_RECOVERY=trueGRUB_DISABLE_OS_PROBER=false9.3. Выйдите из текстового редактора
viс сохранением изменений::wq -
Опционально: установите и настройте
Fail2ban— сервис блокировки IP-адреса в случае неудачных попыток авторизации:10.1. Установите
Fail2ban:fail2ban10.2. Откройте файл конфигурации
/etc/fail2ban/jail.d/service.confтекстовым редакторомvi:sudo vi /etc/fail2ban/jail.d/service.conf10.3. Измените или добавьте параметры:
[sshd]enabled = trueport = sshfilter = sshdaction = nftables[name=sshd, port=ssh, protocol=tcp]logpath = /var/log/auth.logmaxretry = 10findtime = 3600bantime = 8640010.4. Выйдите из текстового редактора
viс сохранением изменений::wq -
Опционально: внесите дополнительные изменения в систему, например установите дополнительное ПО, пакеты или выполните другие необходимые настройки для вашего образа. Убедитесь, что внесенные изменения не противоречат предыдущим шагам инструкции.
-
Отключите режим сна и гибернации:
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target -
Создайте символьную ссылку для
mdamd:ln -s /usr/sbin/mdadm /usr/bin/mdadm -
Включите службу
system-resolved:systemctl enable --now systemd-resolvedln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf -
Удалите неиспользуемые пакеты:
apt autoremove -y -
Примените изменения, для этого перезагрузите систему:
systemctl reboot -
Обнулите уникальный идентификатор системы, чтобы каждый экземпляр установленной системы получал собственный идентификатор:
truncate -s 0 /etc/machine-id /var/lib/dbus/machine-id -
Подготовьте файл со списком каталогов, которые не должны попасть в архив образа ОС:
18.1. Создайте файл
exclude.txtтекстовым редакторомvi:sudo vi /root/exclude.txt18.2. Добавьте в файл
exclude.txtсписок каталогов, которые нужно исключить из архива:/tmp/*/proc/*/sys/*/dev/*/run/*/mnt/*/media/*/var/lib/lxcfs/var/spool/postfix/lost+found18.3. Выйдите из текстового редактора
viс сохранением изменений::wq -
Создайте архив файловой системы:
tar -czp -f /mnt/base.tar.gz --exclude-from=/root/exclude.txt /
2. Загрузить образ в хранилище S3
Для загрузки архива с образом в хранилище S3 используйте инструкцию Загрузить объект.
Если при создании ISO-образа VMware ESXi вы подготовили файл setul.tpl, загрузите его в хранилище вместе с образом.
3. Получить ссылку на объект в хранилище
Для получения ссылки на объект в хранилище S3 используйте инструкцию Получить ссылку на объект.
4. Добавить образ в панель управления
-
В панели управления в верхнем меню нажмите Продукты и выберите Выделенные серверы.
-
Перейдите в раздел Образы.
-
Нажмите Добавить образ.
-
Выберите семейство ОС.
-
Введите имя образа.
-
Добавьте ссылку на образ, который вы загрузили на этапе 2 в хранилище S3.
-
Если на шаге 6 в качестве ссылки вы добавили путь к образу в S3, введите Access key и Secret key.
-
Нажмите Создать образ.