从磁盘到文件系统
硬盘
- 在整个linux操作系统中,硬盘的作用为应用程序持久化的存储数据。如数据库应用程序,存数据时要把数据存放到硬盘,取数据中要从硬盘中读取数据。
- 硬盘文件通常存放在/dev/目录下,根据不同的型号对应的文件名也不同,例如scii型号的硬盘对应的目录为/dev/sd[a-z]
- 硬盘中最小的存储单位为扇区,通过fdisk -l 可以得到对应扇区的大小,一般为512B
分区
将硬盘划分为多个隔离的存储区域称为分区
文件系统
- 文件系统本质上是对硬盘做了封装,使得用户能够更好的操作文件,比如创建删除文件,设置文件的权限等。这些都是通过文件系统的代码来实现的。
- 不同的文件系统的功能略有不同,常见的有ext系列,xfs等
- 一般情况下,为了实现上诉公文件系统的功能,文件系统的大致实现主要是将分区划分为三个部分,一部分用来存放超级快,一部分用来存放索引节点,一部分用来存放数据,三个部分描述如下所示
- 超级快中存放着整体文件系统的信息,如inode数量,block数据,inode size等。xfx_info,dumpe2fx分别用来查看类型为xfs和ext系列的超级快信息
- inode中存放着文件的元数据,如文件权限,数据block的地址等
-
数据快中存放着真正的数据。通常情况下,block为文件系统的最小存储单位,其大小为1K,2K,4K等情况。事实上,这是由文件系统的代码对情况进行了操作,将磁盘中的多个扇区组成一个block。
filesystem.png
# 小实验
# 以硬盘,分区,文件系统顺序来对应linux下的命令
# 查看硬盘相关信息使用fdisk就够用了,并且fdsik还可以用来进行分区
[root@localhost ~]# fdisk -l
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x94ef2375
Device Boot Start End Blocks Id System
# 查看分区相关的信息lsblk
# [root@localhost ~]# 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 5G 0 disk
├─sdc1 8:33 0 2G 0 part
└─sdc2 8:34 0 3G 0 part
sr0 11:0 1 4.3G 0 rom
# [root@localhost ~]# mkfs.ext4 /dev/sdc2 # 格式化文件系统
# [root@localhost ~]# mkfs.xfs /dev/sdc1 # 格式化文件系统
# [root@localhost ~]# blkid # 查看已经格式化后的所有分区
/dev/sda1: UUID="de0cb2ab-d418-4a8e-8cc9-450b450bbbcd" TYPE="xfs"
/dev/sda2: UUID="fcMszV-w74Q-A8W6-U7l6-NZpF-4U4Z-YYhfWs" TYPE="LVM2_member"
/dev/sr0: UUID="2018-11-25-23-54-16-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
/dev/mapper/centos-root: UUID="d0889505-1e0d-4793-991f-81c14ec2c104" TYPE="xfs"
/dev/mapper/centos-swap: UUID="d8d8ffd5-9902-4d05-8d53-c32392af6376" TYPE="swap"
/dev/sdc1: UUID="10ef663c-bf20-440d-a3d7-73d095dcfdbd" TYPE="xfs"
/dev/sdc2: UUID="e6029a1b-fa51-45d3-a0cf-6e904721eb9c" TYPE="ext4"
# 查看超级块信息
# [root@localhost ~]# dumpe2fs /dev/sdc2
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: e6029a1b-fa51-45d3-a0cf-6e904721eb9c
# [root@localhost ~]# xfs_info /dev/sda1
meta-data=/dev/sda1 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
# 查看某一个文件属于哪个文件系统
# [root@localhost ~]# df -T anaconda-ks.cfg
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/mapper/centos-root xfs 17811456 1061548 16749908 6% /
LVM(logic volume manager)技术
LVM技术相关概念见参考1。
简单来说,如下图所示,LVM通过把多块PV(物理卷),组成一个很大空间的VG(组卷),该VG就相当于一块具有很大空间的磁盘。然后从VG中申请一部分空间成为LV(逻辑卷),之后对LV(逻辑卷)进行格式化,挂载到相关目录上就可以使用了。当该LV空间不足时,直接从VG中申请空间就可以扩大LV(逻辑卷)的大小。

