手把手教你Linux磁盘分区与文件挂载
欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起探讨和分享Linux C/C++/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。
Linux磁盘分区与文件挂载
专栏:《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具、Linux文件IO、进程管理、进程通信、多线程等,请关注专栏免费学习。
1. 添加新硬盘并进行分区
如果一个电脑上插了多块硬盘,开机时识别到的第一块硬盘称为SDA(C盘、D盘、E盘是同一块硬盘的不同分区),第二块称为SDB,以此类推,其中SD代表硬盘的接口,AB代表顺序。SDA1代表第一块硬盘的第一个分区。我们可以在虚拟机设置中添加硬盘(虚拟的),这就相当于我们在自己的物理机上插入了一块新的硬盘。
然后进入Linux可以通过命令来查看新增的磁盘,以及新增磁盘的分区情况
【本质探析】 磁盘是一种硬件级别的设备,而硬件是由操作系统去控制的,比如说我们使用vim编辑一个文件,我们在文件中输入内容,这些操作都是在内存中完成的,也就是说我们用vim编辑器写入的内容都是在内存中的,因为vim是一个应用程序,它只能操作文件级别的(在内存中)。当我们保存文件的时候,会由操作系统去把这个文件中的内容保存到磁盘中,对磁盘的操作一次是512byte,也就是说在硬件级别,一次性对硬盘的操作是512byte。而操作系统级别有一个块的概念,block,一个block大小是8个512byte,也就是说我们在文件中输入的内容,操作系统会以1个block的大小往磁盘中写数据,但是磁盘处理的时候是一个512byte一个512byte的写入的。存储级别分为:文件级别(比如文件夹修改、删除文件等)、块级别(比如一块未分区的裸盘)、对象级别(对象存储,比如百度网盘,我们只能上传下载文件,如果要想修改文件名只能下载到本地修改好再上传到网盘中,不能直接修改)。
我们可以对新加的硬盘SDB进行分区:
键入m进入帮助
我们可以在Command(m for help):的冒号后面输入这些命令来进行配置,比如输入n,按回车表示新建分区(一个硬盘最多只能有4个主分区)
按p可以打印出新建的分区信息
Boot栏如果有 * 表示这是启动盘,空白则表示普通盘的分区。我们可以看下原有的SDA盘信息,它就是启动盘
然后我们可以继续建第二个分区
我们最多可以建4个主分区,再建第5个就会提示要删除一个分区并添加一个扩展分区才能继续建。另外,再建最后一个主分区的时候,指定分区结束位置的时候可以不输入,表示把剩余空间都给这个分区。
如果想要创建更多的分区,可以使用d删除一个分区,然后创建一个扩展分区(命令n选择e),在扩展分区内可以创建更多的分区。
直接回车到最后,这时,相当于把剩余空间都分给扩展分区了
建完扩展分区后,就可以继续建新分区了,所建的新分区都是使用的扩展分区的空间,所以新建分区的大小之和不能超过扩展分区的大小。扩展分区是一个逻辑的概念,新建的分区都是扩展分区内的分区。
建完所有的分区后,需要保存并更新。保存命令是w,保存后执行partprobe命令来更新分区。
那么为什么磁盘主分区只能建4个呢,因为MBR中有64byte是磁盘分区信息,这64byte只能存4个主分区的信息,要想创建更多分区,只能创建一个扩展分区,这个扩展分区用来记录在扩展分区中创建的更多分区的信息
- 主分区:记录分区信息,存储数据;
- 扩展分区:只用来记录更多分区的信息,扩展分区是一个逻辑的概念,不能存储数据,它下面的分区才是真正用于存储的数据;
我们在建分区的时候可以不建主分区,但是只有主分区可以作为操作系统的启动分区,所以一般都是要建主分区的。
2. 分区的格式化与挂载
我们创建完分区保存后,可能会刷新不出来新建的分区信息,可以多刷新几次
新建的硬盘分区不能直接使用,需要先格式化,即格式化制作文件系统。使用命令mkfs(make filesystem)格式化。
mkfs.ext4 #ext4文件系统,centos 6 一般都用ext4
我们可以通过tab键查看当前Linux下可选的文件系统
Windows下的文件系统可以在属性中查看
我们通过mkfs命令把自己新建的所有分区都格式化
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
mkfs.ext4 /dev/sdb3
# mkfs.ext4 /dev/sdb4 #扩展分区不能格式化
mkfs.ext4 /dev/sdb5
mkfs.ext4 /dev/sdb6
扩展分区不能格式化,格式化扩展分区中的分区即可。另外,我们在使用分区的时候也要注意,扩展分区不能使用,应该使用它下面的分区。
格式化之后的硬盘分区就可以使用了,/dev/sdb1就是实际硬盘sdb1分区的一个映射,我们可以直接把这个设备当作硬盘。我们在使用磁盘分区的时候,需要把磁盘分区映射为一个目录,这样我们操作目录,在目录下创建文件就相当于往目录对应的磁盘分区上保存数据。这个由磁盘分区映射为目录的过程就叫做挂载,挂载要使用的命令是mount。
mount /dev/sdb1 /sdb1/
#将磁盘分区/dev/sdb1映射为 /sdb1/ 目录
#就相当于把/dev/sdb1挂载到/sdb1/上了
使用df命令可以查看挂载信息
这时,我们只要在/sdb1/目录下写文件,就相当于把数据保存到/dev/sdb1磁盘分区中了。
3. 文件系统
上面再格式化的时候用到了ext4文件系统,像ext4、ext2等等文件系统都属于日志文件系统。日志文件系统是这样的,比如说我们上面挂载好的/dev/sdb1,它对应的目录是/sdb1/,当我们向这个目录中新建文件并写入内容的时候,它是分为两步完成数据存放的。首先,会把文件内容写到/dev/sdb1下的日志中,然后再从日志刷到硬盘。这么做的好处是,如果突然断电,数据可以在日志中进行恢复。ext4文件系统主要用于数据较少的情况,对于现在的海量数据,使用的是xfs文件系统。Windows系统用的是ntfs文件系统,如果需要在Linux下使用Windows的文件系统,需要安装相关的软件包。
实际上,挂载就是一个映射的过程,目录/sdb1/就是一个挂载点,通过这个挂载点就可以操作对应的磁盘分区,同时,要想向磁盘分区/dev/sdb1中读写数据,也只能通过挂载点/sdb1/来操作,因为我们不能直接通过软件操作磁盘。当然,我们也可以把一个磁盘分区挂载到多个目录上,这些目录对应的磁盘分区是同一个分区(同一块磁盘空间)。
因为这些目录对应的是同一块磁盘分区,所以操作某一个目录下的数据,会导致其它目录下的数据都会发生变化
既然有挂载,那么也可以卸载,卸载命令是umount
umount /dev/sdb1 #通过分区名卸载,它会一个一个的卸载
umount /test1/
umount -l /test1/ #强制卸载
当我们卸载掉目录后,再去查看目录,可能会出现这样的情况
/opt/被卸载后再去查看目录的内容,发现内容变了,这是因为当我们向一个目录中存储一个文件的时候,首先会查看当前目录/opt/有没有对应的源设备(磁盘分区),如果有就存储到这个分区,如果没有,那么会找/opt/的上一级目录,也就是/目录有没有对应的源设备,有的话就保存在根目录对应的源设备中。也就是说,目录实际上就是一个入口,我们在目录中存取的数据都是反映在磁盘上的,我们应该透过目录去看磁盘空间。对于我们用户来说,应该把磁盘分区看作文件系统,我们操作的都是文件系统,可以使用df命令来查看(df -h)。相关命令如下:
df #查看分区使用情况
mount #查看挂载参数
du -sh /etc/ #统计etc目录下文件大小总和