LVM基础知识
LVM现在用的还是挺多的,每次看每次每次忘,还是记录下吧
LVM3个概念,PV,VG,LV 递进式的,一层层往上
如图所示:
- PV可以创建在一块硬盘 pvcreate /dev/sdb 或者一个分区上 pvcreate /dev/sdb1
- VG创建在PV之上,VG可以跨多个PV创建 vgcreate docker /dev/sdb /dev/sdc
- LV创建在VG之中,LV不可以跨VG, lvcreate -L ${SIZE} -n ${VOLUMEID} ${VG} ,可以-L指定大小创建,也可以lvcreate –wipesignatures y -n thinpool docker -l 95%VG 按百分比的方式创建
日常命令:
pvs,vgs,lvs 一类命令,我一般用来看空间大小以及还剩空间
vgs可以看到剩余的空间,表示lv分不出去了就占了那么大,不能超卖
vgdisplay docker –units g | grep ‘VG Size’ | awk ‘{print $3}’ | cut -d. -f1 看docker这个vg的大小
和docker的结合使用
参照docker官方文档设置dircet模式的lvm
创建2个lv分别用95%,1%的vg的空间
1
2
3
4
5
6#lvcreate --wipesignatures y -n thinpool docker -l 95%VG
WARNING: ext4 signature detected on /dev/docker/thinpool at offset 1080. Wipe it? [y/n]: y
Wiping ext4 signature on /dev/docker/thinpool.
Logical volume "thinpool" created.
#lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
Logical volume "thinpoolmeta" created查看一下lv
1
2
3
4
5
6
7
8# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
thinpool docker -wi-a----- 6.45t
thinpoolmeta docker -wi-a----- 69.54g
查看一下vg,可以看到还有空余订单4%空间
# vgs
VG #PV #LV #SN Attr VSize VFree
docker 1 2 0 wz--n- 6.79t 278.19g将这2个lv转变成thinpool
1
2
3
4#lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
#lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
thinpool docker twi-a-t--- 6.45t 0.00 0.03设置让这2个thinpool可以自动extend,以下的意思是当空间用到80%时,自动扩容20%
1
2
3
4
5
6#cat > /etc/lvm/profile/docker-thinpool.profile << EOF
activation {
thin_pool_autoextend_threshold=80
thin_pool_autoextend_percent=20
}
EOF生效配置
1
2#lvchange --metadataprofile docker-thinpool docker/thinpool
Logical volume "thinpool" changed启用监控模式才能真正有用,否则也不会autoextend 可以看到多了最后一列
1
2
3#lvs -o+seg_monitor
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Monitor
thinpool docker twi-a-t--- 6.45t 0.00 0.03 monitored把以下内容丢到/etc/docker/deamon.json中和你原来的配置结合起来,没有这个文件就新建(注意此处我用的docker版本是17.04.有几个参数和官方推荐不一样) 官方配置见这里
1
2
3
4
5
6
7
8
9{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.thinpooldev=/dev/mapper/docker-thinpool",
"dm.use_deferred_removal=false",
"dm.override_udev_sync_check=true",
"dm.use_deferred_deletion=false"
]
}重启docker docker info查看确认结果
#docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 1 Server Version: 17.04.0-ce Storage Driver: devicemapper Pool Name: docker-thinpool Pool Blocksize: 524.3kB Base Device Size: 10.74GB Backing Filesystem: xfs Data file: Metadata file: Data Space Used: 210.2MB Data Space Total: 7.094TB Data Space Available: 7.094TB Metadata Space Used: 4.542MB Metadata Space Total: 16.98GB Metadata Space Available: 16.97GB Thin Pool Minimum Free Space: 709.4GB Udev Sync Supported: false Deferred Removal Enabled: false Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 #可以看到多了很多东西,原来是 # docker info Containers: 20 Running: 0 Paused: 0 Stopped: 20 Images: 23 Server Version: 17.04.0-ce Storage Driver: overlay Backing Filesystem: xfs Supports d_type: false Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Swarm: inactive
这样弄完后docker相关的东西就全部放在了thinpool里面,你并不能再直接看到images net啊,原来docker目录下那些文件。
只有当docker的container run起来之后,可以看到 /var/lib/docker/devicemapper/mnt/ 下的目录被mount在主机上
创建一个单独的VG出来让docker还是用loopdata的方式
上面的方式确实有些好处,但是不方便在和k8s配合使用的时候用lvm的flexvolume插件,所以还有个方案是lvm创建的时候,多分个区,多创建个vg,然后创建相应的lv 给docker 用,相当于docker还是用loopdata
总结下
- 理论上还是建议用direct lvm thinpool的方式来配合docker使用的
- 以上方式会有docker的image 很少会被gc的问题
- 以上方式会由于空间都被分配了导致无法使用k8s lvm插件的问题
- 以上方式会导致多模块公用thinpool,空间问题时不方便审查,容易甩锅的问题
参考文中链接以及
https://success.docker.com/article/resolving-error-unable-to-take-ownership-of-thin-pool