Полезное
Навигация
Поиск
Статьи / Администрирование / Учебный курс. Установка и администрирование ОС Linux на серверах IBM System x: Часть 3
Ядро. Управление/Мониторинг ядра и модулей во время выполнения. Настройка, сборка и установка нестандартного ядра и модулей. Загрузка системы. Смена уровня выполнения, останов или перезагрузка системы.
Управление/Мониторинг ядра и модулей во время выполнения
Описание
Соискатели должны уметь управлять и/или осуществлять мониторинг работы ядра и его модулей. Это подразумевает навыки сбора информации о работающем ядре и его модулях с помощью средств командной строки, а также загрузки/выгрузки модулей вручную. Здесь также необходимо уметь определять, какие модули могут быть выгружены и какие параметры они получают. Соискатели должны уметь конфигурировать систему так, чтобы загружать модули по имени, отличающемуся от названия файла модуля.
Ключевые слова, файлы и утилиты
/lib/modules/kernel-version/modules.dep
/etc/modules.conf & /etc/conf.modules
depmod
insmod
lsmod
rmmod
modinfo
modprobe
uname
Модульные и монолитные ядра
Linux может иметь как модульное, так и монолитное ядро:
Модульное ядро имеет набор драйверов и скомпилированных модулей, которые оно может загружать или выгружать по запросу. Все загружаемые модули представляют собой в объектные файлы и хранятся в директории /lib/modules.
В монолитном ядре все драйвера встроены в него самого. Монолитное ядро представляет собой единый файл. Любое аппаратное устройство, сетевая технология или файловая система, которую поддерживает ядро, увеличивает окончательный размер файла.
Преимущества модульного ядра:
Он загружает/выгружает модули по запросу, что позволяет экономить память;
Не требуется останавливать систему при добавлении нового драйвера.
Преимущества монолитного ядра:
Быстрая загрузка;
Легкость в управлении.
Ядро может быть установлено так, что модули загружаются автоматически или соединены с ядром. В ядре, каждый модуль можно настроить на то, чтобы он был присоединен к ядру или загружался, когда это необходимо.
Большинство дистрибутивов Linux поддерживают широкий ряд устройств и функций. Именно для экономии размера, в в стандартной поставке ядра всегда используется модульная архитектура.
Причины, по которым необходимо компилировать драйверы как модули таковы:
Можно менять скорость работы, функциональность или размер ядра;
Можно обновлять драйвер нового устройства/процедуры или исправлять ошибки во время работы системы.
Демон ядра, который загружает модули автоматически, называется kmod. Демон cron позволяет выгружать неиспользуемые модули.
Просмотр загруженных модулей
В Linux, процедуры ядра и драйвера называются модулями. Однако, модуль необязательно работает с устройством. Например, реализации протокола, дополняющего IP, также будут модулем.
Все модули могут быть частью ядра, или динамически загружаться в него после старта системы. Функция lsmod позволяет вывести список загруженных модулей работающего ядра.[root@test /]# lsmod
Module Size Used by Not tainted
parport_pc 25448 1 (autoclean)
lp 5824 0 (autoclean)
parport 21856 1 (autoclean) [parport_pc lp]
ipv6 123424 -1 (autoclean)
isa-pnp 27816 0 (unused)
joydev 5728 0 (unused)
evdev 3904 0 (unused)
input 3072 0 [joydev evdev]
usb-uhci 20996 0 (unused)
usbcore 55136 1 [usb-uhci]
Информация, выдаваемая функцией lsmod также доступна в файле /proc/modules.
Сбор информации о модуле
Для сбора информации об модуле используется команда modinfo.modinfo [options] [module]
Несколько стандартных опций:
-a: Отображает автора модуля.
-d: Отображает описание модуля.
-n: Отображает имя файла модуля.
-p: Отображает типы параметров, поддерживаемых модулем
Например:[root@test /]# modinfo usb-uhci
filename: /lib/modules/2.6.3-7mdk/kernel/drivers/usb/host/usb-uhci.o.gz
description: "USB Universal Host Controller Interface driver"
author: "Georg Acher, Deti Fliegl, Thomas Sailer, Roman Weissgaerber"
license: "GPL"
[root@test /]# modinfo -n reiserfs
/lib/modules/2.6.3-7mdk/kernel/fs/reiserfs/reiserfs.o.gz
[root@test /]# modinfo -p cdrom
debug int
autoclose int
autoeject int
lockdoor int
check_media_type int
Зависимости модулей
Файл базы данных зависимостей модулей /lib/modules/<kernel-version>/modules.dep содержит все связи между модулями.
Этот файл создается командой /sbin/depmod -a или при загрузке системы одним из сценариев /etc/rc.d.
Чтобы вручную создать файл зависимостей модулей modules.dep, используйте команду depmod:depmod [options] [module]
Вот некоторые опции команды:
-a: Поиск модулей во всех директориях, определенных в необязательном конфигурационном файле /etc/modules.conf,
-e: Отобразить неразрешенные символы для каждого модуля.
В файле /etc/modules.conf могут содержаться параметры модуля (номера IRQ или портов ввода/вывода), однако чаще всего он содержит только псевдонимы. Псевдоним (alias) позволяет приложению обращаться к устройству, используя общую схему именования. Так, eth0 обозначает первый сетевой интерфейс (NIC), независимо от конкретного названия драйвера.
Например:[root@test /]# depmod
# Create the file modules.dep for all the modules found in /lib/modules/2.6.3-7mdk.
[root@test /]# depmod -e -n abi-svr4.o
depmod: * Unresolved symbols in abi-svr4.o
depmod: vfs_fstat
depmod: vfs_stat
depmod: vfs_lstat abi-svr4.o:
Использование устройств
Любому приложению необходим драйвер или модуль, для взаимодействия с устройством. В Linux, каждое устройство доступно через специальный файл в файловой системе.
/dev - стандартный каталог, в которой расположены файлы всех устройств.
Устройства, работающие под Linux, принято делить на два типа:
Символьное устройство: оперирует информацией как потоком данных (без использования буфера).
Блочное устройство: устройство хранения больших объемов информации, которое оперирует данными как блоками (используя буфер). Минимальный блок данных, который ядро может использовать при взаимодействии с устройством - 512 байт.
Файлы, расположенные в каталоге /dev, создаются при загрузке функцией mknod с предопределенным значением или поддерживаются демонами devfs или udev.
И у символьных, и у блочных устройств, перечисленных в директории /dev, есть главный (major) и добавочный (minor) номера.
Главное значение используется ядром для поиска модуля, соответствующего заданному файлу в каталоге /dev.
Дополнительное значение используется внутри модуля.
Устройство становится доступно приложению при наличии специального файла, обычно расположенного в директории /dev.
Например:[root@test /]# cat /dev/ttyS0
# Вывести данные, поступающие в последовательный порт COM1
[root@test /]# cat readme > /dev/ttyS0
# Послать файл readme в порт COM1.
Для дополнительной информации смотрите файл Documentation/devices.txt.
Автоматическая загрузка модулей
Команда, вызываемая ядром для автоматической загрузки модуля и всех его зависимостей - modprobe.modprobe [options] [module]
Некоторые стандартные опции:
-a: Загрузка всех модулей, удовлетворяющих заданному шаблону
-c: Вывод текущей конфигурации
-l: Вывод всех модулей, удовлетворяющих заданному шаблону
-r: Удаление модуля
Например:[root@test /]# modprobe -v slip
# Загрузить драйвер SLIP и его зависимости.
/sbin/insmod /lib/modules/2.6.3-7mdk/kernel/drivers/net/slhc.o
Using /lib/modules/2.6.3-7mdk /kernel/drivers/net/slhc.o
Symbol version prefix ''
/sbin/insmod /lib/modules/2.6.3-7mdk /kernel/drivers/net/slip.o
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o
Конфигурация модуля
При загрузке модуля утилитой modprobe используется файл /etc/modules.conf.Он содержит информацию о том, как загружать модули, их псевдонимы, команды, которые необходимо выполнить, и т.д.
Для вывода текущих настроек используйте функцию modprobe -c. Все значения по умолчанию могут быть изменены в файле /etc/modules.conf.
Команды, определенные в файле /etc/modules.conf могут выполняться при загрузке или выгрузке модуля. Они вызываются при событиях:
перед установкой (pre-install)
после установки (post-install)
перед удалением (pre-remove)
после удаления (post-remove)
Например:[root@test /]# modprobe -c
path[boot]=/lib/modules/boot
path[toplevel]=/lib/modules/2.6.3-7mdk
prune modules.dep
prune modules.generic_string
alias block-major-2 floppy
alias char-major-4 serial
alias char-major-5 serial
options snd-intel8x0 snd_ac97_clock=0 snd_enable=1 snd_index=0
pre-install mga /sbin/modprobe "-k" "agpgart"
usbmapfile=/lib/modules/2.6.3-7mdk/modules.usbmap
depfile=/lib/modules/2.6.3-7mdk/modules.dep
Установка модуля вручную
Для установки модуля вручную, используйте команду insmod.insmod [options] [module]
Для благополучной загрузки модуля необходимо, чтобы были разрешены все имеющиеся в нем символы. Иначе установка не пройдет.
Стандартные опции:
-k: Установить модуль с флагом autoclean.
-L: Заблокировать файл модуля на время загрузки.
-p: Проверить, возможна ли успешная загрузка.
Автоматически загружаемые модули будут помечены словом autoclean.
Например:[root@test /]# insmod -p slip
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o
Symbol version prefix ''
/lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o: unresolved symbol slhc_init
/lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o: unresolved symbol slhc_free
[root@test /]# insmod slhc
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slhc.o
[root@test /]# insmod slip
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o
[root@test /]# rmmod slhc
slhc: Device or resource busy
[root@test /]# rmmod slhc
slhc: Device or resource busy
Выгрузка модуля вручную
Для удаления модуля вручную предназначена команда rmmod.rmmod [options] [module]
Для благополучной загрузки модуля необходимо, чтобы были разрешены все имеющиеся в нем символы. Иначе установка не пройдет.
Некоторые стандартные опции:
-a: Выполнить процедуру autoclean. Все модули, помеченные этим флагом будут выгружены, если не используются.
-r: Рекурсивно выгрузить все модули.
Например:[root@test /]# modprobe -v slip
/sbin/insmod /lib/modules/2.6.3-7mdk/kernel/drivers/net/slhc.o
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slhc.o
Symbol version prefix ''
/sbin/insmod /lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o
[root@test /]# rmmod -rv slip
Checking slip for persistent data Checking slhc for persistent data
Символы ядра и модуля.
Для вывода символов ядра на экран предназначена команда ksyms.ksyms [options]
Для благополучной загрузки модуля необходимо, чтобы были разрешены все имеющиеся в нем символы. Иначе установка не пройдет.
Некоторые стандартные опции:
-a: Вывод всех символов ядра
-m: Вывод всех символов модулей
Например:[root@test /]# ksyms -m
...
c2ac5698 pcmcia_release_io [pcmcia_core]
c2ac5764 pcmcia_release_irq [pcmcia_core]
c2ac5830 pcmcia_release_window [pcmcia_core]
c2ac088c pcmcia_replace_cis [pcmcia_core]
c2ac6464 pcmcia_report_error [pcmcia_core]
c2ac58c0 pcmcia_request_configuration [pcmcia_core]
c2ac5c90 pcmcia_request_io [pcmcia_core]
...
Версии ядра.
Все версии ядра выводятся на экран командой uname.uname [options]
Для благополучной загрузки модуля необходимо, чтобы были разрешены все имеющиеся в нем символы. Иначе установка не пройдет.
Некоторые стандартные опции:
-r: Вывести релиз операционной системы
-s: Вывести название операционной системы
-p: Вывести тип процессора
Примеры:[root@test /]# uname -s
Linux
[root@test /]# uname -r
2.6.3-7mdk
[root@test /]# uname -a
Linux linux 2.6.3-7mdk #1 Wed Mar 27 13:57:05 UTC 2002 i686 unknown
Проверь себя
Список вопросов:
Что такое ядро?
Где находятся модули в файловой системе?
Какая команда выводит на экран список загруженных модулей?
Можно ли загрузить в ядро версии 2.6 модуль версии 2.4.?
Где обычно хранятся модули драйверов устройств?
Каковы преимущества использования модулей в ядре?
Какая команда выгружает модуль из ядра?
Ответы
Ответы на вопросы:
Ядро – это приложение, назначение которого управлять определенной процессорной платой. Три его основных функции – это работа с:
приложениями;
аппаратным обеспечением и программными прерываниями;
модулями;
В директории /lib/modules.
Команда lsmod.
Нет, нельзя.
В директории /lib/modules/[релиз ядра]/kernel/drivers.
Экономия оперативной памяти.
Команда rmmod.
Упражнения
Упражнение 1
Установите Mandriva Linux 2007.1 Power Pack+ на вашу систему со стандартной конфигурацией (по умолчанию).
Упражнение 2
Выведите на экран список всех загруженных в вашу систему модулей.
Упражнение 3
Соберите информацию о модуле snd и всех его зависимостях.
Упражнение 4
Каков главный номер устройства для модуля sound и какие файлы соответствуют ему в каталоге /dev?
Упражнение 5
Найдите модуль x25 и загрузите его в ядро.
Упражнение 6
Измените соответствующий файл так, чтобы модуль x25 загружался в ядро автоматически, когда какое-то приложение пытается им воспользоваться.
Решения
Решение 1
Следуйте подсказкам и перезагрузите систему.
Решение 2
Используйте команду lsmod.
Решение 3
Для получения информации используйте команду modinfo snd. Для того, чтобы определить зависимости модуля snd, используйте команду depmod и просмотрите файл /lib/modules2.6.3-7mdk/modules.dep.
Решение 4
Главный номер, используемый модулем sound, находится в директории /proc/devices. Для того, чтобы найти файлы в каталоге /dev, выберите все символьные устройства с главным номером, совпадающим с указанным в /proc/devices.
Настройка, сборка и установка нестандартного ядра и модулей.
Решение 5
Используйте команду insmod:[root@test /]# insmod /lib/modules/2.6.3-7mdk/kernel/net/x25/x25.o.gz
При помощи команды lsmod, проверьте, корректно ли проведена загрузка.
Решение 6
Добавьте команду modprobe в файл /etc/modules.conf.
Описание
Соискатели должны уметь настраивать, создавать и устанавливать ядро и загружаемые модули из исходных текстов. Это означает умение изменять текущую конфигурацию ядра, собирать новые ядра и модули для него, а также умение устанавливать новое ядро с соответствующими ему модулями и осуществлять проверку того, определил ли загрузчик системы новое ядро и связанные с файлы.
Ключевые слова, файлы и утилиты
/usr/src/linux/*
/usr/src/linux/.config
/lib/modules/kernel-version/*
/boot/*
make
make targets: config, menuconfig, xconfig, oldconfig, modules, install, modules_install, depmod
Для чего необходимо новое ядро?
Каждый, кто устанавливает Linux, уже имеет стандартное ядро, которое предоставляет множество функций и поддерживает все типы устройств.
Для того, чтобы Linux работал быстрее, используя меньший объем оперативной памяти, или просто имел большее количество функций, необходимо собрать новое ядро.
Таким образом, ядро будет в точности соответствовать системным требованиям.
По умолчанию ядро располагается в каталоге /boot, и его образ часто называется vmlinuz.
Имя ядра определяется во время сборки и используется загрузчиком LILO или GRUB.
Ядро, которое запускает загрузчик LILO, определяется в конфигурационном файле /etc/lilo.conf. Ядро, которое загружается с помощью GRUB - в конфигурационном файле /boot/grub/menu.lst.
Исходные тексты любого ядра, модулей и библиотеки располагаются в каталоге /usr/src/[релиз ядра].
В этом каталоге расположены все сброные файлы (Makefile), необходимые для компиляции ядра, модулей и библиотек.
Для того, чтобы скомпилировать новое ядро, Вам понадобится среда разработки GNU и ее инструментарий.
Инструментарий GNU
В операционной системе Linux, практически все исходные файлы могут быть скомпилированы при помощи стандартного набора утилит из состава инструментария GNU, GNU Toolchain.
Команда make использует правила и цели (targets), определенные в файле Makefile. Вы можете собрать целевые файлы при помощи команд make all; make clean, и т.д., которые также определяются в Makefile.
Правила поддержки группы программ определены в файле Makefile вместе с их зависимостями, для которых установлены соответствующие действия в случае, если зависимость не удовлетворена.
Основными инструментами GNU Toolchain являются:
gcc: Набор компиляторов GNU
g++: Компилятор С++ в GNU
make: команда GNU, использующая файлы Makefile
Примеры файла Makefile:# Команда make all осуществляет создание целевого объекта main в случае,
# если она не существует или файлы header.h и main.c были изменены
all: main
main: main.c header.h
gcc –o main main.c
# Команда make clean удаляет команду main
clean:
rm -rf main
Пример файла на С:int main()
{
printf(“Привет, добро пожаловать\n”);
}
Задача
Создайте файл на С и сохраните его под именем main.c. Скомпилируйте и выполните его:vi main.c
gcc -o main main.c
./main
Сборочный файл (Makefile) ядра.
Файл Makefile, расположенный в каталоге /usr/src/linux, состоит из пяти частей:
Makefile: командный файл верхнего уровня, который выполняет сборку образа ядра bzImage и всех его модулей.
.config: Конфигурация ядра, расположенная в директории /usr/src/linux.
arch/x86/Makefile: зависящий от архитектуры Makefile
Файлы Makefile в подкаталогах: Рекурсивно вызываются из файла Makefile верхнего уровня и отвечают за сборку драйверов, системных вызовов и проч.
Rules.make: Общие правила для всех файлов Makefile.
Makefile верхнего уровня использует конфигурацию ядра, расположенную в /usr/src/linux/.config, для его сборки. В этот файл необходимо внести изменения, если вы хотите, чтобы ядро удовлетворяло вашим специфическим требованиям.
Настройка и сборка ядра
Перед созданием ядра, в файл /usr/src/linux/.config необходимо внести нужные вам изменения. Это можно сделать при помощи следующих команд:[root@test /]# make xconfig
# Утилита для настройки, работающая в среде X-Window.
[root@test /]# make menuconfig
# Текстовая утилита для настройки.
[root@test /]# make oldconfig
# Загрузить крнфигурацию по умолчанию из существующего файла .config file.
[root@test /]# make config
# Следует избегать, т.к. Ядро получается чересчур большим.
После изменения файла .config для определения новых возможностей ядра, оно должно быть собрано при помощи команды make bzImage.[root@test /]# make bzImage
Новый образ ядра будет помещен в файл /usr/src/[_ЯДРО_РЕЛИЗ_]/arch/i386/boot/bzImage.
Для установки ядра в каталог /boot используйте команду:[root@test /]# make install
Для создания и установки модулей в соответствующие каталоги выполните последовательно команды make modules и make modules_install.
Пример:[root@test /]# make modules
[root@test /]# make modules_install
Использование пакетов kernel-package для Debian.
Установите пакеты kernel-package и kernel-source-*.
Действуя от имени root, распакуйте его и сделайте доступным для чтения непривилегированному пользователю:[root@test /]# cd /usr/src
[root@test /]# tar xvjf kernel-source-*
[root@test /]# chown -R [user] kernel-source-*
([user] to be replaced with your login name)
Сконфигурируйте ядро согласно вашим требованиям:[root@test /]# cd /usr/src/kernel-source-*
[root@test /]# make xconfig
Для того, чтобы сделать резервную копию, сохраните конфигурацию в файл и выйдите.
Скомпилируйте ядро:[root@test /]# make-kpkg clean
[root@test /]# make-kpkg -rev 19.06.2003.firewall kernel_image
Это позволит Вам создать пакет Debian. Вы сможете найти его в каталоге /usr/src/.
Установите ядро:[root@test /]# dpkg -i /usr/src/kernel-image-*_19.06.2003.firewall_i386.deb
Системный загрузчик
Загрузчик LILO или GRUB позволяет выбрать образ ядра при загрузке. Как правило, образ ядра находится в директории /boot.
Для загрузчика LILO конфигурационный файл /etc/lilo.conf может быть настроен так, чтобы позволить пользователю самому выбирать загрузку нескольких вариантов ядра из нескольких директорий.
Для загрузчика GRUB, требуется изменить файл /boot/grub/menu.lst.
Для того, чтобы загрузить последнее созданное ядро, необходимо скопировать образ ядра из каталога /usr/src/[ядро_релиз]/arch/i386/boot/bzImage в каталог /boot/.[root@test /]# cp /usr/src/[KERNEL_RELEASE]/arch/i386/boot/bzImage
/boot/myvmlinuz
После этого в конфигурационный файл lilo.conf необходимо добавить запись, указывающую на образ myvmlinux, после чего запустить команду /sbin/lilo. Загрузчик запишет новую информацию в загрузочный сектор.
Загрузчик GRUB позволяет непосредственно выбрать новое ядро, посколько он работает напрямую с файловой системой.
После перезагрузки вы сможете выбрать новое ядро.
Совет. Перед тем, как перезаписать работающее ядро, безопаснее всего будет сделать резервную копию. Также рекомендуется добавить новое ядро в конфигурационный файл lilo.conf перед заменой работающего ядра. Таким образом, вы всегда сможете установить работоспособное ядро вместо некорректно созданного.
Более подробную информацию Вы можете найти в файлах Documentation/kbuild/makefiles.txt и Documentation/kbuild/modules.txt.
Проверь себя
Список вопросов:
Является ли драйвер модулем ядра?
Как бы вы обновили модуль, не пересобирая ядро?
Почему для сервера рекомендуют ставить монолитное ядро?
Где расположены конфигурационные файлы загрузчиков LILO и GRUB?
Что необходимо установить для того, чтобы успешно выполнить команду make xconfig для ядра версии 2.6?
Необходимо ли выполнять команду make dep для ядра версии 2.6?
Ответы
Ответы на вопросы:
Да, действительно, драйвер является модулем ядра, обеспечивающим взаимодействие ядра с аппаратным обеспечением.
С помощью последовательного выполнения команд make modules и make modules_install.
Потому что необходимость динамической загрузки модулей слишком замедляет работу и нарушает систему безопасности сервера.
Для LILO - в /etc/lilo.conf, а для GRUB - в /boot/grub/menu.lst.
Библиотеки разработки Qt.
Нет.
Упражнение
Установите исходные тексты ядра, если они отсутствуют в вашей системе.
Зайдите в каталог /usr/src/linux.
Выполните команду make xconfig.
Добавьте или удалите ISDN – протокол.
Сохраните файл и выйдите.
Выполните команду make bzImage.
Определите местонахождение нового ядра и скопируйте его в каталог /boot, назвав myvmlinux.
Добавьте ваше новое ядро в конфигурационный файл /etc/lilo.conf.
Запустите загрузчик LILO.
Перезапустите операционную систему.
Загрузите вновь созданное ядро.
Загрузка системы
Описание
Соискатели должны уметь управлять системой во время ее загрузки. Это включает в себя управление загрузчиком операционной системы и передачу параметров ядру во время загрузки, а также анализ событий по журнальным файлам.
Ключевые слова, файлы и утилиты
/var/log/messages
/etc/conf.modules, /etc/modules.conf
dmesg
LILO
GRUB
Параметры ядра
Во время старта загрузчик операционной системы может передавать ядру некоторые параметры.
Таким образом, ядро "узнает", что необходимо выполнить во время загрузки: не монтировать определенный раздел, поддерживать определенное устройство, загрузиться в режиме отладки и т.д.
Передача параметров ядра через загрузчик LILO.
При работе с LILO, параметры необходимо определять в файле /etc/lilo.conf либо вводить с клавиатуры во время загрузки ядра.
Пример конфигурационного файла /etc/lilo.conf:image=/boot/vmlinuz
label="linux"
root=/dev/hda1
initrd=/boot/initrd.img
append="devfs=mount hdc=ide-scsi acpi=ht resume=/dev/hda5
splash=silent"
vga=788
В ответ на приглашение LILO, вы должны набрать параметры, которые хотите передать ядру.
Пример загрузки ядра в режиме отладки:#vmlinux debug
Передача параметров ядра через загрузчик GRUB.
Процедура аналогична применяемой в LILO.
Пример файла /boot/grub/menu.lst:# GRUB default values
timeout 10 # Загрузка ядра по умолчанию через 10 секунд
default 0 # Ядро по умолчанию
# Grub для 0 раздела Linux
title GNU/Linux # Заголовок
root (hd0,1) # Корневая файловая система /dev/hda2
# Образ ядра и параметры, передаваемые ядру
kernel /boot/vmlinuz root=/dev/hda2 read-only
initrd /boot/initrd
boot
Для передачи параметров перед загрузкой ядра, вводите их в интерактивном режиме загрузчика grub.
Зарегистрированные сообщения ядра
Когда система загружается, интересно иметь возможность осуществлять мониторинг или видеть на экране каждый из этапов, который она проходит.
Команда dmesg выводит на экран журнал сообщений ядра. Если возникает ошибка, ее вывод можно послать любому, кто будет ее отлаживать.dmesg [options]
Стандартные опции:
-s bufsize: Установить размер буфера для опроса кольцевого буфера ядра равным bufsize. Значение по умолчанию - 8196.
-n level: Установить уровень, на котором будет происходить регистрация сообщений.
Эта команда полезна в тех случаях, когда ошибка возникает до того, как система полностью загрузится.
Пример:[root@test /]# dmesg > kernel.boot
Ядро и приложения начинают заносить сообщения о своих ошибках в файл /var/log/messages сразу же после того, как будет смонтирована файловая система.
Этот файл полезен в тех случаях, когда возникают ошибки при загрузке новых модулей, выполнении новых команд / приложений и т.д.
Журнальные файлы подвергаются ротации. Частота ротации определяется в конфигурационном файле /etc/logrotate.d/syslog.
Последовательность загрузки
BIOS компьютера запускает загрузчик операционной системы.
Загрузчик помещает образ ядра в оперативную память и эмулирует файловую систему в виде электронного диска, называемого initrd.
Основная файловая система initrd, расположенная в оперативной памяти, позволяет ядру подключать другие файловые системы из разделов жесткого диска. Примерами различных каталогов, которые могут быть установлены на логических разделах, являются /, /home и другие.
Когда корневая файловая система подключена, начинает выполняться файл /sbin/init. Процесс init всегда является первым приложением / процессом, которое запускается после старта ядра. Он также является родителем всех других процессов.
Именно процесс init запускает все конфигурационные скрипты для достижения определенного уровня выполнения (runlevel).
Процесс init всегда работает в фоновом режиме.
Конфигурационный файл процесса /sbin/init называется /etc/inittab, здесь вы можете задать параметры для инициализации системы и каждого уровня выполнения.
Сценарий, контролирующий инициализацию системы (в дистрибутивах, основанных на Red Hat - /etc/rc.d/rc.sysinit, а в системах на базе Debian - /etc/init.d/rcS и /etc/init.d/rcS.d/*), обычно:
конфигурирует модули
проверяет и подключает файловые системы
запускает демоны ядра
настраивает сеть
Далее, при загрузке определенного уровня выполнения, процесс init, запустит все сценарии из каталога, определенного в файле inittab для данного уровня. (в дистрибутивах Mandriva: /etc/rc.d/rc[runlevel].d)
Проверь себя
Список вопросов:
Что такое initrd?
Какой конфигурационный файл используется процессом init во время загрузки?
Где расположен исполняемый файл процесса init?
Какие команды / файлы позволяют администратору просматривать журналы загрузки до того, как будут подключены файловые системы?
Ответы
Ответы на вопросы:
initrd - это место в оперативной памяти, которое будет использоваться ядром во время загрузки, для подключения локальных и удаленных файловых систем.
Файл /etc/inittab.
/sbin/init.
Команда dmesg.
Смена уровня выполнения, останов или перезагрузка системы.
Описание
Соискатели должны уметь управлять уровнями выполнения системы. Это включает в себя переход в однопользовательский режим, выключение или перезагрузку системы. Соискатели должны уметь предупреждать пользователей перед изменением режима работы, и должным образом завершать процессы. Кроме того, соискатели должны уметь устанавливать уровень выполнения, используемый по умолчанию.
Ключевые слова, файлы и утилиты
/etc/inittab
shutdown
init
Уровни выполнения
После того, как система стартовала, процесс инициализации /sbin/init переключается на уровень выполнения, определенный по умолчанию в файле /etc/inittab.id:5:initdefault:
В данном случае, по умолчанию устанавливается уровень 5.
Для управления службами уровня выполнения, ссылки на соответствующие сценарии размещаются в каталогах данного уровня /etc/init.d/rc<X>.d/, где <X>=0,1,2,3,4,5,6,S – номера уровней. Вы можете найти несколько ссылок в директории /etc/rc5.d.lrwxrwxrwx 1 root root 20 Jul 27 15:24 K15postgresql -> ../init.d/postgresql
lrwxrwxrwx 1 root root 16 Jul 27 15:24 K55routed -> ../init.d/routed
lrwxrwxrwx 1 root root 18 Jul 27 15:14 S03iptables -> ../init.d/iptables
lrwxrwxrwx 1 root root 16 Jul 27 15:15 S04pcmcia -> ../init.d/pcmcia
lrwxrwxrwx 1 root root 19 Jul 27 15:15 S05harddrake -> ../init.d/harddrake
lrwxrwxrwx 1 root root 17 Jul 27 15:29 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 17 Jul 27 15:29 S11portmap -> ../init.d/portmap
lrwxrwxrwx 1 root root 16 Jul 27 15:29 S12syslog -> ../init.d/syslog
lrwxrwxrwx 1 root root 17 Jul 27 15:09 S13partmon -> ../init.d/partmon
Существует два типа символьных ссылок:
Ссылки, названия которых начинаются с символа 'K': они вызываются с аргументом stop.
Ссылки, названия которых начинаются с символа 'S': они вызываются с аргументом start.
Наиболее распространенные уровни выполнения приведены в таблице 1.
Таблица 1. Уровни выполненияНомер уровня Описание
0 Режим отключения
1 Однопользовательский режим или режим сопровождения
2 Локальный многопользовательский режим без поддержки сети
3 Многопользовательский режим с поддержкой сети
4 Не используется, оставлен для специфических нужд
5 Многопользовательский режим с поддержкой сети и X-Window (xdm)
6 Перезагрузка системы
S или s Режим загрузки (Startup), а также псевдоним для уровня 1
Программа init.
С помощью команды init вы можете изменить уровень выполнения:init [options] [0123456SsQqUuAaBbCc]
Некоторые опции:
-b: Аварийная загрузка напрямую в оболочку в однопользовательском режиме.
-s: Загрузка в однопользовательском режиме.
Примеры:[root@test /]# init 0 # останов системы
[root@test /]# init 6 # перезагрузка системы
Когда Вы меняете уровень выполнения, ссылки в каталоге /etc/rc, отвечающем новому уровню, упорядочиваются в алфавитном порядке, К – ссылки перед S – ссылками, а затем по двузначному номеру. Это обеспечивает корректное разрешение зависимостей между службами.
Последовательность останова и перезагрузки
Для корректного останова системы используйте команду shutdown.shutdown [time] [сообщение - предупреждение]
Для сиюминутной остановки:[root@test /]# shutdown -now
Для остановки и перезагрузки системы в 8 часов вечера:[root@test /]# shutdown -r 20:00
Для остановки системы:[root@test /]# init 0
Для перезагрузки системы:[root@test /]# init 6
В некоторых системах сочетание клавиш Ctrl+Alt+Delete, предопределенное в файле /etc/inittab, также позволяет осуществить остановку системы.
Проверь себя
Список вопросов:
Какая программа загружает ядро в оперативную память?
Что происходит на уровне 0?
В каком файле определены уровни выполнения?
Какая команда позволяет изменить уровень выполнения?
Какой уровень выполнения установлен по умолчанию для вашей системы?
Какие существуют команды для остановки системы?
Ответы
Ответы на вопросы:
Системный загрузчик.
Остановка системы.
В файле /etc/inittab.
Команда init [уровень выполнения].
Определите по файлу /etc/inittab.
команда shutdown now,
команда init 0,
сочетание клавиш CTR+ALT+DEL.
Упражнения
Упражнение 1
Как вы передадите параметры в ядро для того, чтобы загрузиться с /dev/hdb?
Упражнение 2
Измените назначение сочетания клавиш Ctrl+Alt+Delete на : напечатать Hello Linux, - вместо перезагрузки.
Решения
Решение 1boot=/dev/hdb
Решение 2
Отредактируйте файл /etc/inittab и добавьте в него следующие строки:# Сочетание клавиш CTRL-ALT-DELETE
ca::ctrlaltdel:echo Hello, Linux!
Управление/Мониторинг ядра и модулей во время выполнения
Описание
Соискатели должны уметь управлять и/или осуществлять мониторинг работы ядра и его модулей. Это подразумевает навыки сбора информации о работающем ядре и его модулях с помощью средств командной строки, а также загрузки/выгрузки модулей вручную. Здесь также необходимо уметь определять, какие модули могут быть выгружены и какие параметры они получают. Соискатели должны уметь конфигурировать систему так, чтобы загружать модули по имени, отличающемуся от названия файла модуля.
Ключевые слова, файлы и утилиты
/lib/modules/kernel-version/modules.dep
/etc/modules.conf & /etc/conf.modules
depmod
insmod
lsmod
rmmod
modinfo
modprobe
uname
Модульные и монолитные ядра
Linux может иметь как модульное, так и монолитное ядро:
Модульное ядро имеет набор драйверов и скомпилированных модулей, которые оно может загружать или выгружать по запросу. Все загружаемые модули представляют собой в объектные файлы и хранятся в директории /lib/modules.
В монолитном ядре все драйвера встроены в него самого. Монолитное ядро представляет собой единый файл. Любое аппаратное устройство, сетевая технология или файловая система, которую поддерживает ядро, увеличивает окончательный размер файла.
Преимущества модульного ядра:
Он загружает/выгружает модули по запросу, что позволяет экономить память;
Не требуется останавливать систему при добавлении нового драйвера.
Преимущества монолитного ядра:
Быстрая загрузка;
Легкость в управлении.
Ядро может быть установлено так, что модули загружаются автоматически или соединены с ядром. В ядре, каждый модуль можно настроить на то, чтобы он был присоединен к ядру или загружался, когда это необходимо.
Большинство дистрибутивов Linux поддерживают широкий ряд устройств и функций. Именно для экономии размера, в в стандартной поставке ядра всегда используется модульная архитектура.
Причины, по которым необходимо компилировать драйверы как модули таковы:
Можно менять скорость работы, функциональность или размер ядра;
Можно обновлять драйвер нового устройства/процедуры или исправлять ошибки во время работы системы.
Демон ядра, который загружает модули автоматически, называется kmod. Демон cron позволяет выгружать неиспользуемые модули.
Просмотр загруженных модулей
В Linux, процедуры ядра и драйвера называются модулями. Однако, модуль необязательно работает с устройством. Например, реализации протокола, дополняющего IP, также будут модулем.
Все модули могут быть частью ядра, или динамически загружаться в него после старта системы. Функция lsmod позволяет вывести список загруженных модулей работающего ядра.[root@test /]# lsmod
Module Size Used by Not tainted
parport_pc 25448 1 (autoclean)
lp 5824 0 (autoclean)
parport 21856 1 (autoclean) [parport_pc lp]
ipv6 123424 -1 (autoclean)
isa-pnp 27816 0 (unused)
joydev 5728 0 (unused)
evdev 3904 0 (unused)
input 3072 0 [joydev evdev]
usb-uhci 20996 0 (unused)
usbcore 55136 1 [usb-uhci]
Информация, выдаваемая функцией lsmod также доступна в файле /proc/modules.
Сбор информации о модуле
Для сбора информации об модуле используется команда modinfo.modinfo [options] [module]
Несколько стандартных опций:
-a: Отображает автора модуля.
-d: Отображает описание модуля.
-n: Отображает имя файла модуля.
-p: Отображает типы параметров, поддерживаемых модулем
Например:[root@test /]# modinfo usb-uhci
filename: /lib/modules/2.6.3-7mdk/kernel/drivers/usb/host/usb-uhci.o.gz
description: "USB Universal Host Controller Interface driver"
author: "Georg Acher, Deti Fliegl, Thomas Sailer, Roman Weissgaerber"
license: "GPL"
[root@test /]# modinfo -n reiserfs
/lib/modules/2.6.3-7mdk/kernel/fs/reiserfs/reiserfs.o.gz
[root@test /]# modinfo -p cdrom
debug int
autoclose int
autoeject int
lockdoor int
check_media_type int
Зависимости модулей
Файл базы данных зависимостей модулей /lib/modules/<kernel-version>/modules.dep содержит все связи между модулями.
Этот файл создается командой /sbin/depmod -a или при загрузке системы одним из сценариев /etc/rc.d.
Чтобы вручную создать файл зависимостей модулей modules.dep, используйте команду depmod:depmod [options] [module]
Вот некоторые опции команды:
-a: Поиск модулей во всех директориях, определенных в необязательном конфигурационном файле /etc/modules.conf,
-e: Отобразить неразрешенные символы для каждого модуля.
В файле /etc/modules.conf могут содержаться параметры модуля (номера IRQ или портов ввода/вывода), однако чаще всего он содержит только псевдонимы. Псевдоним (alias) позволяет приложению обращаться к устройству, используя общую схему именования. Так, eth0 обозначает первый сетевой интерфейс (NIC), независимо от конкретного названия драйвера.
Например:[root@test /]# depmod
# Create the file modules.dep for all the modules found in /lib/modules/2.6.3-7mdk.
[root@test /]# depmod -e -n abi-svr4.o
depmod: * Unresolved symbols in abi-svr4.o
depmod: vfs_fstat
depmod: vfs_stat
depmod: vfs_lstat abi-svr4.o:
Использование устройств
Любому приложению необходим драйвер или модуль, для взаимодействия с устройством. В Linux, каждое устройство доступно через специальный файл в файловой системе.
/dev - стандартный каталог, в которой расположены файлы всех устройств.
Устройства, работающие под Linux, принято делить на два типа:
Символьное устройство: оперирует информацией как потоком данных (без использования буфера).
Блочное устройство: устройство хранения больших объемов информации, которое оперирует данными как блоками (используя буфер). Минимальный блок данных, который ядро может использовать при взаимодействии с устройством - 512 байт.
Файлы, расположенные в каталоге /dev, создаются при загрузке функцией mknod с предопределенным значением или поддерживаются демонами devfs или udev.
И у символьных, и у блочных устройств, перечисленных в директории /dev, есть главный (major) и добавочный (minor) номера.
Главное значение используется ядром для поиска модуля, соответствующего заданному файлу в каталоге /dev.
Дополнительное значение используется внутри модуля.
Устройство становится доступно приложению при наличии специального файла, обычно расположенного в директории /dev.
Например:[root@test /]# cat /dev/ttyS0
# Вывести данные, поступающие в последовательный порт COM1
[root@test /]# cat readme > /dev/ttyS0
# Послать файл readme в порт COM1.
Для дополнительной информации смотрите файл Documentation/devices.txt.
Автоматическая загрузка модулей
Команда, вызываемая ядром для автоматической загрузки модуля и всех его зависимостей - modprobe.modprobe [options] [module]
Некоторые стандартные опции:
-a: Загрузка всех модулей, удовлетворяющих заданному шаблону
-c: Вывод текущей конфигурации
-l: Вывод всех модулей, удовлетворяющих заданному шаблону
-r: Удаление модуля
Например:[root@test /]# modprobe -v slip
# Загрузить драйвер SLIP и его зависимости.
/sbin/insmod /lib/modules/2.6.3-7mdk/kernel/drivers/net/slhc.o
Using /lib/modules/2.6.3-7mdk /kernel/drivers/net/slhc.o
Symbol version prefix ''
/sbin/insmod /lib/modules/2.6.3-7mdk /kernel/drivers/net/slip.o
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o
Конфигурация модуля
При загрузке модуля утилитой modprobe используется файл /etc/modules.conf.Он содержит информацию о том, как загружать модули, их псевдонимы, команды, которые необходимо выполнить, и т.д.
Для вывода текущих настроек используйте функцию modprobe -c. Все значения по умолчанию могут быть изменены в файле /etc/modules.conf.
Команды, определенные в файле /etc/modules.conf могут выполняться при загрузке или выгрузке модуля. Они вызываются при событиях:
перед установкой (pre-install)
после установки (post-install)
перед удалением (pre-remove)
после удаления (post-remove)
Например:[root@test /]# modprobe -c
path[boot]=/lib/modules/boot
path[toplevel]=/lib/modules/2.6.3-7mdk
prune modules.dep
prune modules.generic_string
alias block-major-2 floppy
alias char-major-4 serial
alias char-major-5 serial
options snd-intel8x0 snd_ac97_clock=0 snd_enable=1 snd_index=0
pre-install mga /sbin/modprobe "-k" "agpgart"
usbmapfile=/lib/modules/2.6.3-7mdk/modules.usbmap
depfile=/lib/modules/2.6.3-7mdk/modules.dep
Установка модуля вручную
Для установки модуля вручную, используйте команду insmod.insmod [options] [module]
Для благополучной загрузки модуля необходимо, чтобы были разрешены все имеющиеся в нем символы. Иначе установка не пройдет.
Стандартные опции:
-k: Установить модуль с флагом autoclean.
-L: Заблокировать файл модуля на время загрузки.
-p: Проверить, возможна ли успешная загрузка.
Автоматически загружаемые модули будут помечены словом autoclean.
Например:[root@test /]# insmod -p slip
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o
Symbol version prefix ''
/lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o: unresolved symbol slhc_init
/lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o: unresolved symbol slhc_free
[root@test /]# insmod slhc
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slhc.o
[root@test /]# insmod slip
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o
[root@test /]# rmmod slhc
slhc: Device or resource busy
[root@test /]# rmmod slhc
slhc: Device or resource busy
Выгрузка модуля вручную
Для удаления модуля вручную предназначена команда rmmod.rmmod [options] [module]
Для благополучной загрузки модуля необходимо, чтобы были разрешены все имеющиеся в нем символы. Иначе установка не пройдет.
Некоторые стандартные опции:
-a: Выполнить процедуру autoclean. Все модули, помеченные этим флагом будут выгружены, если не используются.
-r: Рекурсивно выгрузить все модули.
Например:[root@test /]# modprobe -v slip
/sbin/insmod /lib/modules/2.6.3-7mdk/kernel/drivers/net/slhc.o
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slhc.o
Symbol version prefix ''
/sbin/insmod /lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o
Using /lib/modules/2.6.3-7mdk/kernel/drivers/net/slip.o
[root@test /]# rmmod -rv slip
Checking slip for persistent data Checking slhc for persistent data
Символы ядра и модуля.
Для вывода символов ядра на экран предназначена команда ksyms.ksyms [options]
Для благополучной загрузки модуля необходимо, чтобы были разрешены все имеющиеся в нем символы. Иначе установка не пройдет.
Некоторые стандартные опции:
-a: Вывод всех символов ядра
-m: Вывод всех символов модулей
Например:[root@test /]# ksyms -m
...
c2ac5698 pcmcia_release_io [pcmcia_core]
c2ac5764 pcmcia_release_irq [pcmcia_core]
c2ac5830 pcmcia_release_window [pcmcia_core]
c2ac088c pcmcia_replace_cis [pcmcia_core]
c2ac6464 pcmcia_report_error [pcmcia_core]
c2ac58c0 pcmcia_request_configuration [pcmcia_core]
c2ac5c90 pcmcia_request_io [pcmcia_core]
...
Версии ядра.
Все версии ядра выводятся на экран командой uname.uname [options]
Для благополучной загрузки модуля необходимо, чтобы были разрешены все имеющиеся в нем символы. Иначе установка не пройдет.
Некоторые стандартные опции:
-r: Вывести релиз операционной системы
-s: Вывести название операционной системы
-p: Вывести тип процессора
Примеры:[root@test /]# uname -s
Linux
[root@test /]# uname -r
2.6.3-7mdk
[root@test /]# uname -a
Linux linux 2.6.3-7mdk #1 Wed Mar 27 13:57:05 UTC 2002 i686 unknown
Проверь себя
Список вопросов:
Что такое ядро?
Где находятся модули в файловой системе?
Какая команда выводит на экран список загруженных модулей?
Можно ли загрузить в ядро версии 2.6 модуль версии 2.4.?
Где обычно хранятся модули драйверов устройств?
Каковы преимущества использования модулей в ядре?
Какая команда выгружает модуль из ядра?
Ответы
Ответы на вопросы:
Ядро – это приложение, назначение которого управлять определенной процессорной платой. Три его основных функции – это работа с:
приложениями;
аппаратным обеспечением и программными прерываниями;
модулями;
В директории /lib/modules.
Команда lsmod.
Нет, нельзя.
В директории /lib/modules/[релиз ядра]/kernel/drivers.
Экономия оперативной памяти.
Команда rmmod.
Упражнения
Упражнение 1
Установите Mandriva Linux 2007.1 Power Pack+ на вашу систему со стандартной конфигурацией (по умолчанию).
Упражнение 2
Выведите на экран список всех загруженных в вашу систему модулей.
Упражнение 3
Соберите информацию о модуле snd и всех его зависимостях.
Упражнение 4
Каков главный номер устройства для модуля sound и какие файлы соответствуют ему в каталоге /dev?
Упражнение 5
Найдите модуль x25 и загрузите его в ядро.
Упражнение 6
Измените соответствующий файл так, чтобы модуль x25 загружался в ядро автоматически, когда какое-то приложение пытается им воспользоваться.
Решения
Решение 1
Следуйте подсказкам и перезагрузите систему.
Решение 2
Используйте команду lsmod.
Решение 3
Для получения информации используйте команду modinfo snd. Для того, чтобы определить зависимости модуля snd, используйте команду depmod и просмотрите файл /lib/modules2.6.3-7mdk/modules.dep.
Решение 4
Главный номер, используемый модулем sound, находится в директории /proc/devices. Для того, чтобы найти файлы в каталоге /dev, выберите все символьные устройства с главным номером, совпадающим с указанным в /proc/devices.
Настройка, сборка и установка нестандартного ядра и модулей.
Решение 5
Используйте команду insmod:[root@test /]# insmod /lib/modules/2.6.3-7mdk/kernel/net/x25/x25.o.gz
При помощи команды lsmod, проверьте, корректно ли проведена загрузка.
Решение 6
Добавьте команду modprobe в файл /etc/modules.conf.
Описание
Соискатели должны уметь настраивать, создавать и устанавливать ядро и загружаемые модули из исходных текстов. Это означает умение изменять текущую конфигурацию ядра, собирать новые ядра и модули для него, а также умение устанавливать новое ядро с соответствующими ему модулями и осуществлять проверку того, определил ли загрузчик системы новое ядро и связанные с файлы.
Ключевые слова, файлы и утилиты
/usr/src/linux/*
/usr/src/linux/.config
/lib/modules/kernel-version/*
/boot/*
make
make targets: config, menuconfig, xconfig, oldconfig, modules, install, modules_install, depmod
Для чего необходимо новое ядро?
Каждый, кто устанавливает Linux, уже имеет стандартное ядро, которое предоставляет множество функций и поддерживает все типы устройств.
Для того, чтобы Linux работал быстрее, используя меньший объем оперативной памяти, или просто имел большее количество функций, необходимо собрать новое ядро.
Таким образом, ядро будет в точности соответствовать системным требованиям.
По умолчанию ядро располагается в каталоге /boot, и его образ часто называется vmlinuz.
Имя ядра определяется во время сборки и используется загрузчиком LILO или GRUB.
Ядро, которое запускает загрузчик LILO, определяется в конфигурационном файле /etc/lilo.conf. Ядро, которое загружается с помощью GRUB - в конфигурационном файле /boot/grub/menu.lst.
Исходные тексты любого ядра, модулей и библиотеки располагаются в каталоге /usr/src/[релиз ядра].
В этом каталоге расположены все сброные файлы (Makefile), необходимые для компиляции ядра, модулей и библиотек.
Для того, чтобы скомпилировать новое ядро, Вам понадобится среда разработки GNU и ее инструментарий.
Инструментарий GNU
В операционной системе Linux, практически все исходные файлы могут быть скомпилированы при помощи стандартного набора утилит из состава инструментария GNU, GNU Toolchain.
Команда make использует правила и цели (targets), определенные в файле Makefile. Вы можете собрать целевые файлы при помощи команд make all; make clean, и т.д., которые также определяются в Makefile.
Правила поддержки группы программ определены в файле Makefile вместе с их зависимостями, для которых установлены соответствующие действия в случае, если зависимость не удовлетворена.
Основными инструментами GNU Toolchain являются:
gcc: Набор компиляторов GNU
g++: Компилятор С++ в GNU
make: команда GNU, использующая файлы Makefile
Примеры файла Makefile:# Команда make all осуществляет создание целевого объекта main в случае,
# если она не существует или файлы header.h и main.c были изменены
all: main
main: main.c header.h
gcc –o main main.c
# Команда make clean удаляет команду main
clean:
rm -rf main
Пример файла на С:int main()
{
printf(“Привет, добро пожаловать\n”);
}
Задача
Создайте файл на С и сохраните его под именем main.c. Скомпилируйте и выполните его:vi main.c
gcc -o main main.c
./main
Сборочный файл (Makefile) ядра.
Файл Makefile, расположенный в каталоге /usr/src/linux, состоит из пяти частей:
Makefile: командный файл верхнего уровня, который выполняет сборку образа ядра bzImage и всех его модулей.
.config: Конфигурация ядра, расположенная в директории /usr/src/linux.
arch/x86/Makefile: зависящий от архитектуры Makefile
Файлы Makefile в подкаталогах: Рекурсивно вызываются из файла Makefile верхнего уровня и отвечают за сборку драйверов, системных вызовов и проч.
Rules.make: Общие правила для всех файлов Makefile.
Makefile верхнего уровня использует конфигурацию ядра, расположенную в /usr/src/linux/.config, для его сборки. В этот файл необходимо внести изменения, если вы хотите, чтобы ядро удовлетворяло вашим специфическим требованиям.
Настройка и сборка ядра
Перед созданием ядра, в файл /usr/src/linux/.config необходимо внести нужные вам изменения. Это можно сделать при помощи следующих команд:[root@test /]# make xconfig
# Утилита для настройки, работающая в среде X-Window.
[root@test /]# make menuconfig
# Текстовая утилита для настройки.
[root@test /]# make oldconfig
# Загрузить крнфигурацию по умолчанию из существующего файла .config file.
[root@test /]# make config
# Следует избегать, т.к. Ядро получается чересчур большим.
После изменения файла .config для определения новых возможностей ядра, оно должно быть собрано при помощи команды make bzImage.[root@test /]# make bzImage
Новый образ ядра будет помещен в файл /usr/src/[_ЯДРО_РЕЛИЗ_]/arch/i386/boot/bzImage.
Для установки ядра в каталог /boot используйте команду:[root@test /]# make install
Для создания и установки модулей в соответствующие каталоги выполните последовательно команды make modules и make modules_install.
Пример:[root@test /]# make modules
[root@test /]# make modules_install
Использование пакетов kernel-package для Debian.
Установите пакеты kernel-package и kernel-source-*.
Действуя от имени root, распакуйте его и сделайте доступным для чтения непривилегированному пользователю:[root@test /]# cd /usr/src
[root@test /]# tar xvjf kernel-source-*
[root@test /]# chown -R [user] kernel-source-*
([user] to be replaced with your login name)
Сконфигурируйте ядро согласно вашим требованиям:[root@test /]# cd /usr/src/kernel-source-*
[root@test /]# make xconfig
Для того, чтобы сделать резервную копию, сохраните конфигурацию в файл и выйдите.
Скомпилируйте ядро:[root@test /]# make-kpkg clean
[root@test /]# make-kpkg -rev 19.06.2003.firewall kernel_image
Это позволит Вам создать пакет Debian. Вы сможете найти его в каталоге /usr/src/.
Установите ядро:[root@test /]# dpkg -i /usr/src/kernel-image-*_19.06.2003.firewall_i386.deb
Системный загрузчик
Загрузчик LILO или GRUB позволяет выбрать образ ядра при загрузке. Как правило, образ ядра находится в директории /boot.
Для загрузчика LILO конфигурационный файл /etc/lilo.conf может быть настроен так, чтобы позволить пользователю самому выбирать загрузку нескольких вариантов ядра из нескольких директорий.
Для загрузчика GRUB, требуется изменить файл /boot/grub/menu.lst.
Для того, чтобы загрузить последнее созданное ядро, необходимо скопировать образ ядра из каталога /usr/src/[ядро_релиз]/arch/i386/boot/bzImage в каталог /boot/.[root@test /]# cp /usr/src/[KERNEL_RELEASE]/arch/i386/boot/bzImage
/boot/myvmlinuz
После этого в конфигурационный файл lilo.conf необходимо добавить запись, указывающую на образ myvmlinux, после чего запустить команду /sbin/lilo. Загрузчик запишет новую информацию в загрузочный сектор.
Загрузчик GRUB позволяет непосредственно выбрать новое ядро, посколько он работает напрямую с файловой системой.
После перезагрузки вы сможете выбрать новое ядро.
Совет. Перед тем, как перезаписать работающее ядро, безопаснее всего будет сделать резервную копию. Также рекомендуется добавить новое ядро в конфигурационный файл lilo.conf перед заменой работающего ядра. Таким образом, вы всегда сможете установить работоспособное ядро вместо некорректно созданного.
Более подробную информацию Вы можете найти в файлах Documentation/kbuild/makefiles.txt и Documentation/kbuild/modules.txt.
Проверь себя
Список вопросов:
Является ли драйвер модулем ядра?
Как бы вы обновили модуль, не пересобирая ядро?
Почему для сервера рекомендуют ставить монолитное ядро?
Где расположены конфигурационные файлы загрузчиков LILO и GRUB?
Что необходимо установить для того, чтобы успешно выполнить команду make xconfig для ядра версии 2.6?
Необходимо ли выполнять команду make dep для ядра версии 2.6?
Ответы
Ответы на вопросы:
Да, действительно, драйвер является модулем ядра, обеспечивающим взаимодействие ядра с аппаратным обеспечением.
С помощью последовательного выполнения команд make modules и make modules_install.
Потому что необходимость динамической загрузки модулей слишком замедляет работу и нарушает систему безопасности сервера.
Для LILO - в /etc/lilo.conf, а для GRUB - в /boot/grub/menu.lst.
Библиотеки разработки Qt.
Нет.
Упражнение
Установите исходные тексты ядра, если они отсутствуют в вашей системе.
Зайдите в каталог /usr/src/linux.
Выполните команду make xconfig.
Добавьте или удалите ISDN – протокол.
Сохраните файл и выйдите.
Выполните команду make bzImage.
Определите местонахождение нового ядра и скопируйте его в каталог /boot, назвав myvmlinux.
Добавьте ваше новое ядро в конфигурационный файл /etc/lilo.conf.
Запустите загрузчик LILO.
Перезапустите операционную систему.
Загрузите вновь созданное ядро.
Загрузка системы
Описание
Соискатели должны уметь управлять системой во время ее загрузки. Это включает в себя управление загрузчиком операционной системы и передачу параметров ядру во время загрузки, а также анализ событий по журнальным файлам.
Ключевые слова, файлы и утилиты
/var/log/messages
/etc/conf.modules, /etc/modules.conf
dmesg
LILO
GRUB
Параметры ядра
Во время старта загрузчик операционной системы может передавать ядру некоторые параметры.
Таким образом, ядро "узнает", что необходимо выполнить во время загрузки: не монтировать определенный раздел, поддерживать определенное устройство, загрузиться в режиме отладки и т.д.
Передача параметров ядра через загрузчик LILO.
При работе с LILO, параметры необходимо определять в файле /etc/lilo.conf либо вводить с клавиатуры во время загрузки ядра.
Пример конфигурационного файла /etc/lilo.conf:image=/boot/vmlinuz
label="linux"
root=/dev/hda1
initrd=/boot/initrd.img
append="devfs=mount hdc=ide-scsi acpi=ht resume=/dev/hda5
splash=silent"
vga=788
В ответ на приглашение LILO, вы должны набрать параметры, которые хотите передать ядру.
Пример загрузки ядра в режиме отладки:#vmlinux debug
Передача параметров ядра через загрузчик GRUB.
Процедура аналогична применяемой в LILO.
Пример файла /boot/grub/menu.lst:# GRUB default values
timeout 10 # Загрузка ядра по умолчанию через 10 секунд
default 0 # Ядро по умолчанию
# Grub для 0 раздела Linux
title GNU/Linux # Заголовок
root (hd0,1) # Корневая файловая система /dev/hda2
# Образ ядра и параметры, передаваемые ядру
kernel /boot/vmlinuz root=/dev/hda2 read-only
initrd /boot/initrd
boot
Для передачи параметров перед загрузкой ядра, вводите их в интерактивном режиме загрузчика grub.
Зарегистрированные сообщения ядра
Когда система загружается, интересно иметь возможность осуществлять мониторинг или видеть на экране каждый из этапов, который она проходит.
Команда dmesg выводит на экран журнал сообщений ядра. Если возникает ошибка, ее вывод можно послать любому, кто будет ее отлаживать.dmesg [options]
Стандартные опции:
-s bufsize: Установить размер буфера для опроса кольцевого буфера ядра равным bufsize. Значение по умолчанию - 8196.
-n level: Установить уровень, на котором будет происходить регистрация сообщений.
Эта команда полезна в тех случаях, когда ошибка возникает до того, как система полностью загрузится.
Пример:[root@test /]# dmesg > kernel.boot
Ядро и приложения начинают заносить сообщения о своих ошибках в файл /var/log/messages сразу же после того, как будет смонтирована файловая система.
Этот файл полезен в тех случаях, когда возникают ошибки при загрузке новых модулей, выполнении новых команд / приложений и т.д.
Журнальные файлы подвергаются ротации. Частота ротации определяется в конфигурационном файле /etc/logrotate.d/syslog.
Последовательность загрузки
BIOS компьютера запускает загрузчик операционной системы.
Загрузчик помещает образ ядра в оперативную память и эмулирует файловую систему в виде электронного диска, называемого initrd.
Основная файловая система initrd, расположенная в оперативной памяти, позволяет ядру подключать другие файловые системы из разделов жесткого диска. Примерами различных каталогов, которые могут быть установлены на логических разделах, являются /, /home и другие.
Когда корневая файловая система подключена, начинает выполняться файл /sbin/init. Процесс init всегда является первым приложением / процессом, которое запускается после старта ядра. Он также является родителем всех других процессов.
Именно процесс init запускает все конфигурационные скрипты для достижения определенного уровня выполнения (runlevel).
Процесс init всегда работает в фоновом режиме.
Конфигурационный файл процесса /sbin/init называется /etc/inittab, здесь вы можете задать параметры для инициализации системы и каждого уровня выполнения.
Сценарий, контролирующий инициализацию системы (в дистрибутивах, основанных на Red Hat - /etc/rc.d/rc.sysinit, а в системах на базе Debian - /etc/init.d/rcS и /etc/init.d/rcS.d/*), обычно:
конфигурирует модули
проверяет и подключает файловые системы
запускает демоны ядра
настраивает сеть
Далее, при загрузке определенного уровня выполнения, процесс init, запустит все сценарии из каталога, определенного в файле inittab для данного уровня. (в дистрибутивах Mandriva: /etc/rc.d/rc[runlevel].d)
Проверь себя
Список вопросов:
Что такое initrd?
Какой конфигурационный файл используется процессом init во время загрузки?
Где расположен исполняемый файл процесса init?
Какие команды / файлы позволяют администратору просматривать журналы загрузки до того, как будут подключены файловые системы?
Ответы
Ответы на вопросы:
initrd - это место в оперативной памяти, которое будет использоваться ядром во время загрузки, для подключения локальных и удаленных файловых систем.
Файл /etc/inittab.
/sbin/init.
Команда dmesg.
Смена уровня выполнения, останов или перезагрузка системы.
Описание
Соискатели должны уметь управлять уровнями выполнения системы. Это включает в себя переход в однопользовательский режим, выключение или перезагрузку системы. Соискатели должны уметь предупреждать пользователей перед изменением режима работы, и должным образом завершать процессы. Кроме того, соискатели должны уметь устанавливать уровень выполнения, используемый по умолчанию.
Ключевые слова, файлы и утилиты
/etc/inittab
shutdown
init
Уровни выполнения
После того, как система стартовала, процесс инициализации /sbin/init переключается на уровень выполнения, определенный по умолчанию в файле /etc/inittab.id:5:initdefault:
В данном случае, по умолчанию устанавливается уровень 5.
Для управления службами уровня выполнения, ссылки на соответствующие сценарии размещаются в каталогах данного уровня /etc/init.d/rc<X>.d/, где <X>=0,1,2,3,4,5,6,S – номера уровней. Вы можете найти несколько ссылок в директории /etc/rc5.d.lrwxrwxrwx 1 root root 20 Jul 27 15:24 K15postgresql -> ../init.d/postgresql
lrwxrwxrwx 1 root root 16 Jul 27 15:24 K55routed -> ../init.d/routed
lrwxrwxrwx 1 root root 18 Jul 27 15:14 S03iptables -> ../init.d/iptables
lrwxrwxrwx 1 root root 16 Jul 27 15:15 S04pcmcia -> ../init.d/pcmcia
lrwxrwxrwx 1 root root 19 Jul 27 15:15 S05harddrake -> ../init.d/harddrake
lrwxrwxrwx 1 root root 17 Jul 27 15:29 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 17 Jul 27 15:29 S11portmap -> ../init.d/portmap
lrwxrwxrwx 1 root root 16 Jul 27 15:29 S12syslog -> ../init.d/syslog
lrwxrwxrwx 1 root root 17 Jul 27 15:09 S13partmon -> ../init.d/partmon
Существует два типа символьных ссылок:
Ссылки, названия которых начинаются с символа 'K': они вызываются с аргументом stop.
Ссылки, названия которых начинаются с символа 'S': они вызываются с аргументом start.
Наиболее распространенные уровни выполнения приведены в таблице 1.
Таблица 1. Уровни выполненияНомер уровня Описание
0 Режим отключения
1 Однопользовательский режим или режим сопровождения
2 Локальный многопользовательский режим без поддержки сети
3 Многопользовательский режим с поддержкой сети
4 Не используется, оставлен для специфических нужд
5 Многопользовательский режим с поддержкой сети и X-Window (xdm)
6 Перезагрузка системы
S или s Режим загрузки (Startup), а также псевдоним для уровня 1
Программа init.
С помощью команды init вы можете изменить уровень выполнения:init [options] [0123456SsQqUuAaBbCc]
Некоторые опции:
-b: Аварийная загрузка напрямую в оболочку в однопользовательском режиме.
-s: Загрузка в однопользовательском режиме.
Примеры:[root@test /]# init 0 # останов системы
[root@test /]# init 6 # перезагрузка системы
Когда Вы меняете уровень выполнения, ссылки в каталоге /etc/rc, отвечающем новому уровню, упорядочиваются в алфавитном порядке, К – ссылки перед S – ссылками, а затем по двузначному номеру. Это обеспечивает корректное разрешение зависимостей между службами.
Последовательность останова и перезагрузки
Для корректного останова системы используйте команду shutdown.shutdown [time] [сообщение - предупреждение]
Для сиюминутной остановки:[root@test /]# shutdown -now
Для остановки и перезагрузки системы в 8 часов вечера:[root@test /]# shutdown -r 20:00
Для остановки системы:[root@test /]# init 0
Для перезагрузки системы:[root@test /]# init 6
В некоторых системах сочетание клавиш Ctrl+Alt+Delete, предопределенное в файле /etc/inittab, также позволяет осуществить остановку системы.
Проверь себя
Список вопросов:
Какая программа загружает ядро в оперативную память?
Что происходит на уровне 0?
В каком файле определены уровни выполнения?
Какая команда позволяет изменить уровень выполнения?
Какой уровень выполнения установлен по умолчанию для вашей системы?
Какие существуют команды для остановки системы?
Ответы
Ответы на вопросы:
Системный загрузчик.
Остановка системы.
В файле /etc/inittab.
Команда init [уровень выполнения].
Определите по файлу /etc/inittab.
команда shutdown now,
команда init 0,
сочетание клавиш CTR+ALT+DEL.
Упражнения
Упражнение 1
Как вы передадите параметры в ядро для того, чтобы загрузиться с /dev/hdb?
Упражнение 2
Измените назначение сочетания клавиш Ctrl+Alt+Delete на : напечатать Hello Linux, - вместо перезагрузки.
Решения
Решение 1boot=/dev/hdb
Решение 2
Отредактируйте файл /etc/inittab и добавьте в него следующие строки:# Сочетание клавиш CTRL-ALT-DELETE
ca::ctrlaltdel:echo Hello, Linux!
отзывов:
(0) Рейтинг: 
Пока комментариев нет

