6.1 一切从“/”开始
在Windows操作系统中,想要找到一个文件,我们要依次进入该文件所在的磁盘分区(假设这里是D盘),然后在进入该分区下的具体目录,最终找到这个文件。但是在Linux系统中并不存在C/D/E/F等盘符,Linux系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(FHS-Filesystem Hierarchy Standard)采用树形结构来存放文件,以及定义了常见目录的用途。另外,Linux系统中的文件和目录名称是严格区分大小写的。例如,root、rOOt、Root、rooT均代表不同的目录,并且文件名称中不得包含斜杠(/)。Linux系统中的文件存储结构如图所示
在Linux系统中,最常见的目录以及所对应的存放内容如下表所示
PS:
bin表示二进制可执行文件。所有带bin的目录都是用于保存命令文件的。
proc,虚拟文件系统,不是一个真实的文件,而是将系统运行状态映射成一个目录的样子。
在Linux系统中路径的概念:路径指的是如何定位到某个文件,分为绝对路径与相对路径。绝对路径指的是从根目录(/)开始写起的文件或目录名称,而相对路径则指的是相对于当前路径的写法。
6.2 物理设备的命名规则
系统内核中的udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。Linux系统中常见的硬件设备的文件名称如下表所示。
PS:IDE设备很少见。一般的硬盘设备都会以"/dev/sd"开头,一台主机可以有多块硬盘,因此系统采用a~p来代表16快不同的硬盘,a-p是由系统内核的识别顺序来决定的。另外,硬盘的分区编号:主分区或扩展分区的编号1 ~4 ,逻辑分区的编号从5开始。分区的编号并不表示分区的个数,因为分区的数字编码不一定是强制顺延的,有可能是手工指定的。
硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用446字节,分区表为64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。第一个扇区中的数据信息如图所示。
第一个扇区最多只能创建出4个分区,为了解决分区个数不够的问题,可以将第一个扇区的分区表中16字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用16字节分区表空间的指针—一个指向另外一个分区的指针。这样一来,用户一般会选择使用3个主分区加1个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于4个)的需求。
所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。
6.3 文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统支持数十种的文件系统,而最常见的文件系统如下所示。
Ext3:RHEL5
Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统.
XFS:是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,最大可支持的存储容量为18EB
拿到了一块新的硬盘存储设备后,需要先分区,然后再格式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于需求和硬盘大小;也可以选择不进行分区,但是必须对硬盘进行格式化处理。
Linux系统中有一个名为super block的“硬盘地图”。Linux并不是把文件内容直接写入到这个“硬盘地图”里面,而是在里面记录着整个文件系统的信息。Linux只是把每个文件的权限与属性记录在inode中,而且每个文件占用一个独立的inode表格,该表格的大小默认为128字节,里面记录着如下信息:该文件的访问权限(read、write、execute);
该文件的所有者与所属组(owner、group);
该文件的大小(size);
该文件的创建或内容修改时间(ctime);
该文件的最后一次访问时间(atime);
该文件的修改时间(mtime);
文件的特殊权限(SUID、SGID、SBIT);
该文件的真实数据地址(point)。
文件的实际内容则保存在block块中(大小可以是1KB、2KB或4KB),一个inode的默认大小仅为128B(Ext3),记录一个block则消耗4B。当文件的inode被写满后,Linux系统会自动分配出一个block块,专门用于像inode那样记录其他block块的信息,这样把各个block块的内容串到一起,就能够让用户读到完整的文件内容了。对于存储文件内容的block块,有下面两种常见情况(以4KB的block大小为例进行说明)。
情况1:文件很小(1KB),但依然会占用一个block,因此会潜在地浪费3KB。
情况2:文件很大(5KB),那么会占用两个block(5KB-4KB后剩下的1KB也要占用一个block)。
为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。图6-5所示为VFS的架构示意图。从中可见,实际文件系统在VFS下隐藏了自己的特性和细节,这样用户在日常使用时会觉得“文件系统都是一样的”,也就可以随意使用各种命令在任何文件系统中进行各种操作了
6.4 挂载硬件设备
当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”。
挂载的目的:为了能够通过该目录去访问硬盘里的数据。
挂载的两种方式:
1,/etc/fstab文件用于设定挂载信息,若挂载后将信息写入该文件中,则该挂载会永久生效
2,使用mount命令进行挂载,则该挂载当前生效,重启后会失效
6.4.1 mount命令
mount命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”。mount命令中可用的参数及作用如表所示。
例如,要把设备/dev/sdb2挂载到/backup目录,只需要在mount命令中填写设备与挂载目录参数就行,系统会自动去判断要挂载文件的类型,因此只需要执行下述命令即可:
[root@linuxprobe ~]# mount /dev/sdb2 /backup
如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”(各字段的意义见下表)写入到/etc/fstab文件中。
6.4.2 umount命令
umount命令用于撤销已经挂载的设备文件,格式为“umount [挂载点/设备文件]”
卸载操作只需要说明想要取消关联的设备文件或挂载目录的其中一项即可,一般不需要加其他额外的参数。
举例如下:
6.5 添加硬盘设备–分区–格式化–挂载
添加硬盘:
分区:
在Linux系统中,管理硬盘设备最常用的方法就当属fdisk命令了。fdisk命令用于管理磁盘分区,格式为“fdisk [磁盘名称]”,它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。不过与前面讲解的直接写到命令后面的参数不同,这条命令的参数(见表)是交互式的,因此在管理硬盘设备时特别方便,可以根据需求动态调整。
在上述步骤执行完毕之后,Linux系统会自动把这个硬盘主分区抽象成/dev/sdb1设备文件。我们可以使用file命令查看该文件的属性,但是有些时候系统并没有自动把分区信息同步给Linux内核,而且这种情况似乎还比较常见(但不能算作是严重的bug)。我们可以输入partprobe命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机。
格式化:
如果硬件存储设备没有进行格式化,则Linux系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在Linux系统中用于格式化操作的命令是mkfs。这条命令很有意思,因为在Shell终端中输入mkfs名后再敲击两下用于补齐命令的Tab键,会有如下所示的效果:
挂载:
首先是创建一个用于挂载设备的挂载点目录;然后使用mount命令将存储设备与挂载点进行关联;最后使用df -h命令来查看挂载状态和硬盘使用量信息。
至此,挂载当前生效,重启后会失效。所以还需要编辑/etc/fstab文件,使得该挂载永久生效。