Linux-基础
内容列表
Linux 是在做一些较为底层的开发工作时的必要开发环境,了解 Linux 也对操作系统概念的理解有很大的帮助,这篇文章是对 Linux 的一些基础概念的阐述。
Linux
Linux 的诞生是在上世纪 90 年代,距离现在也就二十年左右,是一种优秀的开发环境,大多时候应用在嵌入式系统开发当中。Linux 是一个开源的基于 POSIX 和 UNIX,支持多用户、多任务、多线程和多 CPU 的操作系统。事实上,linux 指的是其操作系统的内核。
特点
下面是一些 Linux 系统的一些特点。
开源
Linux 操作系统的源代码是公开的,遵循 GPL 协议(开源协议),所以 Linux 允许任何人去查看它的源代码,并进行修改。这对于开发人员来说相当于提供了一个了解操作系统原理的绝佳机会。
免费
Linux 操作系统的使用是免费的,但需要遵循 GPL 协议。很多人认为开源即免费,这其实是个概念上的错误。有很多的商业项目是开源的,开源即允许个人用户去查看源代码,了解其实现过程,但并不意味着你可以将其免费用作商业用途。但是,Linux 不仅是开源的,还是免费的。还需要注意的一点就是,Linux 有不同的发行版本,部分都有商业公司支持,这样的 Linux 用作商业用途的话需要购买其许可证,之后会得到更好的技术服务支持。
兼容 POSIX 标准
POSIX 是一种可移植操作系统接口标准,POSIX 标准定义了操作系统应该为应用程序提供的接口标准,是 IEEE 为要在各种 UNIX 操作系统上运行的软件而定义的一系列 API 标准的总称,其正式称呼为 IEEE 1003,而国际标准名称为 ISO/IEC 9945。这样的好处就是,在 Linux 环境下,我们可以通过相应的模拟器运行常见的 DOS、Windows 的程序。
多用户、多任务
与微软 Windows 系统一样,Linux 也支持多用户、多任务、多线程、多 CPU,这是现代操作系统所必须具备的能力。
基于命令行
Linux 操作系统准确的说是一个基于命令行的系统,它并没有实现 GUI(图形用户界面),这就是和微软 Windows 的不同之处,这也使得 Linux 根本不可能面向社会上的大众用户。
可移植性
Linux 可运行在不同的 CPU 平台上,可移植性很强,所以 Linux 在嵌入式系统开发当中应用广泛。
Linux 的组成
首先,Linux 可划分为以下四部分:
- Linux 内核
- GNU 工具
- 图形化桌面环境
- 应用软件
Linux 内核
**Linux 系统的核心是内核。**内核控制着计算机系统上所有的硬件和软件,在必要时分配硬件,并根据需要执行软件。
内核主要负责以下四种功能:
- 系统内存管理
- 软件程序管理
- 硬件设备管理
- 文件系统管理
**Linux 操作系统对于用户空间和内核空间有严格的区分,他们之间有明显的界限。**用户空间主要包含 GNU C 库(glibc)和用户应用程序(User Applications)等;内核空间则包含系统调用接口(System Call Interface,SCI)、内核(Kernel)、板级支持包(Board Support Package,BSP)三层。
Windows 系统的内核是 NT,它是一种微内核,只提供操作系统必要的功能,例如进程管理,内存管理等等,微内核可以更方便的进行升级,扩展;而** Linux 操作系统的内核是 linux,它是一种宏内核**,不仅在内核中实现了操作系统必要的服务,而且硬件设备驱动也存在于内核中,内核效率相对于微内核来说较高,对硬件设备支持也更全面。所有不同发行版本的 Linux 操作系统都是使用的统一标准的 linux 内核,版本号由 Linux 社区所控制。
linux 内核主要包含以下几部分子系统:
系统调用接口(System Call Interface,SCI)
系统调用接口主要实现从用户空间到内核的函数调用,是一个非常有用的函数调用多路复用和多路分解服务。
进程管理(Process Management,PM)
进程管理主要完成进程调度,管理进程共享内存空间等。
内存管理(Memory Management,MM)
内存管理主要完成对系统内存资源的管理,以及实现虚拟内存和硬盘资源交换。
虚拟文件系统(Virtual File System,VFS)
虚拟文件系统是为文件系统提供的通用的借口抽象,为 SCI 和内核与文件系统之间提供了一个交换层。
网络堆栈(Network Stack)
网络堆栈提供了大量的网络协议的用户接口,例如 IP、TCP 协议。
设备驱动(Device Drivers,DD)
包含了硬件设备驱动,并且占用了内核大量的资源。
依赖体系结构的代码(Arch)
包含 linux 内核支持的硬件体系结构相关的核心代码。
linux 内核还是一个动态内核,支持动态添加或删除软件组件,可以在任何时候根据需要将特定模块进行插入,即实现用户定制功能。
文件(设备)系统
Linux 操作系统支持非常多的文件系统类型,例如 ext、ext2、ext3、ext4、iso9660、xfs、ntfs、proc 等等。而且,**Linux 中的一切设备都抽象成为了文件,用户通过设备文件(设备节点)来使用设备驱动操作设备。**Linux 系统中将设备分为三类:
字符设备
指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等,用字节流存取文件,没有缓冲区。
块设备
块设备可以从设备的任意位置读取一定长度数据的设备,包括硬盘、磁盘、U 盘、SD 卡等,有缓冲区。
网络设备
网络设备不同于前两者,不能直接对文件进行操作,不能直接访问网络设备驱动,在 Linux 中通过设备接口和 Socket(套接字)技术(协议)来进行网络设备(进程)之间的通信,从而访问网络设备驱动,实现对网络设备的操作。
GNU 工具
除了由内核控制硬件设备外,操作系统还需要工具来执行一些标准功能,比如控制文件和程序。Linus 在创建 Linux 系统内核时,并没有可用的系统工具。
GNU 组织(GNU 是 GNU’s Not Unix 的缩写)开发了一套完整的 Unix 工具,但没有可以运行它们的内核系统。这些工具是在名为开源软件(open source software,OSS)的软件理念下开发的。
**将 Linus 的 Linux 内核和 GNU 操作系统工具整合起来,就产生了一款完整的、功能丰富的免费操作系统。**因此,Linux 操作系统又称 GNU/Linux 系统。
核心 GNU 工具
GNU 项目的主旨在于为 Unix 系统管理员设计出一套类似于 Unix 的环境。这个目标促使该项目移植了很多常见的 Unix 系统命令行工具。供 Linux 系统使用的这组核心工具被称为 coreutils(core utilities)软件包。
GNU coreutils 软件包由三部分构成:
- 用以处理文件的工具
- 用以操作文本的工具
- 用以管理进程的工具
shell
GNU/Linux shell 是一种特殊的交互式工具。它为用户提供了启动程序、管理文件系统中的文件以及运行在 Linux 系统上的进程的途径。shell 的核心是命令行提示符。命令行提示符是 shell 负责交互的部分。它允许你输入文本命令,然后解释命令,并在内核中执行。
shell 包含了一组内部命令,用这些命令可以完成诸如复制文件、移动文件、重命名文件、显示和终止系统中正运行的程序等操作。shell 也允许你在命令行提示符中输入程序的名称,它会将程序名传递给内核以启动它。
你也可以将多个 shell 命令放入文件中作为程序执行。这些文件被称作 shell 脚本。你在命令行上执行的任何命令都可放进一个 shell 脚本中作为一组命令执行。
在 Linux 系统上,通常有好几种 Linux shell 可用。不同的 shell 有不同的特性,有些更利于创建脚本,有些则更利于管理进程。所有 Linux 发行版默认的 shell 都是 bash shell。bash shell 由 GNU 项目开发,被当作标准 Unix shell——Bourne shell(以创建者的名字命名)的替代品。bash shell 的名 称就是针对 Bourne shell 的拼写所玩的一个文字游戏,称为 Bourne again shell。
Linux 桌面环境
在 Linux 的早期(20 世纪 90 年代初期),能用的只有一个简单的 Linux 操作系统文本界面。这个文本界面允许系统管理员运行程序,控制程序的执行,以及在系统中移动文件。
随着 Microsoft Windows 的普及,电脑用户已经不再满足于对着老式的文本界面工作了。这推动了 OSS(open source software)社区的更多开发活动,Linux 图形化桌面环境应运而生。Linux 有各种图形化桌面可供选择。
X Window 系统
X Window 软件是直接和 PC 上的显卡及显示器打交道的底层程序。它控制着 Linux 程序如何在电脑上显示出漂亮的窗口和图形。Linux 并非唯一使用 X Window 的操作系统,它有针对不同操作系统的版本。
核心的 X Window 软件可以产生图形化显示环境,但仅此而已。虽然对于运行独立应用这已经足够,但在日常 PC 使用中却并不是那么有用。它没有桌面环境供用户操作文件或是开启程序。为此,你需要一个建立在 X Window 系统软件之上的桌面环境。
KDE 桌面
KDE(K Desktop Environment,K 桌面环境)最初于 1996 年作为开源项目发布。它会生成一个类似于 Microsoft Windows 的图形化桌面环境。
KDE 桌面允许你把应用程序图标和文件图标放置在桌面的特定位置上。单击应用程序图标,Linux 系统就会运行该应用程序。单击文件图标,KDE 桌面就会确定使用哪种应用程序来处理该文件。
GNOME 桌面
GNOME(the GNU Network Object Model Environment,GNU 网络对象模型环境)是另一个流行的 Linux 桌面环境。GNOME 于 1999 年首次发布,现已成为许多 Linux 发行版默认的桌面环境(不过用得最多的是 Red Hat Linux)。
Unity 桌面
这是 Ubuntu 的公司自己开发的一套叫作 Unity 的 Linux 桌面环境。Unity 桌面得名于该项目的目标——为工作站、平板电脑以及移动设备提供一致的桌面体验。 不管你是在工作站还是在手机上使用 Ubuntu,Unity 桌面的使用方式都是一样的。
Bootloader 是什么
**Bootloader 是系统的启动加载程序,用来初始化硬件设备、建立内存空间映射图,为调用内核准备好正确的环境。**Bootloader 一般包括两种不同的操作模式:
启动加载模式
此模式下,Bootloader 会将操作系统从固态存储设备上加载进内存。
下载模式
此模式下,目标机可通过串口连接或网络连接从主机下载文件,例如内核映射和根文件系统映射。
Bootloader 的作用主要是完成系统配置、中断接管、系统引导;装载内核、根文件系统、参数传递、内核调试、内核和根文件系统的下载。
Linux 的文件系统
Windows 下用户可以将硬盘实现分区,即 C 盘、D 盘等,文件存储的实现是多个并行树形结构;而在 Linux 下硬盘用户是不可以分区的,文件存储的实现是单个树形结构,这种目录结构称为虚拟目录(virtual directory),最顶层则是根目录/
。
在 Linux PC 上安装的第一块硬盘称为根驱动器,它包含了虚拟目录的核心,其它目录都是从这里开始构建。Linux 会在根驱动器上创建一些特别的目录,我们称之为挂载点(mount point)。挂载点是虚拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,然而实际上它们却存储在另外一个驱动器中。
通常系统文件会存储在根驱动器中,而用户文件则存储在另一驱动器中。
在 Linux 系统中,通用的目录名用于表示一些常见的功能,下面是一些常见的 Linux 顶层虚拟目录名及其内容:
/bin
二进制目录,存储一些普通的系统所必需用户级 GNU 工具,是二进制可执行命令文件
/boot
启动目录,存储 Linux 操作系统的引导程序,启动加载文件等
/dev
设备目录,Linux 在这里创建设备节点,存储系统设备文件,并不是设备驱动程序,而是设备端口文件
/etc
系统配置文件目录,存储服务器配置文件,用户账号密码等
/home
用户工作主目录,Linux 在这里创建用户目录,用户的个人配置,个人环境变量等都在此存储
/lib
库目录,存放系统和应用程序动态共享库文件,类似 Windows 上的 Dll 文件
/media
媒体目录,可移动媒体设备的常用挂载点
/mnt
挂载目录,另一个可移动媒体设备的常用挂载点
/opt
可选目录,常用于存放第三方软件包和数据文件
/proc
进程目录,存放系统信息,现有硬件及当前进程的相关信息,系统运行时由内存自动生成
/root
root 用户的工作目录
/sbin
系统二进制目录,存储许多 GNU 管理员级工具,是二进制可执行命令文件
/run
运行目录,存放系统运作时的运行时数据
/srv
服务目录,存放本地服务的相关文件
/sys
系统目录,存放系统硬件信息的相关文件
/tmp
临时目录,可以在该目录中创建和删除临时工作文件
/usr
用户二进制目录,大量用户级的 GNU 工具和数据文件都存储在这里
/var
可变目录,用以存放经常变化的文件,比如日志文件
以上就是 Linux 根目录下一些关键性目录及其存储的文件。需要注意的是:Linux 下的文件存放并不像 Windows 下那样具有随意性,很多文件需要存放在相应的目录中才行。
应用程序安装
Linux 是一个开源的操作系统,上面使用的软件大多数为开源软件,安装应用程序的方式与 Windows 很不相同。Linux 下的应用程序安装包多为源码包,在安装前需要进行编译,然后才能进行安装;不过,也有 RPM 包,安装过程中不需要手动编译,对技术要求较低。但是,源码包适合所有发行版本的 Linux,RPM 包却没有这个优点。
Linux 发行版
我们将完整的 Linux 系统包称为发行版。有很多不同的 Linux 发行版来满足可能存在的各种运算需求。大多数发行版是为某个特定用户群定制的,比如商业用户、多媒体爱好者、软件开发人员或者普通家庭用户。每个定制的发行版都包含了支持特定功能所需的各种软件包,比如为多媒体爱好者准备的音频和视频编辑软件,为软件开发人员准备的编译器和集成开发环境(IDE)。
不同的 Linux 发行版通常归类为 3 种:
- 完整的核心 Linux 发行版
- 特定用途的发行版
- LiveCD 测试发行版
核心 Linux 发行版
核心 Linux 发行版含有内核、一个或多个图形化桌面环境以及预编译好的几乎所有能见到的 Linux 应用。它提供了一站式的完整 Linux 安装。市场上比较流行的核心 Linux 发行版有以下:
- Slackware - 最早的 Linux 发行版中的一员,在 Linux 极客中比较流行
- Red Hat - 主要用于 Internet 服务器的商业发行版
- Fedora - 从 Red Hat 分离出的家用发行版
- Gentoo - 为高级 Linux 用户设计的发行版,仅包含 Linux 源代码
- openSUSE - 用于商用和家用的发行版
- Debian - 在 Linux 专家和商用 Linux 产品中流行的发行版
特定用途的 Linux 发行版
除了提供特定软件外(比如仅为商业用户提供的办公应用),定制化 Linux 发行版还尝试通过自动检测和自动配置常见硬件来帮助新手安装 Linux。这使得 Linux 的安装过程轻松愉悦了许多。
市场上流行的定制化 Linux 发行版有以下:
- CentOS - 一款基于 Red Hat 企业版 Linux 源代码构建的免费发行版
- Ubuntu - 一款用于学校和家庭的免费发行版
- PCLinuxOS - 一款用于家庭和办公的免费发行版
- Mint - 一款用于家庭娱乐的免费发行版
- dyne:bolic - 一款用于音频和 MIDI 应用的免费发行版
- Puppy Linux - 一款适用于老旧 PC 的小型免费发行版
许多特定用途的 Linux 发行版都是基于 Debian Linux。它们使用和 Debian 一样的安装文件,但仅打包了完整 Debian 系统中的一小部分。
Linux LiveCD
Linux 世界中一个相对较新的现象是可引导的 Linux CD 发行版的出现。它无需安装就可以看到 Linux 系统是什么样的。多数现代 PC 都能从 CD 启动,而不是必须从标准硬盘启动。基于这点,一些 Linux 发行版创建了含有 Linux 样本系统(称为 Linux LiveCD)的可引导 CD。
一些可用的流行 Linux LiveCD:
- Knoppix - 来自德国的一款 Linux 发行版,也是最早的 LiveCD Linux
- PCLinuxOS - 一款成熟的 LiveCD 形式的 Linux 发行版
- Ubuntu - 为多种语言设计的世界级 Linux 项目
- Slax - 基于 Slackware Linux 的一款 LiveCD Linux
- Puppy Linux - 为老旧 PC 设计的一款全功能 Linux
结语
这篇文章并不能涵盖 Linux 操作系统的所有概念,Linux 的可移植性很强,使得其在嵌入式系统开发中有着广泛的应用,智能手机操作系统安卓(Android)使用的就是 linux 内核。可以说,Linux 操作系统为开发者提供了一个优秀的开发环境,同时也是一个兼具稳定性和安全性的服务器环境。
参考
- 《Linux 命令行与 shell 脚本编程大全》(第 3 版)- [美] Richard Blum / Christine Bresnahan 著