Введение в ethtool

May 25, 2011 By Jayson Broughton
in SysAdmin

Настала минута, когда мы можем воздать хвалу разработчикам свободного ПО. Вглядитесь в эти названия пакетов! Вам ни за что не догадаться, если вы обычный человек, что они делают: emacs, gimp, gcc, mutt, grub, kyle, rankin, parted, tar, vim. Интеллектуальный блеск движения свободного ПО, он же нищета. И вот нам в руки попадается пакет ethtool. Тададада! Он делает то, что означает его название: ethernet tool. Расскажу вам о нескольких возможностях утилиты, которые я изучил за последние десять дней.

В первую очередь определим, какой сетевой адаптер мы используем:


ifconfig

Обратите внимание, ethtool работает только с физическими адаптерами. Это означает, что bond0, tun0 и другие устройства, которые не являются физическими, с помощью ethtool ни просматривать, ни редактировать их параметры нельзя.

Теперь, когда девайс определен, повеселимся. Вы, конечно, знаете, что ядро Linux дает имена Ethernet-адаптерам в стиле ethX, где Х - номер по порядку начиная с 0.

Информация о драйвере и статистика
Знаю, знаю, начинать надо с полезных возможностей. Но вдруг кто-нибудь сочтет это полезным? Я кучу раз запрашивал информацию о драйверах в процессе работы над ошибками ядра, и пришел к выводу, что лучше запустить одну команду, которая дернет lsmod и узнает все о загруженном драйвере:


ethtool -i ethX

driver: r8169 
version: 2.3LK-NAPI 
firmware-version:
bus-info:0000:02:00.0 

Для отладки различных ситуаций с проблемами rx/tx нужна подробная статистика, она выводится с помощью следующей команды:


ethtool -S ethX
 
	NIC statistics:
     tx_packets: 148683 
     rx_packets: 179489 
     tx_errors: 0 
     rx_errors: 0 
     rx_missed: 0 
     align_errors: 0 
     tx_single_collisions: 0 
     tx_multi_collisions: 0 
     unicast: 116884 
     broadcast: 25361 
     multicast: 61674 
     tx_aborted: 0 
     tx_underrun: 0

Статистика, а также старый добрый tcpdump помогут вам в поиске сетевых проблем.

Последим за сетевой картой
Уверен, что с вами такое случалось, потому что такое множество раз случалось со мной. Имели когда-нибудь под управлением сервер, в котором больше одной сетевой карты? поднимите руку. Больше, чем две? поднимите две руки. Какая из двух карт помечена ядром как eth0? Сакраментальный вопрос. Конечно, можно идти кривым и длинным путем: получить MAC-адрес с помощью ifconfig, воткнуть все кабеля в управляемый свитч и затем сбросить таблицу ARP со свитча с целью поиска нужного. Или можно помигать светодиодом с помощью ethtool. Строка ethtool -p ethX [N] , где N - число секунд, в течение которых нужно мигать светодиодом на карточке, поможет нам в поиске соответствия имени и физического устройства. Команда


ethtool -p eth0 15

заставит мигать светодиод соответствующего интерфейса (eth0) 15 секунд.

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


ethtool -t ethX [offline|online] 

Следует иметь в виду, что какие-то адаптеры могут не поддерживать требований онлайнового или оффлайнового теста. В процессе написания этой заметки у меня нашлись как минимум четыре карточки, которые не поддерживали тесты во всей их полноте, но какая-то информация все равно поступала. Пример вывода предыдущей команды:


The test result is PASS 
The test extra info: 
nvram test     (online)          0 
link test      (online)          0 
register test  (offline)         0 
memory test    (offline)         0 
loopback test  (offline)         0 
interrupt test (offline)         0 

Изменим параметры работы сетевой карты
Если вы запустите ethtool без опций, увидите текущие установки, примерно так:


 Settings for eth0:
	Supported ports: [ TP MII ] 
	Supported link modes:   10baseT/Half
				10baseT/Full 100baseT/Half 100baseT/Full
				1000baseT/Half 1000baseT/Full
	Supports auto-negotiation: Yes 
	Advertised link modes:  10baseT/Half
				10baseT/Full 100baseT/Half 100baseT/Full
				1000baseT/Half 1000baseT/Full
	Advertised pause frame use: No 
	Advertised auto-negotiation: Yes Link
	partner advertised link modes:	10baseT/Half 10baseT/Full
                         	        100baseT/Half 100baseT/Full
	Link partner advertised pause frame use: No 
	Link partner advertised auto-negotiation: Yes 
	Speed: 100Mb/s Duplex: Full 
	Port: MII 
	PHYAD:0
	Transceiver: internal 
	Auto-negotiation: on 
	Supports Wake-on: pumbg
	Wake-on: g 
	Current message level: 0x00000033 (51) 
	Link detected: yes

