跳至内容

Linux 指南/Linux 如何运作

来自维基教科书,开放的书籍,开放的世界

Linux 哲学

[编辑 | 编辑源代码]

Linux 的构建秉持着一定的一套统一原则。理解这些原则对于理解整个系统的工作方式非常有帮助。它们被称为“Linux 之道”,源于 UNIX 系统背后的理念。

Linux 之道可以概括为

  • 使用只做一件事但做好一件事的程序。
  • 为了完成复杂的任务,使用几个程序相互连接。
  • 尽可能地将信息存储在人类可读的纯文本文件中。
  • 做任何事都没有“唯一正确的方法”。
  • 优先选择命令行工具而不是图形工具。

Linux 的大多数特性都是这些原则的结果。根据这些原则,Linux 系统由小而可替换的组件构成。我们将更详细地考察其中最重要的组件。它们是:引导加载程序、内核、Shell、X 窗口服务器、窗口管理器和桌面环境。之后,我们将看一下 Linux 中的文件系统。最后,我们将讨论运行 Linux 的计算机的安全性。

Linux 系统的核心组件

[编辑 | 编辑源代码]

引导加载程序

[编辑 | 编辑源代码]

这是系统中第一个执行的部分。当您只安装了一个操作系统时,它会简单地加载内核(见下文)。如果您碰巧安装了多个操作系统或多个版本的 Linux 内核,它允许您选择要启动哪个。最流行的引导加载程序是 GRUB(GRand Unified Bootloader)和 Lilo(LInux LOader)。大多数用户无需关心引导加载程序,因为它会自动安装和配置。实际上,引导加载程序创建了 Linux 内核所需的引导序列,将内核和引导过程早期所需的某些设备驱动程序加载到内存中(作为所谓的“initramfs”的一部分),并启动内核。

内核是系统中的核心组件,它直接与硬件通信。事实上,“Linux”这个名称恰当地指代了这种特定类型的软件。它允许程序忽略不同计算机之间的差异。内核将系统资源(如内存、处理器时间、硬盘空间和外部设备)分配给在计算机上运行的程序。它将每个程序与其他程序隔离开来,以便当其中一个程序遇到错误时,其他程序不会受到影响。大多数用户在日常使用中无需担心内核,但某些软件或硬件可能需要或在某些内核版本下运行得更好。

守护进程

[编辑 | 编辑源代码]

在典型的 Linux 系统中,有各种服务作为后台进程运行,负责诸如配置网络连接、响应已连接的 USB 设备、管理用户登录、管理文件系统等任务。它们通常被称为“守护进程”,因为它们在后台静默运行,对用户来说大多是不可见的。

其中一个由内核在完成自身引导后启动的“守护进程”称为init,它的作用是启动系统的其余部分,包括所有其他“守护进程”和图形会话。

不同的 Linux 发行版使用不同的init系统。自旧 Unix 时代以来一直使用的传统 init 系统是Sys V init(指的是 System V Unix)。但最近许多发行版已切换到更现代的 init 系统,例如systemd

Shell,有时也称为“命令行”,实现了一个文本界面,允许您通过从键盘输入命令来运行程序和控制系统。没有 Shell(或可以替代它的东西,比如桌面环境),让您的系统真正做一些事情会很困难。Shell只是一个程序;Linux 有几种不同的 Shell,每种 Shell 都提供了一些不同的功能。大多数 Linux 系统使用 Bourne Again Shell(Bash)。Linux Shell 支持多任务处理(同时运行多个程序)。

X 窗口服务器

[编辑 | 编辑源代码]

X 窗口服务器是命令 Shell 的图形替代品。它负责绘制图形并处理来自键盘、鼠标、平板电脑和其他设备的输入。X 服务器是网络透明的;也就是说,它允许您在自己的计算机和通过网络连接的远程计算机上都可以在图形环境中工作。如今最常用的 X 服务器是 X.Org。大多数图形程序只需要 X 服务器才能运行,因此它们可以在任何窗口管理器和桌面环境下使用。

