
Релиз ядра Linux 4.x http://kernel.org/
Это примечания к выпуску Linux версии 4. Внимательно прочитайте их, так как в них рассказывается, что это такое, объясняется, как установить ядро, и что делать, если что-то пошло не так.
ЧТО ТАКОЕ LINUX?
Linux — это клон операционной системы Unix, написанный с нуля Линусом Торвальдсом при содействии слабо связанной команды хакеров из Сети. Он нацелен на соответствие POSIX и Single UNIX Specification.
Он обладает всеми возможностями, которые вы ожидаете от современной полноценной Unix, включая настоящую многозадачность, виртуальную память, разделяемые библиотеки, загрузку по требованию, совместно используемые исполняемые файлы с копированием при записи, надлежащее управление памятью и многостековую сетевую поддержку, включая IPv4 и IPv6.
Он распространяется под лицензией GNU General Public License — подробности см. в прилагаемом файле COPYING.
НА КАКОМ ОБОРУДОВАНИИ ОН РАБОТАЕТ?
Хотя изначально Linux разрабатывался для 32-битных PC на базе x86 (386 или выше), сегодня Linux также работает (по крайней мере) на архитектурах Compaq Alpha AXP, Sun SPARC и UltraSPARC, Motorola 68000, PowerPC, PowerPC64, ARM, Hitachi SuperH, Cell, IBM S/390, MIPS, HP PA-RISC, Intel IA-64, DEC VAX, AMD x86-64, AXIS CRIS, Xtensa, Tilera TILE, AVR32 и Renesas M32R.
Linux легко переносится на большинство универсальных 32- или 64-битных архитектур, если они имеют страничный блок управления памятью (PMMU) и порт компилятора GNU C (gcc) (часть коллекции компиляторов GNU, GCC). Linux также был перенесён на ряд архитектур без PMMU, хотя в этом случае функциональность, очевидно, несколько ограничена. Linux также был перенесён на самого себя. Теперь ядро можно запускать как приложение в пространстве пользователя — это называется UserMode Linux (UML).
ДОКУМЕНТАЦИЯ:
Существует множество документации, доступной как в электронном виде в Интернете, так и в книгах, — как посвящённой непосредственно Linux, так и касающейся общих вопросов UNIX. Я бы рекомендовал заглянуть в подкаталоги документации на любом FTP-сайте Linux, где находятся книги LDP (Linux Documentation Project). Этот README не предназначен для того, чтобы быть документацией по системе: есть гораздо лучшие источники.
В подкаталоге Documentation/ находятся различные файлы README: они, как правило, содержат специфичные для ядра заметки по установке, например, для некоторых драйверов. Список того, что содержится в каждом файле, см. в Documentation/00-INDEX. Пожалуйста, прочитайте файл Changes, так как он содержит информацию о проблемах, которые могут возникнуть в результате обновления ядра.
Подкаталог Documentation/DocBook/ содержит несколько руководств для разработчиков и пользователей ядра. Эти руководства можно получить в различных форматах: PostScript (.ps), PDF, HTML и man-страницы, среди прочих. После установки команды "make psdocs", "make pdfdocs", "make htmldocs" или "make mandocs" подготовят документацию в запрошенном формате.
УСТАНОВКА исходного кода ядра:
Если вы устанавливаете полные исходные тексты, поместите tar-архив ядра в каталог, где у вас есть права (например, в ваш домашний каталог), и распакуйте его:
xz -cd linux-4.X.tar.xz | tar xvf -
Замените "X" на номер версии последнего ядра.
НЕ используйте область /usr/src/linux! В этой области находится (обычно неполный) набор заголовков ядра, используемый заголовочными файлами библиотек. Они должны соответствовать библиотеке и не должны портиться из-за того, чем окажется очередное ядро дня.
Вы также можете переходить между выпусками 4.x с помощью патчей. Патчи распространяются в формате xz. Чтобы установить обновление с помощью патчей, получите все новые файлы патчей, войдите в каталог верхнего уровня исходного кода ядра (linux-4.X) и выполните:
xz -cd ../patch-4.x.xz | patch -p1
Замените "x" для всех версий, больших, чем версия "X" вашего текущего дерева исходных текстов, по порядку, и всё должно быть в порядке. Возможно, вы захотите удалить резервные файлы (some-file-name~ или some-file-name.orig) и убедиться, что нет неудачных патчей (some-file-name# или some-file-name.rej). Если они есть, значит, ошибку допустили либо вы, либо я.
В отличие от патчей для ядер 4.x, патчи для ядер 4.x.y (также известных как -stable ядра) не являются инкрементальными, а применяются непосредственно к базовому ядру 4.x. Например, если ваше базовое ядро — 4.0 и вы хотите применить патч 4.0.3, вы не должны сначала применять патчи 4.0.1 и 4.0.2. Аналогично, если у вас работает ядро версии 4.0.2 и вы хотите перейти к 4.0.3, вы должны сначала отменить патч 4.0.2 (то есть выполнить patch -R) до применения патча 4.0.3. Подробнее об этом можно прочитать в Documentation/applying-patches.txt
В качестве альтернативы для автоматизации этого процесса можно использовать сценарий patch-kernel. Он определяет текущую версию ядра и применяет все найденные патчи.
linux/scripts/patch-kernel linux
Первый аргумент в приведённой выше команде — это расположение исходного кода ядра. Патчи применяются из текущего каталога, но в качестве второго аргумента можно указать другой каталог.
Убедитесь, что у вас не осталось устаревших .o файлов и зависимостей:
cd linux make mrproper
Теперь исходные тексты должны быть правильно установлены.
ТРЕБОВАНИЯ К ПРОГРАММНОМУ ОБЕСПЕЧЕНИЮ
Компиляция и запуск ядер 4.x требуют актуальных версий различных программных пакетов. Смотрите Documentation/Changes, чтобы узнать требуемые минимальные номера версий и как получить обновления этих пакетов. Имейте в виду, что использование чрезмерно старых версий этих пакетов может вызывать косвенные ошибки, которые очень трудно отследить, поэтому не рассчитывайте на то, что можно просто обновить пакеты, когда во время сборки или работы возникнут очевидные проблемы.
КАТАЛОГ СБОРКИ для ядра:
При компиляции ядра все выходные файлы по умолчанию будут сохраняться вместе с исходным кодом ядра. Использование опции "make O=output/dir" позволяет указать альтернативное место для выходных файлов (включая .config). Пример:
исходный код ядра: /usr/src/linux-4.X
каталог сборки: /home/name/build/kernel
Чтобы настроить и собрать ядро, используйте:
cd /usr/src/linux-4.X
make O=/home/name/build/kernel menuconfig
make O=/home/name/build/kernel
sudo make O=/home/name/build/kernel modules_install install
Обратите внимание: если используется опция 'O=output/dir', то она должна использоваться при всех вызовах make.
НАСТРОЙКА ядра:
Не пропускайте этот шаг, даже если вы просто обновляетесь на одну минорную версию. В каждом выпуске добавляются новые параметры конфигурации, и возникнут странные проблемы, если файлы конфигурации не настроены должным образом. Если вы хотите перенести существующую конфигурацию на новую версию с минимальными усилиями, используйте "make oldconfig", который задаст вам вопросы только о новых параметрах.
Альтернативные команды конфигурации:
"make config" Текстовый интерфейс.
"make menuconfig" Текстовые цветные меню, радиосписки и диалоги.
"make nconfig" Улучшенные текстовые цветные меню.
"make xconfig" Инструмент конфигурации на базе X Window (Qt).
"make gconfig" Инструмент конфигурации на базе X Window (Gtk).
"make oldconfig" По умолчанию задаёт все вопросы на основе содержимого вашего существующего файла ./.config и спрашивает о новых символах конфигурации.
"make silentoldconfig" Как указано выше, но не засоряет экран вопросами, на которые уже были даны ответы. Кроме того, обновляет зависимости.
"make olddefconfig" Как указано выше, но устанавливает новые символы в их значения по умолчанию без запроса.
"make defconfig" Создаёт файл ./.config, используя значения символов по умолчанию либо из arch/$ARCH/defconfig, либо из arch/$ARCH/configs/${PLATFORM}_defconfig, в зависимости от архитектуры.
"make ${PLATFORM}_defconfig" Создаёт файл ./.config, используя значения символов по умолчанию из arch/$ARCH/configs/${PLATFORM}_defconfig. Используйте "make help", чтобы получить список всех доступных платформ вашей архитектуры.
"make allyesconfig" Создаёт файл ./.config, устанавливая значения символов в 'y' везде, где это возможно.
"make allmodconfig" Создаёт файл ./.config, устанавливая значения символов в 'm' везде, где это возможно.
"make allnoconfig" Создаёт файл ./.config, устанавливая значения символов в 'n' везде, где это возможно.
"make randconfig" Создаёт файл ./.config, устанавливая значения символов в случайные значения.
"make localmodconfig" Создаёт конфигурацию на основе текущей конфигурации и загруженных модулей (lsmod). Отключает все параметры модулей, не нужные для загруженных модулей.
Чтобы создать localmodconfig для другой машины,
сохраните вывод lsmod этой машины в файл
и передайте его как параметр LSMOD.
target$ lsmod > /tmp/mylsmod
target$ scp /tmp/mylsmod host:/tmp
host$ make LSMOD=/tmp/mylsmod localmodconfig
Вышеописанное также работает при кросс-компиляции.
"make localyesconfig" Аналогично localmodconfig, но преобразует все параметры модулей во встроенные (=y) параметры.
КОМПИЛЯЦИЯ ядра:
Убедитесь, что у вас есть как минимум gcc 3.2. Дополнительную информацию см. в Documentation/Changes.
Обратите внимание, что с этим ядром по-прежнему можно запускать пользовательские программы в формате a.out.
Выполните "make" для создания сжатого образа ядра. Также возможно выполнить "make install", если у вас установлен lilo, подходящий для make-файлов ядра, но сначала вам, возможно, стоит проверить вашу конкретную настройку lilo.
Для собственно установки вы должны быть root, но ни одна из обычных операций сборки не должна этого требовать. Не поминайте имя root всуе.
Если вы сконфигурировали какие-либо части ядра как `modules', вам также придётся выполнить "make modules_install".
Подробный вывод компиляции/сборки ядра:
Обычно система сборки ядра работает в довольно тихом режиме (но не полностью молчаливом). Однако иногда вам или другим разработчикам ядра нужно видеть команды компиляции, компоновки и другие команды точно так, как они выполняются. Для этого используйте режим сборки "verbose". Это делается вставкой "V=1" в команду "make". Например:
make V=1 all
Чтобы система сборки также сообщала причину пересборки каждой цели, используйте "V=2". По умолчанию используется "V=0".
Держите под рукой резервное ядро на случай, если что-то пойдёт не так. Это особенно важно для разрабатываемых выпусков, поскольку каждый новый выпуск содержит новый код, который ещё не был отлажен. Убедитесь также, что у вас есть резервная копия модулей, соответствующих этому ядру. Если вы устанавливаете новое ядро с тем же номером версии, что и ваше рабочее ядро, сделайте резервную копию каталога модулей перед выполнением "make modules_install".
В качестве альтернативы, перед компиляцией используйте параметр конфигурации ядра "LOCALVERSION", чтобы добавить уникальный суффикс к обычной версии ядра. LOCALVERSION можно задать в меню "General Setup".
Чтобы загрузить ваше новое ядро, вам нужно скопировать образ ядра (например, .../linux/arch/i386/boot/bzImage после компиляции) туда, где находится ваше обычное загружаемое ядро.
Загрузка ядра непосредственно с дискеты без помощи загрузчика, такого как LILO, больше не поддерживается.
Если вы загружаете Linux с жёсткого диска, скорее всего, вы используете LILO, который использует образ ядра, указанный в файле /etc/lilo.conf. Файлом образа ядра обычно является /vmlinuz, /boot/vmlinuz, /bzImage или /boot/bzImage. Чтобы использовать новое ядро, сохраните копию старого образа и скопируйте новый образ поверх старого. Затем вы ОБЯЗАНЫ ПОВТОРНО ЗАПУСТИТЬ LILO, чтобы обновить карту загрузки!! Если вы этого не сделаете, вы не сможете загрузить новый образ ядра.
Переустановка LILO обычно сводится к запуску /sbin/lilo. Возможно, вы захотите отредактировать /etc/lilo.conf, чтобы указать запись для вашего старого образа ядра (скажем, /vmlinux.old) на случай, если новый не заработает. Дополнительную информацию см. в документации LILO.
ЕСЛИ ЧТО-ТО ПОШЛО НЕ ТАК:
Если у вас возникают проблемы, которые, по-видимому, связаны с ошибками ядра, проверьте файл MAINTAINERS, чтобы узнать, есть ли конкретный человек, связанный с той частью ядра, с которой у вас проблемы. Если там никто не указан, то следующее, что можно сделать, — это отправить их мне ([email protected]) и, возможно, в любой другой соответствующий список рассылки или в группу новостей.
Во всех отчётах об ошибках, пожалуйста, сообщайте, о каком ядре идёт речь, как воспроизвести проблему и какова ваша конфигурация (руководствуйтесь здравым смыслом). Если проблема новая, сообщите мне об этом, а если старая, постарайтесь сказать, когда вы впервые её заметили.
Если ошибка приводит к появлению сообщения вида
unable to handle kernel paging request at address C0000010 Oops: 0002 EIP: 0010:XXXXXXXX eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx ds: xxxx es: xxxx fs: xxxx gs: xxxx Pid: xx, process nr: xx xx xx xx xx xx xx xx xx xx xx
или подобной отладочной информации ядра на вашем экране или в системном журнале, пожалуйста, воспроизведите её точно. Дамп может показаться вам непонятным, но он содержит информацию, которая может помочь в отладке проблемы. Текст над дампом также важен: он сообщает кое-что о том, почему ядро сбросило код (в приведённом выше примере это связано с неверным указателем ядра). Дополнительную информацию о том, как разобраться в дампе, можно найти в Documentation/oops-tracing.txt
Если вы скомпилировали ядро с CONFIG_KALLSYMS, вы можете отправить дамп как есть; в противном случае вам придётся использовать программу "ksymoops", чтобы разобраться в дампе (но компиляция с CONFIG_KALLSYMS обычно предпочтительнее). Эту утилиту можно загрузить с ftp://ftp..kernel.org/pub/linux/utils/kernel/ksymoops/ . В качестве альтернативы вы можете выполнить поиск по дампу вручную:
При отладке дампов, подобных приведённому выше, чрезвычайно помогает, если вы можете выяснить, что означает значение EIP. Само по себе шестнадцатеричное значение не очень помогает мне или кому-либо ещё: оно зависит от вашей конкретной конфигурации ядра. Что вам следует сделать: возьмите шестнадцатеричное значение из строки EIP (игнорируя "0010:") и найдите его в таблице имён ядра, чтобы узнать, какая функция ядра содержит проблемный адрес.
Чтобы узнать имя функции ядра, вам нужно найти системный двоичный файл, связанный с ядром, у которого проявился симптом. Это файл 'linux/vmlinux'. Чтобы извлечь таблицу имён и сопоставить её с EIP из сбоя ядра, выполните:
nm vmlinux | sort | less
Это даст вам список адресов ядра, отсортированных по возрастанию, из которого легко найти функцию, содержащую проблемный адрес. Обратите внимание, что адрес, указанный в отладочных сообщениях ядра, не обязательно будет точно совпадать с адресами функций (на самом деле это маловероятно), поэтому вы не можете просто 'grep' по списку: однако список даст вам начальную точку каждой функции ядра, поэтому, найдя функцию с начальным адресом, меньшим искомого, за которой следует функция с большим адресом, вы найдёте нужную. На самом деле, в отчёт о проблеме может быть полезно включить немного "контекста", приведя несколько строк вокруг интересующей.
Дополнительную информацию об использовании инструментов конфигурации ядра Linux можно найти в Documentation/kbuild/kconfig.txt
ПРИМЕЧАНИЯ по "make config":
Наличие ненужных драйверов увеличит ядро и в некоторых случаях может привести к проблемам: опрос несуществующей платы контроллера может сбить с толку ваши другие контроллеры
Компиляция ядра с "Processor type" выше 386 приведёт к тому, что ядро НЕ будет работать на 386. Ядро обнаружит это при загрузке и остановится.
Ядро со встроенной эмуляцией математического сопроцессора по-прежнему будет использовать сопроцессор, если он присутствует: в этом случае эмуляция просто никогда не будет задействована. Ядро будет немного больше, но будет работать на разных машинах независимо от того, есть ли у них математический сопроцессор.
Параметры конфигурации "kernel hacking" обычно приводят к большему или более медленному ядру (или к тому и другому) и могут даже сделать ядро менее стабильным, настраивая некоторые процедуры на активные попытки ломать плохой код для поиска проблем в ядре (kmalloc()). Поэтому, вероятно, вам следует отвечать 'n' на вопросы о возможностях "development", "experimental" или "debugging".
После переустановки LILO всё должно быть готово. Выключите систему, перезагрузитесь и наслаждайтесь!
Если вам когда-либо понадобится изменить устройство root по умолчанию, видеорежим, размер ramdisk и т.д. в образе ядра, используйте программу 'rdev' (или, в соответствующих случаях, параметры загрузки LILO). Нет необходимости перекомпилировать ядро для изменения этих параметров.
Перезагрузитесь с новым ядром и наслаждайтесь.
Если вы по какой-то причине не можете сделать вышеописанное (у вас предварительно скомпилированный образ ядра или что-то подобное), поможет максимально подробное описание вашей конфигурации. Подробности см. в документе REPORTING-BUGS.
В качестве альтернативы вы можете использовать gdb на работающем ядре. (только для чтения; то есть вы не можете изменять значения или устанавливать точки останова.) Для этого сначала скомпилируйте ядро с -g; соответствующим образом отредактируйте arch/i386/Makefile, затем выполните "make clean". Вам также нужно будет включить CONFIG_PROC_FS (через "make config").
После перезагрузки с новым ядром выполните "gdb vmlinux /proc/kcore". Теперь вы можете использовать все обычные команды gdb. Команда для поиска точки, в которой произошёл сбой вашей системы, — "l *0xXXXXXXXX". (Замените XXX на значение EIP.)
Использование gdb на незапущенном ядре в настоящее время не работает, потому что gdb (ошибочно) игнорирует начальное смещение, с которым скомпилировано ядро.