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

编译打包和其他
头像
liyafe1997
帖子: 490
注册时间: 2009-07-18 0:14

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

#1

帖子 liyafe1997 » 2018-01-05 0:50

跟着官方这个指示来做的: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,都无解。

只能在中文社区问问看有没有大神有什么办法了。。
Linux爱好者,只为效率,有空会常来灌水。
——————
强推:WebQQ桌面化方案,体验很好
稻草软件论坛
Strawing Blog
头像
astolia
论坛版主
帖子: 6396
注册时间: 2008-09-18 13:11

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

#2

帖子 astolia » 2018-01-10 22:22

看起来是4.4的内核,那么你用的是16.04了?16.04里的btrfs-tools是4.4版,里面的转换代码是有问题的。4.6和之后版本的btrfs-tools把转换代码重写过,修正了很多bug。4.4之后的内核也有很多btrfs相关的修正,不知道移植回4.4内核没有。
现在16.04应该可以安装4.13内核了,你先装新内核试一下呗。
头像
百草谷居士
帖子: 3910
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

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

#3

帖子 百草谷居士 » 2020-08-26 9:53

btrfs比ext4有什么优点呢?
ubuntu是否支持直接从btrfs分区启动?
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
百草谷居士
帖子: 3910
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

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

#4

帖子 百草谷居士 » 2020-12-10 9:17

如果使用btrfs作为文件系统,在安装时候,如何让 / 和 /home 分别使用不同的子卷?
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
百草谷居士
帖子: 3910
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

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

#5

帖子 百草谷居士 » 2021-01-24 8:56

有熟悉btrfs的大佬帮忙解答下,从网上搜到的都是一些命令操作,没有具体的应用。
1、如果把 /,/boot设置到btrfs分区,是否可以启动?
2、如果使用btrfs作为文件系统,在安装时候,如何让 / 和 /home 分别使用不同的子卷?
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
astolia
论坛版主
帖子: 6396
注册时间: 2008-09-18 13:11

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

#6

帖子 astolia » 2021-01-25 20:17

这些个问题自己拿个虚拟机测试一下就知道的事,有必要来问?
百草谷居士 写了: 2021-01-24 8:56 1、如果把 /,/boot设置到btrfs分区,是否可以启动?
可以。不过由于grub不支持对btrfs的写入操作,某些配置可能会失效/出错。
百草谷居士 写了: 2021-01-24 8:56 2、如果使用btrfs作为文件系统,在安装时候,如何让 / 和 /home 分别使用不同的子卷?
ubuntu的安装程序ubiquity在安装/到btrfs分区时,即使不单独将/home划到另一个分区,也会自动使用不同的子卷,mount的输出如下

代码: 全选

/dev/sdb1 on / type btrfs (rw,relatime,space_cache,subvolid=257,subvol=/@)
/dev/sdb1 on /home type btrfs (rw,relatime,space_cache,subvolid=258,subvol=/@home)
头像
百草谷居士
帖子: 3910
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

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

#7

帖子 百草谷居士 » 2021-01-26 8:48

哦,还是不太明白
btrfs的子卷似乎不用设定大小,更像是子文件夹。在实际应用中和子文件夹的主要区别是什么?难道子卷可以单独格式化?
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
百草谷居士
帖子: 3910
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

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

#8

帖子 百草谷居士 » 2021-01-27 11:23

经过简单测试,我觉得对于桌面用户来说,btrfs的最大好处是可以方便的添加分区来给文件系统扩容,当然也可以把某个分区从文件系统里移除。
至于子卷,大多数时候可以认为是个子文件夹。子卷单独挂载时,可以认为子卷的大小是动态的,受卷大小限制。
上面两个特性,都提供了一个可以动态调节大小的文件系统。至于其他特性,作为个人用户,不知道,不了解,不清楚。

这些测试只是作为普通节点挂载测试的,没有作为根节点挂载测试。不知道挂载为根节点时,是否可以这样 “热拔插” :-D
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
astolia
论坛版主
帖子: 6396
注册时间: 2008-09-18 13:11

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

#9

帖子 astolia » 2021-01-27 15:58

百草谷居士 写了: 2021-01-26 8:48 btrfs的子卷似乎不用设定大小,更像是子文件夹。在实际应用中和子文件夹的主要区别是什么?难道子卷可以单独格式化?
1、子卷可以像一个独立的文件系统一样被挂载。
2、子卷可以进行快照操作。btrfs的快照也只能在子卷级别进行
头像
百草谷居士
帖子: 3910
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

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

#10

帖子 百草谷居士 » 2021-01-28 5:29

实机安装,可能由于是efi模式,未发现grub异常。
安装成功会自动创建两个子卷@和@home,但是在安装过程中,用户无法自行选择或自行创建子卷。
如果支持自行选择或创建子卷就好了,这样在折腾系统时,可以把不同的系统安装的不同的子卷,使用相同的子卷作为/home。子卷的创建和删除要比分区简单的多,并且不用来回调整容量大小。
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
百草谷居士
帖子: 3910
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

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

#11

帖子 百草谷居士 » 2021-01-28 9:06

cat /boot/efi/EFI/ubuntu/grub.cfg
search.fs_uuid a2754003-e03d-4d64-8996-653571d7c227 root hd0,gpt6
set prefix=($root)'/@/boot/grub'
configfile $prefix/grub.cfg

efi启动项里,注明了gpt6卷所在分区,和/@子卷。

测试验证,在挂载子卷后,仍然可以挂载根卷。在部分网文中说,挂载根卷后会自动挂载子卷,但是挂载子卷后无法挂载根卷。
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
百草谷居士
帖子: 3910
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

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

#12

帖子 百草谷居士 » 2021-01-29 9:13

我使用snapshot子命令,对@子卷做了个快照@1,然后运行update-grub。我以为grub能够搜寻到@1子卷上的文件,并生成grub启动选项。
但是,没有!grub只搜寻了@子卷。

所以,通过btrfs创建子卷,并在子卷上安装不同的操作系统的想法不能直接实现。

进一步的测试:在另外的ext4分区的安装的Mint20.1,使用update-grub,既无法搜寻到@子卷的根系统,更无法搜寻到@1子卷上的系统。也就是说,其他分区上的Linux系统是无法搜寻到btrfs文件系统上的Linux的。

这还带来另外一个麻烦:有时候更新grub时,会重新安装grub。重新安装的grub 会覆盖原来在efi分区的信息,然后它又无法搜寻到btrfs上的Mint,会导致Mint无法启动。

为防万一,先把grub中的这一段,贴到这里:

代码: 全选

menuentry 'Linux Mint 20.1 Cinnamon' --class linuxmint --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a2754003-e03d-4d64-8996-653571d7c227' {
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
	insmod part_gpt
	insmod btrfs
	set root='hd0,gpt6'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt6 --hint-efi=hd0,gpt6 --hint-baremetal=ahci0,gpt6  a2754003-e03d-4d64-8996-653571d7c227
	else
	  search --no-floppy --fs-uuid --set=root a2754003-e03d-4d64-8996-653571d7c227
	fi
	linux	/@/boot/vmlinuz-5.4.0-65-generic root=UUID=a2754003-e03d-4d64-8996-653571d7c227 ro rootflags=subvol=@  quiet splash 
	initrd	/@/boot/initrd.img-5.4.0-65-generic
}
s
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
百草谷居士
帖子: 3910
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

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

#13

帖子 百草谷居士 » 2021-01-29 12:04

继续记录测试情况

把上面的grub选单片段进行修改,主要是把 @ 改成 @1。然后添加到另外ext4分区里的Mint的 /etc/grub.d/40_custom文件里,运行update-grub重新生成grub选单。
然后,将@1子卷里的 /etc/fstab文件进行修改,也是把 @ 改为 @1 。
重启选择ext4里的Mint,在grub选单最后出现了 Mint20.1 On @1选项,选择后正常启动。经查看, / 节点对应 @1 子卷。

按照这个思路,如果继续在 btrfs 文件系统上安装新的 Linux 系统,作为快照的 @1 子卷可以正常存在,并能正常启动。
只是不知道,在btrfs文件系统上安装新的Linux系统时,会不会破坏@home子卷。在这样做之前,最好是为@home创建个快照。
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
pang15975386
帖子: 193
注册时间: 2011-05-16 18:00

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

#14

帖子 pang15975386 » 2021-01-29 21:49

我之前在debian8上试过ext4转成btrfs,也变成只读了
anth
帖子: 172
注册时间: 2010-11-09 3:06

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

#15

帖子 anth » 2021-02-25 21:09

关于ext4转移btrfs 强烈的建议不要转 正确的操作是用备份或者同步命令 tar或者rsync直接复制到btrfs


关于grub引导 实测不同版本的相同的grub2对btrfs的识别策略不一样 有的识别默认子卷 有的识别顶层子卷 都能用 但是用法不一样

boot可以在btrfs分区 可以在任何位置

子卷类似于分区 只是共用挂载参数和压缩格式 你平时有多少个分区 btrfs就适合多少个子卷 如果平时不分开挂载 那就只要俩子卷 一个数据 一个快照
回复