1 Linux文件系统的层次结构
目录相当于Windows中的文件夹,目录存放的既可以是文件,可可以是其他的子目录,而文件中存储的是真正的信息。
文件系统的最顶层是由根目录开始的,系统用”/“来表示根目录,在根目录下既可以是目录,也可以是文件,而每一个目录中又可以包含(子)目录和文件。如此反复就构成了一个庞大的文件系统。
其实,使用这种树状、具有层次的文件结构主要目的是方便文件系统的管理和维护,想象一下,如果所有的文件都放在一个目录下,其文件系统的管理和维护将变成一个噩梦。
注意,目录名或文件名都是区分大小写的,如dog、DOG、Dog是3个不同的目录或文件。完整的目录或文件路径都是一连串的目录名所组成的,其中,每一个目录由”/“来分隔。如cat的完整路径是/home/cat。
在文件系统中,有两个特殊的目录:
- 用户所在的工作目录,即当前目录,可用一个”.“来表示
- 当前目录的上一层目录,即父目录,用两个”.“表示
如果一个目录或文件名是以一个点开始,就表示这个目录或文件是一个隐藏目录或文件。即以默认方式查找时,不显示该目录或文件。
至于为什么会有隐藏文件,原因如下:
- 防止意外删除
- 一般是不需要你改动的文件
- 属于系统文件
为了方便管理和维护,Linux系统采用了文件系统层次标准,也称为FHS标准,这在上章做了详细介绍。
2 Linux中绝对路径和相对路径
指明一个文件存放的位置,有2种方法,分别是使用绝对路径和相对路径。
绝对路径一定是由根目录/开始写起。例如,使用绝对路径的表示方法指明bin文件所在位置。
可以看到,如果仅传递给Linux系统一个文件名,它无法找到指定文件;而将bin文件的绝对路径传递给Linux系统时,它就可以找到。
和绝对路径不同,相对路径不是从根目录开始的,而是从当前目录开始写起。使用相对路径表明某文件的存储位置时,经常会用到前面讲到的2个特殊目录,即当前目录(”.“表示)和父目录(用”…“表示)。
总之,绝对路径是相对于根目录(/)的,只要文件不移动位置,那么它的绝对路径就是恒定不变的;而相对路径是相对于当前目录的,随着程序的执行,当前所在目录可能会改变,因此文件的相对路径不是恒定不变的。
3 Linux文件(目录)命名规则
在Linux系统中,一切都是文件,既然是文件,那么必须要有文件名。同其他系统相比,Linux操作系统对文件或目录命名的要求比较宽松。
在Linux系统中,文件和目录的命名规则如下:
- 除了字符”/“之外,所有的字符都可以使用,但是要注意,在目录名和文件名中,使用某些特殊字符并不是明智之举。例如,在命名时应避免使用<、>、?、*和非打印字符等。如果一个文件包含了特殊字符,例如空格,那么在访问这个文件的时候就需要使用括号将文件名括起来。
- 目录名和文件名的长度不能超过255个字符。
- 目录名和文件名是区分大小写的。如Dog、DOG、doG,是不同的目录名或文件名,但使用字符大小写来区分不同文件或目录,也是不理智的。
- 与Windows系统不同,文件的扩展名对Linux操作系统没有特殊的意义,换句话说,==Linux系统并不以文件的扩展名来区分文件类型。==例如,dog.exe只是一个文件,其扩展名.exe并不代表此文件就一定是可执行文件。
需要注意的是,在Linux系统种,硬件设备也是文件,也有各自的文件名称。在Linux系统内核中的udev设备管理器会自动对硬件设备的名称进行规范,目的是让用户通过设备文件的名称,就可以大致猜测出设备的属性以及相关信息。
常见的硬件设备名称。
- IDE设备
/dev/hd[a-d],现在的IDE设备已经很少见了,因此一般的硬盘设备会以/dev/sd开头。 - SCSI/SATA/U盘
/dev/sd[a-p],一台主机可以有多块硬盘,因此系统采用a~p代表16块不同的硬盘。 - 软驱
/dev/fd[0-1] - 打印机
/dev/ld[0-15] - 光驱
/dev/cdrom - 鼠标
/dev/mouse - 磁带机
/dev/st0 或 /dev/ht0
4 Linux命令行下,如何识别文件类型?
4.1 颜色区分
一般情况下,Linux可以用不同颜色来区分不同种类的文件:
- 蓝色代表目录
- 其它颜色代表文件
- 绿色代表可执行文件
- 红色代表压缩文件
- 浅绿色代表链接文件
- 白色代表其它文件
- 黄色代表设备文件
但是不同颜色所代表的文件类型并不一定是这样,更准确的对应方式还取决于配置文件 /etc/DIR_COLORS中的规定。因此,如果想了解不同文件类型所对应的颜色,可以使用man命令,
例如
man dir_colors
注意,有些Linux发行版单独使用ls命令,无法显示出带有不同颜色的文件和目录,此时就需要使用
ls -color=auto
命令,明确使其使用颜色来区分文件类型
4.2 ls 命令
通过ls-l命令,我们就可以查看到当前目录下所有文件和目录各自的属性,在显示的执行结构中,每行代表一个文件或目录,其中第一个字符代表的就是文件的类型,其可能的取值及表示的文件类型如下所示:
- -普通文件,包括纯文本文件、二进制文件、各种压缩文件等。
- d 目录,类似 Windows 系统中的文件夹。
- b 块设备文件,就是保存大块数据的设备,比如最常见的硬盘。
- c 字符设备文件,例如键盘、鼠标等。
- s 套接字文件,通常用在网络数据连接,可以启动一个程序开监听用户的要求,用户可以通过套接字进行数据通信。
- p 管道文件,其主要作用是解决多个程序同时存取一个文件所造成的错误。
- l 链接文件,类似 Windows 系统中的快捷方式。
4.3 file 命令
file + 文件名
5 Linux命令的基本形式
本节开始,我们不会再见到图形界面了,因为对服务器来讲,图形界面会占用更多的系统资源,而且会安装更多的服务、开放更多的端口,这对服务器的稳定性和安全性都有负面影响。其实,服务器是连一个连显示器都没有的家伙,要图形界面干什么?
说到这里,很多人会开始崩溃。经常抱怨Linux是落后于时代的老古董,但是,我们要理解,对于服务器来讲,稳定性,可靠性,安全性才是最重要的。而简单易懂并不是服务器需要考虑的事情,所以学习Linux,这些枯燥的命令是必须学习和记忆的内容。
5.1 命令提示符
登录系统后,第一眼看到的内容是:
[chen@localost~]$
这就是Linux系统的命令提示符。那么,这个提示符的含义是什么呢?
- []。这是提示符的分隔符号,没有特殊含义
- chen。显示的是当前的登录用户,笔者现在使用的是chen用户登录
- @。分隔符号,没有特殊含义
- localhost。当前系统的简写主机名(完整主机名是localhost.localdomain)
- ~。代表当前用户所在的目录。
- #。命令提示符,Linux用这个符号标识登录的用户权限等级。如果是超级用户,提示符就是#;如果是普通用户,提示符就是$。
Linux系统是纯字符界面,用户登录后,需要有一个初始登录的位置,这个初始登录位置就称为用户的家,家目录。
- 超级用户的家目录:/root
- 普通用户的家目录:/home/用户名
用户在自己的家目录中拥有完整的权限,所以我们也建议操作实验可以放在家目录中进行。我们切换一下用户所在目录,看看有什么效果。
[chen@localhost bin]$ cd/
[chen@localhost /]$ cd/usr
仔细看,如果切换用户所在目录,那么命令提示符中就会变成用户当前所在目录的最后一个目录(不显示完整的所在目录,只显示最后一个目录)
5.2 命令的基本格式
接下来看看Linux命令的基本格式:
[chen@localhost~]$ 命令[选项][参数]
命令的选项用于调整命令功能;命令的参数是这个命令的操作对象。
6 Linux cd命令:切换目录
cd命令,是Change Directory的缩写,用来切换工作目录。
Linux命令按照来源方式,可分为两种,分别是Shell内置命令和外部命令。所谓Shell内置命令,就是Shell自带的命令,这些命令是没有执行文件的;而外部命令就是程序员单独开发的,所以会有命令的执行文件。Linux中的绝大多数命令都是外部命令,而cd命令是一个典型的Shell内置命令,所以cd命令没有执行文件所在路径。
cd命令的基本格式如下:
[chen@localhost ~]$ cd[相对路径或绝对路径]
除此之外,cd命令后面还可以跟一些特殊字符,表达固定的含义,如下所示:
特殊符号 | 作用 |
---|---|
~ | 代表当前登录用户的主目录 |
~用户名 | 表示切换至指定用户的主目录 |
- | 代表上次所在目录 |
. | 代表当前目录 |
… | 代表上级目录 |
7 Linux pwd命令:显示当前路径
由于Linux文件系统中有很多目录,当用户执行一条Linux命令又没有指定该命令或参数所在的目录时,Linux系统就会首先在当前目录搜寻这个命令或它的参数。因此,用户在执行命令前,常常需要确定目前所在的工作目录,即当前目录。
pwd命令,全称Print Working Directory(打印工作目录)的缩写,功能是显示用户当前所处的工作目录。
pwd命令的基本格式为:
[chen@localhost~]$ pwd
我们知道,不同的目录中,目录名是可以重复的,因此,仅通过[chen@localhost home]中的home,根本无法确定其所在的具体位置,而使用pwd命令,可以输出当前所在目录的完整路径。
8 Linux ls命令:查看目录下文件
通过学习cd和pwd命令,相信可以在庞大的Linux文件系统中,随心所欲地游荡并确定自己所在的位置了。本节继续学习,如何知道某目录中存放了哪些文件和子目录。
ls命令,是list的缩写,是最常见的目录操作命令,其主要功能是显示当前目录下的内容。
ls命令的基本格式是:
[chen@localhost~]$ ls[选项] 目录名称
下表给出了ls命令常用的选项以及各个的功能
选项 | 功能 |
---|---|
-a | 显示全部的文件,包括隐藏文件(开头为 . 的文件) |
–A | 显示全部的文件,连通隐藏文件,但不包括.与…这两个目录 |
-d | 仅列出目录本身,而不是列出目录内的文件数据 |
-f | ls默认会以文件名排序,使用-f选项会直接列出结果,而不进行排序 |
-F | 在文件或目录后面加上文件类型的指示符号,例如,*表示可运行文件,/表示目录,=表示socket文件 |
-h | 以人们易读的形式显示文件或目录大小,如1KB、234MB等 |
-i | 显示inode节点信息 |
-l | 使用长格式列出文件和目录信息 |
-n | 以UID和GID分别代替文件用户名和群组名显示出来 |
-r | 将排序结果反向输出,比如,若原文件名由小到大,反向则由大到小 |
-R | 连同子目录一起列出来 |
-S | 以文件容量大小排序,而不是以文件名 |
-t | 以时间排序,而不是以文件名 |
–color=never | 表示不依据文件特性给予颜色显示 |
–color=always | 表示显示颜色,ls默认采用这种方式 |
–color=auto | 让系统自行依据配置文件来判断是否给予颜色 |
–full-time | 以完整时间模式(包含年月日时分)输出 |
–time=(atime,ctime) | 输出access时间或改变权限属性时间(ctime),而不是内容变更时间 |
注意,当ls命令不使用任何选项时,默认只会显示非隐藏文件的名称,并以文件名排序,同时会根据文件的具体类型给文件名配色。除此之外,如果想使用ls命令显示更多内容,就需要使用相应选项。
通常使用-a,你会看到以.为开头的几个文件,以及目录文件(.)、(…)等,这些都是隐藏的文件。其中,目录文件以蓝色显示,一般文件以白色显示。
注意,Linux系统中,隐藏文件并不是为了把文件隐藏起来不让其他用户找到,而是为了告诉用户这些文件都是重要的系统文件,如非必要,请不要乱动!所以不论是Linux还是Windows都可以非常简单地查看隐藏文件,只是在Windows中绝大多数的病毒和木马都会把自己变成隐藏文件,给用户带来了错觉,以为隐藏文件是为了不让用户发现。
不仅如此,这里的ls命令还使用了-l选项,因此才显示了文件的详细信息,此选项显示的这7列的含义分别是:
- 第1列:规定了不同用户对文件所拥有的权限。
- 第2列:引用计数,文件的引用计数代表该文件的硬链接个数,而目录的引用计数代表该目录有几个一级子目录。
- 第3列:所有者,也就是这个文件属于哪个用户。默认所有者是文件的建立用户。
- 第4列:所属组,默认所属组是文件建立用户的有效组,一般情况下就是建立用户的所在组。
- 第5列:大小,默认单位是字节。
- 第6列:文件修改时间,文件状态修改时间或文件数据修改时间都会更改这个时间,注意这个时间不是文件的创建时间。
- 第7列:文件名或目录名。
9 Linux mkdir命令:创建空目录
mkdir命令,是Make Directories的缩写,用于创建新目录,此命令所有用户都可以使用。
mkdir命令的基本格式为:
[chen@localhost~]$ mkdir [-mp] 目录名
- -m 选项用于手动配置所创建目录的权限,而不再使用默认权限
- -p 选项递归创建所有目录,以创建/home/test/demo为例,在默认情况下,你需要一层一层的创建各个目录,而使用-p选项,则系统会帮你创建/home,/home/test以及/home/test/demo
【例1】创建目录
我们建立了一个名为cangls的目录,通过ls命令可以查看到这个目录已经建立。注意,我们在建立目录的时候使用的是相对路径,所以这个目录被建立在当前目录下。
【例2】使用-p选项递归建立目录
10 Linux rmdir命令:删除空目录
和mkdir命令(建立空目录)恰好相反,rmdir(remove empty directories的缩写)用于删除空目录。
redir命令的基本格式为:
[chen@localhost ~]$ rmdir [-p] 目录名
-p选项用于递归删除空目录
【例1】
就是这么简单,命令后面加目录名称即可,但命令执行成功与否,取决于要删除目录是否是空目录,因为rmdir命令只能删除空目录。
【例2】
mkdir -p可以递归创建目录,同样,rmdir -p 可以递归删除空目录
这个命令比较”笨“,所以不常用。
11 Linux touch命令:创建文件及修改文件时间戳
既然知道了如何在Linux系统中创建目录,接下来你可能会想在这些目录中创建一些文件,可以使用touch命令。
主要注意的是,touch命令不光可以用来创建文件(当指定操作文件不存在时,该命令会在当前位置创建一个空文件夹),此命令更为重要的功能是修改文件的时间参数(当文件存在时,会修改文件的时间参数)
Linux系统中,每个文件主要有3个时间参数(通过stat命令进行查看),分别是文件的访问时间、数据修改时间、状态修改时间。
- 访问时间(access time 简称atime):只要文件内容被读取,访问时间就会改变。例如,使用cat命令可以查看文件的内容,此时文件的访问时间就会改变。
- 数据修改时间(modify time简称mtime):当文件的内容数据发生改变,此文件的数据修改时间就会跟着相应改变。
- 状态修改时间(change time 简称ctime):当文件的状态发生改变,就会相应的改变这个时间。比如说,如果文件的权限或属性发生改变,此时间就会相应改变。
touch命令的基本格式如下:
[chen@localhost~]$ touch[选项]文件名
- -a:只修改文件的访问时间;
- -m:只修改文件的数据修改时间;
- -c:仅修改文件的时间参数(3个时间参数都改变),如果文件不存在,则不建立新文件;
- -d:后面可以跟预修订的日期,而不是用当前的日期,即把文件的atime和mtime时间改为指定的时间;过去时间。
- -t:命令后面可以跟预修订的时间,而不是用当前的时间;将来时间;时间书写格式为CCYYMMDDhhmm
可以看到,touch命令可以只修改文件的访问时间,也可以只修改文件的数据修改时间,但是不能只修改文件的状态修改时间。因为,不论是修改访问时间,还是修改文件的数据时间,对文件来讲,文件的状态都会发生改变,即状态修改时间会随之改变(更新为操作当前文件的真正时间)
【例1】 touch命令建立文件
【例2】在例1的基础上修改文件的访问时间和数据修改时间
如果touch命令不加任何选项,文件的访问时间和数据修改时间都会变为当前系统时间。
【例3】仅修改文件的访问时间
touch -a 命令,仅会修改访问时间和状态修改时间。
【例4】仅修改文件的数据修改时间
touch -m命令,仅会修改数据修改时间和状态修改时间。
【例5】修改文件时间为将来时间
12 Linux文件系统
12.1 磁盘结构
设备类型:
- 块设备(block):存取单位”块“,磁盘;
- 字符设备(char):存取单位”字符“,键盘。
硬盘分为机械硬盘和固态硬盘两种。要想知道硬盘是如何存储数据的,就先明白硬盘的物理结构。
【名称】
机械硬盘,由于信息载体为磁性物质,故又称为磁盘
【硬盘主要结构】
在硬盘盒里面其实是由许许多多的圆形盘片,机械手臂,磁头和主轴马达组成的。
【工作情形】
实际的数据都是写在具有磁性物质的盘片上,而读写主要是通过机械手臂上的磁头来达成。实际运行时,主轴马达让盘片转动,然后机械手臂可伸展让磁头在盘片上头进行读写的动作。
【部件说明】
- 盘片和主轴马达
主轴马达就是一个小电机,作用是让盘片转起来。通常数据写入是以圆圈转圈的方式读写。对于机械键盘,最重要的结构是这些两面都涂有磁性材料的盘片,在工作时会以每分钟7200转的速度旋转。
盘片的作用是记录数据,在盘片上有序的排列了很多小的颗粒材料,它们都是磁性物质,可以被永久磁化和改变磁极,这两个磁极就分别表示计算机二进制中的0和1。
由于盘片是先转动后读写数据的,所以,当初设计就是在类似盘片同心圆上面切出来一个一个的小区块,这些小区块整合成一个圆形,让机械手臂的磁头去读取。这些小区块就是磁盘的最小物理存储单元,称之为扇区(sector),那同一个同心圆的扇区组合成的圆就是所谓的磁道(track)。
扇区容量:原本硬盘的扇区都是设计成512Byte(0.5KB)的容量,但是因为近期以来硬盘的容量越来越大,为了减少数据的拆解,所以新的大容量硬盘已经有4KByte(4KB)的扇区设计。
由于单一盘片的容量有限,因此有的硬盘内部会有两个以上的盘片。由于磁盘里面可能有多个盘片,因此在所有盘片上面的同一个磁道可以组合成所谓的柱面(cylinder)
数据存储在盘片上的一个个扇区中。
1) 一个扇区(磁道)可存储512Bytes的数据量
2)一个平面中同一半径下的多个扇区共同组成了1个磁道;
3)一个盘片有2个盘面,每个盘片都对应一个磁头,负责读写数据;
4)一个硬盘可以有多个盘面;
5) 同一半径下的多个磁道组成了1个柱面。 - 磁头和机械臂
机械臂的作用是控制来回磁头移动。
磁头的作用是在盘片上读写数据。磁头通过改变盘片上的小颗粒磁性物质的磁极方向来完成写入数据的功能,通过感知盘片上磁性物质的磁极方向来完成读取数据的功能。
【扇区中是如何表示01数据的】
硬盘是在硬质盘片(一般是铝合金,以前 IBM 也尝试过使用玻璃)上涂敷薄薄的一层铁磁性材料。这些磁粉被划分成称为磁道的若干个同心圆,在每个同心圆的磁道上就好像有无数的任 意排列的小磁铁,它们分别代表着0和1的状态。当这些小磁铁受到来自磁头的磁力影响时,其排列的方向会随之改变。利用磁头的磁力控制指定的一些小磁铁方 向,使每个小磁铁都可以用来储存信息。
写入时,磁头线圈上加电,在周围产生磁场,磁化其下的磁性材料;电流的方向不同,所以磁场的方向也不同,可以表示 0 和 1 的区别。
读取时,磁头线圈切割磁场线产生感应电流,磁性材料的磁场方向不同,所以产生的感应电流方向也不同。
【固态硬盘的存储原理(微观)】
接下来来讲固态硬盘,相比较于机械硬盘里面的各种机械结构,固态硬盘就没有太多的机械机构;它主要是靠FLASH芯片来作为储存数据的介质;由主控芯片来承担数据的中转,还有调配数据储存在闪存芯片上面
FLASH芯片储存数据的方式也不是太难理解,就是FLASH芯片里面分出了很多储存单元,这些储存单元里面有电子的位置;当一颗电子的位置里面没有存放电子,它就是0;如果存放了电子,它就是1
参考文献网址:https://www.cnblogs.com/andy9468/p/11091115.html
12.2 磁盘分区
【如何使用分区空间】
① 设备识别
② 设备分区
③ 文件系统类型格式化
④ 在/etc/fstab 文件中创建条目
⑤ mount 挂载新的文件系统
【为什么分区】
① 优化I/O 性能
② 实现磁盘空间配额限制
③ 提高修复速度
④ 隔离系统和程序
⑤ 安装多个OS
⑥ 采用不同文件系统
【分区介绍】
硬盘分区实质上是对硬盘的一种格式化,然后才能使用硬盘保存各种信息。创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即Master Boot Record,一般简称为MBR)和引导记录备份的存放位置。而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过之后的高级格式化,即Format命令来实现。 其实完全可以只创建一个分区使用全部或部分的硬盘空间。但不论划分了多少个分区,也不论使用的是SCSI硬盘还是IDE硬盘,必须把硬盘的主分区设定为活动分区,才能够通过硬盘启动系统。
磁盘分区是使用分区编辑器(partition editor)在磁盘上划分几个逻辑部分,盘片一旦划分成数个分区,不同类的目录与文件可以存储进不同的分区。越多分区,也就有更多不同的地方,可以将文件的性质区分得更细,按照更为细分的性质,存储在不同的地方以管理文件;但太多分区就成了麻烦。空间管理、访问许可与目录搜索的方式,依属于安装在分区上的文件系统。当改变大小的能力依属于安装在分区上的文件系统时,需要谨慎地考虑分区的大小。
磁盘分区可做看作是逻辑卷管理前身的一项简单技术。
先要说硬盘中最最重要的第一扇区,因为整块硬盘的重要信息都在这里:
MBR(Master Boot Record主启动记录):开机引导程序就在安装在此,占用446byte
DPT(Disk Partition table硬盘分区表):记录硬盘上的分区元信息,占用64byte
MBR是如何工作的呢,不用深究,反正就是系统开始时会主动读取数据的地方,这样才能引导进行操作系统的启动;DPT要仔细的讲讲,分区的大致意思就如同抢地盘,不过人家比较规矩,按照==柱面(最小的分区单位)==分配,比如第一个分区从柱面1-200,第二个分区201-500,但三个分区501-1000…(省略并非可以无限分配下去哦)
为啥说不能一直分配下去呢,技术柱面数量足够,因为上面说到硬盘分区表只有64个字节,每条分区记录需要占用16字节,最多只能分4个。
其实我说的4个分区是所谓的主分区,为了能支持很多分区引入了扩展分区的概念,也就是说,可以使用DPT中一条记录来记录扩展分区的信息,然后在扩展分区中再继续划分逻辑分区,而逻辑分区的分区信息则记录在扩展分区的第一个扇区中,如此则可以像链表一样划分出很多分区来。但注意,一个分区表中可以有1~4条主分区,但是最多只能有1个扩展分区。
分区表之间是如何关联的,详细讲一下,分区表是一个单向链表,第一个分区表,也就是位于硬盘第一个扇区中的DPT,可以有一项记录扩展分区的起始位置柱面,类似于指针的概念,指向扩展分区,根据这项记录我们可以找到扩展分区的某柱面0磁头1扇区(CHS),而这个扇区中又存放了第二个分区表,第二个分区表第一项记录一般表述了当前所在的逻辑分区的起始/终止柱面,第二项记录表述了下一个逻辑分区所在的0磁头1扇区(CHS),第三、第四项记录不存任何信息。
【分区后的系统启动】
之前提到MBR中安装的引导加载程序,他的作用是什么?
①提供开机菜单选项:可以供用户选择启动哪个操作系统,这是多重引导功能。
②加载操作系统内核:每个操作系统都有自己的内核,需要引导程序来加载
③转交给其他引导程序:可以将工作移交给其他引导程序来进行上述操作。
其实引导加载程序除了可以安装在MBR中,还可以直接安装在每个分区的引导扇区(DBR)中,注意下,每个分区(主分区、逻辑分区)都有一个自己的启动扇区,专门用来安装引导加载程序。
【系统启动过程】
①首先,BIOS启动后,读取硬盘第一个扇区MBR中的引导加载程序(可能是windows或者linux的grub)
②MBR中的引导程序提供开机菜单,你可以选择1)直接加载windows内核2)将工作转交给windows分区内的引导扇区中的加载程序,让他自己去加载内核3)转交给linux分区内引导扇区,让他去加载linux.
③根据用户选择的选项和引导加载程序中记录的分区,到分区表找对应的分区柱面号等分区信息,启动内核或者分区加载程序。
Window安装时默认会自动将MBR和windows所在分区的引导扇区都装上引导程序,而不会提供任何选项给用户选择,因此如果之前装过其他操作系统,然后再另外装一个windows时,会把公用的MBR覆盖掉,如此,原来的操作系统就无法启动了。
如果先装windows,然后装linux,linux会覆盖MBR,然后让用户选择是否将windows等其他操作系统的启动项添加进来,如果你选择了添加进来,那么你在开机时就会有两个选项让用户进行选择了。
【文件系统】
文件系统也是很大很复杂的话题,我们仍然以比较通俗、粗颗粒度来讲解,试想一下,我们的文件如何对应到磁盘的扇区上呢,所以光有底层的概念磁道扇区是没有用的,需要更加抽象的数据类型或结构来抽象底层的细节。
文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型(Abstract data type)。文件系统是一种用于向用户提供底层数据访问的机制。它将设备中的空间划分为特定大小的块(扇区),一般每块512字节。
数据存储在这些块中,大小被修正为占用整数个块。由文件系统软件来负责将这些块组织为文件和目录,并记录哪些块被分配给了哪个文件,以及哪些块没有被使用。
不过,文件系统并不一定只在特定存储设备上出现。它是数据的组织者和提供者,至于它的底层,可以是磁盘,也可以是其它动态生成数据的设备(比如网络设备)。
参考文献网址:https://www.xianjichina.com/news/details_59898.html
12.3 Liunx 文件系统
谈及文件系统,很多Linux用户都会有一个比较模糊和神秘的概念,如果对文件系统的来龙去脉有一定的了解,相信大家就能走出迷雾,Linux文件系统的整体结构模型大概可以划分为以下层次:
Hard Disk => Disk Driver => Filesystem(ext3,ext4,btrfs …) => User Operation
上面结构模型很简单,有一块物理硬盘,首先这块硬盘需要有硬盘驱动的支持,然后才能在这块硬盘上创建不同的文件系统,然后用户才能使用这块硬盘。但有下面两个问题需要思考:
(1). 不同的物理硬盘,需要不同的驱动支持,而不同的驱动,所提供的IO操作接口是不一样的,那么,有没有一个统一的IO操作接口呢?
(2). 不同的文件系统,如ext3, ext4, btrfs等所提供的API也是不一样的,那么,有没有一个统一的东西来对这些不同的文件系统进行一个抽象,以提供一个统一的API接口呢?
上面的结构中,从硬盘驱动,文件系统,虚拟文件系统,以及系统调用,都属于内核空间,换言之,这些不同层次的实现,都是由内核来做的;而所谓用户空间的操作,也就是一些对磁盘的读写访问操作。
- 设备驱动(device driver)
常见的硬盘类型有PATA, SATA和AHCI等,在Linux系统中,对不同硬盘所提供的驱动模块一般都存放在内核目录树drivers/ata中,而对于一般通用的硬盘驱动,也许会直接被编译到内核中,而不会以模块的方式出现,可以通过查看/boot/config-xxx.xxx文件来确认: - 通用块设备层(General Block Device Layer)
这一层的作用,正是解答了上面提出的第一个问题,不同的硬盘驱动,会提供不同的IO接口,内核认为这种杂乱的接口,不利于管理,需要把这些接口抽象一下,形成一个统一的对外接口,这样,不管你是什么硬盘,什么驱动,对外而言,它们所提供的IO接口没什么区别,都一视同仁的被看作块设备来处理。所以,如果在一层做的任何修改,将会直接影响到所有文件系统,不管是ext3,ext4还是其它文件系统,只要在这一层次做了某种修改,对它们都会产生影响。 - 文件系统(Ext3,Ext4…)
文件系统这一层相信大家都再熟悉不过了,目前大多Linux发行版本默认使用的文件系统一般是ext4,另外,新一代的btrfs也呼之欲出,不管什么样的文件系统,都是由一系列的mkfs.xxx命令来创建,如: - 虚拟文件系统(virtual file system)
这一层,正是用来解决上面提出的第二个问题,试想,当我们通过mkfs.xxx系列命令创建了很多不同的文件系统,但这些文件系统都有各自的API接口,而用户想要的是,不管你是什么API,他们只关心mount/umount,或open/close等操作。
所以,VFS就把这些不同的文件系统做一个抽象,提供统一的API访问接口,这样,用户空间就不用关心不同文件系统中不一样的API了。VFS所提供的这些统一的API,再经过System Call包装一下,用户空间就可以经过SCI的系统调用来操作不同的文件系统。
VFS所提供的常用API有:
mount(), umount() …
open(),close() …
mkdir() …
12.4 Linux 文件存储结构
Linux正统的文件系统(如ext2、ext3)一个文件由目录项、inode和数据块组成。
- 目录项:包括文件名和inode标识编号。
- Inode:又称文件索引节点,是文件基本信息的存放地和数据块指针存放地。
- 数据块:文件的具体内容存放地。
有时,人们使用了一些不同的术语,如 inode 和索引编号 (inumber)。这两个术语非常相似,并且相互关联,但它们所指的并不是同样的概念。inode 指的是数据结构;而索引编号实际上是 inode 的标识编号,因此也称其为inode 编号 或者索引编号。
【Inode】
操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。inode 的默认大小为 128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的 block 编号。每个文件需要占用一个 inode。大家如果仔细查看,就会发现 inode 中是不记录文件名的,那是因为文件名记录在文件所在目录的 block 中。
【block】
block 的大小可以是 1KB、2KB、4KB,默认为 4KB。block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block。例如,有一个 10KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。
Linux正统的文件系统(如ext2、3等)将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。一个文件由一个目录项、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。
【文件存储结构大概如下】:
1) 其中目录项的结构如下(每个文件的目录项存储在该文件所属目录的文件内容里):
2)其中文件的inode结构如下(inode里所包含的文件信息可以通过stat filename查看得到):
系统使用inode编号来识别文件。对于系统来说,文件名只是方便用户识别的文件别称。
这里值得重复一遍,Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
12.5 创建/读取一个文件的过程
文件主要有属性、内容和文件名三项。内核将文件内容放在数据区,文件属性放在Inode,文件名放在目录项中。
【创建文件】
成功创建一个文件主要有以下四个步骤:
1) 存储属性
也就是文件属性的存储,内核先找到一块空的inode,然后将文件属性存放在Inode中。
2)存储数据
也就是文件内容的存储,将文件的内容存储到数据块中。
3)记录分配情况,数据保存到了3个数据块中。所以必须记录下来,以后才能再找到正确的数据。分配情况记录在inode节点中的磁盘序号列表中。这3个编号分别放在最开始的位置。
4)内核将文件入口(该文件的目录项(文件名|文件对应的Inode标识编号))添加到目录文件。文件名和inode标识编号之间的对应关系将文件名和文件的内容属性连接起来,找到文件名就可以找到文件的inode节点,通过inode节点就可以找到文件的属性和内容。(建立硬链接)
【读取文件】
1)根据文件名在目录项中(存放在文件所在目录的block区域)找到该文件的目录项(文件名|文件Inode标识编号)。
2)根据Inode标识编号定位到Inode位置,并且读取Inode的信息。
3)通过Inode中的数据指针定位数据块位置,并且读取数据块内容。
12.6 创建一个目录
1)在/home/chen/下建立一个目录(dd)
[chen@localhost ~]$ mkdir dd
可以看到 新建目录(/dd)有两个硬链接
”硬链接”本质上是“目录项”的同义词。当一个目标第一次被创建,就会为它创建一个目录项(保存在父目录的数据块中)。这其实就是硬链接。
当一个子目录被创建时,在其父目录中也创建了一个目录项,这个目录项用于将子目录的名称与新创建inode关联起来。
此外,新的目录文件中也自动创建了两个目录项,这两个目录项分别为“.”–当前目录的目录项和“…”父目录的目录项目。
所以,创建一个子目录会创建一个新的硬件链接到其父目录,以及两个对新创建对象(子目录)的硬件链接:一个来自其父目录(“…”),另一个来自他自己(“.”),也就是说一个目录项的硬链接数最少是2。
2) 在/home/chen/下再建立一个目录(cc)
可以看到,父目录/home/chen/的硬链接从16增加到了17。
新建立一个目录,就会增加3个硬链接
【建立一个目录】
1) 内核找到空的Inode,将目录文件的属性写入;
2)内核找到空的数据块,将目录文件的内容写入;注意,此处目录的内容由子目录项(子目录或子文件的目录项)表组成;并且应该包含当前目录的目录项(第1个硬件链接)和父目录的目录项。
3)记录分配情况
4)添加该目录的目录项到父目录的数据块中(第2个硬件链接)。
【在父目录下创建2个目录的底层架构图】
12.8 理解链接(硬链接、软链接)
为了解决文件的共享使用,Linux系统引入了两种链接:硬链接(hard link)与软链接(soft link,又称为符号链接 symbolic link)
硬链接本义上是目录项的同义词,具有以下特性。
- 文件具有相同的inode及data block
- 只能对已存在的文件进行创建
- 不能交叉文件系统进行硬链接的创建
- 不能对目录进行创建,只可对文件创建
- 删除一个硬链接文件并不影响其他有相同inode号的文件。
软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:
- 软链接有自己的文件属性和权限等;
- 可对不存在的文件或目录进行软链接;
- 可交叉文件系统;
- 创建软链接时,链接计数不会增加;
- 删除软链接并不影响被指向的文件。若被指向的原文件被删除,则相关软链接称为死链接;若被指向的源文件被重新创建,则死链接可以恢复为正常的软链接。
软硬链接可以这么理解:硬链接就像一个文件有多个别名;软链接就像是产生了一个新的文件(文件内容就是指定路径文件的路径)。硬链接必须在同一文件系统中,而软链接可以交叉文件系统;
12.9 为什么目录不能创建硬链接
13 Linux ln命令:建立软硬链接
ln命令的基本格式如下:
[chen@localhost ~]$ ln [选项] 源文件 目标文件
选项:
- -s:建立软链接文件。如果不加-s,则建立硬链接文件;
- -f:强制。如果目标文件已经存在,则删除目标文件后再建立链接文件。
【例1】建立硬链接
可以看出,目录文件dd不可以建立硬链接。
可以看出,若目标文件ee存在,则不加选项的ln 命令不能建立链接。
可以看出,若目标文件ee存在,加选项的 ln -f 命令可以建立链接。当建立的硬链接时,链接计数加一。
硬链接的本义是“目录项”,可以看做个同一个文件的别名,Inode标识编号不会改变。系统阻止给目录加硬链接。
软连接相当于一个文件的快捷方式,Inode标识编号会改变,且文件内容大小至少不为empty。
软链接文件的源文件必须写成绝对路径,而不能写成相对路径,(硬链接没有这样的要求),否则软链接会报错。
14 Linux cp 命令:复制文件或目录
cp命令(copy的缩写),主要用来复制文件或目录,同时借助某些选项,还可以实现复制整个目录,以及对比两文件的新旧予以升级等功能。
cp命令的基本格式如下:
[chen@localhost~]$ cp [选项] 源文件 目标文件
下表给出了常用的选项以及功能。
选项 | 功能 |
---|---|
-a | 相当于-d、-p、-r、-f选项的集合 |
-d | 如果源文件为软链接(对硬链接无效),则目标文件也是软链接 |
-i | 询问,如果目标文件已经存在,则会询问是否覆盖 |
-f | 覆盖已经存在的目标文件不会询问 |
-l | 把目标文件建立为硬链接,而不是源文件 |
-s | 把目标文件建立为软链接,而不是源文件 |
-p | 目标文件保留源文件的一切属性 |
-r | 递归复制,即复制目录下所有层级的子目录及文件 |
-u | 若目标文件与源文件有差异,则使用该选项以更新目标文件,用于文件的升级和备用 |
【例1】将单一普通源文件(有效路径) 拷贝 为 单一目标文件(有效路径,目标文件不存在)
[chen@localhost learn_test]$ touch source
[chen@localhost learn_test]$ cp source /home/chen/learn_test/target
【例2】将单一普通源文件(有效路径)覆盖到 单一目标文件(有效路径,目标文件存在)
[chen@localhost learn_test]$ cp -i source /home/chen/learn_test/target
【例3】将单一普通源文件(有效路径)拷贝 到 目标目录(有效路径)中。
[chen@localhost learn_test]$ mkdir target_directory
[chen@localhost learn_test]$ cp source /home/chen/learn_test/target_directory/
【例4】将源目录(有效路径)下的所有文件 拷贝 到 目标目录(有效路径) 中。
[chen@localhost ~]$ cp learn_test/* /home/chen/my/
【例5】将源目录(有效路径)下的所有文件和子目录 拷贝 到 目标目录(有效路径) 中。
[chen@localhost ~]$ cp -r learn_test/ /home/chen/my/
源文件是单一文件 可对应 目标文件 是单一文件(拷贝为或覆盖到) 或 目录(拷贝后挂载到)
源文件是目录 可对应 目标文件是目录(拷贝后挂载到)
15 Linux rm 命令:删除文件或目录
rm 是强大的删除命令,是remove的缩写,它可以永久性地删除文件系统中指定的文件或目录。在使用 rm 命令删除文件或目录时,系统不会产生任何提示信息。
rm命令的基本格式为:
[chen@localhost ~]$ rm [选项] 文件或目录
选项 | 功能 |
---|---|
-f | 强制删除(force),和 -i 选项相反,使用 -f,系统将不再询问,而是直接删除目标文件或目录。 |
-i | 和 -f 正好相反,在删除文件或目录之前,系统会给出提示信息,使用 -i 可以有效防止不小心删除有用的文件或目录。 |
-r | 递归删除,主要用于删除目录,可删除指定目录及包含的所有内容,包括所有的子目录和文件。 |
16 Linux mv 命令:移动/重命名 文件或目录
mv命令(move)的缩写,既可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名。
mv命令的基本格式如下:
[chen@localhost ~]$ mv [选项] 源文件 目标文件
选项 | 作用 |
---|---|
-f | 强制覆盖,如果目标文件已经存在,则不进行询问,直接覆盖 |
-i | 交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项) |
-n | 如果目标文件已经存在,则不会覆盖移动,而且不询问 |
-v | 显示文件或目录的移动过程 |
-u | 若目标文件已经存在,则二者对比,源文件更新,则会对目标文件进行升级 |
当源文件和目标文件在同一目录下,为重命名功能 |
需要注意的是,同rm命令类似,mv命令也是一个具有破坏性的命令,如果使用不当,则会给系统带来灾难性的后果
【例1】移动文件
[chen@localhost~]$ mv my/source /home/chen/My/
【例2】移动目录
[chen@localhost~]$ mv my/learn_test/ /home/chen/My/
【例3】重命名
[chen@localhost~]$ mv -v ./my/target ./my/target1
17 什么是环境变量?
变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值。在Linux系统中,环境变量用于定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。
值得一提的是Linux系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范
我们可以使用env
命令来查看到Linux系统中的所有环境变量,执行命令如下:
Linux系统能够正常运行并为用户提供服务,需要数百个环境变量来协同工作,但是,我们没有必要逐一学习每一个环境变量,需要关注重要的几个环境变量。
环境变量 | 作用 |
---|---|
HOME | 用户的主目录(家目录) |
SHELL | 用户使用的Shell解释器名称 |
PATH | 定义命令行解释器搜索用户执行命令的路径 |
DOLTOR | 用户默认的文本翻译器 |
RANDOM | 生成一个随机数字 |
LANG | 系统语言、语系名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
PS1 | Bash解释器的提示符 |
邮件保存位置 |
Linux作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的环境变量会因为用户身份的不同而具有不同的值。
这里的
su
命令可以临时切换用户身份
其实,环境变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自行创建环境变量来满足工作需求。例如创建一个WORK环境变量,指向/home/chen/my/ 目录
[chen@localhost~]$ WORK = /home/chen/my
[chen@localhost~]$ cd $WORK
[chen@localhost~]$ pwd
18 PATH环境变量
先介绍一下命令which
,它用于查找某个命令的绝对路径。
[chen@loaclhost~]$ which cd
[chen@loaclhost~]$ which mkdir
那么问题来了,为什么我们使用这些命令(cd、mkdir)时,只是直接打出了这些命令,而没有使用这些命令的绝对路径呢?
答案就是PATH环境变量起了作用
PATH环境变量定义了用于进行命令和程序查找的目录。
PATH中的目录使用冒号分隔。