Btrfs ,相信广大折腾帝们都不会陌生,被誉为“下一代 Linux 文件系统”的它,具有扩展性好、支持数据校验、支持多设备管理等等强大特性,使得 Ext4 也只能成为悲剧的过渡产品,还不赶快找一个 Ubuntu 10.10、Fedora 15、Meego 什么的试一下?
慢着!支持什么多设备、什么数据校验跟你有一毛钱关系啊?根据 Ext4 和 Btrfs 的对比 ,Btrfs 在速度上似乎还差上一些呢!这么说 Btrfs 其实挺垃圾的?
本文就来为你从普通[STRIKEOUT:折腾帝]用户的角度来解说一下 Btrfs 到底有什么好。如果你想从技术层面了解 Btrfs ,可以看一下《 新一代 Linux 文件系统 btrfs 简介 》。
注意:Btrfs 还处于实验性阶段,截止到本文写作为止,其磁盘检查工具 Btrfsck 还不能修复文件系统,请不要在工作环境下使用 Btrfs,以免数据丢失!再次警告,这不是演习!
错误修复
在正式开始讲之前,我假定你已经把系统弄坏了,你已经看到了系统提示你“You are on your own”,“Good luck~”,很好,我之前已经说过 Btrfs 还处于实验阶段了,所以就不要妄想把你的动作片全集找回来啦,乖乖格式化掉吧~
呃,当然,我们对于有共享精神的同志还是要宽容处理的,如果你真的很想找回来[STRIKEOUT:并且共享给我],你或许可以去 Arch Wiki 上看一下,那里有几条[STRIKEOUT:死马当活马医的]良策,或许可以帮你度过难关,[STRIKEOUT:铁道部]春哥保佑你。
其他特性
其实 Btrfs 对于普通用户有用的、能看到的特性主要就是其包含了 卷管理特性 ,但是为了吊胃口,我们还是从其他特性开始说起吧。
其他的其他
Btrfs 支持在线的碎片整理,在线的卷增大和缩小,在线的块设备增添和删除,在线的块设备负载均衡;啥叫在线的呢?我理解就是文件系统挂载着就可以干这些事情,牛吧?虽然我不知道这些事情都是干嘛的跟我有[STRIKEOUT:毛]神马关系。
可以从 Ext3/Ext4 无痛转换
不解释,详见《 Conversion from Ext3 and Ext4 》。
为 SSD 优化
Btrfs 高度为 SSD 优化,不仅提高存取效率,还延长了使用寿命。如果你在 SSD 硬盘上使用 Btrfs,那么可以在挂载选项中加入 ssd
来启用这一特性。
支持数据压缩
Btrfs 支持文件系统的压缩,这个有什么用呢?大家知道 NTFS 吧,它就支持压缩,支持压缩就可以存放更多的东西呗,动作片什么的。
不过压缩可不光是这个作用,大家都知道磁盘速度很慢,总是跟不上 CPU 的处理速度,所以 CPU 常常空闲着没事干。于是牛人们就想着给它找点事干,于是就有了压缩。压缩了之后磁盘读写就少了,原来闲着的 CPU 过来帮忙压缩解压缩数据,CPU 多快啊,这一来二去, 往往 就比原来不压缩的时候速度快得多。没看内核和 Ramdisk 都变着花样的压缩么,就是这个道理。
Btrfs 目前支持 lzo 和 zlib 压缩算法,而且很智能,像一些视频啊、音乐啊、图片啊,大家都知道它们本来就是压缩过存放的,再压缩也不一定减少空间,反而平白浪费 CPU,所以 Btrfs 会试着压缩一小段,如果压着困难,就会原样存放。怎么样,智能吧?
如果想要启用这一特性,可以在挂载选项中加入 compress
选项,你还可以手动指定压缩算法,例如 compress=zlib
可以获得更高压缩比,而 compress=lzo
可以获得更快的速度。
卷管理
终于到正题了啊,说到卷管理,很多人可能就想到 LVM 了,没错,说的就是这个卷!不过我虽然用过 LVM ,不过用的也不熟,如果说得有错误,请偷偷告诉我……
无须分区的文件系统
初入 Linux ,最大的难点是什么?当然是分区。其实这是大多数操作系统都会共有的问题,各位 MM ,你们当时是不是找暗恋你们的 GG 帮忙分的区?各位 GG ,你们当时是不是找暗恋你们的 GG 帮忙分的区?有了 Btrfs ,你们再也不用求人了!
什么 /boot 要分 200M 还有说不用单独分出来的啊,什么 /home 要分好多好多但是不能理解这是干什么用的啊,就算你已经算是 Linux 老鸟了,新换一个发行版的时候,也会犹豫 / 到底是分 15G 好还是 20G 好吧?
有了 Btrfs,你只需要分一个区就可以了,除非你想要休眠功能,那可以再分一个跟内存大小一样大的 swap 分区。
还在担心重装系统 /home 下文件会丢失?不用了,把 /home 分到一个单独的 子卷 中就可以啦!担心多系统问题?把 /boot 分到一个子卷中,就可以共享啦,然后再建一个其他操作系统的 / 子卷,往里面安新的操作系统吧!
子卷
上面的说明让你云里雾里?好吧,我来详细指点一下,多设备我不清楚,这里只说单设备,谁有多个硬盘自己研究去。
Btrfs 呢,自带了卷管理功能,所谓的卷呢,就是原来分区的概念,嗯,特别是在 LVM 中,就是这样。 LVM 中,划分子卷的时候也要指定子卷的大小,然后如果哪个子卷空间不够用了,可以用 LVM 的一套工具来改变大小。
这样其实跟原来分区的概念相差也不是很大,不过 Btrfs 中的子卷不是这样。在 Btrfs 中,所有子卷共用文件系统中所有的空间,在划分的时候是无需指定大小的。比如说你有个 80G 的 SSD 硬盘,全划分到一个 Btrfs 分区 sda1,而这个分区里面又有两个子卷 A 和 B,那么只要 A + B 的空间大小不超过 80G,两个子卷中哪个多点哪个少点根本没关系!
所以你再也不必为了 /boot 分小了而懊悔不已,不用为 / 分大了肉痛不已——它们共用一块空间,自身再也没有大小的概念了。
你可能要问,只分成一个 Btrfs 分区,那挂载的时候怎么办呢?仍然是通过挂载参数解决,比如:
<code class="language-console" data-lang="console"><span class="gp">$</span> mount /dev/sda1 /mnt -o <span class="nv">subvol</span><span class="o">=</span>root
<span class="gp">$</span> mount /dev/sda1 /mnt/home -o <span class="nv">subvol</span><span class="o">=</span>home</code>
虽然分区一样,不过由于子卷名称不一样,挂载时选择的子卷就不一样,很神奇。
快照
子曰:快照也是一种子卷,子卷是一种特殊的快照。
好,我们来挑战一下更难理解的概念—— 快照 。说到快照,就不得不提系统还原,最常见的系统还原就是 Ghost 那种啦,把文件系统整个复制一遍然后压缩成一个镜像,这个又慢又费空间,大家懂的。Windows 自己也有系统还原,似乎是基于文件级的,把重要的文件备份一下,挂掉之后还原一下,能不能恢复正常全看天命,哈哈。
总之现在现实世界中各种系统还原办法还都不怎么完美(什么苹果、ZFS,我没用过的东西谁提我跟谁急!),不过在虚拟机的世界里,快照的应用已经相当广泛。嗯,或许你早已经用过 Virtualbox 的快照功能了,完全的增量备份方式,不会重复占用空间,并且可以方便地对快照进行增加和删除,是不是很爽?
现在这种异次元才有的技术终于降临在 Linux 上了, Btrfs 让真机上的文件系统快照成为可能。
COW
Btrfs 的快照功能是通过 COW(Copy on write) 技术来实现的,这种技术实现起来很难,不过说起来很简单。可能很多人听说过, Linux 内核中创建进程时 fork() 就用了这个技术,所以据各种书籍吹嘘, Linux 下建进程要比 Windows 下快得多。
举个例子,比如你把 Btrfs 分区分成了 / 和 /home 两个子卷,然后装上了系统,这时你想搞个对 / 子卷的快照,以便以后系统折腾坏了之后可以恢复过来。于是你就建了个快照,快照名叫 ooxx 好了。
Btrfs 中快照的建立几乎是瞬间的事,因为实际上它并没有备份数据,而只是增加了引用计数,比如一个文件 /lib/libc.so.6 ,初始引用计数是 1,你每建立一个快照它就加 1 ,所以现在你建立了 ooxx,引用数就变成了 2。
如果你哪天心情好,把 rm -rf /usr/lib
写成了 rm -rf /usr /lib
,很遗憾你的 默认子卷 中的 /lib/libc.so.6 这个文件就没了。不过呢,这只是它的引用计数减 1 而已,快照 ooxx 中还对它持有一个引用,因此这个文件并没有真正消失,你还可以从 ooxx 中将其拷贝回来。
而哪天系统升级, 默认子卷 中 /lib/libc.so.6 被升级成了 /lib/libc.so.7,那么版本 6 的引用计数也是减一,同时在默认子卷中增加了一个版本 7 的文件。而快照 ooxx 完全不受此影响。
这就是 COW,也就是两者之间有差异的时候,再去修改差异的部分。如果没有差异,那么就无需重复的磁盘空间。
快照也是一种子卷,子卷是一种特殊的快照
这里反复提到 默认子卷 ,也就是刚装系统时划分的那些子卷,这些子卷跟快照又是什么关系?
其实默认子卷只是一种特殊的快照而已,还记得之前说过划分子卷时要指定 子卷名 么?其实子卷名就是快照名,一个道理,你不管 / 的子卷叫 root ,而是叫它 xxoo 也是可以的,不管 /home 的子卷叫 home,叫它 oxox 也是可以的。
你可能糊涂了:快照不是死的、只读的么?怎么跟子卷又是一回事了?
错!快照不是只读的!
你可以把 Btrfs 中的快照想象成新建了一个一模一样的子卷,还记得之前的挂载命令么?现在你也可以使用快照名作为子卷名来进行挂载并且读写!
<code class="language-console" data-lang="console"><span class="gp">$</span> mount /dev/sda1 /mnt/root -o <span class="nv">subvol</span><span class="o">=</span>root
<span class="gp">$</span> mount /dev/sda1 /mnt/snapshot_ooxx -o <span class="nv">subvol</span><span class="o">=</span>ooxx</code>
没错!你甚至可以将默认子卷和快照同时挂载在系统上,同时进行读写,有 COW 技术的后盾,完全不用担心会有混乱!
想想这个技术可以干什么?你可以挂载一下以前的快照,轻松找回误删的文件;你可以新建一个快照,全盘删除,然后装个别的系统,完全不用担心原来系统的安全[STRIKEOUT:;你甚至可以建立一个快照,专门存放各种 MV, PV, AV, GV ,只要不挂载,即使是其他 Linux 高手也很难发现]。
恢复系统
有了快照,怎么恢复系统呢?总不能把快照里面的文件都拷贝回来吧?
这个问题其实前面已经解答了。大家知道 Linux 下文件系统挂载主要是两个地方,一个是内核参数(也就是 GRUB 之类的配置文件里),一个是 /etc/fstab;大家还知道快照的挂载只需要修改挂载参数中的 subvol 的值就可以了,那么事情就简单了:想要恢复到哪个快照,直接挂载它就可以啦!
也就是说,系统的恢复只是改改配置文件的事,完全无需等待!当然以后可能还会有图形界面的工具出现。
快照的数量
我们可以在一个分区里面建立多少个快照?这个问题不要问我。我只能告诉你,如果你每天都在使用电脑,并且每天建立 100 个快照,那么你磁盘空间不足的时候, Btrfs 的 subvolid 肯定不会用完就是了。
所以你可以没事就建建快照,玩 RPG 的都会 S/L 大法吧?说不定少做了一次快照,前面就“请英雄重新来过”了,到时候哭都来不及。 Arch 下已经有了相应的工具自动建立快照,详情自行搜索。
总结
本文仅仅是从理论方面对 Btrfs 对普通[STRIKEOUT:折腾帝]用户的用处进行了阐述,如果[STRIKEOUT:我心情好]反响好的话我会写一篇实战篇,大家也可以去 Btrfs Wiki 上查看更详细的理论和实践知识。
根据最新接到的消息, Btrfsck 将在两周之内推出一个可以修复数据的初始版本 ,相信这个工具的推出,可以使更多折腾帝投入 Btrfs 的大潮之中,这篇文章,全当是为大家做个动员吧。
最后还是提醒,折腾有风险,千万别在 Btrfs 上存放重要数据,否则追悔莫及!谢谢支持!
PS: 长了草的博客,我对不起乃!我以后[STRIKEOUT:可能的话]一定痛改前非,专心写博!
转载请注明:爱开源 » 下一代文件系统 btrfs