Сразу к делу: каждой системе в dualboot нужно своё ядро и свой initramfs, а вот EFI-раздел можно спокойно делить на двоих. Общее ядро экономит место, но превращает обновление одной системы в лотерею для второй: initramfs собирается под конкретный корень, и при разных файловых системах или шифровании общий образ просто не загрузит соседа. Гибрид выглядит так: один ESP на обе системы, у каждой свои vmlinuz и initramfs, а загрузчик либо один общий, либо два независимых.
Три типичных сценария.
Два Arch на одном диске. Рабочая система плюс тестовая: вторая нужна для экспериментов с пакетами, конфигами и ядрами. Обе стоят на одном диске, и рука тянется сэкономить: зачем дублировать ядро, если версии совпадают? Раскладка двух установок на одном диске разобрана в статье «Два Arch на одном диске».
Arch + другой дистрибутив с GRUB. Ubuntu или Fedora ставят свой GRUB в ESP, и он умеет находить чужие системы через os-prober. Возникает соблазн оставить один загрузчик и одно ядро на всех.
Arch + Windows. Windows не читает Linux-разделы, поэтому об общем ядре речи нет, но общий ESP здесь стандартная практика. Про этот сценарий есть отдельный разбор в статье «Один EFI-раздел для dualboot».
Во всех трёх случаях вопрос один: что делить, только ESP или ещё и ядро с initramfs.
Общее ядро значит, что обе системы используют один файл /boot/vmlinuz-linux и один /boot/initramfs-linux.img. Для этого /boot монтируется в общий раздел, а версии ядра в обеих системах совпадают. Загрузчик использует один образ, и обе системы стартуют с него.
Плюсы честные:
Минусы перевешивают:
Конкретный пример: обе системы на ext4, без шифрования, версии ядра совпадают. Обновляешь ядро в первой, хук mkinitcpio пересобирает initramfs под её корень. Вторая система при следующей загрузке получает образ, собранный под чужой UUID, не находит свой раздел и падает в emergency mode. Чинится это только пересборкой initramfs из второй системы, а для этого нужен chroot с live-USB.
Дело в initramfs. Это не просто архив с модулями: внутри лежит логика, которая находит корневой раздел и монтирует его. Параметры root= и cryptdevice= передаются загрузчиком, но сам initramfs собирается под конкретную систему через mkinitcpio.
Если у систем разные корни, одна на ext4, другая на btrfs, общий initramfs обязан уметь монтировать обе. Технически это достижимо, но при каждом обновлении ядра mkinitcpio пересобирает образ только для своей системы. Вторая получает образ, собранный под чужой корень, и падает в emergency mode.
С шифрованием ещё хуже. У каждой LUKS-системы свой cryptdevice=UUID=..., и один initramfs не знает, какой раздел разблокировать. Общее ядро с шифрованным корнем не работает в принципе.
Отдельная боль: обновления. Пакет linux в каждой системе запускает свой хук mkinitcpio, который пересобирает initramfs в своём /boot. При общем /boot хуки пишут в один каталог и перезаписывают друг друга. Кто обновился последним, тот и владеет образом.
Рекомендуемая схема: ESP общий, ядра раздельные. Каждая система хранит свои vmlinuz и initramfs в своём /boot, а ESP монтируется в /boot/efi. Раскладка выглядит так:
/dev/nvme0n1p1 ESP FAT32 /boot/efi общий для обеих систем
/dev/nvme0n1p2 корень первой системы
/dev/nvme0n1p3 корень второй системы
Каждая система ставит свой загрузчик в ESP, но с разными идентификаторами. Для GRUB:
# в первой системе
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
# во второй системе
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB2
В ESP появятся два каталога: EFI/GRUB и EFI/GRUB2. UEFI покажет две записи загрузки, и каждая система грузится своим загрузчиком. Никто никого не перезаписывает.
Пара команд, и картина ясна. Сначала посмотри, куда монтируется /boot в каждой системе:
findmnt /boot
lsblk -f
Если у обеих систем /boot указывает на один и тот же раздел, ядра общие. Если на разные разделы или на каталог внутри корня, раздельные. Второй вариант и есть целевой: /boot лежит в корневом разделе каждой системы, а ESP монтируется отдельно в /boot/efi.
Проверь и содержимое. В раздельной схеме у каждой системы свой vmlinuz-linux и свой initramfs-linux.img. Если файлы лежат в разных местах, обновление одной системы не трогает другую.
Главная ошибка: дважды запустить grub-install с одинаковым --bootloader-id. Второй вызов перезапишет grubx64.efi первого, и одна из систем потеряет загрузчик. Отсюда правило: разные --bootloader-id или один общий менеджер загрузки.
Если хочется, чтобы GRUB первой системы показывал обе, добавь в /etc/grub.d/40_custom пункт, который подхватывает конфиг второй:
menuentry "Arch 2" {
configfile (hd0,gpt3)/boot/grub/grub.cfg
}
(hd0,gpt3) это корневой раздел второй системы, подставь свой. Такой приём называется цепочкой конфигов: один GRUB передаёт управление другому, не дублируя записи о ядрах.
Общий менеджер загрузки удобнее. systemd-boot или rEFInd сканируют ESP и показывают оба ядра в одном меню. Для systemd-boot достаточно положить в /boot/loader/entries/ два файла:
/boot/loader/entries/arch.conf первая система
/boot/loader/entries/arch-test.conf вторая система
Каждый entry указывает на своё ядро и свой корень:
title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=UUID=первой-системы rw
Второй entry то же самое, но с UUID второй системы. systemd-boot сам найдёт оба файла и покажет два пункта меню. Установка загрузчика простая:
bootctl install
При такой схеме ESP монтируется прямо в /boot, и ядра лежат на нём же. Обе системы пишут свои vmlinuz в один каталог, поэтому следи, чтобы имена файлов не совпадали. Например, вторая система может использовать пакет linux-lts, и тогда её файлы называются vmlinuz-linux-lts и initramfs-linux-lts.img. Два entry с разными именами не конфликтуют. Сравнение загрузчиков для такого сценария в статье «systemd-boot против GRUB: второе ядро».
Windows не мешает схеме. Общий ESP уже содержит загрузчик Windows, а GRUB находит его через os-prober. В новых версиях GRUB os-prober выключен по умолчанию, поэтому сначала включи его в /etc/default/grub:
GRUB_DISABLE_OS_PROBER=false
Затем перегенерируй конфиг:
grub-mkconfig -o /boot/grub/grub.cfg
os-prober увидит и Windows, и вторую Linux-систему. Настройка os-prober с Windows разобрана в статье «os-prober и GRUB: Windows».
Честный ответ: почти никогда. Единственный случай, когда общее ядро работает без боли, это две системы с одинаковой файловой системой корня, без шифрования и с одинаковыми параметрами загрузки. Тогда initramfs одной системы смонтирует корень другой. Но выгода копеечная: ядро с initramfs занимает сотню-другую мегабайт, а риск сломать обе системы одним обновлением остаётся.
Если корень зашифрован, общее ядро запрещено. У каждой LUKS-системы свой cryptdevice=UUID=..., и один initramfs физически не разблокирует два разных раздела. Здесь только раздельные ядра.
Сводная рекомендация простая. Одинаковая файловая система корня и нет шифрования: общее ядро технически возможно, но проще держать раздельные. Разные файловые системы или шифрование: только раздельные ядра. Windows в паре: общий ESP, ядра свои. Любая схема с общим ядром требует одинаковых параметров загрузки, а это хрупкая конструкция.
Отдельная история: второе ядро для отладки внутри одной системы. Это не dualboot, а диагностический инструмент: ставишь linux-lts рядом с основным ядром и грузишься в него при проблемах. Разбор в статье «Второе ядро для отладки».
Пакет linux в каждой системе запускает свой хук mkinitcpio, который пересобирает initramfs в своём /boot. При раздельных ядрах хуки не пересекаются: каждая система обновляет только свои файлы. При общем /boot они пишут в один каталог, и последнее обновление перезаписывает чужой образ.
Хук срабатывает автоматически при установке пакета linux, отдельно ничего запускать не нужно. Если ядро обновилось, а initramfs остался старый, пересобери его вручную:
mkinitcpio -P
В раздельной схеме эта команда в каждой системе трогает только её собственные файлы.
Старые ядра при этом копятся в /boot обеих систем. Если каталог общий, мусора вдвое больше, а на ESP с FAT32 место ограничено. Чистка старых ядер и initramfs разобрана в статье «Чистка старых ядер и initramfs».
Нет. initramfs собран под конкретный корень: внутри зашиты модули и логика монтирования именно этого раздела. Скопированный образ смонтирует чужой корень только по случайному совпадению параметров. Проще поставить пакет linux в каждой системе отдельно.
Обычно нет. ESP на FAT32, типичный размер 512 МБ. Два ядра, два initramfs и загрузчик Windows занимают немного. Проблемы начинаются, если не чистить старые ядра: каждая система копит свои, и место кончается незаметно.
Нет. os-prober нужен, когда один GRUB должен сам находить чужие системы. При двух независимых загрузчиках каждая система грузится своей записью в UEFI, и os-prober не требуется.
Вторая система получит новый vmlinuz, но initramfs пересоберётся под корень первой. При загрузке второй системы образ не найдёт её корень и уронит систему в emergency mode. Именно поэтому общее ядро это плохая идея.
Можно. Один GRUB с os-prober найдёт обе системы и Windows. Но после каждого обновления ядра в любой из систем придётся перегенерировать grub.cfg из той системы, которой принадлежит загрузчик, иначе меню устареет. Два независимых загрузчика избавляют от этой рутины.
Общее ядро для двух систем это экономия, которая не стоит риска. Дели ESP, но не дели ядро: у каждой системы свои vmlinuz и initramfs, а загрузчик один общий или два независимых с разными --bootloader-id. С шифрованным корнем раздельные ядра обязательны. Такая схема переживает обновления, откаты и эксперименты без сюрпризов.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии