Linux从入门到入土
Linux从入门到入土
前言:水平十分有限,仅仅是个人总结linux的入门知识,参考资料众多无法一一考证出处,如有侵权请联系删除!
并不能保证内容全部正确,请读者仔细甄别,如有错误欢迎批评指正。
一、绪论
1 什么是linux
Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。
今天各种场合都有使用各种Linux发行版,从嵌入式设备到超级电脑,并且在服务器领域确定了地位。开放源代码的Linux可以让知识延续下去,新兴的软件公司可以从开放源代码上快速、低价的创建专业能力,丰富市场的竞争,防止独霸软件巨兽的存在。个人使用很少有著作权问题,绝大多数都是免费使用,几乎无所谓盗版问题。
2 linux与linux内核
Linux严格来说是单指操作系统的内核,因操作系统中包含了许多用户图形接口和其他实用工具。如今Linux常用来指基于Linux的完整操作系统,内核则改以Linux内核称之。1991年,林纳斯·托瓦兹(Linus Benedict Torvalds),一名21岁的就读于芬兰赫尔辛基大学的计算机科学专业学生,基于一些简单的想法,打算编写一个操作系统内核。之后,许多人为这个项目贡献了代码。
-
到1991年9月,Linux内核版本 0.01 在芬兰大学和研究网络(FUNET)的FTP服务器(ftp.funet.fi)上发布。它有10,239行代码。
-
在1991年10月,0.02版本的内核发布了。
-
1991年12月,0.11版本的内核发布。
-
1994年3月14日,Linux内核1.0.0发布,共176,250行代码。
-
1995年3月,Linux 内核1.2.0发布,共310,950行代码。
-
1999年1月25日,发布Linux内核2.2.0(1,800,847行代码)
-
1999年12月18日,允许 Linux 内核用于企业级机器
-
2001年1月4日,发布 Linux 内核2.4.0(3,377,902行代码)
-
2003年12月17日,发布 Linux 内核2.6.0(5,929,913行代码)
-
从2004年开始,发布过程发生了变化,新的内核每隔2-3个月定期发布,编号为2.6.0、2.6.1,直到2.6.39。
-
2011年7月21日,Torvalds宣布发布Linux内核3.0:“2.6.<大版本> 的日子过去了”。
-
2013年6月发布的Linux内核版本3.10包含15,803,499行代码,而2015年6月发布的4.1版本已发展到超过1950万行代码,由近14000名程序员贡献。
按照传统商业软件开发的方式,截至2011年1月4日,使用当前的代码行,将花费约30亿美元(约22亿欧元),才能够重新开发Linux的内核。
3 安装和下载
以CentOS为例学习linux:在官网地址下载和安装系统。
二、Bash shell
Bash Shell是一个命令解释器,它在操作系统的最外层,负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给操作系统,并将处理后的结果输出至屏幕。当我们使用远程连接工具连接linux服务,系统则会给打开一个默认的shell,我们可在这个界面执行命令,使用Shell可以实现对Linux系统的大部分管理。
1 提示符
登录到linux之后,每条命令左边都有这些提示符。
1 | [root@localhost ~]# |
2 基础语法
bash shell有三部分组成:command [-options] [arguments]
1 | # 命令 选项 参数 |
3 命令快捷键
快捷键可以帮助我们大大提升工作效率。
1 | Ctrl + a #光标跳转至正在输入的命令行的首部 |
4 命令补全
使用tab可以帮我们补全命令,也可以补全路径,在实际生产中tab补全往往是我们使用的最多的。
1 | # 比如查看ip命令,在centos7以上没有,需要安装:yum install net-tools -y |
本身不支持参数的补全,需要安装工具包
1 | yum install bash-completion -y |
安装完之后,新打开一个bash后就有效果了,tab支持参数补全。
5 历史命令history
1 | [root@localhost ~]# history |
可以查看所有历史敲过的命令,使用!
加命令对应的序号就可以重新执行某行。举例:
1 | !13 # 相当于执行了13行ls命令 |
三、文件管理
文件管理是对一个文件进行、创建、复制、移动、查看、编辑、压缩、查找、删除等等。linux一切皆文件,所有的修改最终都是对文件操作。
1 linux文件目录结构
几乎所有的计算机操作系统都是使用目录结构组织文件。一般使用树状的文件结构,所以该结构又被称为“目录树”。
windows的目录数据结构是森林,多根;linux是树,单根。
/
根目录,所有的文件都在它的下面bin
二进制可执行文件,这个目录存放着最经常使用的命令,如ls,yum等等boot
这里存放的是与系统启动相关的文件,包括一些连接文件以及镜像文件,linux内核文件也在这里dev
是Device(设备)的缩写,该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的etc
用来存放配置文件和子目录,包括yum/rpm安装的软件配置文件等等home
普通用户的家目录,在创建用户时,每个用户要有一个默认登录和保存自己数据的位置,就是用户的主目录,如用户bob的主目录就是 /home/bobroot
系统管理员用户家目录run
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。sbin
这里存放的是系统管理员使用的系统管理程序tmp
存放临时文件usr
是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下var
在系统运行后才会渐渐占用硬盘容量的目录,目录主要是常态性变动文件,包括缓存(cache)、登录文件(logfile)以及某些软件运行所产生的文件,包括程序文件(lock file,run file),或者例如Mysql数据库的文件等
下面分别来介绍一些根目录下常见的文件夹
1.1 usr目录
是一个非常重要的目录,相当于win系统的C:Windows,目录结构如下
usr/bin/
用户所用命令,根目录下的bin目录是软链接到这里的binusr/sbin/
系统管理员命令,与用户相关,根目录下的sbin也是软链接这里的sbinusr/etc/
该目录用于存放配置文件usr/local
软件安装的目录,相当于C:Program filesusr/lib
所有可执行文件所需要的库文件,Glibc 32bit,类似于windows下的dll文件usr/lib64
所有可执行文件所需要的库文件,Glibc 64bitusr/include
各种头文件,编译文件等时需要使用usr/games
曾经包含游戏等文件,现在很少用到usr/local
本地系统管理员用来自由添加程序的目录
1.2 etc目录
存放的是配置文件。极其重要,所有服务的配置都在这个目录中,常用的有:
1 | /etc/sysconfig/network-scripts/ifcfg-* # 网络配置文件 |
1.3 var目录
存放一些常态性变动文件,比如缓存、日志、登陆文件等等。
1 | # 查看用户登录登陆日志 |
1.4 dev目录
该目录下存放的是 Linux 的外部设备,比如硬盘,硬盘分区,光驱,等等。
1 | /dev/sd # 硬盘设备 |
1.5 proc目录
根目录下的proc是反映系统当前进程的实时状态,如对应的进程停止则/proc下对应目录则会被删除
1 | ls /proc # 可以看到很多id号,pid号,进程号,唯一 |
1.6 其他文件夹
1 | /media # 提供设备的挂载点,媒体文件。linux新增了盘符,需要手动挂载,把光盘里的数据,挂载到media目录 |
2 文件管理命令
2.1 创建文件
1 | touch file # 没有则创建,有则修改时间 |
2.2 创建文件夹
1 | # 选项:-v 显示详细信息 -p 递归创建目录 |
2.3 删除
1 | # 选项:-r: 递归 -f: 强制删除 -v: 详细过程 |
2.4 移动
1 | mv file file1 #原地移动==改名,把file改名file1 |
2.5 复制
1 | #选项: -v:详细显示命令执行的操作 -r: 递归处理目录与子目录 -p: 保留源文件或目录的属性 |
2.6 查看文件内容
1 | #------cat 文件查看 |
2.7 文件的上传与下载
wget、curl联网下载文件
1 | # 如果没有wget命令,首先需要安装 |
rz,sz上传下载文件
1 | # 如果没有rz,sz命令,首先需要安装 |
2.8 文件查找
文件查找
1 | locate /etc/sh #搜索etc目录下所有以sh开头的文件 |
命令查找
1 | which ls # 查找ls命令的绝对路径 |
2.9 字符处理
在有些情况下,需要对应一个无序的文本文件进行数据的排序,使用sort进行排序。
1 | sort [OPTION]... [FILE]... |
uniq
如果文件中有多行完全相同的内容,希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数, 那么就可以使用uniq
命令解决这个问题(但是必须配合sort
使用,相邻的才能去重,所以要配合sort)。
1 | uniq [OPTION]... [INPUT [OUTPUT]] |
wc统计行号
1 | wc [OPTION]... [FILE]... |
2.10 文件属性
当我们使用ls -l
列出目录下所有文件时,通常会以长格的方式显示,其实长格式显示就是我们Windows下看到的文件详细信息,也称为文件属性,那整个文件的属性分为十列。
1 | -rwxr-xr-x. 1 root root 117656 Jun 30 2016 /bin/ls |
文件类型
通常我们使用颜色或者后缀名称来区分文件类型,但很多时候不是很准确,所以我们可以通过ls -l以长格式显示一个文件的属性,通过第一列的第一个字符来近一步的判断文件具体的类型。
- “-”表示普通文件(文本, 二进制, 压缩, 图片, 日志等)
- “d”表示目录
- “l”表示链接文件
- “p”表示管道文件
- “b”表示块设备文件,存储设备硬盘 /dev/sda1, /dev/sda2
- “c”表示字符设备文件,终端 /dev/tty1, /dev/zero
- “s”表示套接字文件,进程间通信(socket)
但有些情况下,我们无法通过ls -l文件的类型,比如: 一个文件,它可能是普通文件、也可能是压缩文件、或者是命令文件等,那么此时就需要使用file来更加精准的判断这个文件的类型。
1 | file /etc/hosts |
权限
其属性可分为三段:[rwx][r-x][r-x]
,其中第一段表示文件创建者/所有者对该文件所具有的权限,第二段表示创建者/所有者所在的组的其他用户所具有的权限,第三段表示其他组的其他用户所具有的权限。(本人的权限,组内的权限,组外的权限)
- r(Read,读取权限):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
- w(Write,写入权限):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
- x(Execute,执行权限):对文件而言,具有执行文件的权限;对目录来说,该用户具有进入目录的权限。
软链接/硬链接
文件有文件名与数据,在Linux上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。
-
用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方,我们将其称为Block。
-
元数据,即文件的附加属性,如文件大小、创建时间、所有者等信息,我们称其为Inode。
在Linux中,inode是文件元数据的一部分,但其并不包含文件名,inode号即索引节点号,文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
Linux 系统引入了两种链接:硬链接 ( hard link ) 与软链接(soft link)
-
软链接相当于Windows的快捷方式,软链接文件会将inode指向源文件的block,当我们访问这个软链接文件时,其实访问的是源文件本身。那么当我们对一个文件创建多个软链接,其实就是多个inode指向同一个block。当我们删除软链接文件时,其实只是删除了一个inode指向,并不会对源文件源文件造成影响,但如果删除的是源文件则会造成所有软链接文件失效。
-
若一个inode号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名,如下图hard link 就是 file 的一个别名,他们有共同的 inode。
1 | # 举例 |
所有者,组
表示该文件的所有者/创建者(owner)及其所在的组(group)。
文件大小
如果是文件,则表示该文件的大小,单位为字节。
如果是目录,则表示该目录符所占的大小,并不表示该目录下所有文件的大小。
修改日期
该文件最后创建/修改的日期时间。
文件名称
在大多数的linux shell窗口中,还能用颜色来区分不同文件的属性。
- 灰白色表示普通文件
- 亮绿色表示可执行文件
- 亮红色表示压缩文件
- 灰蓝色表示目录
- 亮蓝色表示链接文件
- 亮黄色表示设备文件
总结
四、文件权限管理
在之前的介绍中,我们知道文件的权限属性,下面就来详细介绍linux的权限管理。
1 为什么要引入权限
如果你使用windows系统,你会发现winodws系统也有权限的概念,右键一个文件,点击属性,安全,可以看到如下内容。
这里的完全控制/修改/读取和执行/读取/写入
就是权限类别,windows系统为管理员用户分配了这些权限,同理你也可以对这些权限进行更改,比如把文件设置为只读。
操作系统引入权限的原因,首先因为系统是多用户的,也就是说这台机器会给很多人使用,为了保护每个登陆用户的隐私和工作环境不被其他用户干扰,就需要权限系统。(毕竟谁也不愿意自己安装的软件、写的文章被其他人随随便便删掉。)
2 linux的权限概念
在Linux系统中,针对文件定义了三种身份,分别是属主(owner)、属组(group)、其他人(others),每一种身份又对应三种权限,分别是可读(readable)、可写(writable)、可执行(excutable),分别简写为"rwx"。
平时也会看到一些文章写的权限"700",权限"755",这其实也是权限的表示方法,用数字和字母对应:
字母 | 含义 | 对应权限 |
---|---|---|
r | 读取权限 | 4 |
w | 写入权限 | 2 |
x | 执行权限 | 1 |
- | 没有权限 | 0 |
权限分为三部分,每个部分都是三个字母表示,也可以通过4、2、1的相加组合得到这些权限,举个例子
字母 | 含义 | 对应权限 |
---|---|---|
rw- | 读、写 | 6(4+2+0) |
r– | 只读 | 4(4+0+0) |
rwx | 读、写、执行 | 7(4+2+1) |
— | 没有权限 | 0(0+0+0) |
3 设置权限
使用命令设置权限,比如
1 | chmod 755 filename |
755
即rwxr-xr-x
,使用数字设置权限非常简便。
另外,在Linux中权限对文件和对目录的影响是有不同区别的。
权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
读取权限(r) | 具有读取阅读文件内容权限。 | 具有浏览目录及子目录权限 |
写入权限(w) | 具有新增、修改文件内容的权限 | 具有增加和删除目录内文件权限 |
执行权限(x) | 具有执行文件的权限 | 具有进入目录的内容的权限(取决于目录中文件权限) |
再具体一点,对于文件的权限,主要都是针对“文件内容”而言的。
-
读®:可以读取文件的内容。
-
写(w):可以编辑,修改文件内容。(但不能删除文件)
-
执行(x):文件可以被系统执行。
目录的权限,是针对目录里的“文件”而言的。
-
读®:表示具有读取目录结构列表的权限,你可以查询该目录下的文件名数据,可以利用ls命令将该目录的内容列表显示出来。
-
写(w):表示你具有更改目录结构列表的权限,包括以下权限:
- 新建文件和目录
- 删除已存在的文件和目录
- 重命名已存在的文件和目录
- 转移该目录下的文件和目录
-
执行(x):表示用户可以进入(cd)该目录作为工作目录。
4 更改属组和属组
使用chown、chgrp命令实现。chown可以更改属主和属组,但是chgrp只能更改属组,所以记住chown就可以。
1 | #chown 更改属主以及属组 -R:递归修改 |
五、文件编辑
1 介绍
因为Linux系统一切皆为文件,而我们工作最多的就是修改某个服务的配置(其实就是修改文件内容)。vi和vim是Linux下的一个文本编辑工具,和winodws的记事本是一样的作用。
1.1 vi和vim有什么区别
vi和vim都是文本编辑器,只不过vim是vi的增强版,可以当作vi的升级版本,vim可以用多种颜色的方式来显示一些特殊的信息。vim里面加入了很多额外的功能,例如支持正则表达式的搜索、多文件编辑、块复制等等。 这对于我们在Linux上进行一些配置文件的修改工作时是很棒的功能。使用vi还是vim取决于个人习惯。
如果你是最小化安装CentOS系统,默认情况下没有vim命令,可以使用yum install vim -y
安装
1.2 vim的模式
在使用VIM之前,我们需要先介绍下VIM的三种模式: 普通模式、编辑模式、命令模式,每种模式分别支持多种不同的快捷键,要想高效率地操作文本,就必须先搞清这三种模式的操作区别以及模式之间的切换方法。
- 普通模式:主要是控制光标移动,可对文本进行复制、粘贴、删除等工作。
- 编辑模式:主要进行文本内容编辑和修改
- 命令模式: 主要用于保存或退出文本。
当使用vim
命令打开一个文件时,默认处于普通模式;从普通模式切换至编辑模式需要使用按键a/i/o
;编辑模式修改完毕后需要先使用ECS返回普通模式;在普通模式输入:
或/
进入命令模式,可实现文件的保存与退出。
2 vim的使用
2.1 普通模式
光标跳转
1 | shift+g # 光标跳转到尾部 |
对于文件内容很多的时候需要上下翻页
1 | ctrl+f # 向下翻页 |
复制和粘贴
1 | yy # 复制当前光标所在的行 |
删除、剪贴、撤销
1 | dd # 删除当前光标所在的行(是剪切) |
替换
1 | r # 替换当前光标标记的单个字符 |
2.2 编辑模式
1 | i # 进入编辑模式,光标不做任何操作 |
2.3 命令模式
:
进入命令模式。
文件保存与退出
1 | :w # 保存当前状态 |
文件内容查找
1 | /string # 需要搜索的内容(查找),比如搜索 /bob 搜索bob |
文件内容另存
1 | :w /root/test.txt # 将所有内容另存为/root/test.txt文件中 |
文件内容读入
1 | :r /etc/hosts # 读入/etc/hosts文件至当前光标下面 |
六、用户管理
1 介绍
linux支持多用户,并且Linux系统允许同一时刻多个用户同时登陆,登陆后相互之间操作并不影响。
由于root权限过大,很容易误操作造成系统风险,所以需要新建一些用户,使用普通用户管理服务器。同时,用户还有属组的概念,可以给用户分配到不同的组,使其拥有不同的权限。一个用户可以拥有多个组。
1.1 查看用户信息
1 | id # 查看当前登录的用户信息 |
1.2 用户存放位置
Linux系统会将用户的信息存放在/etc/passwd
,记录了用户的信息,但没有密码信息,密码被存放在/etc/shadow
中。也就是说这两个文件非常的重要,不要轻易删除与修改。
1 | cat /etc/passwd |
1 | cat /etc/shadow |
tips:查看系统的所有用户
1 | cat /etc/passwd | grep bash |
1.3 系统对用户uid的一个约定用法
用户UID | 系统中约定的含义 |
---|---|
0 | 超级管理员,最高权限,有着极强的破坏能力 |
1~200 | 系统用户,用来运行系统自带的进程,默认已创建 |
201~999 | 系统用户,用来运行用户安装的程序,所以此类用户无需登录系统 |
1000+ | 普通用户,正常可以登陆系统的用户,权限比较小,能执行的任务有限 |
2 用户的CURD
2.1 新增
1 | useradd bob # adduser实际上是软链接到useradd |
2.2 修改
1 | usermod |
2.3 删除
1 | userdel |
当我们想删除某个用户的时候,出现user xxx is currently used by process xxx
,可能的原因是你创建用户user1之后,使用su命令切换到user1用户下,之后又想删除user1用户,使用su root切换到root用户下,使用userdel user1。出现上述情况的根本原因在于切换回root用户之后,user1还被某个进程占用。
解决方案:ctrl+d
(退出当前用户)
2.4 密码修改
创建用户之后,如需要使用该用户登陆系统则需要为用户设定密码,设定密码使用passwd
命令。建议密码复杂度一些,不要出现生日、人名等等。
- 普通用户只允许变更自己的密码,无法修改其他人密码,并且密码长度必须8位字符
- 管理员用户允许修改任何人的密码,无论密码长度多长或多短
1 | # 使用passwd命令修改用户密码 |
3 用户组
3.1 新增组
1 | #新增组 |
3.2 修改组
1 | # 选项 -g:修改组gid |
3.3 删除组
删除时需要注意,如果用户存在基本组则无法直接删除该组,如果删除用户则会移除默认的私有组,而不会移除基本组。
1 | # 删除组 |
4 提权
生产环境中一般都是禁止root用户直接登录操作系统,通常使用的都是普通用户,当我们使用普通用户执行/sbin目录下的命令时没有权限运行,这种情况下我们无法正常的管理服务器,那如何才能不使用root用户直接登录系统,同时又保证普通用户能完成日常工作?
我们可以使用如下两种方式: su、sudo
- su:切换用户,使用普通用户登录,然后使用su命令切换到root。优点:简单;缺点:需要知道root密码
- sudo:提权,当需要使用root权限时进行提权,而无需切换至root用户,优点:安全;缺点:复杂
4.1 su
普通用户使用su -
可以直接切换至root用户,但需要输入root用户的密码。
root用户使用su - username
切换普通用户不需要输入密码。
1 | su bob # 表示不打开新的bash窗口,登录在当前目录,不加载环境变量 |
4.2 sudo
su命令在切换root用户时,都需要输入root密码,这样系统会变得非常不安全。sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。sudo使一般用户不需要知道超级用户的密码即可获得权限。
首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中,在一般用户需要取得特殊权限时,其可在命令前加上sudo
,此时sudo将会询问该用户自己的密码,回答后系统即会将该命令的进程以超级用户的权限运行。
1 | # 1.快速配置sudo方式 |
这样做的缺点是提升的权限太大,有时只需要给普通用户几个权限就够了。前面提到过超级用户首先将授权信息登记在特殊的文件中,这个文件一般是/etc/sudoers
,可以在这里配置。下面是该文件的内容:
1 | ## Sudoers allows particular users to run various commands as |
这个文件很长,但主要的部分很简单,我们只需要按照范例进行修改即可。但是并不推荐直接修改这个文件,而是使用visudo
命令编辑。你只需要copy一行,然后把“root”改成你想要添加的那个用户名就可以了。使用visudo
的好处就是它会帮你自动进行语法检查,加锁防止两个管理员同时修改这个文件。所以,强烈建议使用visudo
。
第一种方式:
1 | # 1.使用sudo定义分组,这个系统group没什么关系 |
第二种方式:使用groupadd添加组,然后给组分配sudo的权限,如果有新用户加入,直接将用户添加到该组。
1 | #1.添加两个真实的系统组, group_dev group_op |
最后了解一下sudo的执行过程
七、压缩和解压
在linux安装一些软件时,可能需要下载压缩包安装,所以解压是非常重要的操作。你可能会使用一些ftp工具将windows的压缩包上传到linux上,首先要知道,windows常用的压缩格式有rar
或zip
,在linux上常用的是tar.gz
和zip
,Linux上的压缩格式放在windows系统下都是可以正常打开的。但是windows上的rar
格式在linux上不支持(需要安装插件),所以互相传输文件一般采用zip
。
1 zip
使用zip
可以对文件进行压缩打包,解压使用unzip
命令
1 | # 默认情况下没有zip和unzip工具,需要进行安装 |
2 tar
tar
是linux下最常用的压缩与解压缩,支持文件和目录的压缩归档。
1 | #语法:tar [-zjxcvfpP] filename |
3 gzip打包与压缩
关于gzip,它只可以压缩文件,对文件夹无效。而且压缩后删除原文件,解压后删除压缩包。这个特性使得它很鸡肋。
安装gzip:
1 | yum install gzip -y |
示例:
1 | gzip file #对文件进行压缩 |
虽然看起来没用,但是有一个使用场景:当需要让某个配置文件不生效时,可以利用gzip的特性,快速关闭和启用配置文件。在下面的软件管理中会具体提到。
八、软件管理
1 RPM介绍
RPM是Red-Hat Package Manager(红帽软件包管理器)的缩写,一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.rpm
扩展名的文件。
如下图,是一个rpm包,它由这几个部分组成:软件名称,版本号,发布次数,平台,扩展名。
版本号4.2.46
中,4代表大版本号,2代表小版本号,46是修正次数,每次发布都会自增。
x86_64
代表64位架构。
2 使用RMP包安装升级卸载
RPM包是已经编译打包的文件,安装起来也不难,简单的一个命令即可安装。
如果你使用虚拟机,那么你可以挂载操作系统镜像,然后执行:
1 | mount /dev/cdrom /mnt |
mnt路径下的Packages内就是系统镜像自带的一些rpm包。
以下列出了rpm命令进行安装软件的常用参数。
选项 | 描述 |
---|---|
-i | 安装rpm |
-v | 显示安装详细信息 |
-h | 显示安装rpm进度 |
–force | 强制重新安装 |
–nodeps | 忽略依赖关系 |
安装本地软件包,需要指定软件包绝对路径。(软件包在当前目录不需要绝对路径)
1 | rpm -ivh /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm |
如果软件包存在, 强制再次安装
1 | rpm -ivh --force /mnt/Packages/tree-1.5.3-3.el6.x86_64.rpm |
rpm安装某些包时,会出现安装不上的问题,原因是rpm包之间有依赖关系。使用nodeps
可以忽略依赖关系安装:
1 | rpm -ivh --nodeps /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm |
以上都是本地挂载镜像安装。rpm还可以联网安装,指定一个远程地址即可 。
1 | # 远程url安装 |
卸载rpm包使用-e
选项,注意卸载时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包。
1 | # 卸载zabbix-agent |
3 查询已安装的rpm包
下面列出了查询常用的选项:
选项 | 描述 |
---|---|
rpm -q | 查看指定软件包是否安装(常用) |
rpm -qa | 查看系统中已安装的所有RPM软件包列表 |
rpm -qi | 查看指定软件的详细信息 |
rpm -ql | 查询指定软件包所安装的目录、文件列表(常用) |
rpm -qc | 查询指定软件包的配置文件(只有etc下的配置文件) |
rpm -qf | 查询文件或目录属于哪个RPM软件 |
rpm -qip | 查询未安装的rpm包详细信息 |
rpm -qlp | 查询未安装的软件包会产生哪些文件 |
举例
1 | #查询vsftpd这个rpm包是否安装 |
4 yum介绍
介绍完rpm,你会发现它有一个缺点,那就是无法处理依赖。有依赖就不能安装和卸载,非常麻烦。
yum解决了该问题。Yum是RedHat以及CentOS中的软件包管理器,能够通过互联网下载.rpm
包并且安装,并可以自动处理依赖性关系,无须繁琐地一次次下载、安装。这里有一个yum源的概念:要使用yum工具安装更新软件或系统,就需要有一个包含各种rpm软件包的repository(软件仓库),仓库可以是本地仓库,也可以是网络仓库。这个软件仓库我们习惯称为 yum 源。
要使用yum首先要有源。/etc/yum.repos.d/
目录下存放的xxx.repo
文件就是yum源。
1 | yum repolist # 该命令可以查看现在有多少源 |
5 yum换源
默认情况使用的是官方源(下图是bfsu的镜像源)
如果使用yum安装软件,提示不存在,那么可以考虑换源。换成阿里开源镜像站的yum源:
实际上就是下载阿里的CentOS-Base.repo
到 /etc/yum.repos.d/
,比如centOS7的基本源
1 | wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo |
另外还有扩展源,为什么要装扩展源,因为有很多软件在基本源中没有。
1 | wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo |
除了配置阿里yum源之外,学习nginx时可能要使用官方的yum源来安装。
搭配gzip的应用
之前我们提到过gzip有一个使用场景。比如我们现在配置了阿里云的yum扩展源,里面已经有nginx了,但是版本比较旧。想要最新版本的nginx,就只能去官网配置yum源。但是,两个配置会优先使用扩展源,即使配置了官方源可能也不会生效。此时就可以利用gzip的特性,快速关闭和启用配置文件。
1 | cd /etc/yum.repos.d/ |
我们把所有的yum源全部打包成.gz
文件,原文件也被删除,现在yum就没有可用的源了。
然后配置nginx官方源
1 | vim /etc/yum.repos.d/nginx.repo |
复制以下内容粘贴
1 | [nginx-stable] |
现在可以使用yum安装最新版本的nginx
1 | yum install nginx |
安装完之后,再使用gzip解压
1 | gzip -d * |
6 源码安装
源码包指的是开发编写好的程序源代码,但并没有将其编译为一个能正常使用的工具。yum安装十分简单,但是有些包可能没有收录,如果yum安装不上可能就需要去软件官网下载源码安装。源码安装还有一个好处,那就是可以获取到最新的包,并且可以自行修改软件源码。
6.1 获取源码包
一般来说软件包都可以在官网下载,比如nginx、mysql、python等等。以安装nginx为例,去官网下载安装包。
1 | wget http://nginx.org/download/nginx-1.21.4.tar.gz |
6.2 编译安装
解压
1 | tar -zxf nginx-1.21.4.tar.gz |
进入目录,编译安装
1 | cd nginx-1.21.4 |
配置nginx环境变量,并使环境变量生效
1 | echo 'export PATH=$PATH:/usr/local/nginx/sbin' >> /etc/bashrc |
查看nginx版本号
1 | nginx -v |
如果出现版本号就说明已经安装完毕了。常用命令如下:
1 | # 命令 |
6.3 报错信息处理
一般报错都是nginx依赖的模块没有安装,对应安装即可。
1 | checking for C compiler ... not found ./configure: error: C compiler cc is not found |
想要省事,就直接把依赖先安装好。
1 | yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel |
总结一下安装流程:
7 几种安装方式比较
分类 | 安装方式 | 特点 |
---|---|---|
rpm包 | 命令安装 | 优点:安装简单;缺点:软件版本偏低,需要手动解决依赖,有些包可能没有收录 |
yum包 | 命令安装 | 优点:安装简单,自动解决依赖;缺点:软件版本偏低,有些包可能没有收录 |
源码包 | 手动编译安装 | 优点:软件版本最新;缺点:安装繁琐 |
九、系统服务systemd
参考文章:Systemd 入门教程:命令篇
1 系统服务介绍
系统服务是在后台运行的应用程序,并且可以提供一些本地系统或网络的功能。我们把这些应用程序称作服务,也就是Service。它们通常都会监听某个端口,等待其它程序的请求,比如mysql,nginx等等。
linux的启动流程大致分为开机自检BIOS-->MBR启动引导-->硬盘启动-->加载内核-->启动初始化进程
。到这一步时,linux内核的一些系统的不同版本使用的初始化进程是不同的。比如CentOS6使用init进程,而CentOS7使用Systemd。
2 systemd介绍
linux一直以来都是采用init进程作为初始进程,但是init有两个缺点:
- 启动时间长。Init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
- 启动脚本复杂,初始化完成后系统会加载很多脚本,脚本都会处理各自的情况,这会让脚本变得很复杂。
Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。
相比于init,systemd有以下优点:
- 最新系统都采用systemd管理(RedHat7,CentOS7,Ubuntu15等)
- Centos7支持开机并行启动服务,显著提高开机启动效率
- Centos7关机只关闭正在运行的服务
- Centos7服务的启动与停止不再使用脚本进行管理
- 原有service不会关闭程序产生的子进程,Centos7使用systemd解决原有模式缺陷
systemd架构图:
3 systemd配置文件
3.1 概述
Systemd可以管理所有系统资源。不同的资源统称为 Unit(单位)。每一个 Unit 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit 。
1 | /usr/lib/systemd/system/ # 目录下是真正的system的配置 |
Systemd 默认从目录/etc/systemd/system/
读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/
,真正的配置文件存放在这里。我们通过systemctl设置开机启动,其实质是增加由/usr/lib/systemd/system/
到/etc/systemd/system/multi-user.target.wants/
下的软链接。
下图展示的就是这些配置文件:
3.2 配置文件的格式
任意打开一个配置文件,你会发现他们的格式有共同点。
1 | [Unit] |
配置文件分成几个区块,每个块之间使用中括号[]
区别,注意,配置文件的区块名和字段名,都是大小写敏感的。区块内部是一些键值对,等号两侧不能有空格。
[Unit]
区块通常是配置文件的第一个区块,用来定义Unit的元数据,以及配置与其他Unit的关系。它的主要字段如下。
1 | Description:简短描述 |
[Service]
区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。
1 | Type:定义启动时的进程行为。它有以下几种值。 |
[Install]
通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。
1 | WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中 |
3.3 举例:nginx的service配置
在我的本地博客部署这篇博客中,有介绍nginx的配置,这里补充一下。
1 | [Unit] |
这里的运行级别,就是操作系统当前正在运行的功能级别。级别从0到6,如下:
运行级别 | systemd目标名称 | 作用 |
---|---|---|
0 | runlevel0.target, poweroff.target | 关机 |
1 | runlevel1.target, rescue.target | 单用户模式 |
2 | runlevel2.target, multi-user.target | 暂未使用 |
3 | runlevel3.target, multi-user.target | 多用户的文本界面(黑框) |
4 | runlevel4.target, multi-user.target | 没有使用 |
5 | runlevel5.target, graphical.target | 多用户的图形界面 |
6 | runlevel6.target, reboot.target | 重启 |
原理(了解)
/etc/rc.d/init.d
下有许多服务器脚本程序,一般称为服务(service),在/etc/rc.d
下有7个名为rcN.d的目录,对应系统的7个运行级别。
rcN.d
下都是一些软链接文件,这些链接文件都指向/etc/rc.d/init.d
目录下的service
脚本文件。比如以rc3.d
举例
命名规则为K+nn+服务名或S+nn+服务名,其中nn为两位数字。
系统启动时,会根据运行级别进入对应的rcN.d
目录,并按照文件名顺序检索目录下的链接文件。对于以K开头的文件,系统将终止对应的服务;对于以S开头的文件,系统将启动对应的服务。
查看系统运行级别可以使用命令:
1 | runlevel |
一般来说,默认选3就可以。也就是multi-user.target
4 systemctl相关命令
systemctl
是Systemd的主命令,用于管理系统。比如管理服务的启动、重启、停止、重载、查看状态等。对于用户来说,最常用的是下面这些命令,用于启动和停止 Unit(主要是 service)。想要使用systemctl命令,必须确保软件的配置文件在/usr/lib/systemd/system/
目录下,一般来说yum安装会自动配置,但是二进制安装不会,需要手动配置(去该目录下创建一个xxx.service
文件)。另外,一旦修改配置文件,就要让Systemd重新加载配置文件,否则修改不会生效。
systemctl命令 | 说明 |
---|---|
systemctl start crond.service | 启动服务;cround 为服务名,.service 可以不加,下同 |
systemctl stop crond.service | 停止服务 |
systemctl restart crond.service | 重启服务 |
systemctl kill crond.service | 杀死一个服务的所有子进程 |
systemctl reload crond.service | 重新加载配置 |
systemctl status crond.servre | 查看服务运行状态 |
systemctl is-active sshd.service | 查看服务是否在运行中 |
systemctl mask crond.servre | 禁止服务运行 |
systemctl unmask crond.servre | 取消禁止服务运行 |
当我们使用systemctl启动一个守护进程后,可以通过sytemctl status 进程名
查看此守护进程的状态。比如systemctl status nginx.service
(可以不写.service
),相关状态如下:
状态 | 描述 |
---|---|
loaded | 服务单元的配置文件已经被处理 |
active(running) | 服务持续运行 |
active(exited) | 服务成功完成一次的配置 |
active(waiting) | 服务已经运行但在等待某个事件 |
inactive | 服务没有在运行 |
enabled | 服务设定为开机运行 |
disabled | 服务设定为开机不运行 |
static | 服务开机不启动,但可以被其他服务调用启动 |
systemctl设置服务开机启动、不启动、查看各级别下服务启动状态等常用命令:
systemctl命令(CentOS7) | 描述 |
---|---|
systemctl enable crond.service | 开机自动启动 |
systemctl disable crond.service | 开机不自动启动 |
systemctl list-unit-files | 查看各个级别下服务的相关状态 |
systemctl is-enabled crond.service | 查看特定服务是否为开机自启动 |
systemctl is-active crond.service | 查看特定服务是否为正在运行 |
systemctl daemon-reload | 创建新服务文件;修改了依赖关系,需要重载变更,否则不生效 |
十、进程管理
程序在运行后,我们需要了解进程的运行状态。查看进程的状态分为: 静态和动态两种方式。
1 使用ps命令查看进程状态
1 | ps -aux |
状态 | 描述 |
---|---|
USER | 启动进程的用户 |
PID | 进程运行的ID号 |
%CPU | 进程占用CPU百分比 |
%MEM | 进程占用内存百分比 |
VSZ | 进程占用虚拟内存大小 (单位KB) |
RSS | 进程占用物理内存实际大小 (单位KB) |
TTY | 进程是由哪个终端运行启动的tty1、pts/0等。?表示内核程序与终端无关(远程连接会通过tty打开一个bash:tty) |
STAT | 进程运行过程中的状态 man ps (/STATE) |
START | 进程的启动时间 |
TIME | 进程占用 CPU 的总时间(为0表示还没超过秒) |
COMMAND | 程序的运行指令,[ 中括号 ] 属于内核态的进程。 没有 [ ] 的是用户态进程。 |
选项-aux
看不到父进程,我们使用-ef
选项查看
1 | ps -ef |
状态 | 描述 |
---|---|
UID | 用户ID |
PID | 进程ID |
PPID | 父进程ID |
C | CPU用于计算执行优先级的因子。数值越大,表明进程是CPU密集型运算, 执行优先级会降低;数值越小,表明进程是I/O密集型运算,执行优先级会提高 |
STIME | 进程启动的时间 |
TTY | 完整的终端名称 |
TIME | 进程占用 CPU 的总时间(为0表示还没超过秒) |
CMD | 程序的运行指令,[ 中括号 ] 属于内核态的进程。 没有 [ ] 的是用户态进程。 |
过滤某些进程
1 | ps aux | grep bash # 过滤bash |
2 使用top命令查看进程状态
top
命令提供系统进程的动态的实时情况
1 | top |
状态 | 描述 |
---|---|
Tasks: 103 total | 当前进程的总数 |
1 running | 正在运行的进程数 |
102 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
%Cpu(s) | 平均cpu使用率,按1查看每个cpu具体状态 |
0.0 us | 用户进程占用cpu百分比 |
0.2 sy | 内核进程占用百分比 |
0.0 ni | 优先级进程占用cpu的百分比 |
99.8 id | 空闲cpu |
0.0 wa | CPU等待IO完成的时间,大量的io等待,会变高 |
0.0 hi | 硬中断,占的CPU百分比 |
0.0 si | 软中断,占的CPU百分比 |
0.0 st | 虚拟机占用物理CPU的时间 |
top是一个强大的工具,在top界面,你可以使用这些常用按键
字母 | 含义 |
---|---|
h | 查看帮助 |
1 | 数字1,显示所有CPU核心的负载 |
z | 以高亮显示数据 |
b | 高亮显示处于R(进行中)状态的进程 |
M | 按内存使用百分比排序输出 |
P | 按CPU使用百分比排序输出 |
q | 退出top |
3 关闭进程
使用kill
关闭某些进程
1 | kill -l # 列出当前系统所支持的信号 |
一共有64种信号,分为两类,不可靠信号(1-31)和可靠信号(32-64)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会(发送几次信号就收到几次)。
1 | 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP |
这些信号里,介绍一些常用的
数字编号 | 信号含义 | 信号翻译 |
---|---|---|
1 | SIGHUP | 一般守护进程都会在收到这个信号时重新加载配置。 (类似 reload) |
9 | SIGKILL | 强制杀死进程(有状态的服务(存磁盘的,如mysql)强制停止可能会导致下次起不来) |
15 | SIGTERM | 终止进程,默认kill不加参数就是这个信号 |
大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后再停止。然而kill -9
命令,系统给对应程序发送的信号是SIGKILL,不会被阻塞直接递达,所以能顺利杀掉进程。
Linux系统中的killall
、pkill
命令用于杀死指定名字的进程。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall
、pkill
把这两个过程合二为一,是一个很好用的命令。
1 | # 通过服务名称杀掉进程 |
附1、paramiko的简单使用
该模块可以利用python远程执行linux命令,实现自动化操作多台机器。
下面是一个简单的例子:
1 | import paramiko |