Системные вызовы 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
Объединяет первые два варианта и очищает pagecache, dentry и 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, eth2, eth3 и так далее, за конкретными сетевыми картами.
Для назначения устройству постоянного имени нужно создать правило 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, новые правила не будут применены, пока не будут удалены конфликтующие правила.