Linux读磁盘文件程序,linux之文件操作系统

从磁盘到文件系统

硬盘

在整个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。

f759deac126a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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:

Last mounted on:

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(逻辑卷)的大小。

f759deac126a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值