美文网首页
linux之文件操作系统

linux之文件操作系统

作者: 小小小笑呵 | 来源:发表于2019-06-29 21:53 被阅读0次

从磁盘到文件系统

硬盘

  • 在整个linux操作系统中,硬盘的作用为应用程序持久化的存储数据。如数据库应用程序,存数据时要把数据存放到硬盘,取数据中要从硬盘中读取数据。
  • 硬盘文件通常存放在/dev/目录下,根据不同的型号对应的文件名也不同,例如scii型号的硬盘对应的目录为/dev/sd[a-z]
  • 硬盘中最小的存储单位为扇区,通过fdisk -l 可以得到对应扇区的大小,一般为512B

分区

将硬盘划分为多个隔离的存储区域称为分区

文件系统

  • 文件系统本质上是对硬盘做了封装,使得用户能够更好的操作文件,比如创建删除文件,设置文件的权限等。这些都是通过文件系统的代码来实现的。
  • 不同的文件系统的功能略有不同,常见的有ext系列,xfs等
  • 一般情况下,为了实现上诉公文件系统的功能,文件系统的大致实现主要是将分区划分为三个部分,一部分用来存放超级快,一部分用来存放索引节点,一部分用来存放数据,三个部分描述如下所示
  1. 超级快中存放着整体文件系统的信息,如inode数量,block数据,inode size等。xfx_info,dumpe2fx分别用来查看类型为xfs和ext系列的超级快信息
  2. inode中存放着文件的元数据,如文件权限,数据block的地址等
  3. 数据快中存放着真正的数据。通常情况下,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(逻辑卷)的大小。


filesystem.png
# 小实验
[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

参考

1 LVM维基百科

相关文章

网友评论

      本文标题:linux之文件操作系统

      本文链接:https://www.haomeiwen.com/subject/dozscctx.html