Text
Page: 1
Debianの64bit time_t移行は
今どうなっているのか
64bit time_tの進展状況をながめてみよう
Kentaro Hayashi
ClearCode Inc.
2024年04月 東京エリア・関西合同Debian勉強会
Page: 2
スライドは
Rabbit Slide Showにて公開済み
Debianの64bit time_t移行は今どうなっているのか
https://slide.rabbit-shocker.org/authors/kenhys/tokyodebian-timet-transition-202404
Page: 3
本日の内容
Debianの64bit time_t transitionを追いかけてみよう
64bit time_t移行はなぜ必要なのか
移行計画はどのようになっているのか
移行の進展状況は
Page: 4
本日の内容
Debianの64bit time_t transitionを追いかけてみよう
64bit time_t移行はなぜ必要なのか
移行計画はどのようになっているのか
移行の進展状況は
Page: 5
64bit time_t移行はなぜ必要なのか
Linuxディストリビューションの動向
32bitアーキテクチャのサポートは廃止ないしは縮小の流れ
Debianではarmel,armhf,i386が残っている
32bit time_tのままでは2038年問題不可避
signed 32bit で扱える範囲 (〜2147483647)
Page: 6
2038 年問題
Xデーは2038年1月19日
time_tが32bitで時刻を保持しているため32bitアーキテクチャでオーバーフ
ローが発生する問題
Time.at(2147483647)
=> 2038-01-19 12:14:07 +0900
Page: 7
かつての 2000 年問題との比較
2000年問題
西暦下2桁処理で節約したリソースが問題を引き起こす
上記前提で実装されたアプリケーションによる障害発生
事前の対策が進められたことから大混乱は回避された
2038年問題
システム全体で障害発生 (32bitアーキテクチャにおいて)
Page: 8
Debianにおける
2038 年問題対策の構成要素
カーネル
glibc
ファイルシステム
アプリケーション/ライブラリー etc…
Page: 9
2038 年問題を踏んだらどうなるか
(1)
シェルでの操作不能に陥る
試すならqemuイメージなどがおすすめ
$ sudo date --set="2038-01-19 12:14:00"
Tue Jan 19 12:14:00 UTC 2038
$ sudo ls
sudo: unable to open /etc/sudo.conf: Value too large for defined data type
sudo: unable to determine tty: Value too large for defined data type
sudo: unable to get time of day: Value too large for defined data type
sudo: error initializing audit plugin sudoers_audit
Page: 10
Debianにおける
2038 年問題対策の構成要素
カーネル (kernel 5.6以降対応済み)
glibc (2.34以降対応済み)
ファイルシステム (ext4など対応済み)
アプリケーション/ライブラリー etc…
Page: 11
アプリケーション・ライブラリーの
点検が必要
内部で時刻を扱うケースはないか?
時刻をどのように保存するようにしているか?
Page: 12
事例 : Groonga の場合 (1)
https://github.com/groonga/groonga/discussions/1698
データベースで時刻を扱う型がある
Timeカラムは int64_tでマイクロ秒を保持 => 問題なし
Time.at(9223372036854775807 / 10**6)
=> 294247-01-10 13:00:54 +0900
Page: 13
事例 : Groonga の場合 (2)
データベースの内部表現(オブジェクトヘッダ)で時刻(更新)を扱う
データベース内のオブジェクトを区別するためのシステム情報
uint32_tなのでもうすこし頑張れる(2106年問題)
Time.at(4294967295)
=> 2106-02-07 15:28:15 +0900
Page: 14
2038 年問題を踏んだらどうなるか
(2)
実験: Xデー以降にデータベースを更新する
💣
→ データベース更新中にクラッシュする
root@debian:/home/debian/bug1062131# date --set="2038-01-19 12:14:00"
Tue Jan 19 12:14:00 UTC 2038
root@debian:/home/debian/bug1062131# groonga db/test < update-last-modified.grn
Segmentation fault
Page: 15
本日の内容
Debianの64bit time_t transitionを追いかけてみよう
64bit time_t移行はなぜ必要なのか
移行計画はどのようになっているのか
移行の進展状況は
Page: 16
Debianにおける64bit time_t
transition (1)
https://wiki.debian.org/ReleaseGoals/64bit-time
✅ transitionが必要なABIの変更対象をリストアップする
https://lists.debian.org/debian-devel/2023/05/msg00168.html
当初少なくとも4900ソースパッケージが影響を受けると考えられていた
✅
dpkg-buildflagが-D_FILE_OFFSET_BITS=64と-D_TIME_BITS=64 を既定で
有効にする(i386系を除く)
dpkg 1.22.5以降で有効
Page: 17
Debianにおける64bit time_t
transition (2)
✅ NMUでライブラリー名変更を実施
進行中は依存関係を満たせずインストールできない、意図せず削除される等が
発生
✅ 依存ライブラリーを大量にリビルドしなおす(進行中)
Page: 18
NMUでライブラリー名変更を実施
d/controlの例
-Package: libfoo0
+Package: libfoo0t64
+Provides: ${t64:Provides}
+Replaces: libfoo0
+Breaks: libfoo0 (<< ${source:Version})
Page: 19
t64:Providesの役割
debhelper 13.14で実装されているマクロ
dh_makeshlibsを参照するとよい
32bitアーキテクチャでない or abi=time64が定義されていない
64bit time_t transition関係ないアーキテクチャではt64サフィックスなしの
Provides:を定義
t64:Providesに libfoo0 = ${binary:Version}を設定
Page: 20
i386で64bit time_tを
有効にするには
https://lists.debian.org/debian-devel/2024/02/msg00100.html
従来i386では既定で64bit time_tは有効にしない
パッケージのメンテナーが明示的に指定したら有効になる
DEB_BUILD_OPTIONS=abi=+time64
Page: 21
リリースチームやメンテナーの動き
64bit time_t移行のためのパッチをメンテナーに提供
各パッケージメンテナーは必要に応じてexperimentalでテスト
NMUでライブラリー名変更まで実施済み
メンテナーとしてはFTBFSとかに遭遇しなければとくになし
Page: 22
例 : 依存関係の
トラブルシューティング
例えばbuild-depに失敗したときにどうやって調べるか
$ apt build-dep groonga
dd-schroot-cmd -c $sid apt-get
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
...
The following packages have unmet dependencies:
libnorm1t64 : Breaks: libnorm1 (< 1.5.9+dfsg-3.1) but 1.5.9+dfsg-3 is to be installed
libpgm-5.3-0t64 : Breaks: libpgm-5.3-0 (< 5.3.128~dfsg-2.1) but 5.3.128~dfsg-2 is to be installed
E: Unable to correct problems, you have held broken packages.
Command apt-get --dry-run build-dep -- groonga exited with exit code 1.
Page: 23
依存関係を調べるのに便利なもの
apt depends
直接の依存関係を知るのに便利
再帰的な依存関係は一度ではわからない
apt-rdepends
再帰的な依存関係もわかる
debtree
再帰的な依存関係を可視化できる
Page: 24
debtreeによる依存関係の可視化
例: groongaの依存関係を可視化
debtree --no-recommends groonga > groonga.dot
dot -Tsvg groonga.dot > groonga.svg
Page: 25
debtreeで可視化(一部省略)
(>= 5.1.116~dfsg) libpgm-5.3-0t64
(>= 1.0.3) libsodium23
(>= 0.0)
libzmq5
(>= 3.2.3+dfsg)
(>= 2.1.8-stable)
groonga
(= 13.1.1+dfsg-3)
libmsgpackc2
(>= 2.1.0)
(>= 1:1.2.0)
(= 13.1.1+dfsg-3)
(= 13.1.1+dfsg-3)
libgssapi-krb5-2
libnorm1t64
libevent-2.1-7t64
(>= 2.1.0)
groonga-plugin-suggest
(= 13.1.1+dfsg-3)
libbsd0
(>= 1.17)
(>= 1.5r6)
zlib1g
libgroonga0t64
(>= 0.0~r130)
groonga-bin
liblz4-1
(>= 1.5.5)
libjs-jquery-flot
libzstd1
libjs-jquery
Page: 26
debtreeで可視化するときのヒント
--no-recommendsを指定して余計な依存関係を省く
--skiplist=を指定して特定の依存先を省く
libc6やドキュメント関係を指定するとわかりやすくなる
python3-sphinx
groonga-doc
libc6
gcc-14-base
...
Page: 27
本日の内容
Debianの64bit time_t transitionを追いかけてみよう
64bit time_t移行はなぜ必要なのか
移行計画はどのようになっているのか
移行の進展状況は
Page: 28
64bit time_t transitionの進捗状況
https://bugs.debian.org/cgi-bin/pkgreport.cgi?users=debian-
arm@lists.debian.org;tag=time-t
time-t でタグ付けされているバグを参照するとよい
すでに1100近くNMUされている
debian-develメーリングリストを購読していると定期的に進捗報告あり
Page: 29
64bit time_t transitionの進捗状況
https://qa.debian.org/dose/debcheck/unstable_main/index.html
Packages not installable in scenario unstable_main
transition中は頻繁に衝突する
=> リビルド状況の変化は64bit time_t移行の進展をみるのに使えそう
Page: 30
およそ一ヶ月ほど前 2024/03/15
Page: 31
先週の状況 2024/04/10
Page: 32
今週の状況 2024/04/15
Page: 33
dpkgはまだ移行できていない
dpkg 1.22.5 はまだtestingに入っていない
dpkg >= 1.22.5の指定があるものもtestingに入らない
Page: 34
移行進捗の停滞ぎみ (1)
https://lists.debian.org/debian-devel/2024/04/msg00331.html
そもそもインストールできない状態のまま
FTBFSだけどバグが立っていないので見落とされている
移行前のライブラリ名がハードコーディングされている
移行前と移行後のライブラリー双方への依存で衝突
Page: 35
移行進捗の停滞ぎみ (2)
完全に依存先の問題が解消される前にリビルドされた(ので古い)
symbol/shlibsが正しくない依存関係になっている
まだbinNMUされていない
Page: 36
64bit time_tでの懸念事項
https://lists.debian.org/debian-devel/2024/03/msg00294.html
transitionを進めるため、機能を無効化することがある。再度有効化しないと
機能差が発生するかも
FTBFSが原因でパッケージが削除される方向にすすむことがある
FTBFSが原因でパッケージが32bitアーキテクチャのサポートをやめてし
まうことがある
使っているパッケージが該当していないかは注視が必要