Данная статья применима к:

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8)
  • Astra Linux Special Edition РУСБ.10015-01 и РУСБ.10015-10 (очередное обновление 1.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1
  • Astra Linux Common Edition 2.12


Ответственность за применение и сопровождение модифицированных операционных систем, установленных с модифицированных установочных носителей, полностью лежит на авторах этих носителей. Замкнутость полученного дистрибутива не проверяется и возможность установки из него пакетов не гарантируется. Стандартная техническая поддержка Astra Linux не распространяется на такие системы. Действие сертификатов Astra Linux не распространяется на такие системы.
См. также:

Введение

В данной статье рассматривается создание модифицированного установочного диска. Модифицированный образ создается на основе стандартного образа установочного диска Astra Linux Special Edition. Модификация подразумевает изменение состава DEB-пакетов и preseed-сценария. Подразумевается, что служебные пакеты (udebs) не изменяются. Для изменения пакетов udeb используется отдельная процедура (см. how to build a full image with a custom kernel). Все основные действия выполняются от имени непривилегированного пользователя, привилегии суперпользователя (в Astra Linux Special Edition с включенным МКЦ - привилегий суперпользователя с высоки уровнем целостности) требуются только для установки пакетов, монтирования носителей (если используется) и операции записи созданного образа на носитель.

Подготовка компьютера

Для выполнения дальнейших действий на компьютере, на котором будут создаваться модифицированные образы::

  1. В Astra Linux Special Edition x.8 подключить расширенный репозиторий, в более ранних обновлениях подключить репозиторий со средствами разработки. Порядок подключения репозиториев см. в статье Подключение репозиториев с пакетами в ОС Astra Linux и установка пакетов .
  2. Установить необходимые пакеты:

    sudo apt install reprepro xorriso build-essential debootstrap

Создание распакованной копии установочного диска

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

  1. Создать подкаталог для распаковки:

    mkdir ~/cd

  2. Распаковать ISO-образ в созданный каталог:

    xorriso -osirrox on -indev путь_к_файлу.iso -extract / cd

  3. Для выполнения дальнейших модификаций разрешить запись в распакованные файлы:

    chmod -R +w ~/cd

В результате этого шага в подкаталоге /cd домашнего каталога текущего пользователя будет создан подкаталог /cd с копией содержимого образа установочного диска, и будет разрешено вносить изменения в содержимое этой копии.

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

Создание собственного ключа

Для подписания измененного установочного образа следует использовать ключи, выпущенные в соответствии с установленными в организации правилами. Приведенный далее пример создания ключа применим исключительно в демонстрационных целях.
  1. Зафиксировать имя, которое будет использоваться в ключе. Обычно в качестве такого имени применяют адрес электронной почты, который для повторного применения удобно экспортировать в переменную окружения:

    mail="<адрес_электронной_почты>"
    например:
    mail="support@organization.ru"

  2. Создать конфигурационный файл gen-key.cfg с параметрами генерации ключа. Создать такой файл можно следующей командой (в качестве имени владельца ключа используется имя support, для указания адреса электронной почты используется ранее экспортированная переменная mail):

    echo "Key-Type: 1
    %no-protection
    Key-Length: 4096
    Subkey-Type: 1
    Subkey-Length: 4096
    Name-Real: support  # <имя_владельца_ключа> 
    Name-Email: $mail  # <адрес_электронной_почты>
    Expire-Date: 0" > gen-key.cfg

  3. Выполнить генерацию ключа используя созданный конфигурационный файл:

    gpg --batch --gen-key gen-key.cfg
    опции команды:
    --batch  генерация ключа без запросов подтверждений;
    --gen-key  команда генерации ключа;
    gen-key.cfg  конфигурационный файл с параметрами генерации ключа.

  4. Экспортировать созданный ключ в файл с именем <адрес_электронной_почты>.gpg.key (удобно опять использовать значение ранее созданной переменной окружения mail):

    gpg --armor --output "$mail.gpg.key" --export "$mail"
    опции команды:
    --armor  экспорт в формате ASCII;
    --output "$mail.gpg.key" имя файла, в котором сохраняется экспортированный ключ (в имени файла используется значение ранее созданной переменной окружения);
    --export "$mail" указание операции (экспорт) и имя экспортируемого объекта  (используется значение ранее созданной переменной окружения).

  5. Импортировать экспортированный ключ в комплект ключей:

    1. Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8):
      sudo gpg --no-default-keyring --keyring /usr/share/keyrings/astra-archive.gpg --import "$mail.gpg.key"
    2. Astra Linux Special Edition x.7 и более ранние очередные обновления:
      sudo gpg --no-default-keyring --keyring /usr/share/apt/astra-archive.gpg --import "$mail.gpg.key"

      Далее копия созданного ключа, находящаяся в комплекте ключей Astra Linux, будет использована для подписания измененного репозитория установочного диска.

