Skip to main content

Создание своего дистрибутива (Debian 11) с помощью Systemd-nspawn

sudo apt update
sudo apt upgrade


===========================================================
Установка необходимого ПО
Чтобы создать собственный дистрибутив, вам потребуется несколько инструментов. Установите их следующими командами:

sudo apt install debootstrap mmdebstrap squashfs-tools xorriso grub-pc-bin grub-efi-amd64-bin mtools systemd-container syslinux isolinux syslinux-efi

 
==========================================================
Создание базовой системы
Теперь вы готовы начать создание вашего собственного дистрибутива. Начните с создания базовой системы с помощью debootstrap:

sudo debootstrap --arch=amd64 bullseye /opt/mydistro http://deb.debian.org/debian/

---------------------------------------
Российские зеркала

debootstrap --arch=amd64 bullseye /opt/mydistro http://mirror.yandex.ru/debian/
debootstrap --arch=amd64 bullseye /opt/mydistro http://mirror.truenetwork.ru/debian/
debootstrap --arch=amd64 bullseye /opt/mydistro http://mirror.corbina.net/debian/


---------------------------------------
==========================================================
Теперь, когда у вас есть базовая система, зайдите в новую систему с помощью команды chroot:

sudo chroot /opt/mydistro


==========================================================
После этого может появиться предупреждение о локали: bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
Нужно установить как минимум локаль en_US.UTF-8 (внутри chroot не действует команда sudo)

apt-get install locales
dpkg-reconfigure locales

В списке выберите en_US.UTF-8 и нажмите Enter для подтверждения выбора. Выбор осуществляется пробелом, а на Ок надо переключиться клавишей Tab
После этого система должна успешно установить и активировать эту локаль.
Можно выбрать несколько локалей, но en_US.UTF-8 выставить локалью по умолчанию
==========================================================
Задаём пароль root

passwd root


==========================================================
Выходим из chroot

exit


==========================================================
Останавливаем службу sshd на хостовой машине (освобождается порт 22)

sudo systemctl stop sshd


==========================================================
Останавливаем службу ntp на хостовой машине (освобождается порт 123)

sudo systemctl stop ntp


==========================================================
Запуск chroot с использованием systemd-nspawn:

После установки systemd-container, можно использовать systemd-nspawn для запуска chroot с поддержкой systemd:

sudo systemd-nspawn -b -D /opt/mydistro


(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
Но для Yunohost и других сервисов, использующих фаерволл лучше эта команда:

sudo systemd-nspawn -b --capability=CAP_NET_ADMIN -D /opt/mydistro


)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

После этого вводим логин root и заданный ранее пароль
----------------------------------------------------------
!!! Если нужно корректно выйти из systemd-nspawn:
Тройное нажатие Ctrl+]: В некоторых случаях, особенно если контейнер был запущен с -b (boot), тройное нажатие Ctrl+] может вывести вас из контейнера.
==========================================================
Проверяем, что systemd запущен

systemctl


==========================================================
Для Yunohost подставляем рабочий репозиторий с PHP. Как это делается - в инструкции "Проблемы с PHP".

Устанавливаем ca-certificates

apt install ca-certificates

Обновляем пакеты

apt update


==========================================================

Устанавливаем ядро Linux и загрузчик GRUB:

apt install linux-image-amd64 grub-pc


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

apt install ca-certificates curl gnupg mc htop lsof net-tools wget


==========================================================
Устанавливаем Gnome

apt update
apt install gnome

При установке в запросе выбора языка, выбрать en
==========================================================
Устанавливаем Yunohost

wget -O /tmp/yunohost https://install.yunohost.org
/bin/bash /tmp/yunohost


==========================================================
Постустановка Yunohost

yunohost tools postinstall

Ответы на вопросы:
Main domain: yunohost.local
Admin username: yunohost
Admin full name: yunohost
New administration password: hert45ujw8p
Confirm new administration password: hert45ujw8p


==========================================================
После постустановки Yunohost опять подставит заблокированный репозиторий PHP.
Снова поменять, руководствуясь инструкцией "Проблемы с PHP"
Обновить пакеты

apt update


Устанавливаем Matrix Synapse

yunohost app install synapse --args "domain=synapse.local"


==========================================================

УДАЛЕНИЕ КОНТЕЙНЕРА

Выйдите из контейнера:
Убедитесь, что вы вышли из контейнера, если все задачи внутри контейнера завершены. Используйте команду:

exit

Остановите все процессы systemd-nspawn:
Убедитесь, что контейнер не активен и все его процессы остановлены.

Остановите systemd-nspawn:resolvectl status
Если systemd-nspawn все еще работает, остановите его, используя:

sudo machinectl poweroff mydistro

Где mydistro - это имя вашего контейнера.

Удалите файлы контейнера:
Удалите каталог, который был использован для контейнера (/opt/mydistro в вашем случае):

sudo rm -rf /opt/mydistro

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


==========================================================================
==========================================================================

