Linux 学习34 运维加薪技能-btrfs文件系统管理与应用
一、回顾
1、lvm2
lvm:边界动态扩展或收缩;快照;
pv --> vg --> lv
PE:
LE:
2、dd:复制
3、关闭默认启动的图形界面
[root@node1 ~]# systemctl set-default multi-user.target Removed symlink /etc/systemd/system/default.target. Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.
二、btrfs文件系统:(技术预览版)
1、Btrfs(B-tree,Butter FS,Better FS),GPL,Oracle从2007年左右开始研发,使用写时复制机制(COW);其设计就是为了用来取代ext3/ext4的
2、核心特性
a、多物理卷支持:btrfs可由多个底层物理卷组成:支持RAID,以联机“添加”,“移除”,“修改”
b、写时复制更新机制(CoW):复制,更新及替换指针,而非“就地”更新
c、数据及元数据校验码:checksum ,自动检测文件是否受损,一旦受损就会尝试自动修复。
d、支持子卷:sub_volume,在一个卷上创建多个子卷,把每一个子卷进行单独挂载。
e、快照:支持快照的快照,也就是增量快照机制
f、透明压缩:
三、相应命令
1、创建btrfs :mkfs.btrfs
-L 'LABEL':指定卷标
-m <profile>: raid0,raid1,raid5,raid6,raid10,single,dup指明元数据是如何存放的
-d <type>: raid0,raid1,raid5,raid6,raid10,single指明数据是如何存放的
-O <feature>:格式化时开启的特性
[root@node1 ~]# mkfs.btrfs -O list-all #列出所支持的所有特性 Filesystem features available: mixed-bg - mixed data and metadata block groups (0x4, compat=2.6.37, safe=2.6.37) extref - increased hardlink limit per file to 65536 (0x40, compat=3.7, safe=3.12, default=3.12) raid56 - raid56 extended format (0x80, compat=3.9) skinny-metadata - reduced-size metadata extent refs (0x100, compat=3.10, safe=3.18, default=3.18) no-holes - no explicit hole extents for files (0x200, compat=3.14, safe=4.0)
2、演示btrfs的使用
a、创建btrfs文件系统
[root@node1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─centos-root 253:0 0 17G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 10G 0 disk sdc 8:32 0 10G 0 disk sdd 8:48 0 10G 0 disk sr0 11:0 1 4.2G 0 rom [root@node1 ~]# mkfs.btrfs -L mydata -f /dev/sdb /dev/sdc btrfs-progs v4.9.1 See http://btrfs.wiki.kernel.org for more information. Label: mydata UUID: 668a05e4-fbb7-4815-a61c-2e15b860fa26 Node size: 16384 Sector size: 4096 Filesystem size: 20.00GiB Block group profiles: Data: RAID0 2.00GiB Metadata: RAID1 1.00GiB System: RAID1 8.00MiB SSD detected: no Incompat features: extref, skinny-metadata Number of devices: 2 Devices: ID SIZE PATH 1 10.00GiB /dev/sdb 2 10.00GiB /dev/sdc
b、查看已经创建的btrfs文件系统
[root@node1 ~]# btrfs filesystem show Label: 'mydata' uuid: 668a05e4-fbb7-4815-a61c-2e15b860fa26 Total devices 2 FS bytes used 112.00KiB devid 1 size 10.00GiB used 2.01GiB path /dev/sdb devid 2 size 10.00GiB used 2.01GiB path /dev/sdc
此时我们会发现我们的/dev/sdb和/dev/sdc的uuid和我们创建的btrfs文件系统是一样的,但是他的子卷的UUID是不一样的,UUID_SUB表示的是每一个物理子卷的物理属性的UUID。
[root@node1 ~]# blkid /dev/sdb /dev/sdb: LABEL="mydata" UUID="668a05e4-fbb7-4815-a61c-2e15b860fa26" UUID_SUB="052552b0-1fa3-4e95-a060-9e8ee8ef2599" TYPE="btrfs" [root@node1 ~]# blkid /dev/sdc /dev/sdc: LABEL="mydata" UUID="668a05e4-fbb7-4815-a61c-2e15b860fa26" UUID_SUB="e3ce8b73-ea60-4579-b1a7-ddc85b5a9a91" TYPE="btrfs"
c、文件系统属性查看:btrfs filesystem show命令
[root@node1 ~]# btrfs filesystem show --mounted #显示已经挂载的 [root@node1 ~]# btrfs filesystem show --all-device#显示所有的btrfs文件系统 Label: 'mydata' uuid: 668a05e4-fbb7-4815-a61c-2e15b860fa26 Total devices 2 FS bytes used 112.00KiB devid 1 size 10.00GiB used 2.01GiB path /dev/sdb devid 2 size 10.00GiB used 2.01GiB path /dev/sdc [root@node1 ~]# btrfs filesystem show /dev/sdb #显示/dev/sdb所在的btrfs文件系统的信息 Label: 'mydata' uuid: 668a05e4-fbb7-4815-a61c-2e15b860fa26 Total devices 2 FS bytes used 112.00KiB devid 1 size 10.00GiB used 2.01GiB path /dev/sdb devid 2 size 10.00GiB used 2.01GiB path /dev/sdc
d、btrfs文件系统的挂载f和卸载
[root@node1 ~]# mkdir /mydata [root@node1 ~]# mount -t btrfs /dev/sdb /mydata/ #挂载任意一个磁盘即可 [root@node1 ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/centos-root xfs 17G 4.8G 13G 29% / devtmpfs devtmpfs 982M 0 982M 0% /dev tmpfs tmpfs 993M 0 993M 0% /dev/shm tmpfs tmpfs 993M 8.7M 984M 1% /run tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup /dev/sda1 xfs 1014M 127M 888M 13% /boot tmpfs tmpfs 199M 0 199M 0% /run/user/0 /dev/sdb btrfs 20G 17M 18G 1% /mydata
[root@node1 ~]# umount /mydata/ [root@node1 ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/centos-root xfs 17G 4.8G 13G 29% / devtmpfs devtmpfs 982M 0 982M 0% /dev tmpfs tmpfs 993M 0 993M 0% /dev/shm tmpfs tmpfs 993M 8.7M 984M 1% /run tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup /dev/sda1 xfs 1014M 127M 888M 13% /boot tmpfs tmpfs 199M 0 199M 0% /run/user/0
e、使用透明压缩机制,相当于数据在存放时会首先进行压缩再存放至挂载的文件系统中,不过这个过程我们是不感知的。
mount -o compress={lzo|zlib} DEVICE MOUNT_POINT
[root@node1 ~]# mount -o compress=lzo /dev/sdb /mydata/ [root@node1 ~]# cp /etc/rc.d/init.d/functions /mydata/ [root@node1 ~]# ll /mydata/ total 20 -rw-r--r-- 1 root root 17500 Feb 1 20:18 functions
f、在线调整btrfs文件系统的大小,要调整到最大可以使用 resize max参数。
[root@node1 ~]# btrfs filesystem resize -5G /mydata/ [root@node1 ~]# df -hT /mydata/ #可以看到减小了5G Filesystem Type Size Used Avail Use% Mounted on /dev/sdb btrfs 15G 18M 8.0G 1% /mydata
[root@node1 ~]# btrfs filesystem resize +5G /mydata/ Resize '/mydata/' of '+5G' [root@node1 ~]# df -hT /mydata/ #可以看到增加了5G Filesystem Type Size Used Avail Use% Mounted on /dev/sdb btrfs 20G 18M 18G 1% /mydata
g、真正的占据的空间要通过其自带的命令查看
[root@node1 ~]# btrfs filesystem df /mydata/ Data, RAID0: total=2.00GiB, used=780.00KiB #数据默认是RAID0 System, RAID1: total=8.00MiB, used=16.00KiB Metadata, RAID1: total=1.00GiB, used=112.00KiB 元数据默认是RAID1 GlobalReserve, single: total=16.00MiB, used=0.00B
3、btrfs device:btrfs操作设备。
a、btrfs device add,添加一块设备到挂载的文件系统上
[root@node1 ~]# btrfs device add /dev/sdd /mydata/ [root@node1 ~]# df -hT /mydata/ #可以看到大小也自动增加了 Filesystem Type Size Used Avail Use% Mounted on /dev/sdb btrfs 30G 18M 26G 1% /mydata
b、将开始的两块硬盘上的数据均衡到/dev/sdd上
[root@node1 ~]# btrfs balance status /mydata #查看均衡的状态,这个只有在均衡的过程中才能查看到 No balance found on '/mydata' [root@node1 ~]# btrfs balance start /mydata #开始均衡 WARNING: Full balance without filters requested. This operation is very intense and takes potentially very long. It is recommended to use the balance filters to narrow down the balanced data. Use 'btrfs balance start --full-balance' option to skip this warning. The operation will start in 10 seconds. Use Ctrl-C to stop it. 10 9 8 7 6 5 4 3 2 1 Starting balance without any filters. Done, had to relocate 3 out of 3 chunks #可以看到只是均衡了3个chunks
如果正在均衡的时候想暂停下来可以使用pause,如果想要继续可以使用resume
[root@node1 ~]# btrfs balance pause /mydata
[root@node1 ~]# btrfs balance resume /mydata
c、移除某一个物理卷
[root@node1 ~]# btrfs device delete /dev/sdb /mydata/ #删除/dev/sdb [root@node1 ~]# df -lhT /mydata/ Filesystem Type Size Used Avail Use% Mounted on /dev/sdc btrfs 20G 18M 20G 1% /mydata [root@node1 ~]# btrfs filesystem show /mydata/ Label: 'mydata' uuid: 668a05e4-fbb7-4815-a61c-2e15b860fa26 Total devices 2 FS bytes used 716.00KiB devid 2 size 10.00GiB used 1.28GiB path /dev/sdc devid 3 size 10.00GiB used 1.28GiB path /dev/sdd
4、修改数据的组织机制,即RAID级别
[root@node1 ~]# btrfs device add /dev/sdb /mydata/ [root@node1 ~]# btrfs balance start -dconvert=raid5 /mydata/ #修改数据存储类型为raid5 Done, had to relocate 1 out of 3 chunks [root@node1 ~]# btrfs balance start -mconvert=raid5 /mydata/ #修改元数据存储类型为raid5 Done, had to relocate 2 out of 3 chunks
[root@node1 ~]# btrfs filesystem df /mydata/ Data, RAID5: total=2.00GiB, used=588.00KiB System, RAID5: total=64.00MiB, used=16.00KiB Metadata, RAID5: total=256.00MiB, used=112.00KiB GlobalReserve, single: total=16.00MiB, used=0.00B
5、子卷操作
a、创建子卷
[root@node1 ~]# btrfs subvolume create /mydata/logs Create subvolume '/mydata/logs'
b、列出子卷
[root@node1 ~]# btrfs subvolume list /mydata/ ID 264 gen 78 top level 5 path logs #可以看到子卷对应的子卷id为264
c、挂载子卷,当父卷挂载后子卷会自动挂载。现在我们只挂载子卷
[root@node1 ~]# df -hT /mydata/ Filesystem Type Size Used Avail Use% Mounted on /dev/sdc btrfs 30G 17M 29G 1% /mydata [root@node1 ~]# umount /mydata/ [root@node1 ~]# mount -o subvol=logs /dev/sdb /mnt/ #需要通过-o参数指定子卷的名称 [root@node1 ~]# df -hT /mnt/ Filesystem Type Size Used Avail Use% Mounted on /dev/sdc btrfs 30G 17M 29G 1% /mnt
d、显示子卷的详细信息
[root@node1 ~]# btrfs subvolume show /mnt /mnt Name: logs UUID: 46b6fe7e-e57f-d441-afd1-afd06067817b Parent UUID: - Received UUID: - Creation time: 2020-02-01 21:35:37 +0800 Subvolume ID: 264 Generation: 78 Gen at creation: 78 Parent ID: 5 Top level ID: 5 Flags: - Snapshot(s):
e、现在我们复制/etc/fstab文件到/mnt路径下,然后再挂载我们的父卷到/mydata下,可以看到依然可以在/mydata/logs路径中看到此文件
[root@node1 ~]# cp /etc/fstab /mnt/ [root@node1 ~]# mount /dev/sdb /mydata/ [root@node1 ~]# ls -l /mydata/logs/ total 4 -rw-r--r-- 1 root root 465 Feb 1 21:46 fstab
f、也可以通过子卷id进行挂载
[root@node1 ~]# btrfs subvolume list /mydata/ ID 264 gen 81 top level 5 path logs ID 265 gen 79 top level 5 path cache [root@node1 ~]# umount /mnt/ [root@node1 ~]# mount -o subvolid=265 /dev/sdb /mnt/ [root@node1 ~]# df -hT /mnt/ Filesystem Type Size Used Avail Use% Mounted on /dev/sdc btrfs 30G 17M 29G 1% /mnt
g、删除子卷
[root@node1 ~]# btrfs subvolume delete /mydata/logs/ Delete subvolume (no-commit): '/mydata/logs'
[root@node1 ~]# btrfs subvolume list /mydata/ ID 265 gen 82 top level 5 path cache
6、创建子卷快照
a、首先我们还是创建子卷/mydata/logs,然后复制文件到其中。(子卷的快照必须与子卷在同一个父卷中)
[root@node1 ~]# btrfs subvolume create /mydata/logs Create subvolume '/mydata/logs' [root@node1 ~]# cp /etc/grub2.cfg /mydata/logs/
b、然后我们创建该子卷的快照
[root@node1 ~]# btrfs subvolume snapshot /mydata/logs /mydata/logs_snapshot Create a snapshot of '/mydata/logs' in '/mydata/logs_snapshot' [root@node1 ~]# btrfs subvolume list /mydata/ ID 265 gen 82 top level 5 path cache ID 266 gen 86 top level 5 path logs ID 267 gen 86 top level 5 path logs_snapshot
[root@node1 ~]# ls -l /mydata/logs_snapshot/ total 8 -rw-r--r-- 1 root root 4253 Feb 1 22:03 grub2.cfg
c、然后我们给原子卷中grub2.cfg文件添加内容后查看快照卷中grub2.cfg文件内容是否也被添加
[root@node1 ~]# echo "How are you,snapshot" >> /mydata/logs/grub2.cfg [root@node1 ~]# tail -1 /mydata/logs_snapshot/grub2.cfg #可以看到并没有添加 ### END /etc/grub.d/41_custom ###
d、删除快照卷
[root@node1 ~]# btrfs subvolume delete /mydata/logs_snapshot/ Delete subvolume (no-commit): '/mydata/logs_snapshot'
e、我们还可以对单个文件创建快照
[root@node1 logs]# cp --reflink grub2.cfg grub2.cfg_snap
7、将ext3或ext4转换为btrfs文件系统
a、首先将数据存储格式调整为single和元数据存储格式调整为raid1
[root@node1 logs]# btrfs balance start -dconvert=single /mydata/ Done, had to relocate 1 out of 3 chunks [root@node1 logs]# btrfs balance start -mconvert=raid1 /mydata/ Done, had to relocate 2 out of 3 chunks
b、接下来我们干掉一块磁盘
[root@node1 logs]# btrfs device delete /dev/sdd /mydata/
c、然后我们将/dev/sdd格式化为ext4文件系统并挂载至/mnt,然后复制/etc/fstab文件到/mnt路径中
d、接下来我们开始转换
首先我们先卸载/dev/sdd1 然后fsck一下 /dev/sdd1
[root@node1 logs]# umount /mnt/ [root@node1 logs]# fsck -f /dev/sdd1 fsck from util-linux 2.23.2 e2fsck 1.42.9 (28-Dec-2013) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/sdd1: 12/655360 files (0.0% non-contiguous), 83138/2621184 blocks
然后我们使用btrfs-convert 命令进行转换
[root@node1 logs]# btrfs-convert /dev/sdd1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadatacopy inodes [o] [ 0/ 12] conversion complete
此时我们查看相应的btrfs文件系统可以发现增加了/dev/sdd1
[root@node1 logs]# btrfs filesystem show Label: 'mydata' uuid: 668a05e4-fbb7-4815-a61c-2e15b860fa26 Total devices 2 FS bytes used 504.00KiB devid 2 size 10.00GiB used 288.00MiB path /dev/sdc devid 4 size 10.00GiB used 1.28GiB path /dev/sdb Label: none uuid: faed6308-9c33-44cc-947a-6781272e5121 Total devices 1 FS bytes used 325.27MiB devid 1 size 10.00GiB used 583.66MiB path /dev/sdd1
然后我们开始挂载并使用
[root@node1 logs]# mount /dev/sdd1 /mnt/ [root@node1 logs]# df -hTl /mnt/ Filesystem Type Size Used Avail Use% Mounted on /dev/sdd1 btrfs 10G 342M 9.7G 4% /mnt [root@node1 logs]# cat /mnt/fstab # # /etc/fstab # Created by anaconda on Tue Jun 4 22:30:32 2019 # # 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=fd514a18-84be-4460-8130-706b3ec88673 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0
e、我们还可以将其降回ext4文件系统
[root@node1 /]# umount /mnt/ [root@node1 /]# btrfs-convert -r /dev/sdd1 rollback complete [root@node1 /]# blkid /dev/sdd1 /dev/sdd1: UUID="6f62ede6-7c16-4da3-976b-4cc716b61afb" TYPE="ext4"