Эта статья — сквозное продолжение моей предыдущей части тык. Если вам нужно понять, как запускать систему без grub, первая часть может стать необязательной.
Короткая рекурсия: в первой части мы собрали свой собственный образ системы и запаковали его в squashfs-архив mate-rootfs.sqfs. Во второй части мы установим этот образ себе на диск как основную операционную систему, где загрузчиком выступит сама материнская плата.
Наш собранный архив не является live-системой. Прежде чем делать какие-либо операции, перенесите образ в сеть, ftp-хранилища или на другой диск. Вследствие чего нам понадобится usb-флешка с записанной live-системой, неважно какая, главное — успешно загрузиться до рабочего стола или консоли (кому как удобно). В нашем случае будет использован официальный загрузочный образ debian stable с рабочим столом mate вместо терминала. тык
В моем частном случае я использовал ventoy, но сути это не меняет: нам нужно запустить live-образ, загрузившись до рабочего стола:

На этом этапе все как в обычном дистрибутиве Linux. Выбираем свою сеть (если по проводу — можно пропустить), вводим пароль и подключаемся к интернету, если образ лежит на удаленном хранилище. Если лежит на другом разделе, то просто его монтируем, кликнув на иконку диска в файловом менеджере caja.
Вот здесь и начинается установка. Открываем mate-terminal, вводим sudo -s для получения перманентной root-сессии, создаем папку mkdir /media/rootfs. Монтируем наш образ командой mount /media/rootfs /path/to/mate-rootfs.sqfs note: папка точки монтирования может быть произвольной, но один раз я смонтировал диск в /mnt, а после перезагрузки данные магически пропали. Может, недоглядел, разное бывает, но я предупреждал!

Сейчас будет немного душно: установщики calamares привстали, деды-сисадмины устали. Кто знает, как размечать, или у кого диск уже размечен — переходим ниже. Узнаем имя нашего целевого диска командой lsblk, например /dev/nvme0n1, и создаем на нем новую gpt-разметку диска parted /dev/diskname mklabel gpt . В правильной очередности создаем нужные файловые системы и ставим флаги:
parted /dev/diskname mkpart "" fat32 1MiB 769MiB parted /dev/diskname set 1 esp on # флаг для efi что раздел загрузочный # efi раздел, размер большой, там будет лежать наше ядро
Размечаем наш корневой диск с единым /home и корнем:
parted /dev/diskname mkpart "" ext4 769MiB -10GiB
note: 10 гигов. 768МБ отбрасываем от начала, 10 гигов отнимаем с конца. Если не нужен swap-раздел, пишите без аргумента -10GiB.
Маркируем наши 10 гигов как swap-раздел:
parted /dev/diskname mkpart "" linux-swap -10GiB 100%
Остается только форматирование размеченных областей в файловые системы строго по очередности:
mkfs.vfat -F 32 /dev/disknamep1 mkfs.ext4 /dev/disknamep2 mkswap /dev/disknamep3

