> IT面试 >

详解linux硬盘分区、格式化、检验和挂载全过程和面试题整理

目录
 
一、硬盘可以被系统识别需要经历的过程
 
二、磁盘的存储结构
 
1、磁盘的存储
 
2、主引导扇区的结构
 
①MBR
 
②磁盘分区表
 
③分区结束位
 
三、硬盘分区:新建可用分区
 
1、fdisk命令解析
 
2、fdisk -l信息解析

 
 
>第一块磁盘


①sda是第一块物理硬盘,上半部是磁盘的整体状态:在初次创建该虚拟机时我分配了30G的硬盘容量,bytes、sectors、Units、Sector size等信息则是磁盘的容量相关信息;Disk identifier是磁盘标识符。Units 表示单元块数量。
 
②而下半部分的分区表则是主要列出每个分区的信息项目:Device表示设备文件名,Boot表示是否为开机引导模块,而start、end、blocks则表示了每个分区的容量(以1K-Blocks为单位)和柱面数;ID,System则表示分区内的文件系统的种类,用5表示扩展分区,83表示逻辑分区和主分区。可以看出该磁盘已无多余的柱面进行分区。
 
 
>第二块磁盘



这是新添加的磁盘,用以后续实验。
 
>LVM逻辑卷







这里涉及到LVM逻辑卷管理的内容,LVM是将多个物理分区整合在一起,让这些分区看起来像是一个磁盘还可以在将来其他的物理分区或将其从这个LVM管理的磁盘当中删除,可以更加灵活地使用物理分区。具体日后再学习这一块。
 
3、新增磁盘分区的步骤
 
>fdisk /dev/sdb:对sdb设备进行分区
 
>n sdb1






新建第一个分区
 
>n sdb4





新建第二个分区,在这里可以看到sdb2、sdb3均被省略出来
 
>n sdb2(extended)



建立逻辑分区,这一次我直接按下两次回车,系统默认创建了一个剩余容量大小的分区。
 
>d sdb2



删除 sdb2
 
 
>n sdb2(extended)



一般来说,会将所有剩余的容量全部分配给扩展扇区,因此在输入容量大小时我直接按下了回车,表明已把所有剩下的block都分配给了扩展扇区。

 
 
>n sdb3






此时已经无法添加主分区了,因为所有的sectors都已经被使用

 
 
>n sdb5







会自动分配好分区号



 
 
>执行w(write) ,分区之后要保存才会写入
 
>partprobe

分区之后、格式化之前内核无法重新取得分区表的信息。
 
需要用 partprobe命令推给内核或直接重启(一般服务器不会关机)
 
 
将磁盘分区表变化信息通知内核,请求操作系统重新加载分区表。
 
-d 不更新内核
-s 显示磁盘分区汇总信息
-h 显示帮助信息
-v 显示版本信息
 
 

 
 
4、特殊情况验证:验证一个硬盘能否划分五个分区





创建第五个分区时显示创建错误,每个磁盘最多只能创建四个分区。


 

原因可以总结为:由于磁盘的主引导记录中存放的分区表只有64bytes,而每一个分区信息16bytes,受磁盘限制我们最多只能为每个磁盘创建四个分区。

 


 
5、非交互式分区



非交互式分区的大体含义是不通过界面的操作进行分区,而是通过执行文本文件自动分区,这在自动化运维工作中非常有效。但其实两者的命令是一样的,例如:我需要使用默认者为sdb磁盘增加一个sdb6逻辑分区。
 
>touch autoTest.txt
 
>new logical 默认 默认 默认 write quite
 




>fdisk /dev/sdb < ./autoTest.txt





 
 
6、关于分区的其他知识


①分区命令:fdisk 只能对小于2T的硬盘进行分区,反之则需要使用parted指令;fdisk能看到物理硬盘,看到未挂载分区,而df -h看不到;
 
②一块磁盘的磁盘分区表为64byte;
 
③硬盘分区最小的单位为柱面
 
④硬盘氛围3个主分区和一个扩展分区。扩展分区不能直接使用,需在扩展分区基础上创建逻辑分区(扩展分区有自己的分区表)。
 
⑤分区完后格式化之前硬盘无法使用
 
⑥硬盘分区的设备名
 
第一块SCSI接口的sda
第二块SCSI接口的sdb
第一块IDE接口的hda
第二块IDE接口的hdb
/dev/vxx 虚拟硬盘
⑦SATA硬盘最多支持到15号分区,IDE最多到63号。
 
 
四、格式化:创建系统可用的文件系统
 