Пакетизация собственного ключа

Для того, чтобы исключить проверку подписей пакетов при установке, нужно добавить опцию debian-installer/allow-unauthenticated=true в файл /boot/grub/grub.cfg.

Для того, чтобы подпись репозитория, сделанная собственным публичным ключом, могла быть проверена при установке операционной системы с модифицированного носителя собственный публичный (открытый) ключ должен быть включен в репозитории установочного диска. Это можно сделать оформив примитивный UDEB-пакет:

  1. Экспортировать публичный ключ в файл:

    gpg --output "$mail.gpg" --export "$mail"
    в данном случае экспорт выполняется в двоичном формате, а не в формате ASCII.

  2. Установить права доступа на файл с экспортированным публичным ключом:

    sudo chmod 644 "$mail.gpg"

  3. Создать UDEB-пакет для включения собственного открытого ключа в модифицированный дистрибутив. Для примера далее используется имя пакета aptkey:
    1. Для удобства работы сохранить имя пакета в переменной окружения:

      package="aptkey"

    2. Создать подкаталог для размещения пакета:

      mkdir -p "$package/DEBIAN"

    3. Создать файл $package/DEBIAN/control с параметрами пакета (в приведенном примере команды используются значения ранее заданных переменных окружения):

      echo "Package: $package
      Version: 1.0
      Section: debian-installer
      Priority: important
      Architecture: all
      Essential: no
      Installed-Size: 1024
      Maintainer: $mail
      #Package-Type: udeb
      #XC-Package-Type: udeb
      Description: Add own keyring to apt
      Depends: apt" > "$package/DEBIAN//control"

    4. Создать файл $package/DEBIAN/postinst постустановочного сценария (сценарий нечего не делает, возвращая код завершения 0 (успешное окончание) и присвоить файлу со сценарием разрешение на выполнение:

      echo "exit 0" > "$package/DEBIAN/postinst"
      chmod 0755 "$package/DEBIAN/postinst"

    5. Создать и наполнить структуру каталогов с данными пакета:

      mkdir -p "$package/etc/apt/trusted.gpg.d"
      cp "$mail.gpg" "$package/etc/apt/trusted.gpg.d/"
      экспортированный публичный ключ помещается в каталог пакета "$package/etc/apt/trusted.gpg.d" чтобы при установке пакета этот ключ был размещен в системном каталоге доверенных ключей /etc/apt/trusted.gpg.d

    6. Собрать пакет:

      dpkg-deb --build "$package"

    7. Экспортированный публичный ключ переместить в каталог доверенных ключей рабочей системы:

      sudo mv "$mail.gpg" /etc/apt/trusted.gpg.d/

Изменение состава пакетов в репозитории

После изменения состава пакетов репозитория репозиторий перестает быть подписанным ключами ООО "РусБИТех-Астра" (становится неподписанным).
  1. Создать каталог для временной копии репозитория. Для примера использовано имя каталога /cache:

    mkdir -p cache

  2. Переместить в созданный временный каталог DEB- и UDEB-пакеты из копии установочного диска:

    find cd/pool -name \*.deb -print -exec mv {} cache \;
    find cd/pool -name \*.udeb -exec mv {} cache \;

  3. Переместить (или скопировать) в созданный временный каталог ранее созданный пакет с собственным ключом:

    mv "$package.deb" "cache/${package}_1.0.deb"

  4. Очистить копию установочного диска от ненужных каталогов:

    rm -rf $HOME/cd/{db,dists,pool}

  5. Выполнить модернизацию состава пакетов дистрибутива:

    1. Добавить во временный каталог собственные пакеты.

    2. Удалить во временном каталоге ненужные пакеты.

  6. Создать в каталоге с копией установочного диска подкаталог ~/cd/conf:

    mkdir -p ~/cd/conf

  7. Создать конфигурационный файл ~/cd/conf/distributions для восстановления репозитория:

    Здесь и далее в командах следует указывать вместо 1.8_x86-64 вашу версию дистрибутива, например 1.7_x86-64

    echo 'Origin: Astra
    Codename: 1.8_x86-64
    Suite: stable
    Version: 1.8.1
    Architectures: amd64
    Components: main contrib non-free
    UDebComponents: main
    SignWith: yes' > ~/cd/conf/distributions

     

Приведенная для примера конфигурация использует дистрибутив Astra Linux Special Edition РУСБ.10015-01 очередное обновление 1.8, архитектуру amd64, компоненты main,contrib,nonfree. При использовании других дистрибутивов параметры конфигурации должны быть откорректированы.


Далее:

  1. Инициализировать репозиторий:

    reprepro -b cd/ export 1.8_x86-64

  2. Выгрузить ключ для подписи репозитория:

    gpg --yes --armor -o ~/cd/dists/1.8_x86-64/Release.gpg -sb ~/cd/dists/1.8_x86-64/Release

  3. Наполнить репозиторий пакетами, сохраненными во временном каталоге /cache:

    reprepro --ask-passphrase -Vb cd includedeb  1.8_x86-64 cache/*.deb
    reprepro --ask-passphrase -Vb cd includeudeb 1.8_x86-64 cache/*.udeb

  4. Обновить файл с контрольными суммами:

    cd ~/cd; find ! -name md5sum.txt ! -name gostsums.txt -follow -type f -print0 | xargs -0 md5sum > md5sum.txt ; cd ..
    Предупреждение 

    find: Обнаружено зацикливание в файловой системе; ...

    можно игнорировать.

  5. Восстановить структуру ссылок репозитория:

    ln -s 1.8_x86-64 ~/cd/dists/stable

  6. Удалить ненужный каталог ~/cd/conf и временные копии пакетов:

    rm -rf ~/cd/conf ~/cd/db cache

Замена файла конфигурации установки preseed.cfg

На установочном диске содержится файл с ответами на вопросы установщика ОС файл preseed.cfg. Для простой автоматизации установки можно задать альтернативный файл непосредственно при установке ОС. Эта возможность не обеспечивает полной автоматизации установки, но может упростить и стандартизировать установку ОС. 

Пример файла для Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8) см. в Файл preseed для загрузки по сети Astra Linux x.8 статьи Автоматическая установка Astra Linux Special Edition x.8.

При установке

Для замены файла preseed.cfg при установке:

  1. При использовании установочных носителей созданных на USB-накопителях (на модифицируемых носителях) для замены файла preseed:
    1. Примонтировать носитель.
    2. Скопировать заменяющий файл (например, preseed.cfg) в корень установочного  носителя.
    3. Внести в файл boot/grub/grub.cfg в строки с параметрами загрузки ядра (начинаются со слова linux) указание файла preseed, например:

      linux /install.amd/vmlinuz quiet modprobe.blacklist=evbug astra_install=1 nomodeset debian-installer/locale=ru debian-installer/language=ru keyboard-configuration/xkb-keymap=ru console-keymaps-at/keymap=ru preseed/file=/cdrom/preseed.cfg
    4. Отмонтировать накопитель.
  2. При использовании немодифицируемых установочных носителей (CD-ROM, DVD-ROM) заменяющий файл можно предоставить с помощью USB-накопителя: 
    1. Подготовить накопитель: 
      1. Подключить USB-накопитель к компьютеру.

      2. Отформатировать USB-накопитель файловой системой vfat без создания дискового раздела:

        При форматировании все данные с накопителя будут удалены.
        При форматировании использовать имя накопителя (например, sdh), а не имя дискового раздела (sdh1).

        sudo mkfs.vfat -I /dev/<имя_накопителя>

      3. Примонтировать накопитель.

      4. Скопировать заменяющий preseed файл на накопитель.

      5. Отмонтировать накопитель.
    2. При установке ОС:

      1. Выбрать язык установки.

      2. Не нажимая <Enter> выбрать способ установки (графический или текстовый).

      3. Нажать <F2>. Откроется список выбора параметров ядра.

      4. Нажать <Esc>. Список выбора параметров ядра закроется, и можно будет непосредственно редактировать строку параметров ядра.

      5. В строку параметров ядра добавить указание файла preseed, при этом использовать не каталог /cdrom, а каталог /media, например:

        linux /install.amd/vmlinuz quiet modprobe.blacklist=evbug astra_install=1 nomodeset debian-installer/locale=ru debian-installer/language=ru keyboard-configuration/xkb-keymap=ru console-keymaps-at/keymap=ru preseed/file=/media/preseed.cfg
      6. Нажать <Enter>.

Как упоминается ранее, при таком использовании полная автоматизация не обеспечивается, и всегда придется согласиться с лицензией и выбрать клавиши переключения языка. Порядок дальнейшей установки определяется указанным файлом preseed.cfg.

В составе дистрибутива с debian-installer

Применимо только для Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8) с debian-installer (есть метка di в названии загруженного образа) и для более ранних очередных обновлений.

Далее подразумевается, что действия выполняются в домашнем каталоге пользователя, загрузочный образ уже распакован в подкаталог cd домашнего каталога пользователя, и файл с новым сценарием установки preseed.cfg сохранен в домашнем каталоге пользователя. Общий порядок действий для одного образа initrd:

  1. Распаковать файлы загрузчика ранее распакованного модифицируемого образа из рабочего каталога.
  2. Произвести замену файла  preseed.cfg в составе распакованных файлов загрузчика.
  3. Запаковать файлы загрузчика модифицируемого образа:

Образы initrd находятся в следующих каталогах:

  • install.amd/initrd;
  • install.amd/gtk/initrd;
  • hd-media/initrd (может отсутствовать в дистрибутиве);
  • hd-media/gtk/initrd (может отсутствовать в дистрибутиве);

Пример сценария замены файла preseed.cfg

Как и ранее, предполагается, что дистрибутив распакован в подкаталог cd домашнего каталога, а новый файл preseed.cfg находится в домашнем каталоге. Сценарий перебирает все известные каталоги, в которых может находиться образ initrd, и для каждого найденного каталога выполняет действия по замене файла:

for n in ~/cd/install.amd ~/cd/install.amd/gtk ~/cd/hd-media ~/cd/hd-media/gtk; do
    if [ -d $n ] ; then
        pushd `mktemp -d`
        chmod u+w $n $n/initrd.gz
        cat $n/initrd.gz | gzip -d | sudo cpio -i
        sudo cp ~/preseed.cfg .
        sudo find | cpio -o --format=newc | gzip -9c > $n/initrd.gz
        sudo rm -rf *
        chmod -R -w $n
        popd
    fi
done

 

Пример файла preseed

Пример файла preseed:


preseed.cfg
# Сетевой репозиторий для установки
d-i mirror/protocol string http
d-i mirror/http/hostname string dl.astralinux.ru
d-i mirror/http/directory string /astra/stable/1.7_x86-64/repository-main
# Настройки языка
d-i mirror/country string manual
d-i debian-installer/locale string ru_RU
d-i debian-installer/locale select ru_RU.UTF-8
d-i debian-installer/language string ru
d-i debian-installer/country string RU
d-i debian-installer/keymap string ru
# Настройки клавиатуры
d-i console-tools/archs select at
d-i console-keymaps-at/keymap select ru
d-i console-setup/toggle string Ctrl+Shift
d-i console-setup/layoutcode string ru
d-i keyboard-configuration/toggle select Ctrl+Shift
d-i keyboard-configuration/layoutcode string ru
d-i keyboard-configuration/xkb-keymap select ru
d-i languagechooser/language-name-fb select Russian
d-i countrychooser/country-name select Russia
# Настройки сетевого интерфейса
d-i netcfg/choose_interface select auto
# Выбор компонент репозитория
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true
d-i apt-setup/services-select none
# Настройка часов и синхронизации времени
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Moscow
# Определяет, нужно ли использовать NTP для установки часов во время установки
d-i clock-setup/ntp boolean true
# Используемый сервер NTP. Значение по умолчанию указывается здесь. Для примера указан сервер ВНИИФТРИ.
d-i clock-setup/ntp-server string ntp4.vniiftri.ru
# Разметка диска
d-i partman-auto/method string regular
d-i partman-auto/purge_lvm_from_device boolean true
d-i partman-lvm/confirm boolean true
# Для режима legacy bios:
d-i partman-auto/expert_recipe string myroot :: \
     512 16384 512 ext2 \
         $primary{ } $bootable{ } \
         method{ format } format{ } use_filesystem{ } filesystem{ ext2 } mountpoint{ /boot } .\
     8192 16384 16384 ext4 \
         method{ format } format{ } use_filesystem{ } filesystem{ ext4 } mountpoint{ /     } .\
     2048 16384 2048 ext4 \
         method{ format } format{ } use_filesystem{ } filesystem{ ext4 } mountpoint{ /tmp  } options/noexec{ noexec } options/nodev{ nodev } options/nosuid{ nosuid } .\
     500 8192 -1 ext4 \
         method{ format } format{ } use_filesystem{ } filesystem{ ext4 } mountpoint{ /home } .
d-i partman-auto/choose_recipe select myroot
#d-i partman-auto/choose_recipe select atomic
# Для режима UEFI:
# d-i   partman-auto/choose_recipe  select  /lib/partman/recipes-amd64-efi/30atomic
# Этот параметр заставляет partman выполнить разметку автоматически без подтверждения.
d-i partman/confirm_write_new_label     boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman-auto-crypto/erase_disks     boolean true
d-i partman-basicfilesystems/no_swap    boolean false
d-i partman-target/mount_failed         boolean true
d-i partman-partitioning/unknown_label  boolean true
d-i partman-auto/purge_lvm_from_device  string  true
d-i partman-lvm/vgdelete_confirm        boolean true
d-i partman/confirm_write_new_label     string  true
d-i partman-lvm/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

d-i base-installer/kernel/image string linux-image-generic

d-i passwd/make-user boolean true
# Учетная запись и пароль пользователя
d-i passwd/user-fullname string astra
d-i passwd/username string astra
d-i passwd/user-password password 12345678
d-i passwd/user-password-again password 12345678
# или в виде MD5 хеша.
#d-i passwd/user-password-crypted password [MD5 хеш]
d-i debian-installer/allow_unauthenticated string true

# Имя узла и имя домена
d-i netcfg/get_hostname string astra
d-i netcfg/get_domain string astradomain
d-i netcfg/get_hostname seen true
d-i netcfg/get_domain seen true

#Выбор ядра
d-i base-installer/kernel/image select linux-6.1-generic

#Пропустить сканирование дополнительного установочного носителя
d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/use_mirror boolean false

# Выбор ПО для установки
tasksel tasksel/first multiselect Base packages, Fly desktop, SSH server
tasksel tasksel/astra-feat-setup multiselect

# Выбор уровня защищенности ОС
d-i astra-additional-setup/os-check select Maximum security level Smolensk

# Выбор параметров ОС
d-i astra-additional-setup/additional-settings-smolensk multiselect Enable Mandatory Integrity Control, Enable Mandatory Access Control, Disable ptrace capability

# Подтверждение согласия с лицензионным соглашением (обязательный параметр)
astra-license astra-license/license boolean true

popularity-contest popularity-contest/participate boolean false

d-i grub-installer/only_debian boolean true

d-i grub-installer/with_other_os boolean true
# Пароль загрузчика grub
d-i grub-installer/password password 12345678
d-i grub-installer/password-again password 12345678
grub-installer grub-installer/password-mismatch error
# Не показывать последнее сообщение о том, что установка завершена.
d-i finish-install/reboot_in_progress note
d-i finish-install/exit/poweroff boolean true

d-i preseed/late_command string in-target apt purge -y ntp ; \
                                in-target systemctl enable systemd-timesyncd.service ; \
                                in-target rm -f /etc/NetworkManager/system-connections/*;

В составе дистрибутива с astra-installer

Подразумевается, что файл с новым сценарием установки astra-installer-preseed.yaml сохранен в текущем рабочем каталоге вместо preseed.cfg.(в примере это домашний каталог пользователя, куда в /cd был распакован образ установочного диска).

Рекомендуется учитывать обьем дискового пространства рабочего каталога, который будут занимать несколько создаваемых каталогов с распакованным установочным образом
  1. Создать дополнительные рабочие каталоги mnt,squashfs,edit:
    mkdir -p ~/{mnt,squashfs,edit}
  2. Включить модуль ядра squashfs:
    sudo modprobe squashfs
  3. Примонтировать установочный образ:
    sudo mount -o loop ~/<имя_установочного_образа>.iso mnt
  4. Удалить файл:
    sudo rm ~/cd/live/filesystem.squashfs
  5. Примонтировать раздел с файловой системой squashfs:
    sudo mount -t squashfs -o loop mnt/live/filesystem.squashfs squashfs/
  6. Скопировать раздел в ранее созданный рабочий каталог edit:
    sudo cp -a squashfs/* edit
  7. Скопировать файл astra-installer-preseed.yaml в каталог с системой squashfs:
    sudo cp ~/astra-installer-preseed.yaml edit/etc/
    astra-installer-preseed.yaml
    # Автоматически подтвердить согласие с лицензией
    license: true
    
    # Список доступных языков системы
    locales:
      - ru_RU
    #  - en_US
    
    # Список доступных раскладок клавиатуры
    layouts:
      - ru
      - us
    
    # Настройки комбинации клавиш для переключения раскладки клавиатуры (alt_shift_toggle, ctrl_shift_toggle, ...)
    # grp options from /usr/share/X11/xkb/rules/base.lst
    layout_switch_keys:
      - ctrl_shift_toggle
    
    # Настройки часового пояса
    timezone: Europe/Moscow
    
    # Настройки синхронизации времени (опционально)
    # Для того, чтобы служба синхронизации времени автоматически запускалась после установки ОС следует указать ntp_state: True.
    # При этом если значение параметра ntp_settings не задано, то для синхронизации будет использоваться сервер ntp1.vniiftri.ru.
    ntp_settings:
      ntp_state: True # Статус синхронизации
      ntp_server: 'ntp1.vniiftri.ru' # Сервер для синхронизации (опционально)
    
    # Настройки пользователя
    user:
      username: astra # Имя пользователя
      # Ниже приведены примеры настройки паролей пользователя и GRUB
      # Supported plain and hashed passwords (see man chpasswd and man crypt)
      password: Testastra!357
      # или
      # password-encrypted: $6$hackmehackme$ZzN7PixBxkr6xS2Mdc9rUgjBsF/HimXDXgDGM48JOq/fBnuOKIf42/wOjwR9vA/D2Blwbz.82AGwjxnyaVntX0
      # Supported plain and encrypted GRUB passwords (see man grub-mkpasswd-pbkdf2)
      grub-password: Testastra!357
      # или
      # grub-password-encrypted: <зашифрованный пароль GRUB>
    
    host:
      # Имя хоста
      hostname: astra
      # Генерировать случайный суффикс вида "-NNNNN" к имени хоста (не обязательно)
      generate_sub_name: True
    
    # Настройки репозиториев
    # При установке по сети требуется обязательно указать в данной секции удаленный репозиторий. При установке из образа определять данную секцию не обязательно
    # repos:
    #   debootstrap:
    #     name:
    #       default: "Main repository"
    #       ru_RU: "Основной репозиторий"
    #     url: 'deb https://dl.astralinux.ru/astra/stable/1.8_x86-64/repository-main/ 1.8_x86-64 main contrib non-free'
    
    # Ядро, которое будет установлено
    kernel-package: 6.1.50-1-generic
    
    # Список компонентов системы, которые будут установлены
    tasks:
      - Base
      - Fly
      - hidden
    
    # Идентификатор режима защищенности, который будет применен к устанавливаемой системе (в данном примере будет применен максимальный режим)
    mode: 2
    
    # Список дополнительных настроек (настройки безопасности), которые будут применены к устанавливаемой системе
    features:
      - astra-mic-control
      - astra-mac-control
    #  - astra-ptrace-lock
    #  - astra-sudo-control
    # Ниже приведены примеры конфигурации разметки
    
    # В данном примере разметка будет выполнена в соответствии с заранее прописанным шаблоном из указанного файла storage:
    #  # Device is enought. Default template will be used.
    #  device: /dev/sdb # Диск, к которому будет применена разметка, и на который будет установлена система
    #  template: default_template.txt # Файл шаблона разметки
    # Выбор типа таблицы разделов:
    # 1. Если не используется разметка дисков с помощью опции config, то указать тип таблицы разделов можно с помощью опций gpt и bios:
    #       gpt: True # Создать таблицу разделов GPT. Рекомендованный вариант.
    #       bios: True # Произвести установку системы в режиме совместимости с BIOS
    # 2. Если используется опция config, то тип таблицы разделов указывается в команде очистки разделов clearpart:
    #       clearpart --all --disklabel=gpt # Рекомендованный вариант
    #      или
    #       clearpart --all --disklabel=msdos
    
    # В данном примере полностью описывается шаблон разметки
    # Формат шаблона — Kickstart
    # Является аналогом ручной разметки
    # При установке в режиме UEFI требуется описать разделы, необходимые для данного режима. Пример такого описания включен в шаблон:
    # part /boot/efi --label=efi --fstype=ext2 --size=1024 --asprimary
    storage:
    # gpt: true # Выбор типа таблицы разделов. В данном примере не используется, так как далее для разметки диска используется опция confg,
    # позволяющая детально задать шаблон разметки.
    # Строки шаблона должны быть разделены последовательностью из двух символов "\n" (новая строка).  Опция config и шаблон разметки:
      config: "
        ignoredisk --only-use=sda|vda
    
        clearpart --all --disklabel=gpt
    
        bootloader --location=partition
    
        part biosboot --fstype=biosboot --size=2
    
        part /boot --label=boot --fstype=ext2 --size=1024 --asprimary
    
        part /boot/efi --label=efi --fstype=ext2 --size=1024 --asprimary
    
        part pv.lvm_part --grow --asprimary
    
        volgroup VG pv.lvm_part
    
        logvol / --fstype=ext4 --name=lv_root --vgname=VG --percent=100
    
        logvol swap --fstype=swap --name=lv_swap --vgname=VG --recommended"
    
    

    При наличии готового preseed.cfg допускается Конвертация формата debian-preseed в формат astra-preseed.


  8. Создать новую файловую систему для образа:
    sudo mksquashfs edit cd/live/filesystem.squashfs -b 1048576 -comp xz -Xdict-size 100% -e boot

    Где:

    •  edit каталог из содержимого которого будет создан архив со сжатой файловой системой  squashfs;

    • cd/live/filesystem.squashfs — выходной файл;
    • -b 1048576 устанавливает размер блока (в байтах), который будет использоваться при создании образа;
    • -comp xz — указывает использовать алгоритм сжатия `xz`. XZ — формат контейнера для архивов, использующий алгоритм сжатия LZMA2;
    • -Xdict-size 100% — задает размер словаря для алгоритма сжатия. В данном случае `100%` означает, что размер словаря будет равен размеру блока;
    • -e boot — исключает каталог /boot.
  9. Записать параметры файловой системы на образ:
    sudo du -sx --block-size=1 edit | cut -f1 | sudo tee cd/live/filesystem.size
  10. Указать имя образа последовательно выполнив команды:
    echo "custom-astra" | sudo tee cd/README.diskdefines

    Где custom-astra — имя модифицированного установочного образа.

    custom_astra-installer.sh
    #!/bin/bash
    
    # установить режим пошаговой отладки
    set -xe
    # имя установочного образа
    ISONAME="custom-astra.iso";
    
    #Для добавления пользовательского файла _astra-installer-preseed.yaml_ просим выполнить следующие действия:
    
    #1. Создать основной рабочий каталог liveCD и подкаталоги:
    mkdir -p ~/{mnt,squashfs,edit}
    
    #2. Перейти в основной рабочий каталог:
    cd ~/
    
    #3. Примонтировать live-образ:
    sudo mount -o loop ~/$ISONAME mnt
    
    #4. Удалить файл:
    sudo rm ~/cd/live/filesystem.squashfs
    
    #5. Включить модуль ядра squashfs:
    sudo modprobe squashfs
    
    #6. Примонтировать раздел с файловой системой squashfs:
    sudo mount -t squashfs -o loop mnt/live/filesystem.squashfs squashfs/
    
    #7. Скопировать раздел в ранее созданный рабочий каталог edit:
    sudo cp -a squashfs/* edit
    
    #8. Скопировать файл _astra-installer-preseed.yaml_ в каталог с системой squashfs:
    sudo cp ~/astra-installer-preseed.yaml edit/etc/
    
    #9. Создать новую файловую систему для образа:
    sudo mksquashfs edit cd/live/filesystem.squashfs
    
    #10. Записать параметры файловой системы на образ:
    sudo du -sx --block-size=1 edit | cut -f1 | sudo tee cd/live/filesystem.size

Обновление индексов

После внесения всех изменений выполнить обновление индексов репозитория:

cd ~/cd; find ! -name md5sum.txt -follow -type f -print0 | xargs -0 md5sum > md5sum.txt ; cd .

Следующее предупреждение можно игнорировать:

find: Обнаружено зацикливание в файловой системе; ...

Первичные проверки модифицированного дистрибутива

Примонтировать каталог с дистрибутивом:

sudo mount -o bind $HOME/cd /mnt

Chroot

  1. Выполнить создание chroot-образа из примонтированного дистрибутива:

    На момент последнего обновления настоящей статьи для выполнения данной проверки с использованием образа Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8) на обновлениях Astra Linux, выпущенных до очередного обновления 1.8, необходимо использовать пакеты debootstrap и debian-archive-keyring из очередных обновлений 1.7 и 1.6 в соответствии с версией очередного обновления (см. Подключение репозиториев с пакетами в ОС Astra Linux и установка пакетов).

    sudo debootstrap --components=main,contrib,non-free --arch=amd64 1.8_x86-64 chroot "file:///mnt"

Состав репозитория

  1. Создать на рабочей машине файл /etc/apt/sources.list.d/mounted.list со ссылкой на примонтированный репозиторий:

    echo "deb file:/mnt 1.8_x86-64 main contrib non-free" | sudo tee /etc/apt/sources.list.d/mounted.list

    Для более ранних версий следует указать вместо 1.8_x86-64  необходимую версию Astra Linux Special Edition, например 1.7_x86-64.

  2. Очистить кеш пакетов:

    sudo rm -fr /var/lib/apt/lists/*

  3. Обновить списки пакетов:

    sudo apt update

  4. Убедиться, что добавленные в модифицированный репозиторий пакеты доступны:

    apt policy <имя_добавленного_пакета>

  5. Удалить файл mounted.list:

    sudo rm /etc/apt/sources.list.d/mounted.list

  6. Обновить списки пакетов:

    sudo apt update

После выполнения проверок отмонтировать дистрибутив:

sudo umount /mnt

Сборка загрузочного ISO-образа модифицированного дистрибутива

  1. Извлечь сектор MBR из исходного ISO-образа дистрибутива:

    dd if=<имя_файла_с_ISO-образом> bs=1 count=432 of=isohdpfx.bin
    Извлеченный сектор будет сохранен в файле isohdpfx.bin.

  2. Перейти в директорию куда был распакован образ:
    cd cd
  3. Уточнить путь до загрузчиков для дальнейшего указания в параметрах сборки ISO-образа:
    find * -type f -name "*.img" -o -name "*.cat"
  4. Собрать модифицированный ISO-образ выполнив команду:

    1. Для Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8) с astra-installer:

      sudo xorriso -as mkisofs -joliet -partition_cyl_align "off" -iso-level 4 -full-iso9660-filenames -eltorito-boot boot/grub/bios.img -eltorito-catalog boot/grub/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info --protective-msdos-label --grub2-mbr $HOME/isohdpfx.bin -eltorito-alt-boot -efi-boot-part --efi-boot-image boot/grub/bios.img -e EFI/boot/efiboot.img -no-emul-boot -o ../my-custom-astra1_8.iso

      Где :

      • eltorito-boot — путь к загрузчику для BIOS для файловой системы загрузочных дисков по стандарту ISO 9660;

      • eltorito-catalog — путь к каталогу с GRUB для файловой системы загрузочных дисков по стандарту ISO 9660;

      • grub2-mbr — путь к сектору MBR, ранее извлеченному в isohdpfx.bin ;

      • efi-boot-image — общий путь к загрузчику для BIOS;

      • e — путь к загрузчику UEFI, файлу efiboot.img;

      • o — путь до выходного файла ISO-образа.
        Значение остальных опций см. man xorriso.

        Опция -no-emul-boot указывается дважды после файлов-загрузчиков

    2. Для Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8) с debian-installer (есть метка di в названии загруженного образа) и более ранние очередные обновления:
      sudo xorriso -as mkisofs -isohybrid-mbr isohdpfx.bin -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c isolinux/boot.cat -V "ASTRA_ISO" \
      -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat -append_partition 2 0xef cd/boot/grub/efi.img \
      -o my-custom-astra.iso ~/cd

      Где : опция -V определяет метку (volume id) создаваемого образа (в примере использована метка ASTRA_ISO), опция -o определяет имя файла, в который будет записан образ (в примере - my-custom-astra.iso).

Дальнейшая работа с модифицированным образом не отличается от работы со стандартным образом.

makeISO.sh

#!/bin/bash
#set -e;

#режим отладки
#set -x;

WORKDIR="cd";
cd  $HOME/$WORKDIR;

ISONAME="custom-astra.iso";
GRUB=`find * -type f -name "boot.cat"`;

read -p "Введите имя образа(по умолчанию custom-astra.iso): " NAME;
if [ ! -z $NAME ];  then
ISONAME="../${NAME}.iso"
fi;
# КОМАНДЫ СБОРКИ ОБРАЗОВ
function gen_iso_ai { BIOS=`find * -type f -name "bios.img"`; EFI=`find * -type f -name "efiboot.img"`; sudo xorriso -as mkisofs -joliet -partition_cyl_align "off" -iso-level 4 -full-iso9660-filenames -eltorito-boot $BIOS -eltorito-catalog $GRUB -no-emul-boot -boot-load-size 4 \
-boot-info-table --grub2-boot-info --protective-msdos-label --grub2-mbr $HOME/isohdpfx.bin -eltorito-alt-boot -efi-boot-part --efi-boot-image $BIOS -e $EFI -no-emul-boot -o ~/$ISONAME . } function gen_iso_di {
ISOEFI="boot/grub/efi.img"; cd sudo xorriso -as mkisofs -isohybrid-mbr isohdpfx.bin -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c $GRUB -V "ASTRA_ISO" \ -eltorito-alt-boot -e $ISOEFI -no-emul-boot -isohybrid-gpt-basdat -append_partition 2 0xef $WORKDIR/$ISOEFI \ -o $ISONAME ~/$WORKDIR }
# ПРОВЕРКА ВЕРСИИ УСТАНОВЩИКА ОС
CHECK=`find . -type d -name "isolinux"` if [ -z $CHECK ]; then gen_iso_ai else gen_iso_di fi