btrfs是Linux系统上一种非常强大的文件系统,全称:B-tree,是Oracle公司基于GPL协定于2007年研发的。那么对于btrfs文件系统我们如何去创建使用它呢。
下面我们将以CentOS7系统在实验中研究它。
一、了解btrfs的特性
btrfs文件系统有很多的特性 ,我们这边就它的几个核心的特性说下:
1、多物理卷支持:btrfs可由多个底层物理卷组成;支持RAID,以联机“添加”、“移除”、“修改”。
2、写时复制更新机制:复制、更新及替换指针,而非“就地”更新;
3、数据与元数据校验码:checksum
4、支持子卷:可以在btrfs文件系统下创建子卷
5、支持快照
6、透明压缩:指的文件的存储是压缩的形式,而对于用户来说我们并不知道
二、如何创建btrfs文件系统
首先创建btrfs文件系统我们需要多块磁盘,在虚拟机中我们要添加几块磁盘
[root@localhost ~]# fdisk -l
磁盘 /dev/sda:128.8 GB, 128849018880 字节,251658240 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000abcfd
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 251658239 125316096 8e Linux LVM
磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
如上我添加了3块磁盘分别是sdb、sdc和sdd分别给它们的空间是20G
[root@localhost ~]# btrfs <==============点击2次TAB键可以看出以下好多命令和btrfs文件系统有关的命令
btrfs btrfs-debug-tree btrfs-map-logical btrfs-zero-log
btrfsck btrfs-find-root btrfs-show-super
btrfs-convert btrfs-image btrfstune
[root@localhost ~]# btrfs
我们这边只说btrfs文件系统的常用命令:
1、mkfs.btrfs :创建btrfs文件系统
-L “LABEL”:指定卷标
-d <type> : 指定数据存储的类型,如:raid0,raid1,raid5,raid10,single
-m:指明元数据是指明存放的
-O <feature>:指明一些选项
-O list-all:列出支持的所有feature
[root@localhost ~]# mkfs.btrfs -L mydata /dev/sdc /dev/sdd <===把dev下的sdc和sdd两块磁盘创建成一个
Btrfs v3.16.2 名为mydata的btrfs文件系统
See http://btrfs.wiki.kernel.org for more information.
Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
adding device /dev/sdd id 2
fs created label mydata on /dev/sdc
nodesize 16384 leafsize 16384 sectorsize 4096 size 40.00GiB
[root@localhost ~]#
2 、查看btrfs是否创建成功使用命令:btrfs filesystem show 如下
[root@localhost ~]# btrfs filesystem show /dev/sdc
Label: 'mydata' uuid: 179e892a-aa8b-4f25-825d-c0a87d99096d
Total devices 2 FS bytes used 612.00KiB
devid 1 size 15.00GiB used 1.28GiB path /dev/sdc
devid 2 size 20.00GiB used 1.28GiB path /dev/sdd
Btrfs v3.16.2
注:我们创建文件系统的时候指定了两个磁盘,我们这边的路径使用/dev/sdc 和使用/dev/sdd效果是一样的
3 、我们上面对btrfs文件系统创建的卷标为mydata,我们使用命令查看卷标是否是我们创建的mydata
[root@localhost ~]# btrfs filesystem label /dev/sdc
mydata
4、如上我们创建好了btrfs文件系统和查看卷边的命令,那么如何去挂载和使用这个文件系统呢?
[root@localhost ~]# mkdir /mydata <====创建目录mydata
[root@localhost ~]# mount -t btrfs /dev/sdc /mydata/ <====将之前创建的btrfs文件系统挂载到mydata下
[root@localhost ~]# df -h
<====使用df命令查看是否挂载成功
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 6.9G 44G 14% /
devtmpfs 481M 0 481M 0% /dev
tmpfs 490M 80K 490M 1% /dev/shm
tmpfs 490M 7.1M 483M 2% /run
tmpfs 490M 0 490M 0% /sys/fs/cgroup
/dev/mapper/centos-home 68G 44M 68G 1% /home
/dev/sda1 497M 126M 371M 26% /boot
/dev/sdc 35G 1.2M 30G 1% /mydata
<====这样可以看到我们创建的btrfs文件系统挂载好了
[root@localhost ~]# cd /mydata/ <======切换到mydata目录下
[root@localhost mydata]# touch a.txt <=====创建一个文件
[root@localhost mydata]# ll <=====查看文件,这样我们的btrfs文件系统就可以使用了
总用量 0
-rw-r--r--. 1 root root 0 8月 29 21:08 a.txt
drwxr-xr-x. 1 root root 96 8月 28 10:56 logs
[root@localhost mydata]#
卸载的话直接使用umount命令加上分区路径就可以了
5、btrfs文件系统还可以实现透明压缩,那么什么是透明压缩呢。就是我们在创建btrfs文件系统时,系统后台会自动压缩而我们这边并没有看到,那么如何实现压缩呢?我们下面演示下
用法:mount -o compress={lzo|zlib} DEVICE MOUNT_POINT
[root@localhost ~]# umount /mydata/
<======先卸载文件系统
[root@localhost ~]# mount -o compress=lzo /dev/sdc /mydata
<======在进行透明压缩挂载
6、实现指定btrfs文件系统的大小调整
root@localhost ~]# btrfs filesystem resize -10G /mydata
<======先对mydata减小10G
Resize '/mydata' of '-10G'
[root@localhost ~]# df -lh
<=====查看文件系统的容量
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 6.9G 44G 14% /
devtmpfs 481M 0 481M 0% /dev
tmpfs 490M 80K 490M 1% /dev/shm
tmpfs 490M 7.1M 483M 2% /run
tmpfs 490M 0 490M 0% /sys/fs/cgroup
/dev/mapper/centos-home 68G 44M 68G 1% /home
/dev/sda1 497M 126M 371M 26% /boot
/dev/sdc 25G 1.3M 9.5G 1% /mydata
<===这里我们挂载的容量就减小了
[root@localhost ~]# btrfs filesystem resize +5G /mydata
<====然后我们对mydata增加5G
Resize '/mydata' of '+5G'
[root@localhost ~]# df -lh
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 6.9G 44G 14% /
devtmpfs 481M 0 481M 0% /dev
tmpfs 490M 80K 490M 1% /dev/shm
tmpfs 490M 7.1M 483M 2% /run
tmpfs 490M 0 490M 0% /sys/fs/cgroup
/dev/mapper/centos-home 68G 44M 68G 1% /home
/dev/sda1 497M 126M 371M 26% /boot
/dev/sdc 30G 1.3M 20G 1% /mydata
<=====这里查看容量就增加了
当然如果我们想增加和减小容量不仅可以使用增加容量的的方法,还可以使用增加货减小物理卷的方法,如:
[root@localhost ~]# btrfs device add /dev/sdb /mydata/<=====将物理磁盘sdb加入到mydata文件系统
[root@localhost ~]# btrfs balance start /mydata
<=====实现均衡操作(每块设备的数据平摊)
Done, had to relocate 3 out of 3 chunks
[root@localhost ~]# df -lh
<=====查看mydata的大小,可以看出大小就增加了
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 6.9G 44G 14% /
devtmpfs 481M 0 481M 0% /dev
tmpfs 490M 80K 490M 1% /dev/shm
tmpfs 490M 7.1M 483M 2% /run
tmpfs 490M 0 490M 0% /sys/fs/cgroup
/dev/mapper/centos-home 68G 44M 68G 1% /home
/dev/sda1 497M 126M 371M 26% /boot
/dev/sdc 50G 1.3M 40G 1% /mydata
[root@localhost ~]# btrfs device delete /dev/sdb /mydata/
<=====删除sdb
[root@localhost ~]# df -lh
<=====再次查看mydata容量,这里就可以看出减少了
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 6.9G 44G 14% /
devtmpfs 481M 0 481M 0% /dev
tmpfs 490M 80K 490M 1% /dev/shm
tmpfs 490M 7.1M 483M 2% /run
tmpfs 490M 0 490M 0% /sys/fs/cgroup
/dev/mapper/centos-home 68G 44M 68G 1% /home
/dev/sda1 497M 126M 371M 26% /boot
/dev/sdc 30G 1.8M 20G 1% /mydata
7、改变文件系统的数据和元数据RAID的级别
[root@localhost ~]# btrfs balance start -mconvert=raid1 /mydata 指明元数据的为RAID1模式
Done, had to relocate 2 out of 3 chunks
[root@localhost ~]#
[root@localhost ~]# btrfs balance start -dconvert=raid1 /mydata 指明数据位RAID1模式
Done, had to relocate 1 out of 3 chunks
[root@localhost ~]#
注:我们指定raid1和0时只需要2块物理分区,如果你需要创建成raid5的话至少需要3块物理磁盘
8、在btrfs文件系统的子卷的管理
(1)、子卷的创建
[root@localhost ~]# btrfs subvolume create /mydata/logss
<=====在mydata文件系统下创建logss
Create subvolume '/mydata/logss'
[root@localhost ~]# btrfs subvolume list /mydata/
<=====查看mydata所有的子卷,log是我之前创建的
ID 262 gen 108 top level 5 path logs
ID 267 gen 114 top level 5 path logss
注:如果父卷挂载了,那么子卷会自动挂载在文件系统上。当然子卷也单独挂载,前提是要先卸载父卷
(2)、子卷单独挂载
如:我们想要把logss子卷单独挂载,则执行以下操作,
先卸载父卷
[root@localhost ~]# mount -o subvol=logss /dev/sdc /mnt
<=====将子卷挂载到mnt目录下
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# ll
总用量 0
[root@localhost mnt]# cp /etc/fstab /mnt/ <=====拷贝一个文件到mnt下
[root@localhost mnt]# ll /mnt/
总用量 4
-rw-r--r--. 1 root root 541 8月 29 22:33 fstab
[root@localhost mnt]# cd
[root@localhost ~]# umount /mnt/
<=====卸载子卷
[root@localhost ~]# mount /dev/sdc /mydata/
<=====重新挂载父卷
[root@localhost ~]# cd /mydata/logss/
<=====进到子卷中
[root@localhost logss]# ll
<=====发现我们之前拷贝的文件还是存在的
总用量 4
-rw-r--r--. 1 root root 541 8月 29 22:33 fstab
(3)、删除子卷
如何删除子卷,使用命令:btrfs subvolume delete
root@localhost ~]# btrfs subvolume delete /mydata/logss
<=====删除子卷logss
Transaction commit: none (default)
Delete subvolume '/mydata/logss'
[root@localhost ~]# ll /mydata/
<=====查看父卷中的内容已经没有logss了
总用量 16
-rw-r--r--. 1 root root 0 8月 29 21:08 a.txt
-rw-r--r--. 1 root root 13430 8月 29 21:43 functions
drwxr-xr-x. 1 root root 96 8月 28 10:56 logs
[root@localhost ~]#
(4)、对子卷创建快照
[root@localhost ~]# btrfs subvolume create /mydata/logss
<=====先创建子卷logss
Create subvolume '/mydata/logss'
[root@localhost ~]# btrfs subvolume snapshot /mydata/logss /mydata/logss_snapshot
<=====对子卷创建快照,命名为logss――snapshot Create a snapshot of '/mydata/logss' in '/mydata/logss_snapshot'
[root@localhost ~]# btrfs subvolume list /mydata/
<=====查看mydata下又多了一个子卷,这就是我们所创建的快照
ID 262 gen 108 top level 5 path logs
ID 267 gen 124 top level 5 path logss
ID 268 gen 124 top level 5 path logss_snapshot
[root@localhost ~]#
9、如何将btrfs文件系统转化为ext文件系统
首先需要创建一个新的分区,在新的分区上创建ext4的文件系统,这边我就不做演示了,直接将新分区创建成了ext4文件系统
[root@localhost ~]# mke2fs -t ext4 /dev/sdb1 将sdb1创建成ext4的文件系统
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@localhost ~]# mount /dev/sdb1 /mnt/ 将ext4的文件系统挂载到mnt目录下
[
[root@localhost ~]# cp /etc/fstab /mnt/ 拷贝etc目录下的fstab到mnt目录下
[root@localhost ~]# ll /mnt/ 查看mnt下的文件
总用量 20
-rw-r--r--. 1 root root 541 8月 29 23:35 fstab
drwx------. 2 root root 16384 8月 29 23:33 lost+found
[root@localhost ~]# umount /mnt/ 卸载ext4的文件系统
[root@localhost ~]# fsck -f /dev/sdb1 对sdb1分区进行检测
fsck,来自 util-linux 2.23.2
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/sdb1: 12/655360 files (0.0% non-contiguous), 83138/2621440 blocks
[root@localhost ~]# btrfs-convert /dev/sdb1 将sdb1的文件系统转化成btrfs文件系统
creating btrfs metadata.
creating ext2fs image file.
cleaning up system chunk.
conversion complete. 转化完成
[root@localhost ~]# btrfs filesystem show /dev/sdb1 查看sdb1的属性
Label: none uuid: c8db9d69-3e6a-4c99-835e-6e109b3a0169
Total devices 1 FS bytes used 324.80MiB
devid 1 size 10.00GiB used 10.00GiB path /dev/sdb1
Btrfs v3.16.2
[root@localhost ~]# mount /dev/sdb1 /mnt 挂载btrfs文件系统
[root@localhost ~]# ll /mnt 查看fstab文件和之前一致
总用量 8
drwxr-xr-x. 1 root root 10 8月 29 23:37 ext2_saved
-rw-r--r--. 1 root root 541 8月 29 23:35 fstab
drwx------. 1 root root 0 8月 29 23:33 lost+found
[root@localhost ~]# umount /mnt/ 卸载mnt目录上的文件系统
[root@localhost ~]# btrfs-convert -r /dev/sdb1 将btrfs降级为ext4文件系统
rollback complete. 提示降级成功
[root@localhost ~]# blkid /dev/sdb1 查看sdb1的信息,为ext4文件系统降级完成
/dev/sdb1: UUID="84965289-5f82-4fe3-b0e7-6160726d7a25" TYPE="ext4"
[root@localhost ~]# btrfs-convert /dev/sdb1 再次升级为btrfs文件系统
creating btrfs metadata.
creating ext2fs image file.
cleaning up system chunk.
conversion complete.
[root@localhost ~]# blkid /dev/sdb1
/dev/sdb1: UUID="e582e4e2-a343-4d20-ba0e-dda43a3a90e5" UUID_SUB="95c8bc9b-ae3e-4989-904f-753781a83fab" TYPE="btrfs"
[root@localhost ~]#
三、小结
上面所述的所有内容,只是我对于学习的总结,其中可能有些说的不足和不对的地方,希望朋友多指点。