Linux的目录结构(FHS)
Linux系统结构
- 用户
- 应用层
- Shell层
- 内核层
- 硬件
Linux系统一般有4个主要部分: 内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统
linux内核
内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。 Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图:
系统调用接口:SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在./linux/kernel
中您可以找到 SCI 的实现,并在./linux/arch
中找到依赖于体系结构的部分。
内存管理
对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。
为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。
进程管理
进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程序。
进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。
通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。 为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。
内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ 机制)。
文件系统
和 DOS 等操作系统不同,Linux 操作系统中单独的文件系统并不是由驱动器号或驱动器名称(如 A: 或 C: 等)来标识的。相反,和 UNIX 操作系统一样,Linux 操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。Linux 将新的文件系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的文件系统结合成为一个整体。Linux 操作系统的一个重要特点是它支持许多不同类型的文件系统。Linux 中最普遍使用的文件系统是 Ext2,它也是 Linux 土生土长的文件系统。但 Linux 也能够支持 FAT、VFAT、FAT32、MINIX 等不同类型的文件系统,从而可以方便地和其它操作系统交换数据。由于 Linux 支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统.
虚拟文件系统(VirtualFileSystem,VFS):隐藏了各种硬件的具体细节,把文件系统操作和不同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。即VFS 在用户和文件系统之间提供了一个交换层。
VFS 在用户和文件系统之间提供了一个交换层:
在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。
文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。
因此,用户和进程不需要知道文件所在的文件系统类型,而只需要象使用 Ext2 文件系统中的文件一样使用它们。
设备驱动程序
设备驱动程序是 Linux 内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备
的控制芯片有关,例如,如果计算机硬盘是 SCSI 硬盘,则需要使用 SCSI 驱动程序,而不是 IDE 驱动程序。
网络接口(NET)
提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。Linux 的网络实现支持 BSD 套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。
网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
linux shell
shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。
目前主要有下列版本的shell:
- Bourne Shell:是贝尔实验室开发的。
- BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell,大部分linux的发行套件使用的都是这种shell。
- Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。
- C Shell:是SUN公司Shell的BSD版本。
Linux下磁盘分区和目录的关系如下:
– 任何一个分区都必须挂载到某个目录上。
– 目录是逻辑上的区分。分区是物理上的区分。
– 磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。
– 根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。
Linux系统的目录结构(FHS:file hierarchy standard)
FHS的作用:给用户一个模板去定义数据、文件、目录等的存放路径
Linux将其视为一个倒立的树一样进行管理,从"/"开始进行延伸;针对Linux的根分区,尽量小,因为其仅仅只提供一个访问的入口
两种查询方式:
递归查询:从根开始,逐级查找【一定能查找出结果】;每次都要去便利所有文件
迭代查询:从当前目录位置进行查找【不一定能查找出结果】;执行效率高
为什么不一定能查找出结果:因为只从当前位置查找,如果当前位置没有,就不会进行进行查找了。
数据分类:元数据 + 数据
inode + data = data
元数据:定义了数据存放路径的标示符(inode)
目录名 | 描述 | |
---|---|---|
/ | 根目录,一般根目录下只存放目录,不要存放文件。/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中 | |
/bin | 存放系统中最常用的二进制可执行文件,放置在单人维护模式下还能运行的使用命令。基础系统所需要的那些命令位于此目录,也是最小系统所需要的命令;例如ls、cp、mkdir等命令。功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用命令 | |
/boot | 存放Linux内核和系统启动文件,包括Grub、lilo启动程序(一般分给它200M) | |
/dev | 存放所有设备文件,包括硬盘、分区、键盘、鼠标、USB等特殊的文件:/dev/zero:泡泡机 /dev/null:黑洞 /dev/tty:串行终端 | |
/etc | 存放系统所有配置文件,例如passwd存放用户账户信息,hostname存放主机名等。/etc/fstab是开机自动挂载一些分区的,在里面写入一些分区信息,就能实现开机挂载分区 | |
/home | 普通用户的家目录的默认位置;默认情况下,每创建一个用户都会生成一个对应的用户目录~:代表当前这个用户的家目录 | |
/run | 系统运行时所需的文件。以前防止在/var/run中,后来拆分成独立的/run目录。重启后重新生成对应的目录数据 | |
/lib | 系统的库函数,用于放置系统启动时会加载到的函数库;存放共享的库文件,包含许多被/bin和/sbin中程序使用的库文件库函数:封装完整的程序用于调用系统底层的硬件/lib/modules:由于存放可抽换式的内核相关模块【驱动程序】 | |
/lost+found | 在ext2或者ext3文件系统中,当系统意外崩溃或者计算机意外关机,而产生一些文件碎片存放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。有时系统发生问题,有很多的文件被移动到这个目录中,可能会用手工的方式来修复或移动到文件的原位置上 | |
/media | 媒体,即插即用型设备的挂载点自动在这个目录下创建。例如USB自动挂载后会在这个目录下产生一个目录;CDROM/DVD自动挂载后,也会在这个目录中创建一个目录,存放临时读入的文件 | |
/mnt | 此目录通常用于作为被挂载的文件系统的挂载点 | |
/proc | 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;存放的映射(不占用磁盘大小)。例如CPU、硬盘分区、内存信息等存放在这里 | |
/opt | 作为第三方辅助软件和程序的存放目录。有些软件包也会被安装在这里,也就是自定义软件包;有些用户自己编译的软件包,就可以安装在这个目录中 | |
/root | 根用户(超级用户)的家目录 | |
/sbin | 大多是涉及系统管理的命令的存放地,也是超级权限用户root的可执行命令存放地。普通用户无权限执行这个目录下的命令,这个目录和/usr/sbin; /usr/X11R6/sbin或/usr/local/sbin目录是相似的。Notice,凡是目录sbin中包含的都是root权限才能执行的 | |
/srv | 存放系统所提供的服务数据 | |
/sys | 该目录用于将系统设备组织或层次结构,并向用户提供详细的内核数据信息 | |
/tmp | 临时文件目录,有时用户运行程序的时候,会产生临时文件。/var/tmp目录和这个目录相似。重要提示:不要从/tmp目录中删除文件,除非你确切地知道你在做什么!在多用户系统中,这可能会删除活动文件,从而中断用户的活动(通过他们正在使用的程序) | |
/usr | 应用程序放置目录,如应用程序及支出系统的库文件rpm与yum安装的默认位置就是这个目录里面 | |
/usr/X11R6 | X Window系统 | |
/usr/bin | 用户管理员的标准命令 | |
/usr/include | C/C++等开发工具语言环境的标准include文件 | |
/usr/lib | 应用程序及程序报的链接库 | |
/usr/local | 系统管理员安装的应用程序 | |
/usr/local/share | 系统管理员安装的共享文件 | |
/usr/sbin | 用户和管理员的标准命令 | |
/usr/share | 存放使用手册等共享文件的地方 | |
/usr/share/dict | 存放词表的目录 | |
/usr/share/man | 系统使用手册 | |
/usr/share/misc | 一般数据 | |
/usr/share/sgml | SGML数据 | |
/usr/share/xml | XML数据 | |
/var | 通常用于存放长度可变的文件,例如日志文件和打印机文件 | |
/var/cache | 应用程序缓存目录 | |
/var/crash | 系统错误信息 | |
/var/games | 游戏数据 | |
/var/lib | 各种状态数据 | |
/var/lock | 文件锁定记录 | |
/var/log | 日志记录 | |
/var/mail | 电子邮件 | |
/var/opt | /opt目录的变量数据 | |
/var/run | 进程的标示数据 | |
/var/spool | 存放电子邮件,打印任务等的队列目录 | |
/var/tmp | 临时文件目录 |
免责声明: 本文部分内容转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。