はじめに
このラボでは、Linux 環境でネットワークインターフェイスの設定を調査および管理するために ethtool コマンドラインユーティリティを使用する方法を学びます。まず、ツールのインストールとプライマリネットワークインターフェイスの特定から始めます。その後、現在のインターフェイスの速度とデュプレックスモードの表示、これらのパラメータを 10Mbps 半二重などの特定の構成に手動で設定し、その後インターフェイスをデフォルトの自動ネゴシエーション状態に戻す練習を行います。
これらのステップを完了することで、物理層のネットワーク問題の診断に関する実践的なスキルを習得できます。ラボの最後には、ネットワークカードがサポートするリンクモードを分析する方法を学びます。これは、ネットワークデバイス間の速度またはデュプレックスの不一致によって引き起こされる潜在的なパフォーマンス問題のトラブルシューティングに不可欠です。
ethtool のインストールとネットワークインターフェイスの特定
このステップでは、ネットワークインターフェイスコントローラーのパラメータの調査と変更に不可欠なコマンドラインユーティリティである ethtool のインストールから始めます。ツールが利用可能であることを確認した後、システム上のプライマリネットワークインターフェイスの名前を特定する方法を学びます。これは、それ以降のネットワーク分析の前提条件となります。
まず、パッケージリストを更新し、ethtool をインストールします。新しいパッケージをインストールする前に apt update を実行することは、リポジトリから利用可能な最新バージョンを取得することを確実にするための良い習慣です。
ターミナルを開きます。これは既に ~/project ディレクトリで開かれているはずです。以下のコマンドを実行します。
sudo apt update
sudo apt install ethtool -y
-y フラグは、インストールプロンプトに自動的に「yes」と応答するため、プロセスを非対話的にします。パッケージリストが読み取られ、ethtool がインストールされていることを示す出力が表示されるはずです。
ethtool がインストールされたので、調査したいネットワークインターフェイスを特定する必要があります。システムには、ループバックインターフェイス (lo)、有線イーサネットインターフェイス (eth0 または enp0s3) など、複数のインターフェイスが存在する場合があります。ip コマンドは、ネットワークデバイス、アドレス、およびルートを表示および操作するための最新の標準です。
すべてのネットワークインターフェイスとその設定を一覧表示するには、ip a コマンド(ip addr の短縮形)を使用します。
ip a
すべてのネットワークインターフェイスのリストが表示されます。lo(ループバックインターフェイス)ではなく、状態が UP のインターフェイスを探してください。これは通常、プライマリネットワーク接続です。名前は通常 eth0 または enp で始まる名前です。
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:01:b1:ae brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
inet 172.16.50.232/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
valid_lft 1892159922sec preferred_lft 1892159922sec
inet6 fe80::216:3eff:fe01:b1ae/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:da:5e:55:d4 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
上記の出力例から、プライマリネットワークインターフェイスの名前は eth0 です。docker0 のような他のインターフェイスも表示される場合がありますが、この実験では eth0 に焦点を当てます。次のステップで必要になるため、インターフェイス名をメモしておいてください。これで、必要なツールを正常にインストールし、ターゲットのネットワークインターフェイスを特定しました。
ethtool で現在のインターフェイス速度とデュプレックスを表示する
このステップでは、先ほどインストールした ethtool ユーティリティを使用して、ネットワークインターフェイスの現在の動作状態を調べます。具体的には、速度 (Speed) と デュプレックス (Duplex) という 2 つの重要なパラメータに焦点を当てます。
ネットワークインターフェイスカード (NIC) は、特定の速度 (例:10 Mbps、100 Mbps、1000 Mbps) で、次の 2 つのデュプレックスモードのいずれかで動作します。
- 半二重 (Half-duplex): インターフェイスは、一度にデータの送信または受信のみが可能であり、両方を同時に行うことはできません。
- 全二重 (Full-duplex): インターフェイスは、データを同時に送受信できるため、スループットが大幅に向上します。
現代のネットワークでは、自動ネゴシエーション (auto-negotiation) と呼ばれるプロセスがほぼ常に使用されています。これにより、NIC と接続されているネットワークデバイス (スイッチなど) が自動的に通信し、両方がサポートする最も高い速度とデュプレックスモードを決定します。
それでは、前のステップで特定したネットワークインターフェイスのこれらの設定を表示しましょう (例として eth0 を使用します)。ターミナルで次のコマンドを実行します。インターフェイス名が異なる場合は、実際のインターフェイス名に eth0 を置き換えることを忘れないでください。
ethtool eth0
Enter を押すと、インターフェイスに関する詳細情報が表示されます。一部の仮想環境では、「Not reported」または「Unknown」という値が多く表示される場合があります。これは、仮想ネットワークインターフェイスの機能が制限されていることを示しています。このラボ環境では正常な動作です。
Settings for eth0:
Supported ports: [ ]
Supported link modes: Not reported
Supported pause frame use: No
Supports auto-negotiation: No
Supported FEC modes: Not reported
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Advertised FEC modes: Not reported
Speed: Unknown!
Duplex: Unknown! (255)
Auto-negotiation: off
Port: Other
PHYAD: 0
Transceiver: internal
netlink error: Operation not permitted
Link detected: yes
出力を注意深く観察してください。このステップの重要な行は次のとおりです。
Speed: Unknown!: 現在の速度はドライバーによって報告されていません。Duplex: Unknown! (255): デュプレックスモードも報告されていません。Auto-negotiation: off: これは重要です。インターフェイスが自動ネゴシエーションに設定されていないことを示しています。そのため、次のステップで速度とデュプレックスを手動で設定できるようになります。netlink error: Operation not permitted: このエラーは、権限が制限されているコンテナ化された環境または仮想環境でよく発生します。このエラーは、ラボの完了を妨げるものではありません。
Link detected: yes の行は、ネットワークへの物理的な接続がアクティブであることを確認します。これらの設定は、物理層 (レイヤー 1) の動作方法の基本となります。
インターフェイス速度を 10Mbps 半二重に手動設定する
このステップでは、自動ネゴシエーションされた設定を上書きする方法を学びます。自動ネゴシエーションは現代のネットワークの標準ですが、古いレガシーハードウェアへの接続や特定のリンク問題のトラブルシューティングなど、まれな状況では、特定の速度とデュプレックスモードを強制する必要がある場合があります。
重要事項: これらのパラメータを手動で設定すると、正しく行われない場合にネットワーク接続の問題が発生する可能性があります。ケーブルの反対側にあるデバイス (スイッチポートなど) と一致しない設定を強制すると、デュプレックスミスマッチが発生し、ネットワークパフォーマンスが著しく低下したり、リンクが完全に失敗したりする可能性があります。この仮想環境では、変更を試みることは安全です。
設定を変更するには、-s フラグ (「settings」の略) を使用して ethtool コマンドを使用します。この操作には管理者権限が必要なため、sudo を使用する必要があります。
インターフェイス速度を 10 Mbps に、デュプレックスモードを半二重に設定してみましょう。インターフェイス名が異なる場合は、eth0 をご自身のインターフェイス名に置き換えることを忘れないでください。
sudo ethtool -s eth0 speed 10 duplex half
このコマンドは、成功した場合、何も出力しません。変更が適用されたことを確認するには、前のステップのコマンドを使用してインターフェイス設定を再度確認する必要があります。
ethtool eth0
次に、出力を調べます。「Speed」と「Duplex」の行を探してください。初期のエラーが発生した場合でも、速度とデュプレックスを設定するコマンドが成功したことがわかります。
Settings for eth0:
Supported ports: [ ]
Supported link modes: Not reported
Supported pause frame use: No
Supports auto-negotiation: No
Supported FEC modes: Not reported
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Advertised FEC modes: Not reported
Speed: 10Mb/s
Duplex: Half
Auto-negotiation: off
Port: Other
PHYAD: 0
Transceiver: internal
netlink error: Operation not permitted
Link detected: yes
Speed: 10Mb/s と Duplex: Half が表示されるはずです。また、パラメータを手動で設定したため、Auto-negotiation が引き続き off であることにも注意してください。これにより、ネットワークインターフェイス設定を正常に変更できることが確認できます。
ethtool -k でオフロード機能を表示・変更する
このステップでは、ネットワークオフロード機能の検査と変更方法を学びます。これらは、チェックサムの計算やデータのセグメンテーションなど、本来 CPU が処理するタスクをハードウェアに実行させる高度な NIC 機能です。これらのタスクをオフロードすることで、ネットワークパフォーマンスを向上させることができます。
まず、-k (または --show-features) フラグを使用して、インターフェイスの現在のオフロード設定を表示しましょう。
ethtool -k eth0
on と off の両方の機能のリストが表示されます。[fixed] というステータスは、その設定がユーザーによって変更できないことを意味します。
Features for eth0:
rx-checksumming: on [fixed]
tx-checksumming: on
tx-checksum-ipv4: off [fixed]
tx-checksum-ip-generic: on
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
scatter-gather: on
tx-scatter-gather: on
tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: on
tx-tcp-segmentation: on
tx-tcp-ecn-segmentation: on
tx-tcp-mangleid-segmentation: off
tx-tcp6-segmentation: on
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off [fixed]
... (出力は長く、変動する可能性があります)
次に、これらの設定の 1 つを変更する練習をしましょう。TX チェックサムを一時的に無効にします。この操作には管理者権限が必要なため、sudo と -K (または --features) フラグを使用する必要があります。
sudo ethtool -K eth0 tx-checksumming off
コマンドは、行った変更を報告します。tx-checksumming を無効にすると、他の関連機能も自動的に無効になったことに注意してください。これは、一部の機能が他の機能に依存しているためです。
Actual changes:
tx-checksum-ip-generic: off
tx-tcp-segmentation: off [not requested]
tx-tcp-ecn-segmentation: off [not requested]
tx-tcp6-segmentation: off [not requested]
完全なリストで変更を確認するには、再度 ethtool -k eth0 を実行できます。
次に、デフォルトのパフォーマンス向上動作に戻すために、再度有効にしましょう。
sudo ethtool -K eth0 tx-checksumming on
ここでも、出力は実際に行われた変更を示しています。機能が on であることを要求しても、ハードウェアで固定されている場合は off のままになる場合があります。また、関連機能が自動的に再有効化されていることも示しています。
Actual changes:
tx-checksum-ipv4: off [requested on]
tx-checksum-ip-generic: on
tx-checksum-ipv6: off [requested on]
tx-tcp-segmentation: on [not requested]
tx-tcp-ecn-segmentation: on [not requested]
tx-tcp6-segmentation: on [not requested]
tx-checksum-fcoe-crc: off [requested on]
tx-checksum-sctp: off [requested on]
このステップを完了することで、ネットワークカードのハードウェアオフロード機能を検査および変更する方法を学び、機能の依存関係とハードウェアの制限が結果にどのように影響するかを確認しました。
ethtool -S でインターフェイス統計情報を確認する
この最後のステップでは、ネットワークインターフェイスの詳細な統計情報を表示する方法を学びます。これは、日常的なネットワークトラブルシューティングで ethtool を使用する最も一般的な用途の 1 つです。このツールは、送信および受信したパケット数、バイト数、そしておそらく最も重要なエラー数を含む、豊富な情報を提供します。
これらの統計情報を表示するには、-S (または --statistics) フラグを使用します。インターフェイス名を eth0 に置き換えることを忘れないでください。
ethtool -S eth0
出力は長いカウンターのリストになります。この環境では、NIC は複数のキューを使用しているため、統計情報はキューごとに報告されます。rx_queue_ および tx_queue_ のパケットカウンターに焦点を当てましょう。
NIC statistics:
rx_queue_0_packets: 63768
rx_queue_0_bytes: 93307801
...
rx_queue_1_packets: 77180
rx_queue_1_bytes: 111222183
...
tx_queue_0_packets: 14363
tx_queue_0_bytes: 4229599
...
tx_queue_1_packets: 5287
tx_queue_1_bytes: 1262219
... (他の多くの統計情報)
注:あなたの数値は、インターフェイスが起動してからのすべてのトラフィックを反映しているため、異なります。
次に、これらのカウンターが変化するのを確認するために、ネットワークトラフィックを生成しましょう。ping コマンドを使用して、ループバックアドレス (127.0.0.1)、つまりローカルマシン自体にいくつかのパケットを送信します。-c 4 フラグは、ping に正確に 4 つのパケットを送信するように指示します。
ping -c 4 127.0.0.1
4 つのパケットが送受信されていることを示す出力が表示されます。
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.039 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.037 ms
--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3052ms
rtt min/avg/max/mdev = 0.037/0.038/0.040/0.001 ms
トラフィックを生成したので、統計情報を再度確認しましょう。
ethtool -S eth0
rx_queue_*_packets および tx_queue_*_packets の値を再度確認してください。
NIC statistics:
rx_queue_0_packets: 63879
...
rx_queue_1_packets: 77227
...
tx_queue_0_packets: 14460
...
tx_queue_1_packets: 5328
... (他の多くの統計情報)
受信キューと送信キューの合計パケット数が増加したことがわかるはずです。バックグラウンドのシステムアクティビティにより、増加数は ping コマンドの 4 パケットよりも多くなる可能性がありますが、この変更はインターフェイスがデータを正しく送受信していることを確認します。これは、リンクの状態を確認するための基本的なテクニックです。問題のトラブルシューティング中にエラーカウンターが増加しているのを見た場合、それは問題の明確な兆候となります。
まとめ
この実験では、Linux の ethtool ユーティリティを使用してネットワークインターフェイス設定を管理する方法を学びました。まず ethtool パッケージをインストールし、ip a コマンドでプライマリネットワークインターフェイス名を確認しました。その後、ethtool を使用してインターフェイスの現在の動作パラメータを調べ、速度とデュプレックスモードを手動で設定しました。
次に、より高度な機能を探求しました。-k および -K フラグを使用して、tx-checksumming のようなハードウェアオフロード設定を表示および変更する方法を学びました。最後に、ethtool -S で詳細なインターフェイス統計情報を検査する方法と、ping でそれらの統計情報がリアルタイムで変化するのを確認する方法を学び、リンクの状態を確認し接続の問題をトラブルシューティングするための実践的な方法を提供しました。



