是时候深入了解Linux的系统结构了

4,131 阅读19分钟

作为一名开发者或极客,Linux 才配得上你的高逼格
本篇描述的是Linux的介绍及结构,让你认识这位性感的 丽娜丝 女士

什么是 Linux ?

如果你以前从未接触过Linux,可能就不清楚为什么会有这么多不同的Linux发行版。在查看Linux软件包时,你肯定被发行版、LiveCD和GNU之类的术语搞晕过。初次进入Linux世界会让人觉得不那么得心应手。在开始学习命令和脚本之前,本章将为你稍稍揭开Linux系统的神秘面纱。首先,Linux可划分为以下四部分:

  1. ↪ Linux内核
  2. ↪ GNU工具链
  3. ↪ GUI桌面环境
  4. 应用软件 ...
|--------------------------|
|          APPS            |        应用软件
|--------------------------|
|                          |        GUI桌面环境
|     GUI    |-------------|
|            |    GNU      |        GNU工具链
|--------------------------|
|         kernel           |        Linux内核
|--------------------------|
|         hardware         |        计算机硬件
----------------------------

1. Linux 内核

Linux系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。

  1. 系统内存管理
  2. 应用程序管理
  3. 硬件设备管理
  4. 文件系统管理

1. 系统内存管理

操作系统内核的主要功能之一就是内存管理。内核不仅管理服务器上的可用物理内存,还可以创建和管理虚拟内存(即实际并不存在的内存)

  • 内核通过硬盘上的存储空间来实现虚拟内存,这块区域称为交换空间(swap space)。内核不断地在交换空间和实际的物理内存之间反复交换虚拟内存中的内容。这使得系统以为它拥有比物理内存更多的可用内存

  • Linux系统内存映射

|---------|             -----------
|         |             | 物理内存 |
|         |             /----------
|         |    ---------
| 虚拟内存 | —— |  内核  |
|         |    ---------
|         |             \---------- 
|         |             | 交换空间 |
|---------|             -----------

2. 应用程序管理

Linux操作系统将运行中的程序称为进程。进程可以在前台运行,将输出显示在屏幕上,也可以在后台运行,隐藏到幕后。内核控制着Linux系统如何管理运行在系统上的所有进程。

  • 内核创建了第一个进程(称为init进程)来启动系统上所有其他进程。当内核启动时,它会将init进程加载到虚拟内存中。内核在启动任何其他进程时,都会在虚拟内存中给新进程分配一块专有区域来存储该进程用到的数据和代码。

  • Linux操作系统有5个启动运行级

    • 运行级为1时,只启动基本的系统进程以及一个控制台终端进程。我们称之为单用户模式。单用户模式通常用来在系统有问题时进行紧急的文件系统维护。显然,在这种模式下,仅有一个人(通常是系统管理员)能登录到系统上操作数据。
    • 标准的启动运行级是3。在这个运行级上,大多数应用软件,比如网络支持程序,都会启动。
    • Linux中常见的运行级是5。在这个运行级上系统会启动图形化的X Window系统,允许用户通过图形化桌面窗口登录系统。

3. 硬件设备管理

内核的另一职责是管理硬件设备。任何Linux系统需要与之通信的设备,都需要在内核代码中加入其驱动程序代码。驱动程序代码相当于应用程序和硬件设备的中间人,允许内核与设备之间交换数据。在Linux内核中有两种方法用于插入设备驱动代码:

  • 编译进内核的设备驱动代码
  • 可插入内核的设备驱动模块

以前,插入设备驱动代码的唯一途径是重新编译内核。每次给系统添加新设备,都要重新编译一遍内核代码。随着Linux内核支持的硬件设备越来越多,这个过程变得越来越低效。不过好在Linux开发人员设计出了一种更好的将驱动代码插入运行中的内核的方法。

开发人员提出了内核模块的概念。它允许将驱动代码插入到运行中的内核而无需重新编译内核。同时,当设备不再使用时也可将内核模块从内核中移走。这种方式极大地简化和扩展了硬件设备在Linux上的使用。

  • Linux系统将硬件设备当成特殊的文件,称为设备文件。设备文件有3种分类:

    • 字符型设备文件
      • 字符型设备文件是指处理数据时每次只能处理一个字符的设备。大多数类型的调制解调器和终端都是作为字符型设备文件创建的。
    • 块设备文件
      • 块设备文件是指处理数据时每次能处理大块数据的设备,比如硬盘。
    • 网络设备文件
      • 网络设备文件是指采用数据包发送和接收数据的设备,包括各种网卡和一个特殊的回环设备。这个回环设备允许Linux系统使用常见的网络编程协议同自身通信。
  • Linux为系统上的每个设备都创建一种称为节点的特殊文件。与设备的所有通信都通过设备节点完成。每个节点都有唯一的数值对供Linux内核标识它。数值对包括一个主设备号和一个次设备号。类的设备被划分到同样的主设备号下。次设备号用于标识主设备组下的某个特定设备。

4. 文件系统管理

不同于其他一些操作系统,Linux内核支持通过不同类型的文件系统从硬盘中读写数据。除 了自有的诸多文件系统外,Linux还支持从其他操作系统(比如Microsoft Windows)采用的文件 系统中读写数据。内核必须在编译时就加入对所有可能用到的文件系统的支持。表1-1列出了 Linux系统用来读写数据的标准文件系统。

ext      | Linux扩展文件系统,最早的Linux文件系统
ext2     | 第二扩展文件系统,在ext的基础上提供了更多的功能
ext3     | 第三扩展文件系统,支持日志功能
ext4     | 第四扩展文件系统,支持高级日志功能
hpfs     | OS/2高性能文件系统
jfs      | IBM日志文件系统
iso9660  | ISO 9660文件系统(CD-ROM)
minix    | MINIX文件系统
msdos    | 微软的FAT16
ncp      | Netware文件系统
nfs      | 网络文件系统
ntfs     | 支持Microsoft NT文件系统
proc     | 访问系统信息
ReiserFS | 高级Linux文件系统,能提供更好的性能和硬盘恢复功能
smb      | 支持网络访问的Samba SMB文件系统
sysv     | 较早期的Unix文件系统
ufs      | BSD文件系统
umsdos   | 建立在msdos上的类Unix文件系统
vfat     | Windows 95文件系统(FAT32)
XFS      | 高性能64位日志文件系统
  • Linux服务器所访问的所有硬盘都必须格式化成表1-1所列文件系统类型中的一种。
  • Linux内核采用虚拟文件系统(Virtual File System,VFS)作为和每个文件系统交互的接口。这为Linux内核同任何类型文件系统通信提供了一个标准接口。当每个文件系统都被挂载和使用时,VFS将信息都缓存在内存中。

2. GNU工具链

GNU组织(GNU是GNU’s Not Unix的缩写)开发了一套完整的Unix工具,但没有可以运行它们的内核系统。这些工具是在名为开源软件(open source software,OSS)的软件理念下开发的。

开源软件理念允许程序员开发软件,并将其免费发布。任何人都可以使用、修改该软件,或将该软件集成进自己的系统,无需支付任何授权费用。将Linus的Linux内核和GNU操作系统工具整合起来,就产生了一款完整的、功能丰富的免费操作系统。

  • 尽管通常将Linux内核和GNU工具的结合体称为Linux, 但你也会在互联网上看到一些Linux纯粹主义者将其称为GNU/Linux系统,藉此向GNU组织所作的贡献致意

核心GNU工具

GNU coreutils软件包由三部分构成:

  • 用以处理文件的工具
  • 用以操作文本的工具
  • 用以管理进程的工具

Shell

