Slide 1

Slide 1 text

XFSのbigtimeを少 XFSのbigtimeを少 し試してみた し試してみた Kenichiro Matohara(matoken) 1 / 29

Slide 2

Slide 2 text

南隅から参加(鹿児島の右下) 好きなLinuxディストリビューションはDebian お仕事募集 mailto:work@matohara.org Kenichiro Matohara(matoken) Kenichiro Matohara(matoken) https://matoken.org https://matoken.org 2 / 29

Slide 3

Slide 3 text

「MIRACLE LINUX Users Meetup 「MIRACLE LINUX Users Meetup #4」に参加 #4」に参加 先月以下のイベントに参加(Youtubeで動画も公開中) この中のRHEL(Red Hat Enterprise Linux)9の8からの変更点で 「XFSが新機能(bigtime, inobtcount)に対応、作成時もデフォルト に」というものが気になったので少し試してみた. RHEL 9が出たけど、MIRACLE LINUX 9はどうなるの! - connpass MIRACLE LINUX Users Meetup #4 RHEL 9が出たけど、 MIRACLE LINUX 9はどうなるの! - YouTube 3 / 29

Slide 4

Slide 4 text

XFS XFS Silicon Graphics, Inc. がIRIX向けに開発した64bitファイルシ ステム.1994年〜 1999年にLinux版がGPLで公開 2.4.21〜Linux kernelに同梱 4 / 29

Slide 5

Slide 5 text

XFSの XFSの bigtime bigtime , , inobtcount inobtcount XFSの bigtime , inobtcount は5.10からの機能 bigtime いわゆるY2038問題への対策で1901年12月~2486年7月の タイムスタンプに対応できるようになる inobtcount inode btreeサイズを保存するようになり,マウント時間の短縮が される 今回は bigtime を少し試してみた 5 / 29

Slide 6

Slide 6 text

[GIT PULL] xfs: new code for 5.10, part 1 - Darrick J. Wong XFS File-System With Linux 5.10 Punts Year 2038 Problem To The Year 2486 - Phoronix 6 / 29

Slide 7

Slide 7 text

Debianでの対応状況 Debianでの対応状況 Debian sid で xfsprogs のchangelogを確認.5.10-rc1から bigtime が使えるようになっている,規定値になったのは5.15.0-rc1 から xfsprogs-5.10.0-rc1 (04 Dec 2020) - xfsprogs: Add bigtime feature for Y2038 (Darrick Wong) xfsprogs-5.15.0-rc1 (11 Mar 2022) - mkfs: enable inobtcount and bigtime by default (Darrick J. Wong) 7 / 29

Slide 8

Slide 8 text

現在の安定版のDebian bullseyeから利用可能で,次期リリースの bookwormから規定値になりそう(多分bookwormのリリースノート に載る) $ rmadison xfsprogs | grep \ stable -A3 xfsprogs | 5.10.0-4 | stable | source, amd64, arm64, armel, armhf, i386, mips6 xfsprogs | 5.18.0-1 | testing | source, amd64, arm64, armel, armhf, i386, mips6 xfsprogs | 5.19.0-1 | unstable | source, amd64, arm64, armel, armhf, i386, mips6 xfsprogs | 5.19.0-1 | unstable-debug | source 8 / 29

Slide 9

Slide 9 text

bigtaimeの動きを確認 bigtaimeの動きを確認 9 / 29

Slide 10

Slide 10 text

Debian Bullseye(stable) Debian Bullseye(stable) Debian Bullseye でフォーマットしたXFSは bigtime=0 になって いる. 1 ディスクイメージを作成 2 xfs既定値でフォーマット 3 bigtime=0 になっている $ dd if=/dev/zero of=./disk.img bs=1M count=20 $ sudo mkfs.xfs ./disk.img meta-data=./disk.img isize=512 agcount=1, agsize=5120 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=0 data = bsize=4096 blocks=5120, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=1368, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 1 2 3 10 / 29

Slide 11

Slide 11 text

2039年のタイムスタンプでファイルを作成してみると2038年になっ た. 1 2039年のファイルを作る 2 2038年になっている $ sudo mount ./disk.img /mnt $ sudo chown `id -u`:`id -u` /mnt $ touch -t '203902022222.22' /mnt/time-2039 $ ls -lA /mnt/ 合計 0 -rw-r--r-- 1 matoken matoken 0 1月 19 2038 time-2039 $ sudo umount /mnt 1 2 11 / 29

Slide 12

Slide 12 text

Debian bullseye で Debian bullseye で bigtime=1 bigtime=1 xfs_admin -O bigtime=1 コマンドで初期化しなくても bigtime=1 にできるようだが,bullseyeの xfs_admin は未対応だ ったのでbigtimeを有効にしてフォーマットしなおした.2038年を超え たタイムスタンプが作成できる. 1 bigtime=1 を指定してフォーマット 2 bugtime=1 になっている $ sudo mkfs.xfs -f -m bigtime=1 ./disk.img meta-data=./disk.img isize=512 agcount=1, agsize=5120 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 data = bsize=4096 blocks=5120, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=1368, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 1 2 12 / 29

