目录
pvcreate 命令用于创建物理卷,即创建PV,这是lvm技术里常用的一个命令,其语法格式如下:
#可以直接将一块磁盘或磁盘分区进行格式为pv,直接将磁盘格式化为pv没必要分区
pvcreate [option] /dev/sdb /dev/sdc1
常用参数:
无,一般可不用写参数。
演示示例:
[root@localhost ~]# pvcreate /dev/sdb /dev/sdc #直接将磁盘或某个分区转化为物理卷,
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
[root@localhost ~]# pvs #查看有哪些物理卷
PV VG Fmt Attr PSize PFree
/dev/sda2 cl lvm2 a-- 11.00g 4.00m
/dev/sdb lvm2 --- 8.00g 8.00g
/dev/sdc lvm2 --- 6.00g 6.00g
vgcreate 命令用于创建卷组,这是lvm技术中最常用的一个命令,语法格式如下:
vgcreate [参数] 卷组名 物理卷1 物理卷2 .....
常用参数:
-s 指定物理卷中PE的大小,PE可取值 4M(默认值)、8M、16M、32M、64M
演示示例:
[root@localhost ~]# vgcreate my_data /dev/sdb /dev/sdc #创建一个名为my_data的卷组并将sdb和sdc物理卷加入其中,PE的大小默认为4M
lvcreate 命令用于创建逻辑卷,这是lvm技术中最常用的命令,其语法格式如下:
lvcreate [参数] 卷组名
ps:lvcreate创建一个逻辑卷需要指定卷组,表示在哪个卷组之上创建逻辑卷;
常用参数:
-n :指定逻辑卷名称,如 -n lv_data ;
-L :指定逻辑卷的大小,如 -L 10G,单位可以是bBsSkKmMgGtTpPeE;
-l :使用LE个数来指定逻辑卷的大小,如 -l 200,表示使用200个LE来创建逻辑卷,一般的我们最常用的是-L 来直接指定逻辑卷大小即可。这里重点
说明LE是什么,PE是在卷组中的叫法,而LE是在逻辑卷中的叫法,两者是一一对应的。
-l参数还有一种直接使用剩余空间的百分比的形式来给定大小,如 -l +100%FREE
演示示例:
[root@localhost ~]# vgs #先查看有哪些卷组,如下,系统有两个卷组,已经在cl上创建了2个lv,my_data卷组还没创建lv
VG #PV #LV #SN Attr VSize VFree
cl 1 2 0 wz--n- 11.00g 4.00m
my_data 2 0 0 wz--n- 13.99g 13.99g
[root@localhost ~]# lvcreate -n lv_data -L 6G my_data #在my_data卷组上创建一个名称叫lv_data的10G的逻辑卷
Logical volume "lv_data" created.
[root@localhost ~]#
重点:
当我们lvcreate创建一个逻辑卷的时候,其实相当于生成了一个磁盘设备文件,这是由lvm的mapper机制决定,Linux会新建两个软链接文件,如/dev/vg_name/lv_name、/dev/mapper/vg_name-lv_name,而这2个文件都是指向/dev/dm-X 块设备文件的,所以,当我们使用df -h看到的/dev/mapper/vg_name-lv_name的时候,这个其实就是和/dev/vg_name/lv_name一样的,都是指向/dev/dm-X 块设备文件的。
下面我们来看一下安装Linux系统时默认创建的逻辑卷,如下:
ot@my_data ~]# df -h | grep mapper
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 57G 34G 23G 60% / #根分区就是逻辑卷
[root@my_data ~]# ll /dev/cl/root #发现该逻辑卷实际就是dm-0块设备文件
lrwxrwxrwx 1 root root 7 2022-01-29 21:12 /dev/cl/root -> ../dm-0
[root@my_data ~]# ll /dev/mapper/cl-root #发现该逻辑卷实际就是dm-0块设备文件
lrwxrwxrwx 1 root root 7 2022-01-29 21:12 /dev/mapper/cl-root -> ../dm-0
[root@my_data ~]#
mkfs 命令用于格式化分区并创建文件系统,mkfs是make filesystem的缩写,其语法格式如下:
mkfs [options] [-t <type>] [fs-options] <device> [<size>]
主要参数:
-t, --type= 指定文件系统的类型;
-V 可视化,输出详细过程;
演示示例:
mkfs -t ext4 /dev/sda1 #格式化磁盘分区为ext4文件系统
mkfs -t xfs /dev/my_data/lv_data #对上面刚才创建的lv进行格式化并创建xfs类型的文件系统
注意:mkfs命令只是一个综合命令,它会调用正确的文件系统格式化工具,也就是说当你输入mkfs [tab][tab] ,会发现有很多类似的格式化命令。如mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix kfs.vfat ,
不同的文件系统类型需使用不同的命令,如xfs类型的使用mkfs.xfs,ext4的使用mkfs.ext4,这要根据根分区的文件系统类型决定,其实,mkfs -t [文件系统格式名]===>等同于mkfs.文件系统格式名,即mkfs -t xfs 与 mkfs.xfs相同。这里就不在讲解其他类似的命令了。
#使用mkfs创建好文件系统后就可以挂载使用了
mkdir /data
mount /dev/my_data/lv_data /data
pvs、pvdisplay、pvscan 这三个命令都可以查看系统中有哪些物理卷PV,其输入的信息详细情况有所不同而已,语法格式如下:
pvs [参数]
pvdisplay [参数]
pvscan [参数]
一般都不用写参数;
演示示例:
[root@localhost ~]# pvs #pvs查看物理卷信息
PV VG Fmt Attr PSize PFree
/dev/sda2 cl lvm2 a-- 11.00g 4.00m
/dev/sdb lvm2 --- 8.00g 8.00g
/dev/sdc lvm2 --- 6.00g 6.00g
[root@localhost ~]# pvdisplay #pvdisplay更加详细查看物理卷信息
--- Physical volume ---
PV Name /dev/sda2
VG Name cl
PV Size 11.00 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 2815
Free PE 1
Allocated PE 2814
PV UUID oYhjES-MvEK-hfi1-cmno-INK2-vTtz-O80PNJ
"/dev/sdb" is a new physical volume of "8.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 8.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID mn3meS-mPlJ-nQoA-hdEs-3kdl-85zO-f72vQO
"/dev/sdc" is a new physical volume of "6.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 6.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 3u6yis-jF6t-czmS-Rj2i-ghlt-ntP8-IR0T2t
[root@localhost ~]# pvscan #pvscan较为详细的查看物理卷信息
PV /dev/sda2 VG cl lvm2 [11.00 GiB / 4.00 MiB free]
PV /dev/sdb lvm2 [8.00 GiB]
PV /dev/sdc lvm2 [6.00 GiB]
Total: 3 [25.00 GiB] / in use: 1 [11.00 GiB] / in no VG: 2 [14.00 GiB]
[root@localhost ~]#
vgs、vgdisplay、vgscan 这3个命令都可以查看卷组的信息,输出内容有详细简略之分而已,其语法格式如下:
vgs [参数]
vgdisplay [参数]
vgscan [参数]
参数:
一般不用写参数,不指定卷组默认输出全部卷组信息。
演示示例:
root@localhost ~]# vgs #查看卷组信息,输出信息较为简单
VG #PV #LV #SN Attr VSize VFree
cl 1 2 0 wz--n- 11.00g 4.00m
mydb 2 0 0 wz--n- 13.99g 13.99g
[root@localhost ~]# vgdisplay #查看卷组信息,输出信息最详细
--- Volume group ---
VG Name mydb
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 13.99 GiB
PE Size 4.00 MiB
Total PE 3582
Alloc PE / Size 0 / 0
Free PE / Size 3582 / 13.99 GiB
VG UUID wj0tKh-yRKD-dtPd-2JHI-R5X6-vf4r-G2t4R2
--- Volume group ---
VG Name cl
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 11.00 GiB
PE Size 4.00 MiB
Total PE 2815
Alloc PE / Size 2814 / 10.99 GiB
Free PE / Size 1 / 4.00 MiB
VG UUID z8fFwU-5ZTc-mAN4-C3Mj-U1Ty-sYxp-40aKSF
[root@localhost ~]# vgscan #查看卷组信息,输出信息最简单
Reading volume groups from cache.
Found volume group "mydb" using metadata type lvm2
Found volume group "cl" using metadata type lvm2
[root@localhost ~]#
lvs、lvdisplay、lvscan 命令用于查看逻辑卷信息,语法格式如下:
lvs [参数]
lvdisplay [参数]
lvscan [参数]
常用参数:
一般不用写参数,默认输出显示全部的逻辑卷信息。
演示示例:
[root@localhost ~]# lvs #查看系统中全部逻辑卷信息,输出信息较为详细
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 9.79g
swap cl -wi-ao---- 1.20g
lv_data my_data -wi-a----- 6.00g
[root@localhost ~]# lvdisplay #查看系统中全部逻辑卷信息,输出信息最为详细
--- Logical volume ---
LV Path /dev/my_data/lv_data #当创建一个lv时,系统会自动在/dev/下以vg名字和lv名字创建一个文件
LV Name lv_data
VG Name my_data
LV UUID 5NG9C1-O5GU-oLEf-Dxok-lMdZ-klfA-JpSBN6
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2021-09-25 16:25:12 +0800
LV Status available
# open 0
LV Size 6.00 GiB
Current LE 1536
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
--- Logical volume ---
LV Path /dev/cl/swap
LV Name swap
VG Name cl
LV UUID y5kxXD-75vw-amAS-2Doe-u1SI-FQ30-scHOfD
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2021-09-25 14:02:19 +0800
LV Status available
# open 2
LV Size 1.20 GiB
Current LE 307
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
--- Logical volume ---
LV Path /dev/cl/root
LV Name root
VG Name cl
LV UUID mQuBmu-3HVs-Fb04-A1YA-2gHN-4t10-mPTlPF
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2021-09-25 14:02:19 +0800
LV Status available
# open 1
LV Size 9.79 GiB
Current LE 2507
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
[root@localhost ~]# lvscan #查看系统中全部逻辑卷信息,输出信息最为简单
ACTIVE '/dev/my_data/lv_data' [6.00 GiB] inherit
ACTIVE '/dev/cl/swap' [1.20 GiB] inherit
ACTIVE '/dev/cl/root' [9.79 GiB] inherit
[root@localhost ~]#
注意:当我们创建一个lv时,系统会自动在/dev/下以vg名字和lv名字创建一个文件,如/dev/my_data/lv_data,这就是为什么我们在dev下会看到有一个/dev/cl/root文件的缘由了,然后实际上,/dev/cl/root是一个软链接,链接到/dev/dm-X,dm-X才真正是一个块文件。
vgextend 命令用于扩容卷组大小,其语法格式如下:
vgextend [参数] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath ...]
常用参数:
无,一般不用接参数;
演示示例:
#vgextend 命令把sdd1物理卷加入my_data卷组(sdd1已经是物理卷了,my_data是卷组名称)
[root@localhost /]# vgextend my_data /dev/sdd1
查看另一篇:《lvextend 逻辑卷扩容(xfs_growfs、resize2fs配合扩展文件系统)》https://editor.csdn.net/md/?articleId=120475752
缩容lv一般是腾出空间给同vg的其他lv,这并不是一种安全的做法,一般情况下没有人会这么干,一般当lv卷磁盘空间满的时候,会加磁盘来扩容,而不是从同vg下的其他lv腾空间出来,这里仅做出示例:
umount /dev/mapper/my_data-lv_data #卸载lv
e2fsck -f /dev/mapper/my_data-lv_data #先扫描、检查磁盘在执行resize2fs,不然它会提示你先执行e2fsck -f命令的
resize2fs /dev/mapper/my_data-lv_data 100G #缩容文件系统到100G
lvreduce -L 100G /dev/mapper/my_data-lv_data #缩容,lv到100G,此时vg就空闲了很多PE出来了,可以通过vgdisplay命令查看
lvreduce -L -100G /dev/mapper/my_data-lv_data #缩容,lv缩减100G,此时vg就空闲了很多PE出来了,可以通过vgdisplay命令查看
mount /dev/mapper/my_data-lv_data /my_data/ #重新挂载,此时文件系统就是100G大小
#以上缩容发现,一个是需要卸载,这点可以影响业务,其次缩容后重新挂载,原来的文件仍存在,没有丢失。
#下面是一个例子
/dev/mapper/vg--data-lv1T 1008G 77M 957G 1% /gpt1
/dev/mapper/vg--data-lv2 2.0T 81M 1.9T 1% /gpt2
[root@kubernetes ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
vg-data 1 2 0 wz--n- <3.00t 0
[root@kubernetes ~]# lvdisplay /dev/vg-data/lv1T /dev/vg-data/lv2
--- Logical volume ---
LV Path /dev/vg-data/lv1T
LV Name lv1T
VG Name vg-data
LV UUID oYtQ0a-hUQA-pVkK-e8iy-NFam-eRs4-PrMsZW
LV Write Access read/write
LV Creation host, time kubernetes, 2023-03-29 10:20:33 +0800
LV Status available
# open 1
LV Size 1.00 TiB
Current LE 262144
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
--- Logical volume ---
LV Path /dev/vg-data/lv2
LV Name lv2
VG Name vg-data
LV UUID APJ81S-hOEC-LCfp-Oamo-5OTk-C8pA-GLhN2L
LV Write Access read/write
LV Creation host, time kubernetes, 2023-03-29 10:21:08 +0800
LV Status available
# open 1
LV Size <2.00 TiB
Current LE 524287
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
[root@kubernetes ~]#
#打算对/gpt1缩减100G,腾出空间给/gpt2:
umount /gpt1
e2fsck -f /dev/mapper/vg--data-lv1T
#注意这条命令是缩减文件系统到多少G,957-100=857
resize2fs /dev/mapper/vg--data-lv1T 857G
#重新挂载,现在是844G
mount /dev/mapper/vg--data-lv1T /gpt1/
[root@kubernetes ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg--data-lv1T 844G 77M 801G 1% /gpt1
# 文件系统缩减了但是lv没有缩减呀,你看看:
[root@kubernetes ~]# lvdisplay /dev/mapper/vg--data-lv1T
--- Logical volume ---
LV Path /dev/vg-data/lv1T
LV Name lv1T
VG Name vg-data
LV UUID oYtQ0a-hUQA-pVkK-e8iy-NFam-eRs4-PrMsZW
LV Write Access read/write
LV Creation host, time kubernetes, 2023-03-29 10:20:33 +0800
LV Status available
# open 1
LV Size 1.00 TiB #和没缩减文件系统时一模一样
Current LE 262144 #和没缩减文件系统时一模一样
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
# 所以现在开始缩减lv,这里我们写-100G
lvresize -L -100G /dev/vg-data/lv1T
#缩减成功,但是好像不对,lv显示924G,挂载之后的文件系统怎么才844G
[root@kubernetes ~]# lvdisplay /dev/mapper/vg--data-lv1T
--- Logical volume ---
LV Path /dev/vg-data/lv1T
LV Name lv1T
VG Name vg-data
LV UUID oYtQ0a-hUQA-pVkK-e8iy-NFam-eRs4-PrMsZW
LV Write Access read/write
LV Creation host, time kubernetes, 2023-03-29 10:20:33 +0800
LV Status available
# open 1
LV Size 924.00 GiB
Current LE 236544
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
[root@kubernetes ~]# vgs #vg多了100G
VG #PV #LV #SN Attr VSize VFree
vg-data 1 2 0 wz--n- <3.00t 100.00g
[root@kubernetes ~]# df -h /dev/vg-data/lv1T
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg--data-lv1T 844G 77M 801G 1% /gpt1
[root@kubernetes ~]# 重新卸载重新挂载也是一样的,怎么回事?
lvremove 命令用于删除逻辑卷,当一个逻辑卷不再需要之后,可以把它删除,其语法格式如下:
lvremove [参数] lv名或lv路径
常用参数;
无,一般不需要接参数;
演示示例:
[root@localhost ~]# umount /dev/mapper/my_data-lv_data #删除一个lv之前必须先卸载文件系统
[root@localhost ~]# lvremove /dev/my_data/lv_data #删除逻辑卷,如果不知道lv的路径,可以通过lvdisplay命令查看
Do you really want to remove active logical volume my_data/lv_data? [y/n]: y
Logical volume "lv_data" successfully removed
vgremore 命令用于删除卷组,当不再不需要某个卷组之后,可以删除卷组,语法格式如下;
vgremove [参数] VolumeGroupName
常用参数:
无,一般不需要参数;
演示示例:
[root@localhost ~]# vgremove my_data #删除整个卷组
Do you really want to remove volume group "my_data" containing 1 logical volumes? [y/n]: y
Volume group "my_data" is removed
pvremore 命令用于删除物理卷,当不再不需要某个物理卷之后,可以删除物理卷,语法格式如下;
pvremove [参数] PhysicalVolume
常用参数:
无,一般不需要参数;
演示示例:
#删除物理卷,该物理卷必须从vg中卸载下来,使用vgreduce my_data /dev/sdd1卸载即可
[root@localhost ~]# pvremove /dev/sdd1
Removed "/dev/sdd1" from volume group "my_data"
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/