本篇将全面梳理Linux
系统的体系结构,相信你阅读完本文定能对Linux
系统有一个更深刻地认识和更全面的掌握。
Linux
系统一般有四个主要部分:内核、shell
、文件系统、应用程序。 前三者一起构成了基本的操作系统结构,它使得用户可以使用这个操作系统并在系统中完成特定的任务。其结构如下图所示。
Linux
内核 内核是操作系统的核心,提供很多的基本功能,它负责管理系统的进程、内存、设备驱动程序、文件系统和网络系统等,决定着系统的性能和稳定性。Linux
内核主要由以下几部分组成:内存管理、进程管理、设备驱动程序、文件系统、网络管理等,其体系结构可表示成如下图所示:
从上图可以看出,用户与内核之间的交互是通过系统调用接口
来完成的。
系统调用接口(System Call Interface
)这一层提供了 某些机制执行从用户空间到内核空间的函数调用,接口依赖于体系结构。SCI
可以看作是一个非常有用的函数调用式的多路复用、多路分解服务,在目录./linux/kernel
下可以找到SCI
层的具体实现,在目录./linux/arch
下可以找到其依赖的体系结构。
1.1 内存管理
对于计算机而言,内存资源总是有限的,为了让有限的物理内存满足应用程序的需求,Linux
采用了“虚拟内存”管理方式, 它使得应用程序认为它拥有连续可用的内存(实际上是多个物理内存碎片,甚至部分暂存在外部磁盘上),让大型程序的编写变得更容易,对物理内存的使用也更有效率。Linux
将物理内存划分为容易处理的内存页,目前大多数系统的页面都是4kb
。
Linux
包括了管理可用内存的方式以及物理、虚拟映射所使用的硬件机制。当然,内存管理不光是管理4kb
缓冲区, 系统提供了对4kb
缓冲区的抽象, 它是以4kb
为基数,从中分配结构,并跟踪内存页的使用情况,从而达到根据系统的需要动态调整的效果。
为了支持多用户使用内存,有时内存可能被消耗光,系统可以将暂时不用的页面放入磁盘中,这个过程称为交换。内存管理的源代码可以在目录./linux/mm
中查看。
1.2 进程管理
进程是某特定应用程序的一个运行实体。Linux
系统支持多任务,它是通过在“时间片”间隔内轮流执行这些进程来实现的,进程轮流执行的方法称为“进程调度”,完成调度的程序为调度程序。 进程调度就是控制进程对CPU
的访问, 每次由调度程序选择“最值得”运行的进程(可运行进程是仅等待CPU资源的进程),这种“最值得”是系统基于优先级的进程调度算法实现的。
通用多任务机制,每个进程可认为只有自己独占计算机,从而简化了程序的编写。每个进程有自己单独的地址空间,并只有自己可以访问,这样可以有效避免进程间的干扰。对于某项任务需要多个进程协作完成的,操作系统提供了进程间通讯机制来辅助完成。Linux
系统中常见的进程间通讯机制有:信号、管道、共享内存、信号量、套接字等。
内核通过SCI
层提供了一个应用程序编程接口来创建一个新进程(fork 、exec或POSIX函数)、停止进程(kill、exit),并在它们之间进行通信和同步(signal或POSIX机制)。
1.3 文件系统
Linux
系统将独立的文件系统组合成了一个层次化的树形结构, 并由一个单独的实体代表这一文件系统。对于一个外部新的文件系统,Linux
系统通过“挂载”的方式将其挂载到某个目录上,从而让不同的文件系统结合成一个整体。
Linux
支持多种不同的文件系统,其中Ext2
是其原生文件系统外,它也能够支持FAT
、VFAT
、FAT32
、MINIX
等文件系统,从而可以方便地与其它操作系统交换数据。Linux
系统之所以能支持不同的文件系统,是因为它将各种文件系统组织成了一个统一的虚拟文件系统(Virtual File System)。
虚拟文件系统为所有设备提供了统一的接口,它在用户和内核所支持的文件系统之间提供了一个交换层,如下图所示:
从上图可以看出,在VFS
上面是对文件的open
、close
、read
、write
等通用API
的抽象,在VFS
下面是文件系统的抽象,定义了上层函数的实现。文件系统的源代码可以在目录./linux/fs
中查看。
有了虚拟文件系统,用户和进程不需要知道文件所在的文件系统类型,而只需要像使用Ext2
文件系统一样使用即可。
1.4 设备驱动程序
设备驱动程序是Linux
系统内核的主要部分,它控制着操作系统和硬件设备间的交互。一般,设备驱动程序与设备的控制芯片有关。
1.5 网络接口
网络接口提供了各种网络标准的存取和各种网络硬件的支持。Linux
的网络实现支持BSD
套接字,支持全部的TCP/IP
协议。
Linux Shell
shell
是系统的用户界面,提供了用户与内核进行交互操作的接口,它接收用户输入的命令并将它送到内核去执行。shell
编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell
程序与其它应用程序具有同样的效果。
目前大部分GNU
操作系统上默认的就是bash shell
。
Linux
文件系统 文件系统是文件存放在存储设备上的组织方法。Linux
系统支持的文件系统非常多,除Ext2
、Ext3
和Ext4
之外,还能支持FAT
、NTFS
等Windows
文件系统,较常见的文件系统如下表所示。
文件系统 | 详细描述 |
---|---|
Ext | Linux 中最早的文件系统,由于在性能和兼容性上具有很多缺陷,现在已经很少使用 |
Ext2 | 是 Ext 文件系统的升级版本,Red Hat Linux 7.2 版本以前的系统默认都是 Ext2 文件系统。于 1993 年发布,支持最大 16TB 的分区和最大 2TB 的文件 |
Ext3 | 是 Ext2 文件系统的升级版本,最大的区别就是带日志功能,以便在系统突然停止时提高文件系统的可靠性。支持最大 16TB 的分区和最大 2TB 的文件 |
Ext4 | 是 Ext3 文件系统的升级版。Ext4 在性能、伸缩性和可靠性方面进行了大量改进。Ext4 的变化可以说是翻天覆地的,比如向下兼容 Ext3、最大 1EB 文件系统和 16TB 文件、无限数量子目录、Extents 连续数据块 概念、多块分配、延迟分配、持久预分配、快速 FSCK、日志校验、无日志模式、在线碎片整理、inode 增强、默认启用 barrier 等。它是 CentOS 6.3 的默认文件系统 |
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 交换分区 |
3.1 Linux
文件类型
Linux
系统主要有以下文件类型:
/dev
下面。设备分为块设备和字符设备;可以通过命令ls -l
、file
、stat
等命令来查看文件的类型相关信息。
3.2 Linux
目录
Linux
使用标准的目录结构,在安装时就已经为用户创建了文件系统和完整固定的目录组成形式,并指定了每个目录的作用和其中的文件类型。 在系统中,使用/
来表示根目录,用.
或./
表示当前目录,用..
或../
表示上一层目录。若一个目录或文件名以.
开始,则表示这个目录或文件是一个隐藏目录或文件,如.bashrw
,在默认方式查找时,不显示该目录或文件。
Linux
系统的通过目录结构如下图所示:
下表列出了这些目录的作用与存储内容。
目录名称 | 详细描述 |
---|---|
/bin | bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的程序和指令。 |
/boot | 存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 |
/dev | dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。 |
/etc | etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录,更改目录下的文件可能会导致系统不能启动。 |
/home | 用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。 |
/lib | lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。 |
/sys | 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。 |
/sbin | 只有系统管理员才能使用的程序和指令。 |
/media | linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。 |
/mnt | 临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。 |
/run | 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。 |
/lost+found | 一般情况下为空的,系统非法关机后,这里就存放一些文件。 |
/tmp | 这个目录是用来存放一些临时文件的。 |
/opt | opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。 |
/proc | proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。 这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all |
/root | 该目录为系统管理员,也称作超级权限者的用户主目录。 |
/sbin | s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。 |
/selinux | 这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。 |
/srv | 该目录存放一些服务启动之后需要提取的数据 |
/usr | usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。 |
/usr/bin | 系统普通用户使用的应用程序。 |
/usr/sbin | 超级用户使用的比较高级的管理程序和系统守护程序。 |
/usr/src | 内核源代码默认的放置目录。 |
/var | var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。 |
在Linux
系统中,有下面几个目录是非常重要的,注意不误删除或随意修改内部文件:
Windows
下的Program files
文件夹,系统上运行的很多程序的日志文件也存储于此。3.2 Linux
磁盘分区
Linux
分区不同于Windows
,硬盘和硬盘分区在Linux
系统中都表示为设备。硬盘分区一共有三种:主分区、扩展分区和逻辑分区。主分区与扩展分区的数目之和不能大于四个。
扩展分区只不过是逻辑分区的“容器”,实际上只有主分区与逻辑分区进行数据存储。
Linux
系统下的硬盘分区标识一般使用/dev/hd[a-z]X
(IDE接口的硬盘)或者/dev/sd[a-z]X
(SCSI接口的硬盘)格式,其中[a-z]
代表硬盘号,X
代表硬盘内的分区号。 X
的值是1到4时,表示为硬盘的主分区(包含扩展分区),逻辑分区是从5开始的。要注意:即使一块硬盘只有一个主分区,逻辑分区也是从5开始编号的。
总起来说,一个硬盘分区首先要确认在哪个硬盘,然后再确认它在哪个分区。可以使用fdisk -l
命令查看硬盘的详细信息。
3.3 硬连接与软连接
Linux
中连接有硬连接与软连接之分, 软连接又叫符号连接。它们的特点如下:
ln -s
命令建立文件的符号连接是linux
特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名,类似于Windows
下的快捷方式。 硬连接与软连接的区别在于:
inode
编号一致,而软连接不一样;3.4 文件目录管理的相关命令
文件目录管理的相关命令列举如下:
磁盘与文件空间管理:fdisk
、df
、du
;
文件目录与管理:cd
、pwd
、mkdir
、rmdir
、ls
、cp
、rm
、mv
查看文件内容:cat
、tac
、more
、less
、head
、tail
文件目录与权限:chmod
、chown
、chgrp
、umask
文件查找:which
、whereis
、locate
、find
Linux
内核参数优化内核参数是用户与系统内核之间交互的一个接口,通过这个接口,用户可以在系统运行的同时,动态更新内核配置。这些内核参数是通过Linux proc
文件系统实现的,因此,可以通过调整proc
文件系统达到优化Linux
系统性能的目的。
本文到此结束!下篇继续!
如果对你有帮助,请随手 点赞 或 赞赏!关注本专栏,更多干货与你分享。
=======================================================
欢迎【关注、私信 @武三郎】。我们一起交流一起进步。