1 Linux 的分区机制
1.1 Windows 与Linux分区的区别
在Windows通过鼠标单机盘符,来进入一个分区;而在Linux则是通过cd命令进入目录来进入一个分区,这就是两个操作系统最大的不同。
1.2 Linux的主分区,扩展分区,逻辑分区
使用 fdisk /dev/sdb 可以查看硬盘信息,也可以编辑硬盘,sdb是新创建的硬盘,接着输入 p 就会显示当前硬盘的信息,接下来输入 n 表示开始创建分区,不保存不会生效。
输入 n 之后系统会给出两个选择:
- primary:主分区 - extended:扩展分区
分区分类:
主分区:是最重要的分区形式,使用率最高。一块硬盘上最多只能建立4个主分区,每建立一个主分区,它都会占用一个编号,从 01 到 04逐一递增。如果需要超过 4 个分区需要用到扩展分区。
扩展分区:不受 4个的限制,其实扩展分区跟主分区一样都占用这4个位置的名额,扩展分区是可以继续划分出多个分区的,扩展分区内部再划分出来的分区叫做逻辑分区。
注意:不管主分区和扩展分区总数有没有达到4个,逻辑分区永远都是固定从编号 05 开始 。
1.3 实际操作建立各种类型的分区
创建一个分区
第一步:先输入 n,表示要创建新分区
第二步:紧接着输入 p,p代表是primary,对应上面的第一个提示。
p primary (0 primary, 0 extended, 4 free) ,代表这几个主分区,几个扩展分区,4个名额还有多少
第三步:输入 p 后按 Enter键后,如下,系统提示选择分区编号
Partition number (1-4, default 1): 这里分区编号是 1-4 ,可以在这里输入其中任意一个数字。如果不输入直接按回车就默认设定为1.
第四步:默认编号是 1
First sector (2048-10485759, default 2048):
sector 代表扇区,理解什么是扇区还要知道很多硬盘物理概念。例如:一个硬盘有多少磁道,盘面,磁头等,按照最简单的方式来理解,其实 First sector (2048-10485759, default 2048): 可以这样理解: 现在要创建一个新的分区,Linux在问我们希望把这个新分区分多大的空间,它给出的范围2048-10485759。这里可以理解Linux把这一块硬盘的总容量分成一个个的等份。
然后输入 p 就可以看到新的分区了
计算一下
512字节 * 10485759 = 5,368,708,608字节
1024字节 = 1KB
1024KB = 1MB
5,368,708,608 / 1024 / 1024 = 5,119.99951171875 MB差不多就是 5GB
由于操作系统的一些特性,一个硬盘、分区都做不到一个整数的容量。
第五步:分区设定好后并不会立即生效,需要 wq 保存一下
1.4 Linux 创建文件系统
已经创建好分区后没有文件系统是不能使用的。把刚创建的分区好比做是一个空教室,创建分区的最终目的是存储文件,把大量的文件好比做是一个个学生,学生没办法在一个空教室入座学习,需要给教室布置课桌椅,这些课桌椅就可以理解为分区的文件系统,有了文件系统后,学生/文件才能对号入座。
创建文件系统:mkfs.ext4 + 目标分区,ext4 指的是Linux文件系统的格式
执行完这个命令后文件系统就创建好了,还需要一个步骤 挂载 就能正式让分区投入使用。
2 Linux下的挂载机制
2.1 挂载概念
挂载就是把一个分区和一个文件夹关联起来,让这个文件夹成为分区的入口。卸载就是相反去掉这个关联。
2.2 快速 mount 挂载第一个分区
重新创建三个分区,分别指定文件系统。
已经创建的三个分区是 sdb1 sdb2 sdb3 ,然后创建三个文件夹 opt1 opt2 opt3
然后使用 mount 命令 先指定要被挂载的分区,再指定挂载到那个文件夹。然后使用 df 命令就可以清楚的看到三个分区已经被挂载到相应的文件目录下。
三个分区已经挂载好,但是如果机器重启的话就会白挂载了。所以必须还得有一种方法实现挂载永久化。
vim /etc/fstab --使用这个vim编辑这个文件,在文件最后添加3行,保存退出后,挂载就会永久生效
-
第一列:设备名称,也就是要被挂载的分区
-
第二列:挂载点,也就是希望挂载到那个文件夹
-
第三列:文件系统的格式,这个之前都是采用ext4文件格式
-
第四列:文件系统的参数,这里给予不同的参数,可以让挂载后的分区有一些特殊功能,一般设置defaults即可
第五列:备份参数,一般就设置 0 0即可。
2.3 卸载分区和冲突的解决方法
使用 umount /opt1/ 可以卸载指定的分区,
但是卸载一个分区后,仅仅是断掉和文件夹的关联而已。而分区中已保存的文件不会受到任何影响。
使用 umount 可以方便的卸载掉当前为使用的分区
如果当前分区另一个人正在里面编辑文件,则 umount 不能够立即卸载
解决这个冲突有两种方式:
正常关闭正在使用该分区的程序。即可卸载
找到并杀死使用分区的程序
lsof(8) or fuser(1) --通过文件找进程,也就说可以知道当前是什么程序,打开了某个/某些文件
通过 losf+管道符,可以过滤出正在编辑的文件的程序就是进行
lsof | grep 1.txtvim 4205 root 3u REGB,17 12283 34 /opt1/1.txt
其中第二列 4205 表示的是 进程ID /PID,可以通过 kill 掉这个进程来结束它,在执行 umount 就可以成功的卸载掉分区了。
kill 4205
2.4 硬盘不足的处理方法
一个分区再大,也有容量用完的时候。
例如:普通用户的家目录都在 /home 下,而 /home 分配了一个单独的分区 sdb1,这个 sdb1 分区有 800 MB,真个 sdb 硬盘有 3G。sdb1分区已经用完,需要进行处理
第一种方法:
先备份再重新分区,这种方法比较笨拙但相对稳妥,不易出问题。
步骤:
第二种方法:直接扩充分区 sdb1
步骤:
umount 卸载 /home 目录
fdisk 进入 sdb,删除 sdb1 并重新创建 sdb1 分区,要保证分区的起始点和之前一样,结尾点是到最右边。一个分区的扩容一定是左边起始点不变,而右边向右扩充
填充分区。原本的 sdb1 分区从 800MB 扩容到了 3000MB,也就是说出来了 2200MB 的空间,而原本的 800MB 中,已经有之前的数据,这个被保留下来。但后面的 2200MB 空间是一个全新的空间,这个空间不但没有任何数据,连文件系统也没有。
需要显示用命令 e2fsck -f /dev/sdb1 进行硬盘分区检验,通过后才能执行 填充
此时对分区的填充工作不能使用 mkfs.ext4命令(不然之前的数据会被清空),而是用一个新命令 resize2fs 来填充分区的文件系统。
3 Linux 硬盘相关扩展知识
ext4 是最新一代的 LInux 文件系统,ext4 之前还有一个发展的过程,最早的ext是最为一个不够成熟的,等到 ext2时 就变成了一个里程碑,称为Linux 的正规文件系统。然后 ext3 ext4 更多的被视为 ext2 的功能增强,但核心本质不变。
3.1 Linux 文件系统下的存放方式
Linux 下怎么存放文件,当然不是说随意扔进硬盘中存放,一个裸盘没有能力存文件,必须有一个帮手,这个帮手就是文件系统。
文件系统就好像是一个大管家,协助硬盘把所有的文件分门别类,有序地管理、存放起来。
Linux ext2 文件系统的基本核心是把文件分成 inode 和 block 两个部分来存放。现有一个文件 mylog.txt,在文件系统的眼中会把这个文件分成两个部分对待,第一个部分是这个文件的属性,第二个部分则是这个文件中的真实内容。
之前学习过文件的各种读、写、执行权限,也学习过文件的属主、属组,类似这些就是文件的属性。
属性会单独存放在一个地方,就是 inode。而文件的真实内容就是 Vim 编辑进去的内容。内容会单独存放在一个地方就是 bolock(也叫做块)。
3.2 以 inode 为核心的文件系统
inode 和block 的诞生之父就是格式化(创建文件系统),就是之前的标准做法,先用 fdisk 把硬盘做好几个分区,但这时分区都是空的 。
下面实验:对随便一个硬盘,然后随便分出去几个分区,分好之后,先不要执行 mkfs.ext4.
然后使用 dumpe2fs 命令来查看一个分区(硬盘)的文件系统信息。这里会提示找不到 superbolock,也就是说找不到正确的文件系统。
没有文件系统的分区,Linux 也不允许我们去挂载它,也就是没有办法正常使用
然后给 sdb1 创建文件系统
然后在使用命令 dumpe2fs /dev/sdb1 | less ,显示当前这个分区空闲可用的 inodes 和 blocks 有多少个。
dumpe2fs 给的信息太过详细了,如果只是要关注 inode 的信息,可以直接使用 df -i 来查看inodes的使用率。现在上图中 sdb1 分区总共有46837个可用inodes,在 Linux 下每创建一个新的文件,就要消耗一个 inode。当前分区最多可以让我们创建 46837 个不同的文件。
3.3 inode 和 block 的关系
文件的大小很容易知道的,block的大小需要用命令查看其大小:
dumpe2fs /dev/sdb1 | grep "Block size" --查看block大小
下面做个实例:
使用之前的 dumpe2fs 命令可以查看一个分区block大小,这个 4096 单位是字节,换算一下就是 4KB 的大小,既然一个 block 的容量是 4KB,那么如何知道一个文件具体占用了多少block。
先用 dd 创建一个 1MB 大小的文件,然后使用 ls 的特殊参数指定当前数据块大小是 4096 ,最后得到这个文件一共占用了 256 个blocks
一个文件系统中的逻辑块 block 的大小有限,也是固定的。当一个文件较大时,它会占用多个 blocks 来存储,然而这个文件对应的 inode 却只有一个。
假设有一个文件 1.txt,想去访问它,首先通过文件名还有所在路径找到这个文件对应的 inode 编号,在Linux文件系统中,inode和block都有编号,例如找到编号为 7 的inode,只找到 inode 是不行的,最终是为了访问文件的内容。编号 7 的inode中又记录了关联的几个 block 的编号,分别是 2,5,7,14,这样下来,文件系统就通过 indoe 找到所需要的文件块。
像Linux这样的文件系统,又称作索引式文件系统,特点就是稳定而高效。
3.4 Linux 下的 block group 和 superblock
在一个硬盘或者分区中,这么多的 inode 和 block 不会全部堆在一起的,会影响访问效率,而是要有规则地划分出组来。
一个分区创建好文件系统之后,就把所有的 inode 和 block 在逻辑上分成多个组,每个组都有自己独立的 inode 和 block。
使用命令
dumpe2fs /dev/sdb1
可以看到输出信息,可以清楚地看到分成多个 block groups
当所有的 inode 和 block 在文件系统中创建好之后,为了提高硬盘的访问效率就会被平均地分成多个组,每个组都有独立的 inode 和 block。
一个分区中有大量的 inode 和 block,然后又被分成了多个组,每个组自成体系,在分区中开始被挂载使用后,组下的各个成员都开始运作起来,需要一个东西来记录这些成员信息,这就是 superblock 的功能。superblock 超级块,本身也就是一个 块,只不过记录的东西与普通的块不一样。
通常一个分区中,第一个 block group 会含有 superblock,而后面的 block group 可能会有它的备份。虽然这个superblock 空间不大,却非常的重要,因为整个分区的核心信息都会记录在这个 superblock中,可以说没有 superblock 就没有这个分区的存在
创建完文件系统后 mkfs.ext4 /dev/sdb1 可以看到
3.5 Linux 下的硬链接和软链接
硬链接:
创建硬链接:
ln + 已有的文件 + 要创建的链接文件ln report.txt report
注意:链接文件创建出来以后,硬盘的空间不会有丝毫的减少的创建一个硬链接,相当于是用一个新的文件名,并不是复制一个文件,而是用另外一个文件名指向到原本已有的 inode,再指向到原本已有的 block 上。block 没有被复制,所以才不会减少剩余空间。
软链接:
创建软链接:
ln -s 已有的文件 + 要创建的链接文件ln -s report.txt report创建一个软链接与硬链接的唯一区别就是多了一个参数 -s ,创建出来的软链接有一个 —> 箭头指向,箭头左侧是软链接文件,右侧是源文件
硬链接和软链接的区别:
软链接是首先创建出一个完整的文件出来,有独立的 inode,也有独立的 block。不过这个 block 里存在的内容比较特殊,存的是源文件的完整路径 “ /etc/ssh/sshd_config ”,软链接就是强行记录下源文件的所在地点和名字,然后直接导向过去。如果源文件被删除,软链接文件则变成无法访问状态。
硬链接由于是共享同一个 inode,所以它不能跨越分区,也就是说,硬链接只能在同一个分区中创建。而软链接则不同,它保存的是源文件的位置信息,所以无论跨区不跨区都一样,软链接比较像 windows 里的创建快捷方式
硬链接如果删除了源文件,不会受到任何影响,照样可以访问,而软链接由于仅仅是一个快捷方式,如果源文件不存在了,那么这个软链接文件也没办法访问。
4 逻辑卷 LVM 在线扩容
4.1 逻辑卷 LVM 是什么
在Linux 下,一个硬盘分好了区后,大小已经固定下来,不好改变,除非把这个分区卸载,然后删掉分区,重新利用剩余空间再创建一个更大的分区,如果这样做的话会有问题,就是如果有某个软件或进程正在使用这个分区的数据就必须把他们停下来才能卸载。
如果分区2只有1GB,不够用扩展2GB还是不够用了,硬盘已经没有地方扩容,再装上一个硬盘也是没有办法扩充的。
逻辑卷可以 海纳百川,这个 逻辑卷LVM 是可以随时随地创建出一个卷来的。
4.2 LVM实际操作
分区和硬盘打标签,分区和硬盘在融入逻辑卷之前必须先打个标签,这相当于是告诉 Linux 操作系统这些分区或硬盘将要加入逻辑卷中。给分区或硬盘打标签的方法很简单:使用命令 pvcreate + 设备名字。
创建大仓库,就是创建一个 LVM 卷组,使用 vgcreate + 仓库名字 + 多个设备,并把 sdb1、sdb2 都融入进去,仓库的总空间为 sdb1 + sdb2
创建好仓库后就可以从里面分出“空间”来创建一个卷,使用 lvcreate 命令来创建一个名字叫 mylv01 的卷,并且分配 1GB 的空间。命令 myvg01 代表从 myvg01 仓库中索取空间来创建卷。
然后使用 vgdisplay 可以查看 仓库已经使用 1GB 的空间,剩余 1.99GB 的空间。
给创建出来的卷创建文件系统(格式化),创建出来的卷等同于一个分区,所以说需要给他创建文件系统。注意:格式化需要到 /dev/myvg01目录下找到 mylv01
然后把这个卷挂载到一个目录上就可以使用了。
mount /dev/myvg01/mylv01 /optpv(物理卷),vg(卷组)
4.3 逻辑卷 LVM 自由伸缩在线扩充
假设 mylv01 的空间 1GB 不够,需要扩充,可以使用 lvextend 把卷 mylv01 进行扩充
lvextend -L +1G /dev/myvg01/mylv01
然后使用 df -h 查看的时候还是 1GB,少了一个步骤,就是 resize2fs ,用来把扩容出来的空间填补文件系统。
resize2fs /dev/myvg01/mylv01
如果仓库的空间也用完了,需要再给虚拟机添加另一块硬盘 sdc
添加好之后,先创建 pv
pvcreate /dev/sdc
然后用 vgextend(vg 代表卷组,extend 表示扩展的意思,就是扩展卷组)。用来扩充 vg 卷组,相当于添加新的硬盘或者新的分区进入大仓库中
vgextend myvg01 /dev/sdc
然后用 vgdisplay myvg01 命令就可以看到扩容成功了。
逻辑卷的扩充是绝对安全的,但是逻辑卷的缩小是有风险的,因为一个硬盘中的数据(block 块)分布并不是一个挨着一个的,也有可能分散这使用,如果把一个正在使用的卷缩小,很有可能造成数据的错位或者丢失。