Btrfs((B-tree,ButterFS ,Better FS通常念成Butter FS),由Oracle于2007年宣布并进行中的COW(copy-on-write式)文件系统。继ext3/4文件系统之后linux又有了比较强大的文件系统(btrfs文件系统),btrfs文件系统不仅可以将ext3/4系列的升级为btrfs文件系统也可以将其降级为ext3/4的文件系统,特别是单一文件大小的限制,总文件系统大小限制以及加入文件校验和特性。而且btrfs文件系统还具有快照,内建磁盘阵列(RAID)支持,支持子卷等功能,允许在线调整文件系统大小,更为“嚣张”的是btrfs文件系统还支持快照的快照。突破了之前的一些文件系统。
1.1 核心特性:
1>.多物理卷支持:btrfs可由多个底层物理卷组成;支持RAID,以联机“添加”,“移除”,“修改”;
2>.写时复制更新机制(Cow):复制、更新及替换指针,而非“就地”更新;
3>.数据机元数据校验码:cheecksum
4>.子卷:sub_volume
5>.快照:支持快照的快照;
6>.透明压缩:
1.2 文件系统的创建
1.2.1 mkfs.btrfs
-L ‘LABEL’ : 设置卷标
-d <type> :raid0; raid1;raid10;raid5;raid6;single :设置raid级别
-m <profile> : raid0; raid1;raid10;raid5;raid6;single,dup
-o <feature>
-o list-all :l列出支持的所有feature
1.2.3. 挂载文件系统
mount �Ct btrfs /dev/XX MOOUNT_POINT
1.2.4 透明压缩机制
mount �Co compress={lzo|zlib} DEVICE MOUNT_POINT
1.2.5子命令: filesystem,device,balance,subvolume
btrfs filesystem
show :属性查看
df : 查看挂载点的可使用空间
label : 设置器卷标
resize : 增缩逻辑卷
btrfs device:
add :添加设备
delete :删除设备
raid label :设置raid级别
btrfs subvlome :
Create: 创建子卷
Delete: 删除子卷
List: 列出子卷
btrfs subvolume snapshot 创建快照卷
btrfs balance start | status | pause
想要更加详细的查看其子命令功能可以使用man命令
练习:btrfs管理及应用
1>.fidsk -l 显示已新建好的硬盘:
[root@localhost ~]# fdisk -l 磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x000b3d48 设备 Boot Start End Blocks Id System /dev/sda1 * 2048 1026047 512000 83 Linux /dev/sda2 1026048 41943039 20458496 8e Linux LVM 磁盘 /dev/sdc: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 字节 磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘 /dev/mapper/centos-root:18.8 GB, 18756927488 字节,36634624 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘 /dev/mapper/centos-swap:2147 MB, 2147483648 字节,4194304 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
2>.创建一个btrfs文件系统且 /dev/sdb 卷标为mydata:
[root@localhost ~]# mkfs.btrfs -L mydata /dev/sdb /dev/sdc 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 fs created label mydata on /dev/sdb nodesize 16384 leafsize 16384 sectorsize 4096 size 40.00GiB
3>.查看创建好的文件系统的详细信息:
[root@localhost ~]# btrfs filesystem show //(show命令有很多可以man btrfs filesystem show) Label: 'mydata' uuid: 07090733-5a24-401d-82bd-04f57f6be555 Total devices 2 FS bytes used 112.00KiB devid 1 size 20.00GiB used 2.03GiB path /dev/sdb devid 2 size 20.00GiB used 2.01GiB path /dev/sdc Btrfs v3.16.2
4>.挂载并使用btrfs文件系统:
[root@localhost ~]# mount -t btrfs /dev/sdb /mydata [root@localhost ~]# mount proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel) devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=491916k,nr_inodes=122979,mode=755) securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755) tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,seclabel,mode=755) cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) configfs on /sys/kernel/config type configfs (rw,relatime) /dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota) selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime) systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=33,pgrp=1,timeout=300,minproto=5,maxproto=5,direct) hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel) debugfs on /sys/kernel/debug type debugfs (rw,relatime) mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel) /dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota) /dev/sdb on /mydata type btrfs (rw,relatime,seclabel,space_cache) [root@localhost ~]# cd /mydata [root@localhost mydata]# ls [root@localhost mydata]# cp /etc/passwd ./ [root@localhost mydata]# ls passwd
5>.卸载文件系统
[root@localhost mydata]# cd [root@localhost ~]# umount /mydata [root@localhost ~]# ls /mydata //卸载完再去/mydata目录下查看发现之前的一些文件已经不存在了
6>.透明制压缩机制的实现
[root@localhost ~]# mount -o compress=lzo /dev/sdb/ /mydata [root@localhost ~]# cp /etc/fstab /mydata [root@localhost ~]# cd /mydata [root@localhost mydata]# ls fstab passwd
7>.在线联机调整文件系统的大小 (底层设备加载进去才可调整大小)
[root@localhost mydata]# btrfs filesystem resize -5G /mydata // 将mydata缩减5G Resize '/mydata' of '-5G' [root@localhost mydata]# btrfs filesystem show /mydata //查看缩减后的文件系统 Label: 'mydata' uuid: 07090733-5a24-401d-82bd-04f57f6be555 Total devices 2 FS bytes used 896.00KiB devid 1 size 15.00GiB used 2.03GiB path /dev/sdb devid 2 size 20.00GiB used 2.01GiB path /dev/sdc Btrfs v3.16.2 [root@localhost mydata]# btrfs filesystem df /mydata //查看真实的mydata的可用空间的详细信息 Data, RAID0: total=2.00GiB, used=768.00KiB Data, single: total=8.00MiB, used=0.00 System, RAID1: total=8.00MiB, used=16.00KiB System, single: total=4.00MiB, used=0.00 Metadata, RAID1: total=1.00GiB, used=112.00KiB Metadata, single: total=8.00MiB, used=0.00 GlobalReserve, single: total=16.00MiB, used=0.00 [root@localhost mydata]# df -lh // df -lh 不能真实的显示mydata的可用空间 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 18G 2.2G 16G 13% / devtmpfs 481M 0 481M 0% /dev tmpfs 490M 0 490M 0% /dev/shm tmpfs 490M 6.7M 484M 2% /run tmpfs 490M 0 490M 0% /sys/fs/cgroup /dev/sda1 497M 120M 378M 25% /boot /dev/sdb 35G 1.0M 28G 1% /mydata // 增加文件系统的大小跟缩减一样,也可使用 max 将其调至为最大,使用df -lh 可查看最大空间使用量
8>.添加新的设备至mydata(mydata必须是已经挂载好的)
[root@localhost mydata]# btrfs device add /dev/sdd /mydata [root@localhost mydata]# df -lh //此时可以看到mydata已经变成了60G 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 18G 2.2G 16G 13% / devtmpfs 481M 0 481M 0% /dev tmpfs 490M 0 490M 0% /dev/shm tmpfs 490M 6.7M 484M 2% /run tmpfs 490M 0 490M 0% /sys/fs/cgroup /dev/sda1 497M 120M 378M 25% /boot /dev/sdb 60G 1.0M 56G 1% /mydata //虽已自动扩展mydata但是数据却没有扩展进去
9>.将之前已有的的数据做均衡调整
[root@localhost mydata]# btrfs balance status /mydata //查看均衡状态,此时没有开始做均衡调整,所以查看不到其信息。NOte:mydata数据较少所以start不会显示其信息,只有在数据量比较大的时候才可以显示 No balance found on '/mydata' [root@localhost mydata]# btrfs balance start /mydata Done, had to relocate 6 out of 6 chunks 10>.将/dev/sdd从mydata中移除出去 [root@localhost mydata]# btrfs device delete /dev/sdd /mydata [root@localhost mydata]# df -lh 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 18G 2.2G 16G 13% / devtmpfs 481M 0 481M 0% /dev tmpfs 490M 0 490M 0% /dev/shm tmpfs 490M 6.7M 484M 2% /run tmpfs 490M 0 490M 0% /sys/fs/cgroup /dev/sda1 497M 120M 378M 25% /boot /dev/sdb 40G 832K 40G 1% /mydata [root@localhost mydata]# btrfs filesystem show /mydata //查看/dev/sdd是否从mydata中移除成功 Label: 'mydata' uuid: 07090733-5a24-401d-82bd-04f57f6be555 Total devices 2 FS bytes used 704.00KiB devid 1 size 20.00GiB used 1.28GiB path /dev/sdb devid 2 size 20.00GiB used 288.00MiB path /dev/sdc Btrfs v3.16.2 [root@localhost mydata]# ls fstab passwd [root@localhost mydata]# tail -2 fstab //移除设备之后还可正常访问mydata里面的信息 UUID=91ff6050-1678-4250-b52b-9c28a80ee538 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 [root@localhost mydata]# Note:在移除之时btrfs已经将数据移动到其他设备中,这点要比lvm好的多。
11>.动态修改对应的数据以及元数据的raid级别
[root@localhost mydata]# btrfs balance start -mconvert=raid1 /mydata //因之前将/dev/sdd移除了所以在此只可用raid0,1 Done, had to relocate 2 out of 3 chunks 12>.在原有的文件系统上创建子卷 [root@localhost mydata]# btrfs subvolume create /mydata/chang Create subvolume '/mydata/chang' [root@localhost ~]# btrfs subvolume create /mydata/cc Create subvolume '/mydata/cc' [root@localhost ~]# btrfs subvolume list /mydata ID 263 gen 70 top level 5 path chang ID 264 gen 71 top level 5 path cc
13>.挂载chang这个子卷
使用名字挂载子卷: [root@localhost ~]# umount /mydata //挂载子卷之前先卸载父卷 [root@localhost ~]# mount -o subvol=chang /dev/sdc /mnt //挂载设备为任意一设备 [root@localhost ~]# ls /mnt [root@localhost ~]# cp /etc/passwd /mnt [root@localhost ~]# ls /mnt passwd [root@localhost ~]# btrfs subvolume show /mnt /mnt Name: chang uuid: c8db80cf-3f49-c54c-a9b2-cd16ddb76d70 Parent uuid: - Creation time: 2015-10-07 02:38:46 Object ID: 263 Generation (Gen): 73 Gen at creation: 70 Parent: 5 Top Level: 5 Flags: - Snapshot(s): 使用subvolume id号挂载子卷 [root@localhost ~]# mount -o subvolid=263 /dev/sdc /mnt //单独挂载某一子卷时只可访问子卷中的文件父卷中的文件访问不到
14>.删除子卷
[root@localhost ~]# umount /mnt //看子卷是否已经挂载,若挂载先卸载 [root@localhost ~]# btrfs subvolume list /mydata ID 263 gen 75 top level 5 path chang ID 264 gen 71 top level 5 path cc [root@localhost ~]# btrfs subvolume delete /mydata/chang //删除chang这个子卷 Transaction commit: none (default) Delete subvolume '/mydata/chang' [root@localhost ~]# btrfs subvolume list /mydata //可以看得到chang这个子卷已经被删除了 ID 264 gen 71 top level 5 path cc
15>.对子卷创建快照卷
[root@localhost ~]# cp /etc/passwd /mydata/cc [root@localhost ~]# ls /mydata/cc passwd [root@localhost ~]# btrfs subvolume snapshot /mydata/cc /mydata/cc_snap //快照卷要在原卷的基础上创建 Create a snapshot of '/mydata/cc' in '/mydata/cc_snap' [root@localhost ~]# btrfs subvolume list /mydata ID 264 gen 80 top level 5 path cc ID 265 gen 80 top level 5 path cc_snap [root@localhost ~]# vim /mydata/cc/passwd [root@localhost ~]# tail -2 /mydata/cc/passwd #hello word [root@localhost ~]# tail -2 /mydata/cc_snap/passwd rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@localhost ~]# tail -2 /mydata/cc_snap/passwd rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@localhost ~]# btrfs subvolume delete /mydata/cc_snap //删除快照卷 Transaction commit: none (default) Delete subvolume '/mydata/cc_snap'
16>.对子卷中的某一文件创建快照
[root@localhost cc]# cp --reflink passwd passwd_snap [root@localhost cc]# vim passwd [root@localhost cc]# tail -2 ./passwd rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin [root@localhost cc]# tail -2 ./passwd_snap #hello word
17>.etx3/4与btrfs之间的相互转换
[root@localhost ~]# btrfs balance start -dconvert=single /mydata Done, had to relocate 1 out of 3 chunks [root@localhost ~]# btrfs balance start -mconvert=raid1 /mydata Done, had to relocate 2 out of 3 chunks [root@localhost ~]# btrfs filesystem show /mydata Label: 'mydata' uuid: 07090733-5a24-401d-82bd-04f57f6be555 Total devices 2 FS bytes used 528.00KiB devid 1 size 20.00GiB used 1.28GiB path /dev/sdb devid 2 size 20.00GiB used 288.00MiB path /dev/sdc Btrfs v3.16.2 [root@localhost ~]# fdisk /dev/sdd 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0x7dd17c41 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):p 磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x7dd17c41 设备 Boot Start End Blocks Id System 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 分区号 (1-4,默认 1):1 起始 扇区 (2048-41943039,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+3G 分区 1 已设置为 Linux 类型,大小设为 3 GiB 命令(输入 m 获取帮助):p 磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x7dd17c41 设备 Boot Start End Blocks Id System /dev/sdd1 2048 6293503 3145728 83 Linux 命令(输入 m 获取帮助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。 [root@localhost ~]# partx -a /dev/sdd partx: /dev/sdd: error adding partition 1 [root@localhost ~]# partx -a /dev/sdd partx: /dev/sdd: error adding partition 1 [root@localhost ~]# mke2fs -t ext4 /dev/sdd1 //格式化/dev/sdd1 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 196608 inodes, 786432 blocks 39321 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=805306368 24 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Allocating group tables: 完成 正在写入inode表: 完成 Creating journal (16384 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 [root@localhost ~]# mount /dev/sdd1 /mnt //挂载/dev/sdd1 [root@localhost ~]# cp /etc/fstab /mnt [root@localhost ~]# cat /mnt/fstab # # /etc/fstab # Created by anaconda on Sun Sep 6 14:16:22 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 # /dev/mapper/centos-root / xfs defaults 0 0 UUID=91ff6050-1678-4250-b52b-9c28a80ee538 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 [root@localhost ~]# umount /mnt //将/dev/sdd1的ext4文件系统转换为btrfs文件系统之前先卸载 [root@localhost ~]# e2fsck -f /dev/sdd1 e2fsck 1.42.9 (28-Dec-2013) 第一步: 检查inode,块,和大小 第二步: 检查目录结构 第3步: 检查目录连接性 Pass 4: Checking reference counts 第5步: 检查簇概要信息 /dev/sdd1: 12/196608 files (0.0% non-contiguous), 31037/786432 blocks [root@localhost ~]# btrfs-convert /dev/sdd1 //将etx4文件系统转换为btrfs文件系统 creating btrfs metadata. creating ext2fs image file. cleaning up system chunk. conversion complete. [root@localhost ~]# btrfs filesystem show //可以看到已经转换成功 Label: 'mydata' uuid: 07090733-5a24-401d-82bd-04f57f6be555 Total devices 2 FS bytes used 464.00KiB devid 1 size 20.00GiB used 1.28GiB path /dev/sdb devid 2 size 20.00GiB used 288.00MiB path /dev/sdc Label: none uuid: 2ee240cb-5609-486f-994e-cbc72aee2858 Total devices 1 FS bytes used 121.29MiB devid 1 size 3.00GiB used 3.00GiB path /dev/sdd1 Btrfs v3.16.2 [root@localhost ~]# mount /dev/sdd1 /mnt [root@localhost ~]# cd /mnt [root@localhost mnt]# ls //之前的文件依旧存在(切勿删除ext2_saved) ext2_saved fstab lost+found [root@localhost mnt]# cd [root@localhost ~]# umount /mnt [root@localhost ~]# btrfs-convert -r /dev/sdd1 //将btrfs文件系统转换为ext4文件系统 rollback complete. [root@localhost ~]# blkid /dev/sdd1 //查看是否转换成功 /dev/sdd1: UUID="514efa6d-11a1-4c10-958a-2897c7d494e0" TYPE="ext4"