GNU/Linux shell是一种特殊的交互式工具。它为用户提供了启动程序、管理文件系统中的文件以及运行在Linux系统上的进程的途径。 shell的核心是命令行提示符。命令行提示符是shell负责交互的部分。它允许你输入文本命令,然后解释命令,并在内核中执行。

  • 我们在命令行中输入的命令都是GNU工具链提供,而非Linux内核
  • 所有Linux发行版默认的shell都是bash shell。bash shell由GNU项目开发,被当作标准Unix shell——Bourne shell(以创建者的名字命名)的替代品。
  • Linux中常见的几种不同 shell
bash | 由GNU项目开发,被当作标准shell
ash  | 运行在内存受限环境中简单的轻量级shell,但与bash shell完全兼容
korn | 与Bourne shell兼容的编程shell,但支持如关联数组和浮点运算等一些高级的编程特性
tcsh | 将C语言中的一些元素引入到shell脚本中的shell
zsh  | 结合了bash、tcsh和korn的特性,同时提供高级编程特性、共享历史文件和主题化提示符的高级shell

3. Linux 桌面环境

在Linux的早期(20世纪90年代初期),能用的只有一个简单的Linux操作系统文本界面。这个文本界面允许系统管理员运行程序,控制程序的执行,以及在系统中移动文件。

随着Microsoft Windows的普及,电脑用户已经不再满足于对着老式的文本界面工作了。这推动了OSS社区的更多开发活动,Linux图形化桌面环境应运而生。

  • X Window系统

有两个基本要素决定了视频环境:显卡和显示器。要在电脑上显示绚丽的画面,Linux软件就得知道如何与这两者互通。X Window系统是图形显示的核心部分。

X Window系统,是直接和PC上的显卡及显示器打交道的底层程序。它控制着Linux程序如何在电脑上显示出漂亮的窗口和图形

  • 现在流行的桌面环境有 Unity GNOME Cinnamon Xfce



Linux 发行版

已经了解了构成完整Linux系统所需要的4个关键部件,那你可能在考虑要怎样才能把它们组成一个Linux系统。幸运的是,已经有人为你做好这些了


核心 Linux 发行版

核心Linux发行版含有内核、一个或多个图形化桌面环境以及预编译好的几乎所有能见到的Linux应用。它提供了一站式的完整Linux安装

Slackware | 最早的Linux发行版中的一员,在Linux极客中比较流行
Redhat    | 主要用于Internet服务器的商业发行版
Gentoo    | 为高级Linux用户设计的发行版,仅包含Linux源代码
openSUSE  | 用于商用和家用的发行版
Debian    | 在Linux专家和商用Linux产品中流行的发行版

系统目录

|—— bin             # 二进制目录,存放用户级的GNU工具(bash命令)
|—— boot            # 启动目录,存放用于系统引导时使用的各种文件
|—— dev             # 设备目录,存放硬件设备,创建设备节点
|—— etc             # 系统配置文件目录,存放系统管理和配置文件
|—— home            # 普通用户的主目录
|—— lib             # 库目录,存放系统和应用程序的动态链接库
|—— lost+found      # 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件
|—— media           # 媒体目录,可移动媒体设备的常用挂载点
|—— mnt             # 挂载目录,另一个可移动媒体设备的常用挂载点
|—— opt             # 可选目录,常用于存放第三方软件包和数据文件
|—— proc            # 进程目录,存放现有硬件及当前进程的相关信息,是系统内存的映射。可直接访问这个目录来获取系统信息
|—— root            # 超级用户的主目录
|—— run             # 运行目录,存放系统运作时的运行时数据
|—— sbin            # 系统二进制目录,存放许多GNU管理员级工具
|—— srv             # 服务目录,存放本地服务的相关文件
|—— sys             # 系统目录,存放系统硬件信息的相关文件
|—— tmp             # 临时目录,可以在该目录中创建和删除临时工作文件,重启后清空
|—— usr             # 用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里
|   |—— bin         # 包含系统安装的可执行程序。通常,这个目录会包含许多程序
|   |—— games       # 
|   |—— include     # 写程序需要使用到的一些头文件
|   |—— lib         # 包含由/usr/bin 目录中的程序所用的共享库
|   |—— local       # 是非系统发行版自带,却打算让系统使用的程序的安装目录。 通常,由源码编译的程序会安装在/usr/local/bin 目录下
|   |—— sbin        # 包含许多系统管理程序
|   |—— share       # 存放帮助文档和共享文件
|   |—— src         # 
|—— var             # 可变目录,用以存放经常变化的文件,比如日志文件

