Redhat

RHEL8 上的 BTRFS - 編譯核心模組或使使用者空間工具工作

  • September 29, 2021

語境

我最近安裝了 RHEL 8 卻沒有意識到它不再支持 BTRFS

不幸的是,我在 BTRFS RAID10 中有 4 個磁碟。我的其他磁碟上沒有足夠的空間來保存 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 

但是,預設情況下,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 withsudo 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

  1. 鑑於上述錯誤,嘗試使用 btrfs 掛載磁碟是否安全?
  2. 上的/dev/btrfs-control錯誤是btrfs device scan怎麼回事?
  3. 預設情況下,我怎樣才能獲得sudosudo 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)

感謝您閱讀到這裡!任何幫助表示讚賞。

在評論中,@MichaelHampton 的回答奏效了。

我像這樣kernel-mlELrepo添加:

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如果您是從 Google 來的,除了核心模組之外,您還需要安裝。

然後重新啟動,檢查我是否正在執行主線核心,並且能夠使用 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 :)

引用自:https://serverfault.com/questions/1078718