RHEL8 上的 BTRFS - 编译内核模块或使用户空间工具工作

RHEL8 上的 BTRFS - 编译内核模块或使用户空间工具工作

语境

我最近安装了 RHEL 8,但没有意识到它不再支持 BTRFS

不幸的是,我有 4 个 BTRFS RAID10 磁盘。我的其他磁盘上没有足够的空间来保存 BTRFS 磁盘上的数据,因此从 USB 驱动器启动时将其全部复制到其他地方是不可行的。

我有一个初始问题,然后是一些关于我采取的失败方法的后续问题。请随意关注这个问题的“如何让 BTRFS 工作”部分,尽管如果您对其中任何部分有答案,我很想知道其他问题。

问题 1

  1. 有没有一种(相对)简单的方法可以让 BTRFS 在 RHEL8 上运行?

用户空间 btrfs-progs

我第一次尝试完成这项工作是使用btrfs-progs以下命令进行编译和安装:

# Install deps
sudo dnf install libuuid-devel libblkid-devel lzo-devel zlib-devel libzstd-devel e2fsprogs-devel e2fsprogs-libs e2fsprogs libgcrypt-devel libsodium-devel libattr-devel
# Install deps for doc gen
sudo dnf install asciidoc xmlto source-highlight

# Shallow-clone latest release
git clone --depth 1 --branch v5.14.1 https://github.com/kdave/btrfs-progs.git
cd btrfs-progs
git switch -c v5.14.1

# Build
#   --disable-zoned since that feature needs kernel >=5.10
export CFLAGS="-O3 -pipe -frecord-gcc-switches -mtune=native -march=native"
export CPPFLAGS=$CFLAGS
export SODIUM_CFLAGS=$CFLAGS
export ZSTD_CFLAGS=$CFLAGS
export ZLIB_CFLAGS=$CFLAGS
export UUID_CFLAGS=$CFLAGS
export PYTHON_CFLAGS=$CFLAGS

./autogen.sh
./configure --with-crypto=libsodium --disable-zoned
make -j12
sudo make install

它似乎安装正确并且我的用户可以访问:

$ which btrfs
/usr/local/bin/btrfs

$ ls -1 /usr/local/bin/ | grep btrfs
btrfs
btrfsck
btrfs-convert
btrfs-find-root
btrfs-image
btrfs-map-logical
btrfs-select-super
btrfstune
fsck.btrfs
mkfs.btrfs

$ btrfs version
btrfs-progs v5.14.1 

