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盘数据,访问此目录只会提供给你此设备的一些基本信息(比如容量)。