首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于RHEL8的BTRFS -编译内核模块或使用户空间工具工作

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

Server Fault用户
提问于 2021-09-27 01:32:18
回答 1查看 1.6K关注 0票数 1

上下文

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

不幸的是,我在BTRFS RAID10中有4个磁盘。我的其他磁盘上没有足够的空间来保存BTRFS磁盘上的数据,所以在从USB驱动器引导时将所有数据复制到其他地方是不可能的。

我有我的第一个问题,然后一些后续的问题,关于我采取的方法失败了。尽管我很好奇,如果你对这个问题的任何部分有答案的话,你可以把注意力放在“如何让BTRFS工作”这个问题上。

问题1

  1. 是否有一种(相对)简单的方法让BTRFS在RHEL8上工作?

用户空间btrfs-progs

我第一次尝试使用以下方法编译和安装btrfs-progs

代码语言:javascript
复制
# 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

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

代码语言:javascript
复制
$ 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。我添加了/etc/profileand/root/.bash_profile, but neither of them seem to get sourced automatically when using sudo export PATH+=":/usr/local/bin" to sudo su` `。

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

代码语言:javascript
复制
$ 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命令似乎有效:

代码语言:javascript
复制
$ 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. 默认情况下,如何让sudosudo su/usr/local/bin置于其路径中?

BTRFS内核模块

我想知道编译内核模块是否更好,但由于几乎没有内核黑客的经验,所以情况很糟。

似乎我需要在内核配置中设置CONFIG_BTRFS_FS=m以启动。它目前不在那里,我似乎还记得在menuconfig中能够做到这一点。

代码语言:javascript
复制
$ grep "BTRFS" /boot/config-4.18.0-305.19.1.el8_4.x86_64 
# CONFIG_BTRFS_FS is not set

RHEL文档提到了如何加载内核模块等,但没有提到如何构建它们。我咨询了archwiki,并尝试从Red站点下载RHEL8内核。RHEL8的下载页面有一个带有20G .iso文件的“源代码”选项卡。我下载了它,挂载了它,发现里面塞满了.rpm文件,看起来一点也不像linux内核源代码回购。我有点迷路了。

然后我去了/usr/src/kernels/,初始化了一个git,因为害怕我会破坏一些重要的东西,然后继续尝试如何构建内核模块或在menuconfig中更改内容。

代码语言:javascript
复制
$ 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的支持,互联网暗示我可能需要elfutils-libelf-devel,但我似乎已经有了。

对于funzies,我尝试用clanggcc-toolset-10构建它,但两者都有相同的错误。

问题5

  • 知道为什么是Compiler lacks asm-goto support吗?
  • 在如何构建内核模块/补丁内核/修改系统内核方面,有什么好的资源?

系统信息

代码语言:javascript
复制
$ 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)

谢谢你读了这么多!任何帮助都是非常感谢的。

EN

回答 1

Server Fault用户

回答已采纳

发布于 2021-09-27 05:34:20

在评论中,迈克尔·汉普顿的回答奏效了。

我从ELrepo中添加了这样的C1

代码语言:javascript
复制
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

请注意,我已经构建了用户空间工具btrfs-progs,并在上面的问题中概述了构建步骤。如果您是从谷歌来到这里的,那么除了内核模块之外,您还需要安装btrfs-progs

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

代码语言:javascript
复制
$ 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 :)
票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1078718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档