ハンドブック:PPC/ネットワーク/高度
高度な設定
config_eth0変数は、インターフェースの設定の中心です。これはインターフェース(この場合eth0)を設定する高レベルの命令リストです。この命令リストの各コマンドは順に実行されます。少なくとも1つのコマンドが動作すれば、インターフェースはOKとみなします。
ビルドインの命令一覧です:
値 | 説明 |
---|---|
null
|
何もしません。 |
noop
|
もしインターフェースが起動していて、アドレスが存在するなら、設定を正常に中止します。 |
IPv4またはIPv6のアドレス | アドレスをインターフェースに追加します。 |
dhcp 、adsl またはapipa (あるいはサードパーティモジュールによるカスタム値)
|
コマンドを提供するモジュールを実行します。例えばdhcp は、dhcpcd、dhclientまたはpumpが提供できるDHCPを提供するモジュールを実行します。
|
コマンドが失敗する場合の fallback 値を設定してください。fallback は config の構造と正確に一致している必要があります。
これらの値を一緒に繋げることが可能です。これは実際の例です:
# 3つのIPv4アドレスを追加する
config_eth0="192.168.0.2/24
192.168.0.3/24
192.168.0.4/24"
# 1つのIPv4アドレスと2つのIPv6アドレスを追加する
config_eth0="192.168.0.2/24
4321:0:1:2:3:4:567:89ab
4321:0:1:2:3:4:567:89ac"
# インターフェースがダウンしDHCPを使用して新しいアドレスが設定されない限り、
# カーネルに設定されているアドレスを保持する。もしDHCPが失敗したら、APIPAに
# よって決定された静的アドレスを追加する。
config_eth0="noop
dhcp"
fallback_eth0="null
apipa"
ifconfig
モジュールを使用して複数のアドレスを追加するとき、それぞれの追加アドレスに対してインターフェースの別名が作成されます。上の 2 つの例では、eth0、eth0:1、eth0:2 のインターフェースが得られるでしょう。カーネルや他のプログラムは eth0:1 と eth0:2 を eth0 として扱うでしょうから、これらのインターフェースに対して何か特別なことを行うことはできません。フォールバックの順番は重要です!もしnullオプションが指定されなかったら、
noop
が失敗した時だけapipa
が実行されるでしょう。ネットワーク依存関係
/etc/init.d/ 内の init スクリプトは、特定のネットワークインターフェース、または単に "net" に依存することができます。Gentoo の init システム内のすべてのネットワークインターフェースは、"net" と呼ばれるものを提供します。
もし /etc/rc.conf 内で rc_depend_strict 変数が YES
に設定されている場合、"net" への依存関係が満たされたと見なされるためには、"net" を提供するすべてのネットワークインターフェースがアクティブでなくてはなりません。言い換えると、システムが net.eth0 と net.eth1 を持ち、ある init スクリプトが "net" に依存している場合、両方が有効でなくてはなりません。
一方、rc_depend_strict="NO"
が設定されていると、少なくともひとつのネットワークインターフェースが有効になった時点で、"net" 依存関係は解決されたものとしてマークされます。
しかし、net.br0 が net.eth0 と net.eth1 に依存している場合はどうでしょう? net.eth1 はブリッジに追加する前に構成を必要とする、無線デバイスや PPP デバイスであるかもしれません。/etc/init.d/net.br0 が net.lo へのシンボリックリンクである限り、その中では設定することができません。
これに対する答えは /etc/conf.d/net 内で rc_net_{interface}_need 設定を定義することです:
rc_net_br0_need="net.eth0 net.eth1"
しかし、これだけでは不十分です。Gentoo のネットワーク init スクリプトは、"net" と呼ばれる仮想依存を、ネットワークが利用可能になったときにシステムに通知するために使用します。上のケースでは明らかに、net.br0 が稼働しているときだけネットワークは利用可能としてマークされるべきで、他のネットワークインターフェースが稼働しているときではありません。そこで、/etc/conf.d/net にそのことも書く必要があります:
rc_net_eth0_provide="!net"
rc_net_eth1_provide="!net"
依存関係についてのさらに詳しい説明については、Gentoo ハンドブックの init スクリプトの編集についてのセクションを確認してください。/etc/rc.conf についてのさらなる情報は、当ファイル内にコメントとして書かれています。
変数名と値
変数の名前は動的に決まります。通常は、variable_${interface|mac|essid|apmac}
という構造に従います。例えば、dhcpcd_eth0 は eth0 のための dhcpcd のオプションの値を保持し、dhcpcd_essid は、あるインターフェースが "essid" という ESSID に接続するときの dhcpcd のオプションの値を保持します。
しかしながら、インターフェース名が ethx のような名前でなくてはならない確実なルールは存在しません。実際に、多くの無線インターフェースは ethx の他に、wlanx あるいは rax のような名前を持つことがあります。さらに、ブリッジなどの一部のユーザー定義インターフェースは、好きな名前を付けられます。さらに愉快なことに、無線アクセスポイントは半角英数以外の文字の文字を含むことができます。これはユーザが ESSID ごとのネットワークパラメータを設定するときに重要です。
これの何が問題かというと、Gentoo がネットワークのために bash 変数を利用していて、bash は半角英数以外の文字を使えないということです。この制限を回避するために、私たちは非半角英数の文字をすべて _ (アンダースコア) 文字に置き換えます。
bash のもうひとつの問題は、変数の値です。一部の文字をエスケープする必要があります。これは、エスケープする必要がある文字の前に \ (バックスラッシュ) 文字を置くことで行えます。エスケープする必要がある文字は、"、'、そして \ です。
次の例では、利用できる文字の最大範囲を含む無線 ESSID を使用します。私たちは ESSID My "\ NET を使用します:
# 動作しますが、ドメインは無効です
dns_domain_My____NET="My \"\\ NET"
上の例は、ESSID が My "\ NET であるアクセスポイントに無線カードが接続しているときに、DNS ドメインを My "\ NET に設定します。
ネットワークインターフェースの命名
動作の仕組み
ネットワークインターフェースの名前は任意に選択されます: Linux カーネルとデバイスマネージャ (多くのシステムではデバイスマネージャとして udev を使用しますが、他も利用可能です) が、一定のルールに基づいてインターフェース名を選択します。
インターフェースカードがシステムで検出されたとき、Linux カーネルはこのカードについての必要なデータを収集します。これには以下が含まれます:
- ネットワークカードのオンボードの (機器自体に設定された) 登録名。後で ID_NET_NAME_ONBOARD の値を通じて確認できます。
- ネットワークカードが接続されたスロット。後で ID_NET_NAME_SLOT の値を通じて確認できます。
- ネットワークカードデバイスにアクセスするためのパス。後で ID_NET_NAME_PATH の値を通じて確認できます。
- カードの (ベンダによって設定された) MAC アドレス。後で ID_NET_NAME_MAC の値を通じて確認できます。
この情報に基づき、デバイスマネージャはそのインターフェースをシステム上でどう命名するか決定します。デフォルトでは、上の変数のうち最初の 3 つ(ID_NET_NAME_ONBOARD, _SLOT or _PATH) のうち最初にヒットしたものを使用します。例えば、ID_NET_NAME_ONBOARD が見つかり、 eno1
に設定されていれば、そのインターフェースは eno1 と呼ばれるでしょう。
アクティブなインターフェースの名前が与えられたとき、提供された変数の値は udevadm を使って確認することができます:
root #
udevadm test-builtin net_id /sys/class/net/enp3s0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76 ID_OUI_FROM_DATABASE=Quanta Computer Inc. ID_NET_NAME_PATH=enp3s0
上の 3 つの変数のうちの最初に (この場合は唯一の) ヒットした変数は ID_NET_NAME_PATH で、この値がインターフェース名として使用されます。3 変数がすべて値を持ってないない場合は、システムはカーネルが提供する名前 (eth0、eth1 等) に回帰します。
伝統的なカーネル命名法を使う
この変更がされる以前は、ネットワークインターフェースカードは Linux カーネルによって、ドライバが読み込まれる順番に応じて (比較的はっきりしない理由で) 命名されていました。この挙動は、ブートローダで net.ifnames=0
ブートパラメータを設定することで今でも有効化することができます。
カスタムの名前を使う
命名法の変更の背景にあったアイデアは、ユーザを混乱させることではなく、簡単に名前を変更できるようにすることでした。システムに 2 個のインターフェースがあり、上の命名法が無ければ eth0 そして eth1 と呼ばれていた状況を想定してください。片方は有線によってネットワークにアクセスし、他方は無線アクセスです。インターフェース命名法のサポートがあると、ユーザはこれらを lan0 (有線) と wifi0 (無線) という名前で呼ばせることができます。eth* や wlan* 等の、以前のよく知られた名前は、提案される名前と衝突する可能性が今もあるので、使用を避けるのが最善です。
独自の命名ルールを設定するには、カードに対するパラメータの値を確認して、この情報を使用してください:
root #
udevadm test-builtin net_id /sys/class/net/eth0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76 ID_OUI_FROM_DATABASE=Quanta Computer Inc.
root #
vim /etc/udev/rules.d/70-net-name-use-custom.rules
# First one uses MAC information, and 70- number to be before other net rules SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="c8:0a:a9:42:9d:76", NAME="lan0"
root #
vim /etc/udev/rules.d/76-net-name-use-custom.rules
# Second one uses ID_NET_NAME_PATH information, and 76- number to be between # 75-net-*.rules and 80-net-*.rules SUBSYSTEM=="net", ACTION=="add", ENV{ID_NET_NAME_PATH}=="enp3s0", NAME="wifi0"
ルールはデフォルトのものより先に適用される (ルールは英数字順に適用され、70 は 80 より先に来る) ので、デフォルトの名前ではなくルールファイルで指定された名前が使用されます。ファイルに許可されている数字は 76 から 79 までの間です (75 で始まるルールで環境変数が設定され、80 で始まるルールでフォールバックの命名が行われます)。