# 小实验
[root@localhost ~]# fdisk -l # 查看硬盘情况
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x94ef2375
Device Boot Start End Blocks Id System
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0000399e
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM
# [root@localhost ~]# fdisk /dev/sdb # 选择对应的硬盘,进行分区
# [root@localhost ~]# fdisk -l # 查看分区后的结果
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x94ef2375
# 将/dev/sdb划分为如下两个分区
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux
/dev/sdb2 10487808 20971519 5241856 83 Linux
# [root@localhost ~]# pvs # 查看系统的pv(物理卷情况)
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
# /dev/sda2分区是一个pv,其属于名为centos的vg中,并且该vg空余空间为0
[root@localhost ~]# vgs # 查看系统的vg(卷组)
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
# 目前系统只有一个名为centos的卷组,该卷组由一个pv组成,并且基于该vg创建了两个LV
[root@localhost ~]# lvs # 查看系统的lv使用情况
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
# 目前系统中有两个LV,分别是root和swap,空间分别是17G和2G。并且都属于名为centos的vg中。
[root@localhost ~]# pvcreate /dev/sdb1 # 将/dev/sdb1分区变为pv
Physical volume "/dev/sdb1" successfully created.
[root@localhost ~]# pvcreate /dev/sdb2 # 将/dev/sdb2分区变为pv
Physical volume "/dev/sdb2" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 --- 5.00g 5.00g
/dev/sdb2 lvm2 --- <5.00g <5.00g
# 系统中多出了两个pv,分别为/dev/sdb1和/dev/sdb2。可以发现其VG字段没有值,说明其还不属于任何一个vg
[root@localhost ~]# vgcreate vg1 /dev/sdb1 /dev/sdb2 # 创建一个vg并且将/dev/sdb1和/dev/sdb2两个pv加入到该vg中去
Volume group "vg1" successfully created
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 vg1 lvm2 a-- <5.00g <5.00g
/dev/sdb2 vg1 lvm2 a-- <5.00g <5.00g
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
vg1 2 0 0 wz--n- 9.99g 9.99g
[root@localhost ~]# lvcreate -L 6G vg1 -n test1 # 从vg1中选择6G来作为一个LV
Wiping xfs signature on /dev/vg1/test1.
Logical volume "test1" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
test1 vg1 -wi-a----- 6.00g
[root@localhost ~]# lvcreate -L 2G vg1 -n test2
Wiping xfs signature on /dev/vg1/test2.
Logical volume "test2" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
test1 vg1 -wi-a----- 6.00g
test2 vg1 -wi-a----- 2.00g
[root@localhost /]# mkfs.xfs /dev/vg1/test1 # 对逻辑卷进行文件系统操作
meta-data=/dev/vg1/test1 isize=512 agcount=4, agsize=393216 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1572864, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost /]# mount /dev/vg1/test1/ /lv/ # 挂载
[root@localhost /]# df -h
/dev/mapper/vg1-test1 6.0G 33M 6.0G 1% /lv
[root@localhost /]# lvresize -L +500M /dev/vg1/test1 -r # 给该lv添加500M的空间
Size of logical volume vg1/test1 changed from 6.00 GiB (1536 extents) to <6.49 GiB (1661 extents).
Logical volume vg1/test1 successfully resized.
meta-data=/dev/mapper/vg1-test1 isize=512 agcount=4, agsize=393216 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=1572864, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 1572864 to 1700864
[root@localhost /]# df -h
/dev/mapper/vg1-test1 6.5G 33M 6.5G 1% /lv
[root@localhost /]# parted /dev/mapper/vg1-test1 print # 查看该磁盘的详情信息
Model: Linux device-mapper (linear) (dm)
Disk /dev/mapper/vg1-test1: 6967MB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags:
Number Start End Size File system Flags
1 0.00B 6967MB 6967MB xfs
# 查看一下lvs,vgs,pvs的信息
[root@localhost /]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
test1 vg1 -wi-ao---- <6.49g
test2 vg1 -wi-a----- 2.00g
[root@localhost /]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 vg1 lvm2 a-- <5.00g 0
/dev/sdb2 vg1 lvm2 a-- <5.00g 1.50g
[root@localhost /]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
vg1 2 2 0 wz--n- 9.99g 1.50g
# 依此删除lv,vg,pv
[root@localhost /]# lsblk # 查看硬盘及其对应分区和对应分区的类型和挂载点,其中type中disk为磁盘,part为分区,lvm为逻辑卷
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
├─sdb1 8:17 0 5G 0 part
│ └─vg1-test1 253:2 0 6.5G 0 lvm /lv
└─sdb2 8:18 0 5G 0 part
├─vg1-test1 253:2 0 6.5G 0 lvm /lv
└─vg1-test2 253:3 0 2G 0 lvm
sdc 8:32 0 5G 0 disk
sr0 11:0 1 4.3G 0 rom
# 注 /dev/vg1/test1等价上面的vg1-test1
# 从上面发现累心为lv的/dev/vg1/test1挂载在/lv上
# [root@localhost /]# umount /dev/vg1/test1
[root@localhost /]# 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
├─sdb1 8:17 0 5G 0 part
│ └─vg1-test1 253:2 0 6.5G 0 lvm
└─sdb2 8:18 0 5G 0 part
├─vg1-test1 253:2 0 6.5G 0 lvm
└─vg1-test2 253:3 0 2G 0 lvm
sdc 8:32 0 5G 0 disk
sr0 11:0 1 4.3G 0 rom
[root@localhost /]# lvremove vg1/test1 # 删除lv
Do you really want to remove active logical volume vg1/test1? [y/n]: y
Logical volume "test1" successfully removed
[root@localhost /]# lvremove vg1/test2 # 删除lv
Do you really want to remove active logical volume vg1/test2? [y/n]: y
Logical volume "test2" successfully removed
# 查看一下lv,vg,pv
[root@localhost /]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
[root@localhost /]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
vg1 2 0 0 wz--n- 9.99g 9.99g
[root@localhost /]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 vg1 lvm2 a-- <5.00g <5.00g
/dev/sdb2 vg1 lvm2 a-- <5.00g <5.00g
# [root@localhost /]# vgreduce vg1 /dev/sdb1 #将名为/dev/sdb1的pv从vg1中移除
Removed "/dev/sdb1" from volume group "vg1"
[root@localhost /]# pvremove /dev/sdb1 # 将名为/dev/sdb1从pv变成普通的分区
Labels on physical volume "/dev/sdb1" successfully wiped.
# 看一下效果
[root@localhost /]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
[root@localhost /]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb2 vg1 lvm2 a-- <5.00g <5.00g
[root@localhost /]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
vg1 1 0 0 wz--n- <5.00g <5.00g
# 实际操作中,vg中一定要包含至少一个pv,当vg中只有一个pv时,不能将其中的pv从vg中移除,因此直接将vg移除
[root@localhost /]# vgremove vg1
Volume group "vg1" successfully removed
# 查看一下效果
[root@localhost /]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
[root@localhost /]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
[root@localhost /]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb2 lvm2 --- <5.00g <5.00g
[root@localhost /]# pvremove /dev/sdb2 # 将名为/dev/sdb2变为不同的分区
Labels on physical volume "/dev/sdb2" successfully wiped.
# 看一下效果
[root@localhost /]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
[root@localhost /]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
[root@localhost /]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
网友评论