文章目录
1.知识背景
1.1计算机基本组成
我们知道拿到一台物理机如果没有安装熟知的操作系统,一般人很难去操作这台主机完成一些工作。一台物理机在硬件结构上可以分为:输入/输出设备,外存,内存,cpu。操作系统作为指导底层机器工作的软件安装在哪呢?在没接触计算机之前,小主一直认为是放在内存中的,像Windows,所以才会一开机就有各种图形化界面供使用。时过境迁,知识上总算长进了,操作系统是安装在外部存储器上的,在系统运行时数据会从外存送到内存被CPU调用,从而使整个操作系统运行起来(内存是计算机运行时的存储空间,不存放任何软件!)。
当然,前面说的是已经安装了操作系统的情况,对于没有安装系统的裸机,它是怎么能够安装操作系统这个基本软件呢?答案是:通过基本的输入输出系统(BIOS)。
BIOS(Basic Input/Output System,基本输入输出系统)全称是ROM-BIOS,是只读存储器基本输入/输出系统的简写,它实际是一组被固化到电脑中,为电脑提供最低级最直接的硬件控制的程序,它是连通软件程序和硬件设备之间的枢纽,通俗地说,BIOS是硬件与软件程序之间的一个“转换器”或者说是接口(虽然它本身也只是一个程序),负责解决硬件的即时要求,并按软件对硬件的操作要求具体执行。
只有在安装了操作系统之后,才有我们接下来要讲的一系列知识点,不论是对磁盘进行分区,还是文件系统的挂载,都是基于Linux操作。这里可能还会有一个疑问:假设只有一块磁盘,其上安装了Linux操作系统,之后还得对同一块磁盘进行分区,怎么着都让人迷糊!Linux系统没有在安装时就进行分区的步骤,其是在安装完系统后,才对磁盘进行分区的,而且分区后挂载到根目录,我们可以这样理解,此时的分区指的是撇开系统所占空间之外的空间进行分区,这是系统装完之后,默认实现的。当然,如果是给系统新增加一块硬盘,那对新盘进行分区指的就是对整个磁盘空间啦。
1.2磁盘的物理组成
如图所示磁盘由盘片,机械手臂,磁头与主轴马达所组成,数据的写入在盘片上,盘片又可分出扇区与柱面,每个扇区大小为512bytes,其结构关系图中已经清晰的表现出来了。
1.3磁盘对应的文件名
在Linux系统中,每个设备都被当成一个文件对待,基本所有硬件设备都在/dev目录中:
## 2.文件系统
文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;当然也有像内存这种虚拟的文件系统(vmfs),说白了就是操作系统或软件对文件在存储设备上的一种组织、管理方式。
我们知道磁盘分区之后需要进行格式化,格式化就是为了使磁盘能够适应不同系统存放文件数据要求,因为不同操作系统,使用的文件系统不同,其文件属性/权限并不相同。Windows98以前的操作系统使用的是FAT文件系统,而Windows2000以后的版本使用的则是NTFS文件系统,而Linux的文件系统则使用Ext2文件系统,
2.1Ext2文件系统
Linux操作系统主要使用Ext2文件系统,Ext2文件系统,结构上可以分为三大块:
- super block:记录文件系统的总体信息,包括inode/block的总量,使用量,剩余量,以及文件系统的格式与相关信息等。
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
- block:实际记录文件的内容,若文件太大时会占用多个block;
当文件系统很大时,如果所有的inode,block都放在一起不容易管理,因此Ext2文件系统在格式化的时候基本上区分为多个块组,每个快组都有自己独立的super block,inode,block系统。另一方面,在该文件系统的整体规划中,文件系统最前面有一个启动扇区,启动扇区可以安装引导装载程序,而不是将引导装载程序安装覆盖磁盘的主引导分区MBR,这样才能制作出多重引导环境。Ext2文件系统的示意图可以表示为如下:
2.1.1data block数据块
data block数据块是真正存放数据的地方,在磁盘格式化的时候就决定了block的大小,Ext2文件系统所支持的block大小有1kb,2kb以及4kb三种。block的大小对Ext2文件系统会产生一些限制,如下表所示:
block块的大小 | 1kb | 2kb | 4kb |
---|---|---|---|
最大单一文件限制 | 16GB | 256GB | 2TB |
最大文件系统总容量 | 2TB | 8TB | 16TB |
需要注意的是,EXT2文件系统可以支持2GB以上的单一文件容量,但是一些应用程序可能还是只能支持2GB以下的文件,所以有时候需要分清楚是程序的问题还是文件系统问题;
2.1.2 inode table
我们可以将文件的内容分为两部分,一部分是关于其本身的元数据(属性信息),一部分是其真实记录的数据,前文已经讲过每个文件会占用一个inode,记录其属性信息以及文件实际存放的block号码,由于文件实际存放的内容大小不定,因此,inode中可能会记录多个block号码。但由于inode的数量和大小是在格式化的时候就确定的,每个inode的大小均为128bytes,能够记录的数据量有限,很难满足我们直接将文件内容存放的所有block号码记录在inode中,因此,引入了inode间接,双间接,以及三间接记录block号码的模式,具体说明参考以下图:
2.1.3superblock(超级块)
超级块记录了整个文件系统的相关信息,主要包括:
- block与inode的数量;
- 已使用和未使用的inode/block数量;
- block与inode 的大小,block为1k,2k,4k,inode为128bytes;
- 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间等相关信息;
super block非常重要,文件系统的基本信息都记录在该块中,一个文件系统仅有一个super block,除了第一个block group内会含有super block之外,其他block group中不一定含有,如果有,也是第一super block的备份。
2.1.4 File system Description(文件系统描述说明)
记录每个block group的开始与结束的block号码,以及说明每个区段分别介于哪一个block号码之间。
2.1.5block bitmap(块对照表)
添加文件的时候总会用到block,并且是选择空的block来记录数据,通过块对照表,就可以知道哪些块是空的,因此我们的系统就能够很快速地可使用的空间来记录文件内容。
2.1.6inode bitmap(inode对照表)
与块对照表类似,只是inode bitmap记录使用与未使用的inode号码。
2.1.7 dumpe2fs命令
该命令可以用来查看文件系统的相关信息:
dumpe2fs [-bh] 设备文件名(可以是磁盘分区后的名字)
-b:列出保留为环道的部分,一般用不到;
-h:仅列出superblock的数据,不会列出其他区段内容;
如图所示,使用df指令查看了挂载的设备,再利用dumpe2fs指令查看了文件系统的相关信息。
2.2Linux文件系统的目录与文件
对于Linux系统而言,一切数据都是存放于文件,目录也不例外,只不过目录的文件包括inode以及记录实际内容的文件,目录存放着其下文件的文件名以及对应的inode号码,因此,可以通过文件名查找到文件的inode号码,再通过inode找到文件对应的block号码,读取数据。
文件相对而言就比较简单,其对应唯一一个inode,通过inode可以找到文件实际存放的数据所在block数据块。
2.3连接文件——hard link 与symbolic link
2.3.1hard link 硬连接(实际连接)
在目录文件的内容中存放着文件名和文件对应的inode号码,要想读取该文件,必须要经过目录记录的文件名来指向到正确的inode号码才行,那是不是有一种可能是多个文件名对应到同一个inode号码呢?这就是硬连接的由来。所以硬连接是在目录文件的内容中添加一条记录,该记录为文件名与某个inode号码,该inode号码已经关联有其他文件名;因此,不同文件名但是inode号码相同的文件是硬连接文件也可以说是实际连接文件,删除任何一个“文件名“,inode与block都在,可以通过另一个文件名来读取正确的文件数据。另外不论使用那个“文件名”来编辑,最终结果都会写入到相同的inode与block中。一般情况下添加硬连接文件,磁盘空间和inode的数目不会发生变化,除非记录目录内容的block在添加记录后刚好用完。
2.3.2symbolic link 符号连接
符号连接可以当作快捷方式来理解:创建一个独立文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。因此,如果源文件被删除,连接文件将打不开,不能读取数据。符号连接文件中存放的是源文件的文件名,所以符号连接文件占用了inode与block,删除符号连接文件也并不会影响源文件。
2.3.3连接文件的制作
Linux系统中制作连接文件使用以下命令:
ln [-sf] 源文件 目标文件;
-s:如果不加任何参数就进行连接,那就是hard link,加上-s就是symbolic link;
-f:如果目标文件存在时,就主动将目标文件删除后再创建;
2.3.4目录的连接数量
当我们新建一个文件的hard link硬连接文件时,使用ls -l指令列出文件的基本信息时,文件的连接文件数目会增加1.那么当我们新建一个目录时目录的连接数会有什么变化呢?
新建一个目录/test,会含有.和…两个目录,所以我们新建一个目录,至少会有三个东西:
- /test :代表当前目录
- /test/. :代表当前目录;
- /test/… :代表上层目录
因此,新建的目录的连接数为2,而其上层目录连接数会增加1。
3.磁盘分区
3.1主分区,扩展分区,逻辑分区
磁盘分区是为了更高效的读取数据,分区之后,获取相应分区的数据只要在某个分区进行搜索而不用在整个磁盘搜索;另一方面,分区使得不同区的数据互不干扰,可以更好的保证数据的安全性。那么磁盘具体怎么来分区的呢?磁盘在其第一个扇区中记录了两个重要信息:
-
主引导分区(MBR):可以安装引导加载程序的地方,大小为446bytes。系统开机时会主动读取该区块内容,如此系统才会知道你的程序放在哪里该如何进行开机。
-
分区表,记录整块硬盘分区的状态,有64bytes;
所谓分区是指对硬盘的全部柱面空间进行划分(如果将磁盘看作原木的话,柱面区间指的就是原木的半径区间,扇区是指对原木上下面圆盘的切割),将柱面空间进行划分编号,由于分区表只有64bytes,因此能够记录的分区信息有限,最多只能容纳四个分区,这四个分区被称为主分区或者扩展分区。
因为分区表有限,所以最多只能分为4个分区,那如果说想要更多的分区是否可以做到呢?答案是肯定的。这里引入逻辑分区的概念,我们可以在分区表中保留一个主分区的信息,再记录一个扩展分区的信息,该扩展分区使用额外的扇区来记录分区信息,由扩展分区划分而来的分区称为逻辑分区,逻辑分区的数量依据操作系统的不同而不同,Linux系统中IDE接口的硬盘最多有59个逻辑分区(5~59号),SATA接口的硬盘则有11个逻辑分区(5到15号)。
主分区或者扩展分区使用P表示,逻辑分区使用L表示,我们假设硬盘设备的文件名为:/dev/hda,那么其分区在Linux系统中的设备文件名会是这样:P1:/dev/hda1;P2:/dev/hda2…数字1234加在硬盘文件名后边表示分区文件名,并且1,2,3,4表示四个主分区,逻辑分区只能使用5以后的数字表示。如果分区中包含逻辑分区,那么其设备文件名可能是这样的:P1:/dev/hda1;P2:/dev/hda2;L1:/dev/hda5;L2:/dev/hda6…
需要注意的是: -
主分区与扩展分区做多一起有四个;
-
扩展分区由于操作系统的限制最多只有一个;
-
逻辑分区是由扩展分区切割出来的分区;
-
扩展分区无法被格式话,能够被格式化后作为数据访问的分区为主分区与逻辑分区,扩展分区无法格式化;
-
逻辑分区的信息都记录在扩展分区中;
3.2磁盘挂载mount
前面介绍磁盘分区时介绍过:磁盘分区之后需要进行格式化,格式化就是为了使磁盘能够适应不同系统存放文件数据要求,因为不同操作系统,其文件属性/权限并不相同。我们知道,整个Linux文件系统使用目录树的结构,由根目录层层递进最后找到对应的文件,这是从软件的角度看,如果从硬件的角度看,我们的数据都是存放在磁盘分区中的,那么当下的问题是如何将这两者结合起来呢?
所谓挂载就是利用一个目录当成进入点,将磁盘分区的数据放置在该目录下,进入该目录就可以读取该分区的数据。这样的目录也称为挂载点,只有将文件系统挂载到目录之后,才能使用文件系统。而我们的文件系统数据又是存放在分区中的,因此我们必须将磁盘分区与目录关联起来,我觉得这样比较好理解:硬件通过文件系统组织数据的存储,将磁盘分区挂载到某个目录下,就相当于是将文件系统挂载到某个目录下了。关于文件系统的挂载可以参考以下几点:
- 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
- 单一目录不应该重复挂载多个文件系统;
- 作为挂载点的目录理论上应该是空目录,否则磁盘新分区挂载上之后,目录下的东西会暂时隐藏起来,等到新分区被卸载之后才能看到;
将文件系统挂载到Linux系统上的指令:
mount [-t 文件系统] [-L label名] [-o 额外选项] [-n] 设备文件名 挂载点
mount (不接参数):表示查看当前操作系统的挂载情况
-t:可以加上文件系统种类来指定欲挂载的类型,常见的Linux支持的类型有:ext2,ext3,vfat,reiserfs,iso9660(光盘格式)等;
-L:系统除了利用设备名之外,还可以利用文件系统的卷标名称来进行挂载,
-o:后面接一些挂载时需要额外加上的参数,比如账号,密码,读写权限
在实际使用中,简单使用:
mount 设备名 目录名
因为,几乎所有的文件系统都有自己的super block,Linux 系统可以通过分析super block搭配Linux自己的驱动程序去测试挂载,如果成功了,就自动使用该类型的文件系统挂载起来。
3.3磁盘重新挂载与卸载
整个目录树最重要的地方是根目录,根目录是不能被卸载的,但是如果你的挂载参数要改变或是根目录出现只读状态时,如何重新挂载?最可能的方式是重新启动。但是也可以通过以下命令解决:
mount -o remount,rw,auto/ :remount重新挂载命令
使用以下指令,可以将某个目录挂载到另一个目录中,而不是针对整个文件系统的挂载,类似于符号连接文件的使用,这种方法可以用于不支持符号连接的程序中:
mount --bind 待挂载目录 目标目录
使用以下指令,可以将设备文件卸载:
umount [-fn]设备文件名或者挂载点;
-f:强制卸载;
-n:不更新/etc/mtab的情况下卸载;
3.4开机挂载
前文介绍的mount挂载是一种手动挂载的方式,需要我们每次启动Linux系统时都去挂载一次,这也是前面提到的如果挂载出现问题可以重新启动系统的原因。除了这种方式我们还可以设置开机挂载,让系统自动在开机时进行挂载,这就涉及到/etc/fstab(file system table)文件,该文件记录了我们使用mount进行挂载时的所有参数。我们可以看一下该文件的具体内容:
该文件包含6个字段,各个字段的含义在图中已经进行了简要的说明,需要注意的是第四列文件系统参数,在前文介绍mount命令时有提到-o参数后可以设定的系统参数值,这些值具体包括以下部分:
第五列表示能否被dump备份命令作用:0表示不做dump备份,1代表要每天进行dump命令操作,2代表其他不定日期的dump备份工作,通常该数值不是0就是1。
3.5磁盘的分区、格式化、检验
如果我们想在系统中增加一块硬盘,大致需要经历那些操作呢?
- 对磁盘进行分区,以新建可用分区;
- 对该分区进行格式化,以创建系统可用的文件系统;
- 若想仔细一点,可对刚建好的文件系统进行检验;
- 在Linux系统上穿件挂载点,并将其挂载上来;
3.5.1磁盘分区 增删改查fdisk
fdisk [-l] 设备名称`:
-l:输出后面接的设备所有分区内容,若仅有fdisk -l时,则系统将会把整个系统内能够找到的设备的分区列出来。
fdisk 设备名称 :设置分区,该命令相当于一个小程序,执行之后可以根据提示选择指令实现分区的增删改查:
3.5.2磁盘格式化mkfs
mkfs也即是make file system,该命令会去调用正确的文件系统格式化工具软件。
mkfs [-t 文件系统格式] 设备文件名
-t:可以接文件的系统格式,可以是ext3,ext2,msdoc,vfat(用在Windows/Linux共享的U盘)。
使用mkfs进行格式化时,很多参数都是使用的系统默认值,比如文件系统的卷标,block大小,inode数量。使用mke2fs命令可以设定这些参数:
mke2fs [-b block大小] [-i inode大小] [-L 卷标] [-cj] 设备
-b:设置每个block的大小,目前支持1024,2048,4096bytes三种;
-i:多少容量给予一个inode;
-L:后面接卷标名称;
-j:该指令本来是将磁盘格式化为ext2文件系统,加入该参数journal而成为ext3;
-c:检查磁盘错误,仅下达一次-c时,会进行快速读取测试;
3.5.3磁盘检验fsck,badblocks
由于文件系统在运行的时候会有硬盘与内存数据异步的状况发生(因为文件系统不是实时将数据写入硬盘的),因此莫名其妙的死机,可能使得内存中的数据与硬盘中的数据不一致,会导致文件系统的紊乱,这种情况该如何补救呢?
使用fsck(file system check)命令,该指令可以帮助检查文件系统是否出错,
fsck [-aAN...] 设备名称
-a:自动修复文件系统,不询问任何问题;
-A:依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统;
-N:不执行指令,仅列出实际执行会进行的动作;
-P:当搭配"-A"参数使用时,则会同时检查所有的文件系统;
-r:采用互动模式,在执行修复时询问问题,让用户得以确认并决定处理方式;
-R:当搭配"-A"参数使用时,则会略过/目录的文件系统不予检查;
-s:依序执行检查作业,而非同时执行;
-t<文件系统类型>:指定要检查的文件系统类型;
-T:执行fsck指令时,不显示标题信息;
-V:显示指令执行过程。
需要注意的是该命令只能在文件系统被卸载的时候对其执行检查!
badblocks用来检查硬盘或者软盘扇区是否有坏轨的命令,同mke2fs -c 命令:
badblocks -[svw] 设备名称
-s:在屏幕上列出进度;
-v:可以在屏幕上看出进度;
-w:使用写入的方式来测试,建议不使用该参数;
该命令已经使用比较少了。
.