1、格式化的相关知识点
 
2、命令解析
 
①mkfs:make file system

 

mkfs实际上是综合命令:在使用 命令mkfs -t ext3时系统会调用mkfs.ext3这个命令,除此之外系统还可以调用的命令有cramfs,ext2,ext3,msdoc,vfat。
 
 
②mke2fs:详细指定格式化的各类参数


 
3、格式化流程
 
>mkfs -t ext3 /dev/sdb1


Filesystem label为分区名称,block size是块大小;同时还Creating journal;
 
 
 
>mke2fs -j -L "Tyson_logical" -b 2048 -i 8192 /dev/sdb5
我将第sdb5的卷标设置为Tyson_logical,制定block的大小为2K,inode的容量为8192bytes,最后还主动加入journal构建成Ext3文件系统。
 

 
 
 
4、特殊情况验证
 
①尝试直接对一个扩展分区进行格式化
 
五、检验:对文件系统进行检验
 
1、格式化的相关知识点
 
2、命令解析
 
①fsck :检验文件系统是否出错
 
②badblocks:检查硬盘或软盘扇区有无坏轨
 
3、检验流程
 
>fsck -C -f -t ext3 /dev/sdb5
 
六、挂载:创建挂载点并挂载上来
 
1、挂载和卸载的相关知识点
 
2、挂载命令解析
 
①mount
 
②umount
 
③mount --bind
 
3、挂载流程
 
>mount /dev/sdb1 /mnt/sdb1
 
>挂载目录 mount --bind /home /mnt/home
 
>卸载 umount
 
>使用卷标名进行挂载
 
4、特殊情况验证
 
①重启后系统挂载会丢失
 
七、磁盘分区方案建议
 
1、常规分区方案
 
2、DB以及存储:大量重要数据
 
3、门户大网站
 
八、问答
 
1、开启时磁盘引导的流程?
 
2、为什么Linux系统只有四个分区
 
3、df -h 和fisk -l的区别?
 
4、如何计算磁盘物理空间大小?
 
5、分区划完之后大小不能改?
 
6、为什么要进行分区?
 
7、为什么扩展分区能存多个扩展分区的信息?
 
8、为什么要格式化?
 
一、硬盘可以被系统识别需要经历的过程
>分区、格式化、检验和挂载
 
 
 
二、磁盘的存储结构
1、磁盘的存储
 
 
2、主引导扇区的结构
主引导记录+硬盘分区表+分区结束标志位
 
①MBR
参数+一段引导程序。检查分区是否正确,引导具有激活标志的分区上的操作系统,控制权交给启动程序,MBR不依赖于操作系统。双系统就是改MBR。
 
②磁盘分区表
记录分区信息:各分区的起始柱面
 
③分区结束位
 
 
三、硬盘分区:新建可用分区
1、fdisk命令解析
>fdisk -l 设备名
 
若仅有fdisk -l则查看系统所有分区(包括未挂载的)
fdisk -d删除分区
fdisk -n添加一个分区
fdisk -m 相当于--help
fdisk -p 显示分割表?
fdisk -q不存储直接离开
fdisk -w写入分区表
 
 
2、fdisk -l信息解析
>第一块磁盘
 
 
①sda是第一块物理硬盘,上半部是磁盘的整体状态:在初次创建该虚拟机时我分配了30G的硬盘容量,bytes、sectors、Units、Sector size等信息则是磁盘的容量相关信息;Disk identifier是磁盘标识符。Units 表示单元块数量。
 
②而下半部分的分区表则是主要列出每个分区的信息项目:Device表示设备文件名,Boot表示是否为开机引导模块,而start、end、blocks则表示了每个分区的容量(以1K-Blocks为单位)和柱面数;ID,System则表示分区内的文件系统的种类,用5表示扩展分区,83表示逻辑分区和主分区。可以看出该磁盘已无多余的柱面进行分区。
 
 
 
>第二块磁盘
 
 
这是新添加的磁盘,用以后续实验。
 
 
 
>LVM逻辑卷
 
 
 
 
 
 
这里涉及到LVM逻辑卷管理的内容,LVM是将多个物理分区整合在一起,让这些分区看起来像是一个磁盘还可以在将来其他的物理分区或将其从这个LVM管理的磁盘当中删除,可以更加灵活地使用物理分区。具体日后再学习这一块。
 
 
 