Slide 13

Slide 13 text

1 2039年のファイルを作る 2 2500年のファイルを作る 3 2039年になっている 4 2486年になっている $ sudo chown `id -u`:`id -u` /mnt $ touch -t '203902022222.22' /mnt/time-2039 > touch -t '250002022222.22' /mnt/time-2500 $ ls -lA /mnt 合計 0 -rw-r--r-- 1 matoken matoken 0 2月 2 2039 time-2039 -rw-r--r-- 1 matoken matoken 0 7月 3 2486 time-2500 1 2 3 4 13 / 29

Slide 14

Slide 14 text

 Debian bullseyeではxfs_adminでbigtimeを設定できない $ sudo xfs_admin -O bigtime=1 ./disk.img Illegal option -O Usage: xfs_admin [-efjlpuV] [-c 0|1] [-L label] [-U uuid] device [logdev] 14 / 29

Slide 15

Slide 15 text

Debian sid(unstable)でのbigtime=1 Debian sid(unstable)でのbigtime=1 既定値でmkfsした時点で bigtime=1 になっている.2039年を超え るタイムスタンプも作れる.2486年を超えるものを作ろうとすると 2486年になった. 1 既定値でフォーマット 2 bigtime=1 になっている > dd if=/dev/zero of=./disk.img bs=1M count=20 > sudo mkfs.xfs ./disk.img meta-data=./disk.img isize=512 agcount=1, agsize=5120 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=5120, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=1368, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 1 2 15 / 29

Slide 16

Slide 16 text

1 2039年のファイルを作る 2 2500年のファイルを作る 3 2039年になっている 4 2486年になっている > sudo mount ./disk.img /mnt > sudo chown `id -u`:`id -u` /mnt > touch -t '203902022222.22' /mnt/time-2039 > touch -t '250002022222.22' /mnt/time-2500 > ls -lA /mnt 合計 0 -rw-r--r-- 1 matoken matoken 0 2月 2 2039 time-2039 -rw-r--r-- 1 matoken matoken 0 7月 3 2486 time-2500 1 2 3 4 16 / 29

Slide 17

Slide 17 text

Debian sid(unstable) でのbigtime=0 Debian sid(unstable) でのbigtime=0 Debian sidで bigtime=0 で初期化 2039年のファイルを作ろうと しても2038年になる 1 bigtime=0 で初期化 2 bigtime=0 になっている > sudo mkfs.xfs -f -m bigtime=0 ./disk.img meta-data=./disk.img isize=512 agcount=1, agsize=5120 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=0 inobtcount=1 data = bsize=4096 blocks=5120, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=1368, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 1 2 17 / 29

Slide 18

Slide 18 text

1 2039年のファイルを作る 2 2038年になっている > sudo mount ./disk.img /mnt > sudo chown `id -u`:`id -u` /mnt > touch -t '203902022222.22' /mnt/time-2039 > ls -lA /mnt 合計 0 -rw-r--r-- 1 matoken matoken 0 1月 19 2038 time-2039 1 2 18 / 29

Slide 19

Slide 19 text

Debian sidで Debian sidで bigtime bigtime を 0→1 に を 0→1 に アンマウント状態で xfs_admin コマンドで bigtime を 0→1 にする 1 アンマウントしておく 2 xfs_admin コマンドで bigtime を 1 に設定する $ sudo umount /mnt $ sudo xfs_admin -O bigtime=1 ./disk.img Running xfs_repair to upgrade filesystem. Cannot get host filesystem geometry. Repair may fail if there is a sector size mismatch between the image and the host filesystem. Phase 1 - find and verify superblock... Cannot get host filesystem geometry. Repair may fail if there is a sector size mismatch between the image and the host filesystem. Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Adding large timestamp support to filesystem. 1 2 19 / 29

Slide 20

Slide 20 text

Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 Phase 5 - rebuild AG headers and trees... - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... done 20 / 29

Slide 21

Slide 21 text

1 bigtime が 1 になっている $ sudo xfs_info ./disk.img meta-data=./disk.img isize=512 agcount=2, agsize=4096 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=8192, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=1368, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 1 21 / 29

Slide 22

Slide 22 text

1 2039年のファイルを作る 2 2500年のファイルを作る 3 2039年になっている 4 2486年になっている > sudo mount ./disk.img /mnt > sudo chown `id -u`:`id -u` /mnt > touch -t '203902022222.22' /mnt/time-2039 > touch -t '250002022222.22' /mnt/time-2500 > ls -lA /mnt 合計 0 -rw-r--r-- 1 matoken matoken 0 2月 2 2039 time-2039 -rw-r--r-- 1 matoken matoken 0 7月 3 2486 time-2500 1 2 3 4 22 / 29