窗口管理器

[编辑 | 编辑源代码]

窗口管理器是一个与 X 服务器通信的程序。它的任务是管理窗口。它负责绘制窗口边框,在您单击窗口时将其置于最前面,在屏幕上移动它以及在您最小化其程序时将其隐藏。流行的窗口管理器的示例包括

  • Metacity - GNOME 桌面环境窗口管理器
  • KWin - KDE 窗口管理器
  • Xfwm - Xfce 窗口管理器,一个轻量级管理器,旨在尽可能少地消耗资源,而不会影响可用性
  • Compiz Fusion - 一种高级窗口管理器,具有许多视觉效果,如可自定义的窗口动画、放置在您可以用鼠标旋转的立方体上的多个桌面、透明的窗口边框、在拖动窗口时晃动窗口等。

桌面环境

[编辑 | 编辑源代码]

桌面环境(如 GNOME 桌面环境KDEXfce)是旨在为大多数常见任务提供一致的用户界面的程序集合。它们是大多数人在说“操作系统”时所指的,即使它们只是整个操作系统的部分。同一台机器可以共存多个桌面环境。它们可以轻松安装,安装后,用户将可以选择使用哪个 DE 来启动会话。

文件系统

[编辑 | 编辑源代码]

基于 Linux 的发行版使用几种文件系统。它们是 BTRFS、EXT3/4、VFS、NILFS 和 SquashFS。

计算机硬盘的接口非常简单。它只接受“读取 550923 号数据块并将其放入内存地址 0x0021A400”之类的指令。假设您正在编辑一段文字并想将其保存到磁盘上。使用数据块编号(地址)来标识数据块,例如您的文字,这很麻烦:您不仅要告诉您的程序在哪里使用原始数据块编号保存文件,而且您还要确保这些数据块没有被用于家庭照片,您的音乐收藏,甚至您的系统内核。为了解决这个问题,引入了文件。文件是磁盘上存储数据的区域,它有名称(例如“example.txt”)。文件被组织在称为目录的集合中。目录可以包含其他目录,形成树状结构。每个文件都可以通过“路径”进行唯一识别,该路径描述了它在目录层次结构中的位置。在本节的剩余部分中,将假设您熟悉文件、目录和路径。

在 Linux 中,顶层目录称为根目录。系统中的每个文件和目录都必须是根目录的后代。(通常使用家庭关系的术语来谈论目录,例如“父级”、“子级”、“后代”、“祖先”、“兄弟姐妹”等等。)文件和目录的名称可以包含除空字符(无法从键盘输入)和“/”字符之外的所有字符。一个示例路径是

/var/logs/apache/error.log

此路径是指一个名为“error.log”的文件,它位于名为“apache”的目录中,该目录是名为“logs”的目录的子目录,该目录是名为“var”的目录的子目录,该目录是根目录的子目录。根目录没有像其他目录一样的名称;它只是用路径开头的“/”字符表示。

根目录通常只包含少量子目录。最重要的是

  • bin - 执行基本任务所需的程序,例如更改目录或复制文件
  • dev - 表示硬件设备的特殊文件
  • etc - 配置文件
  • home - 包含用户的私有目录
  • mediamnt - 挂载点,用于连接到此计算机的外部驱动器,例如 CD 或 USB 密钥
  • tmp - 临时文件
  • usr - 安装在计算机上的程序
  • var - 程序产生的可变数据,例如错误日志

设备作为文件

[edit | edit source]

正如可以写入和读取文件一样,计算机系统中的设备也可以发送和接收数据。因此,Linux 将连接到系统的设备表示为/dev目录中的文件。这些文件不能重命名或移动(它们没有存储在任何磁盘上)。这种方法极大地简化了应用程序编程。如果您想通过串行端口将某些内容发送到另一台计算机,您甚至不需要另一个程序——您只需写入文件/dev/ttyS0即可,该文件表示串行端口。以相同的方式,表示声卡(/dev/dsp)的文件可以被读取以捕捉连接的麦克风的声音,或者被写入以通过扬声器发出声音。