Смонтированный образ нас заждался, приступаем к нему. Делаем еще один mkdir, но для конечной точки нашего путешествия: mkdir /media/target, и монтируем в папку раздел, отформатированный в ext4, например: mount /media/target /dev/disknamep2 note: p2 — это сам раздел на нашем диске. На других дисках может быть sda, sdb, но логика та же, конечная цифра — номер раздела.
Копируем все, что содержит наш собранный rootfs:
cp -a --preserve=ALL /media/rootfs/* /media/target # сохраняя все права доступа
После копирования системы нам нужно создать в ней пользователей и задать пароли. Мы не будем ставить пакеты в систему, монтировать VFS ядра (/dev /proc /sys) необязательно. Делаем chroot /media/target, создаем своего пользователя командой adduser, после пишем passwd root и создаем пароль для root-пользователя, выходим из нашего окружения командой exit и переходим к нашему efistub.
Сначала еще раз создадим папку в /media, но уже с целью монтирования нашего efi-раздела: mkdir /media/efistb, и смонтируем раздел в нее: mount /media/efistb /dev/disknamep1. Важно: копируем ядро из нашего распакованного rootfs: /boot/vmlinuz-* и сгенерированный рамдиск initrd.img-* рядом с ним в папку /media/efistb/EFI/boot (если внутри раздела нет папок, нужно создать). Дальше для простоты переименовываем наше ядро в vmlinuz.efi, а его рамдиск — в initrd.img.

Наша материнская плата должна знать, где лежит наше ядро. Для внесения изменений в nvram и регистрации нового загрузчика нам потребуется efibootmgr. В загрузочном образе debian в кэше apt уже лежит нужный нам пакет, его можно поставить без интернета:
apt install -y efibootmgr
Делаем запись в nvram:
efibootmgr --create --disk /dev/disknameX --part Y --label "linux loader" --loader '/EFI/boot/vmlinuz.efi' --unicode "root=UUID=your root id here rw initrd=\EFI\boot\initrd.img"
Выглядит страшно, но всё просто. --disk — расположение, где находится наш диск; --part — номер раздела на диске /dev/diskname, где лежит наше ядро vmlinuz.efi; --label — метка названия в биосе при выборе, что запускать; --loader — путь к нашему ядру; --unicode делает запись в юникод-формате (эмодзи не пробовал, забавно было бы). Само ядро без своего рамдиска упадет в панику. Далее идут аргументы запуска ядра, те самые cmdline из загрузчика grub: root=UUID= — путь к нашей корневой системе (вспоминаем его uuid или запускаем заново blkid и записываем свое значение); rw — монтирование корня на чтение/запись; initrd=\EFI\boot\initrd.img — путь к нашему рамдиску. note: В старых мануалах или в ответах от ИИ (куда уж без этого попугая) могут встречаться пути вида '\\EFI\boot\\vmlinuz.efi' в опции --loader. Это уже устарело: если так внести запись, она забьется бинарщиной и загрузка станет невалидной. efibootmgr сам переведет unix-формат в dos, но это правило не касается аргументов ядра.
Переходим к заполнению файла fstab в нашем rootfs, по умолчанию там пусто. Его нужно заполнить базовым содержимым: открываем его в nano /etc/fstab и вносим запись:
# Основной диск (корневой раздел ext4) UUID=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d / ext4 defaults,noatime 0 1 # EFI раздел (fat32, монтируется обычно в /boot/efi нужно для более легкого обновления ядра) UUID=A1B2-C3D4 /boot/efi vfat defaults 0 2 # swap раздел в конце диска UUID=f9e8d7c6-b5a4-3f2e-1d0c-9b8a7f6e5d4c none swap sw 0 0
Понятно, что значения примерочные: вызываем blkid и вписываем свои uuid, остальное не трогаем.
Все важные операции выполнены. Просто перезагружаемся из нашей live-системы. Если всё сделано правильно, у нас появится имя, заданное из --label, в списке загрузки биоса. Ставим его первым и загружаемся!

Итого: вот и подошел к концу цикл постройки нашего debian-корча с нуля. Прошли путь от архива с системой до полностью функционального и обезжиренного debian, попутно загрузив наше ядро без посредников-загрузчиков. При такой сборке система настолько маленькая, что нет даже sudo — нужен древний и забытый всеми su -l. На каждый чих система будет требовать пароль, но корч требует жертв. В конце концов, система на диске весит смешные по нашим меркам 2.4 гигабайта. Про обновление ядра, не забыл, тут ничего нового, просто скопируйте и замените старые файлы новыми и перезагрузитесь.
От автора: Вместо
mate-coreможно поставитьcinnamon-core, лично таким дистрибутивом пользуюсь на постоянной основе.
Комментарии (3)

AVX
22.07.2026 15:36Есть один минус в такой системе - привязка к конкретной материнке. С обычным grub2 я один из жестких дисков переносил на множество разных компов, и всегда без проблем загружалось, без необходимости настраивать загрузчик или вносить что-то там в EFI или BIOS.
Granulex
Схема с EFIstub красивая, добавлю один практический момент про откат. Без grub у вас нет меню с запасным ядром: первое же неудачное обновление ядра приводит к чёрному экрану без вариантов. Лечится вторым UEFI-пунктом через efibootmgr, указывающим на заведомо рабочее ядро – получаете ту же страховку, что давал grub, только без самого grub. И стоит помнить, что часть прошивок чистит или переставляет записи в NVRAM после сброса или севшей батарейки CMOS, и загрузочный пункт может тихо исчезнуть.
executionerrok Автор
Помню платы gigabyte иногда забывают строчки загрузки на ровном месте. Касается только efibootmgr, с виндовым загрузчиком или grub проблем небыло