Настройка ядра
В этом разделе мы рассматриваем материал по теме 2.201.4
экзамена 201 Администрирование, средний уровень (LPIC-2). Рейтинг темы 1.
О настройке
Настройка ядра описана в разделе этого пособия,
рассказывающем о сборке ядра (точнее, в опциях make [x|menu]config). Когда базовое ядро и его
модули собраны, вы можете включить или отменить возможности ядра в
порядке подключения дополнительных возможностей, запуска различных
профилей и подключения памяти.
В этом разделе рассматриваются способы изменения поведения ядра в ходе работы системы.
Поиск информации о загруженном ядре
Linux (и другие UNIX-подобные операционные системы) использует специальные, как правило совместимые способы хранения информации о загруженном ядре (или других запущенных процессах). Специальный каталог /proc/ содержит псевдо-файлы и подкаталоги, содержащие массу информации о загруженной системе.
В ходе работы системы Linux каждый процесс создает
подкаталог со своим номером, каждый из которых содержит несколько
статусных файлов. Здесь хранятся сводные данные о командах
пользовательских уровней и системных средствах, но основная часть
данных расположена в каталоге файловой системы /proc/.
Специфические данные, касающиеся статуса самого ядра, находятся в каталоге /proc/sys/kernel.
Подробнее о текущих процессах
Хотя статус процессов, особенно пользовательских, не имеет отношения к ядру как таковому, важно иметь о них представление, если вы намерены заниматься отладкой основного ядра. Простейший способ получить сводку процессов -- выполнить команду ps (также существуют графические средства). Зная ID процесса, вы можете исследовать запущенный процесс. Например:
Листинг 5. Исследование запущенного процесса
% ps
PID TTY TIME CMD
16961 pts/2 00:00:00 bash
17239 pts/2 00:00:00 ps
% ls /proc/16961
binfmt cwd@ exe@ maps mounts stat status
cmdline environ fd/ mem root@ statm
|
В этом пособии не будет исследоваться вся информация, содержащаяся в псевдо-файлах процессов. Для примера приведен фрагмент файла status:
Листинг 6. Фрагмент псевдо-файла status
$ head -12 /proc/17268/status
Name: bash
State: S (sleeping)
Tgid: 17268
Pid: 17268
PPid: 17266
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups: 0
VmSize: 2640 kB
VmLck: 0 kB
|
Процессы ядра
Каталог /proc/ наряду с данными о пользовательских процессах содержит полезную информацию о загруженном ядре. Особенно важен каталог /proc/sys/kernel/:
Листинг 7. Каталог /proc/sys/kernel/
% ls /proc/sys/kernel/
acct domainname msgmni printk shmall threads-max
cad_pid hostname osrelease random/ shmmax version
cap-bound hotplug ostype real-root-dev shmmni
core_pattern modprobe overflowgid rtsig-max swsusp
core_uses_pid msgmax overflowuid rtsig-nr sysrq
ctrl-alt-del msgmnb panic sem tainted
|
Содержимое этих псевдо-файлов отображает информацию о загруженном ядре. Например:
Листинг 8. Просмотр псевдо-файла ostype
% cat /proc/sys/kernel/ostype
Linux
% cat /proc/sys/kernel/threads-max
4095
|
Уже загруженные модули ядра
Как и другая информация о запущенной системе Linux, данные о загруженном ядре хранятся в каталоге файловой системы /proc/, точнее в каталоге /proc/modules. Однако, как правило, доступ к этим данным можно получить при помощи утилиты lsmod (которая просто показывает заголовки необработанного содержимого файла /proc/modules); команда cat /proc/modules выведет такую же информацию. Рассмотрим пример:
Листинг 9. Содержимое файла /proc/modules
% lsmod
Module Size Used by Not tainted
lp 8096 0
parport_pc 25096 1
parport 34176 1 [lp parport_pc]
sg 34636 0 (autoclean) (unused)
st 29488 0 (autoclean) (unused)
sr_mod 16920 0 (autoclean) (unused)
sd_mod 13100 0 (autoclean) (unused)
scsi_mod 103284 4 (autoclean) [sg st sr_mod sd_mod]
ide-cd 33856 0 (autoclean)
cdrom 31648 0 (autoclean) [sr_mod ide-cd]
nfsd 74256 8 (autoclean)
af_packet 14952 1 (autoclean)
ip_vs 83192 0 (autoclean)
floppy 55132 0
8139too 17160 1 (autoclean)
mii 3832 0 (autoclean) [8139too]
supermount 15296 2 (autoclean)
usb-uhci 24652 0 (unused)
usbcore 72992 1 [usb-uhci]
rtc 8060 0 (autoclean)
ext3 59916 2
jbd 38972 2 [ext3]
|
Загрузка дополнительных модулей ядра
Для загрузки модулей ядра есть два инструмента. Команда modprobe -- немного более высокого уровня. Она регулирует загрузку взаимозависимых модулей, то есть при загрузке модулей ядра загружаются и те, модули, от которых они зависят. Однако, modprobe на самом деле только надстройка над insmod.
Например, предположим, вы хотите загрузить в ядро возможность поддержки Reiser file system (надеюсь, она еще не встроена в ядро). Вы можете использовать опцию modprobe -nv, чтобы просто посмотреть, что сделала бы команда, но на самом деле ничего не загружать:
Листинг 10. Проверка зависимостей при помощи modprobe
% modprobe -nv reiserfs
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/fs/reiserfs/reiserfs.o.gz
|
В нашем случае зависимостей нет. В других случаях они могут быть (и их придется урегулировать вручную, если использовать команду modprobe без опции -n). Пример:
Листинг 11. Еще один вывод команды modprobe
% modprobe -nv snd-emux-synth
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/drivers/sound/
soundcore.o.gz
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/
snd.o.gz
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/synth/
snd-util-mem.o.gz
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/seq/
snd-seq-device.o.gz
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/
snd-timer.o.gz
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/seq/
snd-seq.o.gz
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/seq/
snd-seq-midi-event.o.gz
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/
snd-rawmidi.o.gz
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/seq/
snd-seq-virmidi.o.gz
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/core/seq/
snd-seq-midi-emul.o.gz
/sbin/insmod /lib/modules/2.4.21-0.13mdk/kernel/sound/synth/emux/
snd-emux-synth.o.gz
|
Предположим, вы хотите загрузить модуль ядра сейчас. Вы можете воспользоваться командой modprobe, которая попутно загрузит
и все зависимости, но чтобы увидеть все в подробностях, используйте команду insmod.
На основании вышеизложенного вы могли сделать предположение,
что надо запустить, например, insmod
snd-emux-synth. Но если сделать это без предварительной
загрузки зависимостей, вы получите сообщение о "неразрешенных
символах" ("unresolved symbols"). Давайте попробуем вместо
этого использовать Reiser file system:
Листинг 12. Загрузка модуля ядра
% insmod reiserfs
Using /lib/modules/2.4.21-0.13mdk/kernel/fs/reiserfs/reiserfs.o.gz
|
Довольно успешно, ваше ядро теперь поддерживает новую файловую систему. Вы можете монтировать разделы, читать их, производить в них запись и так далее. Другие возможности системы могут быть подключены подобным образом.
Удаление загруженных модулей ядра
Выгрузка модулей, как и их загрузка, может быть выполнена при помощи высокоуровневой команды modprobe или низкоуровневой rmmod. Инструмент высокого уровня осуществляет выгрузку в обратном порядке. Команда rmmod просто удаляет отдельный модуль ядра, но может не справиться с этой задачей, если модуль используется (обычно из-за зависимостей). Например:
Листинг 13. Попытка выгрузки модулей, имеющих зависимости
% modprobe snd-emux-synth
% rmmod soundcore
soundcore: Device or resource busy
% modprobe -rv snd-emux-synth
# delete snd-emux-synth
# delete snd-seq-midi-emul
# delete snd-seq-virmidi
# delete snd-rawmidi
# delete snd-seq-midi-event
# delete snd-seq
# delete snd-timer
# delete snd-seq-device
# delete snd-util-mem
# delete snd
# delete soundcore
|
Однако, если ничто не препятствует удалению модуля, команда rmmod выгрузит его из памяти. Например:
Листинг 14. Выгрузка модулей, не имеющих зависимостей
% rmmod -v reiserfs
Checking reiserfs for persistent data
|
Автоматическая загрузка модулей ядра
При желании вы можете заставить модули ядра загружаться
автоматически, воспользовавшись загрузчиком модулей ядра, входящим в
последние версии Linux, или демоном kerneld в более старых версиях. Если вы
используете эти приемы, в случае, если ядро обнаружит, что к нему
обращаются через неподдерживаемые специфические системные вызовы, оно попытается загрузить соответствующий модуль ядра.
Однако, за исключением систем с недостаточным количеством памяти, обычно нет причин отказываться от загрузки необходимых модулей ядра в процессе загрузки системы (подробнее об этом рассказывается в следующем учебном пособии). Загрузчик модулей ядра включен в некоторые дистрибутивы.
Автоматическая выгрузка модулей ядра
Наряду с автоматической загрузкой возможна и автоматическая выгрузка модулей, в основном в системах с недостаточным количеством памяти, например, встроенных системах Linux. Однако, следует знать, что модули ядра могут быть загружены с опцией insmod --autoclean, которая помечает их как незагруженные, если они не используются в данное время.
Раньше демон kerneld периодически вызывал команду rmmod --all для удаления неиспользуемых модулей ядра. В особых случаях (если не используется демон kerneld, не входящий в свежие системы Linux), можно добавить в crontab команду rmmod --all, запускаемую примерно раз в минуту. Но обычно это бывает лишним, поскольку модули ядра как правило используют намного меньше памяти, чем типичные пользовательские процессы.
|