Linux 中的硬件名称与磁盘特性

硬件设备在Linux系统上角色

在Linux系统中,每个设备都被当成一个文件来对待。

  1. SATA接口的硬盘的文件名称即为/dev/sd[a-d],其中,括号内的字母为a-d当中的任意一个,即有/dev/sda, /dev/sdb, /dev/sdc,及/dev/sdd这四个文件夹的意思。
  2. 在Linux这个系统当中,几乎所有的硬件设备文件都在/dev这个目录内,所以会看到/dev/sda, /dev/sr0等文件名。

常见的硬件文件名

设备 设备在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/scd[0-1] (通用) /dev/sr[0-1] (通用,CentOS 较常见)/dev/cdrom (当前 CDROM)
磁带机 /dev/ht0 (IDE 界面) /dev/st0 (SATA/SCSI界面) /dev/tape(当前磁带)
IDE硬盘机 /dev/hd[a-d] (旧式系统才有)

磁盘分区

盘片上面又可细分出扇区(Sector)与磁道(Track)两种单位,其中扇区的物理量设计有两种大小,分别是 512Bytes 与 4KBytes。假设磁盘只有一个盘片,那么盘片有点像下面这样:

磁盘分区

磁盘的第一个扇区特别的重要,因为他记录了整颗磁盘的重要信息!早期磁盘第一个扇区里面含有的重要信息我们称为MBR (Master Boot Record 主引导记录)。

MSDOS(MBR)

MSDOS (MBR)分区表格式

早期的 Linux 系统为了相容于 Windows 的磁盘,因此使用的是支持 Windows 的MBR(Master Boot Record, 主要开机纪录区)的方式来处理开机管理程序与分区表!而开机管理程序纪录区与分区表则通通放在磁盘的第一个扇区,这个扇区通常是 512Bytes 的大小(旧的磁盘扇区都是 512Bytes 喔!),所以说,第一个扇区 512Bytes 会有这两个数据:

  • 主要开机记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有446Bytes
  • 分区表(partition table):记录整颗硬盘分区的状态,有64 Bytes由于分区表所在区块仅有64 Bytes容量,因此最多仅能有组记录区
    最后2Bytes“55,AA”是分区的结束标志。这个整体构成了硬盘的主引导扇区。

分区表)中,这四个分区的记录被称为主要(Primary)或延伸(Extended)分区。

分区表由4项组成,每项16个字节(Byte).共4×16 = 64字节(Byte)。每项描述一个分区的基本信息。(80) (01 01 00) (07) (FE FF FF) (3F 00 00 00) (82 C1 3B 3A)

存贮字节位 内容及含义
第1字节 引导标志。若值为80H表示活动分区,若值为00H表示非活动分区。
第2、3、4字节 本分区的起始磁头号、扇区号、柱面号。其中:
磁头号——第2字节;
扇区号——第3字节的低6位;
柱面号——为第3字节高2位+第4字节8位。
第5字节 分区类型符。
00H——表示该分区未用(即没有指定);
06H——FAT16基本分区;
0BH——FAT32基本分区;
05H——扩展分区;
07H——NTFS分区;
0FH——(LBA模式)扩展分区(83H为Linux分区等)。
第6、7、8字节 本分区的结束磁头号、扇区号、柱面号。其中:
磁头号——第6字节;
扇区号——第7字节的低6位;
柱面号——第7字节的高2位+第8字节。
第9、10、11、12字节 逻辑起始扇区号 ,本分区之前已用了的扇区数。
第13、14、15、16字节 本分区的总扇区数。

