Btrfs简介
Btrfs 是一个 Linux 中的新的写时复制(copy-on-write (COW))的文件系统,目的是实现高级功能的同时着重与容错功能,修复功能以及易于管理。
Btrfs核心特性:
多物理卷支持:btrfs可由多个底层物理卷组成;支持RAID,以联机“添加”、“移除”、“修改”;
写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新;在文件进行修改的时候,首先将文件复制一份出来,在复制出来的文件上进行修改,修改完成之后,将指向原有文件的指针修改指向到修改完成的文件上,若修改完成的文件出现了错误,则我们可以通过原文件进行修复
数据及元数据校验码:checksum ,当存储某个文件时,checksum会将数据的源数据和数据的校验码,分别通过文件的属性扩展进行保存,当我们再次读取数据时可以方便的检测数据是否受损,如果文件受损系统可以完成自动修复;
子卷:sub_volume,在一个卷上创建多个子卷,在每一个子卷上创建文件系统,并挂载使用;
快照:支持快照的快照;因此可以实现类似增量快照的机制
**透明压缩 **:如果我们在存储文件时,进行压缩存储,那么在文件发往btrfs时,会自动的占用时钟周期,完成数据的压缩存放,而用户并不知道,在用户读取文件时,会自动的进行文件的解压缩,可以实现节约磁盘空间。但是压缩和解压缩会占用时钟周期;
Btrfs确实比ext4多了很多功能,快照功能更是很有使用价值,管理也比ext格式要方便一些。
创建Btrfs文件系统
mkfs.btrfs
- -L 'LABEL':指定文件系统的卷标;
- -d [type]: raid0, raid1, raid5, raid6, raid10, single 指明数据的存放方式,支持RAID机制;
- -m [profile]:raid0, raid1, raid5, raid6, raid10, single, dup 指明元数据的存放方式,是否可跨越多个物理卷,支持RAID机制;
- -O [feature]:在格式化文件系统的时候,是否直接开启文件系统的某些特性;
- -O list-all:列出支持的所有特性;
fdisk -l
拿这个20G的盘开刀。
mkfs.btrfs -L my20G_date /dev/sdae #创建btrfs 文件系统
#也可以多块硬盘mkfs.btrfs -L my20G_date /dev/sdae /dev/sdc 这样就把两块硬盘合并起来管理。
blkid /dev/sdae #查看设备sdae的属性,可以看到TYPE="btrfs"
btrfs filesystem show #查看系统上的所有btrfs文件系统
mkdir /my20G #创建挂载目录
mount /dev/sdae /my20G/ #挂载
mount | grep /my20G #已挂载成功
df -h
#man btrfs filesystem 可用来查看命令帮助文档
调整btrfs文件系统大小(逻辑边界)
btrfs调整大小只要一条命令就行,几乎是瞬间完成的。
命令格式:btrfs filesystem resize <size(单位G,K,M)>或者max <path>
btrfs filesystem resize -10G /my20G #将分区缩小10G,单位可以是M,K。
df -h #可以看到已经缩小了10G了
btrfs filesystem resize +5000M /my20G #将分区扩大5000M,单位可以是M,K。
df -h #可以看到已经增加了近5G空间
btrfs filesystem resize max /my20G #max,将文件系统大小调整至其物理边界,可用最大的存储空间。
调整btrfs物理边界大小
物理边界就属于硬件范畴了,增加或去掉硬盘。
命令格式:btrfs device <add/delete/scan> <dev> <mount_point>
btrfs device add /dev/sdd /my20G #为btrfs文件系统,增加一块硬盘sdd
df -lh #完成后,容量已经扩充了
透明压缩
只需在挂载时候,使用-o 并指定压缩方式即可,对用户是透明的,可以选择lzo或zlib两种压缩方式
命令格式:mount -o compress={lzo|zlib} DEVICE MOUNT_POINT
mount -o compress=lzo /dev/sdae /my20G
mount -o compress=zlib /dev/sdae /my20G
btrfs文件均衡
命令格式:btrfs balance start [OPTIONS] <FILTERS> MOUNT_POINT
常用选项有:
- -d: 指定数据的组织机制
- -s:指定元数据的组织机制
- -m:指定文件系统的组织机制
btrfs device add /dev/sdd /my20G #为btrfs文件系统,增加一块硬盘sdd
btrfs filesystem show #查看btrf文件系统信息
btrfs balance start /my20G #均衡文件
btrfs balance start -mconvert=raid5 /my20G #均衡文件,并使用raid5(最少3块硬盘)组织文件系统,RAID模式还要注意每块硬盘的容量大小。
删除btrfs的物理卷
如果只有一个硬盘的话是无法删除的。
btrfs device delete /dev/sdd /my20G #将sdd设备移除
df -lh /my20G #容量减少了
btrfs filesystem show /my20G #sdd被删掉了
ext文件系统和btrfs文件系统互转
命令格式:btrfs-convert [-r] Device
-r:从btrfs回滚到之前的文件系统,不使用-r 代表从普通文件系统,转化成btrfs文件系统
先说说硬盘拆分,架设现在用了3块硬盘组的RAID5,先降级为RAID1才可以拆掉其中一块
拆分硬盘
btrfs balance start -mconvert=raid1 /my20G
btrfs balance start -dconvert=raid1 /my20G
btrfs device delete /dev/sdd /my20G #此时移除设备sdd
从ext4转为Btrfs
#创建ext4分区
fdisk /dev/sdd #将sdd重新创建分区sdd1
mkfs.ext4 /dev/sdd1 #格式化为ext4文件系统
mount /dev/sdd1 /mnt #挂载sdd1
ls /mnt
cp /etc/fstab /mnt #复制文件fstab到 /mnt
ls /mnt
umount /mnt #卸载文件系统,不要在线做文件系统转换
fsck -f /dev/sdd1 #做强制检测
#将ext4装换为Btrfs
btrfs-convert /dev/sdd1
btrfs filesystem show #sdd1已经转化成了btrfs文件系统
mount /dev/sdd1 /mnt
ls /mnt
cat /mnt/fstab #之前的文件fstab仍旧可以正常访问
从Btrfs转为ext4
umount /mnt
btrfs-convert -r /dev/sdd1
mount /dev/sdd1 /mnt
ls /mnt
blkid /dev/sdd1 #参考sdd1信息,可见TYPE="ext4"
cat /mnt/fstab #且原文件仍旧可以正常访问
btrfs子卷管理
创建子卷:
命令格式: btrfs subvolume create /PATH
此路径必须是在btrfs文件系统的挂载目录下
btrfs subvolume create /my20G/subvol #创建子卷,子卷名为subvol
btrfs subvolume create /my20G/subvol1 #再创建子卷,子卷名为subvol1
btrfs subvolume list /my20G #查看btrfs 文件系统下的所有子卷信息
ID 262 gen 73 top level 5 path subvol #ID 262 是子卷subvol的ID,可以用该ID来挂载该卷
ID 263 gen 74 top level 5 path subvol1
挂载子卷
命令格式: mount -o subvol=SUBVOLUME DEVICE /MOUNT_POIN
mount -o subvol=subvol /dev/sdae /mnt #将子卷单独挂载到/mnt目录下
ls /mnt #此时是没有任何内容的
查看子卷相关信息
挂载父卷,子卷自动被挂载
命令格式:btrfs subvolume show MOUNT_POINT
btrfs subvolume show /mnt #查看子卷信息
cp /var/log/messages /mnt #复制messages文件到子卷subvol
ls /mnt
umount /mnt #卸载子卷subvol
mount /dev/sdae /my20G #将这个btrfs文件系统挂载到/my20G目录
ls /my20G
ls /my20G/subvol #可见子卷subvol的内容是可见的,所以说一旦父卷挂载,子卷就被自动挂载了
挂载子卷,父卷不会自动被挂载
umount /my20G #卸载父卷,
mount -o subvol=subvol /dev/sdae /my20G #单独挂载子卷
ls /my20G/ #此时/my20G下只有子卷的内容,并不会有父卷的内容:如subvol,subvol1目录
注:由于是子卷,如果父卷已经挂载,则子卷就自动被挂载了
反之,如果只挂载子卷,父卷内容是不会自动挂载的,其内容,不可见
分别挂载子卷和父卷(不要先挂载父卷)
子卷,父卷也可以分别挂载:(可是没必要单独挂载子卷,父卷挂载完成后,子卷也就被自动挂载了)
umount /my20G #卸载子卷
mount -o subvol=subvol /dev/sdae /mnt #挂载子卷到/mnt目录
mount /dev/sdae /my20G #挂载父卷到/my20G目录
ls /my20G/ #此时父卷挂载成功
ls /mnt #子卷内容也可单独显示
删除子卷
命令格式:btrfs subvolume delete /MOUNT_POINT
btrfs subvolume delete /my20G/subvol #删除子卷subvol
btrfs subvolume list /my20G #已经没有了子卷subvol信息了
子卷快照
命令格式:btrfs subvolume snapshot /PATH/TO/SUBVOLUME /PATH/TO/SNAPSHOT
cp /etc/passwd /my20G/subvol1/ #复制passwd文档到子卷subvol1内
btrfs subvolume snapshot /my20G/subvol1/ /my20G/subvol1_snapshot #创建快照subvol1_snapshot
btrfs subvolume list /my20G #快照子卷subvol1_snapshot创建完成
echo "TEST FOR SNAPSHOT" >> /my20G/subvol1/passwd #在passwd文档后追加一行 "TEST FOR SNAPSHOT"
tail -1 /my20G/subvol1/passwd #此时子卷中数据更新了
tail -1 /my20G/subvol1_snapshot/passwd #此时快照中的passwd并没有更新,末尾没有"TEST FOR SNAPSHOT" 这行。
注:在子卷创建快照后,对原子卷做的修改操作并不会反映到快照中。
参考:http://siyuan710.blog.51cto.com/10648912/1699070
评论区