Mount

無法掛載 btrfs 文件系統“open_ctree failed”

  • April 18, 2022

掛載 btrfs 文件系統時遇到問題。最初在執行 xbian 的伺服器上創建。嘗試安裝在最新的 OpenSUSE 42.2 伺服器上。抱怨不支持的功能 0x10,open_ctree 失敗。

我怎樣才能掛載這個文件系統?

掛載嘗試

# file -s /dev/sdc2
/dev/sdc2: BTRFS Filesystem (label "xbian", sectorsize 4096, nodesize 16384, leafsize 16384)
# mount -t btrfs /dev/sdc2 /mnt
mount: wrong fs type, bad option, bad superblock on /dev/sdc2,
      missing codepage or helper program, or other error

      In some cases useful info is found in syslog - try
      dmesg | tail or so.
#

dmesg 輸出

[  119.698406] BTRFS info (device sdc2): disk space caching is enabled
[  119.698409] BTRFS: couldn't mount because of unsupported optional features (10).
[  119.744887] BTRFS: open_ctree failed

btrfs 版本

# rpm -qa|grep btrfs
btrfsprogs-udev-rules-4.5.3-3.1.noarch
btrfsprogs-4.5.3-3.1.x86_64
libbtrfs0-4.5.3-3.1.x86_64
btrfsmaintenance-0.2-13.1.noarch
#

btrfs 檢查內部

報告未知標誌。這種行為在 OpenSUSE 提供的庫存 btrfs 版本(btrfs-progs v4.5.3+20160729)和從 git 下載並編譯的最新版本(btrfs-progs v4.9.1)上看到

# btrfs inspect-internal dump-super /dev/sdc2
superblock: bytenr=65536, device=/dev/sdc2
---------------------------------------------------------
csum                    0x394d4988 [match]
bytenr                  65536
flags                   0x1
                       ( WRITTEN )
magic                   _BHRfS_M [match]
fsid                    71ecbcc5-c88f-4f27-b4d8-763bd801765e
label                   xbian
generation              129
root                    4669440
sys_array_size          97
chunk_root_generation   102
root_level              0
chunk_root              131072
chunk_root_level        0
log_root                0
log_root_transid        0
log_root_level          0
total_bytes             7451181056
bytes_used              691642368
sectorsize              4096
nodesize                16384
leafsize                16384
stripesize              4096
root_dir                6
num_devices             1
compat_flags            0x0
compat_ro_flags         0x0
incompat_flags          0x179
                       ( MIXED_BACKREF |
                         COMPRESS_LZO |
                         COMPRESS_LZOv2 |
                         BIG_METADATA |
                         EXTENDED_IREF |
                         SKINNY_METADATA |
                         unknown flag: 0x10 )
csum_type               0
csum_size               4
cache_generation        129
uuid_tree_generation    112
dev_item.uuid           a8b49751-56e3-4c42-a1d3-40a1554c800c
dev_item.fsid           71ecbcc5-c88f-4f27-b4d8-763bd801765e [match]
dev_item.type           0
dev_item.total_bytes    7451181056
dev_item.bytes_used     926941184
dev_item.io_align       4096
dev_item.io_width       4096
dev_item.sector_size    4096
dev_item.devid          1
dev_item.dev_group      0
dev_item.seek_speed     0
dev_item.bandwidth      0
dev_item.generation     0

#

問題確實是兩個 Linux 版本的 BTRFS 版本略有不同,即不支持相同的功能:

$$ 119.698406 $$BTRFS 資訊(設備 sdc2):磁碟空間記憶體已啟用

$$ 119.698409 $$BTRFS:由於可選功能不受支持而無法掛載 (10)。

似乎 xbian 啟用了該功能,而 OpenSuse 42.2 沒有,這妨礙了互操作性。

這些 FS 功能是可選的:這意味著可以在新系統上創建向下兼容的 BTRFS 分區,這些分區可以從舊系統(沒有這些功能)讀取,由傳遞給 mkfs.btrfs 程序的參數控制。

功能的數字程式碼是 10 - 未知標誌:0x10。我很難弄清楚這些程式碼的含義(我的猜測:擴展的 inode 引用。)但由於數量太少,我認為這是基本的。我認為你不能再讓這個文件系統被未打更新檔的核心讀取。否則,知道了這個特性,我們也許可以指定一個掛載選項來避免錯誤;像這裡一樣,指定了 fs 壓縮算法:

mount -t btrfs -o compress=lz4 dev /mnt

如果我們不知道這個特性是什麼,你甚至無法在 OpenSuse 中更新核心以匹配 xbian。通常在這種情況下,出於兼容性原因,您會改用 ext4。

引用自:https://unix.stackexchange.com/questions/349304