Linux 学习方向
中级
系统基础、服务安全及服务管理、Shell 脚本。
高级
- MySQL 数据库:理解 cache & storage
- 集群(Cluster):lb(负载均衡)、ha(高可用)
- 分布式:zookeeper、分布式文件系统
- 虚拟化技术:xen、kvm、Openstack(基于 xen 和 kvm)
- 运维工具:ansible,puppet(基于ruby)、saltstack(python)
- 监控工具:zabbix
- 大数据处理:hadoop、spark、storm、elk(elasticsearch、logstash、kibana)
- docker
关于 Linux 的技术认证
RedHat:
- RHCSA
- RHCE
- RHCA
现代计算机设备的组成部分
冯.诺伊曼体系中,计算机有五大基本部件:控制器、运算器、存储器、输入设备、输出设备。
实际应用中,计算机包括CPU(控制器和运算器)、存储器(Memory内存和Disk外存)、Input输入设备、Output输出设备。
CPU(控制器和运算器)
CPU 由运算器、控制器、寄存器、缓存、指令集组成。
(1)运算器是实现算术运算和逻辑运算的部件
- 主要由算术逻辑部件(ALU:Arithmetic and Logic Unit)、寄存器组和状态寄存器组成。
- ALU主要完成对二进制信息的定点算术运算、逻辑运算和各种移位操作。
- 通用寄存器组是用来保存参加运算的操作数和运算的中间结果。
- 状态寄存器在不同的机器中有不同的规定,程序中,状态位通常作为转移指令的判断条件。
(2)控制器是计算机的指挥系统
通过地址来访问存储器(内存),从存储器中取出指令,经译码器分析后,根据指令分析结果产生相应的操作控制信号作用于其他部件,使得各部件在控制器控制下有条不紊地协调工作。
(3)控制器一般包括指令控制逻辑、时序控制逻辑、总线控制逻辑、中断控制逻辑等几个部分
- 指令控制逻辑要完成取指令、分析指令和执行指令的操作。
- 时序控制逻辑要为每条指令按时间顺序提供应有的控制信号,一般时钟脉冲就是最基本的时序信号,是整个机器的时间基准,称为机器的主频。
- 总线逻辑是为多个功能部件服务的信息通路的控制电路,就 CPU 而言一般分为内部总线和 CPU 对外联系的外部总线,外部总线有时候又叫做系统总线、前端总线(FSB)等。
- 中断是指计算机由于异常事件,或者一些随机发生需要马上处理的事件,引起 CPU 暂时停止现在程序的执行,转向另一服务程序去处理这一事件,处理完毕再返回原程序的过程。由机器内部产生的中断,把它叫做陷阱(内部中断),由外部设备引起的中断叫外部中断。
(4)寄存器(register)是 CPU 内部用来存放数据的一些小型的存储区域
用来暂时存放参与运算的数据以及运算结果。寄存器由电子线路组成,存取速度非常快,与 CPU 的速度相当,寄存器的成本较高,因而数量较少。CPU 内部的寄存器类型有指令寄存器、程序计数器、数据寄存器、地址寄存器以及状态寄存器等。
CPU 架构类型
- x86
- x64
- arm
- m68000 (m68k)
- power
- powerpc(苹果早期)
- ultraspac(sun)
- alpha(惠普)
- 安腾
- ……
每一种 CPU 架构支持的指令集都是不同的。
存储器
- Memory内存,RAM(Random Access Memory):
由 Cell 存储单元组成,每个 Cell 为 8 bits。
32 位 CPU 能够识别的存储单元地址个数位 2^32 个,每个位置代表一个存储单元 Cell,每个 Cell 是 8 bits(1 Byte),
能用到的内存大小为 2^32 Bytes=4 GB。
- Disk外存,即磁盘,存储数据。
输入设备(Input)
向计算机输入数据和信息的设备。是计算机与用户或其他设备通信的桥梁。输入设备是用户和计算机系统之间进行信息交换的主要装置之一。键盘,鼠标,摄像头,扫描仪,光笔,手写输入板,游戏杆,语音输入装置等都属于输入设备。
输出设备(Output)
是计算机硬件系统的终端设备,用于接收计算机数据的输出显示、打印、声音、控制外围设备操作等。也是把各种计算结果数据或信息以数字、字符、图像、声音等形式表现出来。常见的输出设备有显示器、打印机、绘图仪、影像输出系统、语音输出系统、磁记录设备等。
操作系统(Operating System,OS)
基本概念
了解操作系统之前,可以先看看下面这张CPU的图片。
CPU 上有很多的针脚,每个针脚它所提供的功能不一样,有的针脚是做加法运算,有的针脚是做异或运算,每个针脚所提供的功能通常都通过 CPU 的指令来实现,多个指令被称为指令集
,所以一颗 CPU 内部提供的指令集可以有很多,而且不同公司生产的 CPU 的指令集都是不一样的。
程序员想要直接调用 CPU 实现各种功能,需要编写二进制指令,但是显然世界上能做到二进制编程的人可以说是微乎其微,于是编程语言就有低级语言和高级语言之分, 越接近二进制的语言越低级(比如汇编、C 语言),越接近人类语言的编程语言越高级(比如 PHP、JAVA、Python 等等)。
最重要的是即使能够编写二进制指令完成一个程序,也需要考虑各种底层硬件参数的差异,比如不同厂商生成的 CPU 芯片所提供的指令集是不一样的,运行速度也不一样,内存大小也不一样等等。如果编写一个程序需要考虑这么多复杂的底层参数,这对程序员来说挑战就太大了。为了达到灵活使用的目的,就必须要把这些底层差异给消除掉,于是就有了通用软件
这个东西,而操作系统
就是干这件事的。
可以认为操作系统本身就是一个非常大的通用软件
,为了就是以下这些通用目的:
- 硬件驱动
- 进程管理(CPU时间片切割与分配)
- 内存管理
- 网络管理
- 安全管理
- ……
系统调用(System Call,Syscall)
前面我们了解到 CPU 需要指令(指令集)来运行,指令包含以下两种:
- 特权指令(拥有管理功能,只有OS才能运行特权指令,因特尔公司把 CPU 所能够实现的指令集,封装成了 4 个环,特权指令在最内部的第一个环上,普通指令在最外层的第 4 个环上)。
- 普通指令(一般程序只能调用普通指令)
操作系统把底层硬件的所有特权指令封装为系统调用来实现功能,运行在操作系统上的程序需要通过 Syscall 来让操作系统代替该程序特权指令的操作,比如 mkdir
、kill
等操作。
程序运行模式
- 用户空间(user space,us)
在操作系统中,虚拟内存通常会被分成用户空间(又称使用者空间),与核心空间这两个区块。
- 内核空间(system space)
Linux 系统对自身进行了划分,一部分核心软件独立于普通应用程序,运行在较高的特权级别上,它们驻留在被保护的内存空间上,拥有访问硬件设备的所有权限,Linux 将此称为内核空间。
编程层次
有了操作系统,程序员就可以不用面向硬件的接口编程了,编程的层次由低到高,可以分为以下几种:
-
硬件规格(hardware specification)
不同厂商生产的硬件规格各不相同,面向这个层次编写出来程序可以说是非常丑陋的,写起来极为不便,非常痛苦。 -
系统调用(system call)
经过操作系统的封装,编写的程序已经美观了很多,此时依然很丑陋,Linux一般有300多个系统调用,现代内核一般有400多个,还是很底层。 -
库调用(library call)
这是对系统调用的进一步抽象,把非常多的底层的功能整合出来,提供成离最终目标更近的功能,可以减少程序员的许多复杂的工作。
对于计算机来说,这些所有功能都是通过调用来实现的。对于 Linux 而言,库
一般指的是 C 库
或 C++ 库
,程序员可以面向系统调用
编程,也可以面向库
编程,当然,面向库编程更为简单。
用户接口(User Interface,UI)
- GUI(Graphic User Interface)
图形用户界面(Graphical User Interface,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。然而这界面若要通过在显示屏的特定位置,以”各种美观而不单调的视觉消息“提示用户”状态的改变“,势必得比简单的消息呈现花上更多的计算能力。
- CLI(Command Line Interface)
命令行界面(command-line interface)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(CUI)。
通常认为,命令行界面(CLI)没有图形用户界面(GUI)那么方便用户操作。因为,命令行界面的软件通常需要用户记忆操作的命令,但是,由于其本身的特点,命令行界面要较图形用户界面节约计算机系统的资源。在熟记命令的前提下,使用命令行界面往往要较使用图形用户界面的操作速度要快。所以,图形用户界面的操作系统中,都保留着可选的命令行界面。
应用程序二进制接口(Application Binary Interface,ABI)
应用程序二进制接口 描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。
应用程序编程接口(Application Programming Interface,API)
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
可移植操作系统接口(Protable Operating System Interface of UNIX,POXIS)
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。
操作系统类型
(1)MAC(Macintosh)
1973年,施乐公司的帕罗奥托研究中心(Palo Alto Research Center)推出了人类历史上第一台个人电脑奥托(The Xerox Alto)。奥托电脑首次使用了桌面比拟(Desktop metaphor)和鼠标驱动的图形用户界面(GUI)技术,这电脑在当年看起来特别吊炸天,但施乐却觉得奥托没有很大的商业价值,并没有把它商业化。
1979 年,乔布斯
拜访了帕罗奥托研究中心,在参观过程中,对奥托系列电脑的鼠标驱动的图形用户界面产生了极大的兴趣。
乔布斯发现,施乐并没有意识到他们开发的技术的价值。1980 年,乔布斯挖了几个帕罗奥托研究中心的研究人员加入苹果,利用奥托的创意,就有了咱们知道的 Lisa 系列和麦金塔(Macintosh)系列电脑。
(2)Windows
1981 年末,乔布斯
邀请盖茨
看苹果计划推出的麦金塔样机,想让微软能够为这款新机器开发出相匹配的应用软件。
盖茨被乔布斯演示的图形界面和方便灵活的鼠标配合给吸引住了,他心里打起了自己的算盘,看来这是微软操作系统未来的发展方向。美国未来学家斯图尔特·布兰德曾说过,“在合适的地点出现的合适信息,能改变你的生活。”
1982 年 1 月 22 日,乔布斯强迫盖茨签署一项协议,让微软不会把为苹果开发的软件移植 到非苹果公司制造的电脑上,主要是指IBM。可是乔布斯百密一疏,该协议没有禁止微软编写类似麦金塔操作系统,与苹果展开竞争。盖茨后来回忆道,1983 年,微软就“计划在 IBM PC 上引入图形计算功能”,而这恰恰是乔布斯最为担心的。
微软在给苹果公司编写应用程序的同时,开始开发自己的 Windows。有史料称,微软把 Windows 操作系统研发放在了第一位,而把要给苹果公司干的活儿排在了后面,甚至延迟了苹果麦金塔电脑的发布,这让乔布斯很恼火。
根据参与 Windows 研发的斯科特·麦格雷戈
回忆,当时,盖茨总是在抱怨:“为什么不像麦金塔?”“不行,要更像一些。”
所以看到这里,大家都懂了吧?
(3)UNIX
UNIX 操作系统(尤尼斯),是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统,最早由KenThompson、Dennis Ritchie 和 Douglas McIlroy 于 1969 年在 AT&T 的贝尔实验室开发。目前它的商标权由国际开放标准组织所拥有,只有符合单一 UNIX 规范的UNIX系统才能使用 UNIX 这个名称,否则只能称为类 UNIX(UNIX-like)。
以下是几种类 UNIX 系统:
- System(由 Bell Lab 开发)
AIX(Advanced Interactive eXecutive):是 IBM 开发的一套类 UNIX 操作系统。
Solaris:是 SUN 公司研制的类 UNIX 操作系统。
HP-UX(Hewlett Packard UniX):是惠普公司(HP,Hewlett-Packard)以 SystemV 为基础所研发成的类 UNIX 操作系统。
- BSD(Berkeley System Disribution)(由 BSRG 开发)
NetBSD
OpenBSD
FreeBSD (被称为能够在 PC 机上运行的贵族化类 UNIX 操作系统)
- Linux(由 Linus Torvalds 开发)
Linux 是一套免费使用和自由传播的类 UNIX 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 UNIX 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Linux 操作系统诞生于 1991 年 10 月 5 日(这是第一次正式向外公布时间)。Linux 存在着许多不同的 Linux版本,但它们都使用了 Linux 内核。Linux 可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
严格来讲,Linux 这个词本身只表示 Linux 内核,但实际上人们已经习惯了用 Linux 来形容整个基于 Linux 内核,并且使用 GNU 工程各种工具和数据库的操作系统。
GNU 计划
说到 Linux 就不得不提 GNU 计划。上世纪八十年代,黑客社群在软件工业商业化的强大压力下日渐土崩瓦解,甚至连 AI 实验室的许多黑客也组成了Symbolic公司,试图以专利软件来取代实验室中黑客文化的产物--免费可自由流通的软件。
在麻省理工学院 (MIT) 的人工智能实验室里工作的天才程序员 Richard Stallman 对此感到气愤与无奈。在对 Symbolic 进行了一段时间的抗争后,他于 1985 年发表了著名的 GNU 宣言(GNU Manifesto),正式宣布要开始进行一项宏伟的计划:创造一套完全自由免费,兼容于 UNIX 的操作系统 GNU(GNU’s Not Unix!)。之后他又建立了自由软件基金会来协助该计划。
他于 1989 年与一群律师起草了广为使用的 GNU 通用公共协议证书(GNU General Public License, GNU GPL),创造性地提出了“反版权”(或“版权属左”,或“开权”,copyleft)的概念。 同时,GNU 计划中除了最关键的 Hurd 操作系统内核之外,其他绝大多数软件已经完成。
GNU 工程激励了许许多多年轻的黑客,他们编写了大量自由软件。最终在 1991 年,芬兰大学生 Linus Torvalds 在 GPL(General Public License) 条例下发布了他自己创作的 Linux 操作系统内核,至此 GNU 计划正式完成,操作系统被命名为 GNU/Linux(或简称 Linux)。
Linux 发行版本
Linux 内核和 Linux 发行版的关系
Linux 内核指的是一个由 Linus Torvalds
负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。
Linux 发行版就是由 Linux 内核与各种常用软件的集合产品,如今全球大约有数百款的 Linux 发行版本。
常见发行版
Linux 发行版有三大主流分支:Debian、Slackware、Redhat,包含的主要发行版分别如下:
Debian
- Ubuntu
- Linux mint
- Knopix
Slackware
- S.u.S.E
- SLES-SuSE Linux Enterprise
- OpenSuSE
Redhat
- RHEL-RedHat Enterprise Linux
- CentOS-Community ENTerprise
- Fedore Core
除了三大主流分支,还有两种比较流行的发行版:
- Gentoo
- ArchLinux
Linux 发行版之间的关系
-
Fedora 是基于 RHEL、CentOS、Scientific Linux 和 Oracle Linux 的社区版本。相比 RHEL,Fedora 打包了显著的更多的软件包。其中一个原因是,多样化的社区参与Fedora的建设;它不只是一家公司。在这个过程中,CentOS用于活动,演示和实验,因为它是对最终用户免费提供的,并具有比Fedora的一个更长的发布周期(通常每隔半年左右发布一个新版本)。
-
SUSE、SUSE Linux Enterprise Server (SLES) 和 openSUSE 之间的关系类似于 Fedora, Red Hat Enterprise Linux 和CentOS的关系。
-
Debian 是包括 Ubuntu 在内许多发行版的上游,而 Ubuntu 又是 Linux Mint 及其他发行版的上游。Debian 在服务器和桌面电脑领域都有着广泛的应用。Debian 是一个纯开源计划并着重在一个关键点上,稳定性。它同时也提供了最大的和完整的软件仓库给用户。
Linux 发行版分类
按用途分为桌面版和企业版
Linux 发行版都是基于同一内核,所以除了外观和名字不一样外,其他地方的区别不是很大,按用途大致分为桌面版和企业版:
- 桌面版:
Ubuntu、Debian、Fedora、CentOS、openSUSE 等。由于安装了图像界面,界面美观、操作方便,比较适合新手,但相对于企业版来说较消耗资源。 - 企业版:
RHEL、CentOS、Debian、Ubuntu、openSUSE、SLES 等。系统稳定性好,资源消耗较小,满足企业需求,但基本都是命令行界面,需要有一定的基础才能上手操作。
按维护方式分为商业公司和社区组织
按照维护方式分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本,前者以著名的 Redhat(RHEL) 为代表,后者以 Debian 为代表。
- 商业公司维护:
RHEL、CentOS、SLES 等 - 社区组织维护:
Debian、Ubuntu 等
Linux 的哲学思想
(1)一切皆文件
把几乎所有资源统统抽象为文件形式,包括硬件设备,甚至通信接口等,便于统一管理和定义。
对文件的操作有:open,read,write,close,delete,create。
(2)由众多功能单一的程序组成
一个程序只做一件事,并且做好,保证了Linux内核的高效运行。
(3)组合小程序完成复杂任务
通过连接多个简单的程序实现复杂的功能。
(4)尽量避免和用户交互
更贴近编程,易于以编程的方式实现自动化任务。
(5)使用文本文件保存配置信息
修改配置信息只需要任意一款文本编辑器就可以进行。