Linux系统结构和环境变量

系统结构

我们通常说的Linux系统可以划分为四个部分:

  • Linux内核
  • GNU工具
  • 图形化桌面环境
  • 应用软件

每一部分都各司其职,相互配合,下图是Linux系统的基本结构图:

Linux系统结构图

内核

Linux系统的核心是内核,内核控制着计算机系统上的所有硬件和软件,在必要的时候分配硬件资源并根据需要执行软件。内核主要负责以下四种功能:

  • 系统内存管理
  • 软件程序管理
  • 硬件设备管理
  • 文件系统管理

系统内存管理

内核不仅仅管理服务器上的可用物理内存,还可以创建和管理虚拟内存。

内核通过硬盘上的存储空间来实现虚拟内存,这块区域称为交换空间。内核不断地在交换空间和实际物理内存之间反复交换虚拟内存中的内容,这样可以使用比物理内存更多的可用内存。

Linux系统内存映射关系

内存存储单元按组成分成很多块,这些块称为页面。内核将每个内存页面放在物理内存或交换空间,然后内核会维护一个内存页面表指明那些页面位于物理内存那些页面被换到了磁盘上。

软件程序管理

Linux操作系统中将运行的程序称为进程。进程可以在前台运行也可以在后台运行,内核控制着Linux系统如何管理运行在系统上的所有进程。内核创建第一个进程(init进程)来启动系统上所有其他进程。

硬件设备管理

内核的另一个职责是管理硬件设备。任何Linux系统都需要和与其通讯的设备在内核代码中加入该设备的驱动程序代码。驱动程序代码相当于应用程序和硬件的桥梁,允许内核与设备之间交互数据。

在Linux系统中将硬件设备当成一种特殊文件,称为设备文件,设备文件有3类:

  • 字符型设备文件

  • 块设备文件

  • 网络设备文件

字符设备文件是指处理数据时每次只能处理一个字符的设备(比如终端)。块设备文件是指处理数据时每次能处理大块数据的设备(比如硬盘)。网络设备文件是指采用数据包发送和接收数据的设备,包括各种网卡和一个特殊的回环设备。

文件系统管理

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

文件系统描述
extLinux扩展文件系统,最早的Linux文件系统
ext2第二扩展文件系统,在ext基础上提供了更多的功能
ext3第三扩展文件系统,支持日志功能
ext4第四扩展文件系统,支持高级日志功能
hpfsOS/2高性能文件系统
jfsIBM日志文件系统
iso9660ISO 9660文件系统(CD-ROM)
minixMINIX文件系统
msdos微软的FAT16
ncpNetware文件系统
nfs网络文件系统
ntfs支持Microsoft NT文件系统
proc访问系统信息
ReiserFS高级Linux文件系统,能提供更好的性能和硬盘恢复能力
smb支持网络访问的Samba SMB文件系统
sysv较早的Unix文件系统
ufsBSD文件系统
umsdos建立在msdos上的类Unix文件系统
vfatWindows 95文件系统(FAT32)
XFS高性能64位日志文件系统

GNU工具

除了由内核控制硬件设备外,操作系统还需要工具来执行一些标准功能,比如控制文件和程序。Linux在创建Linux内核时并没有可用的系统工具,就在开发Linux的同时有一群人模仿Unix开发了一系列标准的计算机系统工具。

GNU组织(GNU是GNU‘s Not Unix的缩写)开发了一套完整的Unix工具,但是没有可运行它们的系统,将Linux内核和GNU操作系统工具整合起来就产生了一款完整的、丰富的免费操作系统。供Linux系统使用的核心工具被称为coreutils软件包,由下面三部分组成:

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

还有一个特殊的GNU工具 GNU/Linux shell,它提供了启动程序、管理文件系统中的文件、进程等。你可以将多个shell命令放入文件中作为程序执行,这些文件被称为shell脚本。在Linux系统上有好几种shell可用,不同的shell有不同的特性,有些更利于创建脚本,有些则更利于管理进程,所有Linux发行版默认的shell都是bash shell.

shell描述
ash一种运行在内存受限环境中简单的轻量级shell,但与bash完全兼容
korn一种与Bourne shell兼容的编程shell,但支持如关联数组和浮点运算等一些高级的编程特性
tcsh一种将C语言中的一些元素引入到shell脚本中的shell
zsh一种结合了bash、tcsh和korn特性,同时提供高级编程特性,共享历史文件和主题化提示符的高级shell