文件权限-权限符

  • 命令行执行: ls -l
drwxr-xr-x

# 文件类型  属主权限 成员权限 其他用户权限
  d        rwx     r-x     r-x

|—— 文件类型
|   |—— - # 文件
|   |—— d # 文件夹
|   |—— l # 链接
|   |—— c # 字符型设备
|   |—— b # 块设备
|   |—— n # 网络设备
|
|—— r # 可读权限
|—— w # 可写权限
|—— x # 可执行权限

文件系统

  • ext

Linux操作系统中引入的最早的文件系统叫作扩展文件系统 (extended filesystem,简记为ext)。它为Linux提供了一个基本的类Unix文件系统:使用虚拟目录来操作硬件设备,在物理设备上按定长的块来存储数据。

ext文件系统采用名为索引节点的系统来存放虚拟目录中所存储文件的信息。索引节点系统在每个物理设备中创建一个单独的表(称为索引节点表)来存储这些文件的信息。存储在虚拟目录中的每一个文件在索引节点表中都有一个条目。ext文件系统名称中的extended部分来自其跟踪的每个文件的额外数据

- 文件名
- 文件大小
- 文件的属主
- 文件的属组
- 文件的访问权限
- 指向存有文件数据的每个硬盘块的指针

Linux通过唯一的数值(称作索引节点号)来引用索引节点表中的每个索引节点,这个值是创建文件时由文件系统分配的。文件系统通过索引节点号而不是文件全名及路径来标识文件。

  • ext2

最早的ext文件系统有不少限制,比如文件大小不得超过2 GB。在Linux出现后不久,ext文件系统就升级到了第二代扩展文件系统,叫作ext2

日志文件系统

日志文件系统为Linux系统增加了一层安全性。它不再使用之前先将数据直接写入存储设备再更新索引节点表的做法,而是先将文件的更改写入到临时文件(称作日志,journal)中

在数据成功写到存储设备和索引节点表之后,再删除对应的日志条目。如果系统在数据被写入存储设备之前崩溃或断电了,日志文件系统下次会读取日志文件并处理上次留下的未写入的数据

  • ext3

2001年,ext3文件系统被引入Linux内核中,直到最近都是几乎所有Linux发行版默认的文件系统。它采用和ext2文件系统相同的索引节点表结构,但给每个存储设备增加了一个日志文件,以将准备写入存储设备的数据先记入日志。

  • ext4

ext4文件系统在 2008 年受到Linux内核官方支持,现在已是大多数流行的Linux发行版采用的默认文件系统

除了支持数据压缩和加密,ext4文件系统还支持一个称作区段(extent)的特性。区段在存储设备上按块分配空间,但在索引节点表中只保存起始块的位置。由于无需列出所有用来存储文件中数据的数据块,它可以在索引节点表中节省一些空间。

ext4还引入了块预分配技术(block preallocation)。如果你想在存储设备上给一个你知道要变大的文件预留空间,ext4文件系统可以为文件分配所有需要用到的块,而不仅仅是那些现在已经用到的块。ext4文件系统用 0 填满预留的数据块,不会将它们分配给其他文件

Linux 中的 LVM