案例解释
(80) (01 01 00) (07) (FE FF FF) (3F 00 00 00) (82 C1 3B 3A)
(80): 代表这个分区(C盘)为活动分区(其他为扩展分区)。即系统会从C盘启动。
(01 01 00) :表示这个分区(C盘)的起始扇区为(0柱面,1磁头,1扇区)。
(07):表示这个分区的文件系统为NTFS。
(FE FF FF):磁头号:254; 扇区号:(11 1111)2=(63)10; 柱面号:(11 1111 1111)2=(1023)10
故该分区(C盘)结束扇区为(1023柱面,254磁头,63扇区)。
(3F 00 00 00) : 反向,(00 00 00 3F) 16 = (63) 10,为该分区(C盘)起始逻辑扇区号与逻辑0扇区号之差。表示该分区(C盘)前面已有63个扇区,这63个扇区为系统隐藏扇区。
(82 C1 3B 3A) : 反向,(3A 3B C1 82)16=(976994690)10。表明该分区(C盘)有976994690个扇区。即(0柱面,1磁头,1扇区)至(1023柱面,254磁头,63扇区)共有976994690个扇区。
1个扇区512字节,所以该分区(C盘)大小为976994690/2/1024/1024=465G

MSDOS (MBR)分区构成

通常磁盘可能有多个盘片,所有盘片的同一个磁道我们称为柱面(Cylinder),通常那是文件系统的最小单位,也就是分区的最小单位。

MSDOS (MBR)分区表在Linux系统中分区编号

若将硬盘以长条形来看,然后将柱面以直条图来看,那么那64Bytes的记录区段有点像下面的图示:

假设上面的硬盘设备文件名为/dev/sda时,那么这四个分区在Linux系统中的设备文件名如下所示,重点在于文件名后面会再接一个数字,这个数字与该分区所在的位置有关.
P1:/dev/sda1
P2:/dev/sda2
P3:/dev/sda3
P4:/dev/sda4

既然分区表只有记录四组数据的空间,那么是否代表我一颗硬盘最多只能分区出四个分区?当然不是啦!有经验的朋友都知道,你可以将一颗硬盘分区成十个以上的分区的!那又是如何达到的呢?在Windows/Linux系统中,我们是通过刚刚谈到的延伸分区(Extended)的方式来处理。延伸分区的想法是:既然第一个扇区所在的分区表只能记录四笔数据,那我可否利用额外的扇区来记录更多的分区信息?实际上图示有点像下面这样:

实际上延伸分区并不是只占一个区块,而是会分佈在每个分区的最前面几个扇区来记载分区信息的!
在上图当中,我们知道硬盘的四个分区记录区仅使用到两个,P1为主要分区,而P2则为延伸分区。请注意,延伸分区的目的是使用额外的扇区来记录分区信息,延伸分区本身并不能被拿来格式化。然后我们可以通过延伸分区所指向的那个区块继续作分区的记录。如上图右下方那个区块有继续分区出五个分区,这五个由延伸分区继续切出来的分区,就被称为逻辑分区(logical partition)。
同时注意一下,由于逻辑分区是由延伸分区继续分区出来的,所以他可以使用的柱面范围就是延伸分区所设置的范围。也就是图中的101~400。同样的,上述的分区在Linux系统中的设备文件名分别如下:
P1:/dev/sda1
P2:/dev/sda2
L1:/dev/sda5
L2:/dev/sda6
L3:/dev/sda7
L4:/dev/sda8
L5:/dev/sda9

仔细看看,怎么设备文件名没有/dev/sda3与/dev/sda4呢?因为前面四个号码都是保留给Primary或Extended用的。所以逻辑分区的设备名称号码就由5号开始了!这在 MBR 方式的分区表中是个很重要的特性。

MBR 主要分区、延伸分区与逻辑分区的特性我们作个简单的定义啰:

  • 主要分区与延伸分区最多可以有四笔(硬盘的限制)
  • 延伸分区最多只能有一个(操作系统的限制)
  • 逻辑分区是由延伸分区持续切割出来的分区
  • 能够被格式化后,作为数据存取的分区为主要分区与逻辑分区。延伸分区无法格式化
  • 逻辑分区的数量依操作系统而不同,在Linux系统中SATA硬盘已经可以突破63个以上的分区限制

MSDOS (MBR)分区表的限制

MBR 分区表除了上述的主分区、延伸分区、逻辑分区需要注意之外,由于每组分区表仅有16Bytes 而已,因此可纪录的信息真的是相当有限的!所以,在过去 MBR 分区表的限制中经常可以发现如下的问题:

  • 操作系统无法抓取到 2.2T 以上的磁盘容量!(第13、14、15、16字节,4字节记录扇区最大容量)
  • MBR 仅有一个区块,若被破坏后,经常无法或很难救援。
  • MBR 内的存放开机管理程序的区块仅 446Bytes,无法容纳较多的程序码。

GPT 磁盘分区表(partition table)

GPT使用了34个LBA 区块来纪录分区信息!同时与过去MBR仅有一个区块不同,GPT 除了前面34个LBA之外,整个磁盘的最后33 个LBA 也拿来作为另一个备份!详细的结构有点像下面的模样。

  • LBA0 (MBR 相容区块)
    与 MBR 模式相似的,这个相容区块也分为两个部份,一个就是跟之前 446 Bytes 相似的区块,储存了第一阶段的开机管理程序!而在原本的分区表的纪录区内,这个相容模式仅放入一个特殊标志的分区,用来表示此磁盘为 GPT 格式。而不懂 GPT 分区表的磁盘管理程序,就不会认识这颗磁盘,除非用户有特别要求要处理这颗磁盘,否则该管理软件不能修改此分区信息,进一步保护了此磁盘。
  • LBA1 (GPT 表头纪录)
    这个部份纪录了分区表本身的位置与大小,同时纪录了备份用的 GPT 分区(就是前面谈到的在最后 34 个 LBA 区块)放置的位置,同时放置了分区表的检验机制码(CRC32),操作系统可以根据这个检验码来判断 GPT 是否正确。若有错误,还可以通过这个纪录区来取得备份的 GPT(磁盘最后的那个备份区块)来恢复 GPT 的正常运行!
  • LBA2-33 (实际纪录分区信息处)
    从 LBA2 区块开始,每个 LBA 都可以纪录 4 笔分区纪录,所以在默认的情况下,总共可以有 4*32 = 128 笔分区纪录喔!因为每个 LBA 有 512Bytes,因此每笔纪录用到 128Bytes 的空间,除了每笔纪录所需要的识别码与相关的纪录之外,GPT 在每笔纪录中分别提供了 64bits 来记载开始/结束的扇区号码。
    并不是所有的操作系统都可以读取到 GPT 的磁盘分区格式。同时,也不是所有的硬件都可以支持 GPT 格式。是否能够读写 GPT 格式又与开机的检测程序有关!那开机的检测程序又分成啥鬼东西呢?就是 BIOS 与 UEFI 。

开机流程中的 BIOS 与 UEFI 开机检测程序

BIOS 搭配 MBR/GPT 的开机流程

简单的说,整个开机流程到操作系统之前的动作应该是这样的:

  1. BIOS:开机主动执行的固件,会认识第一个可开机的设备;
  2. MBR:第一个可开机设备的第一个扇区内的主要开机记录区块,内含开机管理程序;
  3. 开机管理程序(boot loader):一支可读取核心文件来执行的软件;
  4. 核心文件:开始操作系统的功能...

由于MBR仅有446 Bytes而已,因此这个开机管理程序是非常小而美的。这个boot loader的主要任务有下面这些项目:

  1. 提供菜单:使用者可以选择不同的开机项目,这也是多重开机的重要功能!
  2. 载入核心文件:直接指向可开机的程序区段来开始操作系统;
  3. 转交其他loader:将开机管理功能转交给其他loader负责。

多重开机

boot loader任务第三点比较有趣,表示你的计算机系统里面可能具有两个以上的开机管理程序。我们的硬盘不是只有一个MBR而已?但是开机管理程序除了可以安装在MBR之外,还可以安装在每个分区的开机扇区(boot sector)。这个特色才能造就“多重开机”的功能啊!

