🌑

Mocha's Blog

目录
  1. 什么是 Linux
  2. Linux Kernel 与发行版
  3. Linux 的软件
    1. 软件包与包管理器
    2. RedHat - rpm 与 yum
    3. Debian - dpkg 与 apt-get
  4. 包里是什么
    1. 写一个最简单的包
    2. 包的位置
  5. 拓展了解
    1. 文件属性
      1. 属性描述
        1. 第一列:性质(文件/目录)及权限
        2. 第三列:文件所有人
        3. 第四列:文件所有人所属组
      2. 更改文件属性
  6. GNU(自由软件计划)
    1. GUN/Linux
    2. 那些包

关于linux,你应该知道的

发布时间:2022年9月17日

什么是 Linux

首先先看下网络上对 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 的几个关键词:

  • 类 Unix
  • 多用户、多任务、多线程
  • 操作系统

因此我们可以得到关于 Linux 系统的基本印象:Linux 是一个类 Unix 的支持多任务、多用户、多线程的操作系统
除 Linux 系统的定义外,在上面的描述中,有一句话也十分重要:

Linux 有上百种不同的发行版,如基于社区开发的 debian、archlinux,和基于商业开发的 Red Hat Enterprise Linux、SUSE、Oracle Linux 等。
之所以说这句话重要是因为其体现了 Linux 系统的一个重要特点:众多的发行版。

Linux Kernel 与发行版

在日常生活中,我们常常会这么说:

我的电脑系统是 Windows 的
我的电脑系统是 MacOS 的
我的系统是 Linux 的

在不说明某类系统的具体发行版时,我们其实说的 Windows、MacOS、Linux 其实是一个内核(kernel)的概念。
在内核之上,会衍生出很多的发行版,如:Windows 10、Windows 11、MacOS 14、Debian 11、Ubuntu 22.04 等等
因此我们可以这么理解 内核与发行版的关系:

内核实现了系统的底层逻辑与接口,如网络、多任务等等能力,而发行版是对内核的二次封装,提供诸如 GUI、包管理等上层能力
我们不直接使用内核,而是使用基于内核的发行版

因为 Linux 内核开源缘故,市面上存在众多的 Linux 发行版,主要分为几个阵营:

  • Debian 系:Debian、Ubuntu、deepin(深度)、Kylin(麒麟)
  • RedHat 系:CentOS、RHEL(Redhat Enterprise Linux)、Oracle Linux、Fedora、Rocky Linux
  • 其他:SUSE、Gentoo、Arch Linux

Linux 的软件

与 Windows 系统的图形化界面不同,大部分的 Linux 系统是通过命令行实现人机交互的,因此自然需要存在软件包格式。

软件包与包管理器

在讲解具体的内容前,我们仍需要先了解一下前置知识:包与包管理器。
包的概念很简单,任意一个封装了代码的文件,都可以叫做包(哪怕不能实际运行,但谁能说它不是一个包?)。
在现代操作系统中,我们可以断言:任何一个上层应用,都不可能自身实现一切代码。
哪怕是我们写一个最简单的 console.log('hello world') ,也需要一个 JavaScript 的运行时帮我们去完成二进制的转换及运行,更不用说我们实际应用中大家使用到的各种多样的包,在使用中会难免遇到包依赖、循环依赖、多版本管理等问题,因此我们需要一个包管理器,来帮我们屏蔽掉这些逻辑。

实际上在部分场景下,我们也会使用到 rpm 包,比如:客户内网集群

由于目前 Debian 和 RedHat 是大家在工作中最常用的 Linux 系统,下面我们对 RedHat 和 Debian 系 Linux 系统的包及包管理工具进行简单介绍。

RedHat - rpm 与 yum

rpm(RedHat Package Manager)是由红帽公司开发的软件包管理方式,使用 rpm 我们可以方便的进行软件的安装、查询、卸载、升级等工作,其软件包格式为 .rpm,安装命令为 rpm -ivh package.rpm
Yum(Yellow dog Updater, Modified)是 Fedora/RedHat/SUSE 等系统的前端软件包管理器,其能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。安装命令为:yum install package-name。

