Score:1

BTRFS บน RHEL8 - การคอมไพล์โมดูลเคอร์เนลหรือทำให้เครื่องมือ userspace ทำงานได้

ธง it

บริบท

ฉันเพิ่งติดตั้ง RHEL 8 โดยไม่รู้ตัว ไม่รองรับ BTRFS อีกต่อไป.

ขออภัย ฉันมีดิสก์ 4 แผ่นใน BTRFS RAID10 ฉันมีพื้นที่ไม่เพียงพอในดิสก์อื่นๆ ที่จะเก็บข้อมูลที่มีอยู่ในดิสก์ BTRFS ดังนั้นการคัดลอกข้อมูลทั้งหมดไปที่อื่นในขณะที่บู๊ตจากไดรฟ์ USB นั้นไม่ใช่เรื่องไกลตัว

ฉันมีคำถามเริ่มต้น จากนั้นมีคำถามติดตามผลเกี่ยวกับแนวทางที่ฉันใช้ซึ่งล้มเหลว อย่าลังเลที่จะมุ่งเน้นไปที่ส่วน "วิธีทำให้ BTRFS ทำงาน" ของปัญหานี้ แม้ว่าฉันจะอยากรู้เกี่ยวกับปัญหาอื่นๆ หากคุณมีคำตอบสำหรับส่วนใดส่วนหนึ่งของเรื่องนี้

คำถามที่ 1

  1. มีวิธีง่ายๆ (ค่อนข้าง) ในการทำให้ BTRFS ทำงานบน RHEL8 หรือไม่

พื้นที่ผู้ใช้ btrfs-progs

ความพยายามครั้งแรกของฉันในการทำงานนี้คือการรวบรวมและติดตั้ง btrfs-progs ด้วยสิ่งต่อไปนี้:

#ติดตั้งเดป
sudo dnf ติดตั้ง libuuid-devel libblkid-devel lzo-devel zlib-devel libzstd-devel e2fsprogs-devel e2fsprogs-libs e2fsprogs libgcrypt-devel libsodium-devel libattr-devel
# ติดตั้ง deps สำหรับ doc gen
sudo dnf ติดตั้ง asciidoc xmlto ซอร์สไฮไลต์

# Shallow-clone รุ่นล่าสุด
git clone -- ความลึก 1 --branch v5.14.1 https://github.com/kdave/btrfs-progs.git
ซีดี btrfs-progs
สวิตช์คอมไพล์ -c v5.14.1

# สร้าง
# --disable-zoned เนื่องจากคุณลักษณะนั้นต้องการเคอร์เนล >=5.10
ส่งออก CFLAGS="-O3 -pipe -frecord-gcc-switches -mtune=native -march=native"
ส่งออก CPPFLAGS=$CFLAGS
ส่งออก SODIUM_CFLAGS=$CFLAGS
ส่งออก ZSTD_CFLAGS=$CFLAGS
ส่งออก ZLIB_CFLAGS=$CFLAGS
ส่งออก UUID_CFLAGS=$CFLAGS
ส่งออก PYTHON_CFLAGS=$CFLAGS

./autogen.sh
./configure --with-crypto=libsodium --disable-zoned
ทำ -j12
sudo ทำการติดตั้ง

ดูเหมือนว่าจะติดตั้งอย่างถูกต้องและผู้ใช้ของฉันสามารถเข้าถึงได้:

$ ซึ่ง btrfs
/usr/local/bin/btrfs

$ ls -1 /usr/local/bin/ | grep btrfs
btrfs
btrfsck
btrfs-แปลง
btrfs-ค้นหาราก
btrfs-ภาพ
btrfs-แผนที่ตรรกะ
btrfs-เลือกซุปเปอร์
btrfstune
fsck.btrfs
mkfs.btrfs

รุ่น $ btrfs
btrfs-progs v5.14.1 