Slide 23

Slide 23 text

 ディスクが小さいと以下のようなエラーになる.(NG: 20MB〜 24MB,OK 32MB) $ sudo xfs_admin -O bigtime=1 ./disk.img Running xfs_repair to upgrade filesystem. Cannot get host filesystem geometry. Repair may fail if there is a sector size mismatch between the image and the host filesystem. Phase 1 - find and verify superblock... Only one AG detected - cannot validate filesystem geometry. Use the -o force_geometry option to proceed. 23 / 29

Slide 24

Slide 24 text

bigtime bigtime のダウングレード(でき のダウングレード(でき ない) ない) bigtime を 1→0 にすることはできない( inobtcount も同じ) $ sudo xfs_admin -O bigtime=0 ./disk.img Running xfs_repair to upgrade filesystem. -c bigtime only supports upgrades 24 / 29

Slide 25

Slide 25 text

まとめ まとめ Linux 5.10よりXFSでbigtimeで2486年7月までのタイムスタン プに対応 bigtimeが無効なXFSファイルシステムはアンマウントした状態で 有効にすることができる(無効に戻すことはできない) bigtimeが有効なXFSファイルシステムは5.10より前の環境では マウントできないはず(未確認) 2038年は結構近い?2486年は今生きている人間が触ることはな さそう? (大きめのディスクを手に入れたら inobtcount も試したい) 25 / 29

Slide 26

Slide 26 text

余録1)ext4での時間 余録1)ext4での時間 Debian Bullseye(linux 5.10.0-16, e2fsprogs 1.46.2-2)で は2038年まで,sid(Linux 5.18.0-3, e2fsprogs 1.46.5-2)で は2446年までのよう.詳細は未確認. $ dd if=/dev/zero of=./disk.img bs=1M count=20 $ sudo mkfs.ext4 ./disk.img $ sudo mount ./disk.img /mnt $ sudo chown `id -u`:`id -u` /mnt $ touch -t '203902022222.22' /mnt/time-2039 $ touch -t '250002022222.22' /mnt/time-2500 $ ls -lA /mnt 合計 12 drwx------ 2 root root 12288 8月 20 03:49 lost+found -rw-r--r-- 1 matoken matoken 0 2月 2 2039 time-2039 -rw-r--r-- 1 matoken matoken 0 5月 11 2446 time-2500 26 / 29

Slide 27

Slide 27 text

余録2)btrfsでの時間 余録2)btrfsでの時間 Debian Bullseye(btrfs-progs 5.10.1-2)では2107年7月まで, sid(btrfs-progs 5.19-1)では9999年12月までのよう(超えるとエ ラーとなる).詳細は未確認. $ touch -t '999912312359.59' ./time-9999 $ touch -t '1000001010000.00' ./time-10000 touch: `1000001010000.00': 無効な日付の書式です $ ls -l ./time-* -rw-r--r-- 1 matoken matoken 0 2月 2 2039 ./time-2039 -rw-r--r-- 1 matoken matoken 0 2月 2 2500 ./time-2500 -rw-r--r-- 1 matoken matoken 0 2月 2 2900 ./time-2900 -rw-r--r-- 1 matoken matoken 0 2月 2 5000 ./time-5000 -rw-r--r-- 1 matoken matoken 0 2月 2 9000 ./time-9000 -rw-r--r-- 1 matoken matoken 0 2月 2 9999 ./time-9999 27 / 29

Slide 28

Slide 28 text

と思ったけどエラーが出るの変 と思ったけどエラーが出るの変 だなと別のコマンドを試すとも だなと別のコマンドを試すとも っと行けた っと行けた 恐らく,touchコマンドが9999年まで,faketimeコマンドが 999999999年まで,Btefsは? $ faketime "9999999990101" touch 999999999 $ faketime "99999999990101" touch 9999999999 date: `99999999990101' は無効な日付です Error: Timestamp to fake not recognized, please re-try with a different timestamp. $ ls -l 99999* -rw-r--r-- 1 matoken matoken 0 1月 1 99999 99999 -rw-r--r-- 1 matoken matoken 0 1月 1 999999 999999 -rw-r--r-- 1 matoken matoken 0 1月 1 9999999 9999999 -rw-r--r-- 1 matoken matoken 0 1月 1 99999999 99999999 -rw-r--r-- 1 matoken matoken 0 1月 1 999999999 999999999 28 / 29

Slide 29

Slide 29 text

奥付 奥付 発表 発表者 利用ソフトウェア ライセンス 小江戸らぐ 8月のオフな集まり(第241回) Kenichiro Matohara(matoken) Asciidoctor Reveal.js CC BY 4.0 29 / 29