Debian - dpkg 与 apt-get

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 命令保存文件

image.png

现在我们可以着手编译文件了,我们需要为我们的包准备一个命令,我们这里就叫 hello,我们使用系统内置的 gcc 包来编译该文件,输入以下命令 gcc -o hello hello.c,然后操作系统会完成文件的编译

image.png

接下来直接运行文件即可

image.png

包的位置

在 Linux 系统中,我们有几个约定俗成的位置用来存放软件包:

/usr/bin:系统内置包位置

image.png

/etc/usr/local/etc:用户安装的软件包的配置文件

image.png

/usr/local/bin/:用户安装的软件包的执行程序

拓展了解

文件属性

由于 Linux 的多用户特性,对应同一文件(目录)需要针对用户的类型设置不同的权限来保证数据安全,我们可以通过 ll 或 ls -l 命令来查看某一个文件(目录)的属性,如下图

属性描述

在上面的文件描述中,我们通常只需要关注这几个:

第一列:性质(文件/目录)及权限

该内容一共有 10 位长度,其中:

  • 第 1 位:描述该文件(目录)到底是一个文件还是一个目录,d 代表目录,-代表文件,l 代表着链接
  • 第 2-4 位:文件拥有者的权限,依次为 r - read、w - write、x - 执行
  • 第 5-7 位:文件拥有者同组用户的权限,依次为 r - read、w - write、x - execute
  • 第 8-10 位:其他用户的权限,同样为 r - read、w - write、x - 执行
第三列:文件所有人
第四列:文件所有人所属组

更改文件属性

更改文件属性一般用到以下命令:
chgrp:change group,更改文件的所属组属性
chown:change owner,更改文件所有人
chmod:change mode,更改文件的权限

以上三个命令可以同时操作文件及目录,如果想要递归更改某一个目录下的文件,在命令后加上 -R 参数即可实现同步递归修改
对于我们最常用的 chmod 命令,我们一般有两种使用方式

  1. chmod u+ / chmod g+ / chmod o+ 或 chmod u- / chmod g- / chmod o- 或 chmod o= / chmod o= / chmod o=
    其中,第一位的 u / g / o 分别代表 user / group/ others,+ / - / = 分别代表着增加权限、删除权限、设置权限,+ / - / = 符号后直接跟随对应权限码 w / r / x 即可
  2. chmod [0-7][0-7][0-7]
    每一个 [0-7]代表着每一种用户类型的权限,因此从前往后依次代表 user / group / others,每一个数字又代表着对应权限的加和。
    前面我们说过权限描述符先后顺序为 w r x,那么按照二进制,其对应数字分别为 4 2 1,因此假如我们要任何人对一个文件的所有权限,直接使用 chmod 777 filename 即可

GNU(自由软件计划)

GUN/Linux

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

那些包

  • Bash
  • grep
  • gzip
  • tar
  • screen
  • coreutils
  • fileutils: chgrp, chown, chmod, cp, dd, df, dir, du, ln, ls, mkdir, mkfifo, mknod, mv, rm 等
  • textutils: cat, cksum, head, tail, md5sum, nl, od, pr, tsort, join, wc, tac, paste 等
  • shellutils: basename, chroot, date, dirname, echo, env, groups, hostname, nice, nohup, printf, sleep 等
  • findutils
  • find、xargs
  • inetutils
  • ftp、telnet
  • sysutils:
  • add-shell, chage, chfn, chgroup, chgrpmem, chpasswd, chsh, chuser, cppw, expiry, gpasswd, grpck, gshadow, hwclock, isosize, last, lastlog, login, lsage, lsgroup, lsuser, mkgroup, mkuser, nologin, passwd, pwck, remove-shell, rmgroup, rmuser, setpwnam, vipw, wall, write

Powered By Hexo.js Hexo and Minima. Support By Oracle & Docker-Compose.