GNU/Linux >> Linux の 問題 >  >> Linux

systemd-udevdを使用してLinuxで接続されたハードウェアを管理する

Linuxは、無数のベンダーから接続されたハードウェアデバイスを自動的に認識、ロード、および公開するという優れた機能を果たします。実際、何年も前に、私の雇用主がインフラストラクチャ全体をLinuxに変換することを主張するように私を説得したのはこの機能でした。問題点は、レドモンドの特定の会社が、Linuxが簡単にロードできるのに、Compaqデスクトップに統合ネットワークカードのドライバーをロードできなかった方法でした。

それ以来、Linuxの認識されたデバイスのライブラリは、プロセスの高度化とともに非常に大きくなりました。そして、そのショーのスターはudevです。 Udevの仕事は、デバイスの状態の変更を含むLinuxカーネルからのイベントをリッスンすることです。プラグを差し込んだり引き出したりした新しいUSBデバイスの場合もあれば、こぼれたコーヒーに溺れてオフラインになったワイヤレスマウスの場合もあります。

Udevの仕事は、たとえば、デバイスにアクセスするための名前やアクセス許可を割り当てることによって、すべての状態の変化を処理することです。これらの変更の記録には、dmesgからアクセスできます。 dmesgは通常、何千ものエントリを吐き出すため、結果をフィルタリングするのが賢明です。次の例は、LinuxがWiFiインターフェースを識別する方法を示しています。ワイヤレスデバイスが使用しているチップセットを示しています( ath9k )、プロセスの早い段階で割り当てられた元の名前( wlan0 )、および現在使用されている大きくて醜い永続的な名前( wlxec086b1ef0b3 ):

$ dmesg | grep wlan
[    5.396874] ath9k_htc 1-3:1.0 wlxec086b1ef0b3: renamed from wlan0

この記事では、なぜ誰かがそのような名前を使用したいかについて説明します。その過程で、udev構成ファイルの構造を調べてから、システムがデバイスに名前を付ける方法を編集する方法など、udev設定を変更する方法を示します。この記事は、私の新しいコースであるLinuxシステム最適化のモジュールに基づいています。

udev構成システムについて

systemdマシンでは、udev操作は systemd-udevdによって管理されます デーモン。 systemctl status systemd-udevd を使用して、通常のsystemdの方法でudevデーモンのステータスを確認できます。 。

その他のLinuxリソース

  • Linuxコマンドのチートシート
  • 高度なLinuxコマンドのチートシート
  • 無料のオンラインコース:RHELの技術概要
  • Linuxネットワーキングのチートシート
  • SELinuxチートシート
  • Linuxの一般的なコマンドのチートシート
  • Linuxコンテナとは何ですか?
  • 最新のLinux記事

技術的には、udevは、受信した各システムイベントを、 /lib/udev/rules.d/のいずれかにあるルールのセットと照合しようとすることで機能します。 または/etc/udev/rules.d/ ディレクトリ。ルールファイルには、一致キーと割り当てキーが含まれています。使用可能な一致キーのセットには、アクションが含まれます 、名前 、およびサブシステム 。これは、指定されたサブシステムの一部である指定された名前のデバイスが検出された場合、事前設定された構成が割り当てられることを意味します。

次に、「割り当て」キーと値のペアを使用して、目的の構成を適用します。たとえば、デバイスに新しい名前を割り当てたり、ファイルシステムのシンボリックリンクに関連付けたり、特定の所有者またはグループへのアクセスを制限したりできます。これが私のワークステーションからのそのようなルールからの抜粋です:

$ cat /lib/udev/rules.d/73-usb-net-by-mac.rules
# Use MAC based names for network interfaces which are directly or indirectly
# on USB and have an universally administered (stable) MAC address (second bit
# is 0). Don't do this when ifnames is disabled via kernel command line or
# customizing/disabling 99-default.link (or previously 80-net-setup-link.rules).

IMPORT{cmdline}="net.ifnames"
ENV{net.ifnames}=="0", GOTO="usb_net_by_mac_end"

ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb", NAME=="", \
    ATTR{address}=="?[014589cd]:*", \
    TEST!="/etc/udev/rules.d/80-net-setup-link.rules", \
    TEST!="/etc/systemd/network/99-default.link", \
    IMPORT{builtin}="net_id", NAME="$env{ID_NET_NAME_MAC}"

追加 アクションは、ネットワークサブシステムの一部である新しいデバイスが接続されるたびに起動するようにudevに指示します USBデバイスです。また、正しく理解できれば、デバイスが特定の範囲内の文字で構成されるMACアドレスを持っている場合にのみ、さらに80-net-setup-link.rules および99-default.link ファイルはしません 存在します。

これらの条件がすべて満たされていると仮定すると、インターフェイスIDはデバイスのMACアドレスと一致するように変更されます。インターフェイス名がwlan0からどのように変更されたかを示す前のdmesgエントリを思い出してください。 その厄介なwlxec086b1ef0b3 名前?これは、このルールの実行の結果でした。どうすればわかりますか? ec:08:6b:1e:f0:b3 デバイスのMACアドレス(コロンを除く):

