简单认识 Linux | 青训营笔记

238 阅读13分钟

简单认识 Linux

在认识 linux 之前,先简单了解一下计算机的五大基本单元:

  • 控制器:协调和指挥其他单元的工作
  • 运算器:进行算术逻辑运算
  • 存储器单元:分为内存和外存
  • 输入单元:比如鼠标键盘等
  • 输出单元:比如屏幕音响等

1.png

再简单了解一下操作系统:

简单了解一下操作系统

操作系统,Operating System(OS),起的主要作用是承上启下。承上,即运行在操作系统上的各类应用程序,比如微信 QQ 等;启下,即操作计算机底层硬件,比如 CPU、内存、硬盘等。

操作系统主要提供两个方面的功能:管理计算机资源和提供用户接口。

管理计算机资源:

  • 处理器管理
  • 存储器管理
  • 设备管理
  • 文件管理

提供用户接口:实现外部程序和操作系统内核的交互

  • 命令接口
  • 图形用户接口
  • 程序接口

操作系统是如何启动的?

两种方式:BIOS 和 UEFI。BIOS 或 UEFI 是一段固化在主板上的程序,当计算机通电(启动)时,这段程序就会被执行,(BIOS 会多一个步骤:BIOS 自检,即检查硬件或软件是否正常工作,)他们会调用 BootLoader(操作系统引导程序) 去启动操作系统。

2.png UEFI 可以看做是 BIOS 的升级版:

  • UEFI 优化了 BIOS 自检流程。
  • BIOS 启动会配合 MBR 分区,这种方式无法引导启动超过 2.2TB 的磁盘,而 UEFI 一般配合 GPT 分区,它支持引导超过 2.2TB 的磁盘。

简单了解计算机和操作系统后,就可以来简单认识一下 Linux 了。

Linux 发展简史

  1. 1969 年,Unix 诞生于贝尔实验室
  2. 1984 年,贝尔实验室将 Unix 商业化
  3. 1984 年,Tanenbaum 开发 Minix 用于教学,并开放源码
  4. 1991 年,Linus Torvalds 受 Minix 影响,实现初版的 LInux 内核
  5. 1992 年,Linux 内核以 GPL 协议发行 V1.0。

GPL(General Public License),它是由 FSF(Free Software Foundation) 所制定的一种开源软件许可证协议。GPL 又叫做 GNU GPL,GNU 可以认为是一个运动或者计划,在这个运动下,成立了 FSF,并且起草了 GPL 协议。这个运动起因于 Unix 的商业化(付费)。参考

Linux 版本

  • 内核版本(kernel):只由 Linux Kernel Organization 负责。
  • 发行版本:很多种类。

内核版本不像发行版本,内核版本只有一个官方版本,可以在 github 或者 kernel.org 查看最新内核版本。(截止2023年, 最新大版本已到 6 )

发行版本:发行版本=内核版本+常用软件。这里的常用软件主要是指系统层面的常用软件,比如 shell工具(bash),编辑器(vim),网络工具(curl、wget、ssh、telnet、ping),GNU 工具集(grep, gcc),压缩工具(tar、gzip),系统监控工具(top),图形界面等等。这些都是属于“常用软件”。

常见的发行版本系列:

  • Debian 系列
    • Debian
    • Ubuntu
  • Red Hat 系列
    • Centos
    • Fedora
    • RHEL
  • Slackware 系列
    • SUSE
  • 国产系列
    • 龙芯
    • 鲲鹏
    • 飞腾

Linux 系统结构

简单介绍 Linux 以下内容,只做引子,不深入研究。

  • 基本组成
  • 体系结构
  • 进程管理
  • 文件系统
  • 权限

基本组成

  • 内核
  • shell
  • 文件系统
  • 应用程序

3.png

体系结构

  • 内核是硬件和软件之间的中间层
  • 内核是一个资源管理程序
  • 内核提供一组面向系统的命令

4.png

5.png

进程管理

  • 进程是正在执行的一个程序或命令
  • 进程由自己的地址空间,占用一定的系统资源
  • 一个 CPU 核,同一时间内只能运行一个进程
  • 进程一般是由父进程引导启动。(某些内核启动时就被创建的进程除外,比如kernel threads, daemons 和 systemd)
  • 进程由它的进程 ID (PID) 和它的父进程的进程 ID (PPID) 唯一识别

一个简单说明:系统中运行的程序往往远大于 CPU 的核数,那么 Linux 系统是如何“同时”运行那么多程序的呢?简单的回答就是,CPU 可以在极短的时间内运行多个进程,因为速度非常快,对于进程们来说就好像是同时运行的一样。[一个有趣的动画, 在09:47 开始观看]

6.png

进程调度是指操作系统按某种策略或规则选择进程占用CPU进行运行的过程。

7.png

