Btrfs文件系统
     分类:杂项     有: 0 条评论

Btrfs文件系统

     分类:杂项     有: 0 条评论

Btrfs简介

Btrfs 是一个 Linux 中的新的写时复制(copy-on-write (COW))的文件系统,目的是实现高级功能的同时着重与容错功能,修复功能以及易于管理。

Btrfs核心特性
多物理卷支持:btrfs可由多个底层物理卷组成;支持RAID,以联机“添加”、“移除”、“修改”;

写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新;在文件进行修改的时候,首先将文件复制一份出来,在复制出来的文件上进行修改,修改完成之后,将指向原有文件的指针修改指向到修改完成的文件上,若修改完成的文件出现了错误,则我们可以通过原文件进行修复

数据及元数据校验码:checksum ,当存储某个文件时,checksum会将数据的源数据和数据的校验码,分别通过文件的属性扩展进行保存,当我们再次读取数据时可以方便的检测数据是否受损,如果文件受损系统可以完成自动修复;

子卷:sub_volume,在一个卷上创建多个子卷,在每一个子卷上创建文件系统,并挂载使用;

快照:支持快照的快照;因此可以实现类似增量快照的机制

透明压缩 :如果我们在存储文件时,进行压缩存储,那么在文件发往btrfs时,会自动的占用时钟周期,完成数据的压缩存放,而用户并不知道,在用户读取文件时,会自动的进行文件的解压缩,可以实现节约磁盘空间。但是压缩和解压缩会占用时钟周期;

Btrfs确实比ext4多了很多功能,快照功能更是很有使用价值,管理也比ext格式要方便一些。


创建Btrfs文件系统

mkfs.btrfs

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文件系统

mark
mark

mkdir /my20G                      #创建挂载目录
mount /dev/sdae /my20G/           #挂载  
mount | grep /my20G               #已挂载成功
df -h

#man btrfs filesystem 可用来查看命令帮助文档

mark


调整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
常用选项有:

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


快照

https://blog.csdn.net/frozenshore/article/details/44245467

(●゚ω゚●)