Upgrade to Pro — share decks privately, control downloads, hide ads and more …

XFSのbigtimeを少し試してみた

 XFSのbigtimeを少し試してみた

Kenichiro MATOHARA

August 20, 2022
Tweet

More Decks by Kenichiro MATOHARA

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

  3. 「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

    View Slide

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

    View Slide

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

    View Slide

  6. [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

    View Slide

  7. 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

    View Slide

  8. 現在の安定版の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

    View Slide

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

    View Slide

  10. 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

    View Slide

  11. 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

    View Slide

  12. 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

    View Slide

  13. 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

    View Slide


  14. 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

    View Slide

  15. 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

    View Slide

  16. 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

    View Slide

  17. 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

    View Slide

  18. 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

    View Slide

  19. 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

    View Slide

  20. 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

    View Slide

  21. 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

    View Slide

  22. 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

    View Slide


  23. ディスクが小さいと以下のようなエラーになる.(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

    View Slide

  24. 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

    View Slide

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

    View Slide

  26. 余録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

    View Slide

  27. 余録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

    View Slide

  28. と思ったけどエラーが出るの変
    と思ったけどエラーが出るの変
    だなと別のコマンドを試すとも
    だなと別のコマンドを試すとも
    っと行けた
    っと行けた
    恐らく,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

    View Slide

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

    View Slide