$ ifconfig -a
wlxec086b1ef0b3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.103  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::7484:3120:c6a3:e3d1  prefixlen 64  scopeid 0x20<link>
        ether ec:08:6b:1e:f0:b3  txqueuelen 1000  (Ethernet)
        RX packets 682098  bytes 714517869 (714.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 472448  bytes 201773965 (201.7 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

このudevルールは、Linux内にデフォルトで存在します。自分で書く必要はありませんでした。しかし、なぜわざわざ—特にそのようなインターフェース指定で作業することがどれほど難しいかを見るのですか?ルールに含まれているコメントをもう一度見てください:

# Use MAC based names for network interfaces which are directly or indirectly
# on USB and have an universally administered (stable) MAC address (second bit
# is 0). Don't do this when ifnames is disabled via kernel command line or
# customizing/disabling 99-default.link (or previously 80-net-setup-link.rules).

このルールがUSBベースのネットワークインターフェイス用に特別に設計されていることに注意してください。 PCIネットワークインターフェイスカード(NIC)とは異なり、USBデバイスは時々取り外されて交換される可能性があります。これは、IDが変更されないという保証がないことを意味します。 wlan0である可能性があります ある日、 wlan3 次。アプリケーションの混乱を避けるために、デバイスに絶対IDを割り当てます(USBインターフェースに与えられたものなど)。

udev設定の操作

次のトリックでは、VirtualBox仮想マシンのイーサネットネットワークインターフェイスのMACアドレスと現在のIDを取得し、その情報を使用して、インターフェイスIDを変更する新しいudevルールを作成します。なんで?まあ、おそらく私はコマンドラインからデバイスを操作することを計画していて、その長い名前を入力しなければならないのは面倒かもしれません。これがどのように機能するかです。

IDを変更する前に、Netplanの現在のネットワーク構成を無効にする必要があります。これにより、Linuxは新しい構成に注意を払う必要があります。これが、 / etc / netplan /にある現在のネットワークインターフェイス構成ファイルです。 ディレクトリ:

$ less /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp0s3:
            addresses: []
            dhcp4: true
    version: 2

50-cloud-init.yaml ファイルには、非常に基本的なインターフェイス定義が含まれています。ただし、コメントには構成の無効化に関する重要な情報も含まれています。そのために、/etc/cloud/cloud.cfg.dに移動します ディレクトリを作成し、 99-disable-network-config.cfgという名前の新しいファイルを作成します ネットワーク:{config:disabled}を追加します 文字列。

Ubuntu以外のディストリビューションでこのメソッドをテストしたことはありませんが、systemdを使用するLinuxのすべてのフレーバー(ほぼすべて)で機能するはずです。使用しているものが何であれ、udev構成ファイルの作成とテストをよく見ることができます。

次に、いくつかのシステム情報を収集する必要があります。 ipの実行 コマンドは、私のイーサネットインターフェースが enp0s3と呼ばれていることを報告します そのMACアドレスは08:00:27:1d:28:10

$ ip a
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:1d:28:10 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.115/24 brd 192.168.0.255 scope global dynamic enp0s3

次に、 peristent-net.rulesという新しいファイルを作成します。 /etc/udev/rules.dにあります ディレクトリ。ファイルに10という低い数字で始まる名前を付けます:

$ cat /etc/udev/rules.d/10-persistent-network.rules
ACTION=="add", SUBSYSTEM=="net",ATTR{address}=="08:00:27:1d:28:10",NAME="eth3"

数値が小さいほど、早い段階でLinuxがファイルを実行するので、これを早く実行したいと思います。このファイルには、 eth3という名前を付けるコードが含まれています 追加されたときにネットワークデバイスに送信されます—アドレスが 08:00:27:1d:28:10と一致する場合 、これは私のインターフェースのMACアドレスです。

ファイルを保存してマシンを再起動すると、新しいインターフェイス名が機能するはずです。仮想マシンに直接ログインして、 dhclientを使用する必要がある場合があります Linuxにこの新しく名前が付けられたネットワーク上のIPアドレスを要求するように手動で取得します。 SSHセッションを開くには、最初にそれを行わないと不可能な場合があります:

$ sudo dhclient eth3

終わり。これで、udevに、コンピューターがNICを希望どおりに参照するように強制できるようになりました。しかし、もっと重要なのは、任意のを管理する方法を理解するためのツールがあることです。 誤動作しているデバイス。


Linux
  1. Linuxでlspciを使用して、ハードウェアを確認します

  2. procps-ngを使用してターミナルでLinuxシステムを監視します

  3. LynisでLinuxセキュリティをスキャンする

  1. Jukを使用してLinuxでお気に入りの音楽を聴く

  2. ハードウェア情報を表示するためのLinuxコマンド

  3. Linuxでfdiskを使用してパーティションを管理する

  1. Linuxでjconsoleを使用してJavaを監視する

  2. CheckmkでLinuxサーバーを監視する

  3. LinuxでChromebookの隠れた可能性を解き放つ