语境
我最近安装了 RHEL 8 却没有意识到它不再支持 BTRFS。
不幸的是,我在 BTRFS RAID10 中有 4 个磁盘。我的其他磁盘上没有足够的空间来保存 BTRFS 磁盘上的数据,因此在从 USB 驱动器启动时将其全部复制到其他地方是不可能的。
我有我最初的问题,然后是一些关于我采取的方法失败的后续问题。随意只关注这个问题的“如何让 BTRFS 工作”部分,尽管如果你有任何部分的答案,我很想了解其他问题。
问题 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
但是,默认情况下,root 显然没有/usr/local/bin
在其路径中。我添加了export PATH+=":/usr/local/bin" to
/etc/profile and
/root/.bash_profile , but neither of them seem to get sourced automatically when using
sudo or when dropping into a root shell with
sudo su`。
当指定二进制文件的完整路径时,它会抱怨它 can't open /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
- 鉴于上述错误,尝试使用 btrfs 挂载磁盘是否安全?
- 上的
/dev/btrfs-control
错误是btrfs device scan
怎么回事? - 默认情况下,我怎样才能获得
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 文件的“Sources”选项卡。我下载了它,安装了它,发现里面塞满了 .rpm 文件,看起来一点也不像 linux 内核源代码库。我有点失落。
然后我去了/usr/src/kernels/
,初始化了一个 git repo,因为害怕我会破坏一些重要的东西,然后继续试图弄清楚如何构建内核模块或更改 menuconfig 中的内容。
$ 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
,但我似乎已经有了。
对于 funzies,我尝试使用clang
和 with构建它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)
感谢您阅读到这里!任何帮助表示赞赏。