RHEL のネットワーク設定での ifcfg-rh から keyfile への移行

Red Hat コンサルタントの菅原です。こちらでの投稿は2回目です。

前回と比べると今回は小ネタといって良いと思いますが、RHEL で長年ネットワーク設定ファイルとして使われてきた ifcfg-rh 形式から NetworkManager ネイティブである keyfile 形式への、設定ファイルフォーマットの移行についてお話ししたいと思います。

ifcfg-rh 形式

古くから RHEL や RHEL 互換 OS (CentOS Linux 等) をお使いのユーザーにはおなじみの、/etc/sysconfig/network-scripts に保存される ifcfg-XXX (XXX の部分はデバイス名) というテキストファイルです。 例えばこんなものです。

TYPE="Ethernet"
NAME="em1"
DEVICE="em1"
ONBOOT="yes"
BOOTPROTO="static"
DEFROUTE="yes"
IPADDR="192.168.1.11"
PREFIX="24"
GATEWAY="192.168.1.254"
DNS1="192.168.1.1"
DELAY=0

RHEL に NetworkManager が含まれるようになったのが RHEL 6 の頃でしたっけ、などと思ってカスタマーポータルで確認したら、2005 年にリリースされた RHEL 4 に既に NetworkManager RPM が同梱されていてちょっと驚いてしまったのですが、それから20年近く経った現在でも広く使われている、initscripts 由来のファイル形式が ifcfg-rh です。NetworkManager が同梱されるようになってから20年近く経過したとはいえ、現在主力の RHEL 8 でもデフォルトのネットワーク設定ファイル形式は依然として ifcfg-rh です。また、最新の RHEL 9 でも /etc/sysconfig/network-scripts/ に ifcfg-rh 形式で保存した NIC 設定はサポートされています(非推奨ではありますが)。

keyfile 形式

NetworkManager のネイティブな設定ファイル形式がこちらの keyfile 形式となります。一般的には「INI ファイル」と書いたほうが通りが良いかも知れません。参考文献[1]がマニュアルで、記述の仕方など詳しく解説されています。RHEL 9 から、ついにこちらの形式がデフォルトのネットワーク設定ファイル形式に変更されており、保存場所も従来の場所から /etc/NetworkManager/system-connections/ に変更されています。

例えばこんな内容になります。

[connection]
id=Main eth0
uuid=27afa607-ee36-43f0-b8c3-9d245cdc4bb3
type=802-3-ethernet
autoconnect=true

[ipv4]
method=auto

[802-3-ethernet]
mac-address=00:23:5a:47:1f:71

なお、ここでの「デフォルトのネットワーク設定ファイル形式」というのは、nmcli コマンド等、NetworkManager を使って NIC を設定したときに保存される設定ファイルの形式のことです。設定ファイルを直接作成する(例えば vim で書くなどの)際には、当然ですがファイルの保存場所に応じたファイル形式を利用します。前節でも触れましたが、RHEL 9 までは ifcfg-rh 形式もサポートされますので、従来からの ifcfg-rh 設定ファイルは /etc/sysconfig/network-scripts/ に保存すれば、従来通りに動きます(参考文献[2][3])

RHEL 9 での変更点

前述したデフォルトの設定ファイル形式以外にも、ネットワーク周りの大きな変更点として、RHEL 9 では network-scripts RPM が廃止されました(参考文献[4][5])ので、ifup や ifdown といったおなじみのコマンドは使えません。nmcli コマンドなどを利用してください。

例えば nmcli con upifup として alias を定義したり、シェルスクリプト等で ifup・ifdown を実装したりすることを止める権利は誰にもありませんので、運用手順の連続性を図ることは不可能ではありません。しかし、そうした手順は厳密には製品のサポート範囲から外れますので、例えばネットワークの初期化で何らかの問題が発生してサポートに問い合わせを行ったときに、RHEL 9 に存在しない ifup などを使っていると、RHEL 9 でサポートされる方式(例えば nmcli con up)でネットワークの初期化を行って同じ問題を再現できるかどうかを確認するように求められるなど、余分なトランザクションが必要になる可能性もあります。

また、RHEL 9 以降では network-scripts が廃止されてネットワーク管理には NetworkManager を利用する以外の選択肢はなくなりました。これは RHEL に限った話ではなく、他の Linux ディストリビューションでも同様だと思います。NetworkManager を利用する他ないのであれば、NetworkManager ネイティブなファイル形式とコマンドを使って全機能を活用いただくことが、長い目で見れば一番良いのではと考えています。

RHEL 9.1 での新機能

