简单认识 Linux
在认识 linux 之前,先简单了解一下计算机的五大基本单元:
- 控制器:协调和指挥其他单元的工作
- 运算器:进行算术逻辑运算
- 存储器单元:分为内存和外存
- 输入单元:比如鼠标键盘等
- 输出单元:比如屏幕音响等
再简单了解一下操作系统:
简单了解一下操作系统
操作系统,Operating System(OS),起的主要作用是承上启下。承上,即运行在操作系统上的各类应用程序,比如微信 QQ 等;启下,即操作计算机底层硬件,比如 CPU、内存、硬盘等。
操作系统主要提供两个方面的功能:管理计算机资源和提供用户接口。
管理计算机资源:
- 处理器管理
- 存储器管理
- 设备管理
- 文件管理
提供用户接口:实现外部程序和操作系统内核的交互
- 命令接口
- 图形用户接口
- 程序接口
操作系统是如何启动的?
两种方式:BIOS 和 UEFI。BIOS 或 UEFI 是一段固化在主板上的程序,当计算机通电(启动)时,这段程序就会被执行,(BIOS 会多一个步骤:BIOS 自检,即检查硬件或软件是否正常工作,)他们会调用 BootLoader(操作系统引导程序) 去启动操作系统。
UEFI 可以看做是 BIOS 的升级版:
- UEFI 优化了 BIOS 自检流程。
- BIOS 启动会配合 MBR 分区,这种方式无法引导启动超过 2.2TB 的磁盘,而 UEFI 一般配合 GPT 分区,它支持引导超过 2.2TB 的磁盘。
简单了解计算机和操作系统后,就可以来简单认识一下 Linux 了。
Linux 发展简史
- 1969 年,Unix 诞生于贝尔实验室
- 1984 年,贝尔实验室将 Unix 商业化
- 1984 年,Tanenbaum 开发 Minix 用于教学,并开放源码
- 1991 年,Linus Torvalds 受 Minix 影响,实现初版的 LInux 内核
- 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
- 文件系统
- 应用程序
体系结构
- 内核是硬件和软件之间的中间层
- 内核是一个资源管理程序
- 内核提供一组面向系统的命令
进程管理
- 进程是正在执行的一个程序或命令
- 进程由自己的地址空间,占用一定的系统资源
- 一个 CPU 核,同一时间内只能运行一个进程
- 进程一般是由父进程引导启动。(某些内核启动时就被创建的进程除外,比如kernel threads, daemons 和 systemd)
- 进程由它的进程 ID (PID) 和它的父进程的进程 ID (PPID) 唯一识别
一个简单说明:系统中运行的程序往往远大于 CPU 的核数,那么 Linux 系统是如何“同时”运行那么多程序的呢?简单的回答就是,CPU 可以在极短的时间内运行多个进程,因为速度非常快,对于进程们来说就好像是同时运行的一样。[一个有趣的动画, 在09:47 开始观看]
进程调度是指操作系统按某种策略或规则选择进程占用CPU进行运行的过程。
进程可以有以下几种状态:
- 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) : 应用程序运行的空间
文件系统
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 再去控制各个文件系统。
- 对应用层提供一个标准的文件操作接口
- 对文件系统提供一个标准的文件接入接口
文件读取流程
权限
权限分为用户权限和文件权限。
用户权限:
- 用户账户
- 普通用户账户:在系统中进行普通作业
- 超级用户账户:在系统中对普通用户和整个系统进行管理
- 用户组
- 标准组:可以容纳多个用户
- 私有组:只有用户自己
文件权限有关用户的三个概念:
- 所有者:文件的所有者。这个“所有者”指的是拥有这个文件的用户
- 所在组:文件的所有者所在的组
- 其他人:处文件所有者即所在组外的其他人
- 用户拥有的权限:读(R)写(W)执行(X)
文件的权限组成如图(使用 ll 命令查看文件时首部的那段字符串)
常见的文件类型有:
- 普通文件(
-):可以用编辑器打开进行查看和编辑。 - 目录(
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 | .deb | dpkg | apt, apt-get |
| Ubuntu | .deb | dpkg | apt, apt-get |
| Centos | .rpm | rpm | yum |
| Fedora | .rpm | rpm | dnf |
| openSUSE | .rpm | rpm | zypper |
在国内下载软件时,往往可能因为网络问题而无法下载,此时可以修改软件下载源。软件源配置文件一般位于/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