这个笔记比较全面的记录了本人学习Linux的过程,内容还是比较系统、全面的。学习参考的文档以及教程来源繁多,但都吸取了其中比较好的精华,并在此基础上有所拓展深入。本次笔记更多还是在于Linux命令使用上的总结,对于日后的运维学习必定有所帮助…
¶一、概念
Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。
目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。但大体上分类为RedHat系列和Debian系列。所以本文档主要是使用CentOS并辅助性地掺杂Ubuntu一起进行讲述的。
¶1. 终端命令格式
Linux 刚面世时并没有图形界面,所有的操作全靠命令完成。对于命令的使用需要注意其格式。
1 | command [-options] [parameter] |
说明:
-
command
:命令名,相应功能的英文单词或单词的缩写 -
[-options]
:选项,可用来对命令进行控制,也可以省略 -
parameter
:传给命令的参数,可以是 零个、一个 或者 多个 -
[]
代表可选
¶2. 查阅命令的帮助文档信息
可通过在命令后加--help
选项或者在命令的前面添加man
命令来查看相关命令的帮助文档信息。
¶2.1 --help
1 | #显示command命令的帮助信息 |
¶2.2 man
1 | #查阅command命令的使用手册 |
man
是 manual 的缩写,是 Linux 提供的一个 手册,包含了绝大部分的命令、函数的详细使用说明
使用 man
时的操作键:
操作键 | 功能 |
---|---|
空格键 | 显示手册页的下一屏 |
Enter 键 | 一次滚动手册页的一行 |
b | 回滚一屏 |
f | 前滚一屏 |
q | 退出 |
/word | 搜索 word 字符串 |
💡 提示:
初级阶段只需要 知道 通过以下两种方式可以查询命令的帮助信息
先学习常用命令及常用选项的使用即可,工作中如果遇到问题可以借助 网络搜索
¶二、基础命令
由于Linux命令实在太多,下面先介绍最最常用的通用基本操作命令。后面章节会扩展性地讲述其他命令。
1 | #查看当前文件夹下的内容,list |
¶三、命令操作技巧
在使用终端命令的过程中,使用一些操作技巧可以辅助我们更有效率地完成工作。
¶1. 放大终端窗口的字体显示
ctrl + shift + =
¶2. 缩小终端窗口的字体显示
ctrl + -
¶3. 自动补全
在敲出 文件
/目录
/命令
的前几个字母之后,按下 tab
键。如果输入的没有歧义,系统会自动补全,如果还存在其他 文件
/目录
/命令
,再按一下 tab
键,系统会提示可能存在的命令。
¶4. 终端历史命令切换
按 上
/下
光标键可以在曾经使用过的命令之间来回切换
¶5. 退出执行中的命令
如果想要退出选择,并且不想执行当前选中的命令,可以按 ctrl + c
¶四、文件管理
¶1. 文件系统
¶Windows 文件系统
- 在
Windows
下,打开 “计算机”,我们看到的是一个个的驱动器盘符:
- 每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形,如图所示:
¶Linux文件系统
¶Linux目录结构
- 在
Linux
下,我们是看不到这些驱动器盘符,我们看到的是文件夹(目录):
Ubuntu
没有盘符这个概念,只有一个根目录/
,所有子目录和文件都在它下面
¶Linux主要目录介绍
-
/
:根目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始,当在终端里输入/home
,其实是在告诉电脑,先从/
(根目录)开始,再进入到home
目录。 -
/bin
、/usr/bin
:可执行二进制文件的目录,如常用的命令ls
、tar
、mv
、cat
等。 -
/boot
:放置 linux 系统启动时用到的一些文件,如 linux 的内核文件:/boot/vmlinuz
,系统引导管理器:/boot/grub
。 -
/dev
:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱。 -
/etc
:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有:/etc/inittab
/etc/fstab
/etc/init.d
/etc/X11
/etc/sysconfig
/etc/xinetd.d
-
/home
:存放系统中用户的主目录。新增用户账号时,用户的主目录默认为
/home
目录下的一个用户同名的子目录中。如Linux系统存在用户test,则test用户的主目录为:/home/test
~
符号表示当前用户的主目录路径。 -
/lib
、/usr/lib
、/usr/local/lib
:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。 -
/lost+fount
:系统异常产生错误时,会将一些遗失的片段放置于此目录下。 -
/mnt
、/media
:光盘默认挂载点,通常光盘挂载于/mnt/cdrom
下,但也不一定,可以选择任意位置进行挂载。 -
/opt
:给主机额外安装软件所摆放的目录 -
/proc
:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的文件有:/proc/cpuinfo
/proc/interrupts
/proc/dma
/proc/ioports
/proc/net/
-
/root
:系统管理员root的主要目录。 -
/sbin
、/usr/sbin
、/usr/local/sbin
:放置系统管理员使用的可执行命令,如fdisk
、shutdown
、mount
等。与/bin
不同的是,这几个目录是给系统管理员 root 使用的命令,一般用户只能"查看"而不能设置和使用。 -
/tmp
:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。 -
/srv
:服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在/srv/www
内。 -
/usr
:应用程序存放目录:/usr/bin
:存放应用程序/usr/share
:存放共享数据/usr/lib
:存放不能直接运行的,却是许多程序运行所必需的一些函数库文件/usr/local
:存放软件升级包/usr/share/doc
:系统说明文件存放目录/usr/share/man
:程序说明文件存放目录 -
/var
:放置系统执行过程中经常变化的文件:/var/log
:随时更改的日志文件/var/spool/mail
:邮件存放的目录/var/run
:程序或服务启动后,其 PID 存放在该目录下
¶2. 常用命令
¶1)列出目录文件(ls、tree)
1 | #列出目录文件 |
ls
是英文单词 list 的简写,其功能为列出目录的内容,是用户最常用的命令之一,类似于 DOS下的dir
命令常用选项:
-a
:显示指定目录下所有子目录与文件,包括隐藏文件-l
:以列表方式显示文件的详细信息-h
:配合-l
以人性化的方式显示文件大小通配符的使用:
*
:代表任意个数个字符?
:代表任意一个字符,至少 1 个[abc]
:匹配 a、b、c 中的任意一个[a-f]
:匹配从 a 到 f 范围内的的任意一个字符Linux 下文件和目录的特点:
- Linux 文件 或者 目录 名称最长可以有
256
个字符- 以
.
开头的文件为隐藏文件,需要用-a
参数才能显示.
代表当前目录..
代表上一级目录
计算机中文件大小的表示方式
单位 | 英文 | 含义 |
---|---|---|
字节 | B(Byte) | 在计算机中作为一个数字单元,一般为 8 位二进制数 |
千 | K(Kibibyte) | 1 KB = 1024 B,千字节 (1024 = 2 ** 10) |
兆 | M(Mebibyte) | 1 MB = 1024 KB,百万字节 |
千兆 | G(Gigabyte) | 1 GB = 1024 MB,十亿字节,千兆字节 |
太 | T(Terabyte) | 1 TB = 1024 GB,万亿字节,太字节 |
拍 | P(Petabyte) | 1 PB = 1024 TB,千万亿字节,拍字节 |
艾 | E(Exabyte) | 1 EB = 1024 PB,百亿亿字节,艾字节 |
泽 | Z(Zettabyte) | 1 ZB = 1024 EB,十万亿亿字节,泽字节 |
尧 | Y(Yottabyte) | 1 YB = 1024 ZB,一亿亿亿字节,尧字节 |
¶2)切换目录( cd )
1 | #切换到/usr/local/share目录里 |
cd
是英文单词 change directory 的简写,其功能为更改当前的工作目录,也是用户最常用的命令之一。- 注意:Linux 所有的 目录 和 文件名 都是大小写敏感的。
- 关于相对路径和绝对路径的说明:
- 相对路径 在输入路径时,最前面不是
/
或者**~**
,表示相对 当前目录 所在的目录位置- 绝对路径 在输入路径时,最前面是
/
或者~
,表示从 根目录/家目录 开始的具体目录位置
¶3)创建和删除操作(touch、mkdir、rm)
1 | #创建文件 |
¶4)拷贝和移动文件(cp、mv)
1 | ##复制文件或者目录 |
¶5)查看文件内容(cat、more 、grep、tail)
¶(1)cat 查看文件的所有内容
cat
(concatenate)命令可以用来 查看文件内容、创建文件、文件合并、追加文件内容 等功能。
cat
会一次显示所有的内容,适合 查看内容较少 的文本文件。
1 | #查看hello.txt文件的所有内容 |
常用选项:
-b
:覆对非空输出行编号-n
:对输出的所有行编号Linux 中还有一个
nl
的命令和cat -b
的效果等价
¶(2)more 分屏显示文件内容
more
命令可以用于分屏显示文件内容,每次只显示一页内容
适合于 查看内容较多的文本文件
1 | #分屏显示hello.txt文件内容 |
使用 more
的操作键:
操作键 | 功能 |
---|---|
空格键 | 显示手册页的下一屏 |
Enter 键 | 一次滚动手册页的一行 |
b | 回滚一屏 |
f | 前滚一屏 |
q | 退出 |
/word | 搜索 word 字符串 |
¶(3)grep 搜索文本文件内容
Linux 系统中 grep
命令是一种强大的文本搜索工具。
grep
允许对文本文件进行 模式查找,所谓模式查找,又被称为正则表达式。
1 | #显示匹配包含qcmoke字符串的行及行号 |
命令选项:
-n
:显示匹配行及行号-v
:显示不包含匹配文本的所有行(相当于求反)-i
:忽略大小写常用的两种模式查找:
^a
: 行首,搜寻以 a 开头的行ke$
:行尾,搜寻以 ke 结束的行
¶(4)tail 取出文件后面几行
1 | #取出文件后面10行 |
命令选项:
-n
:后面接数字,代表显示几行的意思-f
:侦测文件尾部,要等到按下[ctrl]-c才会结束tail的侦测即,如果文件尾部内容被更改,也会随着显示最新尾部内容,常用于查看日志。
¶6)查找文件( find )
find
命令功能非常强大,通常用来在 特定的目录下 搜索 符合条件的文件
1 | #搜索主目录下,文件名包含hello的文件 |
说明:
-name pattern
: #按照文件名匹配模式查找文件。例如 -name “*.txt” 查找扩展名为 .txt 的文件。-iname pattern
: #类似 -name,但是不区分大小写。-type type
: #根据文件类型查找文件,type 可以为 f (普通文件)、d (目录)、l (符号链接) 等。-mtime n
: #查找在 n 天前被修改过的文件,n 为负数表示查找 n 天内被修改过的文件。-size n[bck]
: #查找文件大小为 n 的文件,单位为字节(默认)、块或千字节。b 表示块,c 表示千字节。-user name
: #查找属于指定用户名的文件。-group name
: #查找属于指定用户组的文件。-perm mode
: #查找权限与指定参数 mode 匹配的文件。mode 可以为类似 644 这样的八进制数,也可以为类似 u=rw,g=r,o=r 这样的符号表示法。-exec command {} \;
: #对每个找到的文件执行 command 命令。其中 {} 表示当前匹配到的文件名,; 表示命令结束。-not expr
: #对表达式 expr 求反,即排除满足条件的文件。-path pattern
: #查找路径名匹配模式的文件。例如 -path “/home/user/*.txt” 查找 /home/user/ 目录下所有扩展名为 .txt 的文件。- 如果省略路径,表示在当前文件夹下查找
¶7)查看目录或文件占用大小( du )
1 | #查看目录及其子目录的大小 |
说明:
-s
:只显示总大小,不显示每个文件的大小。-h
:以人类可读的方式显示文件大小,例如:1K、4.5M、2G 等。-b
:以字节为单位显示文件大小。-c
:同时显示多个文件或目录的总大小。-a
:列出所有文件和目录的大小,而不仅仅是目录。-x
:不递归处理指定目录下的子目录。
¶8)链接( ln )
¶简要概述
¶软链接
1 | #创建文件的软链接,用通俗的方式讲类似于Windows下的快捷方式。 |
- 软链接的特点:
(1)软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
(2)软链接可以 跨文件系统 ,硬链接不可以
(3)软链接可以对一个不存在的文件名进行链接
(4)软链接可以对目录进行链接
- 注意:
(1)没有
-s
选项建立的是一个 硬链接文件(对于硬链接文件,两个文件占用相同大小的硬盘空间,工作中几乎不会建立文件的硬链接)(2)被链接的源文件要使用绝对路径,不能使用相对路径,这样可以方便移动链接文件后,仍然能够正常使用
¶硬链接
1 | #删除硬链接,不会影响源文件,同样的删除源文件也不会影响硬链接,只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放 |
- 硬链接的特点:
(1)硬链接,以文件副本的形式存在。但不占用实际空间。
(2)不允许给目录创建硬链接
(3)硬链接只有在同一个文件系统中才能创建
- 说明:
在 Linux 中,文件名 和 文件的数据 是分开存储的
在 Linux 中,只有文件的
硬链接数 == 0
才会被删除使用
ls -l
可以查看一个文件的硬链接的数量在日常工作中,几乎不会建立文件的硬链接,知道即可
¶9)打包 和 解包( tar )
tar
是 Linux 中最常用的 备份工具,此命令可以 把一系列文件 打包到 一个大文件中,也可以把一个 打包的大文件恢复成一系列文件
1 | # 打包文件(不压缩) |
选项说明
c
:生成档案文件,创建打包文件x
:解开档案文件v
:列出归档解档的详细过程,显示进度f
:指定档案文件名称,f 后面一定是 .tar 文件,所以必须放选项最后注意:
f
选项必须放在最后,其他选项顺序可以随意
¶10)压缩 和 解压缩
¶(1)gzip
gzip 是linux中常见的压缩/解压工具,最常见的使用对象是*.gz格式的文件。
OPTIONS
-c --stdout --to-stdout 结果写到标准输出,原文件保持不变
-d --decompress --uncompress 解压
-k --keep 压缩或者解压过程中,保留原文件
-r --recursive
-t --test 检查压缩文件的完整性
-v --verbose 显示每个文件的名子和压缩率
-<压缩效率> 压缩效率是一个介于1-9的数值,预设值为"6",指定愈大的数值,压缩效率就会愈高。
- –best 此参数的效果和指定"-9"参数相同。
- –fast 此参数的效果和指定"-1"参数相同。
示例1,压缩文件
原文件名为file1.txt,压缩后原文件消失,压缩后文件名为file1.txt.gz
1 | root@ubuntu:/tmp# ls -l file1.* |
示例2,解压文件
1 | root@ubuntu:/tmp# gzip -d file1.txt.gz |
示例3,压缩的时候,显示压缩率
1 | root@ubuntu:/tmp# gzip -v file1.txt |
示例4,一条命令压缩多个文件,压缩之后,是各自分开的:
1 | root@ubuntu:/tmp# gzip file1.txt file2.txt |
示例5,压缩过程中,保留原文件
1 | root@ubuntu:/tmp# gzip -k file1.txt |
示例6,压缩到标准输出中
可以连接两个文件
1 | root@ubuntu:/tmp# cat file1.txt file2.txt | gzip > foo.gz |
¶(2)gunzip
解压gz格式文件(不保留压缩文件)
1 | [root@localhost test]# ls |
¶(3)tar 和 gzip
命令结合可以使用实现文件打包和压缩
tar
只负责打包文件,但不压缩- 用
gzip
压缩tar
包后,其扩展名一般用xxx.tar.gz
在
Linux
中,最常见的压缩文件格式就是xxx.tar.gz
- 在
tar
命令中有一个选项 -z 可以调用gzip
,从而可以方便的实现压缩和解压缩的功能 - 命令格式如下:
1 | #压缩文件 |
选项 | 含义 |
---|---|
-C | 解压缩到指定目录,注意:要解压缩的目录必须存在 |
¶(4)bzip2
tar
与bzip2
命令结合可以使用实现文件 打包和压缩(用法和gzip
类似)tar
只负责打包文件,但不压缩,- 用
bzip2
压缩tar
打包后的文件,其扩展名一般用xxx.tar.bz2
- 在
tar
命令中有一个选项 -j 可以调用bzip2
,从而可以方便的实现压缩和解压缩的功能 - 命令格式如下:
1 | # 压缩文件 |
¶(5)zip 和 unzip
zip压缩文件
案例:压缩 test1.txt test2.txt成test.zip压缩包
1 | zip test.zip test1.txt test2.txt |
zip压缩目录
zip常用选项
-r:递归压缩,即压缩目录
案例:递归压缩test目录
1 | [root@localhost ~]# tree test/ |
-
unzip解压文件
案例:解压缩test.zip文件
1
2
3
4#默认解压到当前目录
unzip test.zip
#解压到指定目录
unzip test.zip -d path
¶11)重定向( >
和 >>
)
Linux 允许将命令执行结果重定向到一个文件,将本应显示在终端上的内容输出或者追加到指定文件中。
1 | #覆盖输出内容到文件中 |
>
表示输出,会覆盖文件原有的内容>>
表示追加,会将内容追加到已有文件的末尾
¶12)管道( |
)
Linux 允许将 一个命令的输出可以通过管道做为另一个命令的输入。使用操作如下:
1 | ps -ef | grep nginx |
可以理解现实生活中的管子,管子的一头塞东西进去,另一头取出来,这里
|
的左右分为两端,左端塞东西(写),右端取东西(读)
¶3. 文件权限管理
在 Linux 系统中,不同的用户对于不同的系统资源拥有不同的使用权限。在 Linux 中,可以指定每一个用户针对不同的文件或者目录的不同权限。文件(目录)的权限包括如下:
序号 | 权限 | 英文 | 缩写 | 数字代号 |
---|---|---|---|---|
01 | 读 | read | r | 4 |
02 | 写 | write | w | 2 |
03 | 执行 | excute | x | 1 |
¶1. 文件的详细信息
1 | #查看文件夹下文件的详细信息(目录也是一种文件) |
打印结果从左到右依次是:
-
权限,第 1 个字符如果是
d
表示目录 -
硬链接数,通俗地讲,就是有多少种方式,可以访问到当前目录/文件
-
拥有者,家目录下 文件/目录 的拥有者通常都是当前用户
-
组,在 Linux 中,很多时候,会出现组名和用户名相同的情况,后续会讲
-
大小
-
最后修改时间
-
名称
¶2. 修改文件权限
1 | # 修改文件|目录的拥有者 |
chmod
在设置权限时,可以简单地使用三个数字分别对应 拥有者 / 组 和 其他 用户的权限
1 | # 直接修改文件|目录的 读|写|执行 权限,但是不能精确到 拥有者|组|其他 |
常见数字组合有(u
表示用户/g
表示组/o
表示其他):
777
===>u=rwx,g=rwx,o=rwx
755
===>u=rwx,g=rx,o=rx
644
===>u=rw,g=r,o=r
¶3. 文件属性模式
¶lsattr
lsattr 命令用于显示文件的属性,使用方式如下
1 | # 查看file.sh 文件的属性 |
详细说明请参考:
📚https://www.runoob.com/linux/linux-comm-lsattr.html
¶chattr
chattr 用于修改文件属性。
1 | chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...] |
选项:
-R
递归处理,将指定目录下的所有文件及子目录一并处理。-v
<版本编号> 设置文件或目录版本。-V
显示指令执行过程。+<属性>
开启文件或目录的该项属性。-<属性>
关闭文件或目录的该项属性。=<属性>
指定文件或目录的该项属性。
这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下几种模式:
a
:让文件或目录仅供附加用途。b
:不更新文件或目录的最后存取时间。c
:将文件或目录压缩后存放。d
:将文件或目录排除在倾倒操作之外。i
:不得任意更动文件或目录。s
:保密性删除文件或目录。S
:即时更新文件或目录。u
:预防意外删除。
该命令请切换至 root 用户下使用。
1 | # 为 file.sh 文件增加 i 标识 |
详细说明请参考:
¶文件属性模式相关问题
Linux 文件/文件夹无法删除问题解决方案
服务器黑客攻击后,如果他们对某些文件(例如病毒文件)的属性模式进行修改,导致我们无法轻易删除这些文件,同时采用 root 用户也可能无法使用rm命令删除,那么这就会带来巨大的隐患问题。
案例:
假设黑客使用如下命令对文件的属性模式进行了修改。
1 | chattr +ia file.sh |
那么使用如下rm命令是没有权限删除的。即使是 root 用户也无法删除。
1 | rm -rf file.sh |
这种情况就涉及到chattr命令相关的文件属性模式了。
由上文中得知当文件设置 i 和 a 任意一个属性我们就无法对文件进行删除操作,那么只要我们移除掉 i, a 属性,然后执行rm命令删除就可以了。
1 | # 移除 i, a 属性 |
如果文件还未删除成功,则我们需要考虑文件所属的文件夹是否设置了 i 或 a 属性(这一点确实很难发现)
1 | # 退回上一级 |
如果文件夹被设置则对文件夹的属性执行移除操作,然后再删除文件夹里面的文件
¶五、用户管理
¶1. 基本概念
在 Linux 系统中,不论是本机或是远程登录系统,每个系统都必须拥有至少一个用户。用户是 Linux 系统工作中重要的一环,用户管理包括用户与组管理。为了方便用户管理,Linux有组的概念,组的意义在实际应用中,可以预先针对组设置好权限,然后将不同的用户添加到对应的组中,从而不用依次为每一个用户设置权限。
¶2. 超级用户
Linux 系统中的 root
账号通常 用于系统的维护和管理,对操作系统的所有资源 具有所有访问权限,在大多数版本的 Linux 中,都不推荐 直接使用 root 账号登录系统,在 Linux 安装的过程中,系统会自动创建一个用户账号,而这个默认的用户就称为**“标准用户”**。
su
是 substitute user
的缩写,表示 使用另一个用户的身份
sudo
命令用来以其他身份来执行命令,预设的身份为 root
用户使用 sudo
时,必须先输入密码,之后有 5 分钟的有效期限,超过期限则必须重新输入密码
¶3. 用户组维护
1 | #添加组 |
提示:用户组信息保存在
/etc/group
文件中。在实际应用中,可以预先针对组设置好权限,然后将不同的用户添加到对应的组中,从而不用依次为每一个用户设置权限。
¶4. 用户维护
¶4.1 创建用户
1 | #添加新用户 -m: 自动建立用户家目录 -g: 指定用户所在的组,不指定默认创建一个和同名的组 |
注意添加用户命令在redhat类系统和debain类系统之间的区别。
在redhat下useradd与adduser是没有区别的,两个命令等价,在home下自动创建目录,没有设置密码,需要使用passwd命令修改密码。
在debain中,useradd
与adduser
有所不同,useradd 是添加用户底层的命令,而adduser 是上层的命令
(1)
useradd
在使用该命令创建用户是不会在/home
下自动创建与用户名同名的用户主目录的,如果一定使用这个命令也无碍,可以加-m
选项添加用户主目录。另外useradd
默认选择的shell
版本是sh
而不是通常用的bash
(可以在创建用户后使用chsh
命令修改或者修改/etc/passwd
中该用户的shell
版本,选项:-s /bin/bash
指定shell版本为bash
;-g
指定用户组),此外useradd
默认没有设置密码,所以创建的用户是不能登录的,另需要在创建用户后使用passwd
命令修改密码。(2)
adduser
在使用该命令创建用户是会在/home
下自动创建与用户名同名的用户目录,系统shell
版本,会在创建时会提示输入密码,更加友好。
¶4.2 设置密码
1 | #设置用户密码,如果是普通用户,直接用 passwd 可以修改自己的账户密码 |
¶4.3 查看新增的用户信息
1 | #新建用户后,用户信息会保存在 /etc/passwd 文件中 |
提示:
/etc/passwd
是用于保存用户信息的文件;而/usr/bin/passwd
是用于修改用户密码的程序。
/etc/passwd
文件存放的是用户的信息,由 6 个分号组成的 7 个信息,分别是
用户名
密码(x,表示加密的密码)
UID(用户标识)
GID(组标识)
用户全名或本地帐号
家目录
登录使用的 Shell,就是登录之后,使用的终端命令,
ubuntu
默认是dash
¶4.4 删除用户
1 | #删除用户,-r 选项会自动删除用户家目录 |
¶4.5 查看系统用户信息
1 | #查看用户 UID 和 GID 信息,默认当前用户 |
¶4.6 修改用户组和登录的Shell
usermod命令可以用来设置 用户的主组、附加组和登录的Shell,命令格式如下:
1 | # 修改用户的主组,通常在新建用户时指定,在/etc/passwd的第4列GID对应的组 |
提示:设置了用户的附加组之后,需要重新登录才能生效!
¶4.7 普通用户添加sudo组权限
注意:默认使用 useradd
添加的用户是没有权限使用 sudo
以 root
身份执行命令的。对于ubuntu可以使用以下命令快速将用户添加到 sudo
附加组中
1 | usermod -G sudo 用户名 |
这个命令在centos7中不适用
下面是所有linux系统通用的方法,可以使用修改/etc/sudoers
配置文件来实现。
1 | su root |
在root ALL=(ALL) ALL
这一行下面,加入一行: 用户名 ALL=(ALL) ALL
1 | root ALL=(ALL) ALL |
1 | #收回写权限 |
¶4.8 切换用户
序号 | 命令 | 作用 | 说明 |
---|---|---|---|
01 | su - 用户名 | 切换用户,并且切换目录 | - 可以切换到用户家目录,否则保持位置不变 |
02 | exit | 退出当前登录账户 |
su
不接用户名,可以切换到root
,但是不推荐使用,因为不安全exit
示意图如下:
¶5. 系统用户维护
¶5.1 查看最近系统登录信息
1 | lastlog |
案例:
1 | [root@VM_0_6_centos ~]# lastlog |
¶5.2 列出当前和曾经登入系统的用户信息
1 | last |
案例:
1 | [root@VM_0_6_centos ~]# last |
¶5.3 踢出登录用户
1 | #选择登录终端并强制踢出,例如选择踢出使用终端pts/1登录的用户。 |
案例
1 | #先列举当前登录的系统用户 |
¶六、软件管理
¶1. 软件管理简介
¶1.1 包全名与包名
- 包全名:操作的包是没有安装的软件包时,使用包全名。
- 包名:操作已经安装的软件包时使用的包名。linux安装后包名都存在/var/lib/rpm/中的数据库
¶1.2 Linux包依赖性
- 树形依赖:a>b>c
- 环形依赖:a>b>c>a
- 模块依赖:模块依赖
软件安装的过程:
- (1)cp类库到系统目录中
- (2)cp可执行程序和配置文件到系统目录中
- (3)根据需要选择性配置和启动服务(程序)
对于windows系统还会多出一个步骤,那就是到把启动配置或者程序依赖的配置放到注册表中。
¶1.3 linux包命名原则
软件包apache2_2.4.18-2ubuntu3_amd64.deb
apache2 软件包名
2.4.18 软件版本
2 软件发布的次数
ubuntu3 适合的Linux平台
amd64 适合的硬件平台
deb 包扩展名
比如一个文件httpd-2.2.15-15.el6.centos.1.i686.rpm
httpd 软件包名
2.2.15 软件版本
15 软件发布的次数
el6.centos 适合的Linux平台
i686 适合的硬件平台
rpm rpm包扩展名
¶1.4 linux软件包优先级
Required | 该级别软件包是保证系统正常运行所必须的,如果缺失,系统将毁坏 | 系统工具,比如bash,mount… |
---|---|---|
Important | 若缺少该软件包,系统讲运行困难 | 实现系统底层功能的一些程序,比如aptitude,apt-get |
Standard | linux系统的标准件 | 常规安装软件,如telnet.tp |
Optional | 该软件包是否安装不影响linux运行 | 用于用户特定的需求,比如×11,mysql,openofice,自开发软件等 |
Extra | 该级别可能与高级软件包存冲突 |
¶2. Debain系列软件包管理
¶2.1 dpkg本地管理
¶(1)安装
1 | dpkg -i 软件包全名 |
i install
¶(2)卸载
1 | dpkg -r 软件包名 #移除包不移除配置文件 |
1 | dpkg -P 软件包名 #移除包和配置文件 |
-r remove
-P
等价于--purg
移除包和配置文件
¶(3)查询
1 | dpkg -l 软件包名 #列出当前系统中已经安装的包,包括软件的版本,可以使用dpkg -l | grep 关键字来查询 |
¶2.2 APT在线管理
apt-get install
工作步骤
-
扫描本地软件列表(apt-get update 刷新软件包列表)
-
软件包依赖检查
-
从软件包指定的apt源中下载软件包
-
解压软件包并完成配置
apt-get:用于管理安装,卸载,升级等操作
apt-cache:用于查询软件包信息
¶(1) APT软件源
¶ubuntu 默认软件源改为阿里源
1 | ##备份 |
参考:https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.1ecc1b11jbngYS
通过
apt-get update
更新软件源到本地并在本地建立新远程软件库所有软件包对应的索引表(数据库形式),所有存放在/var/lib/apt/lists/*
¶debian 默认软件源改为阿里源
下面以 debian 10.x (buster) 为例配置:
1 | #通过root用户安装sudo |
参考:https://developer.aliyun.com/mirror/debian?spm=a2c6h.13651102.0.0.7fb11b11YdBUCM
¶(2) 安装
1 | #-y 自动回答yes |
apt下载到的软件包(缓存)都放在/var/cache/apt/archives/
,如果不需要可以删除掉
¶(3) 获得包的源码
1 | apt-get source 包名 |
¶(4) 更新
1 | apt-get update #更新软件源到本地 |
¶(5) 卸载
1 | apt-get remove 软件包名 #卸载软件包(不含配置文件) |
¶(6)查询
1 | apt-cache search 软件包关键字 #从source里查询某个软件包 |
¶3. Redhat系列软件管理
¶1)rpm本地管理
¶(1)安装
1 | #-i(install)安装; -v(verbose)显示详细信息; -h(hash)显示进度; -nodeps 不检测依赖性 |
¶(2)升级
1 | #-U(upgrade)升级 |
¶(3)卸载
1 | #-e(erase)卸载; -nodeps 不检查依赖性 |
¶(4)查询是否安装
1 | #-q 查询(query); -a 所有(all) |
¶(5) 查询软件包详细信息
1 | #-q 查询(query); -i 查询软件信息(information); -p 查询未安装包信息(package) |
¶(6)查询包中文件安装位置
1 | #-q 查询(query)-l 列表(list); -p 查询未安装包信息,用来查看未安装的软件包打算安装到哪些目录里 |
如果忘记包名,可以通过rpm -qa | grep 包名
关键字先查看系统中已经安装的相关软件,然后再执行rpm -ql 包名
来查看具体路径
¶(7)查询系统文件属于哪个RPM包
1 | #-f 查询系统文件属于哪个软件包(file) |
¶(8) 查询软件包的依赖性
1 | #-R 查询软件包的依赖性(requires);-p 查询未安装包信息(package) |
¶(9) RPM包校验
1 | #-V校验指定RPM包中的文件(verify) |
验证内容中的8个信息的具体内容如下:
◆S文件大小是否改变
◆M文件的类型或文件的权限(rwx)是否被改变
◆5文件MD5校验和是否改变(可以看成文件内容是否改变)
◆D设备的中,从代码是否改变
◆L文件路径是否改变
◆U文件的属主(所有者)是否改变
◆G文件的属组是否改变
◆T文件的修改时间是否改变
文件类型
◆c配置文件(config file)
◆d普通文档(documentation)
◆g“鬼”文件(ghostfile),很少见,就是该文件不应该被这个RPM包包含
◆l授权文件(license file)
◆r描述文件(read me)
¶(10)RPM包中文件提取
主要用来解决误删除系统文件后修补的方法
1 | #通过rpm2cpio命转换httpd-2.2.15-15.el6.centos.1.i686.rpm为cpio格式后再通过cpio将/usr/sbin/httpd(这是httpd-2.2.15-15.el6.centos.1.i686.rpm要安装到系统中的某个文件)文件提取到当前目录 |
rpm2cpio是将rpm包转换为cpio格式的命令
cpio是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件
提取到当前目录后没有看到文件的话,可以通过
dir
命令来显示
案例:
1 | [root@localhost~]#rpm-qf/bin/ls |
¶2)yum在线管理
yum也是用来管理rpm软件包的管理工具。它能够解决软件安装的依赖问题。如果存在依赖,yum会统一一并安装依赖。
¶(1)yum软件源
centos 默认软件源改为阿里源(以 centos7 为例)
1 | #先确保安装wget用于下载yum源文件 |
参考:https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.534d1b11Q4rbUO
yum源配置说明:
[base] 容器名称,一定要放在[ ]中,从以上文件可以看出centos7默认配置有4个容器,一般是第一个起作用
name 容器说明,可以自己随便写
mirrorlist 镜像站点,这个可以注释掉
baseurl 我们的yum源服务器的地址。默认是CentOS官方的yum源服务器,是可以使用的,如果你觉得慢可以改成你喜欢的yum源地址
enabled 此容器是否生效,如果不写或写成enable=1都是生效,写成enable=0就是不生效
gpgcheck 如果是1是指RPM的数字证书生效,如果是0则不生效
gpgkey 数字证书的公钥文件保存位置。不用修改
安装epel源
1 | yum install epel-release -y && yum clean all && yum makecache |
参考:
https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b11oOAPGq
https://developer.aliyun.com/mirror/epel?spm=a2c6h.13651102.0.0.1d2e1b11NAraP4
¶(2)查询
1 | #查询所有可用软件包列表 |
¶(3)安装
1 | #-y 自动回答yes |
¶(4)更新
1 | #选项:-y 自动回答yes |
若一定要升级,如果软件依赖旧版本的package,
最好
是使用yum update
,确保不会出现兼容问题。
但再正式环境最好不要使用yum更新
,会出现意想不到的问题
yum update出现Multilib version problems问题的解决方法
1 | # 1、安装yum-complete-transaction |
¶(5) 卸载
1 | yum -y remove 包名 |
¶(6)列出所有可用的软件组
1 | yum grouplist |
1 | [root@VM_0_13_centos ~]# yum grouplist |
¶(7)安装指定软件组
组名可以由grouplist查询出来
1 | yum groupinstall 软件组名 |
¶(8) 卸载指定软件组
1 | yum groupremove 软件组名 |
¶4. 源码包安装卸载(待续···)
¶七、进程管理
所谓 进程,通俗地说就是当前正在执行的一个程序。
¶1. 列出当前进程信息
1 | #process status |
提示:ps 默认只会显示当前用户通过终端启动的应用程序。
¶2. 动态列出当前进程信息 top
1 | #top 与 ps 命令很相似。它们都用来显示正在执行的进程。Top 与 ps 最大的不同之处,在于top 在执行一段时间可以更新正在运行的的进程。 |
¶3. 终止进程 kill
1 | #-9表示强行终止 |
提示:使用
kill
命令时,最好只终止由当前用户开启的进程,而不要终止root
身份开启的进程,否则可能导致系统崩溃。
¶4. 查看命令路径 which
1 | which 命令名称 |
在
Linux
中,绝大多数可执行文件都是保存在/bin
、/sbin
、/usr/bin
、/usr/sbin
/bin
(binary
)是二进制执行文件目录,主要用于具体应用/sbin
(system binary
)是系统管理员专用的二进制代码存放目录,主要用于系统管理/usr/bin
(user commands for applications
)后期安装的一些软件/usr/sbin
(super user commands for applications
)超级用户的一些管理程序提示:
cd
这个终端命令是内置在系统内核中的,没有独立的文件,因此用which
无法找到cd
命令的位置
¶5. 查看进程树 pstree
1 | #安装pstree安装包 |
¶6. 系统监控实用工具
¶iftop
iftop可测量通过每一个套接字连接传输的数据。iftop使用pcap库来捕获进出网络适配器的数据包,然后汇总数据包大小和数量,搞清楚总的带宽使用情况。
虽然iftop报告每个连接所使用的带宽,但它无法报告参与某个套按字连接的进程名称/编号(ID)。不过由于基于pcap库,iftop能够过滤流量,并报告由过滤器指定的所选定主机连接的带宽使用情况。
1 | #安装 |
n选项可以防止iftop将IP地址解析成主机名,解析本身就会带来额外的网络流量。
¶nload
nload是一个命令行工具,让用户可以分开来监控入站流量和出站流量。它还可以绘制图表以显示入站流量和出站流量,视图比例可以调整。用起来很简单,不支持许多选项。
1 | #安装 |
¶htop
htop是top的扩展版本,有更丰富的概貌(例如全命令、可视化、图形用户界面gui和用户界面ui),有鼠标点击交互(译者注:看下面的截图,指的是最上面的列标题如CPU%、MEM%等可以通过鼠标点击切换以显示不同的功能),也有许多的指导教你如何做进程管理。
1 | #安装 |
¶iotop
iotop – 简单的类似top的I/O监控器。
iotop是IO实时监控器。使用它们附属的详细输入输出(IO)使用方法可以展示出你系统中每个进程线程的信息。
该命令可以与$ tcpdump(响应网络流量的命令)一起使用。如果你发现你的web服务器上有程序在运行,你可以,比如运行$ tcpdump port 80检查端口80(标准的http端口)的网络流量来观察细节。
最有用的信息可能是DISK WRITE这一列,从该列你可以准确的看到每个IO使用了多少个进程,单位为K/s。
1 | #安装 |
¶glances
glances是一款由python开发的系统监控工具,可以实时查看CPU、内存、网络、IO、进程、磁盘空间使用率的使用情况,并且支持三种运行模式,个人感觉比top命令使用更便捷,有三种运行模式:Standalone、Client/Server、Web server。
¶安装
1 | #CentOS |
¶Standalone模式
可以查看系统运行详细情况。
在运行
glances
时可以使用h
键来查看glances
快捷键使用方法。
运行过程中,直接按回车键可以对进程进行过滤,查看指定进程。
¶Client/Server模式
Server端:glances -s -B 192.168.1.1
Client端:glances -c 192.168.1.1
无须去指定服务器上运行,通过Client/Server端模式快速查看。-B:指定绑定的IP地址,如果不指定Server端运行端口默认端口为:61209,如果使用默认端口则用-c指定客户端时不需要额外使用-P参数来指定Server端的端口号。需要注意的是防火墙设置,确认两台主机之间端口可通。
¶Web server模式
glances -w
这个功能就很贴心了,我可以将集群中所有服务器上后台运行Web Server端,后续防火墙开放指定IP查看集群中服务器的运行状态,美滋滋。
如果启动Web Server端时出现**“Bottle module not found. Glances cannot start in web server mode.”**报错,执行安装bottle即可解决。
1 | pip install bottle |
¶配置文件
glances是支持设置配置文件的,但是不一定要有配置文件才能使用glances,Linux中配置文件可以新建位置到
/etc/glances/glances.conf
,窗口中的不同颜色是由阈值来设定的,我们可以在配置文件中修改各监控项的阈值来实现不同级别不同颜色的展示情况。
¶颜色级别定义
- 绿色:正常(OK)
- 蓝色:小心(CAREFUL),需要注意
- 紫色:警告(WARNING)
- 红色:问题严重(CRITICAL)
¶配置文件示例
1 | vim /etc/glances/glances.conf |
这里我们为了展示出颜色的差异,特别修改了几个为1的值,实际使用中修改到需要的值即可。
最终展示界面如上图所示。
¶八、系统管理
¶1. 关机和重启
1 | # shutdown命令可用于关闭或重启系统(-r表示重启,不指定则表示1分钟后自动关闭系统) |
¶2. 环境变量
¶简要概述
在 Linux 操作系统中设置环境变量,通常使用export
命令来实现。它可以将一个或多个变量从本地 shell (命令行解释器)的环境传递到子进程的环境中,以便让这些子进程也可以使用这些变量。在 Linux 中,每个进程都有一组环境变量。这些变量存储在进程空间中,并且可以在运行时由进程读取和修改。当您启动一个新的 shell 会话或者在当前 shell 会话中运行一个新的脚本时,该会话会继承父 shell 的环境变量。然而,如果您希望将变量传递给子进程,那么您需要将其标记为“导出”。
💁♂ 变量和环境变量的区别:
变量是 Shell 编程中最基本的元素之一。它们是用户定义的名称,用于保存一个或多个值或字符串,并在 Shell 脚本或命令中进行引用。变量的值可以是数字、字符串、文件名、路径名等。
例如,在 Bash shell 中,您可以通过以下语法来定义变量:
1 name="Alice"这将创建一个名为
name
的变量,并将其设置为 “Alice”。环境变量是 Shell 环境中的特殊类型的变量,它们具有全局范围并可以被所有子进程访问。环境变量通常用于存储 Shell 和其他程序所需的共享信息,例如路径、语言设置、用户信息等。
例如,在 Bash shell 中,您可以使用以下语法来设置环境变量:
1 export PATH=$PATH:/usr/local/bin这会将
/usr/local/bin
目录添加到系统的 PATH 环境变量中,以便 Shell 可以搜索该目录中的可执行文件。因此,变量和环境变量具有不同的作用和范围,并且通常用于不同的目的。
在 Linux 中设置环境变量的方法有多种,下面将主要讲其中两种常见的方法。
¶临时设置环境变量
要在当前 shell 会话中设置一个临时环境变量,可以使用 export
命令。例如,要将 MY_VAR
的值设置为 my_value
,可以执行以下命令:
1 | export MY_VAR=my_value |
这将在当前 shell 会话中设置一个名为 MY_VAR
的环境变量,并将其值设置为 my_value
。该变量只在当前会话中有效,关闭终端窗口或重启系统后就会自动清除。
¶永久设置环境变量
要在系统中永久设置一个环境变量,可以将其添加到 ~/.bashrc
、 ~/.bash_profile
、/etc/profile
等脚本文件中,这样系统在某个特定情况下将会自动执行这些脚本以让脚本里设置的环境变量生效。
下面以添加环境变量到~/.bashrc
脚本文件为例讲解配置过程:
1 | #在文件最后加入变量 |
💁♂
/etc/profile
等脚本文件说明:
~/.bashrc
:打开新的 Bash shell 会话时自动执行该脚本。该文件只适用于当前用户的 Bash shell,通常用于设置用户环境变量等配置。~/.bash_profile
:如果系统默认shell是bash,用户登录时将自动执行该脚本。该文件只适用于当前用户的 Bash shell,通常用于设置用户环境变量等配置。/etc/profile
:在系统引导时自动执行该脚本。该文件适用于所有用户和所有 Bash shell,通常用于设置全局环境变量等配置。💁♂ 注意:只要执行
bash
命令就会打开新的 Bash shell 会话。💁♂ 总结:开机启动系统,在系统引导时将自动执行
/etc/profile
脚本文件。等系统启动完成后用户就可以进行登录操作了,如果系统默认shell是bash,那么在用户登录时系统会自动执行bash
命令来打开新的 Bash shell 会话,故而会自动执行~/.bash_profile
和~/.bashrc
脚本文件。但如果系统默认shell是sh、zsh等其他类型的shell,那么登录时将不会自动执行~/.bash_profile
脚本,但当用户手动执行bash
命令时是会自动执行~/.bashrc
脚本文件的。💁♂ 建议:在 Linux 中,虽然
~/.bashrc
、~/.bash_profile
、/etc/profile
等脚本文件都能配置环境变量,但通常使用的话建议将环境变量配置到~/.bashrc
文件中。
¶3. 服务管理
¶1. 服务相关概念
服务(service) 是一种开机自启动的后台运行程序,也称为守护进程(运行中的程序就叫进程)。通常会在系统启动时自动运行,并一直保持运行状态,以便用户和其他程序可以随时使用。常见的服务程序有 sshd、mysqld、httpd 等。
💁♂ 程序的运行模式:
计算机程序的运行模式是指程序在计算机系统中的运行方式和状态。根据程序的运行模式不同,可以分为以下几种:
- 前台模式
前台模式(Foreground Mode)是指程序需要在用户界面上显示输出信息,等待用户输入或响应操作的模式。这些程序运行时会占用当前终端或图形界面的屏幕空间,并且随着用户的注销或关闭终端而结束。例如,文本编辑器、Web 浏览器、音乐播放器等都是前台模式下运行的程序。
- 后台模式
后台模式(Background Mode)是指程序不需要在用户界面上显示输出信息,它们会在系统后台默默地执行任务,不会占用当前终端或图形界面的屏幕空间,并且在用户注销或关闭终端时仍然可以继续运行。例如,服务程序、守护进程、定时任务等都是后台模式下运行的程序。
- 守护进程模式
守护进程模式(Daemon Mode),也称为服务模式(Service Mode),是一种特殊的后台模式,在系统启动时自动启动并一直保持运行状态,以提供某种特定的服务或功能。守护进程通常会监听某个网络端口或 Unix 套接字,等待客户端连接并处理请求。例如,Web 服务器、数据库服务器、邮件服务器等都是守护进程模式下运行的程序。
- 嵌入式模式
嵌入式模式(Embedded Mode)是指程序被嵌入到其他程序或系统中执行,以完成特定的任务或提供服务。嵌入式模式下运行的程序通常具有轻量化、高效性和实时性等特点,例如,操作系统内核、驱动程序、嵌入式应用程序等都是嵌入式模式下运行的程序。
总之,计算机程序的运行模式与程序本身的功能、特点和用途密切相关。不同的运行模式可以满足不同的需求和场景,理解这些运行模式对于程序设计、开发和管理都有重要作用。
💁♂ 关于服务程序的补充说明:
应用程序是否为服务程序,取决于其在系统中的运行模式是否是守护进程模式。也就是说只需设置为守护进程模式的应用程序才是服务程序。有些应用程序在安装时会自动设置为守护进程模式以实现开机程序自启动,并监听某些端口以供用户请求处理。例如通过包管理器默认安装方式安装sshd时(sshd属于openssh-server软件包的组件),会自动设置为守护进程模式以实现开机程序自启动,并监听默认的22端口以供用户通过ssh远程登录。
¶2. 启动框架相关概念
启动框架(Boot framework)是计算机操作系统启动时用于管理和控制服务、程序和进程的一组工具和机制。简单的说:启动框架就是一组服务管理工具。它能够帮助用户在系统启动过程中加载和启动必要的服务和程序,并确保这些服务和程序能够以正确的顺序和方式运行。启动框架包含有一些管理工具用于实现:查看服务运行状态、查看服务自启动状态、启动服务、关闭服务、开启服务自启动(即所谓的设置开机自启动)、关闭服务自启动 等功能。
在 Linux 操作系统中,启动框架通常被称为引导框架(boot loader),其作用类似于 Windows 系统中的 BOOTMGR 或 NTLDR。启动框架通常会在操作系统内核初始化之后自动启动,并负责加载和管理其他服务和程序。它们还会根据预定义的运行级别或用户自定义的配置来控制有哪些服务、程序和进程需要在系统启动时自动运行。
常见的启动框架包括:SysVinit、Upstart、Systemd 和 OpenRC 等。
- SysVinit:SysVinit 是一种较早的 Linux 启动框架,它使用
/etc/init.d/
目录下的脚本文件来控制系统服务的启动和停止。在 SysVinit 中,服务的运行状态与系统运行级别(runlevel)直接关联,用户可以使用service
和chkconfig
等命令来管理服务。- Upstart:Upstart 是 Canonical 公司开发的一种 Linux 启动框架,其设计目标是提高启动速度并改善系统事件处理。Upstart 使用基于事件的模型代替了传统的 SysVinit 模型,并支持自动重启、故障恢复和进程监控等功能。
- Systemd:Systemd 是一种由 Lennart Poettering 开发的 Linux 启动框架,已经成为许多主流 Linux 发行版的默认启动框架。与 SysVinit 不同,Systemd 使用单一的
.service
文件来描述服务,并支持依赖关系、并行启动、延迟启动和日志记录等功能。用户可以使用systemctl
命令来管理服务和控制系统状态。- OpenRC:OpenRC 是 Gentoo Linux 发布版使用的一种 Linux 启动框架,也可以在其他 Linux 发行版中使用。OpenRC 使用
/etc/init.d/
目录下的脚本文件来控制服务的启动和停止,并支持并行启动、依赖关系和自定义运行级别等功能。提示:在 CentOS7.0 后 很多应用程序不再使用 SysVinit 而是使用 Systemd 来管理服务。
¶3. SysVinit 服务管理
¶简要概述
SysVinit 是一种较早的 Linux 启动框架,它使用 /etc/init.d/
目录下的脚本文件来控制系统服务的启动和停止。在 SysVinit 中,服务的运行状态与系统运行级别(runlevel)直接关联,用户可以使用 service
和 chkconfig
等命令来管理服务。
¶Linux系统运行级别的概念
在SysVinit中有Linux系统运行级别的概念,Linux系统运行级别指的是系统启动时所处的运行状态,它决定了哪些服务、进程和资源会被启动或关闭。在 Linux 中,通常使用 SysV 初始化系统来管理运行级别。SysV 初始化系统其提供了 7 个运行级别,如下:
- 运行级别 0:系统停机状态,即关机。
- 运行级别 1:单用户模式,只有 root 用户可以登录终端,通常用于系统修复或恢复。
- 运行级别 2:多用户模式,但不带 NFS 功能。
- 运行级别 3:完全的多用户模式,通常是支持网络连接的服务器模式。
- 运行级别 4:保留,未使用。
- 运行级别 5:完全的多用户图形化模式,通常是桌面应用程序运行的模式。
- 运行级别 6:系统重启,即重新启动操作系统。
在 Linux 中,Linux 系统的默认运行级别通常是 3 或 5,具体取决于 Linux 发行版和系统配置。如果用户需要修改系统启动时默认的运行级别,可对 /etc/inittab
文件中的 initdefault
参数进行配置。
1 | #修改系统启动时默认的运行级别。配置initdefault参数 |
¶常用命令(service 和 chkconfig)
1 | #查看SysVinit管理的服务 |
service
命令详解
service
命令是一种用于管理系统服务的工具。它可以启动、停止、重启以及查询系统服务的状态,作用于/etc/init.d
目录下的服务脚本。是一种用于管理系统服务的工具。它可以启动、停止、重启以及查询系统服务的状态,作用于/etc/init.d
目录下的服务脚本。基本语法如下:
1 >service <service_name> <action>其中,
<service_name>
表示要操作的服务名称,例如httpd
、sshd
等;<action>
表示要执行的操作,例如start
、stop
、restart
、status
等。
chkconfig
命令详解
chkconfig
命令是 Linux 系统中用于管理 SysV 初始化脚本的命令之一。它可以让用户方便地设置某个服务在不同运行级别下的启动状态。基本语法如下:
1 >chkconfig --level <level> <service_name> <on|off>其中,
--level
选项表示要设置的运行级别,例如3
表示完全的多用户模式,不指定--level
选项则默认作用于所有运行级别;<service_name>
表示要操作的服务名称;<on|off>
表示要执行的操作,即将服务设置为启动或停止状态。实现原理:
根据
/etc/init.d
目录的服务脚本创建相应的符号链接(软链接),然后把这个符号链接放到表示不同运行级别的目录里,系统启动时 SysV 根据当前运行级别情况运行对应目录里的服务脚本。常规Linux 发行版会把符号链接会被存放在
/etc/rcN.d
目录里,RHEL 等一些特定的 Linux 发行版会把符号链接会被存放在/etc/rc.d/rcN.d
目录里。其中N表示运行级别。这些链接文件通常以K
或S
字母开头,后面跟着服务名称和数字序列号,例如K01httpd
或S99sshd
。其中,K
表示停止服务,S
表示启动服务,数字序列号表示启动或停止的先后顺序。例如:如果想要在运行级别 3 中启动 Apache 服务,可以将
/etc/init.d/httpd
复制到/etc/rc3.d
目录,并将其重命名为S80httpd
,命令操作如:cp /etc/init.d/httpd /etc/rc3.d/S80httpd
。这样,在系统进入运行级别 3 时,就会自动启动 Apache 服务。💁♂ 注意:
restart
和reload
的区别:restart = stop + start
,而reload = 重新读取配置文件
¶自定义服务
在 SysVinit 启动框架下自定义服务,可以按照以下步骤进行:
-
编写服务脚本(启动脚本)
在
/etc/init.d
目录下创建一个服务脚本文件,文件名为自定义的服务名称。如:/etc/init.d/my_custom_service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# chkconfig: 345 99 10
# description: My Custom Service
case "$1" in
start)
/usr/bin/my_custom_service &
;;
stop)
pkill my_custom_service
;;
restart)
$0 stop
sleep 5
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0其中,
chkconfig: 345 99 10
指定了运行级别和启动顺序。345 表示服务将在运行级别 3、4 和 5 中启动;99 表示启动顺序(数字越小越先启动);10 表示停止顺序(数字越大越后停止)。 -
启用服务
使用
chkconfig
命令将服务添加到系统启动项,并将其设置为开机自动启动。1
2
3chmod +x /etc/init.d/my_custom_service
chkconfig --add my_custom_service
chkconfig my_custom_service on -
启动服务
使用
service
命令启动服务。1
service my_custom_service start
¶4. Systemd 服务管理
¶简要概述
Systemd 是一种由 Lennart Poettering 开发的 Linux 启动框架,已经成为许多主流 Linux 发行版的默认启动框架。与 SysVinit 不同,Systemd 使用单一的 .service
文件来描述服务,并支持依赖关系、并行启动、延迟启动和日志记录等功能。用户可以使用 systemctl
命令来管理服务和控制系统状态。
¶常用命令(systemctl)
1 | #查看Systemd管理的服务(Systemd会从以下目录中加载Systemd单元文件,如果存在同名文件,Systemd将使用较高优先级路径里的单元文件配置) |
💁♂ 说明:
systemctl
命令自带有服务自启动管理功能,可直接使用该命令来维护服务的自启动状态。💁♂ 关于
/lib/systemd/system
目录和/usr/lib/systemd/system
目录默认文件相同的说明:在 Linux 操作系统中,
/usr/lib
目录和/lib
目录都是用于存储共享库文件的目录。事实上,/usr/lib
目录中的大部分内容都可以在/lib
目录中找到相应的文件。这是因为,早期版本的 Linux 发行版将所有的用户空间程序和库文件都安装在/usr
目录中,而/lib
目录只包含内核和驱动程序所需的库文件。随着 Linux 发行版的不断发展和演变,为了提高兼容性和可移植性,一些 Linux 发行版开始将某些库文件安装在/lib
目录中,以避免某些应用程序无法正常工作。但是,出于向后兼容的考虑,又不能将所有的库文件都直接移到/lib
目录下。这就导致了/usr/lib
和/lib
目录中的内容存在大量重复的情况。总之,在现代 Linux 系统中,/usr/lib
目录中的大部分内容都可以在/lib
目录中找到相应的文件。这是由于历史原因和兼容性考虑所导致的,用户不需要过多关注这个问题,只需要根据需要使用相应的库文件即可。
¶自定义服务
在 Systemd 中管理自定义服务的步骤如下:
-
编写服务文件
创建一个描述服务的配置文件,并将其保存到
/etc/systemd/system
目录中,文件名以.service
结尾。如:my_custom_service.service
1
2
3
4
5
6
7
8
9
10[Unit]
Description=My Custom Service
After=network.target
[Service]
ExecStart=/usr/bin/my_custom_service
Restart=always
[Install]
WantedBy=multi-user.target[Unit]
中包含了服务的描述信息和依赖关系。[Service]
中指定了服务的执行命令和重启策略等。[Install]
中指定了服务应该安装在哪个系统目标中。 -
重新加载 Systemd 配置
使用
systemctl
命令重新加载 Systemd 配置,使之生效。1
sudo systemctl daemon-reload
-
启用开机自启动
使用
systemctl
命令将服务添加到开机自启动项,并设置为开机自动启动。1
sudo systemctl enable my_custom_service.service
-
启动服务
使用
systemctl
命令启动服务。1
sudo systemctl start my_custom_service.service
至此,自定义服务已经成功地添加到 Linux 系统中,并且可以通过
systemctl
命令来管理它。
需要注意的是,在编写服务文件时,要遵循规范,确保服务能够正确地启动、停止和重启。在使用 Systemd 进行服务管理时,还可以使用其他一些命令来管理服务,例如
systemctl stop
、systemctl restart
、systemctl status
和journalctl
等。
¶九、网络管理
¶1. ifconfig
ifconfig
可以查看当前的网卡配置信息
1 | # 查看网卡配置信息 |
提示:一台计算机中有可能会有一个 物理网卡 和 多个虚拟网卡,在 Linux 中物理网卡的名字通常以
ensXX
表示
网卡是一个专门负责网络通讯的硬件设备。IP 地址是设置在网卡上的地址信息。每台联网的电脑上都有 P 地址,是保证电脑之间正常通讯的重要设置。
我们可以把 电脑 比作 电话,网卡 相当于 SIM 卡,IP 地址 相当于 电话号码
注意:每台电脑的 IP 地址不能相同,否则会出现 IP 地址冲突,并且没有办法正常通讯
127.0.0.1
被称为 本地回环/环回地址,一般用来测试本机网卡是否正常
¶2. ping
ping
一般用于检测当前计算机到目标计算机之间的网络 是否通畅,time数值越大,速度越慢
1 | # 检测到目标主机是否连接正常 |
ping
的工作原理与潜水艇的声纳相似,ping
这个命令就是取自 声纳的声音网络管理员之间也常将
ping
用作动词 —— ping 一下计算机X,看他是否开着
原理:网络上的机器都有 唯一确定的 IP 地址,我们给目标 IP 地址发送一个数据包,对方就要返回一个数据包,根据返回的数据包以及时间,我们可以确定目标主机的存在
提示:在 Linux 中,想要终止一个终端程序的执行,绝大多数都可以使用
CTRL + C
¶3. 设置主机名
1 | #查看主机名 |
¶4. 设置hosts映射
1 | #编辑/etc/hosts然后配置ip和对应域名即可 |
¶5. 配置ip
以vmware centos7最小安装为例,假设已经设置自动配置网络ip的情况下,系统的ip是由物理主机动态分配ip的,有可能这个ip会发生变化。如果希望配置固定的ip的话可以通过下面的方式解决:
(1)配置物理主机的VMnet8网卡
(2)然后需要修改vmware虚拟网络配置
记住这个网关ip,后面用到。
(3)设置vmware对centos系统虚拟机系统设置的网络连接方式为NAT连接。
(3)进入centos虚拟机终端,编辑centos网卡配置文件,该配置文件名称就是"ifcfg-"+“网卡的名称”,对于不同系统网卡的名称可能不一样,可以通过ifconfig
命令来查看网卡名称,比如下面的显示出来的网卡名称是eno16777736,那么网卡配置文件是ifcfg-eno16777736。
1 | [root@localhost ~]# ifconfig |
然后编辑网卡配置文件
1 | vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 |
修改为以下:
1 | HWADDR="00:0C:29:34:1D:18" |
💡 提示:网卡配置文件里的变量可能不同系统的也不同。但是以上修改的部分是必须的。
📚 主要变量说明:
- HWADDR:表示mac地址
- TYPE:网络类型
- BOOTPROTO:表示为网卡配置静态还是动态IP地址(none:表示无须启动协议;bootp:表示使用BOOTP协议;dhcp :使用dhcp协议动态获取ip地址; static:表示手工设置静态IP地址)
- ONBOOT:表示启动系统时是否激活网卡,yes为激活,no不激活(如果默认为no需要改成yes)
- HWADDR:表示网卡的MAC地址
- GATEWAY:表示该网关地址。填虚拟虚拟机网卡VMnet8对应的网关ip。
- NETMASK:表示子网掩码。填填和VMnet8对于的子网掩码
- IPADDR:表示网卡的固定IP地址。比如上面的网关是192.168.60.2并且子网掩码是255.255.255.0,那么表示固定ip的值需要是192.168.60.x(这个x是除了网关外3~254的任意数填,其中0表示网络,255一般用来做掩码,而1和2已经被VMnet8使用,所以0、1、2和255不用)
- DNS1:表示第一个DNS服务器的地址。值可以是任意能使用的dns ip地址(用于解析域名)。这里使用google通过的dns ip
8.8.8.8
即可
(4)重启网络就OK了
1 | service network restart |
1、执行后如果报如下错误:
Restarting network (via systemctl): Job for network.service failed because the control process exited with error code. See “systemctl status network.service” and “journalctl -xe” for details.💁♂ 出现上面错误的大概率是mac地址和vmware配置的不一致。如下一定要一致:
¶6. 防火墙设置
¶1)简要概述
Linux 中常见的防火墙软件有 IPtables、UFW、FirewallD,通过这些工具可以对网络流量进行管理和控制,保障系统的安全性和稳定性。
注意:IPtables、UFW、FirewallD 这三种防火墙软件并不是独立的,而是存在联系和依赖关系。FirewallD 和 UFW 都是基于 IPtables 的前端工具,可以帮助用户更方便地配置和管理 iptables 规则。同时,IPtables 仍然是 Linux 系统中默认的防火墙软件之一,为其他防火墙软件提供了底层支持和功能。用户可以根据实际需求和环境选择合适的防火墙软件,并进行适当的配置和管理,以确保系统的安全性和高可用性。
¶2)IPtables 防火墙
IPtables 是 Linux 发行版中内置的基于 Netfilter 内核模块的防火墙软件,可用于控制和过滤网络流量。
在 iptables 中,有四个主要的表(table)和五个预定义的链(chain),分别是:
- filter 表:这是默认情况下使用的表,用于进行最常见的防火墙操作,例如过滤数据包、禁止或允许特定端口或 IP 地址等。它包含了三个主要的链:INPUT、OUTPUT 和 FORWARD 链。
- nat 表:这个表用于进行网络地址转换(NAT)操作,例如将私有 IP 地址映射到公共 IP 地址、修改源或目标 IP 地址等。它包含了三个主要的链:PREROUTING、POSTROUTING 和 OUTPUT 链。
- mangle 表:这个表用于修改数据包的头部信息,例如修改 TTL 值、标记数据包、更改 QoS 信息等。它包含了五个主要的链:PREROUTING、OUTPUT、INPUT、FORWARD 和 POSTROUTING 链。
- raw 表:这个表用于处理数据包之前的连接追踪(connection tracking)操作,例如禁止或允许特定协议、配置 ICMP 参数等。它包含了两个主要的链:PREROUTING 和 OUTPUT 链。
其中,五个预定义的链是:
- INPUT 链:这个链用于处理传入到本机的网络流量。
- OUTPUT 链:这个链用于处理从本机发出的网络流量。
- FORWARD 链:这个链用于处理通过本机进行转发的流量。
- PREROUTING 链:这个链用于处理在流量到达网络接口之前的 NAT 规则。
- POSTROUTING 链:这个链用于处理在流量离开网络接口之后的 NAT 规则。
提示:一些较旧的 Linux 操作系统,例如 CentOS 6、Red Hat Enterprise Linux (RHEL) 6、Ubuntu 14.04 LTS 等,默认只安装并支持 iptables 防火墙软件。
¶(1)开放指定端口
1 | sudo iptables -t filter -A INPUT -p tcp --dport <port> -j ACCEPT |
该命令会添加一个允许传入 TCP 流量到指定端口的 iptables 规则。
-A <chain>
:表示 “Append”,指将规则添加到指定链的末尾。-I <chain> [num]
表示 “Insert”,指将规则添加到指定链的开头或指定位置。num 表示链的编号位置,如果不指定则为链的开头。(如:iptables -I INPUT 2
表示在INPUT
规则链的第二个位置插入一条规则)-p <prot>
:表示匹配协议类型,可选:tcp
、udp
、icmp
、all
等,其中all
是默认值,表示匹配所有协议。--dport <port>
:表示匹配的目标端口。-j <target>
表示指定在匹配到规则后要执行的操作,target 值可选如下:ACCEPT
:允许通过匹配到的连接(如果匹配成功,则接受该流量)。REJECT
:拒绝通过匹配到的连接,并向发送端返回一个错误消息。LOG
:记录与匹配到的连接相关的信息到系统日志中。DNAT
:将网络连接的目标地址和/或端口号重定向到另一个 IP 地址或端口上。SNAT
:将网络连接的源地址和/或端口号修改为另一个 IP 地址或端口上。
¶(2)删除指定端口规则
1 | sudo iptables -t filter -D INPUT -p tcp --dport <port> -j ACCEPT |
该命令会删除指定端口的 iptables 规则。其中
-D
表示从链中删除规则。
¶(3)修改指定端口规则
1 | sudo iptables -t filter -R INPUT <rule number> -p tcp --dport <port> -j DROP |
该命令会用新规则替换指定编号的旧规则,并拒绝传入 TCP 流量到指定端口。其中
-R
表示替换指定规则编号的规则。
¶(4)查询所有的端口规则
1 | #列出filter表的所有链的所有规则 |
参数说明:
-n
:选项来禁用 DNS 反向解析和服务名转换。-L [chain]
:列出指定链的所有规则,不指定链则默认为所有链。--line-numbers
:在每个规则前面显示其对应的规则编号。该命令可以列出当前 iptables 的所有规则,包括链(chain)、策略(policy)和规则(rule)等信息。
¶3)UFW 防火墙
UFW 是 Debian 系列 Linux 系统中 IPtables 防火墙的前端工具。旨在简化 iptables 的配置。
¶(1)查看ufw服务状态
1 | sudo systemctl status ufw |
¶(2)查看ufw的状态
1 | #该命令可以看到ufw的状态(inactive是关闭,active是开启),ufw开启时还会列出当前配置的策略。 |
注意:新安装 Ubuntu 系统,UFW 防火墙默认是不开启的。
¶(3)开启、重启、关闭、ufw服务
1 | # 启用服务(开机启动) |
¶(4)查看防火墙规则
1 | sudo ufw status |
¶(5)开放、阻止、删除规则
1 | ## 开放规则 |
💁♂ 说明:
一旦启用UFW之后,如果没有允许SSH连接,将无法再通过SSH远程访问主机,所以在开启防火墙之后要确认SSH连接已经设置为允许:
sudo ufw allow ssh
这里创建一条规则,允许ssh连接,其实是允许22端口的连接,等价于:
sudo ufw allow 22
📖 参考:
¶4)FirewallD 防火墙
FirewallD 是 Red Hat系列 Linux 系统中 IPtables 防火墙的前端工具。旨在简化 iptables 的配置。
¶(1)查看firewall服务状态
1 | systemctl status firewalld |
¶(2)查看firewall的状态
1 | firewall-cmd --state |
¶(3)开启、重启、关闭、firewalld.service服务
1 | # 开启服务 |
¶(4)查看防火墙规则
1 | firewall-cmd --list-all |
¶(5)查询、开放、关闭端口
1 | # 查询端口是否开放 |
参数解释:
--permanent
:表示设置为持久--add-port
:标识添加的端口
¶7. 网络监控netstat
般用于检验本机各端口的网络连接情况
1 | netstat #命令用于显示各种网络相关信息,如网络连接, 路由表, 接口状态等等 |
¶8. nc 网络工具
1 | ##检查服务器端口是否通 |
¶9. traceroute路由追踪
现实世界中的网络是由无数的计算机和路由器组成的一张的大网,应用的数据包在发送到服务器之前都要经过层层的路由转发。而Traceroute是一种常规的网络分析工具,用来定位到目标主机之间的所有路由器
1 | #-U 使用UDP协议(默认)发送数据包测试路由追踪(因为大部分的应用服务器都不提供UDP服务(或者被防火墙挡掉),所以会拿不到服务器的任何返回,所以不建议使用UDP测试) |
Windows系统中也有路由追踪工具,那就是tracert
,tracert
采用的是icmp协议实现的,故不需要指定消息的协议。
1 | #-h 指定最大ttl,默认30,即最大跳数 |
参考:
《ICMP协议 详解,ICMP协议的功能及实现原理,ICMP协议报文类型》
¶十、远程操作
¶1. 远程操作网络基础
域名:由一串“”用点分隔“”的名字组成,例如:www.baidu.com
;是IP 地址的别名,方便用户记忆。
IP地址:IP 地址是网络中计算机的唯一网络标识。
端口号:是某台计算机上运行的应用程序的唯一网络标识。常见服务端口号列表:
序号 | 服务 | 端口号 |
---|---|---|
01 | SSH 服务器 | 22 |
02 | Web 服务器 | 80 |
03 | HTTPS | 443 |
04 | FTP 服务器 | 21 |
windows系统可以打开cmd输入以下命令检测网络互连的其他主机的端口号是否放行。
1 | telnet ip 端口 |
提示:有关 端口号的详细内容,待续补充······
ssh协议: SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。特点:利用SSH协议可以有效防止远程管理过程中的信息泄露;通过SSH 协议可以对所有传输的数据进行加密,也能够防止 DNS 欺骗和 IP 欺骗;此外它还具有一个优点,就是是传输的数据可以是经过压缩的,所以可以加快传输的速度。
要搭建ssh环境,需要分别安装服务端和客户端程序。SSH服务端是安装在服务器中提供ssh协议远程操控的服务软件。只有ssh服务端运行了才能通过ssh客户端连接服务器。
¶2. 远程登录
¶2.1 ssh服务端安装
1 | #Debian系列系统安装ssh服务 |
¶2.2 ssh客户端使用
SSH 客户端是一种使用SSH协议连接到远程计算机的软件程序,通过SSH 客户端我们可以连接到运行了 SSH 服务器的远程机器上。
1 | #默认系统已经安装,如果没有可通过命令来安装 |
(1) Linux下SSH 客户端的简单使用
1 | ##ssh远程连接服务器 |
注意:如果在 Windows
系统中,可以安装 PuTTY
或者 XShell
客户端软件即可。
提示:使用
exit
退出当前用户的登录
(2) Windows 下 SSH 客户端的安装
-
Putty
http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html -
XShell
http://xshellcn.com建议从官方网站下载正式的安装程序
¶2.3 ssh免密码登录
实现方式:使用公钥认证进行登录。
原理:使用非对称加密原理进行登录认证。首先由ssh客户端生成密钥对,然后用户将公钥添加到服务端的某认证配置文件里。当用户登陆时,会通过私钥对请求数据进行签名,并将已经签名的数据发送给ssh服务端,ssh服务端会去认证配置文件拿到公钥并进行验签,如果验签成功则允许登入,否则拒绝。由于私钥只有保存在用户自己的客户端中,因此入侵者就算得到用户公钥,也不能登陆到服务器。
非对称加密算法:
使用 公钥 加密的数据,只能使用 私钥 解密
使用 私钥 加密的数据,只能使用 公钥 解密
实现步骤
①SSH客户端生成密钥对
1 | # 生成密钥对,一路回车即可。会在~/.ssh下生成一个私钥文件(id_rsa)和一个公钥文件(id_rsa.pub) |
终端会提示一些问题:
第一个问题是设置私钥和公钥的文件名,如果不设置默认是
id_rsa
和id_rsa.pub
第二个问题是要不要对私钥设置口令(passphrase),如果担心私钥的安全,可以设置一个。
②上传公钥到服务器
方式1:直接copy客户端的~/.ssh/id_rsa.pub
内容直接追加到服务端的~/.ssh/authorized_keys
里。
方式2:SSH客户端执行以下命令上传 到服务端:
1 | #执行完命令即可上传客户端公钥到指定的服务器的~/.ssh/authorized_keys里(其实就是追加了id_rsa.pub的内容) |
执行完以上操作后,远程服务器即可认证客户端,客户端也有了ssh免密登录的权限。
示意图:
¶3.4 配置ssh服务别名
客户端每次都输入 ssh -p port user@remote
,时间久了会觉得很麻烦,特别是当 user
, remote
和 port
都得输入,而且还不好记忆。
而给客户端配置别名可以解决这个问题,譬如用:ssh myserver
来替代上面这么一长串。要实现这个功能需要在客户端的 ~/.ssh/config
(没有这个文件则手动创建)里面追加以下内容:
1 | Host myserver |
例如:
1 | Host myserver |
保存之后,即可用 以下命令实现快速远程登录了
1 | $ ssh myserver |
注意:ssh客户端会把你每次登陆过的计算机的公钥(public key)都记录在~/.ssh/known_hosts
中。当下次登陆相同计算机时,ssh服务端会核对公钥。如果公钥不同,ssh服务端会发出警告给客户端。
一台客户端连接多个Linux系统,会经常切换,但客户端使用同一个ip,客户端登录过一次后就会把ssh信息记录在客户端本地的~/.ssh/known_hsots
文件中,客户端切换其他系统后再用ssh访问原来登陆的系统就会出现冲突警告。
解决办法: 客户端直接把~/.ssh/known_hosts
文件删除即可。
¶3. 远程文件传输
通过使用ssh客户端可以登录控制服务器了,但是想要在客户端和服务器之间进行文件传输还得需要其他的传输工具。有的是基于ssh协议的,有的基于ftp协议的,还有的是基于sftp协议等的,各有千秋。下面介绍三种工具:即SCP、FileZilla、Xftp 。
¶3.1 scp
scp 就是 secure copy
,是基于ssh
登陆进行安全的远程文件拷贝命令。只要服务器安装有ssh服务软件,客户端安装有ssh客户端软件,并建立起了连接,则可以直接使用。它的地址格式与 ssh 基本相同,需要注意的是,在指定端口时用的是大写的 -P
而不是小写的。
1 | # 把本地当前目录下的 01.py 文件 复制到 远程 家目录下的 Desktop/01.py |
选项 | 含义 |
---|---|
-r | 若给出的源文件是目录文件,则 scp 将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名 |
-P | 若远程 SSH 服务器的端口不是 22,需要使用大写字母 -P 选项指定端口 |
注意:
scp
这个终端命令只能在Linux
或者UNIX
系统下使用如果在
Windows
系统中,可以安装PuTTY
,使用pscp
命令行工具或者安装FileZilla
使用FTP
进行文件传输
¶3.2 FileZilla
官方网站:https://www.filezilla.cn/download/client
FileZilla
在传输文件时,使用的是 FTP 服务
而不是 SSH 服务
,因此端口号应该设置为 21
。使用FTP服务的时候,我们都知道默认是21号端口,其实还有一个20号端口。FTP使用两个TCP连接,21号端口负责控制连接,20号端口负责数据连接。
¶3.3 Xftp
官方网站:https://www.netsarang.com/products/xfp_overview.html
Xftp除了使用FTP服务还使用了SFTP服务,通过使用SFTP协议连接服务器传输文件会更安全。SFTP是SSH的一部分,在SSH软件包中,已经包含了一个SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作。由于这种传输方式使用了加密/解密技术,文件传送相对来说是很安全的,但是是有代价的,它的传输效率比FTP要低得多。
¶3.4 lrzsz
基于命令操作的上传下载的工具 lrzsz
,目前主流的SSH连接工具 ( SecureCRT、XShell 等 ) 都支持这些协议。
1 | #服务器安装 |
¶十一、磁盘管理
¶相关基础命令
1 | #显示磁盘分区使用情况 -h:使用人类可读的格式 -T:显示磁盘分区文件系统类型 |
1 | [root@localhost ~]# lsblk |
¶标准分区管理
当添加了一块新磁盘后,系统是不能直接使用的,需要对磁盘进行创建分区、格式化分区、挂载分区三个步骤后才能正常使用。
¶1、创建分区
1 | #可通过如下命令查看新加的磁盘其所在linux系统中的名称,假设为/dev/sdb |
创建分区示例
1 | [root@localhost ~]# fdisk /dev/sdb |
默认使用DOS(即MBR)作为磁盘分区方案,如果需要使用GPT,那么需要在输入“n”创建分区之前先输入“g”指定为GPT分区方案,如需改回MBR方案,只需创建分区之前先输入“o”指定为MBR分区方案。
MBR只能支持最多4个主分区或3个主分区和1个扩展分区。每个主分区最多可以有一个逻辑分区,而一个扩展分区可以创建多个逻辑分区。它使用了一个512字节的扇区来存储分区表信息,由于分区表大小的限制所以只能支持到最多4个主分区。
GPT能够支持更多的分区(理论无限)。GPT没有主分区和扩展分区的概念,所有分区都是相等的,可以理解为所有的分区都是主分区。它使用64个扇区(32KB)来存储分区信息,相比之下,MBR分区表只有512字节。这使得GPT分区表能够存储更多的分区信息。
¶2、格式化分区
1 | #格式化分区 |
¶3、挂载分区
挂载即将一个分区与一个目录进行关联,使操作该目录文件即操作对应的磁盘分区。
1 | #先创建需要挂载的目录 |
注意:如果需挂载的目录在挂载前存在文件,那么挂载后这些文件将会"消失",但卸载后这些文件就又会显现,原因是挂载前文件是存在于原来的磁盘分区上的,如果同一目录挂载了新的磁盘分区,那么该目录显示的是新磁盘分区的内容,而新分区并没有这些文件所以文件会"消失"。当卸载后,挂载目录又会回到原磁盘分区上,自然就会把原本的文件显现出来。
¶4、卸载及删除分区
1 | ##卸载 |
¶参考:
https://www.cnblogs.com/zishengY/p/7137671.html
https://www.iplayio.cn/post/80157
¶LVM分区管理
¶1. 相关概念
标准分区是指将磁盘分割成若干个区域,每个区域被称为分区。每个分区都被视为一个独立的逻辑单元,并且可以格式化为不同的文件系统类型。标准分区方案的优点是简单、直观,易于管理和维护。但是,如果需要调整分区大小或添加新的分区,则需要重新分区,并且可能需要重装操作系统,这会导致数据丢失和系统停机时间较长等问题。
LVM是一种更加灵活的磁盘分区方案,它允许将多个物理磁盘或分区设置为物理卷(PV), 然后将它们组合成一个或多个逻辑卷组(VG),然后将逻辑卷组划分为一个或多个逻辑卷(LV)。逻辑卷是一个虚拟的磁盘分区,它可以动态地调整大小和移动,而不需要重新分区或重装操作系统。此外,LVM还支持在线扩容和快照等高级特性。
与标准分区相比,LVM的优点在于它提供了更高的灵活性和可扩展性,可以动态地分配和管理存储空间,避免了重新分区和重装操作系统的繁琐过程。但是,LVM也存在一些缺点,比如它可能会降低磁盘性能,增加系统复杂度和学习成本等。因此,在选择分区方案时,需要根据实际需求和环境来进行权衡和选择。
说明:
物理卷逻辑上可划分为多个大小相同的物理拓展PE,PE是LVM中的最小分配单元,每个 PE 的大小通常为 4MB,可以在创建pv的时候指定其大小,如创建一个PE大小为8MB的物理卷/dev/sdb1:
pvcreate -s 8M /dev/sdb1
LV大小为PE的整数倍,组成LV的PE可能来自不同的物理磁盘。
在LVM中,物理卷(PV)的可用大小可能小于其底层设备的大小,其中一些原因包括:
- LVM会在物理卷上保留一部分空间作为元数据区域,用于存储逻辑卷组(VG)和逻辑卷(LV)的元数据信息。这些元数据占用了一定的空间,从而减少了物理卷的可用空间。
- 物理卷使用的文件系统可能也会在设备上分配一些空间,例如ext4文件系统会在物理卷上保留一部分空间用于存储文件系统元数据和碎片信息。这些空间也会使得物理卷的可用空间减少。
- 如果物理卷上还有其他分区或文件系统,则它们也会占用一些空间,从而减少了物理卷的可用空间。
因此,当创建物理卷时,应该考虑到这些因素,并为物理卷预留足够的空间以供元数据和其他用途使用。
¶2. 查看
1 | #查看物理卷 |
¶3. 创建pv、vg、lv
1 | #创建pv物理卷(设备路径可以是磁盘设备路径(/dev/sdb)或者分区设备路径(/dev/sdb1)) |
¶4. 格式化和挂载lv
1 | #格式化lv(lv完整路径可以通过命令lvdisplay查看) |
¶5. 卸载lv
1 | #(如果有开机自动挂载配置还需要删除/etc/fstab文件对应的挂载配置) |
¶6. 删除lv、vg、pv
1 | #删lv(注意:删除lv前要先将其卸载) |
¶7. 扩容
扩容lv的时如果vg容量不够,需要添加pv并加到vg中然后再给lv扩容,否则不需要这个步骤。
1 | #添加新的pv |
1 | #扩容lv(扩展量可以用计量单位,比如3G,通过+表示扩展多少,而如果不用+则表示扩展到多少) |
以上只是对lv进行扩容,但文件系统是无法识别的,故需要调整文件系统容量
1 | #调整文件系统容量(将文件系统扩展到逻辑卷的整个大小) |
¶8. 缩容
1 | #首先进行卸载 |
¶参考:
https://www.cnblogs.com/linuxprobe/p/5381538.html
¶十二、时间管理
¶1. 查看时间
1 | #查看当前系统时间 |
¶2. 修改时间
1 | #修改时分秒 |
¶3.设置时区
1 | #显示系统的所有时区 |
¶4. 时间同步
¶4.1 单机版
1 | #安装ntpdate |
¶4.2 集群版
方案:集群中,要求有一台能访问外网的服务器作为时间服务器,其余内网服务器通过这台时间服务器来实现时间同步。有两种常用的服务工具实现:ntp和chrony
注意:这里ntp和chrony相比于ntpdate的区别在于,ntpdate只能手动单次同步时间(除非编写cronp配置),其同步时间的速度是很快的。而ntp和chrony本身就可以自己定时同步时间,其同步时间的速度可能需要几分钟以上。
全球相关ntp时间服务器:https://www.ntppool.org/zh/
¶4.2.1 ntp
(1)安装和环境准备
1 | #安装ntp |
(2)修改ntp参数配置文件
🙆♂对于ntpd,发现这里不做配置也可以自动同步硬件时间。
1 | vim /etc/sysconfig/ntpd |
修改或者追加如下配置
1 | #同步时间后,写到硬件中 |
(3)修改ntp配置文件
1 | #修改ntp配置文件(只做以下相关配置修改,其余保持不变) |
服务端配置
1 | #允许192.168.60.0网段内所有机器从本机同步时间 |
客户端配置
1 | #从node1中同步时间 |
(4)启动和测试
1 | #ntpd进程进行同步时,可能需要5-10分钟的时间才能同步,另外ntpd开启后,则无法使用ntpdate,所以可以提前先手动同步 |
¶4.2.2 chrony
(1)安装和环境准备
1 | #安装chrony |
(2)修改chrony配置文件
1 | #修改配置文件(只做以下相关配置修改,其余保持不变) |
服务端配置
假设服务端ip为192.168.60.101
1 | #外网ntp时间服务器地址 |
客户端配置
1 | # 删除其它server,并添加如下server |
(3)启动和测试
1 | #启动服务 |
¶十三、shell编程
¶1. sed命令工具
-
偏向场景是以流处理的方式编辑文档
-
处理方式:以行处理
sed是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。
¶1.1 格式
1 | sed [选项] '[ 匹配地址 [!] 动作]' 文件名 |
!
表示对匹配地址的行不执行动作匹配地址可以是:
(1)模式匹配地址,即正则表达式
(2)行数范围,写数字
常用选项
-n
: 一般sed命令会把所有
数据都输出到屏幕 ,如果加入此选择,则只会把经过sed命令处理的行
输出到屏幕。
-e
: 允许对输入数据应用多条sed命令编辑
-i
: 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出(即会修改源数据)
动作(作用于行)
a \
: 追加,在当前行后添加一行或多行。添加多行时,除最后 一行
外,每行末尾需要用“\”代表数据未完结。
c \
: 行替换,用c后面的字符串替换原数据行,替换多行时,除最
后一行外,每行末尾需用“\”代表数据未完结。
i \
: 插入,在当期行前插入一行或多行。插入多行时,除最后 一行
外,每行末尾需要用“\”代表数据未完结。
d
: 删除,删除指定的行。
p
: 打印,输出指定的行。
s
:字串替换,用一个字符串替换另外一个字符串。格式为“行范。(作用于行中的字符串)
围s/
旧字串/新字串/g”
(和vim中的替换格式类似)
¶1.2 在第二行后追加一行内容
1 | $ sed -i '2a s003,\tlisi,\tjava,\t100,\tok,' student.txt #不加-i则会输出到屏幕(即不修改原文件的内容),加了-i则会输出会原文件以覆盖原内容 |
¶1.2 在第二行前追加两行内容
1 | $ sed '2i \ |
\
表示输入未结束
¶1.3 打印行
1 | $ sed -n '2 p' student.txt #只打印第二行,-n防止打印第二行后还会打印所有行 #此处的2是行数匹配地址 |
¶1.4 删除行
删除第二行到第三行(不改变源文件的数据,只输出删除后剩余的结果)
1 | $ sed '2,3d' student.txt |
删除第一行并修改文本源数据(将输出结果覆盖作用的文件内容)
1 | $ sed -i '1d' student.txt |
¶1.5 字符串替换
sed ' 匹配地址 s/旧字串/新字串/g' 文件名
此处匹配地址如果是正则匹配地址,那么一定要加/ /
以表示正则模式
把第二行的wen
改成xuan
¶2. awk 命令工具
-
偏向场景是以流处理的格式化报表输出
-
处理方式:以行处理
¶2.1 格式
1 | awk '条件1{动作1} 条件2{动作2} …' 文件名 |
条件(Pattern):
一般使用关系表达式作为条件
x > 10 判断变量 x是否大于10
x>=10 大于等于
x<=10 小于等于
动作(Action):
格式化输出
流程控制语句如果没有指定条件,每行都执行相应的动作
所有的动作或者命令都要用{}括起来
测试文件:student.txt:
1 | s001, wen, java, 90, ok, |
¶2.1.1 输出第一列和第二列
1 | $ awk '{print $1$2}' student.txt |
¶2.2 BEGIN
BEGIN是在所有的数据读取之前的命令语句,以是否执行成功为条件结果,满足BEGIN才执行{}里的内容
¶2.2.1 测试BEGIN
1 | $ awk 'BEGIN{print "hello"} {print $1 "\t" $2}' student.txt |
¶2.3 FS
内置对象
作用:给awk命令设置识别的分隔符
1 | $ awk '{FS=","} {print $1 "\t" $2}' student.txt |
awk默认是先读入一行数据才开始处理后面的动作,故在指定分隔符后,从第二行开始才生效,而第一行无效。
处理:
¶2.3.1 测试FS
使用BEGIN,让awk读取第一行数据前就先指定分隔符。
1 | $ awk 'BEGIN{FS=","} {print $1 "\t" $2}' student.txt |
¶2.4 END
作用:在所有数据都读取并执行完所有动作之后再执行某个动作,以是否成功为条件结果。
¶2.4.1 测试END
1 | $ awk '{print $1$2}END{print "ending over !"}' student.txt |
¶十四、vi和vim
vi和vim的三种模式:
1 | 正常模式:以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用『复制、粘贴』来处理你的文件数据。 |
各种模式的相互切换如图:
常用操作如下:
1 | 1) 拷贝行:拷贝当前行: yy ; 拷贝当前行向下的 5 行 5yy,并粘贴(输入 p)。 |
更多命令操作见下图:
参考:https://www.runoob.com/linux/linux-vim.html
¶十五、Linux安装
¶自定义磁盘分区
在安装Linux时,以下分区是必须要创建的:
- 根分区(/):这是Linux系统的根目录,包含操作系统的所有文件和目录。
- 交换分区(swap):用于虚拟内存,当物理内存不足时,系统将部分数据移至交换分区中(通常建议将交换分区大小设置为物理内存的两倍)。
如果使用UEFI启动,则还需要创建一个EFI系统分区(ESP),它包含引导加载程序、内核文件和其他支持文件。但是,如果使用传统的BIOS引导模式,则不需要创建ESP分区。
需要注意的是,在某些情况下,可能会出现不需要 ESP 分区也可以使用 UEFI 启动的情况。例如,某些 UEFI 固件可能支持直接从磁盘中的某个分区启动操作系统,而无需使用 ESP 分区。此外,一些特定的发行版或安装程序可能提供了与 ESP 分区无关的替代方案,以便在没有 ESP 分区的情况下实现 UEFI 启动
请注意,以上仅适用于基本的Linux安装。而为了数据的安全,通常会创建以下几个分区
-
根分区(/)
-
交换分区(swap)
-
/home 分区:用于存储用户数据和配置文件。
-
/boot分区:通常用于存储启动引导程序、内核映像以及相关的配置文件等。需要足够的空间来存储未来更新的内核文件。
-
EFI系统分区(ESP):如果使用UEFI启动,则需要一个ESP分区,它包含引导加载程序、内核文件和其他支持文件,在l安装inux后会自动挂载到系统的
/boot/efi
目录。在某些情况下,还可能需要创建其他分区,如/var、/tmp 或 /usr 分区等。但这取决于具体的需求和Linux发行版的要求。
**分区容量分配示例:**对于一个100GB容量的磁盘,建议将其分区和配置如下:
- 根分区(/):将根分区设置为40-50GB。这足以安装Linux系统、常用应用程序和一些基本的开发工具。
- 交换分区(swap):将交换分区设置为2-4GB。这里推荐使用物理内存大小的两倍作为交换分区大小的基准。
- /home 分区:将/home分区设置为30-50GB。这将为用户数据和配置文件提供足够的存储空间。
- /boot分区:设置1GB(建议至少分配200MB以上),要确保足够存储未来的内核更新文件。
- EFI系统分区(ESP):如果您使用UEFI引导,则需要创建一个ESP分区。通常,这个分区只需要为100-500MB即可。
- 其他分区:如果您需要存储大量的数据、音频或视频文件,可以创建一个单独的数据分区。该分区的大小应根据您的特定需求来确定。
¶十六、常见问题解决
¶1. linux更新被锁的解决方法
1 | #问题如下: |
¶2. 解决使用ls
命令目录无法高亮显示的问题
1 | sudo cat >> ~/.bashrc << 'EOF' |