Linux LVM是由Heinz Mauelshagen开发的,于1998年发布到了Linux社区。它允许你在Linux上用简单的命令行命令管理一个完整的逻辑卷管理环境

  • LVM1

最初的LVM包于1998年发布,只能用于Linux内核2.4版本。它仅提供了基本的逻

  • LVM2

LVM的更新版本,可用于Linux内核2.6版本。它在标准的LVM1功能外提供了额外的功能。

  • 快照

最初的Linux LVM允许你在逻辑卷在线的状态下将其复制到另一个设备。这个功能叫作快照。在备份由于高可靠性需求而无法锁定的重要数据时,快照功能非常给力。传统的备份方法在将文件复制到备份媒体上时通常要将文件锁定。快照允许你在复制的同时,保证运行关键任务的Web服务器或数据库服务器继续工作。遗憾的是,LVM1只允许你创建只读快照。一旦创建了快照,就不能再写入东西了

LVM2允许你创建在线逻辑卷的可读写快照。有了可读写的快照,就可以删除原先的逻辑卷,然后将快照作为替代挂载上。这个功能对快速故障转移或涉及修改数据的程序试验(如果失败,需要恢复修改过的数据)非常有用。

  • 条带化

LVM2提供的另一个引人注目的功能是条带化(striping)。有了条带化,可跨多个物理硬盘创建逻辑卷。当Linux LVM将文件写入逻辑卷时,文件中的数据块会被分散到多个硬盘上。每个后继数据块会被写到下一个硬盘上。条带化有助于提高硬盘的性能,因为Linux可以将一个文件的多个数据块同时写入多个硬盘,而无需等待单个硬盘移动读写磁头到多个不同位置。这个改进同样适用于读取顺序访问的文件,因为LVM可同时从多个硬盘读取数据。

  • 镜像

通过LVM安装文件系统并不意味着文件系统就不会再出问题。和物理分区一样,LVM逻辑卷也容易受到断电和磁盘故障的影响。一旦文件系统损坏,就有可能再也无法恢复。

LVM快照功能提供了一些安慰,你可以随时创建逻辑卷的备份副本,但对有些环境来说可能还不够。对于涉及大量数据变动的系统,比如数据库服务器,自上次快照之后可能要存储成百上千条记录。

这个问题的一个解决办法就是LVM镜像。镜像是一个实时更新的逻辑卷的完整副本。当你创建镜像逻辑卷时,LVM会将原始逻辑卷同步到镜像副本中。根据原始逻辑卷的大小,这可能需要一些时间才能完成。

一旦原始同步完成,LVM会为文件系统的每次写操作执行两次写入——一次写入到主逻辑卷,一次写入到镜像副本。可以想到,这个过程会降低系统的写入性能。就算原始逻辑卷因为某些原因损坏了,你手头也已经有了一个完整的最新副本!


小结

在Linux上使用存储设备需要懂一点文件系统的知识。当工作在Linux系统下时,懂得如何在命令行下创建和处理文件系统能帮上你的忙。Linux系统和Windows的不同之处在于前者支持大量不同的存储文件和目录的方法。每个文件系统方法都有不同的特性,使其适用于不同的场景

fdisk 命令用来对存储设备进行分区,以便安装文件系统。在分区存储设备时,必须定义在上面使用什么类型的文件系统。划分完存储设备分区后,你可以为该分区选用一种文件系统。流行的Linux文件系统包括ext3和ext4。两者都提供了日志文件系统功能,降低它们在Linux系统崩溃时遇到错误或问题的几率

在存储设备分区上直接创建文件系统的一个限制因素是,如果硬盘空间用完了,你无法轻易地改变文件系统的大小。但Linux支持逻辑卷管理,这是一种跨多个存储设备创建虚拟分区的方法。这种方法允许你轻松地扩展一个已有文件系统,而不用完全重建。Linux LVM包提供了跨多个存储设备创建逻辑卷的命令行命令。


如有写错或不对的地方,请指正