Linux操作系统
来历
某一天大佬Linus Torvalds觉得Unix操作系统不太好用,于是基于Unix操作系统开发了Linux内核,也称为Unix-Like,所以你也可以将Linux操作系统称为类Unix系统。
顺便说一句,Git也是他开发的,妥妥的大佬,好吧。
Linux内核开发出来后,开发者将内核开源了,只要遵循GPL开源协议的个人或机构都可以基于Linux底层源代码来开发和发布,因此市面上大多数Linux操作系统都是开源免费的,或者提供免费版本。
目前Linux内核由全球成千上万程序师共同维护。
最后下个定义:基于Linux内核开发的操作系统都称为Linux操作系统。
架构
Linux操作系统是个多层次结构,由内到外就像是一层层的壳,最内层到最外层分别是:内核,系统库,Shell,应用程序。
- 内核:直接与硬件打交道,例如设备驱动程序、进程管理、内存管理、文件系统、网络协议栈等。
- 系统库:支持应用程序开发的软件库,例如C标准库、数学库、动态链接库、线程库、第三方库等。
- Shell:命令行解释器,是用户使用Linux系统的接口,直接接受用户输入的shell命令,传递给内核来执行。
- 应用程序:办公软件、服务软件等,例如浏览器、Git、Nginx、MySQL等。
现状
市面上的有很多的Linux操作系统,虽然特点是五花八门,但基本上都是使用相似的Linux内核,在此基础上开发封装自己的系统软件,差别也就在系统软件上。
来几个典型代表我们认识认识:
- Red Hat系列
这个系列的操作系统如今已经非常成熟了,主要有三个发行版fedora,redhat,centos,区别可以这样理解:fedora小白鼠,redhat付费版(其中的商业软件部分付费),centos免费版。
redhat和centos都是稳定版本,国内企业centos用的多。 - Debian系列
与redhat同为Linux内核,但其软件生态体系和redhat完全不同,主要分支:Debian,Ubuntu,kali,国产linux,在人工智能,自动驾驶,大数据方面用的较多 - Android系列
也是基于Linux内核开发的,像是小米的miui系统,oppo的coloros系统,华为的HarmonyOS操作系统
因为都是基于Linux内核,所以多数操作命令都是通用的
安装
- 虚拟机
Windows上较常用的:vmware、VirtualBox、Hyper-V(Windows子系统WSL)
Mac上较常用的:Multipass、vmware、VirtualBox、Parallels Desktop
Docker虚拟机上安装Linux系统 - 双系统
直接将本机装成Linux系统或采用Windows和Linux双系统 - 云服务器
阿里云、腾讯云等,收费
安装虚拟机
如果你是windows用户,为了学习需要使用Linux,那我建议你选择采用虚拟机的方式,之前我给电脑装成双系统,很长一段时间几乎都不怎么用Linux系统,因为Linux系统上没有很多常用的办公工具,同时我们学习Linux系统或者未来工作中基本上使用Linux的场景都是在服务器上安装Linux系统,办公通过Xshell或其他远程工具连接到服务器上来实现的。
Q:如何使用虚拟机安装Linux系统?
A:我们可以使用Windows上自带的VMware来创建虚拟机,Linux系统的选择可以根据自己的需要来,初学者建议选择Ubuntu,有图形界面。
在VMware上我们通过镜像来安装Linux系统:
- 从清华源或者别的镜像源网站上下载镜像,搜索
ubuntu-releases
,选择自己想要的版本,点击下载iso镜像文件,例如ubuntu-20.04.6-desktop-amd64.iso
- 在VMware中选择新建虚拟机->典型->稍后安装操作系统->Linux Ubuntu64位
- 给虚拟机起名字,选择操作系统在本机的安装位置,不建议放C盘
- 设置磁盘大小,选择将虚拟磁盘拆分为多个文件
- 自定义硬件->内存设置为2048MB->点击
新的CD/DVD
选择之前下载的ISO镜像,USB控制器
和打印机
平时用不到可以移除。加速3D图形这个选项也可去掉,系统用起来能快一点 - 启动虚拟机,跟着提示走就行,设置的用户名密码要记住,之后登录要用
联网
虚拟机安装完成后可以打开自带的浏览器测试下是否有网络,也可以在右上角网络设置看,如果一直显示网络正在连接那就是连不上。
Q:本机有网虚拟机没网,该如何设置网络?
A:需要配置网络适配器和虚拟网络
- VMware中虚拟机->设置->网络适配器->选择桥接模式
- VMware点击编辑->虚拟网络编辑器->管理员修改->在桥接那里选择使用的网卡
进入Ubuntu就发现能上网了。
为了之后远程连接方便,可以在Linux网络设置中将ip地址设置为静态ip地址,子网掩码和网关采用本机上网卡的配置就行,本机上查看配置的方法:$ ipconfig /all
,在Linux上查看网络配置方法:$ ip addr
换源
国外源下载速度有点感人,建议换国内源使用。
在etc/apt/
目录下双击打开sources.list文件,在弹出的界面手动选择国内的源,例如 http://mirrors.aliyun.com/
,之后更新软件列表就算换源配置完成。
远程连接
大多数使用Linux操作系统的场景都是企业部署服务器,因此远程连接操作是必不可少的。
远程连接的方式建议采用SSH远程连接,SSH远程连接需要在虚拟机上安装SSH,在本机配置SSH,生成公钥。
在虚拟机安装SSH,使用下面的命令:
1 | sudo apt update |
本机安装SSH和生成公钥的方法可以看我的Git教程那篇文章,如果之前已经生成过公钥了那就不用配置了。
使用Xshell新建连接,主机填写Linux系统上的ip地址,直接连接,填写用户名和密码,界面出现Connection established说明连接成功了,下面会出现用户名和远程主机名,要断开连接用CTRL+ALT+]
防火墙
1 | 查看防火墙状态 |
如果使用上述命令是出现报错提示:firewalld.service is not found
说明之前没有安装防火墙,如果需要防火墙的话,使用下面命令安装(Ubuntu上):
1 | sudo apt-get install firewalld |
安装成功后可以通过查看防火墙状态来确认是否完成安装:
1 | systemctl status firewalld |
关机重启
1 | root用户关机 |
apt包管理器
apt包管理器是Linux系统上一个从终端安装管理软件、包的工具,可以用手机上的软件商店来类比。
apt的一些使用命令:
1 | 更新 |
Linux中在终端执行命令时如果碰到权限不够的,在命令前加上sudo再运行,sudo是启动管理员权限,需要输入管理员账户密码。
vi/vim编辑器
vi:Unix下的一款文本编辑器
vim:vi的增强版,Linux默认会安装vim,下文中vi都指的是vim
命令行输入vi或vim后回车会直接进入vim界面,可以看到vim的版本号和一些提示信息:
1 | for information |
vi模式
vi常用模式有三种:Command mode(命令模式), Last line mode(尾行模式), Insert mode(插入模式)
使用vim命令后默认进入的是命令模式
命令模式下使用:
进入尾行模式
命令模式下使用i
,a
,o
进入插入模式
编辑文件
1 | 打开example.txt文件,example.txt不存在则创建此文件 |
进入后左下角显示的是当前打开的文件名和创建信息,新创建的文件会显示[New]
要对文件进行修改,可以在命令模式下按下i
或I
或o
或O
或a
或A
都可以进入插入模式,在下方信息栏会显示--Insert--
编辑完成后按ESC
键即可退出插入模式
使用:wq
保存并退出vi
命令 | 含义 |
---|---|
:w | 保存 |
:q | 退出 |
:! | 强制执行 |
使用cat example.txt
命令可以查看example.txt文件内容
在命令模式下使用^
让光标跳转到所在行的行首,$
让光标跳转到所在行的行尾
复制粘贴剪切
1 | 复制本行内容-CTRL+C |
在命令前加上数字可以达到操作几行的目的,例如2yy
就是复制2行,3p
就是粘贴三次
1 | 命令模式下开启行号显示 |
查找内容
查找,命令模式下
1 | 从光标处向下查找目标,例如查找hello |
查找区分大小写,但是不是完全匹配,即查找3也会匹配到line3,但是查找A不会匹配到a.
查找命令后加上\c
会忽略大小写,例如
1 | 能匹配到hello |
替换
1 | 命令模式下 |
撤销
1 | 撤销,相当于Windows中的CTRL+Z,命令模式下 |
在vim中有一个重要的文件.vimrc
文件,在其中保存一些vi的配置信息,例如快捷键、插件、颜色、忽略大小写等,在此文件中配置后,每次打开vi都会自动加载其中的配置就不用每次手动设置了,可以将自己习惯的设置写入到这个文件中
Linux常用命令
Linux中绝大多数命令都可接受一个或多个参数来增强或改变命令的行为,掌握常用命令时也要关注他的参数
参数 | 含义 |
---|---|
-l | 展示文件和目录详细信息,例如权限、所有者、大小、修改时间等 |
-a | 展示所有文件和目录详细信息,包括隐藏的文件和目录,一般隐藏文件都是. 开头的,例如保存用户配置信息的.bash_profile |
-h | 以人类可读的方式显示文件大小 |
-t | 按时间排序 |
-r | 逆序 |
1 | 展示文件和目录 |
1 | 创建文件夹 |
使用ls -l
命令查看文件或目录的详细信息时,最左边的一位表示文件类型:d表示目录,-表示普通文件,l表示链接文件
链接文件
链接文件是Linux上特有的一种文件形式,分为软链接和硬链接两种,软链接类似Windows上的快捷方式,使用下面命令创建:
1 | 创建软链接文件link.txt指向test.txt,-s参数表示创建软链接 |
硬链接也是使用ln命令来创建,不加-s参数,例如
1 | 创建硬链接文件link.txt指向test.txt |
软链接与硬链接的区别:
软链接 | 硬链接 |
---|---|
目标文件的快捷方式 | 目标文件的另一个名字 |
可以访问到目标文件内容,修改软链接内容会失去与目标文件的链接 | 修改硬链接内容等同于直接修改目标文件内容,目标文件和指向它的所有硬链接内容同步 |
删除目标文件会造成软链接指向并不存在的文件,显示为红色 | 删除目标文件对硬链接没有影响 |
可以指向文件或目录 | 只能指向文件 |
tips:硬链接文件与目标文件共用一个i节点(i节点是Linux系统中保存文件元信息的地方),通过ls -l
查看文件详细信息时,权限后面的那个数字就代表此文件的i节点关联的文件数量,即目标文件+硬链接数量。使用命令ls -i
命令可以展示i节点编号
文件权限
使用ls -l
命令查看文件或目录的详细信息时,最左边的一位表示文件类型,之后的9位表示文件权限
3位1组,分别对应文件所有者(user)权限,同组用户(group)权限,其他用户(other)权限,每组中三个字符分别表示的是:可读(r),可写(w),可执行(x),相应位置上如果没有相应权限就会显示为-
可以使用chmod
(change mode)命令来修改文件权限,配合+
和-
使用,例如:
- 统一给所有用户添加或删除权限
统一指定 1
2
3
4
5
6
7/*统一给所有用户添加或删除权限*/
test.txt添加可执行权限
chrom +x test.txt
取消可执行权限
chrom -x test.txt
test.txt添加读写权限
chrom +rw test.txt - 给单独指定的用户添加或删除权限
单独指定 1
2
3
4
5
6
7/*单独给指定用户添加或删除权限*/
u所有者,group同组用户,o其他用户
chrom u+r test.txt
chrom g-w test.txt
chrom o+x test.txt
组合使用
chrom ug+x test.txt - 给所有用户使用编号指定权限
按照二进制给权限三位编号,例如777表示rwxrwxrwx(111,111,111),664表示rw-rw-r–(110,110,100)编号指定 1
2
3编码指定权限
chrom 777 test.txt
chrom 664 test.txt
创建文件
- 通过vi创建并编辑文件
touch
命令,这个命令本来是用来更新文件修改时间为当前时间的,同时当文件不存在时会自动创建空文件1
touch test.txt
echo
命令,这是个用来输出文本的命令1
2
3
4命令行回显hello world
echo "hello world"
将输出内容重定向到hello.txt文件中,当hello.txt文件不存在时创建此文件并写入内容
echo "hello world" > hello.txt
目录操作
1 | 回显当前所在目录 |
文件和文件夹操作
复制
1 | 复制file1.txt文件,新文件为file2.txt |
文件移动
1 | 可用于移动也可用于重命名 |
文件删除
1 | rm file1.txt |
文件夹创建
1 | 创建picture文件夹 |
文件夹删除
1 | 文件夹为空时 |
删除的参数 | 含义 |
---|---|
-r | 递归删除目录所有内容 |
-f | 强制执行删除操作,不进行确认提示 |
-v | 显示指令执行详细过程 |
Linux中所有参数都是可以组合使用的
由于Linux系统中删除操作是不可逆的,没有Windows中回收站类似的机制,因此慎用rm
和rm -r
命令,更别说rm -rf
命令了
快捷键
常用快捷键 | 功能 |
---|---|
CTRL+C | 停止当前进程 |
CTRL+L | 清屏,彻底清屏用rest |
CTRL+Q | 退出 |
压缩和解压缩
gzip或tar
区别:
gzip | tar |
---|---|
只能压缩文件,不能压缩文件夹 | 文件或文件夹都可压缩 |
压缩后不保留源文件 | 压缩后保留源文件或目录 |
压缩不能指定名字 | 压缩可以指定压缩文件名字 |
1 | 将文件压缩为`*.gz`,例如test.txt.gz |
使用tar解压压缩包时如果当前目录有与压缩包同名的文件会进行覆盖,例如本地有个test.txt文件,压缩包解压出来也有个test.txt,则会进行覆盖。
用户管理
Q:用户是什么?
A:用户是一种身份,身份代表着权限,有了身份你才能访问操作系统使用计算机功能
Q:Linux用户和Windows用户有什么区别?
A:Linux是多用户操作系统,Windows虽然也可以建立多个用户,但是不允许多个用户同时使用一个操作系统,不能算作多用户操作系统,而Linux系统允许多个用户同时访问操作系统,登陆后互相操作互不影响
Q:为什么要在Linux上创建用户
A:为了对不同身份的访问者做权限的限制,防止普通用户由于使用root用户身份而导致权限过大,由于操作不当造成损失
Q:如何查看用户信息?
A:使用下面命令$ id
来查看,会展示当前登录的用户id(UID)和组id(GID)
或者使用$ w
命令来查看当前登录的用户。
Q:如果要查看所有用户信息,怎么做?
A:所有的用户信息在/etc/passwd
文件中,密码信息在/etc/shadow
文件中,可用过$ cat /etc/passwd
的方式来查看
使用$ head -1 /etc/passwd
命令查看文件第一行root:x:0:0:root:/root:/bin/bash
,含义解释,以:
分隔:
root | x | 0 | 0 | root | /root | /bin/bash |
---|---|---|---|---|---|---|
用户名 | 密码占位 | 用户UID | 组GID | 注释信息 | 用户home目录 | shell方式 |
Q:怎么新建用户
A:
1 | 新建一个用户名字叫username 备注comments |
useradd和adduser的区别:adduser 不是标准的 Linux 命令,它本质上是一个 perl脚本,在后台调用 useradd 命令。这个高级实用程序在 Linux 中创建用户的时候效率更高,它提供了创建主目录、设置密码以及其他一些参数的选项。
使用下面两条命令可以查看支持的参数:
1 | useradd --help |
Q:怎么切换用户
A:
1 | 切换用户switch user |
Q:怎么修改用户
A:
1 | 修改描述信息 |
参数还可以使用:
- -c 修改描述信息
- -d 修改家目录,默认不会创建新目录,如果想移动家目录,则需要使用-m
- -g 修改用户组
- -G 修改用户的附加组,默认情况下是替换
- -a 追加附加组
- -l newname 修改用户的登录名称
- -L 锁定用户,不能登录系统,修改密码默认情况下回解锁
- -U 解锁用户
- -s 修改用户登录后的shell
- -u 修改用户的uid
- -e 年-月-日 修改用户的过期时间,过期以后不能登录
Q:怎么删除用户
A:
1 | 新建用户,新建的用户目录会挂载到home目录下,以用户名命名 |
进程
在Linux中进程是指计算机正在运行的程序的实例,是操作系统进行任务管理和资源分配的基本单位,进程可以是用户启动的应用程序也可以是系统启动的服务或守护进行。
进程概念的引入让Linux多任务处理和多用户同时使用称为可能,每个进程都有一个所属者,可以是系统root,也可以是用户username,操作系统按照一定的策略进行进程调度,给用户带来同时运行多个任务的错觉。
进程的相关概念
- 程序:存储在磁盘上的可执行文件,包含代码和静态文件,是一个静态实体,没有执行过程
- 进程:是程序的一个实例,拥有运行所需的相关资源和环境,操作系统创建,可以独立运行和占用系统资源,用唯一的PID标识和管理进程,相当于进程的身份证
- 进程控制块(PCB):管理进程的数据结构,保存进程的相关信息,如:进程状态信息、程序计数器、寄存器内容,进程优先级等,操作系统公国PCB来管理和跟踪今晨
- 上下文切换:CPU在进程切换时保存当前进程状态并加载新进程状态的过程
- 父子进程:进程可通过派生(fork)来创建子进程,子进程从父进程继承一些特性的同时可以执行不同的代码路径,父进程通过对子进程的监视和管理来实现进程通信和写作
进程查看
当你只需要查看当前系统的一次性进程快照时使用快照ps命令
显示所有用户的进程列表,包括详细信息(用户、PID、CPU、内存使用情况等)。
1 | ps -aux |
参数 | 含义 |
---|---|
-a | 显示所有进程 |
-u | 显示有效的使用者 |
-x | 显示无终端控制的进程 |
-e | 显示所有进程 |
-f | 全格式显示 |
–forest | 树形展示进程关系 |
如果需要查看进程的父进程ID和完整的命令名,$ ps -ef
是更合适的选择,因为它提供了这些信息。
而如果需要查看进程的CPU占用率和内存占用率,$ ps -aux
则更为适用,因为它专门提供了这些资源使用情况的列。
根据进程名查询进程号
1 | pname是进程名 |
查看僵尸进程
1 | ps aux | grep zombie |
僵尸进程通常只是系统中临时存在的,并不会长时间占有资源,我们找僵尸进程的最终目的在于发现导致僵尸进程产生的程序问题,这往往涉及到父进程的错误代码处理,确保器正确回收子进程资源。
树状显示所有进程的关系结构,对于理解进程之间的父子关系非常有用
1 | pstree |
当你需要实时监控系统进程状态和资源利用情况,top和htop命令更适合
top命令用于实时显示进程占用状态和系统资源占用情况:
1 | 实时查看 |
使用top后按照CPU占用率排序
快捷键:CTRL+P
返回信息解释:
1 | top - 15:30:32 up 5:58, 2 users, load average: 0.00, 0.00, 0.00 |
内容 | 含义 |
---|---|
15:30:32 up | 当前时间 |
5:58 | 系统运行时间 |
load average: 0.00, 0.00, 0.00 | 系统的平均负载情况。分别代表最近1分钟、5分钟和15分钟的平均负载值 |
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa | CPU占用,us用户空间使用,sy系统内核空间使用,id空闲空间,waIO占用 |
MiB Mem : 3875.9 total, 1569.2 free, 1966.9 used, 1239.8 buff/cache | 内存状态 |
MiB Swap: 1873.4 total, 1873.4 free, 0.0 used, 2563.8 avail Mem | 交换空间状态 |
PR,NI | PR优先级NI无调整优先级 |
VIRT,RES,SHR | VIRT虚拟内存,RES常驻内存,SHR共享内存 |
进程的状态
进程状态 | 含义 |
---|---|
运行(Running) | 进程正在执行或准备执行 |
等待(Waiting) | 进程被挂起,等待某个事件的发生,例如等待输入、等待系统资源或等待其他进程完成 |
停止(Stopped) | 进程被暂停执行并进入停止状态,可以通过发送信号(如 SIGSTOP 或 SIGTSTP)来实现 |
退出(Exited) | 进程已正常终止并退出 |
僵尸(Zombie) | 进程已经终止,但父进程尚未处理完该进程的退出状态,使得进程成为僵尸进程。僵尸进程将占用系统资源,直到父进程获取其退出状态 |
前台(Foreground) | 进程在前台接收来自用户的输入 |
后台(Background) | 进程在后台运行,不接收来自用户的输入 |
停滞(Dormant) | 进程处于休眠状态,等待某些条件的发生才会恢复执行 |
跟踪(Traced) | 进程正在被调试器跟踪 |
终止进程
最简单的终止进程方式:
1 | 请求终止PID为1234的进程 |
请注意kill并不是一个终止命令,而是发送终止请求给进程,由进程来决定是否接受终止命令,kill可以携带请求参数,进程对不同的请求参数会有不同的反应
使用下面命令可以查看支持的参数命令:
1 | kill -l |
使用方式举例,我想给目标进程发一个请求终止的信号,那就用:
1 | 进程收到请求终止信号时如果接受就会做一些清理操作等动作并结束进程 |
如果要强行终止某个进程,不在意其数据丢失等就用:
1 | kill -9 PID |
用SIGKILL就相当于电脑主机直接断电,很可能造成数据损坏,谨慎使用。
上面的是根据PID终止进程的方式,还可以根据进程名终止进程
1 | 根据精准的进程名称来终止匹配的进程 |
磁盘管理
Q:怎么查看磁盘用量?
A:使用df命令
1 | -h参数:以人类易读的方式展示 |
Q:怎么查看文件目录占用空间大小?
A:使用du命令
1 | -h参数:以人类易读的方式展示 |
Q:怎么查看内存使用情况?
A:使用
1 | MB为单位展示 |
Linux文件系统
根目录结构
/bin:存放系统的基本命令,以及一些二进制可执行文件
/etc:存放系统和一些软件的配置文件
/home:用户的home目录,一般进入命令行的默认目录
/opt:可选的第三方软件包
/tmp:临时文件
/usr:用户程序
/dev:设备文件
/boot:启动加载器文件
/root:root用户的home目录
/lib:系统库文件
/proc:进程信息
/sys:系统文件
/var:可变文件,如日志等
显示当前目录结构可以借助du
显示文件大小的命令附带的展示目录结构
1 | du |
或者使用专业的目录结构展示工具以树状图形式显示目录结构
1 | tree |
这个tree命令并不是Linux系统自带的命令,需要使用包管理器来安装:
1 | sudo apt install tree |