btrfs功能 - 子卷
btrfs文件系统的子卷,不同于块设备,更像是一个可独立挂载的文件树。也可以简单的看作文件夹或目录。
每个子卷都有独立的(fs tree)inode table和目录结构树,他的顶层子卷和其他子卷,都具有独立的可挂载的根。因为子卷具有独立的inode table 从而为以子卷为单位拍快照打下了良好的基础。
可以在系统目录的任何地方,甚至都不用担心文件系统等级和嵌套,都可以随意的创建子卷。而嵌套的子卷会作为一个子目录出现在父目录中。就像在父目录下创建一个目录那么简单。
btrfs子卷不是块设备,不能对他进行类似dd这样的操作
# 添加删除子卷。 删除还可以用mv rm-rf等对文件夹操作的命令 有嵌套的子卷要一层一层的删除
btrfs subvolume delete /home/test01
btrfs subvolume create /home/test01/test02/test03
# 查看home 下的子卷列表
btrfs subvolume list /home
# 查看子卷的详细信息
btrfs subvolume show /home/test01/
btrfs功能 - 透明压缩
透明压缩 :在用户不知不觉的情况下,对文件系统上的数据进行压缩。
默认支持的算法有zlib,lzo还有zstd。
不仅仅能够对btrfs文件系统下的目录进行压缩,还能对整个卷来实现压缩。
三种方法 (前两种能够对后续数据的写入实现压缩 ,最后一种能对已有数据进行压缩)
1 定义挂载选项
2 修改btrfs的属性
3 通过defray来实现了
透明压缩算法
zlib: 比较慢,但是压缩率高,适合备份的时候使用
lzo: 速度稍快,但是压缩率比较低,btrfs 文件系统默认提供的压缩算法,即能够兼顾速度,又能够有一个比较好
zstd:势和lzo算法差不多,压缩和解压速度更加优秀,,同时又提供了很多压缩级别供用户选择,更受用户青睐
小细节
从什么时候开始,对btrfs文件系统的数据,开始进行透明压缩的?一般情况下从文件系统挂载的时候开始就采用挂载选项中用户自定义的透明压缩算法对后续写入的文件和数据开始进行透明压缩了
我们如何才能知道btrfs文件系统中的数据采用了什么类型的透明压缩,可以使用compsize这个工具,调用btrfs ioctl来读取文件的extent的属性
在挂载选项中有强制压缩的选项,普通压缩的选项,有什么区别? 强制压缩就是直接调用压缩算法,对数据进行压缩,但有些数据即便是压缩了,与实际大小没什么区别。 而普通压缩的选项会对数据先跑一遍压缩预测进行分析,有一些数据在压缩前后意义不大,就不采用压缩算法了
透明压缩适用范围 能够对磁盘和卷进行透明压缩,但是不能够对每个子卷来实行压缩。折中的方法,就是对子卷的目录启用压缩来模拟这个过程,(可能子卷压缩已经可以)
透明压缩对于数据的写入和写时复制有怎样的影响,如果数据写入的方式采用了Direct IO的话 ,是不会使用到透明压缩的。但是如果一个文件被使用了Direct IO的模式打开了,那么实际上btrfs将使用缓存IO的模式来实现。
另外如果使用了透明压缩,默认情况下采用写时复制,但是在关闭写时复制功能的btrfs上的透明压缩,也将无法启用
# 方法一
# 挂载 -t 指定文件系统类型 -o compress = lzo 压缩功能及算法
mount -t btrfs -o compress=lzo /dev/vdd /ccc
# -o compress-force=lzo 强制压缩 不加就普通压缩
mount -t btrfs -o compress-force=lzo /dev/vdd /ccc
# 查看压缩信息
zypper install compsize
compsize /ccc
# 方法二
# 启动挂载 6即是压缩等级。 后续新写入的文件就会zstd压缩了
vim /etc/fstab
UUID=f7947115-8244-4ecd-af86-87ce80c6fb3a /test btrfs defaults,compress=zstd:6 0 0
btrfs功能 - 快照
btrfs作为写时复制的文件系统,明显的优势就是快照的速度非常快,几乎瞬间完成,硬盘设备的速度是不会影响到拍快照的速度的。
快照只对子卷拍,如果下面有嵌套是不会对他们做快照的。嵌套的都是空目录 而已
不是什么 都可以拍快照,比方想对目录拍快照,就不行了。解决办法:创建一个新的子卷,在子卷中做指向目标目录的跨子卷引用链接,这样给子卷拍快照,就能包含这个目录的内容了
btrfs的快照就是一种子卷的表现形式,共享了其他子卷数据和元数据,具有写时复制并针对原先子卷的快照的修改是不可见的,快照就是来实现备份,比如创建一个可读写的快照,必要的时候卸载原来的子卷,挂载快照,实现系统恢复或者找回误删除的文件
# 创建子卷
btrfs subvolume create /mnt/test
创建文件
touch /mnt/test/file01
touch /mnt/test/file02
vim /mnt/test/file01
vim /mnt/test/file03
localhost:~ # ls -l /mnt/test
总用量 8
-rw-r--r-- 1 root root 16 5月 10 16:14 file01
-rw-r--r-- 1 root root 0 5月 10 16:14 file02
-rw-r--r-- 1 root root 41 5月 10 16:15 file03
# 创建快照可读写
btrfs subvolume snapshot /mnt/test /mnt/.test_01
# 创建快照只读 更安全
btrfs subvolume snapshot -r /mnt/test /mnt/.test_02
# 恢复 就直接复制过去就好了
cp /mnt/.test_02/file03 /mnt/test
# 删除快照
btrfs subvolume delete
rm -rf
btrfs功能 - 文件系统克隆
# 为根目录创建 只读快照 一是安全,二是发送和接收只能是只读快照
btrfs subvolume snapshot -r / /.newroot
# 挂载第二块硬盘
mount -t btrfs /dev/vdd /mnt
# 发送并接收快照。 发送和接收只能是只读快照
btrfs send /.newroot/ | btrfs receive /mnt
# 这个是ssh远程发送只读快照
btrfs send /.newroot/ | ssh root@192.168.88.123 btrfs receive /mnt/RootBtrfs/@Snapshots
# 这两个命令 一个有双引号,一个没有似乎都可以
btrfs send /.newroot/ | ssh root@192.168.88.123 “btrfs receive /mnt/RootBtrfs/@Snapshots”
# 根据快照创建可读写的快照
btrfs subvolume snapshot /mnt/.newroot/ /mnt/.root
# 把读写快照的文件移动到/mnt
mv /mnt/.root/* /mnt
# 查询uuid 把新的fstab文件修改掉。根目录的
blkid
vim /mnt/etc/fstab
# 把grub.cfg 的uuid换成新的重启
vim /boot/grub2/grub.cfg
btrfs功能 - 将ext4文件系统装换成Btrfs
必须离线进行操作d
版本必须在 5.6.1之上 btrfs-progs v6.5.1
# 必须离线进行操作
umount /mnt
# 转换会生成快照
btrfs-convert /dev/vdd
# 记得修改fstab
btrfs功能 - 文件系统种子
就是创建一个只读的设备
过时技术
# 必须离线设置 1为true 创建一个只读的设备
btrfstune -S 1 /dev/vdd
mount /dev/vdd /mnt/seed
# 添加新的 读写层设备到
btrfs device add /dev/vdc /mnt/seed
# 然后可读写重新挂载 这样就可读写了
mount -o remount,rw /mnt/seed
# 不用的时候可以删除第二块设备,所有写的设备就在第二块上
# 就相当于一个还原卡 第二块设备还有全部的数据
btrfs功能 - 去重 重复数据删除
btrfs文件系统仅支持out-of-bang (先存到硬盘然后去重)去重
利用第三方工具 duperemove
btrfs功能 - 文件系统作为SWAP
# 之前的版本
truncate -s 0 ./swapfile
chattr +C ./swapfile
btrfs property set ./swapfile compression none
dd if=/dev/zero of=/swapfile bs=1M count=512
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
free
# 从 6.1 版本开始,可以在单个命令(激活除外)中创建交换文件:
btrfs filesystem mkswapfile --size 2G swapfile
swapon swapfile
# 激活后,文件将出现在 :/proc/swaps
cat /proc/swaps
Filename Type Size Used Priority
/path/swapfile file 2097152 0 -2
# 添加到开机挂载
vim /etc/fstab
/path/swapfile none swap defaults 0 0