3、新增磁盘分区的步骤
>fdisk /dev/sdb:对sdb设备进行分区
 
 
 
 
>n sdb1
 
 
 
 
新建第一个分区
 
 
 
>n sdb4
 
 
 
 
新建第二个分区,在这里可以看到sdb2、sdb3均被省略出来
 
 
 
>n sdb2(extended)
 
 
建立逻辑分区,这一次我直接按下两次回车,系统默认创建了一个剩余容量大小的分区。
 
 
 
>d sdb2
 
 
删除 sdb2
 
 
 
>n sdb2(extended)
 
 
一般来说,会将所有剩余的容量全部分配给扩展扇区,因此在输入容量大小时我直接按下了回车,表明已把所有剩下的block都分配给了扩展扇区。
 
 
 
>n sdb3
 
 
 
 
此时已经无法添加主分区了,因为所有的sectors都已经被使用
 
 
 
>n sdb5
 
 
 
 
会自动分配好分区号
 
 
 
 
 
>执行w(write) ,分区之后要保存才会写入
>partprobe
分区之后、格式化之前内核无法重新取得分区表的信息。
 
需要用 partprobe命令推给内核或直接重启(一般服务器不会关机)
 
 
 
将磁盘分区表变化信息通知内核,请求操作系统重新加载分区表。
 
-d 不更新内核
-s 显示磁盘分区汇总信息
-h 显示帮助信息
-v 显示版本信息
 
 
4、特殊情况验证:验证一个硬盘能否划分五个分区
 
 
 
 
创建第五个分区时显示创建错误,每个磁盘最多只能创建四个分区。
 
 
 
原因可以总结为:由于磁盘的主引导记录中存放的分区表只有64bytes,而每一个分区信息16bytes,受磁盘限制我们最多只能为每个磁盘创建四个分区。
 
 
 
5、非交互式分区
非交互式分区的大体含义是不通过界面的操作进行分区,而是通过执行文本文件自动分区,这在自动化运维工作中非常有效。但其实两者的命令是一样的,例如:我需要使用默认者为sdb磁盘增加一个sdb6逻辑分区。
 
>touch autoTest.txt
 
>new logical 默认 默认 默认 write quite
 
 
 
>fdisk /dev/sdb < ./autoTest.txt
 
 
 
 
 
 
 
6、关于分区的其他知识
①分区命令:fdisk 只能对小于2T的硬盘进行分区,反之则需要使用parted指令;fdisk能看到物理硬盘,看到未挂载分区,而df -h看不到;
 
②一块磁盘的磁盘分区表为64byte;
 
③硬盘分区最小的单位为柱面
 
④硬盘氛围3个主分区和一个扩展分区。扩展分区不能直接使用,需在扩展分区基础上创建逻辑分区(扩展分区有自己的分区表)。
 
⑤分区完后格式化之前硬盘无法使用
 
⑥硬盘分区的设备名
 
第一块SCSI接口的sda
第二块SCSI接口的sdb
第一块IDE接口的hda
第二块IDE接口的hdb
/dev/vxx 虚拟硬盘
⑦SATA硬盘最多支持到15号分区,IDE最多到63号。
 
 
 
四、格式化:创建系统可用的文件系统
1、格式化的相关知识点
格式化操作是即时生效的,不需要重启linux系统,但此时用df命令仍不能看到磁盘的文件系统和类型,原因是因为还没有进行挂载。
 
 
 
2、命令解析
①mkfs:make file system
mkfs
 
-t
 
ext3
 
设备名
 
ext2
 
vfat
 
mkfs实际上是综合命令:在使用 命令mkfs -t ext3时系统会调用mkfs.ext3这个命令,除此之外系统还可以调用的命令有cramfs,ext2,ext3,msdoc,vfat。
 
 
 
②mke2fs:详细指定格式化的各类参数
mke2fs
 
 
 
mkfs -t ext3
 
-b block大小
 
-i block大小
 
-L 卷标
 
-c
 
j
 
设备
 
设置每个block的大小
 
给予inode的容量大小
 
label是卷标名称
 
检查磁盘错误
 
主动加入journal变成EXT3
 
支持1024,2048,4096bytes三种
 
 
-c:读取测试
 
-c -c:读写测试
 
 
 
 
3、格式化流程
>mkfs -t ext3 /dev/sdb1
 
 
Filesystem label为分区名称,block size是块大小;同时还Creating journal;
 
 
 
