えんでぃの技術ブログ

えんでぃの技術ブログ

ネットワークエンジニアの視点で、IT系のお役立ち情報を提供する技術ブログです。

Fedora40の変更点

Fedoraの変更点シリーズ

過去リリース分の記事は、以下のリンクを参照してください。

Fedoraの変更点シリーズ

お伝えしたいこと

Fedora 40のリリースノートを読んで、個人的に気になった項目をまとめます。

公式情報の見方

Fedora 40の変更点は、以下のリンクに載っています。
概要はリリースノートに、詳細情報はChange Setsのページに書いてあります。

Change Setの各サブタイトルのリンクから詳細情報に飛べるようになっています (下図赤枠部)。
詳細を知りたい時に便利なので、こちらも活用ください。

fedora_change_sets

Fedora 40の既知の問題は、以下にまとめられています。

他バージョンのFedoraについて知りたい場合は、以下のリンクを参照してください。

Release Notes & Changes

dnf実行時、filelistsを必要なときのみダウンロードするようになった

dnfでリポジトリを参照する際、操作内容によってメタデータをダウンロードします。
このメタデータの中にfilelistsと呼ばれるものがあります。

filelistsとは、そのリポジトリ内に含まれているrpmパッケージと、パッケージに含まれるファイル名すべてをxml形式で記録したファイルのことです。
見た目のサンプルとして、以下にzipパッケージの部分を抜粋します。

<package pkgid="feafa5144f815ab92fca16446ec7eea763e116a27e3c5716f7308a314e8138ba" name="zip" arch="x86_64">
  <version epoch="0" ver="3.0" rel="40.fc40"/>
  <file>/usr/bin/zip</file>
  <file>/usr/bin/zipcloak</file>
  <file>/usr/bin/zipnote</file>
  <file>/usr/bin/zipsplit</file>
  <file type="dir">/usr/lib/.build-id</file>
  <file type="dir">/usr/lib/.build-id/29</file>
  <file>/usr/lib/.build-id/29/bb2d05a3cf4baa7462a94a29ed39b97b44884b</file>
  <file type="dir">/usr/lib/.build-id/30</file>
  <file>/usr/lib/.build-id/30/ee0623bc9369b448a820bad6a65babf8e7e93f</file>
  <file type="dir">/usr/lib/.build-id/32</file>
  <file>/usr/lib/.build-id/32/57caf91e8de8514f0e3ba270d940e61f38b60d</file>
  <file type="dir">/usr/lib/.build-id/38</file>
  <file>/usr/lib/.build-id/38/7b7e0ad52e0c77ac310531fdc6f558841fccaa</file>
  <file type="dir">/usr/share/doc/zip</file>
  <file>/usr/share/doc/zip/CHANGES</file>
  <file>/usr/share/doc/zip/README</file>
  <file>/usr/share/doc/zip/README.CR</file>
  <file>/usr/share/doc/zip/TODO</file>
  <file>/usr/share/doc/zip/WHATSNEW</file>
  <file>/usr/share/doc/zip/WHERE</file>
  <file>/usr/share/doc/zip/algorith.txt</file>
  <file type="dir">/usr/share/licenses/zip</file>
  <file>/usr/share/licenses/zip/LICENSE</file>
  <file>/usr/share/man/man1/zip.1.gz</file>
  <file>/usr/share/man/man1/zipcloak.1.gz</file>
  <file>/usr/share/man/man1/zipnote.1.gz</file>
  <file>/usr/share/man/man1/zipsplit.1.gz</file>
</package>

このfilelistsですが、多くのdnf操作において必要とされません
従来のdnfでは、dnf list <パッケージ名>dnf repoquery <パッケージ名>のようにrpmに含まれるファイル名を必要としない操作においてもfilelistsをダウンロードしていました。

Fedora 40以降 (dnf 4.19.0以降) では、必要な場合を除いてデフォルトでfilelistsをダウンロードしないようになりました。
この変更により余分なメタデータのダウンロードが抑止され、キャッシュが効いていないときのdnf実行速度が大幅に向上しました

