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

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

什么是 Linux ?

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

  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进程加载到虚拟内存中。内核在启动任何其余进程时,都会在虚拟内存中给新进程分配一块专有区域来存储该进程用到的数据和代码。bash

  • 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包提供了跨多个存储设备建立逻辑卷的命令行命令。


若有写错或不对的地方,请指正
复制代码
相关文章
相关标签/搜索