さて、RHEL 9.1 には、ifcfg-rh 形式と keyfile 形式の設定ファイルを相互にフォーマット変換することができる、nmcli connection migrate コマンドが新機能として追加されています(参考文献[6])。

基本的な使い方は以下の通りです。

nmcli connection migrate [ --plugin ファイル形式 ] コネクション名

変換先フォーマットを選択する --plugin オプションで指定できるファイル形式は keyfile または ifcfg-rh で、keyfile の場合は --plugin オプションの指定は省略可能です。つまり、デフォルトで keyfile への変換が行われる仕様になっています。

実際に使ってみた実行例を以下に示します。ここでは /etc/NetworkManager/system-connections/enp1s0.nmconnection というファイルだけが存在する状態で試しています。

[root@dhcp-201-195 ~]# nmcli connection migrate --plugin ifcfg-rh enp1s0
Connection 'enp1s0' (5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03) successfully migrated.
[root@dhcp-201-195 ~]# ls /etc/NetworkManager/system-connections/ /etc/sysconfig/network-scripts/
/etc/NetworkManager/system-connections/:

/etc/sysconfig/network-scripts/:
ifcfg-enp1s0  readme-ifcfg-rh.txt
[root@dhcp-201-195 ~]# _

このように、変換元のファイルは削除され、代わりに /etc/sysconfig/network-scripts/ifcfg-enp1s0 が作成されていることがわかります。

この状態でさらに逆方向の変換を試してみると(変換先フォーマットが keyfile なので --plugin オプションは省略しました)、

[root@dhcp-201-195 ~]# nmcli connection migrate enp1s0
Connection 'enp1s0' (5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03) successfully migrated.
[root@dhcp-201-195 ~]# ls /etc/NetworkManager/system-connections/ /etc/sysconfig/network-scripts/
/etc/NetworkManager/system-connections/:
enp1s0.nmconnection

/etc/sysconfig/network-scripts/:
readme-ifcfg-rh.txt
[root@dhcp-201-195 ~]# 

このように、やはり変換元のファイルが削除され、変換後のファイルだけが残ります。

変換元のファイルが削除されますので、本番環境などで試す場合は事前にバックアップを取ることをお勧めします。

なぜ ifcfg-rh 形式から keyfile 形式に移行するのか

移行の理由が、RHEL の上流に当たる Fedora Project の Wiki (参考文献[7])に記載されています。長いのでまとめると、以下のいくつかの論点に要約できるかと思います。

  • keyfile は常に NetworkManager のネイティブかつデフォルトのファイル形式であるのに対し、ifcfg-rh は Fedora/RHEL 特有で、NetworkManager での利用に plugin が必要
  • ifcfg-rh は network-scripts 由来のファイル形式だが、network-scripts と NetworkManager はそれぞれの拡張を行っていて全く同じ動作を保証するのが困難
  • keyfile は NetworkManager のすべてのプロファイルタイプを統一的にサポートするが、ifcfg-rh はすべてのプロファイルタイプをサポートしない
  • ifcfg-rh の文法は keyfile より間違いなく醜い
  • 複数の plugin が存在するのはユーザーにとって混乱の元だし、開発者にとっても保守の重荷
  • 過去には ifcfg-rh で全設定が実装されないバグもあった
  • keyfile 形式は他のどの Linux ディストリビューションでも利用できる唯一の NetworkManager の設定ファイル形式

色々書いてありますが、つまるところ、ネットワーク管理には NetworkManager を利用していく大前提において「本質的に同じことをするために複数のファイル形式をサポートするのは労力の無駄なので、どのディストリビューションでも使える標準形式に統一した方がユーザーにも開発者にもみんなにとってベストなのでは」といったところが一番の動機なのではないかと思います。

むすび

RHEL 9.1 のリリースノート(参考文献[6])を読むと「設定をキーファイル形式に移行することで、RHEL 9 以降の互換性が保証されます。」と書いてあることから、次期メジャーリリース (RHEL 10 になるでしょうか)では ifcfg-rh 形式が廃止されて利用できなくなる可能性があるように読み取れます。

長年慣れ親しんできたファイル形式や運用手順を変更することに抵抗があるのはよくわかりますが、RHEL 9 でも ifcfg-rh 形式は既に非推奨とされていますし、nmcli コマンドによりフォーマット変換で keyfile 形式に移行できるようにもなっていますので、今のうちに古い ifcfg-rh 形式と ifup/ifdown 等のコマンドから、NetworkManager 標準の keyfile 形式と nmcli コマンドに移行して RHEL 9 後のリリースに備えられてはいかがでしょうか。

参考文献

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。