对应书上第三章

硬件装置在Linux中的名称

括号中的东西默认从小到大,根据探测磁盘顺序给予编号

装置 文件名
SCSI / SATA / USB /dev/sd[a-p]
Virt I/O (虚拟磁盘) /dev/vd[a-p]
打印机 /dev/lp[0-2] (串口打印机)
/dev/usb/lp[0-15] (USB打印机)
鼠标 /dev/input/mouse[0-15]
CDROM / DVDROM /dev/scd[0-1] (通用)
/dev/sr[0-1] (通用,centos比较常见)
磁带机 /dev/ht0 (IDE界面)
/dev/st[0-15] (SATA / SCSI 磁带)

磁盘分区

回忆与延伸

在之前的计算机概论中说了磁盘的组成,在磁盘盘面上有扇区(sector)和磁道(track)两种单位,扇区一般使用512Bytes或4Kbytes。

那么是否每个扇区是否一样重要呢?不是哦@@@@

整个磁盘的第一个扇区非常重要,记录了磁盘的重要信息。

在早期的磁盘的第一个扇区里面存储的信息我们将其称作为MBR(Master Boot Record)格式,MBR分区格式不支持2tb以上磁盘。后来的磁盘的分区格式改成了GPT(GUID partition table),支持2tb以上磁盘。

MBR分区表

早期的Linux为了兼容Windows磁盘,使用了支持Windows的MBR方法来处理开机管理程序和分区表。开机管理程序和分区表被放在第一个扇区即最大512bytes(旧时)。

其中:

  • MBR程序,446Bytes
  • 分区表,64Bytes

64Bytes。。能干啥?所以最多仅能有4组记录区,每组记录区记录了该区域的起始与结束磁柱号码。

总结一下,这么几个重要信息:

  • 分区只是对那64Bytes的分区表重新设置而已
  • 默认的分区表只能写入4组分区信息
  • 4组分区信息分为主要分区或延伸分区槽
  • 分区槽的最小单位一般为磁柱大小
  • 系统写入磁盘的时候要参考分区表

为什么要分区呢?

  • 数据的安全性
  • 系统效能的考虑,减少索引时间

主要分区可以被激活成为系统引导分区,拓展分区槽可以被继续划分为逻辑分区,不能被引导,理论无限逻辑分区。Linux限制64个,逻辑分区从sd[a-p]5开始。

为什么会限制到2tb呢?

MBR整套程序的地址只能支持32bit地址,总共的容量那就是2^32,即2TB。

为什么支持支32bit地址呢?

446Bytes大小的程序能处理32bit已经不容易了。

反正就是,如果用P表示主分区的数量,E表示拓展分区槽的数量,那么:

P+E <= 4

即可

上面说分区带来的优势具体的实际引用是什么呢?

加速BIOS的系统引导过程

如果一个硬盘太大怎么办? 通过Linux kernel创建虚拟磁盘,分割为多个2TB硬盘。

疯了吧。。然后就创造出了GPT

还有如果有人告诉你第一个扇区坏了硬盘数据就没了,请你一刀子捅死他,不会屏蔽扇区后重建么?说上面那句话的人有点不负责哦。在重建后赶紧备份数据换盘!

GPT分区表

GPT使用了34个LBA(逻辑区块地址,Logical Block Address),默认大小为512Bytes(为了兼容老硬件)。简单的来说,GPT使用了34个512Bytes来保存数据。同时也会调用磁盘最后的33个LBA来备份。

在磁盘的LBA0扇区中放置了类似MBR的基础开机程序,存储了第一阶段的开机管理程序。被称作为MBR相容区块 (Protective MBR)

在LBA1扇区中记录了分区表本身的位置和大小,记录了备份用的GPT分区(最后33个LBA区块的位置),同时放置了分区表的校验机制码(CRC32),操作系统可以通过这个来判断磁盘的分区表是否正常,是否需要给根据尾部的LBA来恢复磁盘等等。我们把LBA 1其称作为 Primary GPT Header ;尾部的LBA -1(最后一个LBA)称作为 Secondary GPT Header

从LBA2一直到LBA33被称作为实际记录分区信息处,从LBA2区块开始,每个LBA都可以记录4笔分区记录,默认情况下可以有 4*32 = 18 笔分区记录。同时提供64bit来记录扇区编号,所以最大容量就是2^64 * 512bytes(扇区大小) = 2^33 TB = 8ZB

1 ZB = 2^30 TB

比较奇怪的事情,grub1是不支持gpt的,需要grub2以上。

BIOS和UEFI与引导

可爱的BIOS和CMOS

计算机这个东西没有执行的软件的软件是没有用的,除了电人…

在主板上面有个芯片叫做CMOS,是机器启动时最先读取到的东西(程序),里面存的东西之前叫BIOS,后来叫UEFI

BIOS的主要工作是负责分析计算机有哪些硬件,判断哪个是启动磁盘并跳到系统的启动位置上。

那么开机的过程是这样的:

  • BIOS
  • MBR管理软件
  • 系统的引导
  • 系统核心

如果分区表为GPT也是可以被BIOS引导的哦,这就是LBA0的作用了。换句话说,BIOS其实并不支持GPT。。。。

那么就推出了UEFI(Unified Extensible Firmware Interface),使用C语言开发所以可以实现所有你能想到的东西(BIOS是拿汇编写的)。提供64bit寻址,且可以根据CPU情况选择处理器运作环境。如下是其核心对比:

项目 传统BIOS UEFI
程序语言 汇编语言 C语言
硬件资源控制 使用中断(IRQ)管理 使用驱动程序与协议
不可变的内存存取
不可变的输入/输出存取
处理器扩充方式 16位 CPU保护模式
扩充方式 透过IRQ链接 直接加载驱动程序
第三方厂商支持 较差 良好且支持跨平台
图形化能力 较差 良好
内建简化操作系统前的环境 不支持 支持

并且,UEFI可以做加密,避免在CMOS这一层被破坏。

Linux文件系统

树形,通过挂载的方法连接其他的东西

mount [-t 文件系统] [-o 特殊选项] 设备文件名 挂载地址

挂在地址需要提前mkdir

卸载命令

unmount 设备文件名

一般情况下我们把挂载的东西挂载到/mnt/(设备种类)/(设备编号)这个目录下

然后可以通过这句话查看所有已经连接的驱动器

fdisk -l