Loading... <p>一. 简介</p> <p> btrfs有着强大的功能,它支持在多个及各种物理设备(包括RAID)上创建一个文件系统,并支持动态扩展或减小,支持快照功能,甚至快照的快照,支持子卷功能。</p> <p></p> <p>二. 如何使用btrfs文件系统?</p> <p> 我的准备材料:3块20G的硬盘</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# ls -l /dev | grep "\<[sh]d" ...... brw-rw----. 1 root disk 8, 16 Dec 6 10:33 sdb brw-rw----. 1 root disk 8, 32 Dec 6 10:33 sdc brw-rw----. 1 root disk 8, 48 Dec 6 10:33 sdd</pre> <p> btrfs命令简介:</p> <p> btrfs本身是个文件系统名称,同时又是一个命令名,它是一个大的命令,其中有分成一些小命令,我们可以通过man btrfs看到, 常用的有:</p> <pre class="brush:bash;toolbar:false"> subvolume <--子卷管理命令,可以man btrfs-subvolume查看器详细信息; Create/delete/list/manage btrfs subvolume. See btrfs-subvolume(8) for details. filesystem <--用来管理btrfs文件系统,可以man btrfs-filesystem查看详细信息; Manage a btrfs filesystem, including label setting/sync and so on. See btrfs-filesystem(8) for details. balance <--用来均衡各物理卷直接的数据量,man btrfs-balance; Balance btrfs filesystem chunks across single or several devices. See btrfs-balance(8) for details. device <--管理物理设备的命令,man btrfs-device; Manage devices managed by btrfs, including add/delete/scan and so on. See btrfs-device(8) for details.</pre> <p></p> <p> 废话少说,先创建一个btrfs文件系统看看再说吧;创建btrfs文件应使用mkfs.btrfs命令;</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# mkfs.btrfs -L T_BTRFS /dev/sdb /dev/sdc /dev/sdd Btrfs v3.16.2 See http://btrfs.wiki.kernel.org for more information. Turning ON incompat feature 'extref': increased hardlink limit per file to 65536 adding device /dev/sdc id 2 adding device /dev/sdd id 3 fs created label T_BTRFS on /dev/sdb nodesize 16384 leafsize 16384 sectorsize 4096 size 60.00GiB</pre> <p> 注: -L 后指定的是文件系统的LABEL</p> <p></p> <p> 查看btrfs的信息:</p> <p>下面两条命令效果相同,所以“–all-devices”省去比较好</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# btrfs filesystem show Label: 'T_BTRFS' uuid: c99895c8-5b14-4276-80c7-ecf1c96f25c1 Total devices 3 FS bytes used 112.00KiB devid 1 size 20.00GiB used 2.02GiB path /dev/sdb devid 2 size 20.00GiB used 1.01GiB path /dev/sdc devid 3 size 20.00GiB used 2.01GiB path /dev/sdd Btrfs v3.16.2 [root@localhost ~]# btrfs filesystem show --all-devices # show是个“btrfs filesystem”命令下的一个小命令,其实还有其他小命令,可以自行man查看; Label: 'T_BTRFS' uuid: c99895c8-5b14-4276-80c7-ecf1c96f25c1 Total devices 3 FS bytes used 112.00KiB devid 1 size 20.00GiB used 2.02GiB path /dev/sdb devid 2 size 20.00GiB used 1.01GiB path /dev/sdc devid 3 size 20.00GiB used 2.01GiB path /dev/sdd Btrfs v3.16.2</pre> <p> 可见T_BTRFS也有自己的UUID,我们可以通过查看任意一个装置的信息来查询T_BTRFS的UUID:</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# blkid /dev/sdd /dev/sdd: LABEL="T_BTRFS" UUID="c99895c8-5b14-4276-80c7-ecf1c96f25c1" UUID_SUB="b73a6dfa-e5b8-4621 -b92e-9c8301b71da6" TYPE="btrfs" [root@localhost ~]# blkid /dev/sdc /dev/sdc: LABEL="T_BTRFS" UUID="c99895c8-5b14-4276-80c7-ecf1c96f25c1" UUID_SUB="1e96c869-f99d-461c -8792-23bc0faa5ac4" TYPE="btrfs"</pre> <p> 可见btrfs的任何一个底层设备都能作为btrfs文件系统的一个入口。</p> <p> 挂载文件系统有两种方式,一种是使用btrfs文件系统的LABEL,另一种是使用文件系统的任何一个底层设备:</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# mount /dev/sdc /mnt/TEST_BTRFS/ [root@localhost ~]# umount /mnt/TEST_BTRFS/ [root@localhost ~]# mount -L "T_BTRFS" /mnt/TEST_BTRFS/</pre> <p> 此后的很多操作时需要一个挂载点(此处是/mnt/TEST_BTRFS/)作为一个参数传递到命令中去的,所以创建好btrfs文件系统后,挂载很有必要;</p> <p></p> <p> 从T_BTRFS中移除一个设备:</p> <p>使用的是btrfs device命令下的detect命令,其需要要移除的设备号及挂载点作为参数;</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# btrfs device delete /dev/sdd /mnt/TEST_BTRFS/ [root@localhost ~]# btrfs filesystem show Label: 'T_BTRFS' uuid: c99895c8-5b14-4276-80c7-ecf1c96f25c1 Total devices 2 FS bytes used 192.00KiB devid 1 size 20.00GiB used 308.00MiB path /dev/sdb devid 2 size 20.00GiB used 288.00MiB path /dev/sdc Btrfs v3.16.2</pre> <p> 可见/dev/sdd已从T_BTRFS中移除;</p> <p> 同上,只是使用了add命令;</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# btrfs device add /dev/sdd /mnt/TEST_BTRFS/ [root@localhost ~]# btrfs filesystem show Label: 'T_BTRFS' uuid: c99895c8-5b14-4276-80c7-ecf1c96f25c1 Total devices 3 FS bytes used 192.00KiB devid 1 size 20.00GiB used 308.00MiB path /dev/sdb devid 2 size 20.00GiB used 288.00MiB path /dev/sdc devid 3 size 20.00GiB used 0.00 path /dev/sdd Btrfs v3.16.2</pre> <p></p> <p> 在btrfs下的各设备间均衡数据的命令:</p> <p> 在各设备间均衡数据需要用到btrfs balance命令,其下有start,pause,cancel,resume,status小命令;</p> <p> start命令用于开始操作,它的下面又有一些OPTION,比较有用的有:</p> <pre class="brush:bash;toolbar:false"> -d[<filters>] act on data chunks. See FILTERS section for details about <filters>. -m[<filters>] act on metadata chunks. See FILTERS section for details about <filters>. <filters>见man btrfs-balance说明;</pre> <p>这两个OPTION看用于修改btrfs文件系统的RAID级别;</p> <p> pause,暂停,因为在设备间均衡数据比较消耗资源,消耗时间,所以有必要在合适的时候暂停操作;</p> <p> cancel,取消;</p> <p> resume,恢复操作;</p> <p> status,查看均衡操作执行的状态;</p> <p></p> <p> 先来看看start命令吧:</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# btrfs balance start /mnt/TEST_BTRFS/ <--注意传递给start的参数是挂载点 Done, had to relocate 5 out of 5 chunk</pre> <p> 修改RAID级别:</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# btrfs balance start -mconvert=raid5 -dconvert=raid5 /mnt/TEST_BTRFS/ Done, had to relocate 3 out of 3 chunks</pre> <p> -mconvert=raid5,修改元数据的存储方式为raid5</p> <p> -dconvert=raid5,修改数据的存储方式为raid5</p> <p> 注意大小写及参数。</p> <p></p> <p> 创建子卷:</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# btrfs subvolume create /mnt/TEST_BTRFS/logs Create subvolume '/mnt/TEST_BTRFS/logs'</pre> <p> 创建子卷就好比在父卷下创建一个目录;</p> <p> 查看子卷信息:</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# btrfs subvolume list /mnt/TEST_BTRFS/ ID 263 gen 64 top level 5 path logs</pre> <p> 263为subvolid,挂载时有用; </p> <p></p> <p> 挂载子卷:</p> <p> 若想使用子卷,须umount父卷,因为要么挂载子卷要么挂载父卷,只能选其一;</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# umount /mnt/TEST_BTRFS/ [root@localhost ~]# mount -o subvol=logs /dev/sdc /mnt/logs/</pre> <p> 注意:挂载子卷须使用mount的-o选项的subvol,且参数是btrfs的任意底层设备和挂载目录名;</p> <p> 也可以使用subvolid:</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# mount -o subvolid=263 /dev/sdc /mnt/logs/</pre> <p> 若在子卷中写入数据,当把子卷卸载,把父卷挂载之后,也可以通过“父卷/子卷目录”的方式访问原来存于子卷中的数据:</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# cp /etc/fstab /mnt/logs/ [root@localhost ~]# ls /mnt/logs/ fstab [root@localhost ~]# umount /mnt/logs/ [root@localhost ~]# mount -L "T_BTRFS" /mnt/TEST_BTRFS/ [root@localhost ~]# ls -l /mnt/TEST_BTRFS/logs/ total 4 -rw-r--r--. 1 root root 747 Dec 6 12:19 fstab</pre> <p> </p> <p> 使用快照:</p> <p> 快照相当于创建子卷,但是它是另一个子卷的副本;</p> <p> 快照使用的命令是:</p> <p> btrfs subvoloume snapshot /PATH/OT/SOURCE /PATH/TO/DEST</p> <p> 可以指定-r选项,是其只读;</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# btrfs subvolume snapshot /mnt/TEST_BTRFS/logs /mnt/TEST_BTRFS/logs_bak COMMENTS: 创建快照; Create a snapshot of '/mnt/TEST_BTRFS/logs' in '/mnt/TEST_BTRFS/logs_bak' [root@localhost ~]# btrfs subvolume list /mnt/TEST_BTRFS/ ID 263 gen 68 top level 5 path logs COMMENTS: 查看所有子卷,快照属于子卷的一类; ID 264 gen 68 top level 5 path logs_bak [root@localhost ~]# mkdir /mnt/logs_bak [root@localhost ~]# umount /mnt/TEST_BTRFS/ [root@localhost ~]# mount -o subvol=logs /dev/sdc /mnt/logs COMMENTS: 使用子卷名挂载; [root@localhost ~]# mount -o subvolid=264 /dev/sdc /mnt/logs_bak/ COMMENTS:使用子卷ID挂载; [root@localhost ~]# ls -l /mnt/logs total 4 -rw-r--r--. 1 root root 747 Dec 6 12:19 fstab [root@localhost ~]# ls -l /mnt/logs_bak/ COMMENTS: 快照中存在同样的文件; total 4 -rw-r--r--. 1 root root 747 Dec 6 12:19 fstab [root@localhost ~]# vim /mnt/logs/fstab [root@localhost ~]# cat /mnt/logs/fstab # # /etc/fstab # Created by anaconda on Sat Dec 5 19:08:23 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=5a0ee49d-e4de-49c9-9ea2-ea67aad90822 / ext4 defaults 1 1 UUID=3ca1f6c5-90d7-4b6e-bdf1-6417bf043869 /boot ext4 defaults 1 2 UUID=edfb83c3-b202-462c-a2b6-6721fefceee1 /home ext4 defaults 1 2 /dev/mapper/centos-usr /usr ext4 defaults 1 2 /dev/mapper/centos-var /var ext4 defaults 1 2 UUID=b188dad5-83fa-4edb-b044-3887fa66b838 swap swap defaults 0 0 NEW LINE HOW ARE YOU? <-- COMMENTS:修改原文件,添加新行; [root@localhost ~]# cat /mnt/logs_bak/fstab # # /etc/fstab # Created by anaconda on Sat Dec 5 19:08:23 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=5a0ee49d-e4de-49c9-9ea2-ea67aad90822 / ext4 defaults 1 1 UUID=3ca1f6c5-90d7-4b6e-bdf1-6417bf043869 /boot ext4 defaults 1 2 UUID=edfb83c3-b202-462c-a2b6-6721fefceee1 /home ext4 defaults 1 2 /dev/mapper/centos-usr /usr ext4 defaults 1 2 /dev/mapper/centos-var /var ext4 defaults 1 2 UUID=b188dad5-83fa-4edb-b044-3887fa66b838 swap swap defaults 0 0 COMMENTS: 快照中的文件没有变化。</pre> <p> </p> <p> 我们还能在一般的文件系统和btrfs文件系统之间转换:</p> <p><span class="Apple-tab-span"> </span>btrfs-convert /dev/sdd1 COMMENTS: 一般文件系统转换成btrfs文件系统;</p> <p><span class="Apple-tab-span"> </span>btrfs-convert -r /dev/sdd1 COMMENTS:btrfs文件系统转换回一般文件系统。</p> <p></p> <p> btrfs更详细的用法请man吧^_^。</p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信