(検証) メタデータダウンロードにかかる時間の比較

試しに私の環境のFedora 40 VMで実行速度とダウンロードサイズを比較してみました。

まず、従来どおりのfilelistsをダウンロードしたときの結果を示します。
事前にsudo dnf clean metadataメタデータのキャッシュをクリアした上で試験しました。
メタデータのダウンロードサイズが合計87 MB、コマンド実行時間は約41秒です。
このデータは、filelistsをダウンロードするようわざわざ設定変更したFedora 40で取得したものです。

# time sudo dnf repoquery rpm
Fedora 40 - x86_64                             5.4 MB/s |  75 MB     00:14    
Fedora 40 openh264 (From Cisco) - x86_64       2.3 kB/s | 2.6 kB     00:01    
Fedora 40 - x86_64 - Updates                   8.6 MB/s |  12 MB     00:01    
rpm-0:4.19.1.1-1.fc40.x86_64

real    0m41.338s
user    0m27.085s
sys 0m1.616s

filelistsをダウンロードしないときの結果を示します。
一度sudo dnf clean metadataメタデータのキャッシュをクリアし、filelistsをダウンロードしない設定に切り替えてから同じコマンドを実行しました。
ダウンロードしたファイルサイズは23.4 MB、実行時間は10.5秒まで短縮されました。

# time sudo dnf repoquery rpm
Fedora 40 - x86_64                             13 MB/s |  20 MB     00:01    
Fedora 40 openh264 (From Cisco) - x86_64       1.0 kB/s | 1.8 kB     00:01    
Fedora 40 - x86_64 - Updates                   4.2 MB/s | 3.4 MB     00:00    
Last metadata expiration check: 0:00:01 ago on Tue 30 Apr 2024 04:39:06 PM JST.
rpm-0:4.19.1.1-1.fc40.x86_64

real    0m10.500s
user    0m7.043s
sys 0m0.432s

(検証) filelistsはどこに存在するのか?

/var/cache/dnf/リポジトリ名-英数字/repodata/英数字-filelists.xml.拡張子にありました。

それぞれ圧縮されているので、中身を見るにはunzckgunzipといったコマンドで解凍してから開く必要があります。
unzckコマンドは、Fedoraであればsudo dnf install zchunkでインストールできます。

ファイルの中身については先ほどのセクションですでに示したので割愛します。

# find /var/cache/dnf/ -name '*filelists*' | xargs du -h
56M /var/cache/dnf/fedora-6c3a9e5977a00788/repodata/a07f2d719480923d5a2af772eed004eef5c1c6c1032258b740c9515fba82c173-filelists.xml.zck
8.2M   /var/cache/dnf/updates-02a32a5ce99e20ab/repodata/42fba8b75ea15274d85d9c5ea56242b341628e2c04bfad2979d390c535f80a57-filelists.xml.zck
8.0K   /var/cache/dnf/fedora-cisco-openh264-3e5cc8d7297aea85/repodata/c339739d50e2ae7ff271d6987aa9d95f37cec4da942afa0dc96bbe977e5cd333-filelists.xml.gz

(検証) Fedora 39とFedora 40の挙動を比較してみる

以下の手順を様々なパターンで試しつつ、挙動を比較してみました。

  1. sudo dnf clean metadataを実行し、メタデータのキャッシュを削除する
  2. dnfコマンド (A) を実行する
  3. find /var/cache/dnf/ -name '*filelists*'を実行し、filelistsが生成したかどうかを確認する (B)

結果は以下の通りです。
/var/cache/dnf/配下にキャッシュ格納するのはrootユーザのみなので、本試験はすべてrootユーザで実施しました (一般ユーザは/var/tmp/dnf-ユーザ名-乱数/配下にキャッシュ格納します)

試験ID Fedoraバージョン dnfコマンド (A) filelistsは生成したか (B)
1 Fedora 39 sudo dnf repoquery rpm 生成した
2 Fedora 39 sudo dnf repoquery -l rpm 生成した
3 Fedora 40 sudo dnf repoquery rpm 生成しなかった
4 Fedora 40 sudo dnf repoquery -l rpm 生成した

