Установка Astra Linux на Raspberry pi 4

aodu1ydx0x7xdvn7rxhheliu9_m.png

Здравствуйте меня зовут Федоров Михаил и являюсь сертифицированным преподавателем Астра Линукс в учебном центре Эврика.

В прошлом году в целях более глубоко изучения Линукс систем и для эксперимента я приобрёл три платы rpi4. Они прекрасно мне служили и выполняли поставленные задачи, пока мне в голову не пришла мысль -, а почему бы не поставить на них астру, чтобы ещё глубже погрузиться в настолько любимую мной операционную систему.

Мной двигал чисто интерес к процессу и желание сделать то, что ещё никто не делал (но про это позже), но это не означает что вы не сможете применить малинки в своем проде, как минимум из них может быть очень хорошая основа тонкого клиента для пользовательской станции или очень бюджетный кластер для вашего разработчика.  На отечественной операционной системе, так ещё и с сертификатами безопасности.

Переходим непосредственно к поставленной задаче: поставить astra linux на rpi4
Казалось бы, что может быть проще?

Качаешь образ img и записываешь его на карту памяти.

А вот тут начинается самое интересное. В свободном доступе образов для записи на карту памяти нет :-(.

Единственный вариант, который мне подсказали в чате Астра Линукс, это запрашивать rootfs для записи на карту памяти через их менеджера.

Также стоит отметить у Астры есть версия для arm архитектуры и обозначается она как 4.7, где 4 → это код дистрибутива под архитектуру arm, а 7 — версия (подробнее про версии астры нужно читать на их Вики [https://wiki.astralinux.ru/pages/viewpage.action? pageId=53646577]) на данный момент последняя версия которая есть в репозиторий stable 4.7.6 (обновление 4.7.7 на подходе вот-вот будет)

Версии х.7 основаны на debian 10. Версии х.8 уже основаны на debian 12 (почему же не взять астру 4.8.1 раз она должна быть более новой и с новыми плюшками, а все потому что релиза 4.8 ещё не было иначе я бы писал именно про него).

Ну хорошо, мы выяснили что астра под нужную архитектуру существует и даже выяснили что есть кейсы её работы на rpi4 (по крайней мере представитель астры в их чате заявлял, что образ у них рабочий, хотя и не показал :(Привет, Роман). Значит задача теперь у нас простая нужно просто понять, как установить астру.

Казалась бы, что может быть проще…

Хоть астра и готова работать под arm, но установщик который идёт на установочном диске 4.7.5 заточен под установку системы с загрузчиком grub. Тут у нас появляются на самом деле два пути.

Первый способ
Установить астру на виртуальную машину (или любой компьютер с arm процессором) и просто перенести потом все файлы на нужную карту памяти, после чего научить загрузчик rpi4 правильно грузить астру. И именно этот вариант я бы советовал рассмотреть если будете использовать астру в продакшне (потому что во время установки отрабатывает довольно большое количество скриптов которые готовят систему работать с СЗИ астры).

Но этот вариант мне не совсем подходил, потому что единственные машины с arm которые у меня были это малинки, на которые эту астру и нужно поставить (парадокс, однако). Создавать виртуальную машину на компьютере, у которого архитектура x86_64 и заставлять его крутить машину на arm оказалось очень ресурсоемким занятием требующим, к тому же терпения, поэтому этот способ отложил как запасной вариант (но повторю ещё раз: если хотите заморачиваться меньше, то просто ставьте систему в виртуалке на arm с обычного установочного диска астры по стандартной инструкции. Отдел boot лучше выкинуть на отдельный раздел, так как его содержимое, а именно загрузчик grub вам потом будет не нужен, и после этого копируете установленную систему на карту памяти)

Поэтому я стал думать дальше. И все оказалось довольно просто.

А давайте установим операционную систему из под другой операционной системы.
Такой опыт у меня уже имелся и по моим меркам был весьма удачен (тогда я делал бездисковую загрузку астры по сети чтобы все её файлы были в оперативной памяти, и чтобы система работала без диска, так ещё чтобы работал парсек, но это совсем другая история).
Учитывая мой прошлый удачный опыт с такой установкой, я решил попробовать и установить систему с помощью утилиты debootstrap[https://wiki.debian.org/Debootstrap]
Этот инструмент позволяет установить минимальную операционную систему (как понятно из названия debian систему) в директорию на вашей основной операционной системе.
Как вы понимаете ставится минимальная система, в которую потом можно сделать chroot и до установить остальные компоненты. С установкой системы разобрались теперь давайте поговорим про загрузчик rpi4.

Для загрузки rpi4 (ну как я понимаю также как и для загрузки rpi3) нужно на отдельном разделе который FAT который будет помечен как загрузочный разместить файлы необходимые для загрузки, а именно ядро, инитрд и файлы прошивки rpi.

Таким образом задача простая:
            1) Разметить карту памяти на два раздела загрузочный и основной;
            2) Установить систему в основанной раздел;
            3) Зачрутиться в корень удавливаемой системы и выполнить установку ядра и генерацию инитрд, ну и в бонус создать пользователя админа и установить графику;
            4) Перезагрузиться в новую операционную систему и выполнить базовую настройку СЗИ (А то какая это астра если не будет Смоленска)

Для начала стоит отметить что для того чтобы debootstrap можно было запустить уже должна быть система из под которой я буду его использовать, для этого я просто взял образ debian 12 img и установил его на вторую малинку (вы можете делать это и с одной).

Установим parted и mtools для того чтобы разметить карту памяти и установить метки.

sudo apt install parted 
sudo apt install mtools

Размечать диск будем следующим образом 2 раздела
Первый → загрузочный раздел с меткой system-boot и размером примерно 500 МБ

Второй → диск для с системой, метка writable, занимает всё оставшееся место

sudo parted /dev/sda --script mktable msdos mkpart primary fat32 1MiB 501MiB mkpart primary ext4 501MiB 100%

sudo mkfs.vfat /dev/sda1 
sudo mkfs.ext4 /dev/sda2

sudo parted /dev/sda set 1 boot on

sudo mlabel -i /dev/sda1 ::system-boot
sudo e2label /dev/sda2 "writable"

Логично что для установки астры обычный debootstrap который есть в дебиан нам не подойдет, по этому поставим в нашу систему ту версию что лежит в репозитории астры (Первый раз в жизни когда ставлю пакеты из астры в дебиан, а не наоборот)
Ставим его:

wget https://dl.astralinux.ru/astra/stable/4.7_arm/repository-update/pool/main/d/debootstrap/debootstrap_1.0.132astra3+ci2_all.deb 

sudo apt install ./debootstrap_1.0.132astra3+ci2_all.deb 

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

cat << END > /etc/apt/sources.list
# Основной репозиторий - аппаратно-зависимый компонент и компоненты общего назначения:
deb [trusted=yes] https://dl.astralinux.ru/astra/stable/4.7_arm/repository-main/     4.7_arm main contrib non-free
 
# Актуальное оперативное обновление основного репозитория
deb [trusted=yes] https://dl.astralinux.ru/astra/stable/4.7_arm/repository-update/   4.7_arm main contrib non-free
 
# Базовый репозиторий
deb [trusted=yes] https://dl.astralinux.ru/astra/stable/4.7_arm/repository-base/     4.7_arm main contrib non-free
END

sudo apt update
sudo apt install deboostrap

Ставить систему будем на /dev/sda2, по этому монтируем его в /mnt/media/root

А sda1 (где будут файлы для загрузчика поместим в /mnt/media/root/boot/firmware)

sudo mkdir -p /mnt/media/root
sudo mount /dev/sda2 /mnt/media/root
sudo mkdir -p  /mnt/media/root/boot/firmware
sudo mount /dev/sda1 /mnt/media/root/boot/firmware

И запускаем установку:

sudo debootstrap --include ncurses-term,mc,locales,nano,gawk,lsb-release,acl,perl-modules-5.28 --components=main,contrib,non-free 4.7_arm /mnt/media/root http://dl.astralinux.ru/astra/stable/4.7_arm/repository-main

Монтируем в каталог /mnt/media/root каталоги proc, sys, dev, чтобы можно было сделать chroot

sudo bash << END
mount --make-rslave --rbind /proc /mnt/media/root/proc 
mount --make-rslave --rbind /sys /mnt/media/root/sys 
mount --make-rslave --rbind /dev /mnt/media/root/dev 
mount --make-rslave --rbind /run /mnt/media/root/run 
mount --make-rslave  --rbind /dev/pts /mnt/media/root/dev/pts
END

sudo chroot /mnt/media/root /bin/bash

Дальше наши команды уже будут выполняться из под пользователя рут который зачрутился в каталог /mnt/media/root.

Для работы с репозиториями по https нужно поставить два пакета:
apt-transport-https
ca-certificates
Сейчас у нас в sources.list прописан только один репозиторий (http://dl.astralinux.ru/astra/stable/4.7_arm/repository-main) который мы указали при использовании утилиты debootstrap

apt update
apt install apt-transport-https ca-certificates -y

После чего пропишем репозитории доступные по https

cat << END > /etc/apt/sources.list  
deb https://dl.astralinux.ru/astra/stable/4.7_arm/repository-main 4.7_arm main contrib non-free 
deb https://dl.astralinux.ru/astra/stable/4.7_arm/repository-update 4.7_arm main contrib non-free 
deb https://dl.astralinux.ru/astra/stable/4.7_arm/repository-base 4.7_arm main contrib non-free 
# deb https://dl.astralinux.ru/astra/stable/4.7_arm/repository-extended 4.7_arm main contrib non-free
END

apt update && apt dist-upgrade -y

Теперь перейдем к установке базовых утилит

Установим локаль и настроим клавиатуру

apt install locales console-setup bash-completion dialog -y
dpkg-reconfigure locales 
dpkg-reconfigure keyboard-configuration

Установим sudo после создадим пользователя sa и группу astra-admin и пропишем их в sudoerc

apt install sudo
useradd -m -s /bin/bash sa
groupadd astra-admin
usermod -aG astra-admin,sudo sa
echo '%astra-admin    ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers 

Теперь настроим fstab для того чтобы systemd правильно монтировал наши разделы. (помним про то что мы ставили метки на разделы и именно на основе меток будем делать монтирование)

cat << END > /etc/fstab 
LABEL=system-boot /boot/firmware vfat defaults 0 1
LABEL=writable / ext4 defaults 0 1 
END

Поставим ядро для нашей системы и сгенерируем initrd для этого ядра.
Я буду ставить шестое ядро как самое последнее что есть в версии x.7

apt install linux-image-6.1-generic linux-astra-modules-6.1.90-1-generic --no-install-recommends -y 

Теперь запустим тасксел для того чтобы установить оставшиеся компоненты для системы (при своих первых попытках я столкнулся с особенностью: при установке пакетов из задачи base, почему-то цеплялись пакеты связанные с fly и ставилась еще и графика, но возможно я просто наговариваю на непогрешимую астру и сам дурак нажал куда-то не туда), поэтому приведу некоторый костыль с помощью которого можно поставить все пакеты из задачи base, но посмотреть какие рекомендованные будут установлены через apt

sudo apt install $(sudo tasksel --task-packages Base| xargs echo)

Ну, а для остальных просто будем использовать tasksel

tasksel install Base

И для графики

tasksel install Fly

Еще я поставлю ssh и сервер xrdp для того чтобы иметь удаленный доступ к машине

apt install ssh xrdp -y

Также нужно заблокировать некоторые модули которые будут мешать графическому интерфейсу

cat << END > /etc/modprobe.d/blacklist-astra.conf 
# Astra blacklist
blacklist vc4
blacklist simpledrm
END

sudo update-initramfs -k all -u && sudo cp /boot/initrd.img-6.1.90-1-generic /boot/firmware/initrd.img-6.1.90-1-generic

На самом деле работа с модулями ядра была самой долгой работой, потому что графика не хотела стартовать от слова совсем.
Я и никак не мог понять как правильно заставить её работать и буквально методом «тыка» нашел конфликтующие модули.

На этом установка системы закончена и дальше нужно настроить загрузчик.

Для начала скачаем файлы прошивки хорошо что они есть в репозитории астры.
Стоит отметить, что с первого раза у меня система не завелась, пока я не подкинул её сразу все файлы из репозитория https://github.com/raspberrypi/firmware

Но в целом файлы прошивок есть, а в пакете linux-firmware-raspi
`apt install linux-firmware-raspi
Распаковываются они в директорию /usr/lib/linux-firmware-raspi

mkdir /boot/firmware/overlays
cp /usr/lib/linux-firmware-raspi/* /boot/firmware/
cp /usr/lib/firmware/6.1.90-1-generic/device-tree/broadcom/bcm2711-rpi-4-b.dtb /boot/firmware/

Скачаем с гитхаба файлы overlays

cd
apt install git -y
git clone --depth=1 https://github.com/raspberrypi/firmware.git
cd firmware/boot/overlays
cp * /boot/firmware/overlays

Теперь займемся конфигами
Создадим конфиг /boot/firmware/config.txt

cat << END > /boot/firmware/config.txt
dtoverlay=vc4-kms-v3d

arm_64bit=1
enable_uart=1
kernel=vmlinuz-6.1.90-1-generic
initramfs initrd.img-6.1.90-1-generic

max_framebuffers=2
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=82
hdmi_pixel_encoding=2
framebuffer_depth=32
framebuffer_width=1920
framebuffer_height=1080
END

И конфиг cmdline

cat << END > /boot/firmware/cmdline.txt
console=tty0 console=ttyS1,115200 root=LABEL=writable rw fsck.repair=yes net.ifnames=0  rootwait
END

На этом можно заканчивать подготовку и пытаться загружаться в новую систему, для того чтобы уже в ней настроить СЗИ.

От монтируем pts, dev, sys, proc

sudo bash << END
umount /mnt/media/root/dev/pts
umount /mnt/media/root/dev
umount /mnt/media/root/sys
umount /mnt/media/root/proc
umount /mnt/media/root/run
umount /mnt/media/root/boot/firmware
umount /mnt/media/root
END

И теперь попытаемся загрузиться с карты памяти.

При входе в систему обнаружим что рабочий стол синим.

udnxn8fddp9orb6dqbix3csiuuk.png

Это значит что мы запустили систему по низким уровнем целостности. В данном случае у нас фактически орел. давайте это исправлять.

sudo pdpl-user -i 63 sa

cat << END > /boot/firmware/cmdline.txt 
console=tty0 console=ttyS1,115200 root=LABEL=writable rw fsck.repair=yes net.ifnames=0 parsec.max_ilev=63 rootwait
END

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

Теперь включаем МКЦ. Так как каталог /boot/firmware включает в себя файлы с файловой системой FAT, то нужно добавить его в исключения для успешной проверки целостности системы.

sudo -i

cat << END >> /etc/parsec/fs-ilev.conf 
exc     /boot/firmware/*
exc     /boot/firmware
END

exit

И включаем МКЦ
sudo set-fs-ilev enable Проверим статус sudo set-fs-ilev status -v

И поставим правильную лицензию

sudo -i

cat << END > /etc/astra_license 
MODE=2
DESCRIPTION=maximum(smolensk)
URL=https://astralinux.ru/information/licenses
END

exit

После делаем перезагрузку и радуемся результату.

ylhrovqgpukn-mups42--qbipyu.png

Также в ходе эксплуатации понял что у меня не правильно настроен механизм policyKit-1 по этому пришлось его вызвать и переназначить группу системных администратор на astra-admin.

llfhieeipngopr2ehvjluomsiro.png

Что бы не проходить этот процесс каждый раз при необходимости ставить систему на новую малинку. Можно с этой карты памяти снять образ и после уже раскатывать его на нужные устройства.
Также для большего удобства установки можно добавить механизм cloud-init.

Это был весьма интересный опыт, в попытках запустить Astra Linux на rpi4. Дело в том что нормальной инструкции по установке я не нашел, да и нигде не было информации что она будет работать.
Но даже не смотря на всё это я практически с нуля прошёл процесс установки системы и теперь лучше понимаю что происходит на каждом этапе.

© Habrahabr.ru