>mke2fs -j -L "Tyson_logical" -b 2048 -i 8192 /dev/sdb5
我将第sdb5的卷标设置为Tyson_logical,制定block的大小为2K,inode的容量为8192bytes,最后还主动加入journal构建成Ext3文件系统。
 
 
 
 
 
4、特殊情况验证
①尝试直接对一个扩展分区进行格式化
 
 
>mkfs -t ext4 /dev/sdb4
 
 
 
 
 
>不能直接对扩展分区进行格式化
 
inode_size(128) * inodes_count(0) too big for a filesystem with blocks, specify higher inode_ratio(-i) or lower inode count (-N).
 
扩展分区只能用来继续分逻辑分区,不能格式化。操作系统见到扩展分区后会到扩展分区的数据区读取扩展分区表(链式表,有自己的大小和下一逻辑分区的开始位置)。读取完本分区的信息后到下一个逻辑分区继续执行上述操作。若格式化扩展分区则破坏了扩展分区原来的设计导致操作系统无法读取扩展分区表(被覆盖成了格式化后的文件系统类型的自己的数据),分区表错误是严重的操作系统错误。
 
 
 
五、检验:对文件系统进行检验
1、格式化的相关知识点
①在文件系统运行时会有硬盘与内存数据异步的状况发生,我们通常使用fsck(file system check)来挽救这种错乱。
 
②通常使用这个命令的场合都出现了极大问题且需要以root的身份运行。
 
③fsck扫描硬盘时可能会造成部分文件系统的损坏,所以执行fsck时该分区不可被挂载到系统上。
 
④若检验出问题,则有问题的数据会被放在ext2/ext3文件系统最顶层的“lost+found”目录
 
 
 
2、命令解析
①fsck :检验文件系统是否出错
fsck
 
-t
 
-A
 
-a
 
-y
 
-C
 
-f
 
-D
 
设备名称
 
指定进行检验的文件系统的type:例如ext3
 
依/etc/fstab的内容扫描设备一次
 
自动修复有问题的扇区
 
自动修复有问题的扇区
 
显示进度条
 
没有unclean时强制检查、细致检查
 
针对文件系统下目录进行优化配置
 
其实现在系统都以直接读取superblock里的信息来识别
 
EXT2/EXT3的额外功能参数
 
 
 
②badblocks:检查硬盘或软盘扇区有无坏轨
badblocks
 
-s
 
-v
 
-w
 
设备名称
 
进度条
 
使用write来测试
 
不建议使用
 
 
 
3、检验流程
>fsck -C -f -t ext3 /dev/sdb5
 
 
对sdb5进行细致检验,并且列出进度条
 
 
 
 
 
六、挂载:创建挂载点并挂载上来
1、挂载和卸载的相关知识点
①挂载点就是目录,而目录是进入磁盘分区(其实是文件系统)的入口。
 
②单一文件系统不应该被重复挂载在不同的挂载点(目录)中;单一目录不可重复挂载多个文件系统;作为挂载点的目录理论上都应该为空,否则内部文件会被影藏(新分区被卸载后会再次显示)。
 
③linux可通过分析分区的super block搭配系统的驱动程序去测试挂载,若成功了则自动使用该类型的文件系统挂载起来。
 
/etc/filsystems
 
系统指定的测试挂载文件系统类型
 
需要进行③的测试
 
 
/proc/filesystems
 
Linux系统已经加载的文件类型
 
 
/lib/modules/$ (uname -r) /kernel/fs/
 
Linux支持的文件系统的驱动程序所在目录
 
 
④根目录不能够被挂载。
 
⑤若在卸载时正在使用该文件系统会报错,此时 cd / 回到根目录即可
 
 
 
2、挂载命令解析
①mount
mount:通过查看/etc/mtab文件显示当前系统已挂载的所有设备
 
命令使用格式:mount [-fnrsvw] [-t vfstype] [-o options] device dir
 
device:指明要挂载的设备;
 
(1) 设备文件:例如/dev/sda5
 
(2) 卷标:-L 'LABEL', 例如 -L 'MYDATA'
 
(3) UUID, -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
 
