Данная статья применима к:
- 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 с включенным МКЦ - привилегий суперпользователя с высоки уровнем целостности) требуются только для установки пакетов, монтирования носителей (если используется) и операции записи созданного образа на носитель.
Подготовка компьютера
Для выполнения дальнейших действий на компьютере, на котором будут создаваться модифицированные образы::
- В Astra Linux Special Edition x.8 подключить расширенный репозиторий, в более ранних обновлениях подключить репозиторий со средствами разработки. Порядок подключения репозиториев см. в статье Подключение репозиториев с пакетами в ОС Astra Linux и установка пакетов .
- Установить необходимые пакеты:
sudo apt install reprepro xorriso build-essential debootstrap
Создание распакованной копии установочного диска
Далее предполагается, что образ установочного диска загружен в домашний каталог текущего пользователя и что все действия выполняются в этом домашнем каталоге. Для распаковки загруженного образа:
Создать подкаталог для распаковки:
mkdir ~/cd
Распаковать ISO-образ в созданный каталог:
xorriso -osirrox on -indev путь_к_файлу.iso -extract / cd
Для выполнения дальнейших модификаций разрешить запись в распакованные файлы:
chmod -R +w ~/cd
В результате этого шага в подкаталоге /cd
домашнего каталога текущего пользователя будет создан подкаталог /cd
с копией содержимого образа установочного диска, и будет разрешено вносить изменения в содержимое этой копии.
Создание и пакетизация собственного ключа для подписания измененного установочного образа
Создание собственного ключа
Зафиксировать имя, которое будет использоваться в ключе. Обычно в качестве такого имени применяют адрес электронной почты, который для повторного применения удобно экспортировать в переменную окружения:
например:mail="<адрес_электронной_почты>"
mail="support@organization.ru"
- Создать конфигурационный файл
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
Выполнить генерацию ключа используя созданный конфигурационный файл:
опции команды:gpg --batch --gen-key gen-key.cfg
--batch
— генерация ключа без запросов подтверждений;--gen-key
— команда генерации ключа;gen-key.cfg
— конфигурационный файл с параметрами генерации ключа.Экспортировать созданный ключ в файл с именем
<адрес_электронной_почты>.gpg.key
(удобно опять использовать значение ранее созданной переменной окружения mail):опции команды:gpg --armor --output "$mail.gpg.key" --export "$mail"
--armor
— экспорт в формате ASCII;--output "$mail.gpg.key"
— имя файла, в котором сохраняется экспортированный ключ (в имени файла используется значение ранее созданной переменной окружения);--export "$mail"
— указание операции (экспорт) и имя экспортируемого объекта (используется значение ранее созданной переменной окружения).Импортировать экспортированный ключ в комплект ключей:
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8):
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/astra-archive.gpg --import "$mail.gpg.key"
- Astra Linux Special Edition x.7 и более ранние очередные обновления:
sudo gpg --no-default-keyring --keyring /usr/share/apt/astra-archive.gpg --import "$mail.gpg.key"
Далее копия созданного ключа, находящаяся в комплекте ключей Astra Linux, будет использована для подписания измененного репозитория установочного диска.
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8):
Пакетизация собственного ключа
debian-installer/allow-unauthenticated=true в файл /boot/grub/grub.cfg.
Для того, чтобы подпись репозитория, сделанная собственным публичным ключом, могла быть проверена при установке операционной системы с модифицированного носителя собственный публичный (открытый) ключ должен быть включен в репозитории установочного диска. Это можно сделать оформив примитивный UDEB-пакет:
Экспортировать публичный ключ в файл:
в данном случае экспорт выполняется в двоичном формате, а не в формате ASCII.gpg --output "$mail.gpg" --export "$mail"
Установить права доступа на файл с экспортированным публичным ключом:
sudo chmod 644 "$mail.gpg"
- Создать UDEB-пакет для включения собственного открытого ключа в модифицированный дистрибутив. Для примера далее используется имя пакета
aptkey
:Для удобства работы сохранить имя пакета в переменной окружения:
package="aptkey"
Создать подкаталог для размещения пакета:
mkdir -p "$package/DEBIAN"
Создать файл
$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"
Создать файл
$package/DEBIAN/postinst
постустановочного сценария (сценарий нечего не делает, возвращая код завершения 0 (успешное окончание) и присвоить файлу со сценарием разрешение на выполнение:echo "exit 0" > "$package/DEBIAN/postinst"
chmod 0755 "$package/DEBIAN/postinst"
Создать и наполнить структуру каталогов с данными пакета:
экспортированный публичный ключ помещается в каталог пакета "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
Собрать пакет:
dpkg-deb --build "$package"
Экспортированный публичный ключ переместить в каталог доверенных ключей рабочей системы:
sudo mv "$mail.gpg" /etc/apt/trusted.gpg.d/
Изменение состава пакетов в репозитории
Создать каталог для временной копии репозитория. Для примера использовано имя каталога
/cache
:mkdir -p cache
Переместить в созданный временный каталог DEB- и UDEB-пакеты из копии установочного диска:
find cd/pool -name \*.deb -print -exec mv {} cache \;
find cd/pool -name \*.udeb -exec mv {} cache \;
Переместить (или скопировать) в созданный временный каталог ранее созданный пакет с собственным ключом:
mv "$package.deb" "cache/${package}_1.0.deb"
Очистить копию установочного диска от ненужных каталогов:
rm -rf $HOME/cd/{db,dists,pool}
Выполнить модернизацию состава пакетов дистрибутива:
Добавить во временный каталог собственные пакеты.
Удалить во временном каталоге ненужные пакеты.
Создать в каталоге с копией установочного диска подкаталог
~/cd/conf
:mkdir -p ~/cd/conf
Создать конфигурационный файл
~/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
. При использовании других дистрибутивов параметры конфигурации должны быть откорректированы.
Далее:
Инициализировать репозиторий:
reprepro -b cd/ export 1.8_x86-64
Выгрузить ключ для подписи репозитория:
gpg --yes --armor -o ~/cd/dists/1.8_x86-64/Release.gpg -sb ~/cd/dists/1.8_x86-64/Release
Наполнить репозиторий пакетами, сохраненными во временном каталоге
/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
Обновить файл с контрольными суммами:
Предупреждениеcd ~/cd; find ! -name md5sum.txt ! -name gostsums.txt -follow -type f -print0 | xargs -0 md5sum > md5sum.txt ; cd ..
find: Обнаружено зацикливание в файловой системе; ...
можно игнорировать.
Восстановить структуру ссылок репозитория:
ln -s 1.8_x86-64 ~/cd/dists/stable
Удалить ненужный каталог
~/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
при установке:
- При использовании установочных носителей созданных на USB-накопителях (на модифицируемых носителях) для замены файла
preseed
:- Примонтировать носитель.
- Скопировать заменяющий файл (например,
preseed.cfg
) в корень установочного носителя. Внести в файл
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
- Отмонтировать накопитель.
- При использовании немодифицируемых установочных носителей (CD-ROM, DVD-ROM) заменяющий файл можно предоставить с помощью USB-накопителя:
- Подготовить накопитель:
Подключить USB-накопитель к компьютеру.
Отформатировать USB-накопитель файловой системой
vfat
без создания дискового раздела:При форматировании все данные с накопителя будут удалены.
При форматировании использовать имя накопителя (например, sdh), а не имя дискового раздела (sdh1).sudo mkfs.vfat -I /dev/<имя_накопителя>
Примонтировать накопитель.
Скопировать заменяющий
preseed
файл на накопитель.- Отмонтировать накопитель.
При установке ОС:
Выбрать язык установки.
Не нажимая <Enter> выбрать способ установки (графический или текстовый).
Нажать <F2>. Откроется список выбора параметров ядра.
Нажать <Esc>. Список выбора параметров ядра закроется, и можно будет непосредственно редактировать строку параметров ядра.
В строку параметров ядра добавить указание файла
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
Нажать <Enter>.
- Подготовить накопитель:
Как упоминается ранее, при таком использовании полная автоматизация не обеспечивается, и всегда придется согласиться с лицензией и выбрать клавиши переключения языка. Порядок дальнейшей установки определяется указанным файлом preseed.cfg.
В составе дистрибутива с debian-installer
debian-installer
(есть метка di в названии загруженного образа) и для более ранних очередных обновлений.Далее подразумевается, что действия выполняются в домашнем каталоге пользователя, загрузочный образ уже распакован в подкаталог cd домашнего каталога пользователя, и файл с новым сценарием установки preseed.cfg
сохранен в домашнем каталоге пользователя. Общий порядок действий для одного образа initrd:
- Распаковать файлы загрузчика ранее распакованного модифицируемого образа из рабочего каталога.
- Произвести замену файла
preseed.cfg
в составе распакованных файлов загрузчика. - Запаковать файлы загрузчика модифицируемого образа:
Образы 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:
В составе дистрибутива с astra-installer
Подразумевается, что файл с новым сценарием установки astra-installer-preseed.yaml
сохранен в текущем рабочем каталоге вместо preseed.cfg.(в примере это домашний каталог пользователя, куда в /cd
был распакован образ установочного диска).
- Создать дополнительные рабочие каталоги
mnt,squashfs,edit:
mkdir -p ~/{mnt,squashfs,edit}
- Включить модуль ядра
squashfs
:sudo modprobe squashfs
- Примонтировать установочный образ:
sudo mount -o loop ~/<имя_установочного_образа>.iso mnt
- Удалить файл:
sudo rm ~/cd/live/filesystem.squashfs
- Примонтировать раздел с файловой системой
squashfs
:sudo mount -t squashfs -o loop mnt/live/filesystem.squashfs squashfs/
- Скопировать раздел в ранее созданный рабочий каталог
edit
:sudo cp -a squashfs/* edit
- Скопировать файл
astra-installer-preseed.yaml
в каталог с системойsquashfs
:sudo cp ~/astra-installer-preseed.yaml edit/etc/
При наличии готового
preseed.cfg
допускается Конвертация формата debian-preseed в формат astra-preseed. - Создать новую файловую систему для образа:
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
—-Xdict-size 100%
— задает размер словаря для алгоритма сжатия. В данном случае `100%` означает, что размер словаря будет равен размеру блока;-e boot
— исключает каталог/boot
.
- Записать параметры файловой системы на образ:
sudo du -sx --block-size=1 edit | cut -f1 | sudo tee cd/live/filesystem.size
- Указать имя образа последовательно выполнив команды:
echo "custom-astra" | sudo tee cd/README.diskdefines
Где
custom-astra
— имя модифицированного установочного образа.
Обновление индексов
После внесения всех изменений выполнить обновление индексов репозитория:
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
Выполнить создание 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"
Состав репозитория
Создать на рабочей машине файл
/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
.Очистить кеш пакетов:
sudo rm -fr /var/lib/apt/lists/*
Обновить списки пакетов:
sudo apt update
Убедиться, что добавленные в модифицированный репозиторий пакеты доступны:
apt policy <имя_добавленного_пакета>
Удалить файл
mounted.list
:sudo rm /etc/apt/sources.list.d/mounted.list
Обновить списки пакетов:
sudo apt update
После выполнения проверок отмонтировать дистрибутив:
sudo umount /mnt
Сборка загрузочного ISO-образа модифицированного дистрибутива
Извлечь сектор MBR из исходного ISO-образа дистрибутива:
Извлеченный сектор будет сохранен в файлеdd if=<имя_файла_с_ISO-образом> bs=1 count=432 of=isohdpfx.bin
isohdpfx.bin
.- Перейти в директорию куда был распакован образ:
cd cd
- Уточнить путь до загрузчиков для дальнейшего указания в параметрах сборки ISO-образа:
find * -type f -name "*.img" -o -name "*.cat"
Собрать модифицированный ISO-образ выполнив команду:
Для 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
указывается дважды после файлов-загрузчиков
- Для 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
).
Дальнейшая работа с модифицированным образом не отличается от работы со стандартным образом.