LeavaTailの日記

LeavaTailの日記

Linuxエンジニアを目指した技術者の備忘録

Buildroot で作成した ARM64環境で xfstests を実行する

概要

xfstestsは複数のパッケージと依存関係があるが、Buildrootを使うことで容易に設定することができる。
Buildrootですでに提供されているパッケージと、独自で修正したものを利用してxfstestsを実行できる環境を作成した。

Buildrootの修正については次のブランチにコミットしてある。

github.com

はじめに

xfstestsはファイルシステム回帰テストのテストスイートである。 xfstestsでは、Linuxファイルシステム(xfs, ext2, ext4, cifs, btrfs, f2fs, reiserfs, gfs, jfs, udf, nfs, and tmpfs)でも使用することができ、多くのLinuxファイルシステムを開発しているメンテナは、本流にマージする前にxfstestsのテストを実施している。

一方で、BuildRootは、ビルド環境・実行環境を構築するツールである。
このBuildrootでは、パッケージの追加やユーザランドのカスタマイズがすることができる。

そこで、xfstestsを実行するために必要な環境をBuildrootで作成する手順を確認してみる。

実験環境

本記事で使用した開発用PC (Host PC)の構成は次の通りとなっている。

環境 概要
CPU AMD Ryzen 3 3300X
RAM DDR4-2666 16GB ×2
Host OS Ubuntu Desktop 22.04.1
kernel v5.15.0-56-generic
Storage SL-MG5
File-System ext4
Buildroot 2022.11
xfstests v2022.11.27

開発用PC には、Buildrootで構築した開発環境 (Buildenv) と テスト実施環境 (Targetenv) があり、virtio-scsiでストレージデバイスとつながっている。

実行環境の概略図

aarch64(virt) のNFSroot実行環境を構築する

  1. テスト用のストレージの準備 (このストレージ内のデータは消去されるので注意)

     leava@kbuild:/work$ export TARGET_DEVICE=/dev/disk/by-id/usb-Sony_Storage_C2JBB2040599-0:0
     leava@kbuild:/work$ sudo parted ${TARGET_DEVICE} --script \
                         'mklabel gpt mkpart primary 0% 25% mkpart primary 25% 50% mkpart primary 50% 75% mkpart primary 75% 100% print quit'
    
  2. ホスト環境に nfsd を設定する

     leava@kbuild:/work$ export NFSROOT="/srv/nfsroot/arm64/buildroot"
     leava@kbuild:/work$ sudo exportfs -av
     leava@kbuild:/work$ exporting 127.0.0.1:/srv/nfsroot
     leava@kbuild:/work$ sudo mkdir -p ${NFSROOT}
    
  3. Buildrootを入手する。

     leava@kbuild:/work$ git clone https://github.com/buildroot/buildroot.git
     leava@kbuild:/work$ cd buildroot
     leava@kbuild:/work/buildroot$ export BUILDROOT_DIR="/work/buildroot"
     leava@kbuild:/work/buildroot$ git checkout 2022.11
    
  4. Buildrootのデフォルトの設定を使用する。

     leava@kbuild:/work/buildroot$ make qemu_aarch64_virt_defconfig
    
  5. Buildrootの設定からユーザランドを構築する。

     leava@kbuild:/work/buildroot$ make
     leava@kbuild:/work/buildroot$ cd ..
    
  6. 生成されたルファイルシステムを展開する

     leava@kbuild:/work$ sudo tar xf buildroot/output/images/rootfs.tar.xz -C /srv/nfsroot/arm64/buildroot
    
  7. aarch64(virt)の環境を起動させるスクリプトを用意する。