/usr/local/bin但是,root 显然默认路径中没有这个。我添加了export PATH+=":/usr/local/bin" to/etc/profile and/root/.bash_profile , but neither of them seem to get sourced automatically when usingsudo or when dropping into a root shell withsudo su`。

当指定二进制文件的完整路径时,它抱怨无法打开/dev/btrfs-control。查询我的本地搜索引擎,有人建议需要 udev,但它已经安装了(可能配置错误?)

$ sudo btrfs version
sudo: btrfs: command not found

$ sudo /usr/local/bin/btrfs device scan
Scanning for Btrfs filesystems
WARNING: failed to open /dev/btrfs-control, skipping device registration: No such file or directory
WARNING: failed to open /dev/btrfs-control, skipping device registration: No such file or directory
WARNING: failed to open /dev/btrfs-control, skipping device registration: No such file or directory
WARNING: failed to open /dev/btrfs-control, skipping device registration: No such file or directory
ERROR: there were 4 errors while registering devices

其他 BTRFS 命令似乎有效:

$ sudo /usr/local/bin/btrfs filesystem show /dev/sda
Label: 'wdred'  uuid: aaaa-bbbb-cccc-dddd-eeee
    Total devices 4 FS bytes used 2.13TiB
    devid    1 size 5.46TiB used 1.07TiB path /dev/sda
    devid    2 size 5.46TiB used 1.07TiB path /dev/sdc
    devid    3 size 5.46TiB used 1.07TiB path /dev/sdb
    devid    4 size 5.46TiB used 1.07TiB path /dev/sdd

但是,由于出现上述错误,我一直不敢安装这些分区或对其执行任何操作,因为担心它缺少的组件会导致我的数据被破坏。

问题 2、3、4

  1. 出现上述错误时尝试使用 btrfs 挂载磁盘是否安全?
  2. /dev/btrfs-control上的错误是怎么回事btrfs device scan
  3. 我怎样才能获取sudo并默认sudo su拥有其路径?/usr/local/bin

BTRFS 内核模块

我想知道编译内核模块是否更好,但由于几乎没有内核破解经验,所以结果很糟糕。

似乎我需要CONFIG_BTRFS_FS=m在内核配置中进行设置才能启动。目前它不在那里,我似乎记得可以在 中执行此操作menuconfig

$ grep "BTRFS" /boot/config-4.18.0-305.19.1.el8_4.x86_64 
# CONFIG_BTRFS_FS is not set

RHEL 文档提到了如何加载内核模块等,但没有提到如何构建它们。我查阅了 archwiki,并尝试从 Red Hat 网站下载 RHEL8 内核。RHEL8 的下载页面有一个“源”选项卡,其中包含一个 20G 的 .iso 文件。我下载并挂载了它,发现它塞满了 .rpm 文件,看起来与 Linux 内核源代码库完全不同。我有点迷茫。

然后我去了/usr/src/kernels/,初始化了一个 git repo,因为担心我会破坏一些重要的东西,并继续尝试弄清楚如何构建内核模块或更改菜单配置中的内容。

$ cd /usr/src/kernels/4.18.0-305.19.1.el8_4.x86_64
$ sudo su
# git init
# git add -A
# git commit -m "Unmodified kernel"

# make mrproper
  HOSTCC  scripts/basic/bin2c
scripts/kconfig/conf  --syncconfig Kconfig
arch/x86/Makefile:184: *** Compiler lacks asm-goto support..  Stop.
make: *** [Makefile:1361: _clean_arch/x86] Error 2

缺少 asm-goto 支持,互联网建议我可能需要,elfutils-libelf-devel但我似乎已经有了。

clang为了好玩,我尝试用和用构建它gcc-toolset-10,但两者都出现了相同的错误。

问题 5

  • 知道原因吗Compiler lacks asm-goto support
  • 关于如何构建内核模块/修补内核/修改系统内核的优质资源有哪些?

系统信息

$ uname -a
Linux rhel 4.18.0-305.19.1.el8_4.x86_64 #1 SMP Tue Sep 7 07:07:31 EDT 2021 x86_64 x86_64 x86_64 GNU/Linux

$ gcc --version
gcc (GCC) 8.4.1 20200928 (Red Hat 8.4.1-1)


$ scl run gcc-toolset-10 'gcc --version'
gcc (GCC) 10.2.1 20201112 (Red Hat 10.2.1-8)

$ clang --version
clang version 11.0.0 (Red Hat 11.0.0-1.module+el8.4.0+8598+a071fcd5)

感谢您阅读到这里!任何帮助都非常感谢。

答案1

在评论中,@MichaelHampton 的回答有效。

我补充道kernel-ml埃雷波像这样:

sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
sudo yum --enablerepo=elrepo-kernel install kernel-ml

请注意,我已经构建了用户空间工具,并在上面的问题中概述了构建步骤。如果您是从 Google 过来的,则除了内核模块之外,btrfs-progs您还需要安装其他内容。btrfs-progs

然后重新启动,检查我是否正在运行主线内核,并且能够使用 BTRFS 挂载我的磁盘并读取其数据。

$ sudo reboot

$ uname -a
Linux rhel 5.14.8-1.el8.elrepo.x86_64 #1 SMP Sat Sep 25 10:32:52 EDT 2021 x86_64 x86_64 x86_64 GNU/Linux

$ sudo mount UUID=zzz -o defaults,noatime /mnt/hdd

$ ls /mnt/hdd
all my files :)

相关内容