Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

Двойная установка: общее ядро или раздельное?

Сразу к делу: каждой системе в 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 монтируется в общий раздел, а версии ядра в обеих системах совпадают. Загрузчик использует один образ, и обе системы стартуют с него.

Плюсы честные:

  • меньше места на диске: один vmlinuz вместо двух;
  • один путь обновления: обновил ядро в одной системе, вторая тоже получила новое.

Минусы перевешивают:

  • обновление в одной системе ломает вторую, если та не готова к новому ядру;
  • initramfs собирается под один корень, и второй системе он не подходит;
  • откат ядра превращается в квест: вернуть старое ядро нужно сразу в обеих системах.

Конкретный пример: обе системы на 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, но свои ядра?

Рекомендуемая схема: 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?

Главная ошибка: дважды запустить 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?

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».

Частые вопросы

Можно ли скопировать vmlinuz и initramfs из одной системы в другую?

Нет. initramfs собран под конкретный корень: внутри зашиты модули и логика монтирования именно этого раздела. Скопированный образ смонтирует чужой корень только по случайному совпадению параметров. Проще поставить пакет linux в каждой системе отдельно.

Общий ESP переполнится от двух систем?

Обычно нет. ESP на FAT32, типичный размер 512 МБ. Два ядра, два initramfs и загрузчик Windows занимают немного. Проблемы начинаются, если не чистить старые ядра: каждая система копит свои, и место кончается незаметно.

Нужен ли os-prober, если обе системы Arch?

Нет. os-prober нужен, когда один GRUB должен сам находить чужие системы. При двух независимых загрузчиках каждая система грузится своей записью в UEFI, и os-prober не требуется.

Что будет, если обновить ядро в одной системе при общем ядре?

Вторая система получит новый vmlinuz, но initramfs пересоберётся под корень первой. При загрузке второй системы образ не найдёт её корень и уронит систему в emergency mode. Именно поэтому общее ядро это плохая идея.

Можно ли оставить один GRUB для обеих систем?

Можно. Один GRUB с os-prober найдёт обе системы и Windows. Но после каждого обновления ядра в любой из систем придётся перегенерировать grub.cfg из той системы, которой принадлежит загрузчик, иначе меню устареет. Два независимых загрузчика избавляют от этой рутины.

Полезные ресурсы

Заключение

Общее ядро для двух систем это экономия, которая не стоит риска. Дели ESP, но не дели ядро: у каждой системы свои vmlinuz и initramfs, а загрузчик один общий или два независимых с разными --bootloader-id. С шифрованным корнем раздельные ядра обязательны. Такая схема переживает обновления, откаты и эксперименты без сюрпризов.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max