Fedoraの変更点シリーズ
過去リリース分の記事は、以下のリンクを参照してください。
お伝えしたいこと
Fedora 40のリリースノートを読んで、個人的に気になった項目をまとめます。
公式情報の見方
Fedora 40の変更点は、以下のリンクに載っています。
概要はリリースノートに、詳細情報はChange Setsのページに書いてあります。
Change Setの各サブタイトルのリンクから詳細情報に飛べるようになっています (下図赤枠部)。
詳細を知りたい時に便利なので、こちらも活用ください。
Fedora 40の既知の問題は、以下にまとめられています。
他バージョンのFedoraについて知りたい場合は、以下のリンクを参照してください。
- Fedora Docs - Fedora Linux User Documentation → 右上から該当バージョンを選択してRelease Notesのリンクに移動
- Fedora Wiki - Changes
Release Notes & Changes
dnf実行時、filelistsを必要なときのみダウンロードするようになった
- Fedora 40 Release Notes - #Stop downloading filelists by default
- Fedora Wiki - Changes/DNFConditionalFilelists
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.拡張子
にありました。
それぞれ圧縮されているので、中身を見るにはunzck
やgunzip
といったコマンドで解凍してから開く必要があります。
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の挙動を比較してみる
以下の手順を様々なパターンで試しつつ、挙動を比較してみました。
sudo dnf clean metadata
を実行し、メタデータのキャッシュを削除する- dnfコマンド (A) を実行する
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 -l
はRPMパッケージ内に含まれるファイルを列挙するコマンドです。
このコマンドはfilelists
相当の情報を要求するため、filelists
が生成することは想定どおりです。
(今回のケースでは全パッケージの情報を取得する必要はないのですが、そこはdnfの仕様がそうなっているのだと理解しました)
(補足) filelistsを常にダウンロードする方法
従来どおりfilelists
を常にダウンロードしたい場合は、/etc/dnf/dnf.conf
において、以下の行を[main]
セクションの配下に追記します。
optional_metadata_types=filelists
wgetがwget2に置き換わった
Fedora 40ではwgetがwget2に置き換えられました。
wget2は従来のwgetとは異なるライブラリを利用していて、より活発に開発が行われているとのことです。
Fedora 40の公式リポジトリでは、従来バージョンのwgetのRPMファイルは提供されなくなりました。
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 40 Release Notes - Enable IPv4 address conflict detection by default in NetworkManager
- Fedora Wiki - Changes/Enable IPv4 Address Conflict Detection
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
の場合は無効化、1
〜30000
の場合はミリ秒単位で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-dhcp
とIPアドレスを重複させてみます。
すると、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アドレスを利用した
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を確認しましたが、特に気になるものはありませんでした。