Linux磁盘系统——磁盘系统简介
linux磁盘系统——磁盘系统简介
摘要:本文主要学习了linux系统中有关磁盘的一些知识。
文件系统
说明
硬盘是用来存储数据的,可以将其想象成柜子,只不过柜子是用来存储衣物的。新买来的硬盘,通常要对其进行分区并格式化。分区就如同把一个大柜按照要求分割成几个小柜子。格式化就好比在每个小柜子中打入隔断,决定每个隔断的大小和位置,然后在柜门上贴上标签,标签中写清楚每件衣服保存的隔断的位置和这件衣服的一些特性。
在格式化的过程中会向硬盘中写入文件系统。因为不同的操作系统,管理文件的方式也不尽相同(给文件设定的属性和权限也不完全一样),因此,为了使硬盘有效存放当前系统中的文件数据,就需要将硬盘进行格式化,令其使用和操作系统一样(或接近)的文件系统格式。
不同的文件系统,其运作模式和操作系统的文件数据有关。
虚拟文件系统
文件系统指文件存在的物理空间。在linux系统中,每个分区都是一个文件系统,都有自己的目录层次结构。
linux的最重要特征之一就是支持多种文件系统,这样它更加灵活,并可以和许多其它种操作系统共存。
virtual file system(虚拟文件系统)使得linux可以支持多个不同的文件系统,由于系统已将linux文件系统的所有细节进行了转换,所以linux核心的其它部分及系统中运行的程序将看到统一的文件系统。
linux的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统,虚拟文件系统是为linux用户提供快速且高效的文件访问服务而设计的。
文件系统类型
minix:在minix操作系统上使用的文件系统,linux上运行的第一种文件系统。它有很多限制:64m分区大小限制,短文件名,唯一时间戳等等。只有软盘或者ram中可能用的到。
ext:minix文件系统的复杂扩展,linux中最早的文件系统,由于在性能和兼容性上具有很多缺陷,已经被ext2文件系统完全取代。
ext2:是ext文件系统的扩展,可以给linux的文件系统提供最佳支持(主要是速度和cpu使用上),支持最大16tb的分区和最大2tb的文件。
ext3:是ext2文件系统的扩展,最大的区别就是带日志功能,以便在系统突然停止时提高文件系统的可靠性,支持最大16tb的分区和最大2tb的文件。
ext4:是ext3文件系统的扩展。ext4在性能、伸缩性和可靠性方面进行了大量改进,支持最大1eb文件系统和16tb文件、无限数量子目录、extents连续数据块的概念、快速fsck、日志校验、无日志模式、等。它是centos 6的默认文件系统。
xfs:xfs是一个64位文件系统,最大支持8eb减1字节的单个文件系统,实际部署时取决于宿主操作系统的最大块限制。对于一个32位linux系统,文件和文件系统的大小会被限制在16tb。它是centos 6的默认文件系统。
swap:swap是linux中用于交换分区的文件系统(类似于windows中的虚拟内存),当内存不够用时,使用交换分区暂时替代内存。一般大小为内存的2倍,但是不要超过2gb。它是linux的必需分区。
nfs:nfs是网络文件系统(network file system)的缩写,是用来实现不同主机之间文件共享的一种网络服务,本地主机可以通过挂载的方式使用远程共享的资源。
iso9660:光盘的标准文件系统。linux要想使用光盘,必须支持iso9660文件系统。
fat:就是windows下的fatl6文件系统,在linux中识别为fat。
vfat:就是windows下的fat32文件系统,在linux中识别为vfat。支持最大32gb的分区和最大4gb的文件。
ntfs:就是windows下的ntfs文件系统,不过linux默认是不能识别ntfs文件系统的,如果需要识别,则需要重新编译内核才能支持。它比fat32文件系统更加安全,速度更快,支持最大2tb的分区和最大64gb的文件。
ufs:sun公司的操作系统solaris和sunos所采用的文件系统。
proc:linux中基于内存的虚拟文件系统,用来管理内存存储目录/proc。
sysfs:和proc一样,也是基于内存的虚拟文件系统,用来管理内存存储目录/sysfs。
tmpfs:也是一种基于内存的虚拟文件系统,不过也可以使用swap交换分区。
硬盘分区
含义
磁碟的组成主要有磁碟盘、机械手臂、磁碟读取头与主轴马达所组成,而资料的写入其实是在磁碟盘上面。磁碟盘上面又可细分出磁区(sector)与磁轨(track)两种单位,其中磁区的物理量设计有两种大小,分别是512b与4kb。
整个磁碟的第一个磁区特别的重要,因为他记录了整颗磁碟的重要数据。早期磁碟使用的分割格式称为mbr(master boot record)格式,但是由于近年来磁碟的容量不断扩大,造成读写上的一些困扰,甚至有些大于2tb以上的磁碟分割已经让某些作业系统无法存取,因此后来又多了一个新的磁碟分割格式,称为gpt(guid partition table)。
分区格式
1)mbr
早期的linux系统为了兼容于windows的磁碟,因此使用的是支持windows的mbr(master boot record)的方式来处理开机管理程序和分割表。而开机管理程序纪录区与分割表则通通放在磁碟的第一个磁区,这个磁区通常是512b的大小(旧的磁碟磁区都是512b),所以说,第一个磁区512b会有这两个数据:
主要开机记录(master boot record,mbr):可以安装开机管理程序的地方,有446b。
分割表(partition table):记录整颗硬碟分割的状态,有64b。
由于分割表所在区块仅有64b容量,因此最多仅能有四组分区,每组分区记录了该区段的启始与结束的磁柱号码,可以通过扩展分区的方式增加分区的个数。
一个磁盘最多只能有一个扩展分区,扩展分区不能够格式化,里面可以分出逻辑分区。逻辑分区的区号从sda4开始,前面3个分区是保留给主分区使用的,第4个分区sda4代表扩展分区。
2)gpt
因为最新的磁盘的扇区有可能为4k,因此gpt为了和mbr相兼容,使用了逻辑区块位址(logical block address,lba)来代替扇区,gpt将磁碟所有区块以此lba(预设为512b)来规划,第一个lba称为lba0(从0开始编号)。
lba0中446字节存储开机管理程序,而在原本的分割表的纪录区内,仅放入一个特殊标志的分割,用来表示此磁碟为gpt格式。
lba1纪录了分割表本身的位置与大小,同时纪录了备份用的lba区块放置的位置。
在lba2区块到lba33区块,每个lba可以记录四个分区信息,因此可以记录32*4=128个分区信息。每个lba为512b,因此每个分区使用128b来记录,用64b来记录分区的起始或结束lba,因此一个分区理论最大为2^64*512b=2^33tb。
开机流程中的开机检测程式
基本上,目前的主机系统在载入硬体驱动方面的程序,主要有早期的bios与新的uefi两种机制。
1)bios
bios是一个写入到主机板上的一个程序,是开机时电脑系统会主动执行的第一个程序。
接下来bios会去分析电脑里面有哪些储存设备,我们以硬碟为例,bios会依据使用者的设定去取得能够开机的硬碟,并且到该硬碟里面去读取第一个磁区的mbr位置。mbr这个仅有446b的硬碟容量里面会放置最基本的开机管理程序,此时bios就功成圆满,而接下来就是mbr内的开机管理程序的工作了。
2)uefi
如果你的分割表为gpt格式的话,那么bios也能够从lba0的区块读取第一阶段的开机管理程序码。如果你的开机管理程序能够认识gpt的话,那么使用bios同样可以读取到正确的作业系统核心。
换句话说,如果开机管理程序不懂gpt,那自然就无法读取核心档案,开机就失败了。
由于lba0仅提供第一阶段的开机管理程序,因此如果你使用类似grub的开机管理程序的话,那么就得要额外分出一个bios boot的分割槽,这个分割槽能够放置其他开机过程所需的程序。在centos当中,这个分割槽通常占用2mb左右而已。
为了解决这个问题,因此就有了uefi(unified extensible firmware interface)这个统一可延伸程序界面的产生。uefi直接从预启动的操作环境加载操作系统,简化开机过程有效提高启动速度。
另外,与bios模式相比,虽然uefi可以直接取得gpt的分割表,不过最好依旧拥有bios boot的分割槽支援。同时,为了与windows兼容,并且提供其他第三方厂商所使用的uefi应用程式储存的空间,你必须要格式化一个vfat的档案系统,大约提供512mb到1g左右的容量,以让其他uefi执行较为方便。
硬盘分区的好处
1)方便管理和控制
首先,可以将系统中的数据(也包括程序)按不同的应用分成几类,之后将这些不同类型的数据分别存放在不同的磁盘分区中。由于在每个分区上存放的都是类似的数据或程序,这样管理和维护就简单多了。
2)提高系统的效率
给硬盘分区,可以直接缩短系统读写磁盘时磁头移动的距离,也就是说,缩小了磁头搜寻的范围;反之,如果不使用分区,每次在硬盘上搜寻信息时可能要搜寻整个硬盘,所以速度会很慢。另外,硬盘分区也可以减轻碎片(文件不连续存放)所造成的系统效率下降的问题。
3)使用磁盘配额的功能限制用户使用的磁盘量
由于限制用户使用磁盘配额的功能,只能在分区一级上使用,所以,为了限制用户使用磁盘的总量,防止用户浪费磁盘空间(甚至将磁盘空间耗光),最好将磁盘先分区,然后在分配给一般用户。
4)便于备份和恢复
硬盘分区后,就可以只对所需的分区进行备份和恢复操作,这样的话,备份和恢复的数据量会大大地下降,而且也更简单和方便。
挂载硬件设备
为什么要挂载
linux系统中“一切皆文件”,所有文件都放置在以根目录为树根的树形目录结构中。在linux看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。
因此产生的问题是,当在linux系统中使用这些硬件设备时,只有将linux本身的文件目录与硬件设备的文件目录合二为一,硬件设备才能为我们所用。合二为一的过程称为“挂载”。如果不挂载,通过linux系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到。
什么是挂载
挂载,指的就是将设备文件中的*目录连接到linux根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录。linux系统使用任何硬件设备,都必须将设备文件与已有目录文件进行挂载。
根目录下的/dev/目录文件负责所有的硬件设备文件,事实上,当u盘插入linux后,系统也确实会给u盘分配一个目录文件,就位于/dev/目录下,但无法通过目录文件直接访问u盘数据,访问此目录只会提供给你此设备的一些基本信息(比如容量)。