在上图中我们可以发现,MBR的开机管理程序提供两个菜单,菜单一(M1)可以直接载入Windows的核心文件来开机;菜单二(M2)则是将开机管理工作交给第二个分区的开机扇区(boot sector)。当使用者在开机的时候选择菜单二时,那么整个开机管理工作就会交给第二分区的开机管理程序了。当第二个开机管理程序启动后,该开机管理程序内(上图中)仅有一个开机菜单,因此就能够使用Linux的核心文件来开机啰。这就是多重开机的工作情况啦!我们将上图作个总结:

  1. 每个分区都拥有自己的开机扇区(boot sector)
  2. 图中的系统盘为第一及第二分区
  3. 实际可开机的核心文件是放置到各分区内的!
  4. loader只会认识自己的系统盘内的可开机核心文件,以及其他loader而已;
  5. loader可直接指向或者是间接将管理权转交给另一个管理程序

UEFI BIOS 搭配 GPT 开机的流程

GPT 可以提供到 64bit 的寻址,也能够使用较大的区块来处理开机管理程序。但是 BIOS 其实不懂 GPT ,还得要通过 GPT 提供相容模式才能够读写这个磁盘设备,而且 BIOS 仅为 16 位的程序,在与现阶段新的操作系统接轨方面有点弱。为了解决这个问题,因此就有了 UEFI (Unified Extensible Firmware Interface)这个统一可延伸固件界面的产生。
UEFI 主要是想要取代 BIOS 这个固件界面,因此我们也称 UEFI 为 UEFI BIOS 就是了。UEFI 使用 C 程序语言,比起使用组合语言的传统 BIOS 要更容易开发!也因为使用 C 语言来撰写,因此如果开发者够厉害,甚至可以在 UEFI 开机阶段就让该系统了解 TCP/IP 而直接上网!根本不需要进入操作系统。
由于过去 cracker 经常借由 BIOS 开机阶段来破坏系统,并取得系统的控制权,因此UEFI 加入了一个所谓的安全启动(secure boot)机制,这个机制代表着即将开机的操作系统必须要被 UEFI 所验证,否则就无法顺利开机!微软用了很多这样的机制来管理硬件。不过加入这个机制后,许多的操作系统,包括 Linux ,就很有可能无法顺利开机!所以,某些时刻,你可能得要将 UEFI 的 secure boot 功能关闭,才能够顺利的进入 Linux !
与 BIOS 模式相比,虽然 UEFI 可以直接取得 GPT 的分区表,不过最好依旧拥有BIOS boot 的分区支持,同时,为了与 windows 相容,并且提供其他第三方厂商所使用的UEFI 应用程序储存的空间,你必须要格式化一个 vfat 的文件系统,大约提供 512MB 到 1G左右的容量,以让其他 UEFI 执行较为方便。

Linux目录结构与挂载

目录树结构(directory tree)

我们前面有谈过Linux内的所有数据都是以文件的形态来呈现的,整个Linux系统最重要的地方就是在于目录树架构。所谓的目录树架构(directory tree)就是以根目录为主,然后向下呈现分支状的目录结构的一种文件架构。所以,整个目录树架构最重要的就是那个根目录(root directory),这个根目录的表示方法为一条斜线“/”,所有的文件都与目录树有关。目录树的呈现方式如下图所示:

如上图所示,所有的文件都是由根目录(/)衍生来的,而次目录之下还能够有其他的数据存在。上图中长方形为目录,波浪形则为文件。那当我们想要取得mydata那个文件时,系统就得由根目录开始找,然后找到home接下来找到dmtsai,最终的文件名为:/home/dmtsai/mydata的意思。
整个Linux系统使用的是目录树架构,但是我们的文件数据其实是放置在磁盘分区当中的,现在的问题是“如何结合目录树的架构与磁盘内的数据”呢?这个时候就牵扯到“挂载(mount)”的问题!

文件系统与目录树的关系(挂载)

所谓的“挂载”就是利用一个目录当成进入点,将磁盘分区的数据放置在该目录下;也就是说,进入该目录就可以读取该分区的意思。这个动作我们称为“挂载”,那个进入点的目录我们称为“挂载点”。由于整个Linux系统最重要的是根目录,因此根目录一定需要挂载到某个分区的。至于其他的目录则可依使用者自己的需求来给予挂载到不同的分区。我们以下图来作为一个说明:

上图中假设我的硬盘分为两个分区,partition 1是挂载到根目录,至于partition 2则是挂载到/home这个目录。这也就是说,当我的数据放置在/home内的各次目录时,数据是放置到partition 2的,如果不是放在/home下面的目录,那么数据就会被放置到partition 1。

Linux各个目录含义


- swap类似于windows的虚拟内存文件

- / 根目录,根目录下最好只有目录,文件放在目录下,不要放在根目录中。

- /boot 包括操作系统的内核和启动过程需要用的文件

- /root 超级管理员的家目录

- /home 家目录,用来存放用户文件

- /etc 大部分的配置文件默认都放在这里

- /dev linux系统中,所有的硬件都以文件的形式放在这个目录中

- /lost+found 突然停电或者非正常关机,存放临时文件

- /sbin 管理员才能运行的一些程序

- /opt 存储第三方软件的目录

- /proc 存储进程相关的信息,用于方便的访问进程信息,伪文件系统,所有的内容都存储在内存中

- /mnt 一般我们将手动挂载的分区放在这里(例如新加一款硬盘,可以挂载在这里)

- /media 系统自动挂载的分区放在这里

- /lib 用于存放库文件

- /usr

- /usr/lib 同/lib

- /usr/sbin 同/sbin

- /usr/local/bin 系统实用程序

- /usr/local/sbin 同/sbin

- /usr/local/lib 同/lib

思考

如果你的PC上面有两个SATA磁盘以及一个USB磁盘,而主板上面有六个SATA的插槽。这两个SATA磁盘分别安插在主板上的SATA1, SATA5插槽上, 请问这三个磁盘在Linux中的设备文件名为何?

答:由于是使用侦测到的顺序来决定设备文件名,并非与实际插槽代号有关,因此设备的文件名如下:

  1. SATA1插槽上的文件名:/dev/sda
  2. SATA5插槽上的文件名:/dev/sdb
  3. USB磁盘(开机完成后才被系统捉到):/dev/sdc

由于第一个扇区所记录的分区表与MBR是这么的重要,几乎只要读取硬盘都会先由这个扇区先读起。因此,如果整颗硬盘的第一个扇区(就是MBR与partition table所在的扇区)物理实体坏掉了,那这个硬盘大概就没有用了!

为什么人家常常说:“如果要安装多重开机,最好先安装Windows再安装Linux”呢?
这是因为:Linux在安装的时候,你可以选择将开机管理程序安装在MBR或各别分区的开机扇区,而且Linux的loader可以手动设置菜单(就是 多重开机示意图 的M1, M2...),所以你可以在Linux的bootloader里面加入Windows开机的选项;Windows在安装的时候,他的安装程序会主动的覆盖掉MBR以及自己所在分区的开机扇区,你没有选择的机会,而且他没有让我们自己选择菜单的功能。因此,如果先安装Linux再安装Windows的话,那MBR的开机管理程序就只会有Windows的项目,而不会有Linux的项目(因为原本在MBR内的Linux的开机管理程序就会被覆盖掉)。那需要重新安装Linux一次吗?当然不需要,你只要用尽各种方法来处理MBR的内容即可。例如利用Linux的救援模式来挽救MBR。

posted @ 2021-05-25 21:46  甜腻  阅读(780)  评论(0编辑  收藏  举报