// 1:
#!/bin/sh
(
BINARIES_DIR="${BUILDROOT_DIR}/output/images/"
TARGET_ROOTFS="/dev/nfs"
EXTRA_CMDLINE="nfsroot=${NFSROOT},vers=3,tcp ip=on"
CMDLINE="console=ttyAMA0 rootwait root=${TARGET_ROOTFS} rw ${EXTRA_CMDLINE}"
cd ${BINARIES_DIR}

if [ "${1}" = "serial-only" ]; then
    EXTRA_ARGS='-nographic'
else
    EXTRA_ARGS=''
fi

export PATH="${BUILDROOT_DIR}/output/host/bin:${PATH}"
exec qemu-system-aarch64 \
        -M virt \
        -cpu cortex-a53 \
        -smp 4 \
        -m 4096 \
        -kernel Image \
        -append "${CMDLINE}" \
        -device virtio-scsi-pci,id=scsi0 \
        -device scsi-hd,drive=drive0,bus=scsi0.0,channel=0,scsi-id=0,lun=0 \
        -drive file=${TARGET_DEVICE}"-part1",if=none,format=raw,id=drive0 \
        -device scsi-hd,drive=drive1,bus=scsi0.0,channel=0,scsi-id=1,lun=0 \
        -drive file=${TARGET_DEVICE}"-part2",if=none,format=raw,id=drive1 \
        -device scsi-hd,drive=drive2,bus=scsi0.0,channel=0,scsi-id=2,lun=0 \
        -drive file=${TARGET_DEVICE}"-part3",if=none,format=raw,id=drive2 \
        -device scsi-hd,drive=drive3,bus=scsi0.0,channel=0,scsi-id=3,lun=0 \
        -drive file=${TARGET_DEVICE}"-part4",if=none,format=raw,id=drive3 \
        ${EXTRA_ARGS} -s
)

このファイルをPATHの通っているディレクトリに配置しておき、実行権限もつけておく。

xfstestsのビルドに向けてのセットアップ

前章で作成したビルド環境・ターゲットファイルシステムでは、xfstestsをビルド・テスト実行することができない。
そこで、ビルドや実行に必要なライブラリ・バイナリをインストールしていく。

ただし、xfsprogsのライブラリに関しては、既存のBuildRootではインストールすることができないため、修正を加える必要がある。

Buildrootのパッケージビルド設定を新規に追加する

xfstestsをビルドするためには、xfsprogs開発用ライブラリがビルド環境にインストールされている必要がある。
ただし、既存のBuildrootは、ターゲットファイルシステムにxfsprogsパッケージのビルド設定のみ用意されている。 (ライブラリのインストールはされない)

そこで、既存のxfsprogsのビルド設定をコピーして新規に libxfsprogsとしてビルド設定を作成していく。

  1. 既存のxfsprofsのビルド設定をコピーする。

     leava@kbuild:/work$ cd ${BUILDROOT_DIR}
     leava@kbuild:/work/buildroot$ cp -r package/xfsprogs/ package/libxfsprogs
    
  2. 変数名XFSPROGSLIBXFSPROGSに変更する。

     leava@kbuild:/work/buildroot$ sed -i 's/XFSPROGS_/LIBXFSPROGS_/gI' package/libxfsprogs/Config.in
     leava@kbuild:/work/buildroot$ sed -i 's/XFSPROGS_/LIBXFSPROGS_/gI' package/libxfsprogs/xfsprogs.mk
    
  3. ファイル名 xfsprogs.mklibxfsprogs.mkに変更する

     leava@kbuild:/work/buildroot$ mv package/libxfsprogs/xfsprogs.mk package/libxfsprogs/libxfsprogs.mk
    
  4. libxfsprogsのビルド設定を読み込むように変更する。

     leava@kbuild:/work/buildroot$ cat << EOF >> package/Config.in
     menu "For xfstests library"
    
             source "package/libxfsprogs/Config.in"
    
     endmenu
     EOF
    
  5. ライブラリをビルド環境にインストールするように更新する

     leava@kbuild:/work/buildroot$ cat << EOF >> package/libxfsprogs/libxfsprogs.mk
     LIBXFSPROGS_INSTALL_STAGING = YES
     LIBXFSPROGS_INSTALL_TARGET = NO
     define LIBXFSPROGS_INSTALL_STAGING_CMDS
             \$(TARGET_MAKE_ENV) \$(MAKE) -C \$(@D) DIST_ROOT=\$(STAGING_DIR) install; \
             \$(TARGET_MAKE_ENV) \$(MAKE) -C \$(@D) DIST_ROOT=\$(STAGING_DIR) install-dev
     endef
     EOF
    

これにより、make menuconfigFor xfstests libraryのセクションが追加される。
このセクションにある xfsprogsを有効にすることで、xfsprogs開発ライブラリがビルド環境にインストールされる。

Buildrootの設定をアップデートする

