Gentoo i686 и PAE


На днях при сборке Chromium столкнулся со странной проблемой: на моей машине с 9Гб оперативной памяти как-то не хватило 3Гб свободных ресурсов для быстрой сборки пакета. После проверки через free мои опасения подтвердились: моя система действительно работает только с третью оперативной памяти. Причина тому нашлась достаточно быстро: дело в том, что при начальной сборке Gentoo я выбрал носитель, который вообще у нас предназначался для VPS. Конечно же, на VPS с 1Гб оперативной памяти это замечательный вариант, но вот для рабочей машины, наверное, все-таки лучшим вариантом был бы x86_64. Так или иначе, новую установку делать было уже некогда, но я вспомнил Debian, где на i686 поддерживается и большее количество памяти, чем 3Гб.

Причиной тому в Debian'е использование PAE. Если кратко, то этот механизм позволяет использовать объемы памяти, свойственные 64-битным системам, на системе 32-битной. Включается PAE на Gentoo достаточно легко и никаких проблем после этого не наблюдается, однако придется пересобирать ядро. Прежде всего, давайте отметим те параметры ядра, которые нужно заменить:

CONFIG_X86_PAE=y
CONFIG_X86_32=y
CONFIG_HIGHMEM4G=n
CONFIG_HIGHMEM64G=y

Люди пишут также, что нужно установить в «n» и параметр «CONFIG_M686», однако у меня и без этого все отлично заработало. Есть два варианта изменить эти параметры и пересобрать с ними ядро Linux:
1. Выгрузка текущих параметров ядра в файл и его последующая корректировка,
2. Корректировка параметров непосредственно во время работы genkernel, запущенного с параметром «--menuconfig».

Для начала рассмотрим первый вариант.
1.1. Выгружаем параметры ядра в файл «/root/kernel.config»:

zcat /proc/config.gz > /root/kernel.config

1.2. Редактируем полученный файл в более привычном и удобном текстовом редакторе (можно и в графическом, но только чтобы не добавлялся BOM и не менялась кодировка):
nano /root/kernel.config

Обратите внимание, что некоторые параметры могут быть закомментированы и к ним в таком случае будет прибавлено «is not set» в конце строки. В таком случае убираем диез, а «is not set» меняем на «=y/=n». Кстати, параметры, которые должны иметь отрицательное значение все-таки тоже обязательно объявлять, так как отсутствие явного включения не означает того, что параметр при сборке будет отключен.
1.3. Сохраняем параметры и запускаем пересборку ядра:
genkernel --kernel-config=/root/kernel.config all

На данном этапе многие (посмотрите форумы и будете удивлены) теряются и используют вместо «--kernel-config» просто «--config». Объясняю: первый вариант передает сборщику параметры сборки ядра, второй же — параметры самого сборщика, которые нам менять не нужно. Когда мы передаем в параметре «--config» настройки ядра, genkernel просто падает, что некоторые воспринимают как баг, хотя это вовсе не так.
1.4. Не забываем после завершения работы genkernel обновить и зависимые от ядра модули:
emerge --ask @module-rebuild

Без этого после перезагрузки у вас может отвалиться видеокарта, звук или сеть.
1.5. Перезагружаем машину и если что-то пошло не так (у меня, к примеру, начинает мигать экран на этапе запуска X11 и авторизоваться не выходит в консоли) выбираем при загрузке в grub'е другие параметры, а затем «Recovery mode», после чего получаем доступ в полноценную консоль и исправляем допущенные ошибки.

Второй способ немного проще, но для того, чтобы им пользоваться, нужно хорошо ориентироваться в меню.
2.1. Выгружаем параметры ядра в файл «/usr/src/linux/.config»:

zcat /proc/config.gz > /usr/src/linux/.config

2.2. Вызываем genkernel с меню функций ядра:
genkernel --menuconfig all

2.3. По умолчанию подгружается наш «/usr/src/linux/.config». Ищем нужные параметры и меняем их значение (если не можете что-то найти, жмите на «/» и вводите название параметра без «CONFIG_». Напрямую вы никуда не попадете, но программа покажет вам схематически где нужно искать.
2.4. После редактирования настроек необходимо сохранить полученный файл, причем в качестве пути для сохранения необходимо указывать просто «.config». Если сохранить настройки куда-то в другое место, то пересборка не будет иметь смысла, так как произойдет с теми же параметрами, которые в вашем ядре итак есть.
2.5. По аналогии с первым способом пересобираем зависимые от ядра модули:
emerge --ask @module-rebuild

После перезагрузки выполняем «free» и любуемся на полностью доступный объем виртуальной памяти. Если после этого ничего не изменилось, посмотрите, с какими параметрами в настоящий момент собрано ядро и убедитесь в том, что настройки были изменены. Если все правильно, то обратите внимание на объем памяти при запуске компьютера. Если там столько же, сколько и в Linux'е, то смотреть нужно уже в аппаратную сторону: быть может, некоторые модули неисправны, а кроме этого некоторые материнские платы сами по себе пе поддерживают крупные объемы оперативной памяти (сверьтесь с руководством к вашей материнской плате).


10.01.2016, 22:29
  Linux, Gentoo, RAM.
Просмотров: 3317.