Loading... <p> <span style="font-family: 宋体, SimSun;font-size: 20px">Btrfs(我们称之为Butter FS或者B-tree FS)被称为新一代的linux文件系统。一直以来,EXT文件系统以其卓越的稳定性成为linux标准的文件系统。但近年来,EXT3暴露出一些扩展性的问题(如单一文件大小限制、总文件系统大小限制等),于是便催生了EXT4。但同时,Btrfs向人们展现出诸多优秀的功能。目前很多厂商都投入到Btrfs文件系统的研发,诸多新的发行版也开始在新版本中支持此文件系统。<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong>一、btrfs文件系统的特性</strong></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong>1、多物理卷支持</strong>:btrfs可以又多个底层物理卷组成,支持raid,可以联机“添加”“删除”“修改”;<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong>2、写时复制更新机制(CoW)</strong>:对数据的修改是遵循复制、修改和替换指针。当我们修改某文件时,不是直接修改源文件,而是先复制一份进行修改,修改完成后将源文件指针指向修改后的文件。</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong>3、数据及元数据校验码</strong>:存储文件时会把数据和元数据的校验码通过文件某些扩展保存下来,在读取文件时快速校验文件是否损坏,如果损坏会自动尝试修复文件。<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong>4、子卷(sub_volume)</strong>:每个子卷可以单独挂载。<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong>5、支持快照功能snapshot。</strong><br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong> 6、透明压缩</strong>:自动通过占用cpu时钟周期的方式对数据自动进行压缩,读取的时候自动解压缩。<br /></span></p> <p></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong>二、btrfs文件系统的管理</strong><br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs在centos7以上版本中已经默认支持,对于7以下的版本,需要重新编译及更新内核,并安装相关的管理工具才可以使用。</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 为了更好的演示btrfs文件系统的相关功能,我们使用centos7系统,并单独添加一块硬盘,并划分三个独立分区sdb1、sdb2、sdb3。<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <img src="//cto.wang/usr/uploads/2016/07/20160703160908-20.png" title="1454399198472323.png" alt="blob.png" /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong> 1、创建btrfs</strong><br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 使用mkfs.btrfs命令创建btrfs<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> mkfs.btrfs [OPTIONS] '<device>' ['<device>'…]</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 14px"> <span style="font-family: 宋体, SimSun;font-size: 20px">常用选项:</span><br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> -L|–label <name> 指明卷标</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> -m|–metadata <profile> 指明元数据存放机制,Valid values are raid0, raid1, raid5, raid6, raid10, single or dup.</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> -d|–data <type>指明数据存放机制,Valid values are raid0, raid1, raid5, raid6, raid10 or single.</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> </span><span style="font-family: 宋体, SimSun;font-size: 20px"> -O|–features <feature1>[,<feature2>…]文件系统特性开关</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 可以通过mkfs.btrfs -O list-all查看支持哪些特性</span></p> <p style="text-align: left"><span style="font-family: 宋体, SimSun;font-size: 20px"> 我们将sdb1和sdb2作为底层卷一起创建卷标为mybtrfs的文件系统,且label被挂在sdb1上,大小为两个分区大小之和。</span></p> <p style="text-align: center"> <img src="//cto.wang/usr/uploads/2016/07/20160703160908-85.png" title="1454400888418337.png" alt="blob.png" /></p> <p> <span style="font-family: 宋体, SimSun;font-size: 20px">通过mount可以直接挂载使用该文件系统:</span></p> <p style="text-align: center"><img src="//cto.wang/usr/uploads/2016/07/20160703160908-91.png" title="1454401745885681.png" alt="blob.png" /></p> <p style="text-align: center"> 通过blkid查看两个分区的文件系统信息:<img src="//cto.wang/usr/uploads/2016/07/20160703160908-37.png" title="1454402145855572.png" alt="blob.png" /></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 可以看到两个分区的LABEL和UUID是一样的,说明两个分区属于一个文件系统卷,但是子卷id是不一样的。</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong> 2、btrfs文件系统的查看和设置</strong></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs filesystem show 查看</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> –mounted 查看所有挂载的btrfs</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> –all-devices 查看所有的btrfs,默认。</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs filesystem sync 将挂载的文件系统在内存中的数据同步到硬盘<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs filesystem df /PATH 查看已挂载文件系统的数据及元数据使用率情况。</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs filesystem label [<dev>|<mountpoint>] [<newlabel>] </span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 查看或修改设备或挂载点的卷标</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs filesystem resize resize [<devid>:]<size>[gkm]|[<devid>:]max <path> 调整文件系统大小</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 下面演示的是先减少500m空间然后还原。<br /></span></p> <p style="text-align: center"><span style="font-family: 宋体, SimSun;font-size: 20px"> <img src="//cto.wang/usr/uploads/2016/07/20160703160908-46.png" title="1454405297624923.png" alt="blob.png" /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong>3、btrfs设备的查看和设置</strong><br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs device add [-Kf] <dev> [<dev>…] <path></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 将分区sdb3加入到文件系统中,可以看到刚加入时候显示分区用量是0, 这是由于系统没有做数据均衡(balance),如果分区原来有别的文件系 统,可以用-f参数强制加入。 </span></p> <p style="text-align: center"><img src="//cto.wang/usr/uploads/2016/07/20160703160908-38.png" title="1454406380280908.png" alt="blob.png" style="font-family: 宋体, SimSun;font-size: 20px;text-align: center" /></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs device delete <dev> [<dev>…] <path></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 删除一个设备,删除是要保证文件系统容量大于文件总大小,系统会自动 将要删除设备中的文件移动到其他设备中。<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs device scan [(–all-devices|-d)|<device> [<device>…]]</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 扫描btrfs文件系统设备<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs device stats [-z] <path>|<device></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 查看文件系统I/O状态<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong>4、btrfs数据均衡</strong><br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 对于新加入的底层设备,可以通过balance子命令进行将数据均衡到各个设备中。 <br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs balance start <path>开始数据均衡<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <img src="//cto.wang/usr/uploads/2016/07/20160703160908-69.png" title="1454462872654585.png" alt="blob.png" /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs balance pause <path>暂停数据均衡,在数据量大且系统繁忙时<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs balance resume <path>继续暂停的数据均衡<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs balance cancle <path>取消在进行的或暂停的数据均衡</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs balance status <path>查看正在进行或暂停的数据均衡状态</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 通过balance子命令,还可以对数据和元数据的存放机制进行调整</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs balance -dconvert={raid#,single}调整数据存放机制</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs balance -mconvert={raid#,dup,single}调整元数据存放机制</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong>5、btrfs子卷(sub_volume)管理</strong></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 子卷(subvolume)是Btrfs的一个内部概念,每一个子卷构成一个子卷树。子卷相当于一个子文件系统,子卷中存储着在文件的元数据信息。这点需要区别于目录。通过subvolume子命令,可以创建、删除、查看子卷及快照卷</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs subvolume create [-i <qgroupid>] [<dest>/]<name></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 创建子卷,如果dest不指定就指子卷会被创建在当前目录中<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs subvolume delete [options] <subvolume> [<subvolume>…]</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 删除子卷<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs subvolume list [options] [-G [+|-]value] [-C [+|-]value] [–sort=gen,ogen,rootid,path] <path>查看子卷 </span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> -G +表示>=,-表示<=,不标注表示=<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <img src="//cto.wang/usr/uploads/2016/07/20160703160908-77.png" title="1454465099570857.png" alt="blob.png" /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 创建新的子卷后,如果父卷已经挂载,子卷会自动挂载。如果要单独挂载子卷,需要先卸载附卷。<br /></span></p> <p style="text-align: center"><span style="font-family: 宋体, SimSun;font-size: 20px"> <img src="//cto.wang/usr/uploads/2016/07/20160703160908-18.png" title="1454465684332949.png" alt="blob.png" /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 快照(Snapshots)其实就是一种特殊的子卷, 它能记录下在创建它的那一刻,它所在的父子卷(parent subvolume)的所有内容。 如果想要创建一个文件或系统的备份, 那么就可以通过创建快照来快速实现。</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs subvolume snapshot [-r] <source> <dest>|[<dest>/]<name></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 创建快照卷<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> </span></p> <p style="text-align: center"><span style="font-family: 宋体, SimSun;font-size: 20px"><img src="//cto.wang/usr/uploads/2016/07/20160703160909-50.png" title="1454466207748452.png" alt="blob.png" /></span></p> <p style="text-align: left"><span style="font-family: 宋体, SimSun;font-size: 20px"> 可以看到快照卷创建完成后自动完成了对于源目录的备份,当前文件系统有两个子卷</span></p> <p style="text-align: center"><span style="font-family: 宋体, SimSun;font-size: 20px"><br /></span><span style="font-family: 宋体, SimSun;font-size: 20px"><img src="//cto.wang/usr/uploads/2016/07/20160703160909-51.png" title="1454466319941855.png" alt="blob.png" /></span><span style="font-family: 宋体, SimSun;font-size: 20px"><br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs subvolume show <subvol-path>查看子卷的详细信息</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <strong>6、将其他文件系统转换为btrfs</strong><br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 卸载挂载的文件系统<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 强制检查文件系统 fsck -f dev<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 使用btrfs-convert dev装换<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 查看是否转换成功并挂载看是否正常<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 可以使用btrfs-convert -r dev回滚<br /></span></p> <p style="text-align: center"><span style="font-family: 宋体, SimSun;font-size: 20px"> <img src="//cto.wang/usr/uploads/2016/07/20160703160909-2.png" title="1454468117547666.png" alt="blob.png" /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> 可以看到转换后文件系统可以正常挂载且原来文件都保持正常。</span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> btrfs文件系统目前已经得到了各大linux发行版的支持,虽然目前或者将来很久一段时间EXT文件系统仍然是linux文件系统的主流。但是一个事物必定有自己的生命周期,让我们对btrfs拭目以待。<br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"> <br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"><br /></span></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"><br /></span></p> <p></p> <p></p> <p><span style="font-family: 宋体, SimSun;font-size: 20px"><br /></span></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信