Linux桌面环境

在Linux早期没有图形界面,Linux有多种图形界面选择,比如X Window、KDE、Unity桌面等。图形化桌面环境的弊端是它要占用相当一部分的系统资源来保证正常运行,Linux有一些轻量级的图形化桌面:

桌面描述
Fluxbox一个没有面板的轻型桌面,仅有一个可用来启动程序的弹出式菜单
Xfce和KDE很像的一个桌面,但少了很多图像以适应底内存环境
JWMJoe的窗口管理器,非常适合用于低内存低硬盘空间环境的超轻型桌面
Fvwm支持如虚拟桌面和面板等高级桌面功能,但能够在低内存环境中运行
fvwm95从fvwm衍生而来,但看起来更像windows95桌面

Linux发行版

我们已经知道完整的Linux系统由四个关键部分组成,我们将由它们组成的完整的Linux系统称为Linux发行版。每个不同的发行版都包含和支持特定的软件和环境,不同Linux的发行版可归纳为3类:

  • 完整的核心Linux发行版
  • 特定用途的发行版
  • LiveCD测试发行版

一些比较流行的核心Linux发行版如下:

发行版描述
Slackware最早的Linux发行版一员,在Linux极客中比较流行
Red Hat主页用于Internet服务器的商业发行版
Fedora从Red Hat分离的家用发行版
Gentoo为高级Linux用户设计的发行版,仅包含Linux源代码
openSUSE用于家用和商用的发行版
Debian在linux专家和商用linux产品中流行的发行版

一些比较流行的特定用途的Linux发行版如下:

发行版描述
CentOS一款基于Red Hat企业版Linux源代码构建的免费发行版
Ubuntu一款用于学校和家庭的免费发行版
PCLinuxOS一款用于家庭和办公的免费发行版
Mint一款用于家庭娱乐的免费发行版
dyne:bolic一款用于音频和MIDI应用的免费发行版
Puppy Linux一款适用于老旧PC的小型免费发行版

环境变量

bash shell用环境变量的特性来存储有关shell会话和工作环境的信息,在bash shell环境变量分为两类:

  • 全局变量
  • 局部变量

全局环境变量

全局环境变量对于shell会话和所有生成的子shell都是可见的,局部变量则只对创建它们的shell可见。

查看Linux环境变量命令用envprintenv命令:

$ printenv PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/mysql/bin

或者使用echo命令:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/mysql/bin

可以通过export命令来设置全局环境变量:

$ my_variable="I am Global now" $
$ export my_variable
$
$ echo $my_variable I am Global now
$
$ bash
$
$ echo $my_variable I am Global now
$
$ exit
exit
$
$ echo $my_variable I am Global now
$

局部环境变量

局部环境变量只能定义在它们的进程中可见,查看局部环境变量列表优点复杂,Linux中没有直接显示局部环境变量的命令,set命令显示的是某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。

$ set
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.wEHsrbzG0a/Render
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
......

可通过如下方式给局部环境变量赋值:

$ echo $my_variable
$
$ my_variable = Hello
$ echo $my_variable
$ Hello

环境变量持久化

上面已经知道什么是全局环境变量,什么是局部环境变量,很多时候我们是需要将环境变量持久化的,在我们登录Linux系统后启动第一个bash shell的时候,默认情况bash会在几个文件中查找命令,这些文件叫启动文件或环境文件,bash检查的启动文件取决于启动bash的方式:

  • 登录时作为默认登录shell

  • 作为非登录shell的交互shell

  • 作为运行脚本的非交互shell

当我们登录Linux系统时,登录shell会从5个不同的启动文件里面读取:

  • /etc/profile

  • $HOME/.bash_profile

  • $HOME/.bashrc

  • $HOME/.bash_login

  • $HOME/.profile

其中/etc/profile文件是系统上默认的bash shell的主启动文件,系统上每个用户登录都会执行该启动文件,在这个文件中会迭代/etc/profile.d目录下的所有文件。$HOME目录下的启动文件在大多数linux系统发行版只用到其中一到两个文件。

所以在Linux中最好是在/etc/profile.d目录下创建一个.sh的文件来把修改或者新的环境变量放入其中,或者在大多数Linux发行版中配置$HOME/.bashrc文件。