进程可以有以下几种状态:

  • R(TASK RUNNING),可执行状态
  • S(TASK INTERRUPTIBLE),可中断的睡眠状态
  • D(TASK UNINTERRUPTIBLE),不可中断的睡眠状态
  • T(TASK STOPPED or TASK TRACED),暂停状态或跟踪状态
  • Z(TASK DEAD - EXIT ZOMBIE),退出状态,进程成为僵尸进程。
  • X(TASK DEAD - EXIT DEAD),退出状态,进程即将被销毁

进程调度原则:

  • 一个 CPU 核同一时间只能运行一个进程
  • 每个进程有近乎相等的执行时间
  • 对于逻辑 CPU 而言,进程调度使用轮询的方式执行,当轮询完成时,则回到第一个进程
  • 进程执行消耗时间和进程量成正比

进程的系统调用

  • 内核空间 (Kernal Space) : 系统内核运行的空间
  • 用户空间 (User Space) : 应用程序运行的空间

8.png

文件系统

Linux 中一切皆文件:普通文件、目录文件、设备文件、套接字都是文件。这样做最明显的好处是开发者仅需要使用一套 API 和开发工具即可调取 Linux 系统中绝大部分的资源。举简单的例子子,Linux 中几乎所有读(读文件,读系统状态,读 socket,读 PIPE)的操作都可以使用 read 函数来进行,写操作(write)也一样。

