发布时间:2022年9月17日
首先先看下网络上对 Linux 的定义
Linux,全称 GNU/Linux,是一种免费使用和自由传播的类 UNIX 操作系统,其内核由林纳斯·本纳第克特·托瓦兹于 1991 年 10 月 5 日首次发布,它主要受到 Minix 和 Unix 思想的启发,是一个基于 POSIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux 有上百种不同的发行版,如基于社区开发的 debian、archlinux,和基于商业开发的 Red Hat Enterprise Linux、SUSE、Oracle Linux 等。
从上述描述中,我们提取出 Linux 的几个关键词:
因此我们可以得到关于 Linux 系统的基本印象:Linux 是一个类 Unix 的支持多任务、多用户、多线程的操作系统
除 Linux 系统的定义外,在上面的描述中,有一句话也十分重要:
Linux 有上百种不同的发行版,如基于社区开发的 debian、archlinux,和基于商业开发的 Red Hat Enterprise Linux、SUSE、Oracle Linux 等。
之所以说这句话重要是因为其体现了 Linux 系统的一个重要特点:众多的发行版。
在日常生活中,我们常常会这么说:
我的电脑系统是 Windows 的
我的电脑系统是 MacOS 的
我的系统是 Linux 的
在不说明某类系统的具体发行版时,我们其实说的 Windows、MacOS、Linux 其实是一个内核(kernel)的概念。
在内核之上,会衍生出很多的发行版,如:Windows 10、Windows 11、MacOS 14、Debian 11、Ubuntu 22.04 等等
因此我们可以这么理解 内核与发行版的关系:
内核实现了系统的底层逻辑与接口,如网络、多任务等等能力,而发行版是对内核的二次封装,提供诸如 GUI、包管理等上层能力
我们不直接使用内核,而是使用基于内核的发行版
因为 Linux 内核开源缘故,市面上存在众多的 Linux 发行版,主要分为几个阵营:
与 Windows 系统的图形化界面不同,大部分的 Linux 系统是通过命令行实现人机交互的,因此自然需要存在软件包格式。
在讲解具体的内容前,我们仍需要先了解一下前置知识:包与包管理器。
包的概念很简单,任意一个封装了代码的文件,都可以叫做包(哪怕不能实际运行,但谁能说它不是一个包?)。
在现代操作系统中,我们可以断言:任何一个上层应用,都不可能自身实现一切代码。
哪怕是我们写一个最简单的 console.log('hello world')
,也需要一个 JavaScript 的运行时帮我们去完成二进制的转换及运行,更不用说我们实际应用中大家使用到的各种多样的包,在使用中会难免遇到包依赖、循环依赖、多版本管理等问题,因此我们需要一个包管理器,来帮我们屏蔽掉这些逻辑。
实际上在部分场景下,我们也会使用到 rpm 包,比如:客户内网集群
由于目前 Debian 和 RedHat 是大家在工作中最常用的 Linux 系统,下面我们对 RedHat 和 Debian 系 Linux 系统的包及包管理工具进行简单介绍。
rpm(RedHat Package Manager)是由红帽公司开发的软件包管理方式,使用 rpm 我们可以方便的进行软件的安装、查询、卸载、升级等工作,其软件包格式为 .rpm,安装命令为 rpm -ivh package.rpm
Yum(Yellow dog Updater, Modified)是 Fedora/RedHat/SUSE 等系统的前端软件包管理器,其能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。安装命令为:yum install package-name。
dpkg(Debian Package) 是为 Debian 专门开发的套件管理系统,方便软件的安装、更新及移除,其软件包格式为 .deb,所有源自 Debian 的 Linux 发行版都使用 dpkg,例如 Ubuntu、Debian 等。安装命令为 dpkg -i package.deb
apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。
前面我们讲过了 Linux 中的软件包和包管理器的概念,那么大家可能会想,linux 的软件包里装的到底是什么东西,随便看一个最简单的软件包,该软件包在运行时会输出 hello world
看到这些乱码,我们应该比较清晰的知道:这是一个二进制文件。
我们在 Linux 系统中,所有可以直接运行的软件包,必须是一个二进制文件,如果我们在某一个软件官方下载了该软件包的源码,需要在系统中先完成编译才可以正常安装。
在这里,我们尝试用 c 语言加上编译器,编写一个最简单的可以输出 hello world 的软件包
首先我们创建一个 hello.c 文件,并输入以下内容
#include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}
使用 :wq
命令保存文件
现在我们可以着手编译文件了,我们需要为我们的包准备一个命令,我们这里就叫 hello
,我们使用系统内置的 gcc 包来编译该文件,输入以下命令 gcc -o hello hello.c
,然后操作系统会完成文件的编译
接下来直接运行文件即可
在 Linux 系统中,我们有几个约定俗成的位置用来存放软件包:
/usr/bin
:系统内置包位置
/etc
或 /usr/local/etc
:用户安装的软件包的配置文件
/usr/local/bin/
:用户安装的软件包的执行程序
由于 Linux 的多用户特性,对应同一文件(目录)需要针对用户的类型设置不同的权限来保证数据安全,我们可以通过 ll 或 ls -l 命令来查看某一个文件(目录)的属性,如下图
在上面的文件描述中,我们通常只需要关注这几个:
该内容一共有 10 位长度,其中:
更改文件属性一般用到以下命令:chgrp
:change group,更改文件的所属组属性chown
:change owner,更改文件所有人chmod
:change mode,更改文件的权限
以上三个命令可以同时操作文件及目录,如果想要递归更改某一个目录下的文件,在命令后加上 -R 参数即可实现同步递归修改
对于我们最常用的 chmod 命令,我们一般有两种使用方式
Unix 系统在最初是免费和开源的,后来转变为授权使用的闭源模式。在 Unix 闭源后,理查德·马修·斯托曼(Richard Matthew Stallman,简称 rms)发起了自由软件运行并发起了 GNU 计划。
其目标是开发一个类 Unix 的开源操作系统 GNU,为了实现该计划, rms 编写了一些知名的软件,如:gcc(c 语言编译器)、Emacs(文本编辑器)、glibc(c 语言运行库)、bash。
虽然编写了一些软件,但是其操作系统一直处于难产状态,正好此时 Linus 完成了 Linux 系统的开发,Linux Kernel 使用了 gcc、bash 等软件,也填好填充了 GNU 的空白。
1994 年,Linus 以 GPL 协议发布了 Linux Kernel 1.0 版本,从此两者便结合在一起,叫做 GNU/ Linux