ps:期末考试 终于结束了,这下我也终于有时间开始继续经营我的博客。这个学期上的一些课真的非常有用,感觉很多课程细地讲都可以写成非常精致的技术博文,比如流水线技术,数据库的一些技术,大学里的考试考的内容“不痛不痒”真正有价值的一些内容避而不考,但是追很多有的没的的概念很鸡肋。不管如何,这个暑假给自己留了很多本官方技术书籍慢慢去看,我也会在博客里继续补充一些自己的体会和心得。
一. 关于设备在linux中的名字
附:(linux中常见设备和设备在linux中的名字的对照表)
-------------------------------------------------------------
| IDE接口硬盘 | /dev/hd[a~d] |
| SCSI/SATA/USB硬盘 | /dev/sd[a~p] |
| U盘 | /dev/sd[a~p] |
| 软驱 | /dev/fp[0~1] |
| 打印机 | /dev/lp[0~2] |
| 鼠标 | /dev/usb/mouse[0~15] |
| | 或者 /dev/psaux |
| 当前CD ROM | /dev/cdrom |
| 当前鼠标 | /dev/mouse |
--------------------------------------------------------------
虽说使用linux的fedora distribution有快一年多的时间了,但是其实有很多细节的知识都没有仔细去思考了解,比如硬件设备在linux的/dev目录下的一些命名规则。
首先看看和我们接触最多的硬盘:
现在主流的硬盘按照接口可以分类为两种: IDE接口和SATA接口,其中IDE接口类型的硬盘几乎大部分现在已经被淘汰了,SATA接口比较浅显的一个特征是由两个接口槽组成分别是信号接口和电源接口,每个SATA接口只可以连接一个硬盘,主板上的SATA接口的个数并不是固定的,随着厂商的设定而改变。另外一种硬盘的传输接口为SCSI接口,比较常见于工作站以上的等级的计算机中,SCSI接口硬盘在控制器上含有一块处理器,运行速度快而且不会消耗CPU资源。
对于IDE接口硬盘:
一个IDE扁平电缆可以连接两个IDE设备,这个两个电缆接口分别被称为IDE1(primary)和IDE2(secondary),而每条扁平电缆上面的两个设备分别被叫做Master设备和Slave设备,因此有如下名称对应表:
---------------------------------------------------
| IDE1--Master | /dev/hda |
| IDE1--Slave | /dev/hdb |
| IDE2--Master | /dev/hdc |
| IDE2--Slave | /dev/hdd |
---------------------------------------------------
对于SATA接口硬盘:
由于主板上的SATA接口数量不一致,SATA设备在linux中的命名往往是”先来后到“关系,假如一个主板上有10个SATA接口且SATA0号接口槽和3号接口槽上分别有一个设备并且还有一个USB设备,则命名则为SATA0-->/dev/sda,SATA3-->/dev/sdb,U盘-->/dev/sdc,这里的U盘之所以排在后面是因为BIOS程序往往最后识别USB线上的设备,而且大多数的U盘都是在开机完成之后再插入的所以往往就命名最靠后。
以上为止的硬盘命名都是在为对其进行过分区的前提之下进行的,就是所谓的”一张大饼“没有被切开,在介入分区后的设备命名之前,先了解下关于硬盘分区及系统开机过程的一些知识。
二. 磁盘的分区和系统启动简述
这里所说的硬盘是指传统的由盘片,机械手臂,主轴马达构成的磁盘,我的笔记本上的硬盘的规格就是这个样子5400转/秒,磁盘的构成的具体知识这里不赘述了,对于硬盘来讲在磁道的第一个扇区是非常重要的,它记录了关于磁盘的两个非常重要的信息:
(1)主引导分区(Master Boot Record)安装引导加载程序的地方。占用446B
(2)分区表(Partition Table)记录硬盘分区状态。占用64B
首先看一下分区表:
所谓对磁盘进行的分区有三个比较重要的概念:
(1)主分区(Primary)
(2)扩展分区(Extended)
(3)逻辑分区(Logical)
最直观意义上的磁盘分区就是主分区,主分区就是直接在64B的分区表中记录下来4组分区的情况,由于64B的限制,硬盘默认的分区表最多只可以容纳4组分区信息,那么最直接的假设就是当我们把一个硬盘直接分区为4个主分区时候的命名情况对照表如下所示(假设使用的硬盘为SATA接口类型):
-------------------------------------------------
| 主分区1 | /dev/sda1 |
| 主分区2 | /dev/sda2 |
| 主分区3 | /dev/sda3 |
| 主分区4 | /dev/sda4 |
-------------------------------------------------
其中分区的最小单位为 柱面(cylinder)
然而在实际中我们使用的硬盘却会分区为大于4个甚至10个以上的分区,这里是如何实现的呢?其实使用的就是扩展分区的功能,扩展分区在这里更像是一个广义表,里面记录了更下一级的分区情况,这就是逻辑分区。如下图所示:
那么对上图来讲在linux中的命名对照表如下所示:
---------------------------------------------------------------------------------
| 主分区1 | /dev/sda1 |
| 扩展分区--------D | /dev/sda5 |
| --------E | /dev/sda6 |
| --------F | /dev/sda7 |
---------------------------------------------------------------------------------
这里要注意逻辑分区的数标命名是从5开始的,因为1~4的命名只能留给主分区/扩展分区使用,除了以上的概念之外有几点需要注意:
1.对于一块硬盘只能有0~1个扩展分区,可以有1~3个主分区,也就是说 |主分区|+|扩展分区|<=4
2.能够作为数据进行访问的分区只有主分区和逻辑分区,扩展分区无法格式化!
3.linux中IDE硬盘最多有59个逻辑分区,SATA硬盘最多有11个逻辑分区
4.所谓的分区过程只是在对分区表内的那64B内容进行修改。
接下来通过第一个扇区中MBR(Master Boot Record)看一下计算机启动的主要过程:
1.系统加点自检,通过CMOS和BIOS主动执行开机。CMOS主要存储有关开机启动的一些参数,BIOS的功能这里就不赘述啦。
2.通过MBR执行bootloader程序,bootloader提供不同的开机选项,载入内核文件或者将引导加载功能转交给其他的loader负责。
(以下是随便唠叨两句,若已经了解推荐跳过)
既然说到了loader的转交,就不得不提多操作系统的实现,当今最主流的多操系统引导程序莫过于grub,grub就是被写进了mbr中的,正常的操作系统启动比如windows启动的时候,在mbr中的引导程序执行的时候会直接把计算机的控制权交给windows内核,然而grub在这里做的事情就是实现了一个”菜单“,不同的选项会把产生分支引导不同的操作系统引导程序,这些引导程序是卸载不同的分区之中的,每个分区都会有一个启动扇区,其功能和MBR一致。引导程序只认识在自己分区内的内核文件,这样一来就是实现了操作系统之间的隔离,但是由于是在同一个硬盘之中的不同分区完成的,所以分区情况对于用户还是不透明的,比如你可以在linux上明显看到windows内核文件所在的分区(嗯,打不开!)
三. linux文件系统和磁盘分区
(对于linux文件系统架构原理没有初步了解的朋友,请看我之前的博文:http://www.cnblogs.com/guguli/p/4556445.html )
首先,还是那句老话,linux下的一切设备都是以文件形式进行管理,这个形式归功于linux的虚文件系统VFS对功能模块进行的分离做到的。然而linux中的文件都是以树结构进行管理的,这种向下分支的结构和磁盘的分区有着很大的联系:
在VFS的管理下,同一个磁盘的不同分区或者不同的磁盘之间的关系都是一致的,都是文件系统中的节点。假设我们的SATA硬盘被分为了两个主分区sda1和sda2,在抽象为vfsmount完成了像文件系统目录的挂载之中,假设sda1被挂载到了“/”根目录,sda2被挂载到了“/test”目录,那么比如我对/test/file1进行的读写操作自然就会被写入磁盘的第二个主分区,过程细化来讲就是:首先从file1文件的目录向上回溯,依次看各个目录节点是否是文件系统的挂载点(参见super_block结构体),这里向上回溯到/test目录发现这是一个挂载点,然后找到原来这是sda硬盘的第二个主分区,再通过sda硬盘的第一个扇区中的分区表找到属于第二个主分区的柱面范围,然后按地址进行读写。