驱动器盘符在哪里?

[edit | edit source]

如果您使用过 Windows,您可能会惊讶地发现 Linux 中没有驱动器盘符。根目录表示安装系统的驱动器(在 Windows 中为 C:)。其他驱动器可以在文件系统中的任何目录(最好是空的目录)中“挂载”或“卸载”。通过挂载磁盘,您将此磁盘的根目录附加到文件系统中的目录。之后,您可以像访问系统磁盘一样访问磁盘。例如:如果您有一个包含目录text的磁盘,该目录又包含一个名为linux-intro.tex的文件,并且您将此驱动器挂载到目录/media/usbkey中,您就可以通过路径/media/usbkey/text/linux-intro.tex访问文件linux-intro.tex

在大多数 Linux 发行版中,USB 密钥和 CD 在插入或连接时会自动挂载,默认挂载目录是/media/mnt的子目录。例如,您的第一个 CD-ROM 驱动器可能会挂载在/media/cdrom0,而 USB 密钥的内容可能可以通过/media/usb0访问。您可以手动更改挂载目录,但您必须学习两个 shell 命令并知道代表您的驱动器的设备文件(我们在上一节中谈到的——磁盘也在/dev目录中获得其文件表示)。我们将在后面介绍这个主题。

用户

[edit | edit source]

用户是与系统交互的人或事物的隐喻。用户通过用户名和密码识别。在内部,每个用户都有一个唯一的数字分配,称为用户 ID,简称 UID。您只需要在某些罕见的情况下知道您的 UID。用户还可以被组织到组中。在所有 Linux 系统中,都存在一个特殊用户,其用户名为“root”,UID 为 0。它也称为超级用户。超级用户可以执行任何操作,不受任何安全机制的控制。拥有这样的用户帐户对于管理任务和配置系统非常有用。在某些发行版(如 Ubuntu)中,直接访问 root 帐户被禁用,而是使用其他机制。

如果您在 Linux 系统上有多个用户帐户,您无需注销并重新登录即可切换身份模拟。存在一些特殊的 shell 命令,允许您以其他用户身份访问文件和执行程序,前提是您知道他们的用户名和密码。由于这种机制,您可以将大部分时间作为低权限用户,只有在需要时才切换到高权限帐户。

以非特权用户身份运行的优点是,您碰巧犯下的任何错误都很不可能损坏系统。系统关键组件只能由 root 用户更改。

文件权限

[edit | edit source]

用户的存在是为了控制使用系统的人员和程序可以控制系统的程度。这是通过文件权限系统实现的。每个文件都属于一个用户——也就是说,每个文件都有一个所有者。此外,文件可以分配给一组用户,但所有者必须是该组的成员。每个文件都有三种类型的权限:执行。这些权限可以分配给三种所有者关系:所有者其他其他包括所有不是文件所有者且不属于拥有该文件的组的用户。只有文件所有者或超级用户(root)可以更改文件的权限或所有权。

此系统允许对谁可以在给定计算机上执行什么进行精确控制。可以通过从系统文件上删除“写入”权限来阻止用户修改系统文件,或者通过删除“执行”权限来阻止用户执行某些命令。请注意,用户可能被允许执行程序,但不能修改它们。这一点非常重要,因为大多数 Linux 系统都包含一个编译器,允许您创建自己的程序。

文件权限通常以三个八进制数字表示(每个数字从 0 到 7)。数字分别代表所有者、组和其他用户的权限。每个数字都是权限代码的总和:执行为 1,写入为 2,读取为 4。例如,“755”允许每个人读取或执行文件,但只有所有者可以写入它。“400”允许所有者读取文件,而其他人则不允许执行任何操作。“540”允许所有者读取或执行文件,组成员只能读取文件,而其他用户则不允许执行任何操作。

chmod(更改模式)、chown(更改所有者)和chgrp(更改组)用于更改文件权限。

华夏公益教科书