xfsprogs開発ライブラリ以外にもxfstestsをビルドするために必要なライブラリを追加する。

  1. xfstestsに必要なパッケージをBuildrootで生成するようにconfigを修正する。

     leava@kbuild:/work/buildroot$ make menuconfig
    
     Toolchain  --->
        C library (glibc)  --->
      Target packages  --->
        Libraries  --->
          Other 
            [*]   liburcu
          Text and terminal handling  --->
            [*] inih
        System tools  --->
          [*] acl
          [*] util-linux  ---> 
            [*]   libblkid
            [*]   libuuid
      For xfstests  ---> 
        [*] xfsprogs
    
  2. Buildrootで再度ビルドし、ビルド環境をアップデートする

     leava@kbuild:/work/buildroot$ make
    
  3. 開発用ライブラリが期待通りインストールされているか確認する

     leava@kbuild:/work/buildroot$ ls output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libacl.la output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/*.la
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libacl.la          output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libpcre2-posix.la
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libacl.la          output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libtirpc.la
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libattr.la         output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/liburcu-bp.la
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libblkid.la        output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/liburcu-cds.la
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libf2fs.la         output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/liburcu-common.la
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libf2fs_format.la  output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/liburcu-mb.la
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libgdbm.la         output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/liburcu-memb.la
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libhandle.la       output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/liburcu-qsbr.la
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libkmod.la         output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/liburcu-signal.la
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/liblzma.la         output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/liburcu.la
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libpcre2-8.la      output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libuuid.la     
    
     leava@kbuild:/work/buildroot$ ls output/host/aarch64-buildroot-linux-gnu/sysroot/usr/include/xfs/xfs.h
     output/host/aarch64-buildroot-linux-gnu/sysroot/usr/include/xfs/xfs.h
    

これによって、sysroot以下に/usr/lib/libacl.la, /usr/lib/libuuid.la, /usr/include/xfs/xfs.hが追加される。

xfstestsのテスト実行に向けてのセットアップ

ここまででxfstestsはビルドできるようになったが、大半のテストはパッケージ不足によりskipされてしまう。
そこで、ビルド環境とターゲットファイルシステムに必要なパッケージを追加でインストールしていく。

xfstestsのビルドに必要なライブラリをインストールする

    leava@kbuild:/work/buildroot$ make menuconfig

    Target packages  --->
      Libraries
        Compressors and decompressors 
          [*] lz4
          [*]   install programs
        Database
          [*] gdbm
        Hardware handling
          [*] libaio 
        Other 
          [*] libcap
          [*]   install tools     
          [*] liburing
        Security
          [*] libselinux
Buildrootの既存パッケージのビルド設定を修正する

xfstestsの一部のテストはndbm開発ライブラリが必要になる。
このライブラリは、GNU dbm (gdbm)パッケージが互換性を持っており、BuildRootはこのパッケージのビルドを用意している。

しかし、gdbmをビルドするとき(./configure) に、--enable-libgdbm-compat を指定していないと、このライブラリを用意されず、BuildRootのデフォルトの設定ではこれが提供されていない。

  1. gdbmパッケージのビルド設定を修正する

     leava@kbuild:/work/buildroot$ echo "GDBM_CONF_OPTS = --enable-libgdbm-compat" >> package/gdbm/gdbm.mk
    

これによって、sysroot以下に/usr/include/ndbm.hが追加される。

xfstestsの必須パッケージをターゲットファイルシステムにインストールする

    leava@kbuild:/work/buildroot$ make menuconfig

    Target packages  --->
      [*]   Show packages that are also provided by busybox
      Development tools
        [*] grep
      Filesystem and flash utilities
        [*] xfsprogs
      Interpreter languages and scripting
        [*] perl
      Shell and utilities
        [*] bash 
      System tools  --->
        [*] coreutils
        [*] kmod
        [*]   kmod utilities
        -*- util-linux  --->
          [*]   basic set

xfstestsの推奨パッケージをターゲットファイルシステムにインストールする

Buildrootのパッケージビルド設定を新規に追加する

xfstestsでは、fs-verityを利用するテストが存在している。 ただし、既存のBuildrootは、ターゲットファイルシステムにfsverity-utilsパッケージのビルド設定は用意されていない。

そこで、新規に fsverity-utils のビルド設定を作成していく。

  1. fsverity-utilsのディレクトリを追加する

     leava@kbuild:/work/buildroot$ mkdir package/fsverity-utils
    
  2. libxfsprogsのビルド設定を読み込むように変更する。

     leava@kbuild:/work/buildroot$ cat << EOF > package/fsverity-utils/Config.in
     config BR2_PACKAGE_FSVERITY_UTILS
             bool "fsverity-utils"
             select BR2_PACKAGE_OPENSSL
             help
               A set of userspace utilities for fs-verity.
    
               git://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/fsverity-utils.git
     EOF
    
  3. fsverity-utilsのビルド設定を読み込むように変更する。

     leava@kbuild:/work/buildroot$ sed -i -e 's/fxload/source "package\/fsverity-utils\/Config.in/g" package/Config.in
    
  4. libxfsprogsのビルド設定を読み込むように変更する。

     leava@kbuild:/work/buildroot$ cat << EOF > package/fsverity-utils/fsverity-utils.hash
     cat package/fsverity-utils/fsverity-utils.hash
     # Locally computed
     sha256  830e38ec081ef8171eb210461cf8bee8a707c7c60f9018a4b567af145a510884  fsverity-utils-1.5.tar.gz
     sha256  b03d4d3e8cdb7011013f8e954d4b0b72d649b8f9c60298488d0df03f753e8524  README.md
     EOF
    
  5. ライブラリをビルド環境にインストールするように更新する

     leava@kbuild:/work/buildroot$ cat << EOF >> package/fsverity-utils/fsverity-utils.mk
     ################################################################################
     #
     # fsverity-utils
     #
     ################################################################################
    
     FSVERITY_UTILS_VERSION = 1.5
     FSVERITY_UTILS_SITE = https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/fsverity-utils.git/snapshot
     FSVERITY_UTILS_DEPENDENCIES = libopenssl
     FSVERITY_UTILS_LICENSE = Copyright 2019 the fsverity-utils authors
     FSVERITY_UTILS_LICENSE_FILES = LICENSE
    
     #PKG_CONFIG_PATH="$(STAGING_DIR)/usr/lib/pkgconfig"
    
     FSVERITY_UTILS_ENV = \
                     PKGCONF=$(HOST_DIR)/bin/pkg-config \
                     CC=$(HOST_DIR)/bin/aarch64-buildroot-linux-gnu-gcc \
                     GCC=$(HOST_DIR)/bin/aarch64-buildroot-linux-gnu-gcc
    
     define FSVERITY_UTILS_BUILD_CMDS
             $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) $(FSVERITY_UTILS_ENV)
     endef
    
     define FSVERITY_UTILS_INSTALL_TARGET_CMDS
             $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) DESTDIR="$(TARGET_DIR)" $(FSVERITY_UTILS_ENV) install
     endef
    
     $(eval $(generic-package))
     EOF
    
Buildrootの設定をアップデートする
    leava@kbuild:/work/buildroot$ make menuconfig

    Toolchain
      [*] Install glibc utilities
    Target packages  --->
      Compressors and decompressors 
        [*] xz-utils
      Debugging, profiling and benchmark  --->
        [*] fio 
      Development tools
        [*] gawk
      Filesystem and flash utilities
        [*] e2fsprogs  --->
          [*]   debugfs 
          [*]   e2image
          [*]   e4defrag
          [*]   resize2fs
      Hardware handling
          [*] fsverity-utils
          [*] lvm2 & device mapper            
      System tools  --->
        [*] keyutils
        [*] quota
        [*] quotatool
        -*- util-linux  --->
          [*]   losetup

Buildrootのターゲットファイルシステムのセットアップ

xfstestsには、実行環境に依存するテストも存在する。
その中にある「cgroup2のマウント」と「ユーザアカウントの追加」をBuildrootで生成するターゲットファイルシステムに反映させる。

Buildrootのターゲットファイルシステムのオーバーレイ

Buildrootには、ターゲットファイルシステムの内容の一部を上書きする仕組みとして「オーバーレイ」がある。
ここでは、オーバーレイの仕組みで/etc/fstabを書き換えることで、cgropu2をマウントするように変更する。

また、xfstestsで必要となるマウントポイント /mnt/test/mnt/scratch もオーバーレイの仕組みを用いて作成する。

  1. aarch64(virt)用のoverlayディレクトリを作成する

     leava@kbuild:/work/buildroot$ mkdir -p board/qemu/aarch64-virt/rootfs_overlay
     leava@kbuild:/work/buildroot$ mkdir -p board/qemu/aarch64-virt/rootfs_overlay/etc
    
  2. ターゲットファイルシステム/etc/fstabを自前の/etc/fstabに置き換える

     leava@kbuild:/work/buildroot$ cat << EOF > board/qemu/aarch64-virt/rootfs_overlay/etc/fstab
     # <file system> <mount pt>      <type>  <options>       <dump>  <pass>
     /dev/root       /               ext2    rw,noauto       0       1
     proc            /proc           proc    defaults        0       0
     devpts          /dev/pts        devpts  defaults,gid=5,mode=620,ptmxmode=0666   0       0
     tmpfs           /dev/shm        tmpfs   mode=0777       0       0
     tmpfs           /tmp            tmpfs   mode=1777       0       0
     tmpfs           /run            tmpfs   mode=0755,nosuid,nodev  0       0
     sysfs           /sys            sysfs   defaults        0       0
     none            /sys/fs/selinux selinuxfs       noauto  0       0
     none            /sys/fs/cgroup  cgroup2 defaults        0       0        
    
  3. ターゲットファイルシステム/mnt/mnt/test/mnt/scratchを追加する

     leava@kbuild:/work/buildroot$ mkdir -p board/qemu/aarch64-virt/rootfs_overlay/mnt/test
     leava@kbuild:/work/buildroot$ mkdir -p board/qemu/aarch64-virt/rootfs_overlay/mnt/scratch
    
  4. overlayのパスを指定する

     leava@kbuild:/work/buildroot$ make menuconfig
    
     System configuration  ---> 
     (board/qemu/aarch64-virt/rootfs_overlay) Root filesystem overlay directories
    
Buildrootのユーザアカウントの追加

Buildrootには、makeusers文法の則ったファイルを配置することで、ユーザを追加することができる。
ここでは、テストで必要となるfsgqa, 123456-fsgqa, fsgqa2ユーザを追加する。

  1. aarch64(virt)用のoverlayディレクトリを作成する

     leava@kbuild:/work/buildroot$ mkdir -p board/qemu/aarch64-virt
    
  2. ターゲットファイルシステム/etc/fstabを自前の/etc/fstabに置き換える

     leava@kbuild:/work/buildroot$ cat << EOF > board/qemu/aarch64-virt/users.txt
     fsgqa -1 fsgqa -1 = /home/fsgqa /bin/sh - xfstests User1
     123456-fsgqa -1 123456-fsgqa -1 = - /bin/sh - xfstests User2
     fsgqa2 -1 fsgqa2 -1 = /home/fsgqa2 /bin/sh - xfstests User3        
    
  3. overlayのパスを指定する

     leava@kbuild:/work/buildroot$ make menuconfig
    
     System configuration  ---> 
     (board/qemu/aarch64-virt/users.txt) Path to the users tables
    
NFSrootのアップデート

xfstestsを実行できるビルド環境とターゲットファイルシステムが生成できたので、NFSrootの環境をアップデートする。

  1. 以前のターゲットファイルシステムを退避させる

     leava@kbuild:/work/buildroot$ mv ${NFSROOT} ${NFSROOT}`date +%Y%m%d%H%M`
     leava@kbuild:/work/buildroot$ mkdir ${NFSROOT}
    
  2. 新規のターゲットファイルシステムを展開する

      leava@kbuild:/work/buildroot$ sudo tar xf output/images/rootfs.tar.xz -C ${NFSROOT}
    
  3. xfstestsの設定をアップデートする

     leava@kbuild:/work/buildroot$ cat << EOF > board/qemu/aarch64-virt/users.txt
     export TEST_DEV=/dev/sda
     export TEST_DIR=/mnt/test
     export SCRATCH_DEV=/dev/sdb
     export SCRATCH_MNT=/mnt/scratch
     export FSTYP=ext4
     export LOGWRITES_DEV=/dev/sdc
     export SCRATCH_LOGDEV=/dev/sdd
     export USE_EXTERNAL=yes
    

xfstestsをクロスコンパイルする

Buildrootで生成したビルド環境を使ってxfstestsのビルドを実施する。

  1. xfstestsのgit repositoryを開発PCにcloneする。

     leava@kbuild:/work/buildroot$ cd ..
     leava@kbuild:/work$ git clone git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git
     leava@kbuild:/work$ cd xfstests-dev
    
  2. ロスコンパイルのために環境変数を設定する。

     leava@kbuild:/work/xfstests-dev$ export CROSSENV="/work/buildroot/output/host"
     leava@kbuild:/work/xfstests-dev$ export CROSS_COMPILE=aarch64-buildroot-linux-
     leava@kbuild:/work/xfstests-dev$ export SDKTARGETSYSROOT="${CROSSENV}/${CROSS_COMPILE}gnu/sysroot"
     leava@kbuild:/work/xfstests-dev$ export PATH="${CROSSENV}/bin:${CROSSENV}/sbin:$PATH"
     leava@kbuild:/work/xfstests-dev$ export AR="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-gcc-ar"
     leava@kbuild:/work/xfstests-dev$ export AS="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-as"
     leava@kbuild:/work/xfstests-dev$ export LD="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-ld"
     leava@kbuild:/work/xfstests-dev$ export NM="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-gcc-nm"
     leava@kbuild:/work/xfstests-dev$ export CC="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-gcc"
     leava@kbuild:/work/xfstests-dev$ export GCC="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-gcc"
     leava@kbuild:/work/xfstests-dev$ export CPP="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-cpp"
     leava@kbuild:/work/xfstests-dev$ export CXX="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-g++"
     leava@kbuild:/work/xfstests-dev$ export FC="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-gfortran"
     leava@kbuild:/work/xfstests-dev$ export F77="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-gfortran"
     leava@kbuild:/work/xfstests-dev$ export RANLIB="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-gcc-ranlib"
     leava@kbuild:/work/xfstests-dev$ export READELF="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-readelf"
     leava@kbuild:/work/xfstests-dev$ export STRIP="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-strip"
     leava@kbuild:/work/xfstests-dev$ export OBJCOPY="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-objcopy"
     leava@kbuild:/work/xfstests-dev$ export OBJDUMP="${CROSSENV}/bin/aarch64-buildroot-linux-gnu-objdump"
     leava@kbuild:/work/xfstests-dev$ export PKG_CONFIG="${CROSSENV}/bin/pkg-config"
     leava@kbuild:/work/xfstests-dev$ export PKGCONF="${CROSSENV}/bin/pkg-config"
    
  3. xfstestsをビルド環境のセットアップする

     leava@kbuild:/work/xfstests-dev$ ./configure \
                               --target=aarch64-buildroot-linux-gnu \
                               --host=aarch64-buildroot-linux-gnu \
                               --build=x86_64-pc-linux-gnu \
                               --prefix=${SDKTARGETSYSROOT}/usr \
                               --exec-prefix=${NFSROOT} \
                               --program-prefix=""\
                               INSTALL_USER=root \
                               INSTALL_GROUP=root \
                               --enable-static
    
  4. xfstestsをクロスビルドする

     leava@kbuild:/work/xfstests-dev$ make
    
  5. ターゲットファイルシステム (NFSroot) 以下に xfstestsをインストールする

     leava@kbuild:/work/xfstests-dev$ make install
    

テスト実施

xfstestsはターゲットファイルシステム/xfstestsにインストールされている。
その環境で ./check スクリプトを実行することでファイルシステムのテストが実施される。

  1. Buildrootで作成したテスト実施環境を起動させる

     leava@kbuild:/work/xfstests-dev$ sudo start-qemu-arm64.sh serial-only
    
  2. インストールしたxfstestsディレクトリに移動する

     buildroot login: root
     # cd /xfstests/
    
  3. テストを実施する

     # ./check -g quick
    

ただし、いくつかのテスト(ext4/058, ext4/059など) は BUG_ON で例外が発生するため注意。

おわりに

本記事では、xfstestsをビルド・実行できる環境をBuildrootで生成した。
ただし、いくつかの設定 (パッケージの追加やターゲット環境の修正) は Buildrootのデフォルトでは対応できなかったため、Buildrootに修正を加えた。 (下記 repository を参照)

github.com

変更履歴

  • 2022/12/18: 記事公開

参考文献