make menuconfig на Arch безопасен, если запускать его в собственном дереве исходников ядра и собирать результат через makepkg. Схема простая: получи исходники, сгенерируй стартовый конфиг из /proc/config.gz, открой меню, сохрани изменения и собери пакет командой makepkg -e. Рабочее ядро при этом не трогается, пока новое не готово.
Дистрибутивное ядро Arch собрано с широким набором модулей, но не со всеми. Иногда нужной опции в нём нет: драйвер для конкретного устройства выключен, или модуль собран как built-in, а тебе нужен именно модуль. В таких случаях ядро пересобирают.
make menuconfig это текстовый интерфейс конфигурации ядра на базе ncurses. Он показывает все опции Kconfig и позволяет переключать их без ручного редактирования .config. Это самый наглядный способ: дерево опций, поиск по имени символа, подсказки прямо в интерфейсе.
Когда это реально нужно:
Перед тем как пересобирать ядро, проверь, что нужного модуля действительно нет. Команда modinfo <имя> покажет, установлен ли модуль в системе. Иногда модуль уже есть, просто не загружается, и тогда ядро пересобирать не нужно. А если драйвер поставляется отдельным пакетом, например через DKMS, хватит установить его. Подробнее про динамические модули есть в статье «DKMS: динамические модули».
Полный процесс сборки своего ядра разобран в статье «Сборка своего ядра за 5 шагов». Здесь фокус на самом menuconfig и на том, как не потерять конфиг. Если ещё не решил, какое ядро брать за основу, посмотри «Какое ядро выбрать: linux, lts, zen, hardened».
Главное правило: никогда не запускай menuconfig в дереве исходников, которое ты не собираешь сам. Если просто распаковать исходники в /tmp и открыть меню, изменения никуда не денутся, но пользы от них ноль: собрать ядро из этого дерева ты не сможешь, а конфиг потеряется при очистке.
Нужно дерево, из которого ты реально соберёшь пакет. Два пути:
sudo pacman -S asp
asp export linux
cd linux
Первый путь проще: ты получаешь готовый PKGBUILD от пакета linux, а значит, сборка пройдёт по проверенным правилам: правильные флаги, правильные имена файлов, правильный prepare().
Также понадобятся base-devel и зависимости сборки ядра:
sudo pacman -S base-devel
Никогда не начинай с пустого конфига. В нём сотни опций, вручную их не перебрать. Возьми за основу конфиг текущего ядра Arch:
zcat /proc/config.gz > .config
Это работает, если в ядре включён CONFIG_IKCONFIG_PROC. В стандартном ядре Arch он включён, так что файл будет. Если /proc/config.gz пустой или отсутствует, собери конфиг по умолчанию:
make defconfig
defconfig даст базовый конфиг, но он сильно беднее конфига Arch. Лучше раздобыть именно конфиг Arch: он лежит в /usr/src/linux/config после установки пакета linux-headers, либо в дереве исходников после asp export.
Файл .config это обычный текст: строки вида CONFIG_ИМЯ=значение. Его можно читать и править вручную, но menuconfig удобнее: он показывает описание каждой опции и не даёт опечататься в имени символа.
Важно: конфиг должен лежать в корне дерева исходников и называться .config. Именно этот файл читает menuconfig.
Запуск:
make menuconfig
Откроется ncurses-интерфейс. Навигация: стрелки двигают курсор, Enter открывает подменю, пробел переключает состояние опции, Esc выходит на уровень выше.
Состояния опции:
Y: встроить в ядро (built-in);M: собрать как модуль;Когда выбирать Y, а когда M? Встроенные драйверы нужны для того, что загружается до монтирования корня: контроллер диска, файловая система корневого раздела, сеть для NFS-корня. Всё остальное лучше собирать как модули: они подгружаются по требованию и не раздувают ядро. Если сомневаешься, оставляй значение из конфига Arch.
Поиск по символу запускается клавишей /. Например, чтобы найти опцию NVMe, нажми /, введи NVME и Enter. Поиск покажет, где опция находится и в каком она состоянии. Это удобно, когда не знаешь, в каком подменю прячется нужный драйвер.
После изменений выбери Save и подтверди имя файла .config. Без сохранения изменения пропадут.
Если ncurses-интерфейс неудобен, есть альтернатива: make nconfig, тот же конфигуратор, но с другим оформлением. Логика та же: те же опции, тот же файл .config.
Вот безопасный порядок, который не заставляет пересобирать ядро с нуля каждый раз.
Шаг 1. Подготовь дерево и конфиг:
asp export linux
cd linux
zcat /proc/config.gz > .config
Шаг 2. Запусти makepkg без сборки:
makepkg -o
Флаг -o означает «только fetch и prepare». Исходники скачаются, prepare() выполнится, но компиляция не начнётся. Внутри prepare() PKGBUILD пакета linux копирует свой конфиг в .config, поэтому твой конфиг перезапишется. Это нормально: дальше ты откроешь menuconfig уже в готовом дереве.
Шаг 3. Открой menuconfig в каталоге исходников:
cd src/linux-* # версия может отличаться
make menuconfig
Внеси изменения и сохрани.
Шаг 4. Собери пакет, пропустив prepare:
cd ../..
makepkg -e
Флаг -e (--existing) говорит makepkg: каталог src уже готов, не выполняй prepare заново, используй то, что там лежит. Твой .config останется нетронутым, и сборка пойдёт с ним.
Это ключевой момент. Если запустить makepkg без -e, prepare() снова перезапишет .config конфигом по умолчанию, и все твои изменения из menuconfig пропадут. Поэтому порядок всегда такой: makepkg -o, потом правка конфига, потом makepkg -e.
Полная сборка ядра занимает от десяти минут до часа в зависимости от процессора. Поэтому и нужен makepkg -e: он не пересобирает то, что уже готово, и не трогает твой конфиг.
Альтернатива: прописать конфиг прямо в PKGBUILD через переменную _config. В PKGBUILD пакета linux есть строка _config=config, которая указывает на файл конфига в каталоге пакета. Можно заменить этот файл своим и не трогать menuconfig вовсе. Но для разовых экспериментов menuconfig удобнее.
Сборка ядра использует файл .config в корне дерева исходников. Но в пакет linux конфиг попадает не сам по себе: prepare() копирует его в нужное место, а после сборки он устанавливается как /usr/src/linux/config.
Если ты менял конфиг вручную после prepare(), убедись, что файл называется именно .config и лежит в корне дерева src/linux-*. Именно его make читает при сборке.
Ещё один момент: имя конфига. В PKGBUILD пакета linux переменная _config указывает на файл config (без точки) в каталоге пакета. Это исходник конфига, из которого prepare() делает .config. Если хочешь зафиксировать свой конфиг надолго, скопируй его в этот файл:
cp src/linux-*/.config config
Тогда даже полная пересборка с prepare() не потеряет твои настройки.
Чтобы отличать своё ядро от стандартного, добавь суффикс в CONFIG_LOCALVERSION. В menuconfig это General setup → Local version. Например, -custom. Тогда uname -r покажет что-то вроде 6.12.1-arch1-1-custom, и ты сразу поймёшь, какое ядро загружено.
Когда makepkg -e закончил работу, в каталоге появится пакет linux-6.x.x-x-x86_64.pkg.tar.zst. Установи его:
sudo pacman -U linux-*.pkg.tar.zst
Пакет сам пересоберёт initramfs через mkinitcpio при установке. Но grub.cfg лучше перегенерировать вручную:
sudo grub-mkconfig -o /boot/grub/grub.cfg
Перезагрузись и проверь, что загрузилось именно твоё ядро:
uname -a
Проверь, что нужный модуль доступен:
modinfo <модуль> | head
И что опция реально включена в конфиг:
zgrep CONFIG_<ИМЯ> /proc/config.gz
Значение y: встроено, m: модуль, пусто: выключено.
Если система не загрузилась, не паникуй. В меню GRUB выбери предыдущее ядро из списка и загрузи старое. После этого разберёшься, что пошло не так: посмотри journalctl -b -1 для прошлой загрузки.
Откат простой: переустанови стандартный пакет:
sudo pacman -S linux
Он вернёт штатное ядро, а твоё останется в /boot до следующей очистки. Как чистить старые ядра, описано в статье «Чистка старых ядер и initramfs». Если хочешь держать два ядра рядом постоянно, смотри «Двойная установка: общее ядро».
Само меню ничего не ломает: оно только правит .config. Опасность в сборке и установке. Если новое ядро не загрузится, старое останется в /boot, и ты вернёшься к нему через меню GRUB. Поэтому перед экспериментом не удаляй старые ядра.
Флаг -e (--existing) говорит makepkg: каталог src уже готов, не выполняй prepare и не пересобирай зависимости. Это экономит время и, главное, не трогает твой .config. Без -e prepare() перезапишет конфиг значением по умолчанию.
Значит, в ядре выключен CONFIG_IKCONFIG_PROC. Возьми конфиг из /usr/src/linux/config (ставится с linux-headers) или используй make defconfig. Для большинства задач defconfig хватит, но он не повторяет настройки Arch.
Пакет linux делает это сам через mkinitcpio при установке. Если ты менял встроенные драйверы, от которых зависит загрузка (например, драйвер корневого диска), проверь, что initramfs собрался без ошибок. Подробности про хуки есть в статье «mkinitcpio подробно: хуки и модули».
zgrep CONFIG_ИМЯ /proc/config.gz
Значение y: встроено, m: модуль, пусто: выключено.
make menuconfig на Arch безопасен, если соблюдать три правила: работать в собственном дереве исходников, начинать с конфига текущего ядра и собирать через makepkg -e, чтобы prepare не перезаписал твои изменения. Сохраняй конфиг в файл config из PKGBUILD, добавляй CONFIG_LOCALVERSION, чтобы отличать своё ядро, и держи под рукой стандартный пакет linux для отката. Тогда эксперименты с ядром превращаются из лотереи в предсказуемый процесс.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии