IT News: Digital Camera, OS, Laptop, Smartphone, Smart TV, Sound...

The Author's Project by Valeri N.Kravchuk
Сайт проверен Dr.Web
Меню сайта
  • Главная страница
  • Информация о сайте
  • Дневник
  • Каталог файлов
  • Обратная связь
  • Каталог сайтов
  • FAQ
  • Доска объявлений
  • Форум
  • Фотоальбом
  • Категории раздела
    Автомобильные гаджеты, ремонт... [220]
    Безопасность IT [484]
    Блоки питания, Power Banks, зарядки... [490]
    Видеорегистраторы [220]
    Гаджеты для спорта и здоровья... [190]
    Гаджеты, аксессуары... [625]
    Измерительная техника, инструменты [449]
    Накопители данных [226]
    Нетбуки, Ноутбуки, Ультрабуки [680]
    Мультиварки, блендеры и не только... [158]
    Планшеты [758]
    Радар-детекторы [26]
    Роботы-пылесосы [37]
    Своими руками [357]
    Сети, сетевые технологии, оборудование... [269]
    Смартфоны [4966]
    Фотокамеры, объективы, искусство фотографии.. [543]
    Умный дом [47]
    Электронные книги [96]
    CB, LPD, PMR- связь... [171]
    DECT, IP-телефоны [18]
    Drones, boats, cars... [108]
    electric cars [35]
    GPS-навигаторы, трекеры... [51]
    Linux и не только [4380]
    mini computers и не только... [409]
    News IT, Это интересно, ликбез... [1113]
    Smart TV, UltraHD, приставки, проекторы... [414]
    Smart Watch [263]
    Sound: наушники, плееры, усилители... [616]
    Windows 10... [298]
    Windows 11 [28]
    Погода

  • Метеорадар БРЕСТ
  • Погода в Бресте от www.yr.no

    Яндекс.Погода БРЕСТ

  • Интересные ссылки

    COMPIZOMANIA

    Наш опрос
    Оцените мой сайт
    Всего ответов: 1340
    Статистика
    Анализ веб сайтов

    Яндекс.Метрика

    Рейтинг@Mail.ru Яндекс цитирования

    Russian America Top. Рейтинг ресурсов Русской Америки.

    eXTReMe Tracker

    Правильный CSS!


    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Locations of visitors to this page
    Форма входа
    Главная » 2015 » Май » 18 » Администрирование систем Linux. Ядро Linux
    12:55
    Администрирование систем Linux. Ядро Linux

    Администрирование систем Linux. Ядро Linux

    Оригинал: The Linux kernel
    Автор: Paul Cobbaut
    Дата публикации: 12 марта 2015 г.
    Перевод: A. Панин
    Дата перевода: 2 апреля 2015 г.

    Часть VI. Работа с ядром ОС

    Глава 28. Ядро Linux

    28.1. О ядре Linux

    28.1.1. Версии ядра

    В 1991 году Linus Torvalds разработал первую версию ядра Linux. Он выложил исходный код ядра в открытый доступ, после чего другие люди начали вносить свой вклад в его развитие. В разработке одной из версий ядра (а именно, версии 2.6.27, выпущенной в ноябре 2008 года) поучаствовало более 4000 разработчиков.

    Для основных версий ядра Linux используются четные и нечетные номера. Ранее существовало разделение версий, в соответствии с которым версии 2.0, 2.2, 2.4 и 2.6 считались стабильными. В то же время версии 2.1, 2.3 и 2.5 считались нестабильными (или разрабатываемыми). Начиная с выпуска версии ядра 2.6.0 в январе 2004 года вся разработка велась в рамках ветки 2.6. Версия ядра 2.7.0 так и не была выпущена и, судя по заявлениям главного разработчика ядра, которым все также является Linus Torvalds, схема разделения версий ядра на четные/стабильные и нечетные/разрабатываемые не используется и не будет использоваться в будущем.

    28.1.2. Команда uname -r

    Для того, чтобы узнать текущую версию ядра Linux, следует использовать команду uname -r таким образом, как показано ниже.

    В первом примере показан вывод данной команды в системе с ядром Linux основной версии 2.6 и дополнительной версии 24. Остальная часть строки -22-generic является специфичной для дистрибутива (в данном случае используется дистрибутив Ubuntu).

     

    paul@laika:~$ uname -r
    2.6.24-22-generic
    

     

    При выполнении этой же команды в дистрибутиве Red Hat Entrprise Linux можно получить информацию о более старом ядре (версии 2.6.18), причем строка -92.1.17.el5 также является специфичной для дистрибутива.

     

    [paul@RHEL52 ~]$ uname -r
    2.6.18-92.1.17.el5
    

     

    28.1.3. Файл /proc/cmdline

    Параметры, которые были переданы ядру ОС в процессе загрузки системы, могут быть получены из файла /proc/cmdline.

     

    paul@RHELv4u4:~$ cat /proc/cmdline 
    ro root=/dev/VolGroup00/LogVol00 rhgb quiet
    

     

    28.1.4. Однопользовательский режим

    В случае передачи ядру Linux параметра single будет осуществляться загрузка системы в однопользовательском режиме. В данном случае после загрузки ядра Linux будет запущена командная оболочка bash с привилегиями пользователя root (ввода пароля не потребуется).

    В некоторых дистрибутивах данная возможность заблокирована (на этапе компиляции ядра ОС).

    28.1.5. Параметр init=/bin/bash

    Обычно ядро ОС запускает бинарный файл, путь к которому передан с помощью параметра init, создавая таким образом первый процесс-демон. Добавление параметра init=/bin/bash к строке параметров ядра позволяет вызывать командную оболочку bash (снова с правами пользователя root без необходимости ввода пароля).

    28.1.6. Файл журнала /var/log/messages

    Ядро ОС в процессе загрузки передает демону syslogd информацию о множестве выполняемых действий, которая сохраняется в файле журнала /var/log/messages. Из данного файла журнала можно извлечь информацию о процессе загрузки ядра, включая информацию обо всех устройствах, которые были идентифицированы в процессе загрузки системы.

     

    [root@RHEL53 ~]# grep -A16 "syslogd 1.4.1:" /var/log/messages|cut -b24-
    syslogd 1.4.1: restart.
    kernel: klogd 1.4.1, log source = /proc/kmsg started.
    kernel: Linux version 2.6.18-128.el5 (mockbuild@hs20-bc1-5.build.red...
    kernel: BIOS-provided physical RAM map:
    kernel: BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
    kernel: BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
    kernel: BIOS-e820: 00000000000ca000 - 00000000000cc000 (reserved)
    kernel: BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)
    kernel: BIOS-e820: 0000000000100000 - 000000001fef0000 (usable)
    kernel: BIOS-e820: 000000001fef0000 - 000000001feff000 (ACPI data)
    kernel: BIOS-e820: 000000001feff000 - 000000001ff00000 (ACPI NVS)
    kernel: BIOS-e820: 000000001ff00000 - 0000000020000000 (usable)
    kernel: BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)
    kernel: BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
    kernel: BIOS-e820: 00000000fffe0000 - 0000000100000000 (reserved)
    kernel: 0MB HIGHMEM available.
    kernel: 512MB LOWMEM available.
    

     

    А в данном примере показан фрагмент файла /var/log/messages, который может использоваться для извлечения информации о дисковом устройстве, представленном файлом устройства /dev/sda.

     

    [root@RHEL53 ~]# grep sda /var/log/messages | cut -b24-
    kernel: SCSI device sda: 41943040 512-byte hdwr sectors (21475 MB)
    kernel: sda: Write Protect is off
    kernel: sda: cache data unavailable
    kernel: sda: assuming drive cache: write through
    kernel: SCSI device sda: 41943040 512-byte hdwr sectors (21475 MB)
    kernel: sda: Write Protect is off
    kernel: sda: cache data unavailable
    kernel: sda: assuming drive cache: write through
    kernel: sda: sda1 sda2
    kernel: sd 0:0:0:0: Attached scsi disk sda
    kernel: EXT3 FS on sda1, internal journal
    

     

    28.1.7. Утилита dmesg

    Утилита dmesg выводит все сообщения ядра ОС (с момента последней загрузки системы).

     

    [root@RHEL53 ~]# dmesg | head
    Linux version 2.6.18-128.el5 (mockbuild@hs20-bc1-5.build.redhat.com)
    BIOS-provided physical RAM map:
     BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
     BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
     BIOS-e820: 00000000000ca000 - 00000000000cc000 (reserved)
     BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)
     BIOS-e820: 0000000000100000 - 000000001fef0000 (usable)
     BIOS-e820: 000000001fef0000 - 000000001feff000 (ACPI data)
     BIOS-e820: 000000001feff000 - 000000001ff00000 (ACPI NVS)
     BIOS-e820: 000000001ff00000 - 0000000020000000 (usable)
    

     

    Следовательно, в случае поиска информации о дисковом устройстве, представленном файлом устройства /dev/sda, с помощью утилиты dmesg, будут выведены только сообщения ядра ОС с момента последней загрузки системы.

     

    [root@RHEL53 ~]# dmesg | grep sda
    SCSI device sda: 41943040 512-byte hdwr sectors (21475 MB)
    sda: Write Protect is off
    sda: Mode Sense: 5d 00 00 00
    sda: cache data unavailable
    sda: assuming drive cache: write through
    SCSI device sda: 41943040 512-byte hdwr sectors (21475 MB)
    sda: Write Protect is off
    sda: Mode Sense: 5d 00 00 00
    sda: cache data unavailable
    sda: assuming drive cache: write through
     sda: sda1 sda2
    sd 0:0:0:0: Attached scsi disk sda
    EXT3 FS on sda1, internal journal
    

     

    28.2. Исходный код ядра Linux

    28.2.1. Ресурс ftp.kernel.org

    Официальное хранилище архивов исходного ядра Linux расположено по адресу ftp.kernel.org. Данный ресурс содержит архивы исходного кода всех официальных выпусков ядра Linux начиная с 1991 года. Доступ ко всем архивам исходного кода, а также к файлам со списками изменений и файлам с исправлениями может осуществляться по протоколам http, ftp и rsync. Дополнительная информация может быть получена на вебсайте www.kernel.org.

    Каждый человек может воспользоваться ftp-клиентом для осуществления анонимного входа на ресурс ftp.kernel.org.

     

    paul@laika:~$ ftp ftp.kernel.org
    Connected to pub3.kernel.org.
    220 Welcome to ftp.kernel.org.
    Name (ftp.kernel.org:paul): anonymous
    331 Please specify the password.
    Password:
    230- Welcome to the
    230-
    230- LINUX KERNEL ARCHIVES
    230- ftp.kernel.org
    

     

    Архивы исходного кода всех версий ядра Linux расположены по пути pub/linux/kernel/.

     

    ftp> ls pub/linux/kernel/v*
    200 PORT command successful. Consider using PASV.
    150 Here comes the directory listing.
    drwxrwsr-x 2 536 536 4096 Mar 20 2003 v1.0
    drwxrwsr-x 2 536 536 20480 Mar 20 2003 v1.1
    drwxrwsr-x 2 536 536 8192 Mar 20 2003 v1.2
    drwxrwsr-x 2 536 536 40960 Mar 20 2003 v1.3
    drwxrwsr-x 3 536 536 16384 Feb 08 2004 v2.0
    drwxrwsr-x 2 536 536 53248 Mar 20 2003 v2.1
    drwxrwsr-x 3 536 536 12288 Mar 24 2004 v2.2
    drwxrwsr-x 2 536 536 24576 Mar 20 2003 v2.3
    drwxrwsr-x 5 536 536 28672 Dec 02 08:14 v2.4
    drwxrwsr-x 4 536 536 32768 Jul 14 2003 v2.5
    drwxrwsr-x 7 536 536 110592 Dec 05 22:36 v2.6
    226 Directory send OK.
    ftp>
    

     

    28.2.2. Директория /usr/src

    Исходный код ядра ОС на вашем локальном компьютере должен быть расположен в директории /usr/src. Учтите, что структура поддиректорий директории /usr/src может отличаться в зависимости от используемого вами дистрибутива.

    В первую очередь давайте рассмотрим структуру поддиректорий директории /usr/src в дистрибутиве Debian. В данном случае в этой директории можно обнаружить две версии полного исходного кода ядра Linux. При поиске определенного файла (e1000_main.c) исходного кода с помощью утилиты find можно получить полный путь к этому файлу.

     

    paul@barry:~$ ls -l /usr/src/
    drwxr-xr-x 20 root root 4096 2006-04-04 22:12 linux-source-2.6.15
    drwxr-xr-x 19 root root 4096 2006-07-15 17:32 linux-source-2.6.16
    paul@barry:~$ find /usr/src -name e1000_main.c
    /usr/src/linux-source-2.6.15/drivers/net/e1000/e1000_main.c
    /usr/src/linux-source-2.6.16/drivers/net/e1000/e1000_main.c
    

     

    Данная структура поддиректорий очень похожа на структуру поддиректорий директории /usr/src в дистрибутиве Ubuntu за тем исключением, что в данном случае в директории расположен исходный код одной версии ядра (и эта версия более новая).

     

    paul@laika:~$ ls -l /usr/src/
    drwxr-xr-x 23 root root 4096 2008-11-24 23:28 linux-source-2.6.24
    paul@laika:~$ find /usr/src -name "e1000_main.c"
    /usr/src/linux-source-2.6.24/drivers/net/e1000/e1000_main.c
    

     

    Теперь давайте рассмотрим содержимое директории /usr/src в дистрибутиве Red Hat Entrprise Linux.

     

    [paul@RHEL52 ~]$ ls -l /usr/src/
    drwxr-xr-x 5 root root 4096 Dec 5 19:23 kernels
    drwxr-xr-x 7 root root 4096 Oct 11 13:22 redhat
    

     

    Нам придется погрузиться немного глубже в дерево директорий для того, чтобы добраться до исходного кода ядра ОС в дистрибутиве Red Hat!

     

    [paul@RHEL52 ~]$ cd /usr/src/redhat/BUILD/
    [paul@RHEL52 BUILD]$ find . -name "e1000_main.c"
    ./kernel-2.6.18/linux-2.6.18.i686/drivers/net/e1000/e1000_main.c
    

     

    28.2.3. Загрузка исходного кода ядра ОС

    Debian

    Установка пакета программного обеспечения с исходным кодом ядра ОС в дистрибутиве Debian осуществляется достаточно просто с помощью команды aptitude install linux-source. В первую очередь вы можете осуществить поиск всех пакетов программного обеспечения с именами linux-source таким образом, как показано в примере ниже.

     

    root@barry:~# aptitude search linux-source
    v linux-source -
    v linux-source-2.6 -
    id linux-source-2.6.15 - Linux kernel source for version 2.6.15
    i linux-source-2.6.16 - Linux kernel source for version 2.6.16
    p linux-source-2.6.18 - Linux kernel source for version 2.6.18
    p linux-source-2.6.24 - Linux kernel source for version 2.6.24
    

     

    После этого вы можете использовать команду aptitude install для загрузки и установки пакета программного обеспечения с исходным кодом ядра Linux из состава дистрибутива Debian.

     

    root@barry:~# aptitude install linux-source-2.6.24
    

     

    После того, как утилита aptitude закончит работу, вы обнаружите новый файл с именем /usr/src/linux-source-<версия>.tar.bz2 в файловой системе вашего компьютера.

     

    root@barry:/usr/src# ls -lh
    drwxr-xr-x 20 root root 4.0K 2006-04-04 22:12 linux-source-2.6.15
    drwxr-xr-x 19 root root 4.0K 2006-07-15 17:32 linux-source-2.6.16
    -rw-r--r-- 1 root root 45M 2008-12-02 10:56 linux-source-2.6.24.tar.bz2
    

     

    Ubuntu

    Дистрибутив Ubuntu основывается на дистрибутиве Debian, причем в нем также может использоваться утилита aptitude, поэтому задача полностью аналогична предыдущей.

     

    root@laika:~# aptitude search linux-source
    i linux-source - Linux kernel source with Ubuntu patches
    v linux-source-2.6 -
    i A linux-source-2.6.24 - Linux kernel source for version 2.6.24
    root@laika:~# aptitude install linux-source
    

     

    И после того, как утилита aptitude завершит свою работу, мы получим файл /usr/src/linux-source-<версия>.tar.bz2.

     

    root@laika:~# ll /usr/src
    итого 45M
    -rw-r--r-- 1 root root 45M 2008-11-24 23:30 linux-source-2.6.24.tar.bz2
    

     

    Red Hat Enterprise Linux

    Ранее пакет программного обеспечения с исходным кодом ядра ОС располагался на четвертом установочном диске с пакетами исходного кода дистрибутива Red Hat Enerprise Linux. Файл пакета программного обеспечения носит имя kernel-2.6.9-42.EL.src.rpm (пример для дистрибутива RHEL версии 4 с обновлением 4). Также данный пакет доступен по адресу ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/ (пример для дистрибутива RHEL 5).

    Для загрузки пакета исходного кода ядра ОС дистрибутива RHEL следует использовать длинную команду (команда должна располагаться в одной строке без завершающего символа \).

     

    wget ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/\
    SRPMS/kernel-`uname -r`.src.rpm
    

     

    После того, как утилита wget закончит свою работу, вы получите файл с расширением .rpm размером в 60 Мб.

     

    [root@RHEL52 src]# ll
    итого 60M
    -rw-r--r-- 1 root root 60M дек 5 20:54 kernel-2.6.18-92.1.17.el5.src.rpm
    drwxr-xr-x 5 root root 4.0K дек 5 19:23 kernels
    drwxr-xr-x 7 root root 4.0K окт 11 13:22 redhat
    

     

    Нам придется выполнить дополнительные действия для того, чтобы использовать исходный код ядра ОС из пакета программного обеспечения по назначению.

    В первую очередь мы должны выполнить команду rpm -i kernel-2.6.9-42.EL.src.rpm для установки загруженного пакета программного обеспечения дистрибутива Red Hat.

     

    [root@RHEL52 src]# ll
    итого 60M
    -rw-r--r-- 1 root root 60M дек 5 20:54 kernel-2.6.18-92.1.17.el5.src.rpm
    drwxr-xr-x 5 root root 4.0K дек 5 19:23 kernels
    drwxr-xr-x 7 root root 4.0K окт 11 13:22 redhat
    [root@RHEL52 src]# rpm -i kernel-2.6.18-92.1.17.el5.src.rpm
    

     

    После этого мы должны перейти в директорию SPECS и задействовать утилиту rpmbuild.

     

    [root@RHEL52 ~]# cd /usr/src/redhat/SPECS
    [root@RHEL52 SPECS]# rpmbuild -bp -vv --target=i686 kernel-2.6.spec
    

     

    Утилита rpmbuild поместит исходный код ядра Linux дистрибутива RHEL в директорию /usr/src/redhat/BUILD/kernel-<версия>/.

     

    [root@RHEL52 kernel-2.6.18]# pwd
    /usr/src/redhat/BUILD/kernel-2.6.18
    [root@RHEL52 kernel-2.6.18]# ll
    итого 20K
    drwxr-xr-x 2 root root 4.0K дек 6 2007 config
    -rw-r--r-- 1 root root 3.1K дек 5 20:58 Config.mk
    drwxr-xr-x 20 root root 4.0K дек 5 20:58 linux-2.6.18.i686
    drwxr-xr-x 19 root root 4.0K сен 20 2006 vanilla
    drwxr-xr-x 8 root root 4.0K дек 6 2007 xen
    

     

    28.3. Файлы, используемые в процессе загрузки ядра ОС

    28.3.1. Файл vmlinuz

    Файл vmlinuz из директории /boot является сжатым исполняемым файлом ядра ОС.

     

    paul@barry:~$ ls -lh /boot | grep vmlinuz
    -rw-r--r-- 1 root root 1.2M 2006-03-06 16:22 vmlinuz-2.6.15-1-486
    -rw-r--r-- 1 root root 1.1M 2006-03-06 16:30 vmlinuz-2.6.15-1-686
    -rw-r--r-- 1 root root 1.3M 2008-02-11 00:00 vmlinuz-2.6.18-6-686
    paul@barry:~$
    

     

    28.3.2. Файл initrd

    Ядро ОС использует файл initrd (Initial RAM disk - диск в оперативной памяти для начальной инициализации) в процессе загрузки системы. Данный диск монтируется до момента окончания загрузки ядра ОС и может содержать дополнительные драйверы и модули ядра ОС. На самом деле, данный файл является сжатым архивом формата CPIO, поэтому вы можете просмотреть его содержимое следующим образом.

     

    root@RHELv4u4:/boot# mkdir /mnt/initrd
    root@RHELv4u4:/boot# cp initrd-2.6.9-42.0.3.EL.img TMPinitrd.gz
    root@RHELv4u4:/boot# gunzip TMPinitrd.gz 
    root@RHELv4u4:/boot# file TMPinitrd 
    TMPinitrd: ASCII cpio archive (SVR4 with no CRC)
    root@RHELv4u4:/boot# cd /mnt/initrd/
    root@RHELv4u4:/mnt/initrd# cpio -i | /boot/TMPinitrd 
    4985 блоков
    root@RHELv4u4:/mnt/initrd# ls -l
    итого 76
    drwxr-xr-x 2 root root 4096 фев 5 08:36 bin
    drwxr-xr-x 2 root root 4096 фев 5 08:36 dev
    drwxr-xr-x 4 root root 4096 фев 5 08:36 etc
    -rwxr-xr-x 1 root root 1607 фев 5 08:36 init
    drwxr-xr-x 2 root root 4096 фев 5 08:36 lib
    drwxr-xr-x 2 root root 4096 фев 5 08:36 loopfs
    drwxr-xr-x 2 root root 4096 фев 5 08:36 proc
    lrwxrwxrwx 1 root root 3 фев 5 08:36 sbin -> bin
    drwxr-xr-x 2 root root 4096 фев 5 08:36 sys
    drwxr-xr-x 2 root root 4096 фев 5 08:36 sysroot
    root@RHELv4u4:/mnt/initrd#
    

     

    28.3.3. Файл System.map

    Файл System.map содержит таблицу символов и изменяется при каждой компиляции ядра ОС. Таблица символов также присутствует в файле /proc/kallsyms (до выпуска ядра Linux версии 2.6 данный файл носил имя /proc/ksyms).

     

    root@RHELv4u4:/boot# head System.map-`uname -r`
    00000400 A __kernel_vsyscall
    0000041a A SYSENTER_RETURN_OFFSET
    00000420 A __kernel_sigreturn
    00000440 A __kernel_rt_sigreturn
    c0100000 A _text
    c0100000 T startup_32
    c01000c6 t checkCPUtype
    c0100147 t is486
    c010014e t is386
    c010019f t L6
    root@RHELv4u4:/boot# head /proc/kallsyms 
    c0100228 t _stext
    c0100228 t calibrate_delay_direct
    c0100228 t stext
    c0100337 t calibrate_delay
    c01004db t rest_init
    c0100580 t do_pre_smp_initcalls
    c0100585 t run_init_process
    c01005ac t init
    c0100789 t early_param_test
    c01007ad t early_setup_test
    root@RHELv4u4:/boot#
    

     

    28.3.4. Файл .config

    Последним файлом, копируемым в директорию /boot, является файл со значениями параметров конфигурации ядра ОС, используемый в процессе его компиляции. Данный файл не должен находиться директории /boot для корректного функционирования ядра ОС, но размещение его копии в данной директории является обычной практикой. Благодаря его наличию появляется возможность осуществления повторной компиляции ядра ОС с использованием тех же значений параметров конфигурации, которые были использованы для компиляции существующего работоспособного ядра ОС.

    28.4. Модули ядра Linux

    28.4.1. Информация о модулях ядра Linux

    Ядро Linux является монолитным ядром с поддержкой загружаемых модулей. Данные модули содержат части ядра ОС, обычно используемые в качестве драйверов устройств, реализаций файловых систем и сетевых протоколов. В большинстве случаев необходимые модули ядра ОС загружаются автоматически и динамически без вмешательства системного администратора.

    28.4.2. Директория /lib/modules

    Модули ядра ОС хранятся в директории /lib/modules/<версия-ядра-ос>. Для хранения модулей каждой версии ядра Linux, которая была скомпилирована для вашей системы, создается отдельная директория.

     

    paul@laika:~$ ll /lib/modules/
    итого 12K
    drwxr-xr-x 7 root root 4.0K 2008-11-10 14:32 2.6.24-16-generic
    drwxr-xr-x 8 root root 4.0K 2008-12-06 15:39 2.6.24-21-generic
    drwxr-xr-x 8 root root 4.0K 2008-12-05 12:58 2.6.24-22-generic
    

     

    28.4.3. Файл <модуль>.ko

    Имя файла, содержащего код модуля ядра ОС, обычно оканчивается на .ko. В данном примере показано расположение файлов модулей ядра ОС, предназначенных для поддержки протокола isdn.

     

    paul@laika:~$ find /lib/modules -name isdn.ko
    /lib/modules/2.6.24-21-generic/kernel/drivers/isdn/i4l/isdn.ko
    /lib/modules/2.6.24-22-generic/kernel/drivers/isdn/i4l/isdn.ko
    /lib/modules/2.6.24-16-generic/kernel/drivers/isdn/i4l/isdn.ko
    

     

    28.4.4. Утилита lsmod

    Для ознакомления со списком загруженных в текущий момент модулей ядра ОС, следует использовать утилиту lsmod. В выводе утилиты вы можете обнаружить информацию об имени каждого из загруженных модулей, его размере, значении счетчика использования модуля, а также именах других модулей, использующих данный модуль.

     

    [root@RHEL52 ~]# lsmod | head -5
    Module Size Used by
    autofs4 24517 2 
    hidp 23105 2 
    rfcomm 42457 0 
    l2cap 29505 10 hidp,rfcomm
    

     

    28.4.5. Файл /proc/modules

    Файл /proc/modules содержит список всех модулей, загруженных ядром ОС. Список модулей ядра ОС из данного файла является слишком длинным для того, чтобы приводить его в данной книге, поэтому давайте используем утилиту grep для поиска модуля с именем vm.

    Мы видим, что одновременно загружены модуля ядра ОС vmmon и vmnet. Вы можете получить ту же самую информацию и с помощью утилиты lsmod. На самом деле, утилита lsmod всего лишь читает содержимое файла /proc/modules и выводит его с соответствующим форматированием.

     

    paul@laika:~$ cat /proc/modules | grep vm
    vmnet 36896 13 - Live 0xffffffff88b21000 (P)
    vmmon 194540 0 - Live 0xffffffff88af0000 (P)
    paul@laika:~$ lsmod | grep vm
    vmnet 36896 13 
    vmmon 194540 0 
    paul@laika:~$
    

     

    28.4.6. Зависимости модулей ядра ОС

    Некоторые модули ядра ОС зависят от других модулей ядра ОС. В следующем примере вы можете увидеть, что модуль ядра ОС с именем nfsd зависит от модулей с именами exportfs, lockd и sunrpc.

     

    paul@laika:~$ cat /proc/modules | grep nfsd
    nfsd 267432 17 - Live 0xffffffff88a40000
    exportfs 7808 1 nfsd, Live 0xffffffff88a3d000
    lockd 73520 3 nfs,nfsd, Live 0xffffffff88a2a000
    sunrpc 185032 12 nfs,nfsd,lockd, Live 0xffffffff889fb000
    paul@laika:~$ lsmod | grep nfsd
    nfsd 267432 17 
    exportfs 7808 1 nfsd
    lockd 73520 3 nfs,nfsd
    sunrpc 185032 12 nfs,nfsd,lockd
    paul@laika:~$
    

     

    28.4.7. Утилита insmod

    Модули ядра ОС могут быть загружены в ручном режиме с помощью утилиты insmod. Это очень простой (и устаревший) способ загрузки модулей ядра ОС. В примере ниже показан процесс загрузки модуля ядра ОС с именем fat (реализующего поддержку файловой системы fat).

     

    root@barry:/lib/modules/2.6.17-2-686# lsmod | grep fat
    root@barry:/lib/modules/2.6.17-2-686# insmod kernel/fs/fat/fat.ko 
    root@barry:/lib/modules/2.6.17-2-686# lsmod | grep fat
    fat 46588 0
    

     

    Утилита insmod не определяет зависимости между модулями ядра ОС, поэтому в следующем примере нам не удалось загрузить с помощью данной утилиты модуль с именем isdn (так как модуль с именем isdn зависит от модуля с именем slhc).

     

    [root@RHEL52 drivers]# pwd
    /lib/modules/2.6.18-92.1.18.el5/kernel/drivers
    [root@RHEL52 kernel]# insmod isdn/i4l/isdn.ko 
    insmod: error inserting 'isdn/i4l/isdn.ko': -1 Unknown symbol in module
    

     

    28.4.8. Утилита modinfo

    Как вы можете увидеть в представленном ниже выводе утилиты modinfo, модуль ядра ОС с именем isdn зависит от модуля ядра ОС с именем slhc.

     

    [root@RHEL52 drivers]# modinfo isdn/i4l/isdn.ko | head -6
    filename: isdn/i4l/isdn.ko
    license: GPL
    author: Fritz Elfert
    description: ISDN4Linux: link layer
    srcversion: 99650346E708173496F6739
    depends: slhc
    

     

    28.4.9. Утилита modprobe

    Большим преимуществом утилиты modprobe перед утилитой insmod является возможность первой утилиты загружать все необходимые модули ядра ОС, в то время, как вторая утилита требует загрузки всех необходимых модулей ядра ОС в ручном режиме. Другое преимущество данной утилиты заключается в отсутствии необходимости указания полного пути к файлу загружаемого модуля ядра ОС.

    В данном примере показан способ загрузки модуля с именем isdn с помощью утилиты modprobe с автоматической загрузкой модуля с именем shlc в фоновом режиме.

     

    [root@RHEL52 kernel]# lsmod | grep isdn
    [root@RHEL52 kernel]# modprobe isdn
    [root@RHEL52 kernel]# lsmod | grep isdn
    isdn 122433 0 
    slhc 10561 1 isdn
    [root@RHEL52 kernel]#
    

     

    28.4.10. Файл /lib/modules/<версия-ядра-ос>/modules.dep

    Зависимости модулей ядра ОС описаны в рамках файла с именем modules.dep.

     

    [root@RHEL52 2.6.18-92.1.18.el5]# pwd
    /lib/modules/2.6.18-92.1.18.el5
    [root@RHEL52 2.6.18-92.1.18.el5]# head -3 modules.dep 
    /lib/modules/2.6.18-92.1.18.el5/kernel/drivers/net/tokenring/3c359.ko:
    /lib/modules/2.6.18-92.1.18.el5/kernel/drivers/net/pcmcia/3c574_cs.ko:
    /lib/modules/2.6.18-92.1.18.el5/kernel/drivers/net/pcmcia/3c589_cs.ko:
    

     

    28.4.11. Утилита depmod

    Файл modules.dep может быть обновлен (повторно создан) с помощью утилиты depmod. В следующем примере не было добавлено никаких новых модулей ядра ОС, поэтому утилита depmod сгенерировала идентичный файл.

     

    root@barry:/lib/modules/2.6.17-2-686# ls -l modules.dep 
    -rw-r--r-- 1 root root 310676 2008-03-01 16:32 modules.dep
    root@barry:/lib/modules/2.6.17-2-686# depmod
    root@barry:/lib/modules/2.6.17-2-686# ls -l modules.dep 
    -rw-r--r-- 1 root root 310676 2008-12-07 13:54 modules.dep
    

     

    28.4.12. Утилита rmmod

    По аналогии с утилитой insmod, утилита rmmod на сегодняшний день практически не используется.

     

    [root@RHELv4u3 ~]# modprobe isdn
    [root@RHELv4u3 ~]# rmmod slhc
    ERROR: Module slhc is in use by isdn
    [root@RHELv4u3 ~]# rmmod isdn
    [root@RHELv4u3 ~]# rmmod slhc
    [root@RHELv4u3 ~]# lsmod | grep isdn
    [root@RHELv4u3 ~]#
    

     

    28.4.13. Команда modprobe -r

    В отличие от утилиты rmmod, утилита modprobe будет автоматически удалять неиспользуемые модуля ядра ОС.

     

    [root@RHELv4u3 ~]# modprobe isdn
    [root@RHELv4u3 ~]# lsmod | grep isdn
    isdn 133537 0 
    slhc 7233 1 isdn
    [root@RHELv4u3 ~]# modprobe -r isdn
    [root@RHELv4u3 ~]# lsmod | grep isdn
    [root@RHELv4u3 ~]# lsmod | grep slhc
    [root@RHELv4u3 ~]#
    

     

    28.4.14. Файл конфигурации /etc/modprobe.conf

    Файл конфигурации /etc/modprobe.conf и специальные файлы конфигурации из директории /etc/modprobe.d могут содержать псевдонимы (для использования людьми), а также параметры (для зависимых модулей ядра ОС), используемые утилитой modprobe.

     

    [root@RHEL52 ~]# cat /etc/modprobe.conf
    alias scsi_hostadapter mptbase
    alias scsi_hostadapter1 mptspi
    alias scsi_hostadapter2 ata_piix
    alias eth0 pcnet32
    alias eth2 pcnet32
    alias eth1 pcnet32
    

     

    28.5. Компиляция ядра ОС

    28.5.1. Дополнительная версия

    Перейдите в директорию /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/ и измените дополнительную версию ядра ОС, заменив значение параметра extraversion в файле с именем Makefile.

     

    [root@RHEL52 linux-2.6.18.i686]# pwd
    /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686
    [root@RHEL52 linux-2.6.18.i686]# vi Makefile 
    [root@RHEL52 linux-2.6.18.i686]# head -4 Makefile 
    VERSION = 2
    PATCHLEVEL = 6
    SUBLEVEL = 18
    EXTRAVERSION = -paul2008
    

     

    28.5.2. Команда make mrproper

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

     

    [root@RHEL52 linux-2.6.18.i686]# make mrproper
     CLEAN scripts/basic
     CLEAN scripts/kconfig
     CLEAN include/config
     CLEAN .config .config.old
    

     

    28.5.3. Файл .config

    Теперь скопируйте работоспособный файл с именем .config из директории /boot в директорию с исходным кодом вашего ядра ОС. Этот файл содержит значения параметров конфигурации, которые использовались при компиляции вашего текущего ядра ОС. Грубо говоря, данный файл содержит информацию о том, должны ли компилироваться определенные модули ядра ОС.

     

    [root@RHEL52 linux-2.6.18.i686]# cp /boot/config-2.6.18-92.1.18.el5 .config
    

     

    28.5.4. Команда make menuconfig

    Теперь следует выполнить команду make menuconfig (или команду make xconfig в случае использования графического интерфейса). Запущенная утилита позволит вам установить, необходимо ли компилировать определенный модуль (m), включить код модуля в состав ядра ОС (*) или вообще не компилировать его (что позволит сократить размер ядра ОС). Если вы откажитесь от компиляции слишком большого количества модулей, ваше ядро ОС не будет работать корректно. Данные конфигурации будут сохранены в скрытом файле с именем .config.

     

    [root@RHEL52 linux-2.6.18.i686]# make menuconfig
    

     

    28.5.5. Команда make clean

    Выполните команду make clean для подготовки исходного кода ядра ОС к компиляции. Команда make clean позволяет удалить большую часть сгенерированных файлов, но сохраняет ваши файлы конфигурации ядра ОС. Исполнение команды make mrproper на данном этапе приведет к уничтожению файла .config, который был создан в результате исполнения команды make menuconfig.

     

    [root@RHEL52 linux-2.6.18.i686]# make clean
    

     

    28.5.6. Команда make bzImage

    А теперь следует выполнить команду make bzImage, присесть и расслабиться, ожидая окончания процесса компиляции ядра ОС. Вы также можете использовать команду time make bzImage, чтобы получить информацию о времени, необходимым для компиляции ядра ОС, которая может понадобиться для планирования непродолжительной прогулки во время следующей компиляции.

     

    [root@RHEL52 linux-2.6.18.i686]# time make bzImage
     HOSTCC scripts/basic/fixdep
     HOSTCC scripts/basic/docproc
     HOSTCC scripts/kconfig/conf.o
     HOSTCC scripts/kconfig/kxgettext.o
    ... 
    

     

    Исполнение данной команды завершится выводом информации о пути к результирующему файлу bzImage (а также времени компиляции, если вы также использовали команду time ).

     

    Kernel: arch/i386/boot/bzImage is ready (#1)
    
    real 13m59.573s
    user 1m22.631s
    sys 11m51.034s
    [root@RHEL52 linux-2.6.18.i686]#
    

     

    На данном этапе вы можете вручную скопировать результирующий файл в директорию /boot с помощью команды cp arch/i386/boot/bzImage /boot/vmlinuz-<версия-ядра-ОС>.

    28.5.7. Команда make modules

    Теперь следует выполнить команду make modules. На компиляцию всех модулей ядра ОС уйдет от 20 до 50 минут.

     

    [root@RHEL52 linux-2.6.18.i686]# time make modules
     CHK include/linux/version.h
     CHK include/linux/utsrelease.h
     CC [M] arch/i386/kernel/msr.o
     CC [M] arch/i386/kernel/cpuid.o
     CC [M] arch/i386/kernel/microcode.o
    

     

    28.5.8. Команда make modules_install

    Для копирования всех скомпилированных модулей ядра ОС в директорию /lib/modules следует всего лишь выполнить команду make modules_install (на установку модулей уйдет примерно 20 секунд). В примере ниже приведен список содержимого директории модулей перед исполнением упомянутой команды.

     

    [root@RHEL52 linux-2.6.18.i686]# ls -l /lib/modules/
    итого 20
    drwxr-xr-x 6 root root 4096 окт 15 13:09 2.6.18-92.1.13.el5
    drwxr-xr-x 6 root root 4096 ноя 11 08:51 2.6.18-92.1.17.el5
    drwxr-xr-x 6 root root 4096 дек 6 07:11 2.6.18-92.1.18.el5
    [root@RHEL52 linux-2.6.18.i686]# make modules_install
    

     

    А это список содержимого этой же директории после исполнения этой команды. Обратите внимание на то, что в процессе исполнения команды make modules_install была создана новая директория для модулей нового ядра ОС.

     

    [root@RHEL52 linux-2.6.18.i686]# ls -l /lib/modules/
    итого 24
    drwxr-xr-x 6 root root 4096 окт 15 13:09 2.6.18-92.1.13.el5
    drwxr-xr-x 6 root root 4096 ноя 11 08:51 2.6.18-92.1.17.el5
    drwxr-xr-x 6 root root 4096 дек 6 07:11 2.6.18-92.1.18.el5
    drwxr-xr-x 3 root root 4096 дек 6 08:50 2.6.18-paul2008
    

     

    28.5.9. Директория /boot

    Нам все также необходимо скопировать исполняемый файл ядра ОС, файл System.map и наш файл со значениями параметров конфигурации ядра ОС в директорию /boot. Строго говоря, копировать файл со значениями параметров конфигурации ядра ОС с именем .config совсем не обязательно, но он может пригодиться в будущем при компиляции ядра ОС.

     

    [root@RHEL52 ]# pwd
    /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686
    [root@RHEL52 ]# cp System.map /boot/System.map-2.6.18-paul2008
    [root@RHEL52 ]# cp .config /boot/config-2.6.18-paul2008
    [root@RHEL52 ]# cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.18-paul2008
    

     

    28.5.10. Утилита mkinitrd

    Ядро ОС обычно использует файл initrd в процессе загрузки. Мы можем использовать утилиту mkinitrd для генерации этого файла. Убедитесь в том, что вы используете корректное имя ядра ОС!

     

    [root@RHEL52 ]# pwd
    /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686
    [root@RHEL52 ]# mkinitrd /boot/initrd-2.6.18-paul2008 2.6.18-paul2008
    

     

    28.5.11. Системный загрузчик

    На этом компиляция ядра ОС закончена, но не следует забывать о необходимости создания дополнительного станса для отображения пункта в меню системного загрузчика grub или lilo.

    28.6. Компиляция отдельного модуля ядра ОС

    28.6.1. Файл исходного кода hello.c

    Небольшая программа на языке C послужит основой для нашего модуля ядра ОС.

     

    [root@rhel4a kernel_module]# cat hello.c 
    #include <linux/module.h>
    #include <section>
    
    int init_module(void)
    {
     printk(KERN_INFO "Инициализация модуля Hello World...\n");
     return 0;
    }
    
    void cleanup_module(void)
    {
     printk(KERN_INFO "Завершение работы модуля Hello World... \n");
    }
    

     

    28.6.2. Файл Makefile

    Файл для сборки модуля ядра ОС будет содержать следующие строки.

     

    [root@rhel4a kernel_module]# cat Makefile 
    obj-m += hello.o
    all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
    clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    

     

    Для компиляции модуля необходимы только два описанных файла.

     

    [root@rhel4a kernel_module]# ll
    итого 16
    -rw-rw-r-- 1 paul paul 250 фев 15 19:14 hello.c
    -rw-rw-r-- 1 paul paul 153 фев 15 19:15 Makefile
    

     

    28.6.3. Команда make

    В примере ниже представлен результат исполнения команды make.

     

    [root@rhel4a kernel_module]# make
    make -C /lib/modules/2.6.9-paul-2/build M=~/kernel_module modules
    make[1]: Entering dir... `/usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9'
    CC [M] /home/paul/kernel_module/hello.o
    Building modules, stage 2.
    MODPOST
    CC /home/paul/kernel_module/hello.mod.o
    LD [M] /home/paul/kernel_module/hello.ko
    make[1]: Leaving dir... `/usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9'
    [root@rhel4a kernel_module]#
    

     

    Теперь у нас больше файлов.

     

    [root@rhel4a kernel_module]# ll
    итого 172
    -rw-rw-r-- 1 paul paul 250 фев 15 19:14 hello.c
    -rw-r--r-- 1 root root 64475 фев 15 19:15 hello.ko
    -rw-r--r-- 1 root root 632 фев 15 19:15 hello.mod.c
    -rw-r--r-- 1 root root 37036 фев 15 19:15 hello.mod.o
    -rw-r--r-- 1 root root 28396 фев 15 19:15 hello.o
    -rw-rw-r-- 1 paul paul 153 фев 15 19:15 Makefile
    [root@rhel4a kernel_module]#
    

     

    28.6.4. Файл hello.ko

    Следует использовать утилиту modinfo для проверки того, действительно ли файл с расширением .ko является модулем ядра ОС.

     

    [root@rhel4a kernel_module]# modinfo hello.ko 
    filename: hello.ko
    vermagic: 2.6.9-paul-2 SMP 686 REGPARM 4KSTACKS gcc-3.4
    depends: 
    [root@rhel4a kernel_module]#
    

     

    Отлично, значит мы можем загрузить наш модуль ядра ОС с именем "hello".

     

    [root@rhel4a kernel_module]# lsmod | grep hello
    [root@rhel4a kernel_module]# insmod ./hello.ko
    [root@rhel4a kernel_module]# lsmod | grep hello
    hello 5504 0 
    [root@rhel4a kernel_module]# tail -1 /var/log/messages 
    Feb 15 19:16:07 rhel4a kernel: Инициализация модуля Hello World...
    [root@rhel4a kernel_module]# rmmod hello
    [root@rhel4a kernel_module]#
    

     

    Наконец мы можем обнаружить небольшой сюрприз в файле журнала /var/log/messages.

     

    [root@rhel4a kernel_module]# tail -2 /var/log/messages 
    Feb 15 19:16:07 rhel4a kernel: Инициализация модуля Hello World...
    Feb 15 19:16:35 rhel4a kernel: Завершение работы модуля Hello World... 
    [root@rhel4a kernel_module]#
    

     

    http://rus-linux.net/MyLDP/BOOKS/LSA/ch28.html

    Категория: Linux и не только | Просмотров: 611 | Добавил: laptop | Рейтинг: 0.0/0
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Волк слабее льва и тигра, но в цирке волк не выступает!
    Волк слабее льва и тигра, но в цирке волк не выступает!
    Волк - единственный из зверей, который может пойти в бой на более сильного противника.
    Если же он проиграл бой, то до последнего вздоха смотрит в глаза противника. После этого умирает...

    Праздники сегодня

    Поиск
    Календарь
    Архив записей
    Друзья сайта
  • Официальный блог
  • JEEP - the best! Mercedes - the best! Автомобильный портал города Бреста: технические характеристики с фото, авторынок, автоспорт...
    Наша кнопка
    IT новости с моего лаптопа...

    Внимание!
    Администратор сайта laptop.ucoz.ru не несет ответственности за содержание рекламных объявлений. Все используемые на сайте зарегистрированные товарные знаки принадлежат своим законным владельцам! Используемая со сторонних источников информация публикуется с обязательными ссылками на эти источники.
    Copyright Valeri N.Kravchuk © 2007-2024