当前位置: 首页 > 科技观察

是时候深挖Linux系统结构了

时间:2023-03-16 19:13:19 科技观察

什么是Linux?如果您以前从未接触过Linux,可能不清楚为什么会有这么多不同的Linux发行版。在查看Linux软件包时,您一定会对发行版、LiveCD和GNU等术语感到困惑。第一次进入Linux世界会让人感到害怕。在开始学习命令和脚本之前,本章将为您稍微揭开Linux系统的神秘面纱。首先,Linux可以分为以下四个部分:?Linux内核?GNU工具链?GUI桌面环境?应用软件...|------------------------||APPS|应用软件|----------------------------|||GUI桌面环境|GUI|------------|||GNU|GNU工具链|------------------------||kernel|Linux内核|------------------------||硬件|计算机硬件--------------------------1.Linux内核Linux系统的核心是内核。内核控制计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。系统内存管理应用程序管理硬件设备管理文件系统管理1.系统内存管理操作系统内核的主要功能之一就是内存管理。内核不仅管理服务器上可用的物理内存,还创建和管理虚拟内存(即实际不存在的内存)。内核通过硬盘上的存储空间实现虚拟内存。这个区域称为交换空间(swapspace)。内核不断地在交换空间和实际物理内存之间来回交换虚拟内存的内容。这使得系统认为它有比物理内存更多的可用内存Linux系统内存映射|--------|------------|||物理内存|||/--------||--------|虚拟内存|——|内核|||--------||\-----------|||交换空间||--------|------------2。应用程序管理Linux操作系统将运行中的程序称为进程。进程可以在前台运行,在屏幕上显示输出,或者在后台运行,隐藏在幕后。内核控制Linux系统如何管理系统上运行的所有进程。内核创建第一个进程(称为init进程)来启动系统上的所有其他进程。当内核启动时,它会将init进程加载到虚拟内存中。当内核启动任何其他进程时,它会在虚拟内存中为新进程分配一块专用区域来存储该进程使用的数据和代码。Linux操作系统有5个启动操作级别。当运行级别为1时,只启动基本系统进程和控制台终端进程。我们称之为单用户模式。单用户模式通常用于系统出现问题时的紧急文件系统维护。显然,在这种模式下,只有一个人(通常是系统管理员)可以登录系统操作数据。标准启动运行级别为3。在此运行级别,大多数应用软件(例如网络支持程序)将启动。Linux中常见的运行级别是5,在这个运行级别上,系统会启动图形化的XWindow系统,允许用户通过图形化的桌面窗口登录系统。3、硬件设备管理内核的另一个职责是管理硬件设备。Linux系统需要与之通信的任何设备都需要将其驱动程序代码添加到内核代码中。驱动程序代码相当于应用程序和硬件设备之间的中间人,允许内核和设备之间交换数据。在Linux内核中插入设备驱动程序代码有两种方法:将设备驱动程序代码编译到内核中设备驱动程序模块可以插入到内核中以前,插入设备驱动程序代码的唯一方法是重新编译内核。每次向系统添加新设备时,都必须重新编译内核代码。随着Linux内核支持越来越多的硬件设备,这个过程变得越来越低效。幸运的是,Linux开发人员已经设计出一种更好的方法来将驱动程序代码插入到正在运行的内核中。开发人员提出了内核模块的概念。它允许在不重新编译内核的情况下将驱动程序代码插入到正在运行的内核中。同时,当设备不再使用时,内核模块也可以从内核中移除。这种方法极大地简化和扩展了Linux上硬件设备的使用。Linux系统把硬件设备看成一种特殊的文件,称为设备文件。设备文件分为三种:字符设备文件字符设备文件是指处理数据时一次只能处理一个字符的设备。大多数类型的调制解调器和终端都是作为字符设备文件创建的。块设备文件块设备文件是指在处理数据时,每次可以处理大块数据的设备,比如硬盘。网络设备文件网络设备文件是指使用数据包发送和接收数据的设备,包括各种网卡和一种特殊的环回设备。这个环回设备允许Linux系统使用通用的网络编程协议与自身进行通信。Linux为系统上的每个设备创建一个称为节点的特殊文件。与设备的所有通信都是通过设备节点完成的。每个节点都有一个唯一的数字对,供Linux内核识别。值对由一个主要数字和一个次要数字组成。不同类别的设备分组在相同的主设备编号下。次设备号用于标识主设备组下的特定设备。4.文件系统管理与其他一些操作系统不同,Linux内核支持通过不同类型的文件系统从硬盘读写数据。除了它自己的许多文件系统外,Linux还支持从其他操作系统(例如MicrosoftWindows)使用的文件系统读取和写入数据。编译内核时必须支持所有可能的文件系统。表1-1列出了Linux系统用来读写数据的标准文件系统。ext|Linux扩展文件系统,最早的Linux文件系统ext2|第二个扩展文件系统在ext3的基础上提供了更多的功能|第三个扩展文件系统支持日志功能ext4|第四个扩展文件系统,支持高级日志功能hpfs|OS/2高性能文件系统jfs|IBM日志文件系统iso9660|ISO9660文件系统(CD-ROM)minix|MINIX文件系统msdos|MicrosoftFAT16ncp|Netware文件系统nfs|网络文件系统ntfs|支持MicrosoftNT文件系统proc|访问系统信息ReiserFS|高级Linux文件系统,可提供更好的性能和硬盘恢复功能smb|Samba支持网络访问的SMB文件系统sysv|早期Unix文件系统ufs|BSD文件系统umsdos|基于msdosvfat的类Unix文件系统|Windows95文件系统(FAT32)XFS|高性能64位日志文件系统Linux服务器访问的所有硬盘都必须格式化为表1-1中列出的文件系统类型之一。Linux内核使用虚拟文件系统(VirtualFileSystem,VFS)作为接口与各个文件系统进行交互。这为Linux内核提供了与任何类型的文件系统通信的标准接口。当每个文件系统被挂载和使用时,VFS都会将这些信息缓存在内存中。2.GNU工具链GNU组织(GNU是GNU'sNotUnix的缩写)开发了一套完整的Unix工具,但目前还没有可以运行它们的内核系统。这些工具是在称为开源软件(OSS)的软件理念下开发的。开源软件理念允许程序员开发软件并免费分发。任何人都可以使用、修改或将软件集成到自己的系统中,而无需支付任何许可费用。将Linus的Linux内核与GNU操作系统工具相结合产生了一个完整的、功能丰富的免费操作系统。尽管通常将Linux内核和GNU工具的组合称为Linux,但您也会在Internet上看到一些Linux纯粹主义者将其称为GNU/Linux系统,以向GNU组织所做的贡献致敬核心GNU工具GNUcoreutils包由三部分组成:文件操作工具文本操作工具进程管理工具ShellGNU/Linuxshell是一种特殊的交互工具。它为用户提供了一种启动程序、管理文件系统中的文件以及运行在Linux系统上的进程的方式。shell的核心是命令行提示符。命令提示符是shell的交互部分。它允许您输入文本命令,然后在内核中解释和执行这些命令。我们在命令行输入的命令是由GNU工具链提供的,而不是Linux内核。所有Linux发行版的默认shell都是bashshell。bashshell由GNU项目开发,用于替代标准Unixshell,即Bourneshell(以其创建者命名)。Linux中常见的几种不同的shell|由GNU项目开发并用作标准shellash|运行在内存受限环境中的简单轻量级shell,但与bashshell完全兼容korn|与Bourneshell兼容的编程shell,但它支持一些高级编程功能,例如关联数组和浮点运算tcsh|shellzsh将C语言中的一些元素引入到shell脚本中|结合了bash、tcsh和korn的特性,并提供高级编程特性和共享历史用于文件和主题提示的高级shell3.Linux桌面环境在Linux的早期(1990年代初期),可用的只是一个简单的文本界面到Linux操作系统。此文本界面允许系统管理员运行程序、控制程序执行以及在系统中移动文件。随着MicrosoftWindows的普及,计算机用户不再满足于在老式的文本界面前工作。这推动了OSS社区更多的开发活动,Linux图形桌面环境应运而生。XWindowSystem有两个决定视频环境的基本元素:图形卡和显示器。要在计算机上显示一幅华丽的图画,Linux软件需要知道如何与两者进行通信。XWindowSystem是图形显示的核心部分。XWindow系统是PC机上直接与显卡和显示器打交道的底层程序。它控制Linux程序如何在计算机上显示漂亮的窗口和图形。现在流行的桌面环境包括Unity、GNOME、Cinnamon、Xfce和其他Linux发行版。你已经了解了构成一个完整的Linux系统所需要的4个关键部件,那么你可能正在考虑它们如何构成一个Linux系统。幸运的是,已经有人为您完成了这项工作。核心Linux发行版核心Linux发行版包含内核、一个或多个图形桌面环境以及预编译的几乎所有您能找到的Linux应用程序。提供一站式完整的Linux安装Slackware|最早的Linux发行版之一,深受Linux极客的欢迎Redhat|Gentoo,主要针对互联网服务器的商业发行版|专为高级Linux用户设计的发行版,仅包含Linux源代码openSUSE|为商业和家庭使用分发Debian|Linux专家和商业Linux产品中流行的分发系统目录|-bin#二进制目录,存放用户级GNU工具(bash命令)|——boot#启动目录,存放系统启动使用的各种文件|——dev#Device目录,存放硬件设备,创建设备节点|——etc#系统配置文件目录,存放系统管理和配置文件|——home#普通用户的主目录|——lib#library目录,存放系统和应用程序的动态链接库|——lost+found#这个目录是通常为空,系统异常关闭并留下“无”home”文件|--media#media目录,可移动媒体设备的常见挂载点|--mnt#mount目录,可移动媒体设备的另一个常见挂载点|--opt#optional目录,常用于存放第三方软件包和数据文件|——proc#process目录,存放现有硬件和当前进程的信息,是系统内存的映射。可以直接访问该目录获取系统信息|——root#超级用户的主目录|——run#运行目录,存放系统运行时的运行时数据|——sbin#系统二进制目录,存放很多GNU管理员级别Tools|——srv#service目录,存放本地服务相关文件|——sys#system目录,存放系统硬件信息相关文件|——tmp#temporary目录,可以在其中创建和删除临时工作文件这个目录,重启后清空|——usr#用户二进制目录,这里存放了大量用户级的GNU工具和数据文件||——bin#包含系统安装的可执行程序。通常这个目录会包含很多程序||——games#||——include#编写程序需要的一些头文件||——lib#在/usr/bin目录下包含程序使用的共享库||——local#是不包含在系统发行版中,但打算供系统使用的程序的安装目录。通常,源代码编译的程序会安装在/usr/local/bin目录下||——sbin#包含很多系统管理程序||——share#存放帮助文档和共享文件||——src#|———var#可变目录,用于存放经常变化的文件,如日志文件文件-x|———文件类型||——#file||——d#folder||——l#link||——c#字符设备||——b#块设备||——n#网络设备||——-r#可读权限|——w#可写权限|——x#可执行权限文件系统extLinux操作系统中最早引入的文件系统称为扩展文件系统(extendedfilesystem,缩写为分机)。它为Linux提供了一个基本的类Unix文件系统:使用虚拟目录来操作硬件设备,在物理设备上以固定长度的块存储数据。ext文件系统使用称为inode的系统来存储有关存储在虚拟目录中的文件的信息。inode系统在每个物理设备中创建一个单独的表(称为inode表)来存储有关这些文件的信息。存储在虚拟目录中的每个文件在inode表中都有一个条目。ext文件系统名的扩展部分来自它跟踪的每个文件的附加数据-文件名-文件大小-文件所有者-文件组-文件访问权限-指向存储文件数据的每个硬盘块指针Linux指的inode表中的每个inode都有一个唯一值(称为inode编号),该值由文件系统在创建文件时分配。文件系统通过inode编号而不是完整的文件名和路径来识别文件。ext2最早的ext文件系统有很多限制,比如文件大小不能超过2GB。Linux出现后不久,ext文件系统升级为第二代扩展文件系统,称为ext2日志文件系统。日志文件系统为Linux系统增加了一层安全性。不再沿用以往直接将数据写入存储设备再更新索引节点表的做法,而是在数据成功写入存储设备后,先将文件变化写入一个临时文件(称为日志,journal)和索引。在节点表之后,删除相应的日志条目。如果在数据写入存储设备之前系统死机或掉电,日志文件系统将在下次读取日志文件并处理ext32001中遗留的未写入数据。ext3文件系统被引入到Linux内核中。直到最近,它还是几乎所有Linux发行版的默认文件系统。它使用与ext2文件系统相同的inode表结构,但是在每个存储设备上增加了一个日志文件,将要写入存储设备的数据先记录在日志中。ext4ext4文件系统在2008年被Linux内核正式支持,现在是大多数流行的Linux发行版采用的默认文件系统。除了支持数据压缩和加密外,ext4文件系统还支持一个名为extent的特性。节在存储设备上以块为单位分配空间,但只存储起始块在inode表中的位置。它在inode表中节省了一些空间,因为不需要列出文件中用于存储数据的所有数据块。ext4还引入了块预分配技术(blockpreallocation)。如果您想在存储设备上为您知道会增长的文件保留空间,ext4文件系统可以分配该文件需要使用的所有块,而不仅仅是那些当前正在使用的块。ext4文件系统用0填充保留数据块,不会分配给其他文件LVMLinuxLinux中的LVM由HeinzMauelshagen开发,并于1998年发布到Linux社区。它可以让你在Linux上管理一个完整的逻辑卷管理环境使用简单的命令行命令。LVM1最初的LVM包于1998年发布,只能用于Linux内核版本2.4。它只提供LVM2LVM基本逻辑的更新版本,适用于Linux内核2.6版本。它提供了标准LVM1功能之外的附加功能。快照原始的LinuxLVM允许您在另一个设备联机时将逻辑卷复制到它。此功能称为快照。在备份因可靠性要求高而无法锁定的重要数据时,快照功能非常强大。传统的备份方法通常在将文件复制到备份介质时锁定文件。快照允许您在复制时保持关键任务Web服务器或数据库服务器运行。遗憾的是,LVM1只允许您创建只读快照。创建快照后,无法向其中写入任何内容。LVM2允许您创建在线逻辑卷的读写快照。使用可读可写快照,可以删除原始逻辑卷并挂载快照。此功能对于快速故障转移或涉及在失败时需要恢复的修改数据的程序实验很有用。条带化LVM2提供的另一个引人注目的特性是条带化。通过条带化,可以跨多个物理硬盘创建逻辑卷。LinuxLVM将文件写入逻辑卷时,文件中的数据块分布在多个硬盘上。随后的每个数据块都会写入下一个硬盘。条带化有助于提高硬盘性能,因为Linux可以同时将一个文件的多个数据块写入多个硬盘,而无需等待单个硬盘将读写头移动到多个不同的位置。这种改进也适用于读取顺序访问的文件,因为LVM可以同时从多个硬盘读取数据。仅仅因为镜像通过LVM挂载文件系统并不意味着文件系统不再有问题。与物理分区一样,LVM逻辑卷也容易受到断电和磁盘故障的影响。文件系统一旦损坏,可能永远无法恢复。LVM快照功能提供了一些便利,因为您可以随时创建逻辑卷的备份副本,但对于某些环境来说可能还不够。对于涉及大量数据更改的系统,例如数据库服务器,自上次快照以来可能存储了数百或数千条记录。此问题的一种解决方案是LVM镜像。镜像是实时更新的逻辑卷的完整副本。当您创建镜像逻辑卷时,LVM会将原始逻辑卷同步到镜像副本。根据原始逻辑卷的大小,这可能需要一些时间才能完成。原始同步完成后,LVM对文件系统的每次写入执行两次写入—一次写入主逻辑卷,一次写入镜像副本。可以想象,这个过程会降低系统的写入性能。即使原来的逻辑卷因为某种原因损坏了,你手头已经有了一份完整的副本!总结在Linux上使用存储设备需要对文件系统有一点了解。在使用Linux时,了解如何在命令行创建和操作文件系统会有所帮助。Linux系统与Windows的区别在于前者支持大量不同的文件和目录存储方式。每种文件系统方法都有不同的特点,适用于不同的场景。fdisk命令用于对存储设备进行分区,以便挂载文件系统。对存储设备进行分区时,需要定义在其上使用的文件系统类型。对存储设备进行分区后,您可以为分区选择一个文件系统。流行的Linux文件系统包括ext3和ext4。两者都提供日志文件系统功能,这减少了它们在Linux系统崩溃时遇到错误或问题的机会。直接在存储设备分区上创建文件系统的一个限制因素是,如果硬盘空间不足,您将无法轻松更改它们。文件系统的大小。但是Linux支持逻辑卷管理,这是一种跨多个存储设备创建虚拟分区的方法。此方法允许您轻松扩展现有文件系统而无需完全重建它。LinuxLVM包提供命令行命令来跨多个存储设备创建逻辑卷。