อย่างไรก็ตามเห็นได้ชัดว่ารูทไม่มี /usr/local/bin ในเส้นทางของมันโดยปริยาย ฉันเพิ่ม ส่งออก PATH+=":/usr/local/bin" เป็น /etc/profileและ/root/.bash_profileแต่ดูเหมือนว่าทั้งคู่ไม่ได้รับแหล่งที่มาโดยอัตโนมัติเมื่อใช้งาน ซูโดหรือเมื่อหยดลงในรูตเชลล์ด้วยsudo su`.

เมื่อระบุเส้นทางแบบเต็มไปยังไบนารี มันจะบ่นว่าไม่สามารถเปิดได้ /dev/btrfs-ควบคุม. สอบถามเครื่องมือค้นหาในพื้นที่ของฉัน บางคนแนะนำว่าต้องใช้ udev แต่ติดตั้งไว้แล้ว (อาจกำหนดค่าผิด)

รุ่น $ sudo btrfs
sudo: btrfs: ไม่พบคำสั่ง

$ sudo /usr/local/bin/btrfs การสแกนอุปกรณ์
กำลังสแกนหาระบบไฟล์ Btrfs
คำเตือน: ไม่สามารถเปิด /dev/btrfs-control ข้ามการลงทะเบียนอุปกรณ์: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว
คำเตือน: ไม่สามารถเปิด /dev/btrfs-control ข้ามการลงทะเบียนอุปกรณ์: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว
คำเตือน: ไม่สามารถเปิด /dev/btrfs-control ข้ามการลงทะเบียนอุปกรณ์: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว
คำเตือน: ไม่สามารถเปิด /dev/btrfs-control ข้ามการลงทะเบียนอุปกรณ์: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว
ข้อผิดพลาด: มี 4 ข้อผิดพลาดขณะลงทะเบียนอุปกรณ์

คำสั่ง BTRFS อื่น ๆ ดูเหมือนจะใช้งานได้:

ระบบไฟล์ $ sudo /usr/local/bin/btrfs แสดง /dev/sda
ป้ายกำกับ: 'wdred' uuid: aaaa-bbbb-cccc-dddd-eeee
    อุปกรณ์ทั้งหมด 4 ไบต์ FS ใช้ 2.13TiB
    ส่วนที่ 1 ขนาด 5.46TiB ใช้เส้นทาง 1.07TiB /dev/sda
    ส่วนที่ 2 ขนาด 5.46TiB ใช้เส้นทาง 1.07TiB /dev/sdc
    devid 3 ขนาด 5.46TiB ใช้เส้นทาง 1.07TiB /dev/sdb
    devid 4 ขนาด 5.46TiB ใช้เส้นทาง 1.07TiB /dev/sdd

อย่างไรก็ตาม ฉันกลัวที่จะเมานต์พาร์ติชันหรือดำเนินการใดๆ กับพาร์ติชันเนื่องจากข้อผิดพลาดข้างต้น เพราะกลัวว่าส่วนประกอบที่ขาดหายไปจะทำให้ข้อมูลของฉันยุ่งเหยิง

คำถามที่ 2, 3, 4

  1. ปลอดภัยไหมที่จะพยายามใช้ btrfs เพื่อเมานต์ดิสก์เนื่องจากข้อผิดพลาดข้างต้น
  2. เกิดอะไรขึ้นกับ /dev/btrfs-ควบคุม เกิดข้อผิดพลาด การสแกนอุปกรณ์ btrfs?
  3. ฉันจะได้รับได้อย่างไร ซูโด และ ซูโด ซู เพื่อที่จะมี /usr/local/bin ในเส้นทางของมันไปโดยปริยาย?

โมดูลเคอร์เนล BTRFS

ฉันสงสัยว่าการคอมไพล์โมดูลเคอร์เนลจะดีกว่าไหม แต่การที่แทบไม่มีประสบการณ์การแฮ็กเคอร์เนลเลย มันกลับแย่ลง

ดูเหมือนว่าฉันต้องตั้งค่า CONFIG_BTRFS_FS=ม ในการกำหนดค่าเคอร์เนลของฉันเพื่อเริ่มต้น ยังไม่มีในขณะนี้ และดูเหมือนว่าฉันจะจำได้ว่าสามารถทำสิ่งนี้ได้ใน การกำหนดค่าเมนู.

$ grep "BTRFS" /boot/config-4.18.0-305.19.1.el8_4.x86_64 
# CONFIG_BTRFS_FS ไม่ได้ตั้งค่า

เอกสารประกอบของ RHEL กล่าวถึงวิธีการโหลดโมดูลเคอร์เนลและอื่นๆ แต่ไม่เกี่ยวกับวิธีสร้างโมดูลเหล่านั้น ฉันปรึกษา archwiki และพยายามดาวน์โหลดเคอร์เนล RHEL8 จากไซต์ Red Hat หน้าดาวน์โหลดสำหรับ RHEL8 มีแท็บ "แหล่งที่มา" พร้อมไฟล์ .iso 20G ฉันดาวน์โหลด ติดตั้ง และพบว่าเต็มไปด้วยไฟล์ .rpm และดูไม่เหมือน repo เคอร์เนลของลินุกซ์เลย ฉันหลงทางเล็กน้อย

จากนั้นฉันก็ไปที่ /usr/src/เมล็ด/เริ่มต้น git repo ด้วยความกลัวว่าฉันจะไปขัดขวางสิ่งที่สำคัญ และพยายามหาวิธีสร้างโมดูลเคอร์เนลหรือเปลี่ยนแปลงสิ่งต่างๆ ใน ​​menuconfig

$ ซีดี /usr/src/kernels/4.18.0-305.19.1.el8_4.x86_64
$ sudo ซู
# เริ่มต้นคอมไพล์
# git เพิ่ม -A
# git commit -m "เคอร์เนลที่ไม่ได้แก้ไข"

#ทำให้ถูกต้อง
  สคริปต์ HOSTCC/พื้นฐาน/bin2c
สคริปต์/kconfig/conf --syncconfig Kconfig
arch/x86/Makefile:184: *** คอมไพเลอร์ขาดการสนับสนุน asm-goto.. หยุด
ทำ: *** [Makefile:1361: _clean_arch/x86] ข้อผิดพลาด 2

ขาดการสนับสนุน asm-goto อินเทอร์เน็ตแนะนำว่าฉันอาจต้องการ elfutils-libelf-devel แต่ดูเหมือนว่าฉันจะมีสิ่งนั้นอยู่แล้ว

สำหรับความสนุกฉันพยายามสร้างมันด้วย เสียงดังกราว และด้วย gcc-toolset-10แต่ทั้งคู่มีข้อผิดพลาดเดียวกัน

คำถามที่ 5

  • ความคิดใด ๆ ว่าทำไม คอมไพเลอร์ขาดการสนับสนุน asm-goto?
  • แหล่งข้อมูลที่ดีเกี่ยวกับวิธีสร้างโมดูลเคอร์เนล / แพตช์เคอร์เนล / แก้ไขเคอร์เนลระบบของคุณคืออะไร

ข้อมูลระบบ

$ uname -a
Linux rhel 4.18.0-305.19.1.el8_4.x86_64 #1 SMP อ. 7 ก.ย. 07:07:31 EDT 2021 x86_64 x86_64 x86_64 GNU/Linux

$ gcc -- รุ่น
gcc (GCC) 8.4.1 20200928 (เรดแฮท 8.4.1-1)


$ scl รัน gcc-toolset-10 'gcc --version'
gcc (GCC) 10.2.1 20201112 (เรดแฮท 10.2.1-8)

$ เสียงดังกราว --version
เสียงดังกราวเวอร์ชัน 11.0.0 (Red Hat 11.0.0-1.module+el8.4.0+8598+a071fcd5)

ขอบคุณที่อ่านมาถึงตรงนี้! ความช่วยเหลือใด ๆ ที่ชื่นชม

Michael Hampton avatar
cz flag
CONFIG_BTRFS ถูกเปิดใช้งานในเคอร์เนล ELrepo kernel-ml คุณต้องมีสิ่งของ userspace ซึ่งอยู่ในการทดสอบ elrepo (และเป็นตั้งแต่ RHEL 8 อยู่ในรุ่นเบต้า) สิ่งนี้จะช่วยให้คุณสามารถกู้คืนไฟล์ของคุณเพื่อให้คุณสามารถเปลี่ยนเป็นระบบไฟล์อื่นได้
catleeball avatar
it flag
ดูเหมือนจะได้ผล ขอบคุณ @MichaelHampton !
de flag
ความเป็นไปได้อื่นๆ คือการเปิดใช้งาน Oracle Linux repos และติดตั้ง ดังนั้น callwd เคอร์เนลที่ไม่แตก
catleeball avatar
it flag
@kofemann มีเหตุผลใดบ้างที่จะใช้ Oracle UEK ผ่านเคอร์เนล linux mainline สำหรับสิ่งนี้
Score:2
ธง it

ในความคิดเห็น คำตอบของ @MichaelHampton ใช้ได้

ฉันเพิ่ม เคอร์เนล-มล จาก เอลเรโป แบบนี้:

sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo yum ติดตั้ง https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
sudo yum --enablerepo=elrepo-kernel ติดตั้งเคอร์เนล-มล

โปรดทราบว่าฉันสร้างเครื่องมือ userspace แล้ว btrfs-progs และสรุปขั้นตอนการสร้างในคำถามข้างต้น หากคุณมาที่นี่จาก Google คุณจะต้องติดตั้ง btrfs-progs นอกเหนือจากโมดูลเคอร์เนล

จากนั้นรีสตาร์ท ตรวจสอบว่าฉันกำลังเรียกใช้เคอร์เนล mainline และสามารถเมานต์ดิสก์ของฉันด้วย BTRFS และอ่านข้อมูลได้

$ sudo รีบูต

$ uname -a
Linux rhel 5.14.8-1.el8.elrepo.x86_64 #1 SMP วันเสาร์ที่ 25 กันยายน 10:32:52 EDT 2021 x86_64 x86_64 x86_64 GNU/Linux

$ sudo mount UUID=zzz -o ค่าเริ่มต้น noatime /mnt/hdd

$ ls /mnt/hdd
ไฟล์ทั้งหมดของฉัน :)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา