【系统教程】小白的急救药,以后再也不怕瞎折腾了—btrfs
Tofloor
poster avatar
moli3
deepin
2016-09-22 22:11
Author
本帖最后由 moli3 于 2016-9-22 17:03 编辑

  • 操作步骤

1、系统安装

在安装的过程中,这里选择【专家模式】。


选择你即将安装的磁盘'1,文件系统选择btrfs'2,挂载点选择/根目录'3。建议选中格式化一下。后面的安装步骤根据官方的方法正常安装。

2、软件安装
根据上述步骤,系统已经对btrfs文件系统支持了。但是为了更方便的管理快照需要安装snapper。

sudo apt-get install snapper

3、初始环境
目前根目录/已经使用了btrfs文件系统。管理使用的snapper是根据配置文件指定的路径来管理文件系统的。所以初始化需要创建配置文件。
sudo snapper create-config /

创建配置之后的系统环境就可以用snapper管理快照了。查看快照效果如下。
sudo snapper list

第一列为快照类型'1,第二列为快照id‘2,第三个地方为快照的备注'3,方便记忆。

4、创建快照
我们经常用到的快照为手动创建的single快照。创建方式如下。
sudo snapper create -d "来说点什么吧"
然后使用上述查看快照的方式就可以查看快照了。

5、恢复快照
如果当前系统已经被手残折腾坏了。那么这个救急的方法就可以排上用场了。直接一键恢复以前的某个状态了。(前提,一定要记得备份;没备份也没事,snapper默认过一会给你备份一次。)
sudo snapper undochange 2..0
上面命令的意思是将当前系统还原到快照id为2的状态。是不是,一下刚才系统进步了桌面,现在已经复活了。

  • 原理解说

1、文件的读写对于使用者是透明的。由btrfs驱动控制读写到的数据状态。

2、我们读写的都是subid 为5的文件系统状态。

3、当创建快照的时候即保存了一个状态。当前的状态所有的修改都是基于快照差异化保存。所以理论上我修改了一个字母,state2对于snap1多了一个字母。

4、当使用恢复快照的时候,就是丢掉当前状态相对于snap1的修改。这样子系统就得以还原。(所以这里注意一个问题,如果你把快照删了,又把当前系统给删了,那就没救了。


  • 注意事项
想更了解和掌握btrfs 可以学习下百度百科
问题解决:


1、由于btrfs 创建在 /根目录,所以所有文件都会被快照。这样对于日志等经常更新的文件造成较大的冗余。

解决办法:我们可以在/创建子卷将这些目录排除。——上级目录的快照不会备份子卷,利用这个特性我们可以排除部分目录。
sudo btrfs sub create /var/@log
这样我就创建了一个路径为/var/@log的子卷,我们将这个路径挂载到/var/log。这样在对/目录快照的时候就不会备份该目录。


然后修改/etc/fstab,将需要挂载的目录添加进去。
/dev/sda1        /                 btrfs             rw,relatime,ssd,space_cache,subvolid=5,subvol=/        0 0
/dev/sda1        /srv                 btrfs             rw,relatime,ssd,space_cache,subvol=/@srv        0 0
/dev/sda1        /tmp                 btrfs             rw,relatime,ssd,space_cache,subvol=/@tmp        0 0
/dev/sda1        /var/crash                 btrfs             rw,relatime,ssd,space_cache,subvol=/var/@crash        0 0
/dev/sda1        /var/lib/libvirt/images                 btrfs             rw,relatime,ssd,space_cache,subvol=/var/lib/libvirt/@images        0 0
/dev/sda1        /var/lib/mailman                 btrfs             rw,relatime,ssd,space_cache,subvol=/var/lib/@mailman        0 0
/dev/sda1        /var/lib/mariadb                 btrfs             rw,relatime,ssd,space_cache,subvol=/var/lib/@mariadb        0 0
/dev/sda1        /var/lib/mysql                 btrfs             rw,relatime,ssd,space_cache,subvol=/var/lib/@mysql        0 0
/dev/sda1        /var/lib/named                 btrfs             rw,relatime,ssd,space_cache,subvol=/var/lib/@named        0 0
/dev/sda1        /var/lib/pgsql                 btrfs             rw,relatime,ssd,space_cache,subvol=/var/lib/@pgsql        0 0
/dev/sda1        /var/log                 btrfs             rw,relatime,ssd,space_cache,subvol=/var/@log        0 0
/dev/sda1        /var/opt                 btrfs             rw,relatime,ssd,space_cache,subvol=/var/@opt        0 0
/dev/sda1        /var/spool                 btrfs             rw,relatime,ssd,space_cache,subvol=/var/@spool        0 0
/dev/sda1        /var/tmp                 btrfs             rw,relatime,ssd,space_cache,subvol=/var/@tmp        0 0



具体添加哪些目录参考上面的目录,创建子卷并且添加到/etc/fstab文件。这样系统开机会自动挂载这些目录。

2、systemd日志出现异常
当使用systemctl status dnsmasq 查看某个服务的状态时候,会提示以下信息
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.并且服务输出的日志也都不可见。
这是由于btrfs 挂载的/var/log路径比systemd-journald.service启动时间晚导致。[size=1em]所以我们需要修改[size=1em]systemd-journald.service ,在After=local-fs.target添加local-fs.target。这样systemd-journald.service就比文件系统挂载晚。该问题就可以得到解决。


3、不懂的千万不要用snapper rollback功能rollback会创建当前系统的快照,并且将目标快照恢复到一个新的快照。
并且修改了当前状态的指向。
问题:
  • 很不友好,生效要重启系统。
  • 导致之前的子卷在后来都没法用,也无法删除。



4、出现意外情况检查以下问题
  • btrfs sub get-default /是否还指向id为5的subvol。
  • btrfs qgroup show /用到的id是否存在孤魂id——没有被sub使用的id。这种情况会导致系统提示只读。snapper delete/create出错。




Reply Favorite View the author
All Replies
moli3
deepin
2016-09-22 22:14
#1
沙发自己的
Reply View the author
linux0208
deepin
2016-09-22 23:04
#2
好帖,btrfs一直在用,但只懂得点皮毛,感谢楼主的分享
Reply View the author
MattD
deepin
2016-09-22 23:13
#3
那么,遇到csum error估计是没救了。我之前遇到过,不光extent本身损坏,而是整个csum tree都损坏了,快照和fsck都救不回来。
所以我对btrfs是有阴影的,曾经一度想换回ZFS。
Reply View the author
moli3
deepin
2016-09-23 00:56
#4
https://bbs.deepin.org/post/43821
那么,遇到csum error估计是没救了。我之前遇到过,不光extent本身损坏,而是整个csum tree都损坏了,快照 ...

你说的问题,我还没碰到过,可以说下操作步骤吧?

我当时不理解,删过子卷,然后果然系统挂了。
Reply View the author
MattD
deepin
2016-09-23 04:22
#5
https://bbs.deepin.org/post/43821
你说的问题,我还没碰到过,可以说下操作步骤吧?

我当时不理解,删过子卷,然后果然系统挂了。

目前看到的问题原因是由lzo压缩导致的csum error,而且还是今年才出现的。我在上一台笔记本里面跑btrfs+内建raid5倒是没出现过,所以应该就是新引入的bug。这次事故导致我大约50%的数据报废。
通过表面看本质,一个已经被认为production ready的文件系统居然在自身的stable feature方面有这么重大的bug,让我不得不怀疑这个文件系统的可靠性和健壮性。
老实说,之前我在Linux用过两年ZFS,也是用作rootfs,虽然不是内核原生文件系统,但是健壮程度出乎意料。







    来自:Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0  (zh-CN)
    ——2016/9/22 下午8:22:05
    Reply View the author
    moli3
    deepin
    2016-09-23 05:14
    #6
    https://bbs.deepin.org/post/43821
    目前看到的问题原因是由lzo压缩导致的csum error,而且还是今年才出现的。我在上一台笔记本里面跑btrfs+ ...

    既然大神这么推荐zfs。我得抽空一试!
    Reply View the author
    kfnx1981
    deepin
    2016-09-23 05:51
    #7
    我看过一个文章,说ext4有补丁。不补丁也可能重大数据损失。
    Reply View the author
    纯洁的老污师
    deepin
    2016-09-23 09:11
    #8
    我也已经用 btrfs 作为主要文件系统格式用了两年多了,不过快照管理一直都是自己手动写脚本来做一键快照的。这个问题不大。
    但是每次从快照中恢复,我都是重启进入另一个快照中的系统,然后在另一个快照中的系统对原系统的快照作恢复操作。请问一下 snappy 的这个 unchange 是怎么实现在线从快照中恢复数据的呢?有对应的shell命令吗?
    Reply View the author
    moli3
    deepin
    2016-09-23 09:38
    #9
    https://bbs.deepin.org/post/43821
    我也已经用 btrfs 作为主要文件系统格式用了两年多了,不过快照管理一直都是自己手动写脚本来做一键快照的 ...

    snapper这个工具就是从一个快照状态将文件还原到当前的系统。因为btrfs本身就是cow的,所以这个相当于一个逆向的写文件。
    Reply View the author
    纯洁的老污师
    deepin
    2016-09-23 18:35
    #10
    https://bbs.deepin.org/post/43821
    snapper这个工具就是从一个快照状态将文件还原到当前的系统。因为btrfs本身就是cow的,所以这个相当于一 ...

    btrfs 本身原理我是知道,只是不清楚如何通过命令从一个快照状态将文件还原到当前的系统。。。如果不用snapper的话
    Reply View the author
    188******76
    deepin
    2016-09-23 20:10
    #11
    建议烦劳写到深度百科里面去
    Reply View the author
    moli3
    deepin
    2016-09-23 21:03
    #12
    https://bbs.deepin.org/post/43821
    btrfs 本身原理我是知道,只是不清楚如何通过命令从一个快照状态将文件还原到当前的系统。。。如果不用sn ...

    我猜你应该是想问这个

    http://serverfault.com/questions ... o-compare-snapshots
    Reply View the author
    moli3
    deepin
    2016-09-23 21:03
    #13
    https://bbs.deepin.org/post/43821
    建议烦劳写到深度百科里面去

    有空的时候再写吧
    Reply View the author
    MattD
    deepin
    2016-09-23 21:21
    #14
    https://bbs.deepin.org/post/43821
    btrfs 本身原理我是知道,只是不清楚如何通过命令从一个快照状态将文件还原到当前的系统。。。如果不用sn ...

    貌似并没有完全等价的命令,snapper做了很多的扩展应用:https://www.suse.com/documentation/sled-12/book_sle_admin/data/sec_snapper_auto.html
    不过只要理解快照也是子卷,且子卷也可当成文件夹来操作,那么就简单了。大致就是引导进入目标快照,删除原来的子卷,并将目标快照的挂载点修改一下就可以了。
    btrfs wiki也有类似的应用示例:https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Managing_Snapshots
    Reply View the author
    纯洁的老污师
    deepin
    2016-09-23 23:20
    #15
    https://bbs.deepin.org/post/43821
    貌似并没有完全等价的命令,snapper做了很多的扩展应用:https://www.suse.com/documentation/sled-12/bo ...
    大致就是引导进入目标快照,删除原来的子卷,并将目标快照的挂载点修改一下就可以了。

    我现在用脚本就是这样做的。只是在思考有没有不需要重启而全部在线热操作的方法。。。
    Reply View the author
    纯洁的老污师
    deepin
    2016-09-23 23:24
    #16
    https://bbs.deepin.org/post/43821
    我猜你应该是想问这个

    http://serverfault.com/questions/399894/does-btrfs-have-an-efficient-way-to- ...

    find-new、send、receive 这几个命令之前都有看到过,但没有仔细去尝试过。看你给的链接的说法,应该应该就是这个了。有空我详细去了解下,谢了
    Reply View the author
    justforlxz
    deepin developers team
    2016-09-24 05:24
    #17
    不推荐没有硬raid的用户使用btrfs,不然东西坏了,只能哭。
    Reply View the author
    moli3
    deepin
    2016-09-24 06:49
    #18
    https://bbs.deepin.org/post/43821
    不推荐没有硬raid的用户使用btrfs,不然东西坏了,只能哭。

    只是用来做系统,防止小白,误删误改。

    home目录还是建议用其他文件系统的。
    Reply View the author