Утилита выводит много букв, но если читать их строку за строкой, прочтем следующее:устройство поддерживает TP и MII, скорость до 1000baseT/Full. Текущие установки: 100Mb/s, Full Duplex, включен MII, физический адрес 0, включен Auto negotiation, WoL доступен и линк присутствует. Это в общем все, что нужно знать.

На рабочем девайсе я запускаю ethtool ethX с целью проверки доступных режимов работы и текущей скорости. Если текущая скорость выставлена низкой, а свитч поддерживает бОльшую скорость, я могу поправить установленную скорость вручную. ethtool -s ethX поможет мне изменить текущие установки. Все, что видно при вводе ethtool ethX, может быть изменено с помощью ethtool -s ethX. В данном случае мне потребуется что-то вроде


ethtool -S eth0 speed 1000 duplex full autoneg on

Странно, устройство должно поднимать auto-negotiation по умолчанию при старте, но у меня было выключено. Пришлось включить через команду.

Кроме этого можно еще установить Wake-On-Lan. Про Wake-On-Lan сегодня рассказывать не буду, об этой технологии есть подробная информация в моем блоге на www.jaysonbroughton.com.


UPD переводчика 1:
Для ознакомления со списком возможностей ethtool полезно прочитать вывод команды ethtool -h

ethtool version 3.16
Usage:
        ethtool DEVNAME	Display standard information about device
        ethtool -s|--change DEVNAME	Change generic options
		[ speed %d ]
		[ duplex half|full ]
		[ port tp|aui|bnc|mii|fibre ]
		[ mdix auto|on|off ]
		[ autoneg on|off ]
		[ advertise %x ]
		[ phyad %d ]
		[ xcvr internal|external ]
		[ wol p|u|m|b|a|g|s|d... ]
		[ sopass %x:%x:%x:%x:%x:%x ]
		[ msglvl %d | msglvl type on|off ... ]
        ethtool -a|--show-pause DEVNAME	Show pause options
        ethtool -A|--pause DEVNAME	Set pause options
		[ autoneg on|off ]
		[ rx on|off ]
		[ tx on|off ]
        ethtool -c|--show-coalesce DEVNAME	Show coalesce options
        ethtool -C|--coalesce DEVNAME	Set coalesce options
		[adaptive-rx on|off]
		[adaptive-tx on|off]
		[rx-usecs N]
		[rx-frames N]
		[rx-usecs-irq N]
		[rx-frames-irq N]
		[tx-usecs N]
		[tx-frames N]
		[tx-usecs-irq N]
		[tx-frames-irq N]
		[stats-block-usecs N]
		[pkt-rate-low N]
		[rx-usecs-low N]
		[rx-frames-low N]
		[tx-usecs-low N]
		[tx-frames-low N]
		[pkt-rate-high N]
		[rx-usecs-high N]
		[rx-frames-high N]
		[tx-usecs-high N]
		[tx-frames-high N]
		[sample-interval N]
        ethtool -g|--show-ring DEVNAME	Query RX/TX ring parameters
        ethtool -G|--set-ring DEVNAME	Set RX/TX ring parameters
		[ rx N ]
		[ rx-mini N ]
		[ rx-jumbo N ]
		[ tx N ]
        ethtool -k|--show-features|--show-offload DEVNAME	Get state of protocol offload and other features
        ethtool -K|--features|--offload DEVNAME	Set protocol offload and other features
		FEATURE on|off ...
        ethtool -i|--driver DEVNAME	Show driver information
        ethtool -d|--register-dump DEVNAME	Do a register dump
		[ raw on|off ]
		[ file FILENAME ]
        ethtool -e|--eeprom-dump DEVNAME	Do a EEPROM dump
		[ raw on|off ]
		[ offset N ]
		[ length N ]
        ethtool -E|--change-eeprom DEVNAME	Change bytes in device EEPROM
		[ magic N ]
		[ offset N ]
		[ length N ]
		[ value N ]
        ethtool -r|--negotiate DEVNAME	Restart N-WAY negotiation
        ethtool -p|--identify DEVNAME	Show visible port identification (e.g. blinking)
               [ TIME-IN-SECONDS ]
        ethtool -t|--test DEVNAME	Execute adapter self test
               [ online | offline | external_lb ]
        ethtool -S|--statistics DEVNAME	Show adapter statistics
        ethtool -n|-u|--show-nfc|--show-ntuple DEVNAME	Show Rx network flow classification options or rules
		[ rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 |
		  rule %d ]
        ethtool -N|-U|--config-nfc|--config-ntuple DEVNAME	Configure Rx network flow classification options or rules
		rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 m|v|t|s|d|f|n|r... |
		flow-type ether|ip4|tcp4|udp4|sctp4|ah4|esp4
			[ src %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
			[ dst %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
			[ proto %d [m %x] ]
			[ src-ip %d.%d.%d.%d [m %d.%d.%d.%d] ]
			[ dst-ip %d.%d.%d.%d [m %d.%d.%d.%d] ]
			[ tos %d [m %x] ]
			[ l4proto %d [m %x] ]
			[ src-port %d [m %x] ]
			[ dst-port %d [m %x] ]
			[ spi %d [m %x] ]
			[ vlan-etype %x [m %x] ]
			[ vlan %x [m %x] ]
			[ user-def %x [m %x] ]
			[ dst-mac %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
			[ action %d ]
			[ loc %d]] |
		delete %d
        ethtool -T|--show-time-stamping DEVNAME	Show time stamping capabilities
        ethtool -x|--show-rxfh-indir|--show-rxfh DEVNAME	Show Rx flow hash indirection and/or hash key
        ethtool -X|--set-rxfh-indir|--rxfh DEVNAME	Set Rx flow hash indirection and/or hash key
		[ equal N | weight W0 W1 ... ]
		[ hkey %x:%x:%x:%x:%x:.... ]
        ethtool -f|--flash DEVNAME	Flash firmware image from the specified file to a region on the device
               FILENAME [ REGION-NUMBER-TO-FLASH ]
        ethtool -P|--show-permaddr DEVNAME	Show permanent hardware address
        ethtool -w|--get-dump DEVNAME	Get dump flag, data
		[ data FILENAME ]
        ethtool -W|--set-dump DEVNAME	Set dump flag of the device
		N
        ethtool -l|--show-channels DEVNAME	Query Channels
        ethtool -L|--set-channels DEVNAME	Set Channels
               [ rx N ]
               [ tx N ]
               [ other N ]
               [ combined N ]
        ethtool --show-priv-flags DEVNAME	Query private flags
        ethtool --set-priv-flags DEVNAME	Set private flags
		FLAG on|off ...
        ethtool -m|--dump-module-eeprom|--module-info DEVNAME	Query/Decode Module EEPROM information and optical diagnostics if available
		[ raw on|off ]
		[ hex on|off ]
		[ offset N ]
		[ length N ]
        ethtool --show-eee DEVNAME	Show EEE settings
        ethtool --set-eee DEVNAME	Set EEE settings
		[ eee on|off ]
		[ advertise %x ]
		[ tx-lpi on|off ]
		[ tx-timer %d ]
        ethtool -h|--help 		Show this help
        ethtool --version 		Show version number



UPD переводчика 2:
Пример скрипта, выводящего количество полученных на интерфейс и отправленных с интерфейса пакетов за последнюю секунду. Отрабатывает каждую секунду до нажатия Cntrl+C. Время отработки всех команд внутри цикла примерно 12 миллисекунд.

#!/bin/bash

INTER="1"  # update interval in seconds


if [ -z "$1" ]; then
    echo
    echo "Usage: $0 [network-interface]"
    echo
    exit
fi

IFACE=$1

while true
do
    RX1=`ethtool -S $IFACE | grep rx_packet | cut -d":" -f2 | cut -d" " -f2`
    TX1=`ethtool -S $IFACE | grep tx_packet | cut -d":" -f2 | cut -d" " -f2`
    sleep $INTER
    RX2=`ethtool -S $IFACE | grep rx_packet | cut -d":" -f2 | cut -d" " -f2`
    TX2=`ethtool -S $IFACE | grep tx_packet | cut -d":" -f2 | cut -d" " -f2`
    RX=`expr $RX2 - $RX1`
    TX=`expr $TX2 - $TX1`
    echo "TX $1: $TX pps RX $1: $RX pps"
done



Назад в тематический каталог
Назад на страницу переводов из Linux Journal