下面详细介绍Linux这个自由软件的发展历程。
1991年11月,芬兰赫尔辛基大学的学生Linus Torvalds写了一个小程序,后来取名为 Linux,放在互联网上。他表达了一个愿望,希望借此搞出一个操作系统的“内核”来,这完全是一个偶然事件。
1993年,在一批高水平黑客的参与下,Linux-1.0版诞生了。
1994年,Linux的第一个商业发行版Slackware问世。
1996年,美国国家标准技术局的计算机系统实验室确认Linux-1.2.13(由Open Linux公司打包)符合POSIX标准。POSIX标准让软件跨操作系统平台运行成为可能,因为它定义了操作系统提供的功能标准,使得软件代码只要进行适当适配就可以在另一个完全不同的操作系统上运行。比如Linux下的应用程序可以移植到Windows上运行。
2001年,Linux-2.4版内核发布,这是一个重要的版本,意味着Linux内核日趋成熟。
2003年,Linux-2.6版内核发布,此版内核开疆扩土,占领了很大的操作系统市场份额。Linux内核版本号由3组数字组成(x.y.z),其中x是内核主版本;y的偶数,表示稳定版本,y的奇数表示开发中版本;z是错误修补的次数。
2011年,Linux-3.0版内核发布,为什么从2.6升级到3.x?Linus说Linux进入第三个10年,从3.0开始内核不再用奇偶数表示稳定或开发版本,3.x的版本号为3.0~3.18。
2015年,Linux-4.0版内核发布,3.x到4.x进行了重大的架构升级,最重要的架构升级就是支持实时内核补丁,4.x内核的版本号为4.0~4.20。
2019年,Linux-5.0版内核发布,为什么从4.x升级到5.x呢?Linus说4.x的版本号到了4.20,再升级到4.21就不便于计数了。
截至2022年6月,在Linux内核官网上可以看到的Linux内核是Linux-5.18.1。
以使用VirtualBox创建openEuler虚拟机为例,大致步骤如下。
(1)下载安装虚拟机软件VirtualBox。
(2)下载openEuler。
(3)在虚拟机软件VirtualBox中安装openEuler操作系统。
(4)openEuler操作系统的网络配置如图1-5所示。
① 使用nmcli connection show查看所有连接。
② 使用nmcli device connect enp0s3尝试连接。
图1-5 openEuler操作系统的网络配置
(5)在openEuler操作系统中下载安装常用工具,举例如下。
① git安装:dnf install git。
② 安装VIM:dnf install vim。
③ 安装tar:dnf install tar。
以使用VirtualBox安装配置一个Ubuntu Linux虚拟机为例,大致步骤如下。
(1)下载安装虚拟机软件VirtualBox。
(2)下载Linux发行版Ubuntu Desktop。
(3)在虚拟机软件中安装Ubuntu Desktop操作系统。
(4)配置共享文件夹、共享粘贴板以方便虚拟机与宿主机之间进行数据传输。
(5)在默认情况下,Ubuntu Desktop没有预装C/C++开发环境,但Ubuntu提供了build-essential包可以把相关C/C++开发环境安装好,具体安装方法如下。
$ sudo apt-get install build-essential $ apt depends build-essential # 用命令查看哪些包被 build-essential 依赖
以使用QEMU创建openEuler ARM64虚拟机为例,大致步骤如下。
(1)下载安装虚拟机软件QEMU。
(2)下载openEuler ARM64虚拟机镜像文件。
(3)运行QEMU,安装openEuler ARM64虚拟机,过程如下。
新建一个文件夹,并将解压好的openEuler ARM64虚拟机镜像文件放到该目录,进入QEMU的安装路径,将edk2-aarch64-code.fd(系统引导文件)文件复制并放入上面镜像的同级目录下。在Shell终端进入该目录并执行如下命令。
$ qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 4 -M virt -bios edk2-aarch64-code.fd -hda openEuler-20.03-LTS.aarch64.qcow2 -serial vc:800x600
后面参数是一些虚拟机的具体配置,如内存、CPU等。在打开的QEMU虚拟机窗口中按Ctrl+Alt+2组合键切换到串口控制台,如图1-6所示。
图1-6 串口控制台
输入用户名和密码,官方虚拟机镜像已经生成用户名root和密码openEuler12#$。登录成功后如图1-7所示。
图1-7 openEuler ARM64虚拟机登录成功
到此,openEuler ARM64虚拟机安装完成。上述镜像也可以换成官方的ISO镜像自行安装。
使用Linux系统的典型场景是作为开发者编写代码。在开始编写代码之前,需要在GitHub或者Gitee等代码托管平台上创建一个版本库,比如menu。然后使用如下命令完成从代码托管平台复制一个git版本库到本地Code目录下,之后进入项目目录并创建文件夹,比如lab1。
~/$ ls ~/$ cd Code Code/ $ git clone https://github.com/mengning/menu.git Code/ $ cd menu menu/ (master) $ mkdir lab1 menu/ (master) $ cd lab1
以上命令步骤用到了几个目录操作的命令。Linux系统的文件目录结构类似一棵树,顶层是根目录/,往下默认目录基本都会有其特定作用,如/etc 为配置文件保存目录,可以在/home目录下对应的个人账户目录下存放自己的文件,上面代码中“~/”表示/home目录下对应的当前登录的个人账户目录。
这里可能用到的命令简要介绍如下。
● ls:显示指定工作目录下的文件和文件夹列表。常用选项-a显示所有文件及目录;-l列出详细信息。
● cd:切换当前工作目录到指定目录,如“cd Code”即进入Code目录。
● mkdir:用于创建指定名称目录,如“mkdir lab1”在当前目录下创建了一个目录lab1。常用选项-p表示若上层目录尚未建立,则一并建立上层目录;-m表示建立目录的同时设置目录的权限。
有关目录还有一些特殊的地方,比如前面提到的“~/”表示/home目录下对应的个人账户目录。还有相对路径的用法,“.”表示当前所在的目录;“..”表示当前目录的上层目录。
使用vi编辑器编辑hello.c文件。
lab1/ (master*) $ vi hello.c
Vim是Linux上一款功能十分强大的编辑器,从vi发展而来,是vi的增强版,其代码补全、编译及错误跳转等方便编程的功能特别丰富,被广泛使用。Vim/vi有3种模式:命令模式(Normal模式)、编辑模式和底线命令模式。
刚启动的Vim/vi处于命令模式(Normal模式),在这个模式下可以通过h、j、k、l键作为上、下、左、右键移动光标。从命令模式切换到编辑模式和底线命令模式的方法如下。
● i键:即insert的首字符,用于切换到编辑模式以插入的方式输入字符到文档。
● :键:即“Shift+;”,用于切换到底线命令模式。
● ESC键:用于返回命令模式(Normal模式)。
在命令模式(Normal模式)下输入“i”(即insert之意)切换到编辑模式。在这种模式下,如果权限允许就可以用插入的方式输入字符到文档,对文件内容进行修改。按ESC键回到命令模式(Normal模式)。
在命令模式(Normal模式)下输入“:”切换到底线命令模式。在这个模式下可以输入的命令主要有如下3个。
q //退出程序 w //保存文件 wq//保存且退出
当然,如果对Linux命令行下的Vim编辑器不习惯,也可以用Visual Studio Code编辑器编辑代码,有关Visual Studio Code和Git的详细使用方法可以参考作者的另一本书——《代码中的软件工程》。
在编辑模式下输入hello.c的内容如下。
#include <stdio.h> int main() { printf("hello world!\n"); }
编译执行hello程序可以使用gcc编译器编译一个c文件,将此文件作为gcc的参数,用-o加上可执行文件名称,比如gcc -o hello hello.c,最后生成的可执行文件为hello。编译完成后,使用./hello命令即可执行hello程序。
lab1/ (master*) $ gcc -o hello hello.c lab1/ (master*) $ ./hello hello world!
有时需要将工程文件打包成压缩包作为成果以附件上传(一般情况下不会把.o中间文件、可执行文件等打包进去),而且网上很多资源都是以压缩包的形式共享。因此,压缩、解压命令尤为重要。Linux下常用的打包或解包命令为tar命令,常用选项为-zcvf和-zxvf。
lab1/ (master*) $ cd ../.. Code/ $ tar -zcvf menu.tar.gz ./menu # 打包 Code/ $ tar -zxvf menu.tar.gz # 解包
常用选项-zcvf和-zxvf分别解释如下。
//打包 '-z' //打包同时压缩 '-c' //创建新的 tar 文件 '-v' //列出每一步处理涉及的文件的信息 '-f' //指定要处理的文件名 //解包 '-z' //支持 gzip 解压文件 '-x' //解包提取文件 '-v' //列出每一步处理涉及的文件的信息 '-f' //指定要处理的文件名
除了打包的方式,现代程序员最常用的工具就是Git版本控制,这里提供一个简要的实验操作过程供参考练习。
~/ $ mkdir Code ~/ $ cd Code # 需要到 GitHub或者Gitee等代码托管平台上创建自己的 git 版本库 Code/ $ git clone https://github.com/[your_name]/[your_git_repo].git Code/ $ cd [your_git_repo] Code/ $ mkdir lab1 lab1/ (master*) $ vi hello.c # 输入 hello world 程序 lab1/ (master) $ gcc -o hello hello.c # 编译 hello.c lab1/ (master*) $ ./hello # 运行 hello 程序 hello world! # 将源代码通过 git 进行版本控制 lab1/ (master*) $ git add hello.c lab1/ (master*) $ git commit -m "hello world" [master 40425fe] hello world 1 file changed, 7 insertions(+) create mode 100644 lab1/hello.c lab1/ (master*) $ git push ...... 5f24b93..40425fe master -> master