RHEL8 上的 BTRFS - 編譯核心模組或使使用者空間工具工作
語境
我最近安裝了 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/profileand
/root/.bash_profile, but neither of them seem to get sourced automatically when using
sudoor 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)
感謝您閱讀到這裡!任何幫助表示讚賞。
在評論中,@MichaelHampton 的回答奏效了。
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 :)