
第1章 学习ROS必备的Linux知识
1.1 Linux操作系统介绍
Linux是一款广受开发者欢迎的操作系统,伴随Linux一起出现的有UNIX、内核、操作系统、Ubuntu、发行版等名词,本节从Linux的发展历史和部分计算机概念定义的角度,梳理Linux以及经常伴随它一起出现的名词之间的关系。
1.1.1 Linux的诞生
计算机是由CPU、内存、硬盘等硬件所组成的,为了有效地驱动和管理这些硬件资源,并且利用这些硬件资源来运行软件,实现需要的功能,需要一套软件来管理硬件并提供软件开发接口,这样的软件就是操作系统,而Linux就是这样一个操作系统。常见的个人计算机操作系统除了Linux操作系统外,还有微软的Windows、苹果的macOS,另外手机上运行的Android、iOS、HarmonyOS也属于操作系统。
在Linux诞生之前,已经有过很多开发操作系统和统一计算机软件标准的尝试,其中一些项目对Linux的发展有着深远的影响,见表1-1。
表1-1 对Linux发展有着重大影响的事件

林纳斯·托瓦兹(Linus Torvalds)是芬兰赫尔辛基大学计算机科学专业的一名学生,他在接触到Minix系统后认为这是一个很优秀的操作系统,但是由于塔南鲍姆教授设计Minix的目的是教学,重点是讲授操作系统原理等知识,并不愿意做很多功能层面的改进,所以林纳斯决定参照Minix操作系统的设计理念和代码自己动手来实现一个操作系统。
1991年,林纳斯独立完成了第一个公开的0.02版本,在完成最初的版本后,林纳斯选择公开了自己源代码,并在Minix的网络论坛(BBS)中发布了一条消息,如图1-1所示,邀请其他开发者尝试和完善自己的操作系统。

图1-1 林纳斯BBS消息原文
由于当时存放源代码的文件夹名称为Linux,所以大家便把这个操作系统称为Linux。彼时的Linux系统仅仅只能运行在英特尔i386处理器平台上,功能也很简陋,除了完成对硬件的驱动外,只实现了BASH、GCC等少数几个软件的运行。但这仅仅只是一个开始,Linux即将开启属于它自己的时代。
得益于林纳斯最初选择的开源路线以及互联网技术的成熟,众多的开发者远程通过网络加入到Linux的开发中来,共同为Linux的开发贡献自己的力量,同时Linux在诞生伊始就确定了自己兼容UNIX的基本路线,所以设计上是参考标准的POSIX规范。最终在1994年完成了第一个正式版的Linux内核:Version 1.0。并于1996年完成了2.0版本,同年确立了企鹅Tux作为Linux的吉祥物(见图1-2)。2000年,非营利性的联盟Linux基金会成立,致力于促进Linux的发展。
值得一提的是,Linux内核现在的开发模式依然是最初采用的众多开发者远程协作共同开发的模式。

图1-2 Linux吉祥物企鹅Tux
1.1.2 Linux、UNIX、系统、内核和发行版
UNIX作为现代操作系统的开山鼻祖,启发了后续一众操作系统的开发,其中就包括了Linux。对于这种受到UNIX影响并且和UNIX系统有一定的兼容性,但没有直接引用UNIX源码的操作系统,人们称为“类UNIX”(UNIX-like)操作系统,Linux就属于类UNIX系统。
严格来说,当时林纳斯开发的Linux并不是一个完整的操作系统,而是一个操作系统内核。
操作系统(Operating System,OS)是一组主管并控制计算机操作、运用和运行硬件与软件资源,以及提供公共服务来组织用户交互的相互关联的系统软件程序,同时也是计算机系统的基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也会提供一个让用户与系统交互的操作界面。
内核(Kernel,又称为核心)在计算机科学中是一个用来管理软件发出的I/O(输入与输出)请求的计算机程序,它将这些要求转译为数据处理的指令并交由中央处理器(CPU)及计算机中其他电子组件进行处理,是现代操作系统中最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法,来完成这些操作。有了这个方法,通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及I/O设备)。
根据以上定义,可以知道操作系统内核是操作系统的一个组成部分(见图1-3)。
林纳斯开发的和Linux基金会目前维护的就是Linux操作系统内核。而一个单独的操作系统内核对用户来说是没法使用或者说没有太大的使用价值的,通常还需要和一些应用软件例如shell、图形桌面等一起使用,而这样一个将Linux内核和应用软件打包在一起的操作系统就称为“Linux发行版”。

图1-3 操作系统和内核
目前的Linux发行版已经有超过百种,每种有着各自的特点和擅长的领域,比较知名的有Debian、Ubuntu、CentOS等,其主要的区别在于预装的软件和软件包管理方式不同。
发行版在继续做修改和打包后同样也还是Linux发行版。例如基于Ubuntu使用轻量级MATE桌面的Ubuntu MATE。
本书采用目前对ROS支持最为完整的Ubuntu作为操作系统,机器人端的嵌入式主机上使用Ubuntu MATE。图1-4所示,依次为Debian、Ubuntu和Ubuntu MATE的Logo。

图1-4 几款Linux发行版Logo