Slide 1

Slide 1 text

XFSのbigtimeを少 XFSのbigtimeを少 し試してみた し試してみた (RHEL9 & ML8.4) (RHEL9 & ML8.4) Kenichiro Matohara(matoken) 1 / 24

Slide 2

Slide 2 text

南隅から参加(鹿児島の右下) お仕事募集 mailto:work@matohara.org Kenichiro Matohara(matoken) Kenichiro Matohara(matoken) https://matoken.org https://matoken.org 2 / 24

Slide 3

Slide 3 text

Linux User Groupによく居ます Linux User Groupによく居ます 東海道らぐ 次回2022-08-27 LILO 次回2022-08-27 小江戸らぐ 次回2022-09-10 鹿児島らぐ 次回2022-09-18 3 / 24

Slide 4

Slide 4 text

「MIRACLE LINUX Users Meetup 「MIRACLE LINUX Users Meetup #4」に参加 #4」に参加 RHEL(Red Hat Enterprise Linux)9の8からの変更点で「XFSが 新機能(bigtime, inobtcount)に対 応、作成時もデフォルトに」というものが 気になったので少し試してみた. RHEL 9が出たけど、MIRACLE LINUX 9はどうなるの! YouTube 4 / 24

Slide 5

Slide 5 text

XFS XFS Silicon Graphics, Inc. がIRIX向けに開発した64bitファイルシ ステム.1994年〜 1999年にLinux版がGPLで公開 2.4.21〜Linux kernelに同梱 RHEL7 から標準FSに 5 / 24

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

bigtaimeの動きを確認 bigtaimeの動きを確認 7 / 24

Slide 8

Slide 8 text

MiracleLinux 8.4 で XFS 作成 MiracleLinux 8.4 で XFS 作成 1 XFS既定値でフォーマット 2 bigtime は無い $ dd if=/dev/zero of=./disk.img bs=1M count=64 $ mkfs.xfs ./disk.img $ xfs_info ./disk.img | grep bigtime $ sudo mount ./disk.img /mnt $ sudo chown `id -u`:`id -g` /mnt 1 2 8 / 24

Slide 9

Slide 9 text

1 2038年12月31日のファイルを作成しようとする 2 2028年01月19日になった $ touch -d '20381231' /mnt/2038 $ ls -lA /mnt 合計 0 -rw-rw-r--. 1 matoken matoken 0 Jan 19 2038 2038 $ stat --format %y /mnt/2038 2038-01-19 12:14:07.000000000 +0900 1 2 9 / 24

Slide 10

Slide 10 text

RHEL 9 で XFS 作成(bigtime=1) RHEL 9 で XFS 作成(bigtime=1) 1 XFS既定値でフォーマット 2 bigtime=1 になっている $ dd if=/dev/zero of=./disk.img bs=1M count=64 $ mkfs.xfs ./disk.img $ xfs_info ./disk.img | grep bigtime = reflink=1 bigtime=1 inobtcount=1 $ sudo mount ./disk.img /mnt $ sudo chown `id -u`:`id -g` /mnt 1 2 10 / 24

Slide 11

Slide 11 text

1 2038年12月31日のファイルを作成 2 2500年12月31日のファイルを作成 3 2038年12月31日になっている 4 2486年07月03日になっている $ touch -d '20381231' /mnt/2038 $ touch -d '25001231' /mnt/2500 $ ls -lA /mnt 合計 0 -rw-r--r--. 1 matoken matoken 0 12月 31 2038 2038 -rw-r--r--. 1 matoken matoken 0 7月 3 2486 2500 $ stat --format %y /mnt/2500 2486-07-03 05:20:24.000000000 +0900 1 2 3 4 11 / 24

Slide 12

Slide 12 text

RHEL 9 で XFS 作成(bigtime=0) RHEL 9 で XFS 作成(bigtime=0) $ sudo mkfs.xfs -f -m bigtime=0 ./disk.img $ xfs_info ./disk.img | grep bigtime = reflink=1 bigtime=0 inobtcount=1 $ sudo mount ./disk.img /mnt $ sudo chown `id -u`:`id -g` /mnt $ touch -d '20381231' /mnt/2038 $ ls -lA /mnt 合計 0 -rw-r--r--. 1 matoken matoken 0 1月 19 2038 2038 $ stat --format %y /mnt/2038 2038-01-19 12:14:07.000000000 +0900 12 / 24

Slide 13

Slide 13 text

bigtime 0→1 bigtime 0→1 1 マウント状態だと失敗 2 アンマウントして 3 bigtime=1 に設定 4 bigtime=1 になっているのを確認 $ sudo xfs_admin -O bigtime=1 ./disk.img : ERROR: The filesystem has valuable metadata changes in a log which needs to be replayed. Mount the filesystem to replay the log, and unmount it before re-running xfs_repair. If you are unable to mount the filesystem, then use the -L option to destroy the log and attempt a repair. Note that destroying the log may cause corruption -- please attempt a mount of the filesystem before doing this. $ sudo umount /mnt $ sudo xfs_admin -O bigtime=1 ./disk.img Running xfs_repair to upgrade filesystem. : done $ xfs_info ./disk.img | grep bigtime = reflink=1 bigtime=1 inobtcount=1 1 2 3 4 13 / 24

Slide 14

Slide 14 text

