Трюки в работе с ядром linux

Работа с ядром linuxСистемные вызовы syscalls

Узнать, какие системные вызовы доступны в данной системе можно командой:

man syscalls

Раздел про системные вызовы руководства для программистов linux можно открыть командой:

man 2 syscall

Как очистить кэш в памяти linux

Начиная с версии ядра linux 2.6.16, добавлен параметр /proc/sys/vm/drop_caches.

Для очистки pagecache выполняем:

echo 1 > /proc/sys/vm/drop_caches

Для очистки dentry и inode кэша:

echo 2 > /proc/sys/vm/drop_caches

Команда

echo 3 > /proc/sys/vm/drop_caches

Объединяет первые два варианта и очищает pagecachedentry и inode.

Для того, чтобы убедиться в освобождении памяти, можно воспользоваться командой sync.

Сообщения ядра oops

При программировании и отладке модулей ядра linux, иногда бывает необходимо узнать, какая секция кода вызывает oops-сообщения. Для этого предназначена команда ksymoops:

ksymoops -v vmlinux -m System.map

После того, как ksymoops стартовал, он ожидает oops-сообщения и выводит их в консоль:

>>EIP; 800d34a2 <assign_rx_buffers+27/74> <=======

Очевидно, что в данном случае, сообщение принадлежит сетевому модулю. Команда ksymoops позволяет получить и более подробную информацию, но об этом в следующий раз.

Постоянное именование устройств с udev

Рассмотрим вариант, когда корневая файловая система linux состоит из множества подсистем, включая несколько аналогичных сетевых карт на основе одного чипа и использующих один драйвер. Очевидно, что разные сетевые карты могут быть использованы различными сервисами. И для избежания путаницы, желательно закрепить имена интерфейсов eth1, eth2eth3 и так далее, за конкретными сетевыми картами.

Для назначения устройству постоянного имени нужно создать правило udev. Простой пример:

udevinfo -a -p /sys/class/net/eth3
KERNEL=="eth3"
SUBSYSTEM=="net"
DRIVER==""
ATTR{addr_len}=="4"
ATTR{iflink}=="2"
ATTR{ifindex}=="2"
ATTR{features}=="0x1"
ATTR{type}=="1"
ATTR{link_mode}=="1"
ATTR{address}=="2F:12:57:12:C5:BF"
...

Здесь для привязки имени использовано уникальное значение mac-адреса сетевого адаптера (строка ATTR{address}==»2F:12:57:12:C5:BF»). Однако, данный способ не всегда допустим, так как уникальный mac может отсутствовать.

Решение можно найти используя udevinfo:

looking at parent device '/devices/pci0000:00/0000:00:1a.0':
KERNELS=="0000:00:1a.0"
SUBSYSTEMS=="pci"
DRIVERS=="e100"

Как видно, сетевые устройства используют модуль один ядра e100, и разные идентификаторы шины pci. Правило будет простым. Первое устройство на шине pci, использующее модуль ядра e100 будет eth1, второе eth2 и третье vlan4:

KERNELS=="0000:00:1c.0", SUBSYSTEMS=="pci", \ DRIVERS=="e100", NAME="eth2"
KERNELS=="0000:00:1d.0", SUBSYSTEMS=="pci", \ DRIVERS=="e100", NAME="eth3"
KERNELS=="0000:00:0f.0", SUBSYSTEMS=="pci", \ DRIVERS=="e100", NAME="vlan0"

Данное правило нужно сохранить в файле /etc/udev/rules.d/z99custom.rules

Теперь можно проверить новые правила udev:

udevinfo -a -p /sys/class/net/eth1

Данные просты правила будут применены при следующем старте udev.

Важное замечание. Если уже существуют совпадающие правила в каталоге /etc/udev/rules.d, новые правила не будут применены, пока не будут удалены конфликтующие правила.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *