ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

磁盘,分区,文件系统

2022-06-23 07:00:08  阅读:115  来源: 互联网

标签:文件 分区 文件系统 扇区 磁头 磁盘


2021-12-15

磁盘、分区、Linux文件系统 
[Disk、 Partition、Linux File System]

  • 1、磁盘基础知识 

1.1 物理结构
 磁盘,分区,文件系统
 磁盘,分区,文件系统

SATA接口:4条 有差分对TX+,TX-,RX+,RX-。三个GND

SATA电源:3.3V三个 ,GND三个,5V三个,GND,Rsvd ,GNG,12V三个。

 

磁盘,分区,文件系统

最内层0磁头 0扇区

盘片的基本由金属或玻璃材质制成,盘片的表面必须要光滑平整,任何灰尘或异物都会使得磁头摩擦到磁面而造成盘片损坏,从而造成数据的永久性丢失。

硬盘的存储原理是将数据用其控制电路通过硬盘读写头去改变磁盘表面上极细微的磁性粒子簇的N、S极性来加以存储的。磁头在硬盘中也是一个非常重要的部件。磁盘为了储存更多的数据,必须将磁性粒子簇溅镀在磁头可定位的范围内,并且磁性粒子制作的越小越好、经过溅镀是的盘面的粒子密度相当高,硬盘在读写的时候为了能在磁盘表面高速来回移动读取数据则需要注意磁头和盘面的距离,太高太低都会影响读取性能。
一般机械硬盘的性能由磁盘的转速、寻道速度、单碟容量和接口速度决定,转速决定了内部传输率,接口则决定了外部传输率,寻道速度影响磁盘随机IO性能,磁盘容量则是影响磁盘性能的一个间接因素。
盘片转的越快,数据传输的时间久越短。寻道速度则影响磁头随机IO性能。单碟容量越高,其性能一般更好。硬盘的接口有ATA,SCSI,SATA,SAS,FC等等。FC(光纤)接口一般在高端存储中比较常见,而SAS和SATA多在服务器或者中低端存储中常见。
硬盘的物理结构:

一般由磁头与碟片、电动机、主控芯片与排线等部件组成;当主电动机带动碟片旋转时,副电动机带动一组(磁头)到相对应的碟片上并确定读取正面还是反面的碟面,磁头悬浮在碟面上画出一个与碟片同心的圆形轨道(磁轨或称柱面),这时由磁头的磁感线圈感应碟面上的磁性与使用硬盘厂商指定的读取时间或数据间隔定位扇区,从而得到该扇区的数据内容。所有的盘片都固定在一个旋转轴上,这个轴即盘片主轴。而所有盘片之间是绝对平行的,在每个盘片的存储面上都有一个磁头,磁头与盘片之间的距离比头发 丝的直径还小。所有的磁头连在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径方向动作,而盘片以每分钟数千转到上万转的速度在高 速旋转,这样磁头就能对盘片上的指定位置进行数据的读写操作。
•     磁道(Track)
当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道(Track)。信息以脉冲串的形式记录在这些轨迹中,这些同心圆不是连续记录数据,而是被划分成一段段的圆弧(扇区),这些圆弧 的角速度一样。
•    柱面 (Cylinder)
在有多个盘片构成的盘组中,由不同盘片的面,但处于同一半径圆的多个磁道组成的一个圆柱面(Cylinder)。所有盘面上的同一磁道构成一个圆柱,通常称做柱面(Cylinder),每个圆柱上的磁头由上而下从“0”开始编号。数据的读/写按柱面进行,即磁 头读/写数据时首先在同一柱面内从“0”磁头开始进行操作,依次向下在同一柱面的不同盘面即磁头上进行操作,只在同一柱面所有的磁头全部读/写完毕后磁头 才转移到下一柱面,因为选取磁头只需通过电子切换即可,而选取柱面则必须通过机械切换。电子切换相当快,比在机械上磁头向邻近磁道移动快得多,所以,数据 的读/写按柱面进行,而不按盘面进行。也就是说,一个磁道写满数据后,就在同一柱面的下一个盘面来写,一个柱面写满后,才移到下一个扇区开始写数据。读数 据也按照这种方式进行,这样就提高了硬盘的读/写效率。
•    扇区(Sector)
磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区(Sector)。硬盘的第一个扇区,叫做引导扇区。操作系统以扇区(Sector)形式将信息存储在硬盘上,每个扇区包括512个字节的数据和一些其他信息。
•    磁头(Head)
在硬盘系 统中,硬盘的每一个盘片都有两个盘面(Side),即上、下盘面,一般每个盘面都会利 用,都可以存储数据。盘面号又叫磁头号,因为每一个有效盘面都有一个对应的读写磁头。盘片旋转产生的气流相当强,足以使磁头托起,并与盘面保持一个微小的距离。这个距离越小,磁头读写数据的灵敏度就越高,当然对硬盘各部件的要求也越 高。早期设计的磁盘驱动 器使磁头保持在盘面上方几微米处飞行。稍后一些设计使磁头在盘面上的飞行高度降到约0.1μm~0.5μm,现在的水平已经达到 0.005μm~0.01μm,这只是人类头发直径的千分之一。

 磁盘,分区,文件系统
  
磁盘,分区,文件系统
 
磁盘,分区,文件系统

 地址信息之扇区头标

扇区的第一个主要部分是标识符。标识符,就是扇区头标,包括组成扇区三维地址的三个数字:扇区所在的磁头(或盘面)、磁道(或柱面号)以及扇区在磁道上的位置即扇区号。头标中还包括一个字段,其中有显示扇区是否能可靠存储数据,或者是否已发现某个故障因而不宜使用的标记。有些硬盘控制器在扇区头标中还记录有指示字,可在原扇区出错时指引磁盘转到替换扇区或磁道。最后,扇区头标以循环冗余校验(CRC)值作为结束,以供控制器检验扇区头标的读出情况,确保准确无误。
扇区的第二个主要部分是存储数据的数据段,可分为数据和保护数据的纠错码(ECC)。在初始准备期间,计算机用512个虚拟信息字节(实际数据的存放地)和与这些虚拟信息字节相应的ECC数字填入这个部分。校验错误(ECC uncorrectable errors,又称ECC错误)。系统每次在往扇区中写数据的同时,都根据这些数据经过一定的算法运算生成一个校验码(ECC=Error Correction Code),并将这个校验码记录在该扇区的信息区内。以后从这个扇区读取数据时,都会同时读取其校检码,并对数据重新运算以检查结果是否与校检码一致。如果一致,则认为这个扇区正常,存放的数据正确有效;如果不一致,则认为该扇区出错,这就是校验错误。这是硬盘最主要的缺陷类型。导致这种缺陷的原因主要有:磁盘表面磁介质损伤、硬盘写功能不正常、校验码的算法差异


 
在 linux 中可以使用 fdisk -l 查看一个磁盘的物理结构:
 磁盘,分区,文件系统
该磁盘有255个heads,也就是说共有255个盘面(虚拟盘面)。3263个柱面(cylinders),也就是说每个盘面上都有3263个磁道, 63 sectors/track说的是每个磁道上共有63个扇区。命令结果也给出了Sector size的值是512bytes。那我们动笔算一下该磁盘的大小吧。
计算:255盘面  * 3263柱面 * 63扇区 * 每个扇区512bytes = 26839088640byte。
结果是26.8G,和磁盘的总大小相符。 
1.2 磁盘的读写原理
写:

系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第1磁道的第一磁头下(也就是第1盘面的第一磁道)的所有扇区,然后,是同一柱面的下一磁头,……,一个柱面存储满后就推进到下一个柱面,直到把文件内容全部写入磁盘。
 
读:

系统也以相同的顺序读出数据。读出数据时通过告诉磁盘控制器要读出扇区所在的柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。磁盘控制器则直接使磁头部件步进到相应的柱面,选通相应的磁头,等待要求的扇区移动到磁头下。在扇区到来时,磁盘控制器读出每个扇区的头标,把这些头标中的地址信息与 期待检出的磁头和柱面号做比较(即寻道),然后,寻找要求的扇区号。待磁盘控制器找到该扇区头标时,根据其任务是写扇区还是读扇区,来决定是转换写电路, 还是读出数据和尾部记录。找到扇区后,磁盘控制器必须在继续寻找下一个扇区之前对该扇区的信息进行后处理。如果是读数据,控制器计算此数据的ECC码,然 后,把ECC码与已记录的ECC码相比较。如果是写数据,控制器计算出此数据的ECC码,与数据一起存储。在控制器对此扇区中的数据进行必要处理期间,磁 盘继续旋转。其实我们的文件大多数的时候都是破碎的,在文件没有破碎的时候,摇臂只需要寻找1次磁道并由磁头进行读取,只需要1次就可以成功读取;但是如果文件破碎成11处,那么摇臂要来回寻找11次磁道磁头进行11次读取才能完整的读取这个文件,读取时间相对没有破碎的时候就变得冗长。 
 
因此,磁盘IO时的过程包括:
•    第一步,首先是磁头径向移动来寻找数据所在的磁道。这部分时间叫寻道时间。
•    第二步,找到目标磁道后通过盘面旋转,将目标扇区移动到磁头的正下方。
•    第三步,向目标扇区读取或者写入数据。到此为止,一次磁盘IO完成,故:

单次磁盘IO时间 = 寻道时间 + 旋转延迟 + 存取时间。 
•    对于旋转延时,现在主流服务器上经常使用的是1W转/分钟的磁盘,每旋转一周所需的时间为60*1000/10000=6ms,故其旋转延迟为(0-6ms)。
•    对于存取时间,一般耗时较短,为零点几ms。
•    对于寻道时间,现代磁盘大概在3-15ms,其中寻道时间大小主要受磁头当前所在位置和目标磁道所在位置相对距离的影响。
 
候选的磁盘分区方案:
•    方案一: 255个盘面,C盘是0-100盘面, D盘是101-200个盘面,……
•    方案二:3263个柱面,C盘0-1000个柱面,D盘1001-20001个柱面,……
 
其实采用哪一种,最主要看的是那种方式性能更快。因为同一分区下的数据经常会一起读取,假如采用第一种,那么这样磁头就需要在3000多个track间不停地跳来跳去,这样磁盘的寻道时间就会翻倍,磁盘性能就会下降。而对于方案二,假如对于磁盘C,只需要在磁头在1-1000个磁道间移动就可以了,大大降低了寻道时间。(实际上分区并不是从0开始的,磁盘的第一个磁道对应的柱面会被用来安装引导加载程序以及磁盘分区表)。所以,方案二的分区方式可以降低磁盘IO时间中的寻道时间部分,所以所有的操作系统采用的都是方案二,没有用方案一的。 

  • 2. Linux 下磁盘命名和分区 

磁盘主引导记录MBR
                        硬盘1
BMR    分区1    分区2    分区3    分区4

硬盘的0柱面、0磁头、1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR)。该记录占用512个字节,它用于硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统区。
 注:分区对应于所有的系统都是一样的

磁盘,分区,文件系统磁盘,分区,文件系统

主引导记录加载系统启动

每个分区表用16个字节表示地址范围

分区表最多只能有四个主分区  系统分区在活动分区

扩展分区表(EBR)只用了前两个  当前和下一个  当前指向当前的引导扇区  下一个指向下一个当前

从主引导记录的结构可以知道,它仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘,最多只能识别4个主要分区(Primary partition)。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。扩展分区也是主要分区的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区。扩展分区中逻辑驱动器的引导记录是链式的。每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR),其分区表的第一项指向该逻辑分区本身的引导扇区,第二项指向下一个逻辑驱动器的EBR,分区表第三、第四项没有用到。 

磁盘,分区,文件系统

文件系统建立在分区结构之上

1.MBR的读取
    硬盘的引导记录(MBR)是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。(属于最底层)
3. MBR的组成
 磁盘,分区,文件系统
一个扇区的硬盘主引导记录MBR由4个部分组成。
1.    主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。
2.    出错信息数据区(0089-01BD)
3.分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。
4.结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA,如果该标志错误系统就不能启动。
 
磁盘,分区,文件系统

3.MBR中的分区表(DPT)
    占用512个字节的MBR中,偏移地址01BEH--01FDH的64个字节,为4个分区项内容(分区信息表)。它是由磁盘介质类型及用户在使用 FDISK定义分区时确定的。在实际应用中,FDISK对一个磁盘划分的主分区可少于4个,但最多不超过4个。每个分区表的项目是16个字节,其内容含义如下表所示。
 
磁盘,分区,文件系统
 
4.MBR的主要功能及工作流程
在CPU上电之后,若由硬盘启动,则BIOS将硬盘的主引导记录(位于0柱面、0磁道、1扇区)读入7C00处,然后将控制权交给主引导代码。(7C00内存当中的一个位置)

主引导代码的任务包括:
扫描分区表,找到一个**(可引导)分区;
找到**分区的起始扇区;——————————》系统Boot
将**分区的引导扇区装载到内存7C00处;           看门老大爷
将控制权交给引导扇区代码;
 
如果主引导代码无法完成上述任务,它将显示以下错误信息之一:
No active partition.
Invalid partition table.
Error loading operating system.
Missing operating system.
 
机器加电或按reset键后都要进行系统复位,复位后CS=FFFFH,IP=0000H,(CS为代码段寄存器,而IP为指令指针寄存器)那么自然就从FFFF:0000H处开始执行指令,这个地方只有一条JMP指令跳转到系统自检程序处,系统自检完成后把硬盘的第一个扇区,即MBR扇区(如果由硬盘启动)读入到0:7C00H处,然后把控制权交出,从0:7C00H处继续执行。 
 
硬盘的MBR代码分析:
其中的引导扇区是指硬盘相应分区的第一个扇区,是和操作系统有关的。操作系统的引导是由它来完成的,而MBR并不负责,MBR和操作系统无关。引导扇区的任务是把控制权转交给操作系统的引导程序。
程序流程:
1 将程序代码由0:7C00H移动到0:0600H(注,BIOS把MBR放在0:7C00H处)
2 搜索可引导分区,即80H标志
成功:goto 3
失败:跳入ROM BASIC
无效分区表:goto 5
3 读引导扇区
失败:goto 5
成功:goto 4
4 验证引导扇区最后是否为55AAH
失败:goto 5
成功:goto 6
5 打印错误进入无穷循环
6 跳到0:7C00H进行下一步启动工作
 
5、硬盘逻辑驱动器的分区表链结构
    硬盘是由很多个512字节的扇区组成,而这些扇区会被组织成一个个的“分区”。
硬盘的分区规则是:一个分区的所有扇区必须连续,硬盘可以有最多4个物理上的分区,这4个物理分区可以是4个主分区或者3个主分区加一个扩展分区。在DOS/Windows管理下的扩展分区里,可以而且必须再继续划分逻辑分区(逻辑盘)。
扩展分区的信息位于硬盘分区表(DPT)中, 而逻辑驱动器的信息则位于扩展分区的起始扇区, 即该分区的起始地址(面/扇区/磁道)所对应的扇区, 该扇区中的信息与硬盘主引导扇区的区别是不包含MBR, 而16字节的分区信息则表示的是逻辑驱动器的起始和结束地址等。


Linux查看分区表mbr
sudo dd if=/dev/sda ibs=512 count=1 | hexdump -C
 磁盘,分区,文件系统
2.1 磁盘命名
在Linux下对 SCSI 和 SATA 设备是以 sd (串行硬盘)命名的,第一个 scsi 设备是 sda,第二个是 sdb,依此类推。一般主板上有两个SCSI接口,因此一共可以安装四个SCSI设备。主 SCSI 上的两个设备分别对应 sda 和 sdb,第二个 SCSI 口上的两个设备对应 sdc 和 sdd。一般硬盘安装在主 SCSI 的主接口上,所以是 sda 或者 sdb,而光驱一般安装在第二个SCSI的主接口上,所以是 sdc。(IDE接口设备是用 hd (并行口)命名的,第一个设备是hda,第二个是hdb,依此类推。)
磁盘,分区,文件系统

Master Slave  可以共用一个总线

2.2 分区命名 
所谓的磁盘分区指的是告诉操作系统『我这颗磁盘在此分割槽可以存取的区域是由 A 磁柱到 B 磁柱之间的区块』, 如此一来操作系统就能够知道他可以在所指定的区块内进行文件数据的读/写/搜寻等动作了。 也就是说,磁盘分区意即指定分割槽的启始与结束磁柱就是了。
 
分区是用设备名称加数字命名的。例如 hda1 代表hda这个硬盘设备上的第一个分区。 每个硬盘可以最多有四个主分区,作用是 1-4 命名硬盘的主分区。多个主分区中只能有一个active 主分区作为启动分区。逻辑分区是从5开始的,每多一个分区,每个磁盘上最多可以有 24个扩展分区。 
2.3 分区步骤

0.查看分区
运行sudo fdisk -l
 磁盘,分区,文件系统
红框种可以看到/dev/sdc存储设备大小8G,一个分区sdc1 开始位置2048 结束位置15523839 总大小7760896(8G-1M)文件系统id 83 接下来我们删除这个分区,重新建立一个分区
1.  运行 fdisk  来分区:
sudo fdisk /dev/sdc
 

Command (m for help): m                    //看各个命令都有介绍
Command action
   a   toggle a bootable flag        //**为启动标志
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition           //删除一个分区
   l   list known partition types
   m   print this menu
   n   add a new partition          //添加一个新的分区
   o   create a new empty DOS partition table
   p   print the partition table      //打印分区信息
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id  //改变分区文件系统
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit    //保存分区信息
   x   extra functionality (experts only)
 
  Command (m for help):d   //如果只有一个分区直接删除,如果多个分区,会出现个数字,自己选要
    删除的分区
  Command (m for help):n   //添加新分区
  Partition type:
     p   primary (2 primary, 0 extended, 2 free)   //主分区
     e   extended                          //扩展分区
  Command (m for help):p   //一般选p
    Partition number (1-4, default 1): 1  //默认从第一个分区开始添加
  First sector (2048-15523839, default 2048):  //从什么地方开始分,比如8G内存,一共会有
   11523839个sector,从2048开始,那就是留出了2048*512=1M。这个是sd卡保存信息保留位置。
   Command (m for help):t               //给分区选一个格式,是linux还是FAT32
   Selected partition 1            //选择第一个分区,设定格式
  Hex code (type L to list codes): l  //显示可以设定的格式  很多这里不列 


//Hex code (type L to list codes): b   //做FAT32
Hex code (type L to list codes): 83   //这就是linux的设置
Command (m for help): w    //保存

步骤:

1.先分区

2.保存

3.给文件格式(系统分区)

4.格式化(分区)

5.挂载到mnt目录 

分多个区有以下几个目的:
•    在不损失数据的情况下重装系统,比如独立设置 /home 挂载点,重装系统的时候直接标记回 /home,数据不会有任何损失。
•    针对不同的挂载点的特性分配合适的文件系统以合理发挥性能,比如对 /var 使用reiserfs,对 /home 使用xfs,对 / 使用ext4。
•    针对不同的挂载点开启不同的挂载选项,如是否需要即时同步,是否开启日志,是否启用压缩。
•    大硬盘搜索范围大,效率低
•    磁盘配额只能对分区做设定
•    /home、/var、/usr/local 经常是单独分区,因为经常会操作,容易产生碎片
 
2.     格式化分区:
//sudo mkdosfs /dev/sdc1  //格式化FAT32
sudo mkfs.ext3 /dev/sdc1   //格式化Linux
 
每块硬盘都分为若干个分区,每个分区都有自己的文件系统。Windows为这些文件系统各自指定了一个字母。不过 GNU/Linux 使用唯一的树形结构来管理文件,而每个文件系统都挂载于树形结构的某个位置。
正如 Windows 需要有 C: 驱动器一样,GNU/Linux 必须能够将根文件系统挂载于文件树的根(/)上。当根挂载完成之后,您就可以将其它文件系统挂载于树形结构各种挂载点上。根结构下的任何目录都可以作为挂载点,而您也可以将同一文件系统同时挂载于不同的挂载点上。挂载点实际上就是linux中的磁盘文件系统的入口目录:
 
 磁盘,分区,文件系统
关于文件系统的三个易混淆的概念:
创建:以某种方式格式化磁盘的过程就是在其之上建立一个文件系统的过程。创建文件系统时,会在磁盘的特定位置写入关于该文件系统的控制信息。
注册:向内核报到,声明自己能被内核支持。一般在编译内核的时侯注册;也可以加载模块的方式手动注册。注册过程实 际上是将表示各实际文件系统的数据结构struct file_system_type 实例化。
安装:也就是我们熟悉的mount操作,将文件系统加入到 Linux 的根文件系统的目录树结构上;这样文件系统才能被访问。
 
linux 下一切皆文件!换言之就是linux操作系统将系统中的一切都作为文件来管理。在windows中我们常见的硬件设备(打印机、网卡、声卡...)、磁盘分区等,在linux中统统都被视作文件,对设备、分区的访问就是读写对应的文件。
 
主分区,扩展分区和逻辑分区:
linux分区不同于windows,硬盘和硬盘分区在Linux都表示为设备.
硬盘分区一共有三种:主分区,扩展分区和逻辑分区。
查看根目录结构 tree / -L 1
硬盘的分区主要分为主分区(Primary Partion)和扩展分区(Extension Partion)两种,主分区和扩展分区的数目之和不能大于四个。
主分区(Primary Partion):可以马上被使用但不能再分区。
扩展分区(Extension Partion):必须再进行分区后才能使用,也就是说它必须还要进行二次分区。
逻辑分区((Logical Partion)):由扩展分区建立起来的分区,逻辑分区没有数量上限制。
扩展分区只不过是逻辑分区的“容器”,实际上只有主分区和逻辑分区进行数据存储。
linux主要目录的功用。

/
├── bin/    ==>  二进制文件(命令、可执行程序)
├── boot/   ==>  内核镜像文件所在地 查看内核uname  -a
├── cdrom  ==>  光驱
├── dev/    ==>  所有设备(除了网络接口之外网络通过套接字实现(socket))的节点文件
├── etc/    ==> 几乎所有的软件/服务的配置文件
├── home/  ==>  所有普通用户的家目录的所在地
├── lib/    ==>  系统库文件所在路径
├── lost+found ==>这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里
├── media ==>系统的默认挂载目录
├── mnt/    ==>  空目录,系统提供这个目录是让用户临时挂载其他的文件系统。
├── opt  ==>用户级的程序目录,装到/opt目录下的程序,它所有的数据、库文件等等都是放在同个目录下面
├── proc/   ==>  将系统的关键信息以proc文件系统方式呈现给用户,虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息
├── root/   ==>  系统管理员的主目录(特权阶级)
├── run
├── sbin/   ==>  需要管理员权限运行的命令
├── selinux
├── srv
├── sys    ==>存放系统信息
├── tmp  ==>一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下
├── usr/    ==>  第三方软件 / 库的安装路径,最庞大的目录,要用到的应用程序和文件几乎都在这个目录
├── var/    ==>  容易变化的文件的所在地,某些大文件的溢出区,比方说各种服务的日志文件

/usr
/usr/bin 众多的应用程序
/usr/sbin 超级用户的一些管理程序
/usr/doc linux文档
/usr/include linux下开发和编译应用程序所需要的头文件
/usr/lib 常用的动态链接库和软件包的配置文件
/usr/man 帮助文档
/usr/src 源代码,linux内核的源代码就放在/usr/src/linux里
/usr/local/bin 本地增加的命令
/usr/local/lib 本地增加的库


一切皆文件
Linux 对数据文件(.mp3、.bmp),程序文件(.c、.h、*.o),设备文件(LCD、触摸屏、鼠标),网络文件( socket ) 等的管理都抽象为文件,使用统一的方式方法管理。
文件分类:
1)普通文件( 数据文件 )
普通文件是用于存放数据、程序等信息的文件,一般都长期地存放在外存储器(磁盘)中。普通文件又分为文本文件和二进制文件。
2)目录文件
目录文件是文件系统中一个目录所包含的目录项所组成的文件。
3)设备文件
设备文件是用于为操作系统与设备提供连接的一种文件。在Linux系统中将设备作为文件来处理,操作设备就像是操作普通文件一样。每一个设备对应一个设备文件,存放在 /dev 目录中。
5)链接文件
似于 windows 下的快捷方式,链接又可以分为软链接(符号链接)和硬链接。
6)管道文件
管道文件主要用于在进程间传递数据的一种特殊文件。
7)套接口文件
主要用于不同计算机间网络通信的一种特殊文件。

 磁盘,分区,文件系统
 
手动挂载
sudo mkdir  /mnt/123   在mnt下新建一个文件夹
sudo chmod 777 /mnt/123 给123文件夹总高权限
sudo mount -rw /dev/sdc1 /mnt/123 把sdc1挂载到123文件夹,以后再访问123相当于访问sdc1分区。
        umount   卸载    多个地方可以同时挂载一个分区
4. 开机自动挂载
磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载。系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘。这样我们只需要将磁盘的挂载信息写入这个文件中我们就不需要每次开机启动之后手动进行挂载了。
自动挂载两种方式 :
1盘号 
/dev/sdc1      /mnt/123       ext3        defaults        0       0   (启动时是否进行检测)
2 uuid号
查看所有的uuid
ls -l /dev/disk/by-uuid
在fstab文件最后添加查找到的uuid
UUID=4a158d3b-97cc-47c4-82d6-1a2  /mnt/123  ext3  defaults  0  0 

第一个字段:描述将要挂载的特定块设备或远程文件系统。
第二个字段:描述挂载点。
第三个字段:描述挂载文件系统。
第四个字段:描述文件系统相关联的挂载选项。
第五个字段:针对ext2/3/4文件系统,是否要备份,防止因异常断电导致的数据丢失。具体可以查看man 8 dump,如果没有此命令,请先用apt-get install dump安装。此字段默认填0,不需要dump。
第六个字段:指定系统启动时通过fsck检查文件系统的顺序,根文件系统检查顺序为1,其他为2。默认为0表示不执行检查。
5. 总结 
挂载点必须是一个目录。
一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。对于其他操作系统建立的文件系统的挂载也是这样,卸载后,目录以前的文件都还在,不会有任何丢失。
目录只占磁盘里的一个inode,存放文件属性等信息。
任何一个分区都必须挂载到某个目录上。
目录是逻辑上的区分。分区是物理上的区分。
磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。
根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。
一个分区可以挂在多个目录,但反过来一个目录只能是一个分区的挂载点。
3. Linux 文件系统
文件系统是对一个存储设备上的数据和元数据进行组织的机制。它的最终目的是把大量数据有组织的放入持久性(persistant)的存储设备中,比如硬盘和磁盘。文件系统(file system)是就是文件在逻辑上组织形式,它以一种更加清晰的方式来存放各个文件。数据被存入到某个分区中。一个典型的Linux分区(partition)包含有下面各个部分:
 磁盘,分区,文件系统
Boot block  引导扇区

Super block  超级块

i nodes  是对文件的描述 

文件是文件系统对数据的分割单元。文件系统用目录来组织文件,赋予文件以上下分级的结构。在硬盘上实现这一分级结构的关键,是使用 inode 来虚拟普通文件和目录文件对象。在Linux系统中,目录也是一种文件。
每一个分区都预留的boot sector是载入操作系统内核的引导代码,Super Block,记录整个文件系统相关的信息,是整个文件系统的首脑。记录了inode、block等信息包括修改挂载时间等。 
磁盘与文件系统:
  
 磁盘,分区,文件系统
3.1 inode 
inodes 是实现文件存储的关键。在 Linux 中,文件系统中管理的每个对象(文件或目录)表示为一个 inode。inode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。在 Linux 系统中,一个文件可以分成几个数据块存储在分区内。为了搜集各数据块,我们需要该文件对应的inode。每个文件对应一个 inode。这个 inode 中包含多个指针,指向属于该文件各个数据块。当操作系统需要读取文件时,只需要找到对应 inode,收集分散的数据块,就可以收获我们的文件了。
 磁盘,分区,文件系统
 
读取文件:
 
在Linux中,我们通过解析路径,根据沿途的目录文件来找到某个文件。目录中的条目除了所包含的文件名,还有对应的inode编号。当我们输入$cat /var/test.txt时,Linux 将在根目录文件中找到 var 这个目录文件的inode编号,然后根据 inode 合成 var 的数据。随后,根据 var 中的记录,找到 text.txt 的 inode 编号,沿着 inode 中的指针,收集数据块,合成 text.txt 的数据。整个过程中,会参考三个inode:
根目录文件的 inode:2,用于找到 var 的 inode id
var 目录文件的 inode:10747905,用于找到 test.txt 的 inode id
text.txt 文件的 inode: 10749034,用于找到 data blocks


 磁盘,分区,文件系统
因此,当我们读取一个文件时,实际上是在目录中找到了这个文件的inode编号,然后根据inode的指针,把数据块组合起来,放入内存供进一步的处理。当我们创建一个文件时,是分配一个空白 inode 给该文件,将其 inode 编号记入该文件所属的目录,然后选取空白的数据块,让 inode 的指针指向这些数据块,并放入内存中的数据。
3.2 循环设备
在类Unix系统中,/dev/loop 是一种伪设备,这种设备使得文件可以如同块设备一般被访问。在目录上挂载包含文件系统的文件一般需要两步:
用一个循环设备节点连接文件。
在目录上挂载该循环设备
具体步骤:
dd if=/dev/zero of=file.img bs=1k count=10000 //创建一个初始化文件
losetup /dev/loop0 file.img //创建一个循环设备
mke2fs -c /dev/loop0 10000 //创建文件系统
mkdir /mnt/point1 //创建挂载点
mount -t ext2 /dev/loop0 /mnt/point1 //挂载 
3.3 文件系统的结构
 磁盘,分区,文件系统
 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点。
VFS 是底层文件系统的主要接口,它是 Linux 内核中的一个软件抽象层。。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode 和 dentry)。它们缓存最近使用过的文件系统对象。因为有 VFS 存在,Linux 允许众多不同的文件系统共存,并支持跨文件系统的文件操作。它通过一些数据结构及其方法向实际的文件系统如 ext2,vfat 提供接口机制。
每个文件系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。可以使用 sync 命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备)。 
 磁盘,分区,文件系统
3.4 VFS (虚拟文件系统)  
Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的 操作可以跨文件系统而执行。如下图所示,我们可以使用 cp 命令从 vfat 文件系统格式的硬盘拷贝数据到 ext3 文件系统格式的硬盘;而这样的操作涉及到两个不同的文件系统。


 磁盘,分区,文件系统
过程:VFS调用 vfat 的读文件方法将 a.txt 的数据读入内存;再将 a.txt 在内存中的数据映射到b.txt对应的内存空间后,VFS调用ext3的写文件方法将b.txt写入磁盘;从而实现了最终的跨文件系统的复制操作。
 
“一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、 套接字等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。操作文件时需先打开;打开文件时,VFS 会知道该文件对应的文件系统格式;当VFS把控制权传给实际的文件系统时,实际的文件系统再做出具体区分,对不同的文件类型执行不同的操作。这也就是“一切皆是文件”的根本所在。
 
 磁盘,分区,文件系统
从物理介质读文件的具体过程:
  

磁盘,分区,文件系统
当在用户应用程序调用文件 I/O read()操作时,系统调用 sys_read() 被激发,sys_read() 找到文件所在的具体文件系统,把控制权传给该文件系统,最后由具体文件系统与物理介质交互,从介质中读出数据。 
3.5 Linux 文件系统类型 
3.5.1 ReiserFS
ReiserFS 是一种文件系统格式。Linux内核从2.4.1版本开始支持ReiserFS。ReiserFS原先是Novell公司的SuSE Linux Enterprise采用的默认文件系统,直到2006年10月12日其宣称将在未来的版本改采 ext3 为默认。和同样在 Linux Kernel 2.4 版本下的 ext2 及 ext3 相比较,处理 4KB 以下的小文件时(tail packing enable),ReiserFS 的速度快了 10 到 15 倍[3]。但是,有些目录的操作在 ReiserFS 上面并不同步,(包括像 unlink(2)),可能会导致一些重度依赖文件锁(file-based lock)机制的应用程序上面数据的毁损。ReiserFS 在一个单一复合B+树中存储文件的亚数据信息(stat item)、目录文件信息(directory items)、索引节点中的块列表(indirect items),这些信息都有唯一的标识号作为B+树的索引值。
3.5.2 ext2 文件系统
ext2 文件系统(也称为第二扩展文件系统)旨在克服早期 Linux 版本中使用的 Minix 文件系统的缺点。多年来,该文件系统一直广泛应用于 Linux。但 ext2 中没有日志,现在基本上已被 ext3 和最新的 ext4 所取代。
3.5.3 ext3 文件系统
ext3 文件系统向标准 ext2 文件系统添加了日志功能,因此是一个非常稳定的文件系统的一个演化发展。它在大多数情况下提供合理的性能并且仍旧在改进。由于它在可靠的 ext2 文件系统上添加了日志功能,因此可以将现有 ext2 文件系统转换为 ext3 文件系统,并且在必要时还可以转换回来。
3.5.4 ext4 文件系统
ext4 是作为 ext3 的扩展来启动的,它通过增加存储限制和提高性能来满足更大文件系统的需求。为了保留 ext3 的稳定性,在2006 年 6 月,该扩展被拆分成一个新的文件系统,即 ext4。ext4 文件系统在 2008 年 12 月正式发布,包含在 2.6.28 内核中。
3.5.5 vfat 文件系统
vfat 文件系统(也称为 FAT32)没有日志功能,且缺乏完整的 Linux 文件系统实现所需的许多特性。它可用于在 Windows 和 Linux 系统之间交换数据,因为 Windows 和 Linux 都能读取它。不要将这个文件系统用于 Linux,除非要在 Windows 和 Linux 之间共享数据。
3.5.6 XFS 文件系统
XFS 文件系统拥有日志功能,包含一些健壮的特性,并针对可伸缩性进行了优化。XFS 通常是相当快的。在大文件操作方面,XFS 在所有测试中一直处于领先地位。XFS 的性能非常接近 ReiserFS,并在大多数测试指标上都超过了 ext3。
3.5.7 IBM JFS 文件系统
IBM 的 Journaled File System (JFS),目前用于 IBM 企业服务器,专为高吞吐量服务器环境而设计。它可用于 Linux,包含在几个发行版中。要创建 JFS 文件系统,使用 mkfs.jfs 命令。 
3.6 选择文件系统
选择合适的下一代 Linux 文件系统一直很简单。那些只寻求原始性能的人通常倾向于使用 ReiserFS,而那些更关心数据完整性特性的人则首选 ext3/4。然而,随着 XFS 的 Linux 版的发布,事情突然变得令人困惑。尤其是,对于 ReiserFS 是否依然是下一代文件系统性能方面的佼佼者,人们开始感到疑惑。
XFS 的性能非常接近 ReiserFS,并在大多数测试指标上都超过了 ext3。
目前,ReiserFS 和 ext3 删除文件要比 XFS 快得多。 

原文地址:https://www.likecs.com/show-203405685.html

标签:文件,分区,文件系统,扇区,磁头,磁盘
来源: https://www.cnblogs.com/python-learn/p/16403876.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有