分页: 1 / 1

从ext4转换到btrfs会导致文件系统随机变为只读

发表于 : 2018-01-05 0:50
liyafe1997
跟着官方这个指示来做的:https://btrfs.wiki.kernel.org/index.php ... _from_Ext3
大致操作如下:
1.fsck原ext4文件系统 没问题
2.btrfs-convert 把原文件系统转换成btrfs 没报错,成功。
3.btrfs subvol delete ext2_saved 删掉转换后留下的子卷
4.
btrfs fi defrag -r
btrfs balance start
整理碎片,banlance一下?不懂具体干嘛,按官方的指示照做了。(把文件系统变清真一点?)
5.btrfs filesystem defragment -r -v -clzo 对文件系统做全盘压缩(这是我用btrfs的原因,透明压缩)
以上操作均没报错

代码: 全选

fstab:
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda1 during installation
UUID=de31e48a-a9d4-4cfe-9864-2a8265ee20ea /               btrfs   defaults,compress=lzo,subvol=@ 0       1
(我就加了个compress)

变成readonly炸掉时dmesg能看到如下错误信息:

代码: 全选

[  587.019825] WARNING: CPU: 1 PID: 56 at /build/linux-bNGTuE/linux-4.4.0/fs/btrfs/inode.c:2931 btrfs_finish_ordered_io+0x7da/0x7f0 [btrfs]()
[  587.019828] Modules linked in: nvram msr joydev vboxsf(OE) snd_intel8x0 snd_ac97_codec ac97_bus snd_pcm snd_seq_midi snd_seq_midi_event vboxvideo(OE) crc32_pclmul snd_rawmidi ttm aesni_intel drm_kms_helper aes_i586 snd_seq xts lrw gf128mul ablk_helper cryptd snd_seq_device snd_timer drm snd input_leds serio_raw fb_sys_fops syscopyarea soundcore sysfillrect i2c_piix4 sysimgblt vboxguest(OE) 8250_fintek mac_hid binfmt_misc parport_pc ppdev lp parport autofs4 btrfs xor raid6_pq hid_generic usbhid hid video ahci libahci e1000 psmouse fjes
[  587.019876] Workqueue: btrfs-endio-write btrfs_endio_write_helper [btrfs]
[  587.019911]  [<f8755f6a>] ? btrfs_finish_ordered_io+0x7da/0x7f0 [btrfs]
[  587.019923]  [<f8755f6a>] ? btrfs_finish_ordered_io+0x7da/0x7f0 [btrfs]
[  587.019937]  [<f8755f6a>] btrfs_finish_ordered_io+0x7da/0x7f0 [btrfs]
[  587.019948]  [<f87562f0>] finish_ordered_fn+0x10/0x20 [btrfs]
[  587.019962]  [<f8784870>] btrfs_scrubparity_helper+0xd0/0x2d0 [btrfs]
[  587.019975]  [<f8784afd>] btrfs_endio_write_helper+0xd/0x10 [btrfs]
[  587.020024] BTRFS: error (device sda1) in btrfs_finish_ordered_io:2931: errno=-95 unknown
发现写入文件 尤其(也许)是大量小文件时,炸成readonly的概率非常大。基本上一打开Firefox开一个网页必炸。

btrfs check --repair没有报错(结果和官方https://btrfs.wiki.kernel.org/index.php/Btrfsck的类似,总之没报错,下面这段是摘自官方的):

代码: 全选

Fixed 0 roots.
checking extents
checking free space cache
checking fs roots
checking csums
checking root refs
enabling repair mode
Checking filesystem on /dev/mapper/space
UUID: 77077815-4ca2-44cd-a83a-b1aeb4607df4
cache and super generation don't match, space cache will be invalidated
found 294976426877 bytes used err is 0
total csum bytes: 636680648
total tree bytes: 6981910528
total fs tree bytes: 5149491200
total extent tree bytes: 895369216
btree space waste bytes: 1860661732
file data blocks allocated: 651971338240
 referenced 676102934528
Btrfs v3.17
btrfs scrub也没报错
btrfs-zero-log试过了,无济于事。
再做balance、defrag也都无济于事。

我的一些主观判断:
1.应该不关压缩的事,我的另一台安装时就用的btrfs文件系统的ubuntu机器,也是用上面的方法做的全盘压缩,挂载的压缩选项也一样,一点问题也没有。
2.几乎可以断定是从ext4转换过来的锅,
因为,Google ext4 btrfs readonly 或者 btrfs errno=-95 unknown能找到一大堆和我情况相似的,全都是从ext4转过来的,然后自动炸成只读的。dmesg报的错都一样!
但是,翻遍google,都无解。

只能在中文社区问问看有没有大神有什么办法了。。

Re: 从ext4转换到btrfs会导致文件系统随机变为只读

发表于 : 2018-01-10 22:22
astolia
看起来是4.4的内核,那么你用的是16.04了?16.04里的btrfs-tools是4.4版,里面的转换代码是有问题的。4.6和之后版本的btrfs-tools把转换代码重写过,修正了很多bug。4.4之后的内核也有很多btrfs相关的修正,不知道移植回4.4内核没有。
现在16.04应该可以安装4.13内核了,你先装新内核试一下呗。