$ sudo mount ./disk.img /mnt $ sudo chown `id -u`:`id -g` /mnt $ touch -d '20381231' /mnt/2038 $ touch -d '20391231' /mnt/2039 $ touch -d '25001231' /mnt/2500 $ ls -lA /mnt 合計 0 -rw-r--r--. 1 matoken matoken 0 12月 31 2038 2038 -rw-r--r--. 1 matoken matoken 0 12月 31 2039 2039 -rw-r--r--. 1 matoken matoken 0 7月 3 2486 2500 $ stat --format %y /mnt/2500 2486-07-03 05:20:24.000000000 +0900 14 / 24

Slide 15

Slide 15 text

bigtime 1→0 は無理 bigtime 1→0 は無理 $ sudo umount /mnt $ sudo xfs_admin -O bigtime=0 ./disk.img Running xfs_repair to upgrade filesystem. -c bigtime only supports upgrades 15 / 24

Slide 16

Slide 16 text

RHEL 9 で作った XFS を ML 8.4 RHEL 9 で作った XFS を ML 8.4 で利用 で利用 RHEL 9 で bigtime=0 と bigtime=1 のXFS を用意 マウントできない RHEL9$ dd if=/dev/zero of=./rhel9-xfs-bigtime=0.img bs=1M count=64 && mkfs.xfs -m bigtime=0 ./ RHEL9$ dd if=/dev/zero of=./rhel9-xfs-bigtime=1.img bs=1M count=64 && mkfs.xfs -m bigtime=1 ./ RHEL9$ rsync -avzcP ./rhel9-xfs-bigtime\=?.img MIRACLELINUX:~/ ML8.4$ sudo mount ./rhel9-xfs-bigtime\=0.img /mnt mount: /mnt: wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or help ML8.4$ sudo mount ./rhel9-xfs-bigtime\=1.img /mnt mount: /mnt: wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or help 16 / 24

Slide 17

Slide 17 text

bigtime と inobtcount も 0 にする bigtime と inobtcount も 0 にする とマウントできた とマウントできた RHEL9$ mkfs.xfs -m bigtime=0,inobtcount=0 ./rhel9-xfs-bigtime\=0.img RHEL9$ xfs_info ./rhel9-xfs-bigtime\=0.img | grep -E 'bigtime|inobtcount' meta-data=./rhel9-xfs-bigtime=0.img isize=512 agcount=4, agsize=4096 blks = reflink=1 bigtime=0 inobtcount=0 RHEL9$ rsync -avzcP ./rhel9-xfs-bigtime\=0.img MIRACLELINUX:~/ ML8.4$ xfs_info ./rhel9-xfs-bigtime\=0.img | grep -E 'bigtime|inobtcount' ML8.4$ sudo mount ./rhel9-xfs-bigtime\=0.img /mnt ML8.4$ sudo touch -d '20381231' /mnt/2038 ML8.4$ stat --format %y /mnt/2038 2038-01-19 12:14:07.000000000 +0900 17 / 24

Slide 18

Slide 18 text

まとめ まとめ RHEL 9(Linux 5.10)よりXFSのbigtimeで2486年7月までの タイムスタンプに対応 bigtimeが無効なXFSファイルシステムはアンマウントした状態で 有効にすることができる(無効に戻すことはできない) bigtimeが有効なXFSファイルシステムは5.10より前の環境では マウントできない 2038年は結構近い?2486年は今生きている人間が触ることはな さそう? 18 / 24

Slide 19

Slide 19 text

余録1)Debian での XFS bigtime 余録1)Debian での XFS bigtime Debian sid で xfsprogs のchangelogを確認.5.10-rc1から bigtime が使えるようになっている,規定値になったのは5.15.0-rc1 から 現在の安定版のDebian bullseyeから利用可能で,次期リリースの bookwormから規定値になりそう 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) 19 / 24

Slide 20

Slide 20 text

余録2)Debian sid ext4での時間 余録2)Debian sid 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 20 / 24

Slide 21

Slide 21 text

余録3)Debian sid btrfsでの時間 余録3)Debian sid btrfsでの時間 Debian Bullseye(btrfs-progs 5.10.1-2-amd64)では2107 年7月まで,sid(btrfs-progs 5.18.0-3-amd64)では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 21 / 24

Slide 22

Slide 22 text

と思ったけどエラーが出るの変 と思ったけどエラーが出るの変 だなとfaketimeコマンドを試すと だなとfaketimeコマンドを試すと もっと行けた もっと行けた 恐らく,touchコマンドが9999年まで,faketimeコマンドが 999999999年まで $ 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 22 / 24

Slide 23

Slide 23 text

utimeで更に utimeで更に 92233720368年54月77日58分07秒?? $ touch 9999999999 $ utime '999999999912312359.59' '999999999912312359.59' 9999999999 $ stat --format %y ./9999999999 999999999912312359.000000000 $ touch 99999999999 $ utime '9999999999912312359.59' '9999999999912312359.59' 99999999999 $ stat --format %y ./99999999999 9223372036854775807.000000000 23 / 24

Slide 24

Slide 24 text

奥付 奥付 発表 2022-08-26(Fri) 発表者 利用ソフトウェア ライセンス MIRACLE LINUXでやってみた、触ってみた !!LT大会!! Kenichiro Matohara(matoken) Asciidoctor Reveal.js CC BY 4.0 24 / 24