Lunix主机规划与磁盘分区
1 Lunix的主机规划
1.1 Lunix与硬件的搭配
在 Linux 系统中,每个装置都被当成一个文件来对待,因此,每个硬件装置都有一个对应的文件夹。举例来说,IDE 驱动器接口的硬盘的文件名即为/dev/sd[a-d],其中,括号内的字母为a-d当中的任意一个,亦即有/dev/sda, /dev/sdb, /dev/sdc, 及 /dev/sdd 这四个文件的意思,且几乎所有的硬件装置文件都在/dev 这个目录内。
以下为常见装置在Lunix当中的对应文档名
装置 | 装置在 Linux 内的文件名 |
SCSI/SATA/USB 硬盘机 | /dev/sd[a-p] |
USB 快闪碟 | /dev/sd[a-p] (与 SATA 相同) |
VirtI/O 界面 | /dev/vd[a-p] (用于虚拟机内) |
软盘驱动器 | /dev/fd[0-7] |
打印机 | /dev/lp[0-2] (25 针打印机) /dev/usb/lp[0-15] (USB 界面) |
鼠标 | /dev/input/mouse[0-15] (通用) /dev/psaux (PS/2 界面) /dev/mouse (当前鼠标) |
CDROM/DVDROM | /dev/ht0 (IDE 界面) /dev/st0 (SATA/SCSI 界面) /dev/tape (当前磁带) |
IDE 硬盘机 | /dev/hd[a-d] (旧式系统才有) |
2 磁盘分区
2.1 为什么要给磁盘分区
1 数据的安全性
分区后各槽之间数据互不影响,如给C盘重装系统,不影响D盘中的数据资料。
2 系统的效能考虑
缩小磁盘的读取范围。
2.2 如何分区
2.21 硬盘的组成
在分析如何给磁盘分区之前,我们在回顾下硬盘的组成 。
硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。
下图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区(图践绿色部分)。扇区是磁盘的最小组成单元,通常是512字节。(由于不断提高磁盘的大小,部分厂商设定每个扇区的大小是4096字节)
2.22 分区
是否每个扇区都一样重要呢?其实整颗磁盘的第一个扇区特别的重要,因为他记录了整颗磁盘的重要信息! 早期磁盘第一个扇区里面含有的重要信息我们称为 MBR (Master Boot Record) 格式,但是由于近年来磁盘的容量不断扩大,造成读写上的一些困扰, 甚至有些大于 2TB 以上的磁盘分区已经让某些操作系统无法存取(Windows 2000/XP 32位不能支持 2TB 以上的网络存贮硬盘,因为这些硬盘是通过网络间接存取的。)。因此后来又多了一个新的磁盘分区格式,称为 GPT (GUID partition table)!
参考对照磁柱或扇区号码的方式来记录分区,相应信息记录在分区表上,因此这两种方式对应两种不同格式的分区表, MSDOS(MBR) 与 GPT 磁盘分区表(partition table)。
MSDOS (MBR) 分区表格式与限制:
早期的 Linux 系统为了兼容于 Windows 的磁盘,因此使用的是支持 Windows 的 MBR(Master Boot Record, 主要开机纪录区) 的方式来处理开机管理程序与分区表!而开机管理程序纪录区与分区表则通通放在磁盘的第一个扇区,这个扇区通常是 512bytes 的大小。
主要启动记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有 446 bytes
分区表(partition table):记录整颗硬盘分区的状态,有 64 bytes
由于分区表就只有 64 bytes 而已,最多只能容纳四笔分区的记录。64个字节(1BEH~1FDH)来描述分区,在这64字节中,描述一个分区的属性需要16个字节。这四个分区的记录被称为主要(Primary)或延伸(Extended)分区槽。PE!
GUID partition table, GPT 磁盘分区表:
因为过去一个扇区大小就是 512bytes 而已,不过目前已经有 4K 的扇区设计出现!为了兼容于所有的磁盘,因此在扇区的定义上面, 大多会使用所谓的逻辑区块地址(Logical Block Address, LBA)来处理。GPT 将磁盘所有区块以此 LBA(预设为512bytes) 来规划,而第一个 LBA 称为 LBA0 (从0 开始编号)。
与 MBR 仅使用第一个 512bytes 区块来纪录不同, GPT 使用了 34 个 LBA 区块来纪录分区信息!同时与过去 MBR 仅有一的区块不同, GPT 除了前面 34 个 LBA 之外,整个磁盘的最后 33 个 LBA 也拿来作为另一个备份!
2.3 开机流程中的 BIOS 与 UEFI 开机检测程序
计算机是如何读取硬盘内的操作系统文件的呢?当然是依靠开机程序。基本上,目前的主机系统在加载硬件驱动方面的程序,主要有早期的 BIOS 与新的 UEFI 两种机制。
2.31 BIOS 搭配 MBR/GPT 的开机流程
在计算器概论里面我们有谈到那个可爱的 BIOS 与 CMOS 两个东西, CMOS 是记录各项硬件参数且嵌入在主板上面的储存器,BIOS 则是一个写入到主板上的一个韧体(再次说明, 韧体就是写入到硬件上的一个软件程序)。这个 BIOS 就是在开机的时候,计算机系统会主动执行的第一个程序了!
接下来 BIOS 会去分析计算机里面有哪些储存设备,我们以硬盘为例,BIOS 会依据使用者的设定去取得能够开机的硬盘,并且到该硬盘里面去读取第一个扇区的 MBR 位置。MBR 这个仅有 446 bytes的硬盘容量里面会放置最基本的开机管理程序, 此时 BIOS 就功成圆满,而接下来就是 MBR 内的开机管理程序的工作了。
这个开机管理程序的目的是在加载(load)核心文件, 由于开机管理程序是操作系统在安装的时候所提供的,所以他会认识硬盘内的文件系统格式,因此就能够读取核心文件。
简而言之:
1 . BIOS:开机主动执行的韧体,会认识第一个可开机的装置;
2. MBR:第一个可开机装置的第一个扇区内的主要启动记录区块,内含开机管理程序;
3. 开机管理程序(boot loader):一支可读取核心文件来执行的软件;
4. 核心文件:开始操作系统的功能...
BIOS 与 MBR 都是硬件本身会支持的功能,至于 Boot loader 则是操作系统安装在 MBR 上面的一套软件了。由于 MBR 仅有 446 bytes 而已,因此这个开机管理程序是非常小而美的。 这个 boot loader 的主要任务有底下这些项目:
1. 提供选单:用户可以选择不同的开机项目,这也是多重引导的重要功能!
2. 载入核心文件:直接指向可开机的程序区段来开始操作系统;
3. 转交其他 loader:将开机管理功能转交给其他 loader 负责。
2.32 UEFI BIOS 搭配 GPT 开机的流程
我们现在知道 GPT 可以提供到 64bit 的寻址,然后也能够使用较大的区块来处理开机管理程序。但是 BIOS 需要要透过 GPT 提供兼容模式才能够读写这个磁盘装置~而且 BIOS 仅为 16 位的程序,在与现阶段新的操作系统接轨方面有点弱掉了! 为了解决这个问题,因此就有了 UEFI (Unified Extensible Firmware Interface) 这个统一可延伸韧体界面的产生。
UEFI 主要是想要取代 BIOS 这个韧体界面,因此我们也称 UEFI 为 UEFI BIOS 就是了。UEFI 使用 C 程序语言,比起使用汇编语言的传统 BIOS 要更容易开发!也因为使用 C 语言来撰写,因此如果开发者够厉害,甚至可以在 UEFI 开机阶段就让该系统了解 TCP/IP 而直接上网! 根本不需要进入操作系统!这让小型系统的开发充满各式各样的可能性!
2.33 传统 BIOS 与 UEFI 的差异
比较项目 | 传统 BIOS | UEFI |
使用程序语言 | 汇编语言 | C 语言 |
硬件资源控制 | 使用中断 (IRQ) 管理 不可变的内存存取 不可变的输入/输出存取 |
使用驱动程序与协议 |
处理器运作环境 | 16 位 | CPU 保护模式 |
扩充方式 | 透过 IRQ 连结 | 直接加载驱动程序 |
第三方厂商支持 | 较差 | 较差 较佳且可支持多平台 |
图形化能力 | 较差 | 较佳 |
内建简化操作系统前环境 | 不支持 | 支持 |
2.4 Linux 安装模式下,磁盘分区的选择
Linux 内的所有数据都是以文件的形态来呈现的,整个 Linux 系统最重要的地方就是在于目录树架构。 所谓的目录树架构(directory tree)就是以根目录为主,然后向下呈现分支状的目录结构的一种文件架构。
但是我们的文件数据其实是放置在磁盘分区槽当中的,现在的问题是『如何结合目录树的架构与磁盘内的数据』呢? 这个时候就需要到『挂载(mount)』。
2.41 文件系统与目录树的关系(挂载)
所谓的『挂载』就是利用一个目录当成进入点,将磁盘分区槽的数据放置在该目录下; 也就是说,进入该目录就可以读取该分区槽的意思。这个动作我们称为『挂载』,那个进入点的目录我们称为『挂载点』。 由于整个 Linux 系统最重要的是根目录,因此根目录一定需要挂载到某个分区槽的。 至于其他的目录则可依用户自己的需求来给予挂载到不同的分区槽。我们以下图来作为一个说明:
上图中假设我的硬盘分为两槽,partition 1 是挂载到根目录,至于 partition 2 则是挂载到/home 这个目录。 这也就是说,当我的数据放置在/home 内的各次目录时,数据是放置到 partition 2 的,如果不是放在/home 底下的目录, 那么数据就会被放置到 partition 1 了!