Недавно я установил RHEL 8, не осознавая, что он больше не поддерживает BTRFS .
К сожалению, у меня 4 диска в BTRFS RAID10. У меня недостаточно места на других моих дисках для хранения данных, присутствующих на дисках BTRFS, поэтому копировать все это в другое место при загрузке с USB-накопителя нельзя.
У меня есть мой первоначальный вопрос, а затем несколько дополнительных вопросов относительно неудачных подходов, которые я использовал. Не стесняйтесь просто сосредоточиться на части этой проблемы «как заставить BTRFS работать», хотя мне любопытно узнать о других проблемах, если у вас есть ответы на любую часть этого.
Моя первая попытка выполнить эту работу состояла в том, чтобы скомпилировать и установить 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`.
При указании полного пути к бинарнику жалуется, что не может открыть /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
Однако я боялся монтировать разделы или выполнять какие-либо операции с ними из-за вышеуказанной ошибки, опасаясь, что отсутствующие компоненты могут исказить мои данные.
/dev/btrfs-control
на btrfs device scan
?sudo
и sudo su
по умолчанию содержали /usr/local/bin
в своем пути?Я подумал, не лучше ли скомпилировать модуль ядра, но, не имея почти никакого опыта взлома ядра, это пошло не так.
Похоже, мне нужно установить 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 и попытался загрузить ядро RHEL8 с сайта Red Hat. На странице загрузки RHEL8 была вкладка «Источники» с файлом.iso 20G. Я скачал его, смонтировал и обнаружил, что он заполнен файлами.rpm и совсем не похож на исходный репозиторий ядра Linux. Я был немного потерян.
Затем я перешел к /usr/src/kernels/
, инициализировал репозиторий git из опасения, что могу испортить что-то важное, и продолжил попытки выяснить, как собрать модуль ядра или что-то изменить в 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
, но, похоже, он у меня уже есть.
Для забавы я попытался построить его с clang
и с gcc-toolset-10
, но оба они имели одну и ту же ошибку.
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-ml
из ELrepo вот так:
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
и описал шаги сборки в вопросе выше. Если вы пришли сюда из Google, вам необходимо установить 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 :)