Спрашивается, почему бы не научиться делать то же самое и с ядром Linux? Причины собирать ядро Linux из исходников, в общем то, те же — получение самой свежей версии ядра, срочное применение security-патчей, оптимизация под конкретные задачи и конкретное железо, а также желание принятие участие в разработке ядра, пусть даже в роли QA.

Важно! Следование инструкциям из этого поста может привести к потере ваших данных. Делайте бэкапы и помните, что делаете вы все исключительно на свой страх и риск. Все описанное ниже было проверено на Ubuntu 14.04 LTS. Но на других версиях Ubuntu, а также других дистрибутивах Linux, отличия должны быть минимальными.

Настраиваем загрузчик

Правим /etc/default/grub примерно таким образом:

GRUB_DEFAULT =0
# GRUB_HIDDEN_TIMEOUT=10
# GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT =10
GRUB_DISTRIBUTOR =` lsb_release -i -s 2 > / dev/ null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT ="quiet splash"
GRUB_CMDLINE_LINUX =""

После правки говорим:

sudo update-grub

В результате перед загрузкой системы в течение 10 секунд будет предлагаться выбрать ядро, с которым вы хотите загрузиться. Очень удобно, если вы что-то напутали с конфигурацией ядра и хотите загрузиться с предыдущей версией!

Ставим зависимости

Нам понадобятся как минимум следующие пакеты:

sudo apt-get install git gcc make bc fakeroot dpkg-dev \
libncurses5-dev libssl-dev

На многих системах все они, впрочем, уже будут присутствовать.

Получаем исходники

wget https:// www.kernel.org/ pub/ linux/ kernel/ v4.x/ linux-4.6.4.tar.xz
tar --xz -xvf linux-4.6.4.tar.xz
cd linux-4.6.4

Или, если вам нужен самый-самый свежак, можно взять исходники прямо из Git :

# Mirror: https://github.com/torvalds/linux
git clone "git://git.kernel.org/pub/scm/linux/kernel/git/" \
"torvalds/linux.git"
cd linux

Судя по тому, что тэга v4.6.4 в Git’е мне найти не удалось, релизы ядра Linux оформляются исключительно в форме сжатых tar-архивов.

Если же вместо ванильного ядра вы хотели бы собрать ядро с патчами от компании Canonical:

git clone git:// kernel.ubuntu.com/ ubuntu/ ubuntu-trusty.git
cd ubuntu-trusty
git tag | less
git checkout Ubuntu-lts-4.4.0-31.50 _14.04.1

По своему опыту скажу, что если вы пользуетесь Ubuntu, то можете смело использовать ванильное ядро. Вряд ли у вас возникнут с ним какие-то проблемы.

Примечание: Интересно, что из существующих сравнительно популярных дистрибутивов Linux ядро без собственных патчей, похоже, используют только Gentoo, Slackware и Arch Linux .

Так или иначе, теперь у вас есть исходники.

Собираем и устанавливаем ядро

Выбираем опции, с которыми будет собрано ядро:

make menuconfig

В случае необходимости меняем настройки, жмем Save, затем Exit. В результате будет создан файл .config , содержащий выбранные нами параметры.

При обновлении ядра (вы же по-любому уже используете какое-то ядро?) удобно взять конфиг текущего ядра, и выставить новым опциям значения по умолчанию:

zcat / proc/ config.gz > ./ .config
make olddefconfig

Наконец, собираем:

make -j4 bindeb-pkg LOCALVERSION =-custom

Собирается ядро довольно долго. На моем ноутбуке сборка заняла 1 час 15 минут. Однако из этого времени бо льшая часть тратится на сборку гигантского пакета ядра с отладочными символами. Сборку этого пакета можно отключить, закомментировав в конфиге параметр CONFIG_DEBUG_INFO. Только учтите, что этот пакет требуется SystemTap и другим полезным инструментам .

Помимо самого ядра также можно собрать и документацию:

# еще есть `make pdfdocs` и другие, см `make help`
make htmldocs
chromium-browser Documentation/ DocBook/ index.html

По окончании сборки в дочернем каталоге видим что-то вроде:

linux-firmware-image-4.4.13-custom_4.4.13-custom-1_amd64.deb
linux-headers-4.4.13-custom_4.4.13-custom-1_amd64.deb
linux-image-4.4.13-custom_4.4.13-custom-1_amd64.deb
linux-image-4.4.13-custom-dbg_4.4.13-custom-1_amd64.deb
linux-libc-dev_4.4.13-custom-1_amd64.deb

Ставим все deb-пакеты кроме dbg-версии ядра обычным sudo dpkg -i и перезагружаемся. После перезагрузки смотрим на вывод команды uname -a . Убеждаемся, что действительно загрузились с новым ядром. Если с новым ядром что-то не так, в загрузчике просто выбираем то, с которым система загружалась до этого. После загрузки со старым ядром поскорее удаляем пакеты нового ядра, и вуаля — система вернулась к прежнему состоянию.

В данном пошаговом руководстве вы узнаете, как правильно собрать и установить ядро ветвей >2.6 в семействе ОС Ubuntu.

Шаг 1. Получение исходного кода ядра

Исходники ядра Ubuntu можно получить двумя способами :

    Установив архив из репозитория, с автоматическим наложением последних официальных патчей. При этом скачается пакет размером ~150 Мб в текущую папку. Чтобы получить исходники ядра, версия которого установлена на компьютере выполните команду: apt-get source linux-image-`uname -r`

    Или вместо `uname -r` можно указать конкретную версию из имеющихся в репозитории.

Список имеющихся в репозитории версий можно увидеть набрав команду: «apt-get source linux-image-» и, не нажимая Enter , нажать два раза клавишу Tab .

Не забудьте включить общий доступ к исходникам в репозитории (Параметры системы → Программы и обновления → Программное обеспечение Ubuntu → Исходный код). Из консоли это сделать можно раскомментировав строки начинающиеся с deb-src в файле /etc/apt/sources.list, а затем выполнить обновление командой: «sudo apt-get update».

    Самая свежая версия ядра доступна по git . Размер скачиваемого пакета ~500-800 Мб. git clone git://kernel.ubuntu.com/ubuntu/ubuntu-.git

    Где - имя релиза, например:

    Git clone git://kernel.ubuntu.com/ubuntu/ubuntu-xenial.git

Другие ядра

Также существуют ядра, работоспособность которых в Ubuntu не гарантируется. Например, известна проблема с рядом популярных системных приложений (в частности драйвера NVidia, VirtualBox), которые при своей установке компилируются под установленное ядро. Поэтому для их установки на ядро, нестандартное для данной версии Ubuntu (например, Ubuntu 16.04 идёт с ядром 4.4.0), может потребоваться их отдельная компиляция вручную или специальные патчи, а последние версии ядер с kernel.org приложение может вообще не поддерживать.

    Архив с базовой версий без патчей, т.е. например «4.8.0», «4.8.10»: sudo apt-get install linux-source

Распакуйте полученный архив, используя команды:

Cd ~/ tar -xjf linux-2.6.x.y.tar.bz2

Или в случае с linux-source:

Cd /usr/src tar -xjf linux-source-2.6.x.y.tar.bz2

Шаг 2. Получение необходимых для сборки пакетов

Данный шаг необходимо выполнить, только если ядро собирается на компьютере в первый раз

Выполните следующие команды для установки основных пакетов:

Sudo apt-get update sudo apt-get build-dep linux sudo apt-get install kernel-package

    config - традиционный способ конфигурирования. Программа выводит параметры конфигурации по одному, предлагая вам установить для каждого из них свое значение. Не рекоммендуется для неопытных пользователей.

    oldconfig - файл конфигурации создаётся автоматически, основываясь на текущей конфигурации ядра. Рекомендуется для начинающих.

    defconfig - файл конфигурации создаётся автоматически, основываясь на значениях по-умолчанию.

    menuconfig - псевдографический интерфейс ручной конфигурации, не требует последовательного ввода значений параметров. Рекомендуется для использования в терминале.

    xconfig - графический (X) интерфейс ручной конфигурации, не требует последовательного ввода значений параметров.

    gconfig - графический (GTK+) интерфейс ручной конфигурации, не требует последовательного ввода значений параметров. Рекомендуется для использования в среде GNOME.

    localmodconfig - файл конфигурации, создающийся автоматически, в который включается только то, что нужно данному конкретному устройству. При вызове данной команды большая часть ядра будет замодулирована

В случае, если вы хотите использовать config , oldconfig , defconfig , localmodconfig или localyesconfig , вам больше не нужны никакие дополнительные пакеты. В случае же с оставшимися тремя вариантами необходимо установить также дополнительные пакеты.

menuconfig выполните следующую команду:

Sudo apt-get install libncurses5-dev

Для установки пакетов, необходимых для использования gconfig выполните следующую команду:

Sudo apt-get install libgtk2.0-dev libglib2.0-dev libglade2-dev

Для установки пакетов, необходимых для использования xconfig выполните следующую команду:

До Ubuntu 12.04: sudo apt-get install qt3-dev-tools libqt3-mt-dev

Sudo apt-get install libqt4-dev

Шаг 3. Применение патчей

Данный шаг не является обязательным.

Официальные патчи уже наложены на исходники, если ядро получалось описанной выше командой:

Apt-get source linux-image-`uname -r`

Если вы никогда до этого не применяли патчей к исходному коду, то выполните следующую команду:

Sudo apt-get install patch

Эта команда установит программу patch, необходимую для, как можно догадаться, применения патчей. Теперь скачайте файл патча в папку, куда вы распаковали ядро. Это может быть либо архивный файл (напр. Bzip2 или Gzip), либо несжатый patch-файл.

На данный момент подразумевается, что вы уже сохранили файл в ту папку, куда ранее распаковали ядро, и установили программу patch.
Если скачанный вами файл был в формате Gzip (*.gz), тогда выполните следующую команду для распаковки содержимого архива:

Gunzip patch-2.6.x.y.gz

Если скачанный вами файл был в формате Bzip2 (*.bz2), тогда выполните следующую команду для распаковки содержимого архива:

Bunzip2 patch-2.6.x.y.bz2

где 2.6.x.y - версия патча ядра. Соответствующие команды распакуют файл патча в папку с исходным кодом ядра. Прежде чем применить патч, необходимо удостовериться, что он заработает без ошибкок. Для этого выполните команду:

Patch -p1 -i patch-2.6.x.y --dry-run

где 2.6.x.y - версия патча ядра. Эта команда сымитирует применение патча, не изменяя сами файлы.

Если при её выполнении не возникнет ошибок, то изменения можно смело внедрять в сами файлы. Для этого выполните команду:

Patch -p1 -i patch-2.6.x.y

где 2.6.x.y - версия патча ядра. Если не было никаких ошибок, значит к исходному коду был успешно применён патч.

Внимание! Перед тем, как применять патч, проведите следующие действия: 1. Скачайте с http://www.kernel.org патч той же версии, что и ваших исходников. 2. Выполните следующую команду: patch -p1 -R

где 2.6.x.y - версия патча и ваших исходников

Шаг 4. Конфигурация будущей сборки ядра

Перейдите в папку, куда вы распаковали ядро, выполнив команду

Cd ~/linux-2.6.x.y

где 2.6.x.y - версия загруженного вами ядра.

На данный момент вы уже должны были определиться с методом конфигурации ядра (если нет, то ознакомьтесь с ними в разделе «Получение необходимых для сборки пакетов». В зависимости от этого, выполните следующую команду для запуска выбранного вами способа конфигурации:

    config - традиционный способ конфигурирования. Программа выводит параметры конфигурации по одному, предлагая вам установить для каждого из них свое значение. Вызывается командой make config

    oldconfig - файл конфигурации создаётся автоматически, основываясь на текущей конфигурации ядра. Рекомендуется для начинающих. Вызывается командой make oldconfig

    defconfig - файл конфигурации создаётся автоматически, основываясь на значениях по-умолчанию для данной конкретной архитектуры. Вызывается командой make defconfig

    menuconfig - псевдографический интерфейс ручной конфигурации, не требует последовательного ввода значений параметров. Рекомендуется для использования в терминале. Вызов: make menuconfig

    gconfig и xconfig - графические конфигураторы для ручной настройки. Вызов: make gconfig

    Make xconfig

    соответственно

    localmodconfig и localyesconfig - автоматические конфигураторы. Конфиг создается на основе вызванных в данных момент модулей и запущенного ядра. Разница между этими двумя конфигураторами в количестве модулей. В первом случае их будет не менее 50% ядра, а во-втором не больше 2 модулей. Вызов: make localmodconfig

    Make localyesconfig

    соответственно

После вызова соответствующая программа конфигурации будет запущена. Произведите необходимые настройки в соответствии с вашими потребностями, сохраните файл конфигурации и переходите к следующему шагу.

Шаг 5. Сборка ядра

Итак, приготовления завершены. Теперь можно запустить процесс сборки ядра. Чтобы это сделать, выполните команду:

Fakeroot make-kpkg -j 5 --initrd --append-to-version=-custom kernel_image kernel_headers #-j <количество ядер процессора>+1

Сборка ядра может занимать от 20 минут до нескольких часов в зависимости от конфигурации ядра и технических параметров компьютера. Сборка при многодерном процессоре может быть в несколько раз быстрее

Шаг 6. Установка образов и заголовков ядра

Когда сборка ядра подошла к концу, в вашей домашней папке появятся два deb-пакета. Их и необходимо установить. Для этого выполните команды:

Cd ~/ sudo dpkg -i linux-image-2.6.x.y-custom_2.6.x.y-custom-10.00.Custom_arc.deb sudo dpkg -i linux-headers-2.6.x.y-custom_2.6.x.y-custom-10.00.Custom_arc.deb

где 2.6.x.y - версия собранного ядра, arc - архитектура процессора (i386 - 32-бит, amd64 - 64-бит).
Если вы не знаете точного названия пакета, выведите список файлов в домашнем каталоге командой

и найдите эти самые два пакета.

Шаг 7. Генерация начального RAM-диска

Для корректной работы Ubuntu требует наличия образа начального RAM-диска. Чтобы его создать, выполните команду:

Sudo update-initramfs -c -k 2.6.x.y-custom

где 2.6.x.y - версия собранного ядра.

Шаг 8. Обновление конфигурации загрузчика GRUB

Для того, чтобы новая версия ядра была доступна для выбора при загрузке компьютера, выполните следующую команду:

Sudo update-grub

Файл menu.lst (для GRUB версии 1) или grub.cfg (для GRUB версии 2) обновится в соответствии с наличием установленных операционных систем и образов ядер.

Шаг 9. Проверка ядра

Сборка и установка ядра успешно выполнены! Теперь перезагрузите компьютер и попробуйте загрузить систему с новым ядром. Чтобы удостовериться, что система запущена с новым ядром, выполните команду

Uname -r

Она выведет на экран используемую версию ядра.

Если всё сделано правильно, то вы можете удалить архивы с исходным кодом и весь каталог linux-2.6.x.y в вашей домашней папке. Это освободит около 5 ГБ на вашем жёстком диске (размер освобождаемого пространства зависит от параметров сборки).

На этом процесс сборки и установки завершён, поздравляю!

Имеющаяся информация о сборке ядра сильно разнится, поэтому будем описывать сборку ядра именно для Ubuntu. Постараемся. чтобы в командах, написанных в этой статье, небыло ошибок. При описании процесса компиляции, не остановимся только на получении ядра. Получить работоспособное ядро - этого мало. Для владельцев карт nVidia, здесь будет дано описание, как получить систему с работащей графикой на новом ядре. Причем, графика будет работать как в старом ядре, так и в новом.

1. Установка исходников ядра

Вначале нам нужны будут исходники ядра. Для Ubuntu 7.04 в репозитарии они уже есть, нужно найти пакет linux-source-тратата (в нашем случае это будет linux-source-2.6.20 ), и установить его (все это можно сделать через Synaptic ). После установки данного пакта, в каталоге /usr/src появится файл с именем linux-source-2-6-20.tar.bz2 .

Делаем под sudo команду

chmod 777 /usr/src

Заходим обычным пользователем в каталог /usr/src и распаковываем этот файл

tar -jxvf linux-source-2-6-20.tar.bz2

Появится каталог с исходниками /usr/src/linux-source-2-6-20 . Архивный файл удаляем (нужны будут права рута).

2. Установка сопроводительных пакетов

Для сборки понадобятся еще пакеты kernel-package , libncurses5-dev , fakeroot . Устанавливаем их через Synaptic . Само собой, в системе также должен быть установлен компилятор gcc и dev -пакеты для системных библиотек, такие например как libc6-dev .

3. Создание файла конфигурации ядра

Теперь нам нужен конфиг ядра, с которым собиралось ядро для убунты. Заходим в каталог /boot , и видим там файл типа config-2.6.20-15-generic . Он нам и нужен. Копируем его в каталог с исходниками /usr/src/linux-source-2-6-20 и переименовываем его в .config . Обратите внимание, что имя файла начинается с точки, это не опечатка.

Теперь, находясь в каталоге /usr/src/linux-source-2-6-20 , даем под обычным пользователем команду

это запустится текстовый интерфейс настройки ядра. Можно так же запустить настройку в графическом режиме

В обоих случаях откроется интерфейсик с галочками, через который конфигурируем ядро. Вроде как по умолчанию как раз и открывается файл .config , который в данный момент и содержит стандартный конфиг ядра Убунты.

Что вы хотите наконфигурировать - думайте сами, по этому вопросу в инете много русскоязычной документации. В задачу этой статьи входит только описание самих действий, выполняемых при компиляции ядра Ubuntu.

В конце конфигурирования выбираем пункт "Save тратата кофигурацию", указываем имя файла, отличного от .config , например .config_my_01 . Выходим.

Теперь переименовываем .config в .config_ubuntu . И у вас получается два файла - .config_ubuntu и .config_my_01 . Вы можете посмотреть различия между стандартной и вашей конфигурацией, например так

diff .config .config_my_01

Теперь копируем вашу конфигурацию .config_my_01 под именем .config . Т.е. у вас получится 3 конфиг файла. При компиляции будет использоваться файл .config . Файлы .config_ubuntu и .config_my_01 нам помогут в будущем для новой компиляции. Это на тот случай, если новое ядро окажется неработоспособным или глючным.

4. Компиляция

Перед компиляцией обязательно проверяем наличие свободного пространства (на том разделе, где лежат исходники). Хорошо бы меть 4-5Gb (!) в запасе. При компиляции размер каталога с исходниками может разрастись до 3,5Gb . Проверить свободное пространство можно командой

Теперь, находясь под обычным пользователем в каталоге /usr/src/linux-source-2-6-20 , даем команду, которая удалит в исходниках скомпилированные кем-то объектники, которые остались от предыдущей компиляции и находились в архиве.

Потом через sudo получаем права рута и запускаем компиляцию.

make-kpkg --initrd --revision=mybuild.1.0 kernel_image kernel_headers

Где вместо "mybuild.1.0 " пишите что вам нужно. Допустимы английские буквы, цифры, точки. Символы подчеркивания и тире не допускаются.

Вообще-то, по-хорошему, компиляцию ядра надо делать под правами обычного пользователя. Формально, создание бинарника ядра ничем не отличается от компилирования бинарника любой другой программы. Но мы делаем компиляцию не в ручном режиме (через команды типа make bzImage modules ), а в полуавтоматическом (через make-kpkg ). А эта программа, после прохождения компиляции, будет запускать из-под себя программу dpkg-deb чтобы получить deb -пакет с ядром. Вот в этот момент и потребуются права рута.

Теперь давайте разберемся, что же делает вышеприведенная команда. Она запускает компиляцию ядра, и затем создает deb -пакет с именем linux-image-версия.deb , в котором будут находиться бинарник ядра и модули ядра (это сделается благодаря цели kernel_image ). А так же будет создан deb -пакет с именем linux-headers-версия.deb , в нем будут находиться заголовочные файлы ядра (это сделается благодаря цели kernel_headers ). Полученные пакеты будут лежать в каталоге /usr/src .

Посмотреть, какие файлы находятся в этих deb -пакетах, можно в konqueror (в Kubuntu), щелкнув правой клавишей по на интересуемом deb -файле и выбрав "Kubuntu package menu " -> "Show package info ". Информация будет формироваться довольно медленно, около минуты, так как пакеты большие.

5. Установка ядра

Теперь устанавливаем ядро. Находясь с правами суперпользователя в каталоге /usr/src , даем команду

dpkg -i linux-image-версия.deb

после которой ваше ядро (файл vmlinuz-2.6.20.3-ubuntu1 ) будет помещено в каталог /boot (все предыдущие ядра тоже никуда не денутся, останутся на своих местах), а в каталоге /lib/modules , рядом с каталогом с модулями обычного ядра (в Ubuntu 7.04 называется /lib/modules/2.6.20-15-generic ) появится каталог с модулями вашего нового ядра (в нашем случае это будет /lib/modules/2.6.20.3-ubuntu1 ). Новое ядро будет автоматически прописано в /boot/grub/menu.lst .

Впринципе, уже можно перегрузиться, и в экране загрузки Grub появится новый пункт с вашим ядром. Новое ядро появится в начале списка. Но пока не спешим, а дадим еще команду

dpkg -i linux-headers-версия.deb

которая установит хедеры ядра в каталог /usr/src/linux-headers-версия , в нашем случае это будет каталог /usr/src/linux-headers-2.6.20.3-ubuntu1 . Эти хедеры нам понадобятся, например, для перекомпиляции драйверов nVidia для нового ядра.

6. Перезапуск

Перегружайтесь, и в меню Grub вы увидите два новых пункта - обычная загрузка с вашим ядром, и загрузка в минимальном консольном режиме. Выбирайте первый пункт. Если ядро сразу не выпало в Kernel panic , то это хороший признак. Ждите конца загрузки. Если вам повезет, то Ubuntu загрузится в графический режим и покажет графическое приглашение входа в систему. В этом случае дальше можете не читать.

Но для пользователей карт nVidia , которые пользовали драйвера, установленными через "Менеджер проприетарных драйверов" или пользовали драйвера из пакета nvidia-glx (или там nvidia-glx-new ), даю 99% гарантии, что вам не повезет! И графики под новым ядром вы не увидите!

7. Установка драйверов nVidia с сайта nvidia.com

Чтобы получить работающие иксы под новым ядром, первое что приходит в голову - это установить под новым ядром драйвера с сайта nvidia.com. И это неправильное решение! Как только установятся дрова под новым ядром, графика в вашем старом проверенном ядре работать перестанет (по причине того, что файлы драйверов nVidia жестко завязаны на версию и название ядра). А так как работоспособность нового ядра вы еще толком не проверили, вы можете получить систему "с родным ядром, но без графики" и "глючным ядром, зато с графикой". Думаю, никого такая ситуация не устроит.

В популярной статье "Ядерная физика для домохозяек", есть рекомендации, как получить графику под обоими ядрами. Предлагается следующий путь - иметь на готове установочный пакет дров с nvidia.com, и при желании загрузиться под конкретным ядром, надо сначала загрузиться в консольном режиме этого ядра, установить дрова, и потом загрузиться уже нормально. Думаю, такой подход тоже мало кого обрадует.

Мы сделаем так, что графика будет работать и в старом ядре, и в новом ядре, и для этого не нужно будет каждый раз запускать установку (компиляцию) дров. Для этого нам нужно будет выполнить только одно условие - чтобы графические дрова под разными ядрами были одной версии.

Краткий план действий - ставим дрова с сайта nvidia.com для стандартного ядра в полном объеме. Убеждаемся что они работают. Потом из этого же пакета ставим дрова для самодельного ядра, но в режиме "только графический модуль".

8. Установка драйверов nVidia под обычное ядро

Все, что ниже написано, подходит и для тех, кто просто решил установить новые дрова nVidia под стандартное ядро!

Качаем с сайта nvidia.com дрова под линух. Я себе качал дрова версии 96.43 . Файл называется NVIDIA-Linux-x86-96.43.01-pkg1.run . Но вы можете попробовать другие стабильные релизы, которые присутствуют на сайте nVidia .

Для установки, создаем в каталоге /usr/src подкаталог с именем nvidia , копируем туда этот файл. Находясь в этом подкаталоге, даем файлу разрешение на выполнение

chmod 777 NVIDIA-Linux-x86-96.43.01-pkg1.run

Все, на этом работа в графическом интерфейсе на время заканчивается. Перед выходом из графрежима, запустите Synaptic , и убедитесь, что у вас стоит

  • aptitude. Это интерфейсная оболочка над пакетным менеджером для text-mode.
  • linux-headers-2.6.20-15. Это заголовочные файлы (хедеры) вашего стандартного ядра.
  • linux-headers-2.6.20-15-generic. Точно не скажу на кой хрен этот пакет, но пусть будет.

Хороший совет - иметь распечатаный текст данной статьи на бумажке, или сохранить его в текстовый файл, который можно посмотреть из текстового режима.

Перегружаемся в консольный режим обычного ядра (в Grub есть такой пункт). В Ubuntu вы автоматически получите права рута, даже пароль вводить ненадо. Теперь надо удалить дрова nVidia , которые есть в системе. Если вы устанавливали дрова через "Менеджер проприетарных драйверов" (или путем установки пакета nvidia-glx или nvidia-glx-new ), то пакет nvidia-glx/nvidia-glx-new нужно удалить из системы, причем не просто деинсталлировать, а деинсталлировать в режиме purge .

Я достаточно тупой пользователь, и вместо того, чтобы разбираться с опциями dpkg , в консоли пользуюсь программой aptitude . Наберите команду

и вы попадете в оболочку, оталенно напоминающую Synaptic . Вверху будет подсказка по клавишам. Чтобы попасть в меню, нажимаем Ctrl+t (неудобно, но что делать). В меню
стрелками и клавишей Enter находим и выбираем пункт "Find ". Пишем строку поиска - nvidia-glx . Засветка попадет на нужный пакет. Снова вызываем меню, и находим там пункт "Purge ". Нажимаем его, и пакет, на котором стоит засветка, будет помечен для полного деинсталлирования всех его файлов из системы (сам пакет останется в кеше, его можно будет заново установить при необходимости). Внизу появится подсказка - "e - Examine, ! - remove ". Нажимаем "e " - и видим какие пакеты будут удалены. Если от nvidia-glx будут зависеть пакеты, то они тоже будут деинсталлированы. Обычно это пакет nvidia-glx-dev . Ничего страшного, что он удалится тоже.

Теперь нажимаем "! " (для особо одаренных - Shift+1 ), тем самым мы соглашаемся с нашими изменениями. Потом нажимаем "q " (выход). При выходе программа удалит отмеченные нами пакеты.

Теперь такой момент. Мы сейчас находимся на уровне init 1 (только консоль, куча сервисов не запущена). Если запустить инсталляцию драйвера nVidia , то она будет ругаться, что возможно у вас не запущен сервис devfs , который обычно запускается на уровне 3 . Поэтому даем команду

telinit 3

и система догрузит нужные сервиса, а заодно выйдет из однопользовательского режима (появится несколько консолей, которые можно переключать клавишами ALT+F1 ...ALT+F6 ). Для дальнейшей работы нам как раз понадобится две консоли. Кстати, система попробует загрузить графику, ей это не удасться, т.к. драйвер мы только что удалили. И она останется в 7 -й консоли с пустым экраном. Не паникуем, нажимаем ALT+F1 , видим первую консоль, там вводим логин, пароль так же как и в графическом входе (только после логина и пароля нажимаем Enter а не TAB ).

Залогинившись, вызываем mc под суперпользователем

Заходим в каталог /usr/src/nvidia

./NVIDIA-Linux-x86-96.43.01-pkg1.run -e

Опция "-e " позволит нам видеть отчет о действиях и увидеть конфликтующие файлы. Начинаем установку. Соглашаемся с лицензией. Отказываемся от докачки исходников с ftp нвидии. Говорим OK что будут создаваться модули нами. На вопросы ввода путей просто нажимаем Enter .

В конце концов, перед самой установкой будет показан список файлов которые будут установлены. А в начале этого списка (если будут найдены) покажутся конфликтующие файлы . Будет написано "Backup file ... " - вот это они и есть. В моем случае это были файлы

/usr/lib/xorg/modules/extensions/libGLcore.so
/usr/lib/xorg/modules/extensions/libglx.so
/usr/lib/libGL.so
/usr/lib/libGL.so.1
/usr/lib/libGL.so.1.2
/lib/modules/2.6.20-15-generic/volatile/nvidia.ko
/usr/include/GL/glext.h
/usr/include/GL/gl.h
/usr/include/GL/glxext.h
/usr/include/GL/glx.h

Это файлы от пакета nvidia-restricted-modules . Дело в том, что если просто удалить этот пакет, то вместе с данными файлами удалятся и все файлы для nVidia -чипсетов (nVidia ведь не только видеокарточки делает). А так же потребуется удаление зависимых пакетов linux-restricted-modules-2.6.20-15-generic , linux-restricted-modules-generic и linux-generic . Поэтому удалять данный пакет нежелательно. Поэтому мы поступим по-другому.

Как только увидите такой список, логинтесь во вторую консоль (переход - ALT+F2 ), запускайте

и методично переносите эти конфликтующие файлы куда-нить в отдельный каталог в домашней директории, сверяясь со списком в первой консоли. Почему переносить а не удалять? Дело в том, что имена файлов в линухе "человеконечитаемые", и легко можно ошибиться и удалить не тот файл.

После того, как удалили все файлы, предназначенные для Backup , возвращайтесь в первую консоль. Прерывайте установку (Ctrl+c ) и запускайте ее заново. Если "Backup file ... " больше не будет, то завершайте установку. Все должно пройти гладко. Можете согласиться с исправлением xorg.conf , всеравно содасться резервный файл.

Теперь внимание! Самое главное, в этот момент не перегрузиться! А зайти в файл /etc/default/linux-restricted-modules-common , и добавить в опцию DISABLED_MODULES модули nv и nvidia_new . У меня это сделано так

DISABLED_MODULES="nv nvidia_new"

Если этого не сделать, то при следующей загрузке файл (который вы удалили!) /lib/modules/2.6.20-15-generic/volatile/nvidia.ko будет автоматически восстановлен из пакета nvidia-restricted-modules . А ваш файл, который вы скомпилировали при установке драйверов, называется /lib/modules/2.6.20-15-generic/kernel/drivers/video/nvidia.ko . Так вот, при запуске иксов будет найден первый файл. А до вашего файла дело не дойдет. И иксы не смогут загрузиться.

Перегружаемся в стандарное ядро в полный режим. Если все сделали правильно, иксы запустяться. Радуйтесь, как минимум у вас осталась работоспособная система.

9. Установка драйверов nVidia под самодельное ядро

Теперь остался последний шаг - заставить работать графику в новом ядре. Тут все достаточно просто. Загружаемся в консольном режиме самодельного ядра. Даем команду

логинимся, и в первой консоли запускаем

Заходим в каталог /usr/src/nvidia и начинаем установку дров командой

./NVIDIA-Linux-x86-96.43.01-pkg1.run -Ke

Опции "-Ke " позволяют собрать только графический модуль nvidia.ko под текущее ядро (и файл будет помещен в каталог /lib/modules/имя_текущего_ядра/kernel/drivers ). Никаких других общих файлов, которые например были бы размещены в /usr/lib... как при компиляции с опцией "-e", создаваться не будет.

Точно так, же как и при компиляции в стандартном ядре, соглашаемся с путями нажатием Enter . Доходим до экрана, где будут перечислены файлы, которые будут установлены. Если в начале этого списка есть конфликтущие файлы "Backup file ... ", переключаемся в соседнюю консоль и удаляем (переносим) эти файлы.

После удаления конфликтующих файлов, в первой консоли прерывайте установку (Ctrl+c ), и снова ее запускайте (с опцией "-Ke " естественно). После завершения установки перегружайтесь, выбрав в меню Grub в полный режим с вашим ядром.

Иксы должны запуститься. Вы можете радоваться второй раз - вы имеете систему с самодельным ядром и работащей графикой.

В любой момент вы можете теперь загрузиться под нужным ядром, и везде графика должна работать. На этом все.

В середине марта после почти двух месяцев разработки и семи release candidate Линус Торвальдс представил новую версию ядра 4.5. Кроме исправлений, в релизе действительно много нового. Изменения затронули все подсистемы - дисковую, работу с памятью, системные и сетевые сервисы, безопасность, и, конечно же, добавлены драйверы для новых устройств. Попробуем разобраться с некоторыми наиболее интересными.

О релизе

Релиз ядра 4.4 вышел относительно недавно, в начале января 2016-го, но за это короткое время накопилось большое количество дополнений. И хотя Линус назвал новый релиз «нормальным», можно увидеть, что по сравнению с версией 4.4 размер патча вырос почти на треть - 70 Мбайт против 49 Мбайт. В разработке участвовало примерно 1528 человек, которые внесли около 13 тысяч исправлений . В более чем 11 тысяч файлов были добавлены 1 146 727, удалено 854 589 строк кода. В 4.4 было соответственно 714 106 и 471 010 строк. Почти половина (45%) всех изменений связана с драйверами устройств, 17% затрагивают код аппаратных архитектур, 14% касаются сетевого стека, 4% - файловых систем, и 3% затронули внутренние подсистемы ядра. Наибольшее количество строк внесли Даг Ледфорд (Doug Ledford) из Red Hat, занимавшийся в основном чисткой кода (7,7%), Томи Валкейнен (Tomi Valkeinen) из Texas Instruments, работавший над поддержкой субархитектуры OMAP (5,3%), три разработчика сосредоточили внимание на драйверах графических карт AMD: Эрик Хуан (Eric Huang) - 3,3%, Алекс Дойхер (Alex Deucher) - 2,4% и yanyang1 - 1,6%. Лидеры по чейнджсетам - Линус Валлей (Linus Walleij) из Linaro, реализовавший множество низкоуровневых изменений, в том числе к поддерживаемому им GPIO (2,0%), Арнд Вергман (Arnd Bergmann), проделавший большую работу для поддержки ARM (1,9%), и Лео Ким (Leo Kim), занимавшийся драйвером wilc1000 (1,7%). Как и ранее, многие корпорации заинтересованы в развитии ядра. Работу над версией 4.5 поддержали более 200 компаний, среди которых Red Hat, Intel, AMD, Texas Instruments, Linaro, Linux Foundation, Samsung, IBM, Google. Большинство из них развивают поддержку своих устройств и связанных подсистем и инструментов, но, например, Google традиционно вносит очень много изменений в сетевую подсистему Linux.

Ядро и драйверы

Продолжился перенос сложного и плохо поддерживаемого кода, написанного на ассемблере (x86/asm) на С, начатый еще в 4.0. Ядро теперь можно собирать с параметром -fsanitize=undefined. Сам параметр появился два года назад в GCC 4.9+ и активирует отладочный режим UBSan (Undefined Behavior Sanitizer), который детектирует неопределенное поведение, присущее языкам C и C++: использование нестатических переменных до инициализации, деление на ноль, целочисленное переполнение и так далее. Компилятор обычно предполагает, что такие операции никогда не произойдут, а в случае наступления результат может быть любой и зависит от самого компилятора. Теперь компилятор обнаруживает такие ситуации, выдает «runtime error:» (можно отключить -fno-sanitize-recover) и продолжает выполнение. По умолчанию в каждой сборке ОС все библиотеки загружаются в определенные адреса, что позволяет легко реализовать атаку. Для увеличения безопасности используется ряд технологий, одна из них - случайное смещение при вызове mmap(), реализованное в виде ASLR (Address Space Layout Randomization). Впервые технология ASLR появилась в Linux в 2005 году в ядре 2.6 и выдавала для 32-битных систем 8-битное смещение (то есть 256 вариантов адресов, хотя на самом деле меньше), а для x64 - смещение уже 28-битное. Для x64 вариантов вполне достаточно, а вот для 32-битных систем, среди которых Android, этого на сегодня явно мало. Уже известны эксплоиты, умеющие подбирать адрес. В результате поиска решения проблемы написан патч, позволяющий устанавливать большую хаотичность для ASLR, через /proc/sys/vm/mmap_rnd_bits и /proc/sys/vm/mmap_rnd_compat_bits (в системах x64 для x86-процессов). Для каждой архитектуры указываются минимальные и максимальные значения с учетом доступного адресного пространства. Для x86 значение может находиться в диапазоне от 8 до 16 бит или 28–32 (для x64-версии). Параметры по умолчанию можно задавать при сборке ядра.
Настройка ASLR в новом ядре Расширены возможности DRM-драйвера для видеокарт NVIDIA (Nouveau) и Intel (поддержка будущего поколения чипов Kaby Lake), добавлена поддержка новых звуковых карт, USB-контроллеров, криптоускорителей. Производители графических карт Intel и NVIDIA уже давно отказались от использования режима UMS (Userspace Mode Setting) в своих open source драйверах в пользу KMS (Kernel Mode Setting), теперь пришла очередь драйвера ATI Radeon, в котором убран код режима UMS. С 3.9 было возможно его включать параметром DRM_RADEON_UMS или установкой radeon.modeset=0 в GRUB. Теперь остался только KMS (Kernel Mode Setting). Это нужно учитывать, если необходимо использовать старые драйверы или режим UMS (UMS иногда показывает большую производительность). В драйвер AMDGPU добавлена экспериментальная поддержка технологии динамического управления питанием PowerPlay, позволяющая повысить производительность GPU для GPU Tonga и Fiji и интегрированных Carrizo и Stoney. В режиме PowerPlay GPU запускается в режиме низкого энергопотребления, но в случае возрастания нагрузки на графическую подсистему автоматически увеличивает частоту. По умолчанию PowerPlay отключен, для включения следует передать ядру параметр amdgpu.powerplay=1 . Новая версия Media controller API расширяет поддержку устройств Video4Linux и позволяет использовать функциональность мультимедиаконтроллера в других подсистемах, таких как DVB, ALSA и IIO. В KVM (Kernel-Based Virtual Machine) много сделано для поддержки архитектуры s390 (теперь она может использовать до 248 vCPU), ARM/ARM64 и улучшения работы x86 в Hyper-V.

Установка ядра 4.5 в Ubuntu

Самый простой способ познакомиться с новым ядром - использовать сборку от Ubuntu Kernel Team. После всестороннего тестирования новое ядро попадает в ppa:canonical-kernel-team/ppa , но обычно на это уходит время. $ wget -с http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.5-wily/linux-headers-4.5.0-040500-generic_4.5.0-040500.201603140130_amd64.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.5-wily/linux-headers-4.5.0-040500_4.5.0-040500.201603140130_all.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.5-wily/linux-image-4.5.0-040500-generic_4.5.0-040500.201603140130_amd64.deb $ sudo dpkg -i linux*.deb После перезагрузки можем работать.

Поддержка ARM

ARM-компьютеры используются как мини-серверы под определенные задачи или в качестве контроллеров автоматизации, что делает их очень популярными и востребованными. ARM-сообщество Linux за последние пять лет превратилось в одно из наиболее активных, проведя колоссальную работу по поддержке 32-разрядных ARM-платформ, занимающих серьезную долю рынка, и эта работа в общем завершилась к выходу ветки 4.5. Ранее для каждого ARM-устройства необходимо было собрать собственное ядро, обеспечивающее поддержку только определенных устройств. Но проблема в том, что устройства становились сложнее, появилась возможность изменения конфигурации, да и сами пользователи на ARM-устройствах хотели использовать без лишних телодвижений обычные дистрибутивы. Но в итоге мы имели несколько сотен вариантов сборки ядра, что очень затрудняет использование Linux. Результатом очистки и рефакторинга большого количества кода стало возможным включение в ядро кода поддержки ARMv6 и ARMv7, то есть теперь можем собрать универсальное ядро, способное загружаться на обеих системах. Здесь, наверное, нужно вспомнить и о продвигаемой в последнее время спецификации Device Tree , возникшей как часть разработок Open Firmware. Device Tree позволяет конфигурировать оборудование во время загрузки при помощи специальных dts-файлов, хранящихся в /boot/dtbs, и менять установки без пересборки ядра. Использование Device Tree становится обязательным для всех новых разработок ARM и не только устройств. Все это вместе дает уверенность, что дистрибутивы Linux в будущем можно будет спокойно запускать на любом ARM-устройстве. Параллельно Грег Кроу-Хартман (Greg Kroah-Hartman) из Linux Foundation выпустил патч, реализующий подобную возможность для ранних версий ядра. В arch/arm64 найдем код, обеспечивающий поддержку новой 64-битной архитектуры ARM (ARMv8). Добавлены новые функции для всех популярных архитектур ARM - Allwinner, Amlogic, Samsung, Qualcomm и поддержка новых ARM-плат различных разработчиков.

Системные сервисы

Для доступа к данным прошивок UEFI (Unified Extensible Firmware Interface) в Linux используется специальная псевдофайловая система efivars (настраивается EFIVAR_FS), которая монтируется в /sys/firmware/efi/efivars . В некоторых реализациях при выполнении команды rm -rf /* удалялось содержимое и этого каталога, что приводило к разрушению прошивки. Компании - разработчики устройств не считают это серьезным недостатком, ведь ситуация, конечно, не самая распространенная, да и вряд ли какому-то пользователю придет в голову это проверить. Тем не менее проблема есть, и писатели вирусов вполне реально могут воспользоваться такой возможностью. Теперь в ядре 4.5 добавлена специальная защита каталога /sys/firmware/efi/efivars , не позволяющая удалять файлы внутри.

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

Вариант 1. Присоединись к сообществу «сайт», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score!

Новички, которые только только начинают свое знакомство с Linux, первым делом задают себе резонный вопрос: как и где скачать Linux? Казалось бы что тут сложного, но вопрос тем не менее возникает и мне его часто задают.

Определитесь с дистрибутивом Linux

Начну с того, что скорее всего вам нужно скачать дистрибутив Linux. Потому что под общим словом Linux можно понимать, как ядро Linux, так и любой дистрибутив Linux. Позволю себе далее в статье иногда использовать оба этих слова как равнозначные. Вопрос выбора дистрибутива выходит за рамки данной заметки. Ознакомиться с дистрибутивами Linux можно в каталоге дистрибутивов Linux .

Предположим, что вы выбрали себе дистрибутив и хотите его скачать. Каждый дистрибутив Linux обычно можно скачать бесплатно в разных форматах. Обычно они представляют собой ISO файлы. ISO файл — это образ CD или DVD диска. Чаще всего CD или DVD версии отличаются только тем, что на DVD версиях больше различного программного обеспечения, которое вы можете установить прямо с диска либо в процессе установки Linux, либо после установки в любое время.

Какой Linux качать (i386, x86_64, amd64...)

Еще Linux можно скачать под различные платформы. Обычно разработчики дистрибутивов предлагают 32-х битные и 64-х битные версии Linux. Какую вам выбрать зависит прежде всего от разрядности вашего процессора. Как правило, все современные процессоры 64-х битные.

32-х битные версии Linux обычно обозначают как i386, а 64-х битные — x86_64 (для процессоров Intel) и amd64 (для процессоров Amd).

Вы также можете встретить такие названия, как arm, mips, ppc и другие. Это версии Linux специально собранные для процессоров Arm, Mips, PowerPC.

На домашних компьютерах и в ноутбуках обычно используются процессоры Intel или Amd, поэтому вас скорее всего будут интересовать именно i386, x86_64, amd64.

Где скачать дистрибутив Linux

Итак, вы определились с дистрибутивом Linux. Вам остается перейти на сайт разработчика дистрибутива и найти там раздел для скачивания, он может называться как-нибудь типа Downloads, Get It, Get ISO, Скачать, Загрузить.

Одним из самых быстрых способов скачать Linux это использовать торрент файлы. Работает это следующим образом. Вы скачиваете себе torrent файл и с помощью торрент клиента запускаете скачивание уже самого Linux. Торрент клиенты для Linux можно найти в каталоге программ в разделе «Torrent клиенты ».

Одна и та же версия дистрибутива Linux может размещаться на разных серверах (зеркалах). Чем ближе территориально к вам находится сервер и чем выше его пропускная способность, тем быстрее скачаете Linux. Популярным Российским зеркалом, где можно скачать Linux является зеркало от Яндекса: https://mirror.yandex.ru или FTP версия ftp://mirror.yandex.ru

Рассмотрю несколько мест, где можно бесплатно скачать популярные дистрибутивы Linux:

Дистрибутив Где скачать
Ubuntu
  • Скачать Ubuntu Desktop (основная версия Ubuntu для домашнего пользования)
Debian
Arch Linux
Gentoo
OpenSUSE
Fedora
  • ISO образ Fedora (версия Workstation для персонального использования)
  • FTP зеркало на Яндексе (для персонального использования выбирайте версию Workstation)
Slackware
И другие Каталог дистрибутивов Linux (на странице каждого дистрибутива есть ссылка на официальный сайт).

Где скачать ядро Linux

Любую версию исходного кода ядра Linux всегда можно скачать на сайте kernel.org .

Как заказать диск с Linux

Если ни один из способов вам не подходит, то вы можете найти в своем городе энтузиастов, которые согласятся передать вам диск с Linux. Тем более различных Linux сообществ сейчас очень много.