結果 (B) から、全てこれまでに説明した仕様通りになっていることが読み取れました。

最下行の試験4について補足すると、dnf repoquery -lRPMパッケージ内に含まれるファイルを列挙するコマンドです。
このコマンドはfilelists相当の情報を要求するため、filelistsが生成することは想定どおりです。
(今回のケースでは全パッケージの情報を取得する必要はないのですが、そこはdnfの仕様がそうなっているのだと理解しました)

(補足) filelistsを常にダウンロードする方法

従来どおりfilelistsを常にダウンロードしたい場合は、/etc/dnf/dnf.confにおいて、以下の行を[main]セクションの配下に追記します。

optional_metadata_types=filelists

wgetがwget2に置き換わった

Fedora 40ではwgetがwget2に置き換えられました。
wget2は従来のwgetとは異なるライブラリを利用していて、より活発に開発が行われているとのことです。

Fedora 40の公式リポジトリでは、従来バージョンのwgetRPMファイルは提供されなくなりました。

wgetとwget2の機能差分

以下のページにwgetとwget2の機能差分がまとめられています。
GitLab - gnuwget/wget2 - Wiki - #Different behavior of Wget2

wget2ではFTP、WARC (Web Archive)関連のオプションが今のところサポートされないようです。
代わりにhttp2, hsts, 統計値の表示など多くの機能が追加されています。

パッケージ構成の違い

従来のwgetパッケージが以下2つのパッケージに置き換えられました。

パッケージ名 内容
wget2 wget2実行ファイルを含むwget2本体
wget2-wget wgetをwget2に差し替えるファイル群。
/usr/bin/wget -> wget2というシンボリックリンクなど

これにより、wgetコマンドを実行するとwget2コマンドが実行されます。
また、man wgetを実行するとman wget2が参照されます。

NetworkManagerにて、IPv4のアドレス重複検知がデフォルト有効に

Fedora 39以前ではIPv4のアドレス重複検知機能がデフォルト無効でしたが、Fedora 40以降ではデフォルト有効になります。

内部的には、ipv4.dad-timeoutのデフォルト値が変更されました。
とはいっても、nmcli connection show <connection-name>で表示されるipv4.dad-timeoutの値はFedora 39でもFedora 40でも-1のままです。
-1とは、「デフォルト値に従う」ことを意味します。
nmcliの出力やNetworkManager.confなどの設定ファイルには更新がありませんが、デフォルトの挙動が変わったのが今回の差分です。

ちなみにipv4.dad-timeoutの値が0の場合は無効化、130000の場合はミリ秒単位でDAD (Duplicate Address Detection) のために実行されるARP Probeのタイムアウト値が指定されます。
man nm-settings-nmcliに記載の通り、実際には指定した値の等倍〜半分の間の値が乱数で決定されてタイムアウト値として使用されるとのことです。

(補足) DADとは、Duplicate Address Detectionの略です。インターフェースがupしたときにARP Probeと呼ばれる「自分のIPアドレスをセットしたARP Request」をブロードキャストで送信し、万が一応答があった場合にIPアドレス重複として検知する仕組みです。次セクションの検証結果を先にお伝えすると、Fedora 40においてIPアドレス重複を検知した場合、静的なIPアドレスであればインターフェースをupせず、動的なIPアドレスであれば別の利用可能なIPアドレスを代わりにアサインするという動きになりました。

(検証) 実際にIPv4アドレス重複させてみる

以下3台のVMを予め用意しておきます。

Fedoraバージョン ホスト名 IPv4アドレス割当方式 IPv4アドレス
Fedora 40 fedora40-dhcp dhcp 192.168.122.158/24
Fedora 40 fedora40-manual manual 未設定
Fedora 39 fedora39-manual manual 未設定