ДОПОЛНИТЕЛЬНО
----------------------

Список доступных систем для debootstrap

ls -1 /usr/share/debootstrap/scripts/

Установка через debootstrap в chroot системы Ubuntu 20.04

# sudo apt-get install ubuntu-keyring (на Debian не сработает)
sudo debootstrap --arch=amd64 focal /opt/mydistro_ub http://archive.ubuntu.com/ubuntu/

После создания и запуска контейнера systemd-nspawn, надо включить там интернет этими командами:

systemctl enable systemd-resolved
systemctl start systemd-resolved
systemctl status systemd-resolved
resolvectl dns enp0s3 8.8.8.8 8.8.4.4  # (вместо enp0s3 ставим нужный сетевой интерфейс, находим его с помощью ip a)
resolvectl status

Далее надо добавить репозитории

echo "deb http://archive.ubuntu.com/ubuntu focal main restricted universe multiverse" | sudo tee /etc/apt/sources.list
echo "deb http://archive.ubuntu.com/ubuntu focal-updates main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list
echo "deb http://archive.ubuntu.com/ubuntu focal-backports main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list
echo "deb http://archive.ubuntu.com/ubuntu focal-security main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list

Обновляем список пакетов

apt update

==========================================================================
==========================================================================

СОЗДАНИЕ ДИСТРИБУТИВА
----------------------

Создайте tar-архив файловой системы контейнера

sudo tar --numeric-owner -cvpzf debian-custom.tar.gz -C /opt/mydistro .

Подготовьте структуру для ISO-образа и скопируйте туда содержимое архива:

mkdir -p iso/custom
sudo tar -xvpzf debian-custom.tar.gz -C iso/custom


Для создания ISO-образа с поддержкой загрузки через BIOS и UEFI, вам нужны файлы vmlinuz, initrd.img, isolinux.bin, ldlinux.c32, и efi.img. Вот, как их получить:


1. Получение vmlinuz и initrd.img

Эти файлы можно найти в установленной системе Debian или загрузить из Debian netboot.
Из установленной системы:

Обычно они находятся в каталоге /boot:

cp /boot/vmlinuz-* iso/custom/vmlinuz
cp /boot/initrd.img-* iso/custom/initrd.img

Из Debian netboot:

Скачайте файлы из Debian netboot.

wget http://ftp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux -O iso/custom/vmlinuz
wget http://ftp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz -O iso/custom/initrd.img

2. Получение isolinux.bin и ldlinux.c32

Эти файлы можно получить из пакета syslinux:

mkdir -p iso/custom/{isolinux,live}
# sudo apt-get install syslinux
cp /usr/lib/ISOLINUX/isolinux.bin iso/custom/isolinux/
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 iso/custom/isolinux/
cp /usr/lib/syslinux/modules/bios/menu.c32 iso/custom/isolinux/
cp /usr/lib/syslinux/modules/bios/libutil.c32 iso/custom/isolinux/


Скачайте ядро и initrd из Debian netboot репозитория:

mkdir -p /tmp/debian-netboot
cd /tmp/debian-netboot
wget http://ftp.debian.org/debian/dists/bullseye/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux -O vmlinuz
wget http://ftp.debian.org/debian/dists/bullseye/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz -O initrd.img

cd /home/имя_пользователя

Скопируйте скачанные файлы ядра и initrd в директорию live:

cp /tmp/debian-netboot/vmlinuz iso/live/
cp /tmp/debian-netboot/initrd.img iso/live/


3. Создание efi.img с помощью grub-mkstandalone

Создайте файл efi.img с помощью команды grub-mkstandalone:

sudo apt-get install grub-efi-amd64-bin
mkdir -p iso/custom/boot/grub
grub-mkstandalone --format=x86_64-efi --output=iso/custom/boot/grub/efi.img \
  --locales="" --fonts="" "boot/grub/grub.cfg=grub.cfg"

4. Создание файла конфигурации grub.cfg

Создайте файл grub.cfg в текущем каталоге (где выполняется команда):

cat <<EOF >grub.cfg
set timeout=10
menuentry "Install Debian" {
   linux /vmlinuz boot=live
   initrd /initrd.img
}
EOF

5. Создание файла конфигурации isolinux.cfg

Создайте файл isolinux.cfg:

cat <<EOF >iso/custom/isolinux/isolinux.cfg
UI menu.c32
PROMPT 0
TIMEOUT 50
DEFAULT custom

LABEL custom
    MENU LABEL Boot Custom Debian
    KERNEL /live/vmlinuz
    APPEND initrd=/live/initrd.img boot=live
EOF

6. Создание ISO-образа

Теперь, когда все файлы на месте, можно создать ISO-образ:

xorriso -as mkisofs -o custom-debian.iso -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
  -c isolinux/boot.cat -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table \
  -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat \
  iso/custom

Эти шаги должны обеспечить успешное создание ISO-образа с поддержкой загрузки через BIOS и UEFI.