 | Управление ядром в ходе работы системы
В этом разделе мы рассматриваем материал по теме 1.105.1 экзамена 102 Администрирование Linux для начинающих (LPIC-1). Рейтинг темы 4.
Из этого раздела вы узнаете, как:
- С помощью утилит командной строки получать
информацию о ядре и его модулях в ходе работы системы
- Вручную загружать и удалять модули ядра
- Определять, когда модули могут быть удалены
- Конфигурировать систему для загрузки модулей, имена
которых отличаются от названий соответствующих файлов
Формально Linux -- это ядро вашей системы. Ядро обеспечивает
инфраструктуру для работы приложений и использования различных
аппаратных средств. Это код низкого уровня, который взаимодействует с
интерфейсами аппаратных средств, планирует и распределяет память и т.д.
Выбор в пользу систем GNU/Linux часто обусловлен тем, что
многие инструменты, создаваемые для большинства дистрибутивов, благодаря
проекту GNU Фонда свободного программного обеспечения (Free Software
Foundation) являются доступными. Однако, вы будете часто видеть вместо
"GNU/Linux" только "Linux".
uname
Команда uname выдает информацию о вашей
системе и ее ядре. В Листинге 1 показаны различные опции команды
uname и получаемая с их помощью
информация. Описание опций дается в Таблице 3.
Листинг 1. Команда uname
ian@pinguino:~$ uname
Linux
ian@pinguino:~$ uname -s
Linux
ian@pinguino:~$ uname -n
pinguino
ian@pinguino:~$ uname -r
2.6.12-10-386
ian@pinguino:~$ uname -v
#1 Mon Jan 16 17:18:08 UTC 2006
ian@pinguino:~$ uname -m
i686
ian@pinguino:~$ uname -o
GNU/Linux
ian@pinguino:~$ uname -a
Linux pinguino 2.6.12-10-386 #1 Mon Jan 16 17:18:08 UTC 2006 i686 GNU/Linux
|
Таблица 3. Опции команды uname
| Опция | Описание |
|---|
| -s | Показать имя ядра. Эта информация выдается по
умолчанию, если ни одна опция не указана. | | -n | Показать имя узла сети или имя хоста. | | -r | Показать номер выпуска ядра. Эта опция часто
используется с командами управления модулями. | | -v | Показать версию ядра. | | -m | Показать имя аппаратной платформы (CPU). | | -o | Показать имя операционной системы. | | -a | Показать всю возможную информацию. |
Листинг 1 получен на операционной системе Ubuntu, запущенной
на процессоре Intel®. Команда
uname доступна в большинстве систем UNIX®
и UNIX-подобных систем, таких как Linux. Выдаваемая ею информация
может быть различной в разных дистрибутивах и версиях Linux, а также
на разных типах компьютеров. В Листинге 2 показаны выводы команды
uname на системе Fedora Core 4, запущенной
на машине AMD Athlon 64, и, для сравнения, на Apple PowerBook.
Листинг 2. Использование команды uname на других системах
Linux attic4 2.6.14-1.1656_FC4 #1 Thu Jan 5 22:13:55 EST 2006 x86_64
x86_64 x86_64 GNU/Linuxfilesystem
Darwin Ian-Shields-Computer.local 7.9.0 Darwin Kernel Version 7.9.0:
Wed Mar 30 20:11:17 PST 2005; root:xnu/xnu-517.12.7.obj~1/RELEASE_PPC
Power Macintosh powerpc
|
Модули ядра
Ядро управляет системой на низшем уровне, включая
оборудование и интерфейсы. При
большом разнообразии аппаратных средств и различных файловых
систем ядро, способное поддерживать все их, будет слишком
большим. К счастью, модули ядра позволяют при
необходимости загрузить обеспечивающее поддержку программное
обеспечение, такое как драйверы для аппаратных средств или
файловые системы. Это позволяет запускать систему с небольшим
ядром и затем подгружать модули по мере необходимости. Часто эта
подгрузка происходит автоматически, например, при подключении
устройств USB.
В оставшейся части этого раздела мы рассмотрим, как и с
помощью каких команд производится конфигурирование модулей
ядра.
Команды для выполнения задач загрузки и удаления модулей ядра
требуют полномочий суперпользователя root. Команды, выдающие
информацию о модулях, обычно могут быть выполнены обычным
пользователем. Однако, в случае, если они расположены в
каталоге /sbin, они будут недоступны для обычного пользователя,
так как этот каталог не включается в путь поиска PATH.
Таким образом, если вы не root, вам, вероятно, надо будет
использовать полное наименование пути.
lsmod
Воспользуйтесь командой lsmod,
чтобы узнать, какие модули загружены на вашей системе в
настоящее время (см. Листинг 3). Вероятно, у вас вывод этой
команды будет другим, хотя некоторые записи должны совпадать.
Листинг 3. Просмотр модулей ядра с помощью команды lsmod
[ian@attic4 ~]$ /sbin/lsmod
Module Size Used by
nvnet 74148 0
nvidia 4092336 12
forcedeth 24129 0
md5 4161 1
ipv6 268737 12
parport_pc 29189 1
lp 13129 0
parport 40969 2 parport_pc,lp
autofs4 29637 1
sunrpc 168453 1
ipt_REJECT 5825 1
ipt_state 1985 3
ip_conntrack 42009 1 ipt_state
iptable_filter 3137 1
ip_tables 19521 3 ipt_REJECT,ipt_state,iptable_filter
dm_mod 58613 0
video 16069 0
button 4161 0
battery 9541 0
ac 4933 0
ohci_hcd 26977 0
ehci_hcd 41165 0
i2c_nforce2 7105 0
i2c_core 21825 1 i2c_nforce2
shpchp 94661 0
snd_intel8x0 34945 1
snd_ac97_codec 76217 1 snd_intel8x0
snd_seq_dummy 3781 0
snd_seq_oss 37569 0
snd_seq_midi_event 9409 1 snd_seq_oss
snd_seq 62801 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event
snd_seq_device 9037 3 snd_seq_dummy,snd_seq_oss,snd_seq
snd_pcm_oss 51569 0
snd_mixer_oss 18113 1 snd_pcm_oss
snd_pcm 100553 3 snd_intel8x0,snd_ac97_codec,snd_pcm_oss
snd_timer 33733 2 snd_seq,snd_pcm
snd 57669 11 snd_intel8x0,snd_ac97_codec,snd_seq_oss,snd_seq,
snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer
soundcore 11169 1 snd
snd_page_alloc 9925 2 snd_intel8x0,snd_pcm
floppy 65397 0
ext3 132681 3
jbd 86233 1 ext3
sata_nv 9541 0
libata 47301 1 sata_nv
sd_mod 20545 0
scsi_mod 147977 2 libata,sd_mod
[ian@attic4 ~]$
|
Вы можете видеть, что в системе загружено множество модулей.
Большинство из них поставляются вместе с ядром. Однако некоторые, такие как nvnet, nvidia и sata_nv от
корпорации NVIDIA, содержат проприетарный код и не являются частью стандартного
ядра. Таким образом, модульный подход позволяет подключать проприетарный
код к ядру с открытым кодом. При условии, что лицензия производителя
разрешает это, в дистрибутив Linux могут быть внесены проприетарные
модули, что позволит не тратить силы на получение их непосредственно от
производителя и даст гарантию, что вы сможете воспользоваться ими.
В Листинге 3 вы также можете видеть, что соответствующими
модулями осуществляется
поддержка таких устройств как видео, SATA, SCSI,
дискеты и звуковые карты, а также сетевые устройства, например, IPV6,
поддержка файловых систем, такой как ext3, и Remote Procedure Call (RPC)
компании Sun.
Помимо имени модуля, команда lsmod показывает также размер
и число пользователей модуля. Если модуль используется более чем одним
пользователем, будет представлен список этих пользователей. Так, например
модуль soundcore используется модулем
snd, который в свою очередь используется
несколькими другими звуковыми модулями.
modinfo
Команда modinfo выдает информацию
об одном или нескольких модулях. Как показано в Листинге 4, эта информация
содержит полный путь до файла, имя автора, лицензию, другие параметры,
которые можно передать модулю, версию, зависимости и другую информацию.
Листинг 4. Основная
информация о модуле
[ian@attic4 ~]$ /sbin/modinfo floppy
filename: /lib/modules/2.6.12-1.1456_FC4/kernel/drivers/block/floppy.ko
author: Alain L. Knaff
license: GPL
alias: block-major-2-*
vermagic: 2.6.12-1.1456_FC4 686 REGPARM 4KSTACKS gcc-4.0
depends:
srcversion: 2633BC999A0747D8D215F1F
parm: FLOPPY_DMA:int
parm: FLOPPY_IRQ:int
parm: floppy:charp
[ian@attic4 ~]$ /sbin/modinfo sata_nv
filename: /lib/modules/2.6.12-1.1456_FC4/kernel/drivers/scsi/sata_nv.ko
author: NVIDIA
description: low-level driver for NVIDIA nForce SATA controller
license: GPL
version: 0.6
vermagic: 2.6.12-1.1456_FC4 686 REGPARM 4KSTACKS gcc-4.0
depends: libata
alias: pci:v000010DEd0000008Esv*sd*bc*sc*i*
alias: pci:v000010DEd000000E3sv*sd*bc*sc*i*
alias: pci:v000010DEd000000EEsv*sd*bc*sc*i*
alias: pci:v000010DEd00000054sv*sd*bc*sc*i*
alias: pci:v000010DEd00000055sv*sd*bc*sc*i*
alias: pci:v000010DEd00000036sv*sd*bc*sc*i*
alias: pci:v000010DEd0000003Esv*sd*bc*sc*i*
alias: pci:v000010DEd*sv*sd*bc01sc01i*
srcversion: 3094AD48C1B869BCC301E9F
|
В Листинге 4 обратите внимание на строки,
содержащие имена файлов модулей. Эти имена оканчиваются суффиксом .ko, что
является характерным отличием модулей для ядра 2.6 от других объектных
файлов и от модулей для ядра 2.4 и более ранних версий, в которых
и для них и для других объектных файлов использовался один и тот же
суффикс .o.
Вы можете также заметить, что путь включает в себя версию
ядра. Например, частью пути
/lib/modules/2.6.12-1.1456_FC4/kernel/drivers/block/floppy.ko
является 2.6.12-1.1456_FC4. Это запись совпадает с выводом
команды uname -r. Модули
являются характерными для данного ядра, и эта структура
каталогов отражает их взаимозависимость.
В системах с ядром версии 2.6 с помощью команды
modinfo можно ограничить количество
запросов определенной информации о модуле. Чтобы извлечь информацию одного
типа, например, parm, description, license, filename или alias,
воспользуйтесь опцией -F. Если вам необходимо получить
информацию различных типов, используйте команду несколько раз с различными
опциями. В ядрах версии 2.4 информацию о параметрах можно получить с
помощью опции -p.
Текущая версия команды modinfo поддерживает также
параметры предыдущих версий. В Листинге 5 показаны несколько примеров.
Листинг 5. Определенная
информация о модуле
[ian@attic4 ~]$ /sbin/modinfo -F parm snd
cards_limit:Count of auto-loadable soundcards.
major:Major # for sound driver.
[ian@attic4 ~]$ /sbin/modinfo -F license nvidia floppy
NVIDIA
GPL
[ian@attic4 ~]$ /sbin/modinfo -p snd
major:Major # for sound driver.
cards_limit:Count of auto-loadable soundcards.
|
Используйте ваши навыки работы в Linux
Вы можете использовать некоторые приемы, описанные в учебном
пособии "Экзамен
LPI 101 (тема 103): Команды GNU и UNIX" для получения информации,
например, о количестве параметров, которые можно передать модулю. В
Листинге 6 показан пример.
Листинг 6. Количество
параметров модуля
[ian@attic4 ~]$ for n in `/sbin/lsmod | tail +2 | cut -d " " -f1`;
> do echo "$n $(/sbin/modinfo -p $n |wc -l )" | grep -v " 0$"; done
nvnet 12
forcedeth 1
parport_pc 5
dm_mod 1
ohci_hcd 2
ehci_hcd 2
shpchp 3
snd_intel8x0 7
snd_ac97_codec 1
snd_seq_dummy 2
snd_seq_oss 2
snd_seq 7
snd_pcm_oss 3
snd_pcm 2
snd_timer 1
snd 2
snd_page_alloc 1
scsi_mod 6
|
rmmod
Если "use count" модуля равен 0, вы можете без опасений удалить
его. Например, вы можете сделать это при подготовке к загрузке
обновленной версии. Это позволит не перезагружать компьютер
только из-за того, что необходимо обновить поддержку какого-то
отдельного устройства. Для удаления введите команду
rmmod имя модуля, как показано в Листинге 7.
Листинг 7. Удаление модуля
из работающей системы
[root@attic4 ~]# rmmod floppy
|
Чтобы узнать о других опциях команды
rmmod, обратитесь к ее странице man.
insmod и modprobe
Удаленный вами модуль может понадобиться вновь. Чтобы
загрузить модуль, введите
команду insmod, полный
путь для модуля, который необходимо загрузить, и все необходимые
опции. При использовании этой команды вы, вероятно, захотите
использовать режим подстановки вывода команды (command
substitution), чтобы сгенерировать имя файла. В
Листинге 8 показаны два способа загрузки модуля.
Листинг 8. Загрузка модуля с
использованием команды insmod
[root@attic4 ~]# insmod /lib/modules/`uname -r`/kernel/drivers/block/floppy.ko
[root@attic4 ~]# rmmod floppy
[root@attic4 ~]# insmod $(modinfo -F filename floppy)
|
При использовании второго варианта нет необходимости помнить, в
каком подкаталоге (в данном случае drivers/block) расположен модуль. Но
существует и более удобный способ загрузки модуля. Команда modprobe предоставляет высокоуровневый интерфейс,
оперирующий именами модулей, а не именами путей файлов. Она также управляет
загрузкой дополнительных модулей, от которых зависит загружаемый модуль, и
позволяет не только загружать, но и удалять модули.
В Листинге 9 показано, как использовать команду modprobe для удаления модуля
vfat вместе с используемым им
модулем fat. Затем показано, как будет
вести себя система, если модуль будет загружен вновь, и в завершение
показан результат загрузки модуля. Обратите внимание на опцию -v, которая позволяет получать
подробный вывод. Если не использовать эту опцию, команда modprobe (а также команда
insmod) выведет только сообщения об
ошибках модуля. Между каждым действием используется команда
lsmod, пропущенная через grep,
чтобы проверить, загружены или нет модули vfat и fat.
Листинг 9. Загрузка модуля
с помощью команды modprobe
[root@lyrebird root]# modprobe -r vfat
vfat: Device or resource busy
[root@lyrebird root]# lsmod | grep fat
vfat 13132 1
fat 38744 1 [vfat]
[root@lyrebird root]# umount /windows/D
[root@lyrebird root]# modprobe -r vfat
[root@lyrebird root]# modprobe -v --show vfat
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o
[root@lyrebird root]# lsmod | grep fat
[root@lyrebird root]# modprobe -v vfat
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o
Using /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o
Symbol version prefix ''
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o
Using /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o
[root@lyrebird root]# lsmod | grep fat
vfat 13132 0 (unused)
fat 38744 0 [vfat]
|
depmod
Как вы только что видели, в случае, если один модуль зависит
от другого, при помощи команды modprobe можно управлять
автоматической загрузкой нескольких модулей. Зависимости
прописаны в файле modules.dep, хранящемся в подкаталоге
/lib/modules соответствующего ядра (имя ядра определяется при
помощи команды uname -r). Этот файл вместе
с несколькими map-файлами генерируется при помощи команды
depmod. Опция -a (от all) теперь
необязательна.
Команда depmod просматривает
модули в подкаталоге /lib/modules текущего ядра и обновляет
информацию о зависимостях. В Листинге 10 показан пример
выполнения команды depmod и полученных в результате файлов.
Листинг 10. Использование
команды depmod для создания файла modules.dep
[root@lyrebird root]# date
Thu Mar 16 10:41:05 EST 2006
[root@lyrebird root]# depmod
[root@lyrebird root]# cd /lib/modules/`uname -r`
[root@lyrebird 2.4.21-37.0.1.EL]# ls -l mod*
-rw-rw-r-- 1 root root 54194 Mar 16 10:41 modules.dep
-rw-rw-r-- 1 root root 31 Mar 16 10:41 modules.generic_string
-rw-rw-r-- 1 root root 73 Mar 16 10:41 modules.ieee1394map
-rw-rw-r-- 1 root root 1614 Mar 16 10:41 modules.isapnpmap
-rw-rw-r-- 1 root root 29 Mar 16 10:41 modules.parportmap
-rw-rw-r-- 1 root root 65171 Mar 16 10:41 modules.pcimap
-rw-rw-r-- 1 root root 24 Mar 16 10:41 modules.pnpbiosmap
-rw-rw-r-- 1 root root 122953 Mar 16 10:41 modules.usbmap
[root@lyrebird 2.4.21-37.0.1.EL]# cd -
/root
|
Вы можете изменить поведение команд modprobe и
depmod, скорректировав файл
/etc/modules.conf. Обычно это делается для создания
псевдонимов (alias) для имен модулей и определения
команд, которые должны быть запущены после загрузки
модуля или перед его отключением. Однако, могут быть
произведены и другие настройки. В Листинге 11 показан
пример файла /etc/modules.conf. Более подробную
информацию можно найти в странице man для modules.conf.
Листинг 11. Пример файла
/etc/modules
[root@lyrebird root]# cat /etc/modules.conf
alias eth0 e100
alias usb-controller usb-uhci
alias usb-controller1 ehci-hcd
alias sound-slot-0 i810_audio
post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :
pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :
|
Вы должны также знать, что некоторые системы используют
другой конфигурационный файл, modprobe.conf, и есть системы,
которые хранят информацию о конфигурации модулей в каталоге
/etc/modules.d. В некоторых системах вы можете встретить файлы
с названием /etc/modules. Эти файлы содержат имена модулей ядра,
которые должны быть загружены в ходе загрузки системы.
Модули USB
Когда вы подключаете к работающей системе Linux устройство
USB, ядро должно определить, какие модули необходимо загрузить
для управления устройством. Обычно это делается при помощи
hot-plug скрипта, использующего команду
usbmodules для поиска
соответствующего модуля. Вы можете также запустить команду
usbmodules (от имени root). В Листинге 12 показан
пример.
Листинг 12. Модули USB
root@pinguino:~# lsusb
Bus 005 Device 004: ID 1058:0401 Western Digital Technologies, Inc.
Bus 005 Device 003: ID 054c:0220 Sony Corp.
Bus 005 Device 001: ID 0000:0000
Bus 004 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 003: ID 04b3:310b IBM Corp. Red Wheel Mouse
Bus 001 Device 001: ID 0000:0000
root@pinguino:~# usbmodules --device /proc/bus/usb/005/003
usb-storage
root@pinguino:~# usbmodules --device /proc/bus/usb/001/003
usbmouse
usbhid
|
В следующем разделе показано, как собрать и настроить
собственное ядро.
|  |