<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://gentoo-zh.org/extern.php?action=feed&amp;tid=26&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / 文件系统（1）——磁盘的基本知识]]></title>
		<link>http://www.gentoo-zh.org/viewtopic.php?id=26</link>
		<description><![CDATA[文件系统（1）——磁盘的基本知识 最近发表的帖子。]]></description>
		<lastBuildDate>Thu, 04 Aug 2022 14:54:38 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[文件系统（1）——磁盘的基本知识]]></title>
			<link>http://www.gentoo-zh.org/viewtopic.php?pid=26#p26</link>
			<description><![CDATA[<p>前言</p><p>文件系统是Linux系统的核心，在Linux系统中，一切皆文件。对于开发者而言，编程过程中通常用到的是文件IO。在open函数打开文件，read函数读取文件的过程底层原理如何？本文件系统系列文章主要尝试针对的是这部分内容进行深入的讲解。</p><p>文件最终是存储在磁盘上，文件的存取，最终是读写磁盘。因此，在本文章中，将主要介绍磁盘的一些基础知识。<br />硬盘的物理结构 硬盘结构概述</p><p>其中：</p><p>每个盘片有两面，两面都可以存储数据。</p><p>每个盘面都有一个磁头，用于存取数据。</p><p>所有磁头都是固定的，一起做物理移动。但是每次只有一个磁头执行存取数据的任务，选择使用哪个磁头是由系统控制的。磁头间的切换非常迅速，而磁头摆动寻道则比较慢。</p><p>磁头摆动，找到要读取数据所在的磁道；盘片通过转动，将数据“送到”磁头下。<br />磁头数、磁道、柱面、扇区</p><p>磁头数： 每个盘面都有一个磁头，因此磁头数 = 盘面数。</p><p>磁道： 上以盘片轴心为圆心，不同半径的同心圆称为磁道，磁道不是真正肉眼可看见的一道一道“坑”，而是被磁盘上被磁化的区域，磁道之间有一定的间隙，以免磁道之间磁介质相互影响。</p><p>扇区： 每个磁道被等分为若干个弧段（扇区），每个扇区可以存放512个字节的数据。扇区是磁盘驱动器向磁盘读写数据的最小单元。</p><p>柱面： 不同盘片半径相同的磁道组成的一个“柱面”。<br />CHS编号</p><p>所谓硬盘的CHS，即Cylinder（柱面）、Head（磁头）、Sector（扇区）。每个柱面、磁头、扇区都有自己的编号。<br />磁道编号规则</p><p>磁头编号： 从上到下，分别为磁头0号，磁头1号......</p><p>柱面编号： 最外圈的柱面编号为0，往里依次递增1，2，3.....<br />扇区编号规则</p><p>每个磁道都可以被分为若干个扇区，假设有18个扇区，编号依次为1，... 18。这里的1...18在一个磁道中是唯一的，但不同磁道之间会重复。因此，要确定一个扇区在硬盘（多个盘片）中的具体位置，则需要结合柱面号/磁头号/扇区号来确定——绝对扇区编号，或者是为整个硬盘的所有扇区分配一个唯一的编号——DOS扇区编号（也称为相对扇区编号或逻辑扇区编号）。</p><p>绝对扇区： 由柱面号/磁头号/扇区号唯一确定。</p><p>DOS（Disk Operating System）扇区（逻辑扇区）： 磁盘操作系统为了管理方便，会将柱面号/磁头号/扇区号确定的扇区编号转换为易于管理和计算的单一数字编号，称为相对扇区编号或逻辑扇区编号。DOS扇区编号是从柱面0/磁头0/扇区1开始的，编号为0，依次递增，即柱面0/磁头0/扇区18的DOS扇区编号为18；柱面0/磁头1/扇区1的DOS扇区编号为19...。每个分区的第一个扇区的逻辑扇区编号为0。<br />通过CHS计算硬盘容量</p><p>硬盘存储容量＝磁头数×柱面数×每个磁道扇区数×每个扇区字节数<br />磁盘存储划分 第一个扇区存储的数据</p><p>硬盘的第一个扇区（逻辑编号为0）可以说是整个硬盘最重要扇区了，它主要存储两大信息：</p><p>主引导分区（Master Boot Record，MBR）： 存放引导加载程序，大小为446字节。</p><p>分区表（partition table）： 记录整块硬盘分区的状态，占64字节。<br />硬盘分区</p><p>分区的最小单位为柱面（Cylinder），也就是说，分区其实就是指定从第几个柱面到第几个柱面属于哪个区。</p><p>假设硬盘有400个柱面，平均分为4个区（C、D、E、F盘），则第四个分区F的柱面范围是第301号到第400号柱面。</p><p>分区表中，记录的就是就是每个分区的起始柱面号和结束柱面号。因为分区表只有64字节，因此最多只能容纳4个分区的记录（硬盘默认），要想分更多的去，则需要通过扩展分区来创建逻辑分区。<br />开机流程</p><p>加载BIOS： BIOS（Base Input Output System，基本输入输出系统，读做/&quot;baious/）是硬件厂商写入到主板ROM里的一个程序，电脑开机时，会最先执行BIOS。开机后，进入BIOS界面，如下：</p><p>MBR： BIOS在执行的过程中，会根据用户设置（即在BIOS的Boot界面选择的优先启动项，U盘/硬盘/光驱），如果硬盘的优先级最高，则计算机会从硬盘的第一个扇区的MBR中的读取引导加载程序（Boot Loader）。和BIOS一样，主引导分区MBR是硬件本身会支持的东西。</p><p>引导加载程序：引导加载程序（Boot Loader）是用于读取操作系统内核文件的一个小软件，不同的操作系统有各自的引导加载程序。每个分区都可以有自己的文件系统，有自己的引导扇区，在启动的过程中，用户可以选择是直接加载引导程序所在分区的操作系统，还是将引导加载功能交给各分区引导扇区中的加载程序。boot loader的功能主要有：</p><p>提供菜单：让用户选择不同的开机选项，是多重引导的重要功能。</p><p>载入内核文件：直接指向可开机的程序区段，开始操作系统。</p><p>转交其他loader: 将引导加载功能转交给其他loader负责。</p><p>操作系统内核文件：最后，引导加载程序加载操作系统的内核文件，启动操作系统！<br />要点</p><p>每个分区都有自己的引导扇区（boot sector）。</p><p>实际可开机的操作系统内核文件是存放在各个分区内的，如在C盘安装Windows系统，在D盘安装Linux操作系统。</p><p>引导加载程序（boot loader）只会认识自己所在分区内的可开机内核文件，以及其他boot loader（相当于一个指针，指向其他loader）。</p><p>loader可以直接指向或者间接地讲管理权交给其他loader。</p><p>一点经验：如果要安装多系统，最好先安装Windows，后安装Linux。因为Windows会强制覆盖MBS，也就是说，如果你先装Linux再装Windows，MBR中就只有Windows的相关选项（Linux的被覆盖掉了）。而Linux则不会强制覆盖MBR，你可以选择将Linux的引导程序安装在MBR或者其所在分区的引导扇区中；你也可以在Linux的引导程序中设置Windows的开机选项。<br />磁盘存储数据的形式</p><p>磁盘以二进制的形式存储数据。我们平时编程过程中读写文件模式可能有文本形式/二进制形式，文件也有文本文件、音频文件、图片文件...等各种不同类型的文件，但这些文件在磁盘上都是以二进制的方式存储。</p><p>可以想像一下，二进制中的0，对应磁盘上的一个“凹”点，1对应磁盘上的一个“凸”点。（只是形象比喻，不是真的凹凸）。<br />总结</p><p>至此，硬盘（机械硬盘）的基本结构和一些核心的概念已了解的差不多了，也了解了开机过程中需要用到硬盘的地方。文件的存取，最终会落在硬盘的读写上。在后面的文章中，将逐渐自底向上介绍架构在磁盘之上的Linux操作系统的文件系统的一些理论性知识。<br />混合云 云服务器 linux 磁盘文件系统 linux文件系统 磁盘 linux检查磁盘文件系统 linux磁盘与文件系统</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Thu, 04 Aug 2022 14:54:38 +0000</pubDate>
			<guid>http://www.gentoo-zh.org/viewtopic.php?pid=26#p26</guid>
		</item>
	</channel>
</rss>