根目录下常见的目录

  • /bin:bin 是 Binaries (二进制文件) 的缩写,这个目录存放着最经常使用的命令。
  • boot:这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。
  • dev:dev 是 Device(设备)的缩写,该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。
  • etc:etc 是 Etcetera(等等)的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。
  • home:用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
  • /lib:lib 是 Library(库)的缩写,这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库
  • /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。
  • /opt:opt 是 optional(可选)的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个 ORACLE 数据库则就可以放到这个目录下。默认是空的
  • /proc:proc 是 Pocesses(进程)的缩写,/proc 是一种伪文件系统(虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
  • /root:该目录为系统管理员,也称作超级权限者的用户主目录
  • /sbin:s 是 Super User 的意思,是 Superuser Binaries(超级用户的二进制文件)的缩写,这里存放的是系统管理员使用的系统管理程序。
  • /usr:usr 是 unix shared resources(共享资源)的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这人目录下,类似于 windows 下的 program fies 目录

虚拟文件系统 VFS (virtual file system)

虚拟文件系统使得 Linux 可以存在多个"实际的文件系统”,比如分区1是 ext2,分区2是 ext3,分区3是 fat32。那么每个"实际的文件系统”的结构和操作方式是不一样的。如果是这样的话用户怎么去操作它们?总不能每种不同的文件系统都采用不同的方法吧,那么这个时候就需要 VFS 作为中间层! 用户直接控制 VFS,VFS 再去控制各个文件系统。

  • 对应用层提供一个标准的文件操作接口
  • 对文件系统提供一个标准的文件接入接口

9.png

文件读取流程

10.png

权限

权限分为用户权限和文件权限。

用户权限:

  • 用户账户
    • 普通用户账户:在系统中进行普通作业
    • 超级用户账户:在系统中对普通用户和整个系统进行管理
  • 用户组
    • 标准组:可以容纳多个用户
    • 私有组:只有用户自己

文件权限有关用户的三个概念:

  • 所有者:文件的所有者。这个“所有者”指的是拥有这个文件的用户
  • 所在组:文件的所有者所在的组
  • 其他人:处文件所有者即所在组外的其他人
  • 用户拥有的权限:读(R)写(W)执行(X)

文件的权限组成如图(使用 ll 命令查看文件时首部的那段字符串)

11.png

常见的文件类型有:

  • 普通文件(-):可以用编辑器打开进行查看和编辑。
  • 目录(d):存储其他文件和目录。
  • 符号链接文件(l):类似于 Windows 下的快捷方式,指向另一个文件或目录。
  • 套接字文件(s):用于进程间通信,一般在 /var/run 目录下。
  • 命名管道文件(p):FIFO 文件,可以用于进程间通信,一般在 /tmp 目录下。
  • 字符设备文件(c):用于与字符设备(如终端、键盘等)进行交互,一般在 /dev 目录下。
  • 块设备文件(b):用于与块设备(如硬盘、U盘等)进行交互,一般在 /dev 目录下。

软件包管理

软件包通常指的是一个应用程序,它可以是一个 GUI 应用程序、命令行工具或(其他软件程序需要的)软件库。

软件包管理

  • 底层工具: 主要用来处理安装和删除软件包文件等任务
    • PRM(Red Hat Package Manager):为 Red hat 操作系统的包管理系统
    • DPKG(Debian package):为 Debian 操作系统的包管理系统
  • 上层工具: 主要用于数据的博索任务和依赖解析任务
    • APT(Advanced Packaging Tool):Debian 系列使用
    • YUM(Yellowdog Updater, Modified):Red Hat 系列使用
    • DNF(Dandified YUM):是YUM的替代品,速度更快,性能更好,支持模块化

底层工具和上层工具的区别,可以类比做菜。前者是自己做菜,菜都要自己去买;后者是叫了外卖,自己等着吃就行。更具体一点,yum 可以自动下载并安装所有需要的依赖项,但 rpm 会告诉你安装一个依赖项列表,然后你必须手动安装。

操作系统格式(类比 exe, apk)软件包管理系统前端工具(类比软件管家)
Debian.debdpkgapt, apt-get
Ubuntu.debdpkgapt, apt-get
Centos.rpmrpmyum
Fedora.rpmrpmdnf
openSUSE.rpmrpmzypper

在国内下载软件时,往往可能因为网络问题而无法下载,此时可以修改软件下载源。软件源配置文件一般位于/etc/apt/sources.list 或 /etc/apt/sources.list.d/ 目录。sources.list是主要的软件源配置文件,而sources.list.d目录下的文件可以添加额外的软件源。

配置文件有格式要求,比如 Debian 系列的 Linux 软件源配置文件格式如下:

[软件源类型]  [镜像地址] [系统代码/水平划分] [软件分支、垂直划分]

比如:`deb mirrors.aliyun.com/debian buster main contrib non-free```

  • deb:deb 表示二进制软件包源,此外还有 deb-src 表示源代码软件包源。
  • buster:buster 是 Debian 10 的系统代号。又比如 focal 即 Ubuntu 20.04 LTS版本。
  • 后面三个属于软件包分组,我们可以按需下载,一般来说,main 属于真正的 Debian 的软件包,后面两个是可选的。
    • main 中的软件是完全由 Debian 维护的,用户可以免费使用。
    • contrib 不完全由 Debian 维护,这些软件包可能依赖于其他的非自由软件或二进制固件,或者是从其他的开源项目中派生而来的。他们是免费的,但可用性和可靠性会受到约束。
    • non-free 中包含不属于自由软件的软件包,其中包括专有软件、驱动程序和二进制固件等。这些软件可能收到版权保护或限制。

在阿里云 Debian 镜像网站 mirrors.aliyun.com/debian/ 中可以看到由很多个子目录,其中 /dists 子目录可以查看系统代码,/pool 查看软件分支。

相关命令

# 查看系统内核
uname -a
cat /proc/version

# 查看系统版本
cat /etc/os-release
# 查看启动的某一进程
ps -ef | grep [process-name]

# 查看某个进程
top -p [PID]

# 关闭指定的进程
kill [PID]

# 全部进程动态实时视图
top
# df 命令报告文件系统磁盘空间利用率
df -T

# mount 命令是挂载文件系统用的, 不带任何参数运行, 会打印包含文件系统类型在内的磁盘分区的信息
mount
# 查看文件夹下内容
ls

# 创建文件夹
mkdir [folder-name]

# 移动/重命名文件
mv [src-file] [dest-file]

# 删除文件夹
rm -r demo

# 创建空文件
touch [file]

# 复制文件
cp [src_file] [dest_file]
# 查看当前登录用户信息
w

# 查看当前用户所属的组
groups

# 查看用户的 uid 信息
id [username]
# 在根目录创建一个空文件夹, 查看当前用户拥有文件夹的权限
cd / && mkdir [folder-name] && ls -ld [folder-name]

# 创建一个用户, 并赋予可写操作
sudo useradd [username]

# 设置用户密码
sudo passwd [username]

# 切换用户登录
su [username]

# 将文件夹写权限赋予其他人
sudo chomd o+w [folder-name]
# 列出所有可更新的软件清单命令
apt update

# 安装指定的软件命令
apt install <package-name>

# 安装多个软件包
apt install <package1> <package2> <package3>

# 更新指定的软件命令
apt update <package-name>

# 删除软件包命令
apt remove <package-name>

# 查找软件包命令
apt search <keyword>

# 列出所有已安装的包
apt list --installed
# 更新包缓存
apt update
# 安装 nginx 包
apt instal7 nginx
# 查找 nginx 路径,/etc/nginx 配置文件路径,/usr/sbin/nginx 可执行文件
whereis nginx
# 访问 nginx 部署的默认站点
cur7 http://1ocalhost:80
# 关闭 ng
sudo /usr/sbin/nginx -s stop
# 启动 ng
sudo /usr/sbin/nginx
# 进入 nginx 配置文件夹
cd /etc/nginx
# 打开 nginx 配置文件 nginx.conf,发现默认的站点配置位于 /etc/nginx/sites-enabled
cat nginx.conf
# 进入 sites-enabled 文件夹,并对 default 文件进行配置,修改 80 端口为 8080
cd sites-enabled && vim default
# 重启 nginx 服务
sudo /usr/sbin/nginx -s reload
# 访问 nginx 部署的默认站点
curl http://1ocalhost:8080