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

  • 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 РУСБ.10015-01 очередное обновление 1.7. Модификация подразумевает изменение состава 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 bsdtar reprepro xorriso build-essential debootstrap

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

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

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

    mkdir ~/cd

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

    bsdtar -xf <имя_файла_с_образом> -C ~/cd

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

    chmod -R +w ~/cd

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

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

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

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

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

  2. Создать конфигурационный файл gen-key.cfg с параметрами генерации ключа. Содержимое файла:


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


    Создать такой файл можно следующей командой (в качестве имени владельца ключа используется имя 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. Импортировать экспортированный ключ в комплект ключей Astra Linux:

    sudo gpg --no-default-keyring --keyring /usr/share/apt/astra-archive.gpg --import "$mail.gpg.key"
    Далее копия созданного ключа, находящаяся в комплекте ключей Astra Linux, будет использована для подписания измененного репозитория установочного диска.

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

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

Для того, чтобы подпись репозитория, сделанная собственным ключом, могла быть проверена при установке операционной системы с модифицированного носителя собственный ключ должен быть включен в репозитории установочного диска. Это можно сделать оформив примитивный  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 для восстановления репозитория:

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

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

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

    reprepro -b cd/ export 1.7_x86-64

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

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

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

    reprepro --ask-passphrase -Vb cd includedeb  1.7_x86-64 cache/*.deb
    reprepro --ask-passphrase -Vb cd includeudeb 1.7_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.7_x86-64 ~/cd/dists/stable

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

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

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

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

Для замены файла preseed.cfg:

При использовании модифицируемых носителей

USB-носители с файловой системой iso9660 модифицируемыми не являются. Такие носители создаются копированием образа установочного диска на носитель командой dd. Такой носитель можно только скопировать на диск, распаковать, модифицировать и перепаковать модифицированную копию, после чего перезаписать носитель модифицированной копией. 

При использовании модифицируемых установочных носителей (на модифицируемых носителях) для замены файла preseed:

  1. Примонтировать носитель.
  2. Скопировать заменяющий файл (например, preseed.cfg) в корень установочного  носителя;
  3. Внести изменения в файлы с параметрами загрузки ядра, указав там заменяющий файл с учетом того, что при поиске файла носитель будет смонтирован в каталог /cdrom, то есть файл будет доступен по пути /cdrom/preseed.cfg и его указание будет задаваться подстрокой preseed/file=/cdrom/preseed.cfg:

    1. Для загрузки EFU изменения внести в файл 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
    2. Для загрузки BIOS изменения внести в файлы isolinux/txt.cfg и isolinux/gtk.cfg в строки с параметрами загрузки ядра (начинаются со слова append), например:
      append initrd=/install.amd/initrd.gz vga=788 quiet modprobe.blacklist=evbug astra_install=1 nomodeset netcfg/disable_autoconfig=false net.ifnames=0 preseed/file=/cdrom/preseed.cfg
  4. Отмонтировать накопитель.

При использовании немодифицируемых носителей

При использовании немодифицируемых установочных носителей (CD-ROM, DVD-ROM, USB-накопитель с файловой системой iso9660 без его перезаписи) заменяющий файл можно предоставить с помощью 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.

Данный способ работает как при загрузке EFI, так и при загрузке BIOS.

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

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

Этот вариант замены preseed обеспечивает полную автоматизацию при установке, никакие вопросы задаваться не будут.

Подразумевается, что файл с новым сценарием установки preseed.cfg сохранен в текущем каталоге. Подробнее про сценарии установки см. Автоматическая установка Astra Linux Special Edition 1.7.

Далее приведен сценарий выполняющий действия по замене файла preseed.cfg, находящегося в составе дистрибутива:

  1. Распаковываются загрузочные образы из копии дистрибутива. Для распаковки создается временный каталог, который далее используется в качестве рабочего;
  2. В распакованных образах файл preseed.cfg заменяется новым файлом;
  3. Образы упаковываются и помещаются в копию установочного диска.

Сценарий:

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
Состав каталогов, содержащих загрузочные образы (и, соответственно, файл pressed.cfg), различается в разных дистрибутивах, в частности может отсутствовать каталог hd-media. 

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

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

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

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

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

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


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

    sudo mount -o bind $HOME/cd /mnt

Chroot


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

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

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

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

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

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

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

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

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

    sudo apt update

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

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

  5. Удалить файл /etc/apt/sources.list.d/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. Создать модифицированный ISO-образ:

    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 "WIKI_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 wiki_iso.iso ~/cd
    В приведенном примере опция -V определяет метку (volume id) создаваемого образа (в примере использована метка WIKI_ISO), опция -o определяет имя файла, в который будет записан образ (в примере - wiki_iso.iso). Значение остальных опций см. man xorriso.

  3. Опционально: удалить файл isohdpfx.bin:

    rm isohdpfx.bin

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