一,机械硬盘的结构和工作原理简述
以下内容部分图片和文字来自知乎 @随风 的知乎回答
机械硬盘主要由盘片,磁头,盘片转轴以及控制电机,磁头控制器等几个部分组成。
磁盘由一个或多个盘片组成,每个盘片上下两面各有一个磁头,通过磁头臂控制磁头运动:
- 电机带动主轴,进而带动磁盘开始高速旋转
- 磁头与盘面保持一个微小的距离,在磁头动臂的控制下向指定位置移动
- 磁头到达指定位置,开始对磁盘进行读写操作
二,机械硬盘有关的几个基本概念
- 磁道 track:
当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。
- 扇区 sector:
磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区,每个扇区可以存放固定长度(一般是512字节)的信息,磁盘驱动器在向磁盘读取和写入数据时,以扇区为单位。(可参考上图2.1,2.2)
- 柱面 cylinder
硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的"0"号磁道开始编号,从上面的硬盘结构示意图(图2.1)我们可以看出,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。磁盘的柱面数与一个盘面上的磁道数是相等的。
- CHS
所谓硬盘的CHS,即Cylinder(柱面)、Head(磁头)、Sector(扇区),只要知道了硬盘的CHS的数目,即可确定硬盘的容量,硬盘的容量=柱面数×磁头数×扇区数×512B。
三,设备文件
一切皆文件,这是Linux的基本理念之一。在Linux中,所有的硬件包括磁盘,也都是作为文件来管理的,通常我们称呼这类文件为设备文件。
在类Unix操作系统中,设备文件是设备驱动程序的接口,允许应用程序通过标准输入/输出系统调用使用其设备驱动程序与设备进行交互。使用标准系统调用简化了许多编程任务,并且无论设备的特性和功能如何,都可以实现一致的用户空间I / O机制。
可以粗略的认为,设备文件就是关联至一个设备驱动程序,进而能够跟对应的硬件设备进行通信的文件。
Linux中的设备文件通常存放在/dev目录下,在ll /dev | grep -v "^[dsl]"
查询返回的结果中可以看到类似下图的内容
简要说明:
- 第1部分,第一个字母表示文件类型,c表示字符设备,b表示块设备。后九个字母表示文件的权限(r读,w写,x执行,-无),每三位为一组,表明文件的属主、属组和其他人的权限。
- 第2部分,数字1,表示文件的硬链次数。
- 第3部分,左边是文件的属主,右边是文件的属组。
- 第4部分,逗号分隔的两个数字,前面是文件的主设备号,后面的是文件的次设备号。
- 第5部分,文件名
设备文件主要类型
- 字符设备(Character Devices):指在I/O传输过程中,必须按照先后顺序存取数据的设备,以字符为单位进行传输。通常字符设备不使用缓冲区。例如键盘
- 块设备(Block Devices):是一种具有一定结构的随机存取设备,对这种设备的读写是以块为单位进行的。它使用缓冲区来暂时存放数据,待条件成熟后,从缓冲区一次性写入设备或从设备中一次性读出放入到缓冲区。例如硬盘
- 伪设备(Pseudo-devices):没有对应的物理设备,而是操作系统虚拟出来,用于实现某些特定功能的设备。
最常用的伪设备是 /dev/null 和 /dev/zero。
- /dev/null,也称为位桶(bit bucket),外号无底洞,黑洞。任何输出到它的数据都会被丢弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。
如果试图从它读取数据,那么永远都只会得到EOF(End Of File)信号。- 验证:
ls #用于和下方比较执行结果 ls &> /dev/null #将结果重定向到/dev/null echo $? #验证命令是否执行成功,0表示成功,其他数字表示错误码
输出到/dev/null的结果
- /dev/zero,无论从该设备读多少次,每次都会获得一个二进制数字0(即ASCII码为0的字符,在vim里显示为
^@
),因此也有人形象的称呼它泡泡机,吐零机。
而如果试图输出数据到它,也会像输出到/dev/null一样被全部丢弃。- 验证:
dd if=/dev/zero of=a.txt count=1 bs=1 #从/dev/zero复制一个字符到a.txt
从/dev/zero复制一个字符成功vi a.txt #查看a.txt的内容
vi中查看a.txt的内容
设备文件命名
- 磁盘的接口
- 并口:接口理论速率(b:bit,B:Byte)
1.1. IDE:133MB/S
1.2. SCSI:640MB/S - 串口:接口理论速率(b:bit,B:Byte)
1.3. SATA:6Gbps
1.4. SAS:6Gbps
1.5. USB:480MB/S
- 磁盘设备文件的命名
磁盘的设备文件,通常与其他设备文件一样,都存放在/dev目录下。
早期版本的CentOS下,IDE接口的磁盘设备文件,通常依次命名为/dev/hda,/dev/hdb,/dev/hdc,/dev/hdd(因为IDE接口最多接4块硬盘)
从CentOS 6.0版本开始,IDE,SCSI,SATA,SAS和USB接口的磁盘,全都以/dev/sd[a-z][1-n]的格式命名:
- 不同的设备,按照字母a-z的顺序,依次命名为 /dev/sda,/dev/sdb,/dev/sdc,……
- 同一设备上的不同分区,则在设备名后面再加上1-n的数字来区分,例如设备/dev/sdc上有3个分区,则依次命名为/dev/sdc1,/dev/sdc2,/dev/sdc3
常见引导方式
- BIOS+MBR
- UEFI+GPT
MBR(Master Boot Record),即主引导记录,也称主引导扇区。
位置:0柱面,0磁头,1扇区(clindyer 0,side 0,sector 1)
内容:主引导记录MBR(Main Boot Record)和分区表DPT(Disk Partition Table)
大小:512字节,其中
- 446Bytes:用于存放boot loader内容
- 64Bytes:用于存放分区表,每16bytes标识一个分区
- 2Bytes:结束标志,原值为AA55 ,由于内存中十六进制存储是低位在前,因此看起来是55 AA
四,分区管理工具之fdisk
Note:
- fdisk只能管理2T以内的硬盘
- 对同一块硬盘,最多只能管理15个分区
管理分区:fdisk device
fdisk命令有很多子命令,通过使用子命令完成各种功能,m显示所有子命令。
子命令中比较常用的有:
p:打印分区表,显示分区信息
n:新建分区
d:删除分区
w:写入磁盘并退出
q:放弃修改并退出
m:获取帮助
l:列出已知的分区id号及对应的分区类型
t:修改分区文件系统类型和标志id(默认值83),例如如果想创建swap分区,就需要先将分区标志id改为82
查看分区
fdisk -l [device] #[]表示选项或参数可给可不给
fdisk -l :查看分区表信息
[device]:指定想要查看分区表信息的设备,如果没有指定设备,则列出/proc/partitions文件中的设备信息
注意:fdisk -l能看到分区,并不表示内核也已经识别了该分区。可以通过查看/proc/partitions文件的内容确认,该文件包含的分区才是内核已经识别的分区。
通知内核重新读取硬盘分区表:partx命令
- 命令格式:
partx [-a|-d|-l] [--type TYPE] [--nr M-N] [partition] disk - 常用选项:
-a 添加
-d 删除
-l 显示,列出分区
--nr M-N 指定分区号码(CentOS 6.x中)
-n M:N 指定分区号码(CentOS 7.x中),有 M,M:,:N 这几种形式
-u 更新(CentOS 7.x中) - 示例
partx -a -nr 1-3 /dev/sda #CentOS 6.x
partx -a -n 4:6 /dev/sda #CentOS 7.x
注意:CentOS 6-7有以上命令,但5没有,5通过命令 partprobe实现类似功能
格式:partprobe [/dev/DEVICE]
内核能够识别的硬盘,就可以格式化,创建文件系统了。
延伸知识:kpartx命令及格式
kpartx [-a | -d | -l] [-v] wholedisk
-l device:查看磁盘分区信息
查看设备分区信息
其他较常用的分区管理工具还有:parted,sfdisk,cfdisk等,具体用法请参考man手册或搜索引擎
(未完待续)
CentOS下ext4、vfat文件系统创建、修改