前言
一种技术要知其然,还要知其所以然。
Btrfs文件系统
Btrfs(B-tree文件系统,通常念成Butter FS,Better FS或B-tree FS),一种支持写入时复制(COW)的文件系统,运行在Linux操作系统,采用GPL授权。Oracle于2007年对外宣布这项计划,并发布源代码,在2014年8月发布稳定版目标是替换Linux目前的ext3文件系统,改善ext3的限制,特别是单个文件的大小,总文件系统大小或文件检查和加入ext3未支持的功能,像是可写快照(writable snapshots)、快照的快照(snapshots of snapshots)、内建磁盘阵列(RAID),以及子卷(subvolumes)。Btrfs也宣称专注在“容错、修复及易于管理”。
引用于(https://zh.wikipedia.org/wiki/Btrfs)
Btrfs文件系统的核心特性
1.多物理卷支持:btrfs文件系统可由多个底层物理卷组成;支持RAID,以联机“添加”、“移除”,“修改”;
2.写时复制更新机制(CoW): 所谓 COW,即每次写磁盘数据时,先将更新数据写入一个新的 block,当新数据写入成功之后,再更新相关的数据结构指向新 block 。复制、更新及替换指针,而非“就地”更新; ”就地“更新是指地址指针指向。
3.数据及元数据校验码(checksum):btrfs在读取数据的同时会读取其相应的 checksum 。如果最终从磁盘读取出来的数据和 checksum 不相同,btrfs 会首先尝试读取数据的镜像备份,如果数据没有镜像备份,btrfs 将返回错误。写入磁盘数据之前,btrfs 计算数据的 checksum 。然后将 checksum 和数据同时写入磁盘。
4.子卷:Subvolume 是很优雅的一个概念。即把文件系统的一部分配置为一个完整的子文件系统,称之为 subvolume 。 采用 subvolume,一个大的文件系统可以被划分为多个子文件系统,这些子文件系统共享底层的设备空间,在需要磁盘空间时便从底层设备中分配,类似应用程序调用 malloc() 分配内存一样。可以称之为存储池。这种模型有很多优点,比如可以充分利用 disk 的带宽,可以简化磁盘空间的管理等
5.快照:支持快照的快照;可以在快照中在做快照
6.透明压缩:在用户写入数据时系统会自动进行压缩,而用户调用数据的过程是一个解压缩的过程,但是这个过程,对用户来说是透明的,是自动进行的。
7.多设备管理:Btrfs 支持动态添加设备。用户在系统中增加新的磁盘之后,可以使用 btrfs 的命令将该设备添加到文件系统中。为了灵活利用设备空间,Btrfs 将磁盘空间划分为多个 chunk 。每个 chunk 可以使用不同的磁盘空间分配策略。比如某些 chunk 只存放 metadata,某些 chunk 只存放数据。一些 chunk 可以配置为 mirror,而另一些 chunk 则可以配置为 stripe 。这为用户提供了非常灵活的配置可能性。
引用于(http://lirui213.blog.51cto.com/4449582/1689754) 进行了一点修改
Btrfs的应用和管理常用的命令
Btrfs文件系统创建需要用到的命令:
mkfs.btrfs -L 'LABEL':建立卷标。
-d : raid0, raid1, raid5, raid6, raid10, single指明确文件系统的类型
-m : raid0, raid1, raid5, raid6, raid10, single, dup指明类型
-O 指明格式化是,启动的特性 -O list-all: 列出支持的所有feature;
Btrfs的文件挂载和管理
属性查看:
btrfs filesystem show
挂载文件系统:
mount -t btrfs /dev/sdb MOUNT_POINT
透明压缩机制:
mount -o compress={lzo|zlib} DEVICE MOUNT_POINT 常用的子命令 1.subvolume
<–子卷管理命令,可以man btrfs-subvolume查看器详细信息;
btrfs subvolume create /PATH/subvolumename:创建子卷 此路径必须在btrfs文件系统的挂载目录下
btrfs subvolume delete 删除子卷
btrfs subvolume list:列出所有子卷
btrfs subvolume snapshot
| :创建快照
btrfs subvolume get-default:默认卷
btrfs subvolume set-default:设置默认卷
btrfs subvolume show:用来查看子卷的详细信息
2.filesystem
<–用来管理btrfs文件系统,可以man btrfs-filesystem查看详细信息;
btrfs filesystem show:显示详细信息
btrfs filesystem show –mounted:显示已经挂载的文件系统的详细信息
btrfs filesystem show –all-device:显示所有文件系统的详细信息
btrfs filesystem show /PATH: 显示指定的文件系统的详细
btrfs filesystem label:显示文件系统的label
btrfs filesystem resize:缩减或者增大文件系统的容量
btrfs filesystem df:显示已经挂载的文件系统的信息
btrfs filesystem sync同步操作
3.balance <–用来均衡各物理卷直接的数据量,man btrfs-balance;
btrfs balance start:开始均衡文件系统
btrfs balance start -dconvert:修改数据的组织机制,即raid级别
btrfs balance start -mconvert修改元数据的组织机制,即raid级别
btrfs balance start -sconvert:修改系统的组织机制,即raid级别
btrfs balance pause:停止
btrfs balance cancel取消
btrfs balance resume继续
btrfs balance status 查看均衡状态
4.device <–管理物理设备的命令,man btrfs-device;
btrfs device add :添加设备
btrfs device delete :从文件系统中移除或者去除设备
btrfs device ready :
btrfs device stats [-z] |:
实验
实验环境:centos 7 实验材料:3块10G的硬盘
第一步:先用VMware来创建3个虚拟硬盘,
第二步:mkfs.btrfs -L experiment /dev/sdb /dev/sdc:就是把sdb和sdc两块硬盘格式化成以卷标为experiment的文件系统
第三步: mount /dev/sdb 或者/dev/sdc都可以挂载 将两块硬盘挂载到/mnt/experiment
第四步: btrfs filesystem df /mnt blkid /dev/sdb blkid /dev/sdc blkid命令 获取文件系统类型、UUID 发现父UUID都是一样的,但是子UUID是不一样的,可以看出它是支持多卷的。
第五步: 对btrfs文件的size缩小和增大
第6步: 对btrfs文件添加硬盘 btrfs device add :添加设备 btrfs device delete :从文件系统中移除或者去除设备
第七步: 刚加进来的硬盘数据时0,想要让后加进来的硬盘有数据,那就得进行数据均衡,数据均衡就要用到 btrfs balance
第八步: 对btrfs文件系统的硬盘卸载 发现数据会自动移动 还未卸载的硬盘上 数据没有丢失,
第八步: 对btrfs文件系统进行子卷操作
[root@localhost experiment]# btrfs subvolume create /mnt/experiment/subvolume Create subvolume '/mnt/experiment/subvolume' #创建子卷subvolume [root@localhost experiment]# btrfs subvolume list /mnt/experiment/subvolume/ ID 262 gen 62 top level 5 path subvolume #ID 是这个子卷的ID可以此ID进行挂载 #查看子卷信息 [root@localhost experiment]# btrfs subvolume show /mnt/experiment/subvolume/ /mnt/experiment/subvolume Name: subvolume uuid: 39fc0341-19d0-1a43-9a0b-64ea90b29ab5 Parent uuid: - Creation time: 2016-05-22 21:27:29 Object ID: 262 Generation (Gen): 62 Gen at creation: 62 Parent: 5 Top Level: 5 Flags: - Snapshot(s): [root@localhost tmp]# mount -o subvol=subvolume /dev/sdb /tmp/subvolume #进行挂载
Note: 我忘了mount的这个用法,就重新在看看。
-o options:(挂载文件系统的选项) async:异步模式;一般使用异步模式 sync:同步模式; atime/noatime:包含目录和文件的访问时间戳;默认情况下使用 diratime/nodiratime:目录的访问时间戳 auto/noauto:是否支持自动挂载 exec/noexec:是否支持将文件系统上应用程序运行为进程 dev/nodev:是否支持在此文件系统上使用设备文件; suid/nosuid:是否支持suid remount:重新挂载 ro:表示只读 rw: 表示读写 user/nouser:是否允许普通用户挂载此设备 acl:启用此文件系统上的acl功能 acl访问控制列表 [root@localhost tmp]# ls /tmp/subvolume/ [root@localhost tmp]# btrfs subvolume show /tmp/subvolume /tmp/subvolume Name: subvolume uuid: 39fc0341-19d0-1a43-9a0b-64ea90b29ab5 Parent uuid: - Creation time: 2016-05-22 21:27:29 Object ID: 262 Generation (Gen): 62 Gen at creation: 62 Parent: 5 Top Level: 5 Flags: - Snapshot(s):
查看子卷
[root@localhost tmp]# cp /var/log/messages /tmp/subvolume/
复制数据到子卷
[root@localhost tmp]# ls /tmp/subvolume/ messages [root@localhost tmp]# ls /mnt/experiment/ grub2.cfg issue subvolume/ [root@localhost tmp]# ls /mnt/experiment/subvolume/ messages [root@localhost tmp]# umount /tmp/subvolume/ [root@localhost tmp]# mkdi mkdict mkdir [root@localhost tmp]# mkdir /tmp/test [root@localhost tmp]# mount /dev/sdb /tmp/test/ [root@localhost tmp]# ls /tmp/test/ grub2.cfg issue subvolume [root@localhost tmp]# ls /tmp/test/subvolume/ messages
Note:子卷中的内容是可见,所以一旦父卷挂载,子卷就被自动被挂载了 如果只有单单挂载了子卷,父卷内容是不会自动挂载的,其内容是不可见的。
第九步:删除子卷 [root@localhost tmp]# umount /tmp/test/
[root@localhost tmp]# btrfs subvolume delete /mnt/experiment/subvolume/ Delete subvolume (no-commit): '/mnt/experiment/subvolume' #删除子卷 [root@localhost tmp]# btrfs subvolume list /mnt/experiment/ grub2.cfg issue #子卷信息没了
总结 还有很多操作还没做,以后有时间在更新,还有子卷快照,ext文件系统和btrfs文件系统互转等等
原创文章,作者:N19_king,如若转载,请注明出处:http://www.178linux.com/16503