(4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs
 
dir:挂载点
 
    事先存在;建议使用空目录;
 
    进程正在使用中的设备无法被卸载;
 
常用命令选项:
 
    -t vsftype:指定要挂载的设备上的文件系统类型;
 
    -r: readonly,只读挂载;
 
    -w: read and write, 读写挂载;
 
    -n: 不更新/etc/mtab; 
 
    -a:自动挂载所有支持自动挂载的设备;(定义在了/etc/fstab文件中,且挂载选项中有“自动挂载”功能)
 
    -L 'LABEL': 以卷标指定挂载设备;
 
    -U 'UUID': 以UUID指定要挂载的设备;
 
    -B, --bind: 绑定目录到另一个目录上;
 
    -o options:(挂载文件系统的选项)
 
      async:异步模式;
 
      sync:同步模式;
 
      atime/noatime:包含目录和文件;
 
      diratime/nodiratime:目录的访问时间戳
 
      auto/noauto:是否支持自动挂载
 
      exec/noexec:是否支持将文件系统上应用程序运行为进程
 
      dev/nodev:是否支持在此文件系统上使用设备文件;
 
      suid/nosuid:是否支持在此文件系统上使用特殊权限
 
      remount:重新挂载
 
      ro:只读
 
      rw:读写
 
      user/nouser:是否允许普通用户挂载此设备
 
      acl:启用此文件系统上的acl功能
 
注意:上述选项可多个同时使用,彼此使用逗号分隔;
 
默认挂载选项:defaults:rw, suid, dev, exec, auto, nouser, and async
 
上述信息可以通过查看超级块信息看到,这里不再对其进行演示。
 
若进行单用户维护模式遇到根目录出现“只读”情况时,应重新挂载“/”(mount -o remount,rw,auto/)。
 
mount命令可以将目录挂载到另一个目录。(用以实现部分不支持symboliclink的程序的连接)
 
 
 
②umount
mount
 
-f
 
-n
 
设备文件名或挂载点
 
强制卸载
 
卸载
 
用在NFS无法读取到的情况
 
不更新/etc/mtab
 
 
 
③mount --bind
 
 
3、挂载流程
>mount /dev/sdb1 /mnt/sdb1
 
 
 
 
挂载后可以使用dfmount -l看到,
 
挂载软盘、U盘、CD、DVD的过程相似
 
 
 
>挂载目录 mount --bind /home /mnt/home
 
 
mount --bind 则是挂载目录
 
 
 
>卸载 umount
umount /mnt/sdb1(home)
 
 
 
 
 
使用挂载点卸载,当然也可以使用设备名卸载,但是根目录必须用挂载点来卸载。
 
 
 
>使用卷标名进行挂载
mount -L "Tyson_logical" /mnt/sdb5
 
 
 
 
 
4、特殊情况验证
①重启后系统挂载会丢失
实现自动挂载: vi /etc/fstab,添加如下内容:/dev/sdb5 /mnt ext3 defaults 0 0。再使用reboot -i重启后验证。/etc/fstab文件的作用则是用于自动挂载,详情请点此。
 
 
 
七、磁盘分区方案建议
1、常规分区方案
/boot:100M
/swap:1.5倍 物理内存的1.5呗
/:剩余硬盘大小
 
 
2、DB以及存储:大量重要数据
/boot:100M
/:50-200G
/swap:实际物理内存的1.5倍
/data/:剩余硬盘大小,用于存放数据
 
 
3、门户大网站
/boot:100M,主分区
swap:1.5倍,主分区
/:50-200G,主分区
剩下全部空间保留
 
 
八、问答
1、开启时磁盘引导的流程?
执行bios程序
服务器进行自检
bios开始引导系统
bios控制权交给硬盘
跳到MBR上的第一条指令
开始执行MBR上的程序
开始引导系统加载到内存
2、为什么Linux系统只有四个分区
分区表中一个分区信息需要16个字节。
 
3、df -h 和fisk -l的区别?
fisk -l能看到没有挂载的物理磁盘和分区,df -h只能看到已经挂载的分区。
 
4、如何计算磁盘物理空间大小?
每个柱面上的扇区数*柱面数*512bytes
 
5、分区划完之后大小不能改?
可以使用resize2fs命令调整分区大小,当然在调整时需要卸载该分区。(resizee2fs详情请点此)
 
6、为什么要进行分区?
便于管理、分区的目的是记录每一个分区的开始和结束柱面。
 
7、为什么扩展分区能存多个扩展分区的信息?
因为扩展分区的分区信息在扩展分区里面,块是磁盘最小的存储单元,块是扇区的2的n次方。
 
8、为什么要格式化?
格式化的理解:在分区上创建文件系统,那么一个分区只有使用mkfs创建文件系统了才可以使用。
 



(责任编辑:IT)