fedora40-manualに対して以下のコマンドを実行し、fedora40-dhcpIPアドレスを重複させてみます。
すると、30秒前後経過した後にエラーメッセージが出てConnectionの有効化に失敗します。

fedora40-manual# sudo nmcli connection add ifname enp1s0 con-name test type ethernet ipv4.method manual ipv4.addresses 192.168.122.158/24

# Connectionの有効化に失敗する
fedora40-manual# time sudo nmcli connection up test
# Error: Connection activation failed: IP configuration could not be reserved (no available address, timeout, etc.)
# Hint: use 'journalctl -xe NM_CONNECTION=0e08924a-c79c-4672-b148-31d0d492aec5 + NM_DEVICE=enp1s0' to get more details.
# real 0m32.095s
# user 0m0.032s
# sys  0m0.019s

# 元々のConnectionのまま
fedora40-manual# nmcli connection show
# NAME    UUID                                  TYPE      DEVICE 
# enp1s0  f4d9f489-6247-383a-9fb2-0b7c84e762ec  ethernet  enp1s0 
# lo      5077f790-ccff-4a25-9f6b-4cfdfad2df57  loopback  lo     
# test    0e08924a-c79c-4672-b148-31d0d492aec5  ethernet  --   

# ログを抜粋。IPアドレス重複のエラーが出ていた
fedora40-static:~# journalctl --no-pager -eu NetworkManager.service
# May 01 01:31:12 fedora40-static NetworkManager[897]: <warn>  [1714494672.4948] device (enp1s0): IP address 192.168.122.158 cannot be configured because it is already in use in the network by host 52:54:00:4B:B9:2A

fedora39-manualでも同様の操作を行い、IPv4アドレスを重複させてみます。
今度は一瞬でIPアドレス設定が完了し、容赦なくIPアドレス重複が発生します

fedora39-manual# sudo nmcli connection add ifname enp1s0 con-name test type ethernet ipv4.method manual ipv4.addresses 192.168.122.158/24

# Connectionの有効化に成功する
fedora39-manual# time sudo nmcli connection up test
# Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)

# real 0m0.112s
# user 0m0.010s
# sys  0m0.011s

更にIPアドレス重複が発生させた状態で、fedora40-dhcpのインターフェースを一度downさせ、その後upさせてみます。
すると元の192.168.122.158/24ではなく、別の192.168.122.159/24が動的にアサインされます。

fedora40-dhcp# sudo nmcli connection down enp1s0
fedora40-dhcp# time sudo nmcli connection up enp1s0
# Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)

# real 0m13.406s
# user 0m0.015s
# sys  0m0.016s

今回の検証結果をまとめると、以下のようになりました。

  • Fedora 40以降、IPv4アドレス重複検知機能がデフォルトで有効化された (Fedora 39以前ではデフォルト無効だった)
  • 静的なIPアドレス設定で重複を検知した場合、30秒程度でConnectionの有効化に失敗した
  • DHCP構成でlease期限内のIPアドレスが重複していることを検知した場合、13秒程度で次の空きIPアドレスを利用した
    • (補足) RFC5227ではDHCP ClientがDHCP DECLINEを送付することまで規定されているものの、IPアドレス設定のエラーを返すか次の空きIPアドレスを使うかの判断は実装に委ねられていた

Python 3.7のRPM提供終了

python3.7パッケージがFedora 40のリポジトリで配布されなくなりました。
dnf provides python3.7と検索してもRPMが見つからなくなりました。

なお、Python 3.7は2023/6/27にEnd of lifeになりました。
(Python Developer's Guide - Status of Python versions)

背景には以下の事情があったとのことです。

  • End of lifeになってからもDebian 10 "Buster" LTSのテストのためにPython3.7を残しておいた
  • Fedora 40がリリースされる頃にはDebian 10もEnd of lifeになるため残しておく理由がなくなった

RHEL 8のサポートが継続していることを理由として、Python 3.6についてはFedora 40でも引き続き提供されるとのことでした。

Bugs

f40タグ付きのCommon Issuesを確認しましたが、特に気になるものはありませんでした。