linux学习笔记

这个笔记比较全面的记录了本人学习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
2
3
4
#显示command命令的帮助信息
command --help
#--help可简写为-h
command -h

2.2 man

1
2
#查阅command命令的使用手册
man command

manmanual 的缩写,是 Linux 提供的一个 手册,包含了绝大部分的命令、函数的详细使用说明

使用 man 时的操作键:

操作键 功能
空格键 显示手册页的下一屏
Enter 键 一次滚动手册页的一行
b 回滚一屏
f 前滚一屏
q 退出
/word 搜索 word 字符串

💡 提示:

初级阶段只需要 知道 通过以下两种方式可以查询命令的帮助信息

先学习常用命令常用选项的使用即可,工作中如果遇到问题可以借助 网络搜索

二、基础命令

由于Linux命令实在太多,下面先介绍最最常用的通用基本操作命令。后面章节会扩展性地讲述其他命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#查看当前文件夹下的内容,list
ls

#查看当前所在文件夹,print wrok directory
pwd

#切换文件夹,change directory
cd [目录名]

#如果文件不存在,新建文件,touch
touch [文件名]

#创建目录,make directory
mkdir [目录名]

#删除指定的文件名,remove
rm [文件名]

#清屏,clear
clear

三、命令操作技巧

在使用终端命令的过程中,使用一些操作技巧可以辅助我们更有效率地完成工作。

1. 放大终端窗口的字体显示

ctrl + shift + =

2. 缩小终端窗口的字体显示

ctrl + -

3. 自动补全

在敲出 文件目录命令 的前几个字母之后,按下 tab 键。如果输入的没有歧义,系统会自动补全,如果还存在其他 文件目录命令,再按一下 tab键,系统会提示可能存在的命令。

4. 终端历史命令切换

光标键可以在曾经使用过的命令之间来回切换

5. 退出执行中的命令

如果想要退出选择,并且不想执行当前选中的命令,可以按 ctrl + c

四、文件管理

1. 文件系统

Windows 文件系统

  • Windows 下,打开 “计算机”,我们看到的是一个个的驱动器盘符:

001_Windows下的多个盘

  • 每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形,如图所示:

001-Windows下多个盘为节点的目录分支

Linux文件系统

Linux目录结构
  • Linux 下,我们是看不到这些驱动器盘符,我们看到的是文件夹(目录):

002_Ubuntu文件目录

  • Ubuntu 没有盘符这个概念,只有一个根目录 /,所有子目录和文件都在它下面

003-Linux的树形示意图

Linux主要目录介绍
  • /:根目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始,当在终端里输入 /home,其实是在告诉电脑,先从 /(根目录)开始,再进入到 home 目录。

  • /bin/usr/bin:可执行二进制文件的目录,如常用的命令lstarmvcat等。

  • /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:放置系统管理员使用的可执行命令,如 fdiskshutdownmount等。与/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
2
3
4
5
6
#列出目录文件
ls

#树状形式列出目录文件
#选择-d:只显示目录
tree

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
2
3
4
5
6
7
8
9
10
#切换到/usr/local/share目录里
cd /usr/local/share
#切换到当前用户的主目录(/home/用户目录)
cd ~ #或:cd
#保持在当前目录不变
cd .
#切换到上级目录
cd ..
#在最近两次工作目录之间来回切换
cd -
  • cd 是英文单词 change directory 的简写,其功能为更改当前的工作目录,也是用户最常用的命令之一。
  • 注意:Linux 所有的 目录文件名 都是大小写敏感的。
  • 关于相对路径和绝对路径的说明:
  • 相对路径 在输入路径时,最前面不是 / 或者**~**,表示相对 当前目录 所在的目录位置
  • 绝对路径 在输入路径时,最前面是 /或者~,表示从 根目录/家目录 开始的具体目录位置

3)创建和删除操作(touch、mkdir、rm)

1
2
3
4
5
6
7
8
9
10
11
#创建文件
touch filename.txt

#创建目录
mkdir test-dir

#删除文件或目录
#-f:强制删除,忽略不存在的文件,无需提示
#-r:递归地删除目录下的内容,删除文件夹时必须加此选项
rm -f filename.txt #强制删除filename.txt文件
rm -rf test-dir #强制删除目录以及其内容

4)拷贝和移动文件(cp、mv)

1
2
3
4
5
6
7
8
9
##复制文件或者目录
#-i:覆盖文件前提示
#-r:若给出的源文件是目录文件,则 cp 将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名
cp 源文件 目标文件

##移动文件或者目录 或 重命名
# mv命令(mv英文:move)可以用来移动文件或目录,也可以给文件或目录重命名
#-i:覆盖文件前提示
mv 源文件 目标文件

5)查看文件内容(cat、more 、grep、tail)

(1)cat 查看文件的所有内容

cat (concatenate)命令可以用来 查看文件内容创建文件文件合并追加文件内容 等功能。

cat 会一次显示所有的内容,适合 查看内容较少 的文本文件。

1
2
#查看hello.txt文件的所有内容
cat hello.txt

常用选项:

  • -b:覆对非空输出行编号
  • -n:对输出的所有行编号

Linux 中还有一个 nl 的命令和 cat -b 的效果等价

(2)more 分屏显示文件内容

more 命令可以用于分屏显示文件内容,每次只显示一页内容

适合于 查看内容较多的文本文件

1
2
#分屏显示hello.txt文件内容
more hello.txt

使用 more 的操作键:

操作键 功能
空格键 显示手册页的下一屏
Enter 键 一次滚动手册页的一行
b 回滚一屏
f 前滚一屏
q 退出
/word 搜索 word 字符串
(3)grep 搜索文本文件内容

Linux 系统中 grep 命令是一种强大的文本搜索工具。

grep允许对文本文件进行 模式查找,所谓模式查找,又被称为正则表达式。

1
2
#显示匹配包含qcmoke字符串的行及行号
grep -n qcmoke hello.txt

命令选项:

  • -n:显示匹配行及行号
  • -v:显示不包含匹配文本的所有行(相当于求反)
  • -i:忽略大小写

常用的两种模式查找:

  • ^a: 行首,搜寻以 a 开头的行
  • ke$:行尾,搜寻以 ke 结束的行
(4)tail 取出文件后面几行
1
2
3
4
5
6
7
8
#取出文件后面10行
tail hello.txt

# 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
tail -n 20 /etc/nginx/nginx.conf

#侦测文件尾部10行
tail -n 10 -f ~/logs/web2019-10-10.log

命令选项:

  • -n:后面接数字,代表显示几行的意思
  • -f:侦测文件尾部,要等到按下[ctrl]-c才会结束tail的侦测即,如果文件尾部内容被更改,也会随着显示最新尾部内容,常用于查看日志。

6)查找文件( find )

find 命令功能非常强大,通常用来在 特定的目录下 搜索 符合条件的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#搜索主目录下,文件名包含hello的文件
find ~ -name "hello*"

#搜索/etc目录下,所有以.conf为扩展名的文件
find /etc -name "*.conf"

#搜索/home目录下,以数字1开头的文件
find /home ~ -name "1*"

#-type f: 只查找普通文件;-not -name 排除文件名包含 “test” 字符串的文件
find /path/to/dir -type f -name "*.txt" -not -name "*test*"

#使用 -not -path 参数排除不符合条件的目录
find . -name "node_modules" -not -path "./test/*"

说明:

  • -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
2
3
4
5
6
7
8
#查看目录及其子目录的大小
du -h /opt

#查看目录及其子目录和文件的大小
du -ah /opt

#查看目录的总大小
du -sh /opt

说明:

  • -s:只显示总大小,不显示每个文件的大小。
  • -h:以人类可读的方式显示文件大小,例如:1K、4.5M、2G 等。
  • -b:以字节为单位显示文件大小。
  • -c:同时显示多个文件或目录的总大小。
  • -a:列出所有文件和目录的大小,而不仅仅是目录。
  • -x:不递归处理指定目录下的子目录。

8)链接( ln )

简要概述

001_文件软硬链接示意图

软链接
1
2
3
#创建文件的软链接,用通俗的方式讲类似于Windows下的快捷方式。
#删除软链接不会影响源文件,但源文件被删除了,那么软连接就不可用了
ln -s 被链接的源文件 链接文件
  • 软链接的特点:

(1)软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式

(2)软链接可以 跨文件系统 ,硬链接不可以

(3)软链接可以对一个不存在的文件名进行链接

(4)软链接可以对目录进行链接

  • 注意:

(1)没有 -s 选项建立的是一个 硬链接文件(对于硬链接文件,两个文件占用相同大小的硬盘空间,工作中几乎不会建立文件的硬链接)

(2)被链接的源文件要使用绝对路径,不能使用相对路径,这样可以方便移动链接文件后,仍然能够正常使用

硬链接
1
2
#删除硬链接,不会影响源文件,同样的删除源文件也不会影响硬链接,只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放
ln 被链接的源文件 链接文件
  • 硬链接的特点:

(1)硬链接,以文件副本的形式存在。但不占用实际空间。

(2)不允许给目录创建硬链接

(3)硬链接只有在同一个文件系统中才能创建

  • 说明:

在 Linux 中,文件名文件的数据 是分开存储的

在 Linux 中,只有文件的 硬链接数 == 0 才会被删除

使用 ls -l 可以查看一个文件的硬链接的数量

在日常工作中,几乎不会建立文件的硬链接,知道即可

9)打包 和 解包( tar )

tar 是 Linux 中最常用的 备份工具,此命令可以 把一系列文件 打包到 一个大文件中,也可以把一个 打包的大文件恢复成一系列文件

1
2
3
4
5
# 打包文件(不压缩)
tar -cvf 打包文件.tar 被打包的文件/路径...

# 解包文件
tar -xvf 打包文件.tar

选项说明

  • 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
2
3
4
5
root@ubuntu:/tmp# ls -l file1.*
-rw-r--r-- 1 root root 12383865 Aug 21 08:08 file1.txt
root@ubuntu:/tmp# gzip file1.txt
root@ubuntu:/tmp# ls -l file1.*
-rw-r--r-- 1 root root 134416 Aug 21 08:08 file1.txt.gz

示例2,解压文件

1
2
3
root@ubuntu:/tmp# gzip -d file1.txt.gz
root@ubuntu:/tmp# ls -lh file1.*
-rw-r--r-- 1 root root 12M Aug 21 08:08 file1.txt

示例3,压缩的时候,显示压缩率

1
2
root@ubuntu:/tmp# gzip -v file1.txt
file1.txt: 98.9% -- replaced with file1.txt.gz

示例4,一条命令压缩多个文件,压缩之后,是各自分开的:

1
2
3
4
5
root@ubuntu:/tmp# gzip file1.txt file2.txt
root@ubuntu:/tmp# ls -l
total 1348
-rw-r--r-- 1 root root 134416 Aug 21 08:08 file1.txt.gz
-rw-r--r-- 1 root root 392 Aug 21 08:15 file2.txt.gz

示例5,压缩过程中,保留原文件

1
2
3
root@ubuntu:/tmp# gzip -k file1.txt
root@ubuntu:/tmp# ls file1.*
file1.txt file1.txt.gz

示例6,压缩到标准输出中
可以连接两个文件

1
2
3
root@ubuntu:/tmp# cat file1.txt file2.txt | gzip > foo.gz
或者
root@ubuntu:/tmp# gzip -c file1.txt file2.txt > foo.gz
(2)gunzip

解压gz格式文件(不保留压缩文件)

1
2
3
4
5
[root@localhost test]# ls
test1.txt.gz test2.txt.gz
[root@localhost test]# gunzip test1.txt.gz test2.txt.gz
[root@localhost test]# ls
test1.txt test2.txt
(3)tar 和 gzip

命令结合可以使用实现文件打包和压缩

  • tar 只负责打包文件,但不压缩
  • gzip 压缩 tar 包后,其扩展名一般用 xxx.tar.gz

Linux 中,最常见的压缩文件格式就是 xxx.tar.gz

  • tar 命令中有一个选项 -z 可以调用 gzip,从而可以方便的实现压缩和解压缩的功能
  • 命令格式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#压缩文件
gzip test1.txt test2.txt #会生成 test1.txt.gz test2.txt.gz

#压缩tar包
gzip 打包文件名.tar #从tar包变成tar.gz压缩包,这个过程不会保留原来放入tar包

# 打包并压缩文件
tar -zcvf 打包文件名.tar.gz 被压缩的文件/路径... #自动先完成将各个文件打包生成xxx.tar,后压缩生成xxx.tar.gz

# 解压缩并解包
tar -zxvf 打包文件名.tar.gz #自动先完成将xxx.tar.gz解压缩生成xxx.tar,后完成解包生成各个文件

# 解压缩并解包到指定路径
tar -zxvf 打包文件名.tar.gz -C 目标路径
选项 含义
-C 解压缩到指定目录,注意:要解压缩的目录必须存在
(4)bzip2
  • tarbzip2 命令结合可以使用实现文件 打包和压缩(用法和 gzip 类似)
    • tar 只负责打包文件,但不压缩,
    • bzip2 压缩 tar 打包后的文件,其扩展名一般用 xxx.tar.bz2
  • tar 命令中有一个选项 -j 可以调用 bzip2,从而可以方便的实现压缩和解压缩的功能
  • 命令格式如下:
1
2
3
4
5
# 压缩文件
tar -jcvf 打包文件.tar.bz2 被压缩的文件/路径...

# 解压缩文件
tar -jxvf 打包文件.tar.bz2
(5)zip 和 unzip

zip压缩文件

案例:压缩 test1.txt test2.txt成test.zip压缩包

1
zip  test.zip  test1.txt test2.txt

zip压缩目录

zip常用选项

-r:递归压缩,即压缩目录

案例:递归压缩test目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# tree test/
test/
├── dir
│   └── test3.txt
├── test1.txt
└── test2.txt

1 directory, 3 files
[root@localhost ~]# zip -r test.zip test/
adding: test/ (stored 0%)
adding: test/test1.txt (stored 0%)
adding: test/test2.txt (stored 0%)
adding: test/dir/ (stored 0%)
adding: test/dir/test3.txt (stored 0%)
[root@localhost ~]# ls
anaconda-ks.cfg soft soft.tar.gz test test.zip
[root@localhost ~]#
  • unzip解压文件

    案例:解压缩test.zip文件

    1
    2
    3
    4
    #默认解压到当前目录
    unzip test.zip
    #解压到指定目录
    unzip test.zip -d path

11)重定向( >>>

Linux 允许将命令执行结果重定向到一个文件,将本应显示在终端上的内容输出或者追加到指定文件中。

1
2
3
4
#覆盖输出内容到文件中
echo "hello" > test.txt
#追加内容到文件中
echo "hello" >> test.txt
  • > 表示输出,会覆盖文件原有的内容
  • >> 表示追加,会将内容追加到已有文件的末尾

12)管道( |

Linux 允许将 一个命令的输出可以通过管道做为另一个命令的输入。使用操作如下:

1
2
ps -ef | grep nginx
more test.txt | grep hello

可以理解现实生活中的管子,管子的一头塞东西进去,另一头取出来,这里 | 的左右分为两端,左端塞东西(写),右端取东西(读)

3. 文件权限管理

在 Linux 系统中,不同的用户对于不同的系统资源拥有不同的使用权限。在 Linux 中,可以指定每一个用户针对不同的文件或者目录的不同权限。文件(目录)的权限包括如下:

序号 权限 英文 缩写 数字代号
01 read r 4
02 write w 2
03 执行 excute x 1

1. 文件的详细信息

1
2
#查看文件夹下文件的详细信息(目录也是一种文件)
ls -l

打印结果从左到右依次是:

  • 权限,第 1 个字符如果是 d 表示目录

  • 硬链接数,通俗地讲,就是有多少种方式,可以访问到当前目录/文件

  • 拥有者,家目录下 文件/目录 的拥有者通常都是当前用户

  • ,在 Linux 中,很多时候,会出现组名和用户名相同的情况,后续会讲

  • 大小

  • 最后修改时间

  • 名称

15418513400061541851399509

002_权限示意图

2. 修改文件权限

1
2
3
4
5
6
7
8
# 修改文件|目录的拥有者
chown 用户名 文件名|目录名

# 递归修改文件|目录的组
chgrp -R 组名 文件名|目录名

# 递归修改文件权限
chmod -R 755 文件名|目录名

chmod 在设置权限时,可以简单地使用三个数字分别对应 拥有者其他 用户的权限

1
2
# 直接修改文件|目录的 读|写|执行 权限,但是不能精确到 拥有者|组|其他
chmod +/-rwx 文件名|目录名

004_文件权限示意图

常见数字组合有(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
2
3
4
# 查看file.sh 文件的属性
lsattr file.sh
# 查看当前目录下所有文件以及文件夹的属性
lsattr

详细说明请参考:

📚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
2
3
4
5
6
7
8
# 为 file.sh 文件增加 i 标识
chattr +i file.sh
# 为 file.sh 文件去除 i 标识
chattr -i file.sh
# 为 file.sh 增加 i, a 两个标识
chattr +ia file.sh
# 为 file.sh 文件移除 i, a 两个标识
chattr -ia file.sh

详细说明请参考:

📚https://baike.baidu.com/item/chattr/9841067?fr=aladdin

📚https://www.runoob.com/linux/linux-comm-chattr.html

文件属性模式相关问题

Linux 文件/文件夹无法删除问题解决方案

服务器黑客攻击后,如果他们对某些文件(例如病毒文件)的属性模式进行修改,导致我们无法轻易删除这些文件,同时采用 root 用户也可能无法使用rm命令删除,那么这就会带来巨大的隐患问题。

案例:

假设黑客使用如下命令对文件的属性模式进行了修改。

1
chattr +ia file.sh

那么使用如下rm命令是没有权限删除的。即使是 root 用户也无法删除。

1
rm -rf file.sh

这种情况就涉及到chattr命令相关的文件属性模式了。

由上文中得知当文件设置 i 和 a 任意一个属性我们就无法对文件进行删除操作,那么只要我们移除掉 i, a 属性,然后执行rm命令删除就可以了。

1
2
3
4
5
6
# 移除 i, a 属性
chattr -ia file.sh
# 查看是否移除成功
lsattr file.sh
# 删除文件
rm -rf file.sh

如果文件还未删除成功,则我们需要考虑文件所属的文件夹是否设置了 i 或 a 属性(这一点确实很难发现)

1
2
3
4
5
# 退回上一级
cd ..
# 直接使用 lsattr 命令,这样可以列出当前文件夹下所有文件和文件夹的属性
# 不要使用 lsattr 文件夹 这样的语法,这样是列出该文件夹下的文件的属性
lsattr

如果文件夹被设置则对文件夹的属性执行移除操作,然后再删除文件夹里面的文件

五、用户管理

1. 基本概念

在 Linux 系统中,不论是本机或是远程登录系统,每个系统都必须拥有至少一个用户。用户是 Linux 系统工作中重要的一环,用户管理包括用户与组管理。为了方便用户管理,Linux有组的概念,组的意义在实际应用中,可以预先针对组设置好权限,然后将不同的用户添加到对应的组中,从而不用依次为每一个用户设置权限。

001_组示意图

2. 超级用户

Linux 系统中的 root 账号通常 用于系统的维护和管理,对操作系统的所有资源 具有所有访问权限,在大多数版本的 Linux 中,都不推荐 直接使用 root 账号登录系统,在 Linux 安装的过程中,系统会自动创建一个用户账号,而这个默认的用户就称为**“标准用户”**。

susubstitute user 的缩写,表示 使用另一个用户的身份

sudo 命令用来以其他身份来执行命令,预设的身份为 root

用户使用 sudo 时,必须先输入密码,之后有 5 分钟的有效期限,超过期限则必须重新输入密码

3. 用户组维护

1
2
3
4
5
6
7
8
9
10
11
#添加组
groupadd 组名

#删除组
groupdel 组名

#查看组信息
cat /etc/group

#递归修改文件/目录的所属组
chgrp -R 组名 文件/目录名

提示:用户组信息保存在 /etc/group 文件中。

在实际应用中,可以预先针对组设置好权限,然后将不同的用户添加到对应的组中,从而不用依次为每一个用户设置权限。

4. 用户维护

4.1 创建用户

1
2
#添加新用户 -m: 自动建立用户家目录   -g: 指定用户所在的组,不指定默认创建一个和同名的组
useradd -m -g 组 新建用户名

注意添加用户命令在redhat类系统和debain类系统之间的区别。

在redhat下useradd与adduser是没有区别的,两个命令等价,在home下自动创建目录,没有设置密码,需要使用passwd命令修改密码。

在debain中,useraddadduser有所不同,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
2
#设置用户密码,如果是普通用户,直接用 passwd 可以修改自己的账户密码
passwd 用户名

4.3 查看新增的用户信息

1
2
#新建用户后,用户信息会保存在 /etc/passwd 文件中
cat /etc/passwd | grep 用户名

提示:/etc/passwd 是用于保存用户信息的文件;而/usr/bin/passwd 是用于修改用户密码的程序。

/etc/passwd 文件存放的是用户的信息,由 6 个分号组成的 7 个信息,分别是

用户名

密码(x,表示加密的密码)

UID(用户标识)

GID(组标识)

用户全名或本地帐号

家目录

登录使用的 Shell,就是登录之后,使用的终端命令,ubuntu 默认是 dash

4.4 删除用户

1
2
#删除用户,-r 选项会自动删除用户家目录
userdel -r 用户名

4.5 查看系统用户信息

1
2
3
4
5
6
7
8
#查看用户 UID 和 GID 信息,默认当前用户
id [用户名]

#查看当前所有登录的用户列表
who

#查看当前登录用户的账户名
whoami

4.6 修改用户组和登录的Shell

usermod命令可以用来设置 用户的主组、附加组和登录的Shell,命令格式如下:

1
2
3
4
5
6
7
8
# 修改用户的主组,通常在新建用户时指定,在/etc/passwd的第4列GID对应的组
usermod -g 组 用户名

# 修改用户的附加组,在/etc/group中最后一列表示该组的用户列表,用于指定用户的附加权限
usermod -G 组 用户名

# 修改用户登录 Shell
usermod -s /bin/bash 用户名

提示:设置了用户的附加组之后,需要重新登录才能生效!

4.7 普通用户添加sudo组权限

注意:默认使用 useradd 添加的用户是没有权限使用 sudoroot 身份执行命令的。对于ubuntu可以使用以下命令快速将用户添加到 sudo 附加组中

1
usermod -G sudo 用户名

这个命令在centos7中不适用

下面是所有linux系统通用的方法,可以使用修改/etc/sudoers配置文件来实现。

1
2
3
4
5
su root

#sudoers文件默认是只读的,可以在修改文件之前先赋予文件写权限(W),修改保存之后再收回写权限
chmod u+w /etc/sudoers
vim /etc/sudoers

root ALL=(ALL) ALL这一行下面,加入一行: 用户名 ALL=(ALL) ALL

1
2
  root    ALL=(ALL)       ALL
+ qcmoke ALL=(ALL) ALL
1
2
#收回写权限
chmod u-w /etc/sudoers

4.8 切换用户

序号 命令 作用 说明
01 su - 用户名 切换用户,并且切换目录 - 可以切换到用户家目录,否则保持位置不变
02 exit 退出当前登录账户
  • su 不接用户名,可以切换到 root,但是不推荐使用,因为不安全
  • exit 示意图如下:

003_su和exit示意图

5. 系统用户维护

5.1 查看最近系统登录信息

1
lastlog

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@VM_0_6_centos ~]# lastlog
Username Port From Latest
root pts/0 163.125.117.95 Fri Feb 28 10:50:44 +0800 2020
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**
sync **Never logged in**
shutdown **Never logged in**
halt **Never logged in**
mail **Never logged in**
operator **Never logged in**
games **Never logged in**
ftp **Never logged in**
nobody **Never logged in**
systemd-network **Never logged in**
dbus **Never logged in**
polkitd **Never logged in**
libstoragemgmt **Never logged in**
rpc **Never logged in**
ntp **Never logged in**
abrt **Never logged in**
sshd **Never logged in**
postfix **Never logged in**
chrony **Never logged in**
tcpdump **Never logged in**
syslog **Never logged in**

5.2 列出当前和曾经登入系统的用户信息

1
last

案例:

1
2
3
4
5
6
7
8
9
10
11
[root@VM_0_6_centos ~]# last
root pts/0 163.125.117.95 Fri Feb 28 10:50 still logged in
root pts/1 163.125.117.95 Fri Feb 28 10:49 - 10:51 (00:01)
root pts/0 163.125.117.95 Fri Feb 28 10:49 - 10:50 (00:00)
root pts/0 163.125.117.95 Fri Feb 28 10:49 - 10:49 (00:00)
root pts/2 163.125.117.95 Fri Feb 28 10:47 - 10:47 (00:00)
root pts/1 163.125.117.159 Fri Feb 28 10:44 - 10:49 (00:04)
root pts/1 163.125.116.76 Fri Feb 28 10:42 - 10:42 (00:00)
root pts/0 27.38.177.218 Fri Feb 28 01:24 - 10:48 (09:24)

wtmp begins Fri Feb 28 01:23:48 2020

5.3 踢出登录用户

1
2
3
4
5
#选择登录终端并强制踢出,例如选择踢出使用终端pts/1登录的用户。
#方法一:
pkill -kill -t pts/1
#方法二:
fuser -k /dev/pts/1

案例

1
2
3
4
5
6
7
#先列举当前登录的系统用户
[root@VM_0_6_centos ~]# who
root pts/0 2020-02-28 10:50 (163.125.117.95)
root pts/1 2020-02-28 10:49 (163.125.117.95)
#选择登录终端并强制踢出,可以给他发送后再踢出
[root@VM_0_6_centos ~]# echo "你被管理员踢出了" > /dev/pts/1 && fuser -k /dev/pts/1
/dev/pts/1: 23381

六、软件管理

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
2
3
4
5
dpkg -l  软件包名 #列出当前系统中已经安装的包,包括软件的版本,可以使用dpkg -l | grep 关键字来查询
dpkg -L 软件包名 #列出已安装的包的内容,或者安装位置
dpkg -c 软件包全名 #列出deb包的内容
dpkg -s 软件包名 #查看系统中软件的详细信息 (包含依赖信息)
dpkg --info 软件包全名 #查看未安装的包的信息(包含依赖信息)

2.2 APT在线管理

apt-get install工作步骤

  • 扫描本地软件列表(apt-get update 刷新软件包列表)

  • 软件包依赖检查

  • 从软件包指定的apt源中下载软件包

  • 解压软件包并完成配置

apt-get:用于管理安装,卸载,升级等操作

apt-cache:用于查询软件包信息

(1) APT软件源
ubuntu 默认软件源改为阿里源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
##备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup

##修改软件源
#替换源(sudo sed -i s/原本软件源域名/新软件源域名/g /etc/apt/sources.list)如需改成阿里源可操作如下:
sudo sed -i s/cn.archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list
sudo sed -i s/cn.mirrors.aliyun.com/mirrors.aliyun.com/g /etc/apt/sources.list
sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list
sudo sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list

##更新源
sudo apt-get update

##查看系统当前软件源信息
cat /etc/apt/sources.list

参考: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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#通过root用户安装sudo
apt-get install sudo

##备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup

##修改软件源
sudo cat > /etc/apt/sources.list << 'EOF'
deb https://mirrors.aliyun.com/debian/ buster main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ buster main non-free contrib
deb https://mirrors.aliyun.com/debian-security buster/updates main
deb-src https://mirrors.aliyun.com/debian-security buster/updates main
deb https://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb https://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
EOF

##更新源
sudo apt-get update

参考:https://developer.aliyun.com/mirror/debian?spm=a2c6h.13651102.0.0.7fb11b11YdBUCM

(2) 安装
1
2
3
4
5
#-y 自动回答yes
apt-get install -y 包名

apt-get -f install #修复依赖关系
apt-get install -d #只下载deb包,不安装

apt下载到的软件包(缓存)都放在/var/cache/apt/archives/,如果不需要可以删除掉

(3) 获得包的源码
1
apt-get source 包名
(4) 更新
1
2
3
apt-get update #更新软件源到本地
apt-get upgrade 软件包名 #升级软件到最新版本
apt-get upgrade #升级系统所有软件到最新版本
(5) 卸载
1
2
apt-get remove 软件包名 #卸载软件包(不含配置文件)
apt-get remove --purge 软件包名 #卸载软件包(含配置文件)
(6)查询
1
2
3
4
5
6
apt-cache search 软件包关键字  #从source里查询某个软件包
apt-cache show 软件包名 #显示软件包信息
apt-cache policy 软件包名 #显示软件包安装状态
apt-get check #检查当前apt的依赖情况
apt-cache depends 软件包名 #查看系统中软件的依赖(正向依赖)
apt-cache rdepends 软件包名 #查看系统中软件的依赖(反向依赖)

3. Redhat系列软件管理

1)rpm本地管理

(1)安装
1
2
#-i(install)安装; -v(verbose)显示详细信息; -h(hash)显示进度; -nodeps 不检测依赖性
rpm -ivh 包全名
(2)升级
1
2
#-U(upgrade)升级
rpm -Uvh 包全名(下载好的版本更高的包)
(3)卸载
1
2
#-e(erase)卸载; -nodeps 不检查依赖性
rpm -e 包名
(4)查询是否安装
1
2
3
#-q 查询(query); -a 所有(all)
rpm -q 包名 #查询已经安装的具体包
rpm -qa #查询所有已经安装的包
(5) 查询软件包详细信息
1
2
3
4
5
6
#-q 查询(query); -i 查询软件信息(information); -p 查询未安装包信息(package)
rpm -qi 包名

#如:
rpm -qi zip #查看系统中已经安装存在的包信息
rpm -qip zip-3.0-23.fc29.x86_64.rpm #查看未安装包信息
(6)查询包中文件安装位置
1
2
3
#-q 查询(query)-l 列表(list); -p 查询未安装包信息,用来查看未安装的软件包打算安装到哪些目录里
rpm -ql 包名 #查询已安装的软件安装到了哪些目录里
rpm -qlp 包名 #查询未安装的软件包打算安装到哪些目录里

如果忘记包名,可以通过rpm -qa | grep 包名关键字先查看系统中已经安装的相关软件,然后再执行rpm -ql 包名来查看具体路径

(7)查询系统文件属于哪个RPM包
1
2
#-f 查询系统文件属于哪个软件包(file)
rpm -qf 系统文件名
(8) 查询软件包的依赖性
1
2
3
#-R 查询软件包的依赖性(requires);-p 查询未安装包信息(package)
rpm -qR 包名 #查询已安装包信息
rpm -qRp 包名 #查询未安装包信息
(9) RPM包校验
1
2
3
4
5
6
7
8
#-V校验指定RPM包中的文件(verify)
rpm -V 已安装的包名

# 例如:修改httpd的配置文件后,查看是否被修改
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf #添加一行
[root@localhost ~]# rpm -V httpd
S.5....T. c /etc/httpd/conf/httpd.conf
[root@localhost ~]#

验证内容中的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
2
#通过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 包全名(如httpd-2.2.15-15.el6.centos.1.i686.rpm) | cpio -idv .文件绝对路径(如: ./usr/sbin/httpd)

rpm2cpio是将rpm包转换为cpio格式的命令

cpio是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件

提取到当前目录后没有看到文件的话,可以通过dir命令来显示

案例:

1
2
3
4
5
6
7
8
9
[root@localhost~]#rpm-qf/bin/ls
#查询s命令属于哪个软件包
[root@localhost~-]#mv/bin/ls/tmp/
并造成s命令误删除假象
[root@localhost~]#rpm2cpio/mnt/cdrom/Packages/coreutils-
8.4-19.el6.i686.rpmIcpio-idv./bin/ls
#提取RPM包中s命令到当前目录的bin/ls下
[root@localhost ~]#cp/root/bin/ls/bin/
#把s命令复制/bin/目录,修复文件丢关

2)yum在线管理

yum也是用来管理rpm软件包的管理工具。它能够解决软件安装的依赖问题。如果存在依赖,yum会统一一并安装依赖。

(1)yum软件源

centos 默认软件源改为阿里源(以 centos7 为例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#先确保安装wget用于下载yum源文件
yum install -y wget
#备份旧的配置文件
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
#下载阿里源的文件
#centos7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#或者 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

#清理缓存
yum clean all
#重新生成缓存
yum makecache

参考: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
2
3
4
5
6
#查询所有可用软件包列表
yum list
#搜索服务器上所有和关键字相关的包
yum search 关键字
#查询某个命令需要需要的安装包
yum provides */命令关键字 #如:yum provides */ifconfig
(3)安装
1
2
#-y 自动回答yes
yum -y install 包名
(4)更新
1
2
3
4
5
6
7
8
9
10
11
12
13
#选项:-y 自动回答yes
#不带包名的update,即`yum -y update`会默认升级所有系统软件,包括系统内核,慎重使用不带包名的update。
yum -y update 包名

#升级所有包,保留旧版包,是否更新系统内核根据/etc/yum.conf配置文件的obsoletes配置而定(默认1表示更新)
yum update
#升级所有包,但不更新NetworkManager、firewalld、kernel内核
yum --exclude=exclude=kernel*,*NetworkManager*,*firewalld* update
#以上是单次更新时排除更新包,如果需要不加参数自动排除的话需要编辑/etc/yum.conf配置文件。在[main]的作用域内里加上这样一句话exclude=kernel* *NetworkManager*

#升级所有包,删除旧版包,更新系统内核
#yum upgrade等价于打开obsoletes配置的yum update。
yum upgrade

若一定要升级,如果软件依赖旧版本的package,最好是使用 yum update,确保不会出现兼容问题。
但再正式环境最好不要使用yum更新,会出现意想不到的问题

yum update出现Multilib version problems问题的解决方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 1、安装yum-complete-transaction
yum install yum-utils
# 2、运行yum-complete-transaction
yum-complete-transaction –cleanup-only
# 3、清除重复的包
package-cleanup --dupes
#清除重复包的老版本:
package-cleanup --cleandupes
# 4、清除损坏的包
package-cleanup --problems
#5、解决依赖冲突:如出现:firewalld-filesystem-0.6.3-13.el7_9.noarch 有已安装冲突 firewalld < ('0', '0.3.13', None): firewalld-0.3.9-7.el7.noarch
# 查询出重复的软件包,会查出来两个包含版本的完整包名
rpm -q 冲突的包名称
# 删除冲突包(一般是旧版本)
rpm -e 包含版本的完整包名

## 以下是示例:
# 查询重复的软件包(假设systemd-libs出现了冲突)
$ rpm -q systemd-libs
systemd-libs-219-30.el7.x86_64
systemd-libs-219-42.el7_4.1.x86_64
# 删除旧版
$ rpm -e systemd-libs-219-30.el7.x86_64
error: Failed dependencies:
systemd-libs = 219-30.el7 is needed by (installed) libgudev1-219-30.el7.x86_64
# 仍然出现依赖问题,继续查询libgudev1的版本信息
$ rpm -q libgudev1
libgudev1-219-30.el7.x86_64
# 发现只有一个版本,升级试一下
$ yum update libgudev1
......
Updated:
libgudev1.x86_64 0:219-42.el7_4.1
Complete!
$ rpm -q libgudev1
libgudev1-219-42.el7_4.1.x86_64
# 升级完成后,删除旧版本的systemd-libs
$ rpm -e systemd-libs-219-30.el7.x86_64
$ rpm -q systemd-libs
(5) 卸载
1
yum  -y  remove  包名
(6)列出所有可用的软件组
1
yum grouplist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@VM_0_13_centos ~]# yum grouplist
Loaded plugins: fastestmirror, langpacks
Repository epel is listed more than once in the configuration
Loading mirror speeds from cached hostfile
Available Environment Groups:
Minimal Install
Compute Node
Infrastructure Server
File and Print Server
Cinnamon Desktop
MATE Desktop
Basic Web Server
Virtualization Host
Server with GUI
GNOME Desktop
KDE Plasma Workspaces
Development and Creative Workstation
Installed Groups:
Development tools
Available Groups:
Backup Client
Base
Cinnamon
Compatibility Libraries
Console internet tools
E-mail server
Educational Software
Electronic Lab
Fedora Packager
Fonts
General Purpose Desktop
Graphical Administration Tools
Graphics Creation Tools
Hardware monitoring utilities
Haskell
Input Methods
Internet Applications
KDE Desktop
Legacy UNIX Compatibility
MATE
Milkymist
Network Infrastructure Server
Networking Tools
Office Suite and Productivity
Performance Tools
Scientific support
Security Tools
Smart card support
System Management
System administration tools
Technical Writing
TurboGears application framework
Web Server
Web Servlet Engine
Xfce
Done
[root@VM_0_13_centos ~]#
(7)安装指定软件组

组名可以由grouplist查询出来

1
2
yum  groupinstall  软件组名
#如:yum groupinstall "Development tools"
(8) 卸载指定软件组
1
yum  groupremove  软件组名

4. 源码包安装卸载(待续···)

七、进程管理

所谓 进程,通俗地说就是当前正在执行的一个程序。

1. 列出当前进程信息

1
2
3
4
5
6
7
8
9
10
11
12
#process status
#-a或者-e:显示终端上的所有进程,包括其他用户的进程;-u:显示进程的详细状态;-x:显示没有控制终端的进程;-f:显示程序间的关系
ps -aux
ps -ef

#根据进程号查看进程的文件路径、启动命令的完整路径等等信息(比如nginx)
ps -ef | grep nginx
ls -l /proc/10383
#有几个主要的文件我们可以关注下:
#cwd:文件所在目录
#exe:执行命令的完整路径
#environ:执行命令时的环境变量

提示:ps 默认只会显示当前用户通过终端启动的应用程序。

2. 动态列出当前进程信息 top

1
2
3
4
5
#top 与 ps 命令很相似。它们都用来显示正在执行的进程。Top 与 ps 最大的不同之处,在于top 在执行一段时间可以更新正在运行的的进程。
#要退出可以直接输入q
top
#每隔10秒自动更新
top -d 10

3. 终止进程 kill

1
2
#-9表示强行终止
kill [-9] 进程代号

提示:使用 kill 命令时,最好只终止由当前用户开启的进程,而不要终止 root 身份开启的进程,否则可能导致系统崩溃。

4. 查看命令路径 which

1
2
3
4
5
which 命令名称

#例如:
$ which useradd
/usr/sbin/useradd

Linux 中,绝大多数可执行文件都是保存在 /bin/sbin/usr/bin/usr/sbin

  • /binbinary)是二进制执行文件目录,主要用于具体应用
  • /sbinsystem binary)是系统管理员专用的二进制代码存放目录,主要用于系统管理
  • /usr/binuser commands for applications)后期安装的一些软件
  • /usr/sbinsuper user commands for applications)超级用户的一些管理程序

提示:cd 这个终端命令是内置在系统内核中的,没有独立的文件,因此用 which 无法找到 cd 命令的位置

5. 查看进程树 pstree

1
2
3
4
5
6
7
#安装pstree安装包
yum -y install psmisc

#-p :显示进程的PID -u :显示进程的所属用户
#树状的形式显示进程和pid
pstree -p
#树状的形式进程和对应操作用户

6. 系统监控实用工具

iftop

iftop可测量通过每一个套接字连接传输的数据。iftop使用pcap库来捕获进出网络适配器的数据包,然后汇总数据包大小和数量,搞清楚总的带宽使用情况。

虽然iftop报告每个连接所使用的带宽,但它无法报告参与某个套按字连接的进程名称/编号(ID)。不过由于基于pcap库,iftop能够过滤流量,并报告由过滤器指定的所选定主机连接的带宽使用情况。

1
2
3
4
#安装
$ yum install iftop -y
#使用
$ sudo iftop -n

n选项可以防止iftop将IP地址解析成主机名,解析本身就会带来额外的网络流量。

nload

nload是一个命令行工具,让用户可以分开来监控入站流量和出站流量。它还可以绘制图表以显示入站流量和出站流量,视图比例可以调整。用起来很简单,不支持许多选项。

1
2
3
4
#安装
$ yum install nload
#使用
$ nload

htop

htop是top的扩展版本,有更丰富的概貌(例如全命令、可视化、图形用户界面gui和用户界面ui),有鼠标点击交互(译者注:看下面的截图,指的是最上面的列标题如CPU%、MEM%等可以通过鼠标点击切换以显示不同的功能),也有许多的指导教你如何做进程管理。

1
2
3
4
#安装
$ yum install htop
#运行
$ htop

iotop

iotop – 简单的类似top的I/O监控器。

iotop是IO实时监控器。使用它们附属的详细输入输出(IO)使用方法可以展示出你系统中每个进程线程的信息。

该命令可以与$ tcpdump(响应网络流量的命令)一起使用。如果你发现你的web服务器上有程序在运行,你可以,比如运行$ tcpdump port 80检查端口80(标准的http端口)的网络流量来观察细节。

最有用的信息可能是DISK WRITE这一列,从该列你可以准确的看到每个IO使用了多少个进程,单位为K/s。

1
2
3
4
#安装
$ yum install iotop
#运行
$ iotop

glances

glances是一款由python开发的系统监控工具,可以实时查看CPU、内存、网络、IO、进程、磁盘空间使用率的使用情况,并且支持三种运行模式,个人感觉比top命令使用更便捷,有三种运行模式:Standalone、Client/Server、Web server。

安装
1
2
3
4
#CentOS
$ yum -y install glances
#Ubuntu
$ apt-get install glances
Standalone模式

img

可以查看系统运行详细情况。

img

在运行glances时可以使用h键来查看glances快捷键使用方法。

img

运行过程中,直接按回车键可以对进程进行过滤,查看指定进程。

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
img

img

这个功能就很贴心了,我可以将集群中所有服务器上后台运行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
2
3
4
5
6
7
8
9
10
11
vim /etc/glances/glances.conf
[quicklook]
cpu_careful=50
cpu_warning=70
cpu_critical=1
mem_careful=50
mem_warning=1
mem_critical=90
swap_careful=1
swap_warning=70
swap_critical=90

这里我们为了展示出颜色的差异,特别修改了几个为1的值,实际使用中修改到需要的值即可。
img

最终展示界面如上图所示。

八、系统管理

1. 关机和重启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# shutdown命令可用于关闭或重启系统(-r表示重启,不指定则表示1分钟后自动关闭系统)
shutdown [-r] [时间]
# 例如:
#不指定-r则表示1分钟后自动关闭系统
shutdown
# 重新启动操作系统,其中 now 表示现在
shutdown -r now
# 立刻关机,其中 now 表示现在
shutdown now
# 系统在今天的 20:25 会关机
shutdown 20:25
# 系统再过十分钟后自动关机
shutdown +10
# 取消之前指定的关机计划
shutdown -c

# reboot命令可用于重启系统
reboot #等效于shutdown -r now

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
2
3
4
5
6
7
8
9
10
#在文件最后加入变量
cat >> ~/.bashrc << 'EOF'
export MY_VAR=my_value
EOF

#使配置文件修改生效
source ~/.bashrc

#测试
echo $MY_VAR

💁‍♂ /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 等。

💁‍♂ 程序的运行模式:

计算机程序的运行模式是指程序在计算机系统中的运行方式和状态。根据程序的运行模式不同,可以分为以下几种:

  1. 前台模式

前台模式(Foreground Mode)是指程序需要在用户界面上显示输出信息,等待用户输入或响应操作的模式。这些程序运行时会占用当前终端或图形界面的屏幕空间,并且随着用户的注销或关闭终端而结束。例如,文本编辑器、Web 浏览器、音乐播放器等都是前台模式下运行的程序。

  1. 后台模式

后台模式(Background Mode)是指程序不需要在用户界面上显示输出信息,它们会在系统后台默默地执行任务,不会占用当前终端或图形界面的屏幕空间,并且在用户注销或关闭终端时仍然可以继续运行。例如,服务程序、守护进程、定时任务等都是后台模式下运行的程序。

  1. 守护进程模式

守护进程模式(Daemon Mode),也称为服务模式(Service Mode),是一种特殊的后台模式,在系统启动时自动启动并一直保持运行状态,以提供某种特定的服务或功能。守护进程通常会监听某个网络端口或 Unix 套接字,等待客户端连接并处理请求。例如,Web 服务器、数据库服务器、邮件服务器等都是守护进程模式下运行的程序。

  1. 嵌入式模式

嵌入式模式(Embedded Mode)是指程序被嵌入到其他程序或系统中执行,以完成特定的任务或提供服务。嵌入式模式下运行的程序通常具有轻量化、高效性和实时性等特点,例如,操作系统内核、驱动程序、嵌入式应用程序等都是嵌入式模式下运行的程序。

总之,计算机程序的运行模式与程序本身的功能、特点和用途密切相关。不同的运行模式可以满足不同的需求和场景,理解这些运行模式对于程序设计、开发和管理都有重要作用。

💁‍♂ 关于服务程序的补充说明:

应用程序是否为服务程序,取决于其在系统中的运行模式是否是守护进程模式。也就是说只需设置为守护进程模式的应用程序才是服务程序。有些应用程序在安装时会自动设置为守护进程模式以实现开机程序自启动,并监听某些端口以供用户请求处理。例如通过包管理器默认安装方式安装sshd时(sshd属于openssh-server软件包的组件),会自动设置为守护进程模式以实现开机程序自启动,并监听默认的22端口以供用户通过ssh远程登录。

2. 启动框架相关概念

启动框架(Boot framework)是计算机操作系统启动时用于管理和控制服务、程序和进程的一组工具和机制。简单的说:启动框架就是一组服务管理工具。它能够帮助用户在系统启动过程中加载和启动必要的服务和程序,并确保这些服务和程序能够以正确的顺序和方式运行。启动框架包含有一些管理工具用于实现:查看服务运行状态、查看服务自启动状态、启动服务、关闭服务、开启服务自启动(即所谓的设置开机自启动)、关闭服务自启动 等功能。

在 Linux 操作系统中,启动框架通常被称为引导框架(boot loader),其作用类似于 Windows 系统中的 BOOTMGR 或 NTLDR。启动框架通常会在操作系统内核初始化之后自动启动,并负责加载和管理其他服务和程序。它们还会根据预定义的运行级别或用户自定义的配置来控制有哪些服务、程序和进程需要在系统启动时自动运行。

常见的启动框架包括:SysVinit、Upstart、Systemd 和 OpenRC 等。

  1. SysVinit:SysVinit 是一种较早的 Linux 启动框架,它使用 /etc/init.d/ 目录下的脚本文件来控制系统服务的启动和停止。在 SysVinit 中,服务的运行状态与系统运行级别(runlevel)直接关联,用户可以使用 servicechkconfig 等命令来管理服务。
  2. Upstart:Upstart 是 Canonical 公司开发的一种 Linux 启动框架,其设计目标是提高启动速度并改善系统事件处理。Upstart 使用基于事件的模型代替了传统的 SysVinit 模型,并支持自动重启、故障恢复和进程监控等功能。
  3. Systemd:Systemd 是一种由 Lennart Poettering 开发的 Linux 启动框架,已经成为许多主流 Linux 发行版的默认启动框架。与 SysVinit 不同,Systemd 使用单一的 .service 文件来描述服务,并支持依赖关系、并行启动、延迟启动和日志记录等功能。用户可以使用 systemctl 命令来管理服务和控制系统状态。
  4. OpenRC:OpenRC 是 Gentoo Linux 发布版使用的一种 Linux 启动框架,也可以在其他 Linux 发行版中使用。OpenRC 使用 /etc/init.d/ 目录下的脚本文件来控制服务的启动和停止,并支持并行启动、依赖关系和自定义运行级别等功能。

提示:在 CentOS7.0 后 很多应用程序不再使用 SysVinit 而是使用 Systemd 来管理服务。

3. SysVinit 服务管理

简要概述

SysVinit 是一种较早的 Linux 启动框架,它使用 /etc/init.d/ 目录下的脚本文件来控制系统服务的启动和停止。在 SysVinit 中,服务的运行状态与系统运行级别(runlevel)直接关联,用户可以使用 servicechkconfig 等命令来管理服务。

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
2
3
4
#修改系统启动时默认的运行级别。配置initdefault参数
vi /etc/inittab
#查看当前系统的运行级别
runlevel
常用命令(service 和 chkconfig)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#查看SysVinit管理的服务
ls -l /etc/init.d

#启动服务
service 服务名 start
#关闭服务
service 服务名 stop
#重启服务
service 服务名 restart
#重载服务配置
service 服务名 reload
#查看服务运行状态
service 服务名 status

#设置服务的自启动状态(可通过--level指定某运行级别下服务的自启动状态,不指定--level选项则默认作用于所有运行级别)
chkconfig --level <level> <service_name> <on|off> #如:chkconfig --level 3 httpd on
#开启服务自启动(即所谓的设置开机自启动)
chkconfig 服务名 on
#关闭服务自启动
chkconfig 服务名 off
  • service命令详解

service 命令是一种用于管理系统服务的工具。它可以启动、停止、重启以及查询系统服务的状态,作用于 /etc/init.d 目录下的服务脚本。是一种用于管理系统服务的工具。它可以启动、停止、重启以及查询系统服务的状态,作用于 /etc/init.d 目录下的服务脚本。

基本语法如下:

1
>service <service_name> <action>

其中,<service_name> 表示要操作的服务名称,例如 httpdsshd 等;<action> 表示要执行的操作,例如 startstoprestartstatus 等。

  • 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表示运行级别。这些链接文件通常以 KS 字母开头,后面跟着服务名称和数字序列号,例如 K01httpdS99sshd。其中,K 表示停止服务,S 表示启动服务,数字序列号表示启动或停止的先后顺序。

例如:如果想要在运行级别 3 中启动 Apache 服务,可以将 /etc/init.d/httpd 复制到 /etc/rc3.d 目录,并将其重命名为 S80httpd,命令操作如:cp /etc/init.d/httpd /etc/rc3.d/S80httpd。这样,在系统进入运行级别 3 时,就会自动启动 Apache 服务。

💁‍♂ 注意:

restartreload的区别:restart = stop + start,而 reload = 重新读取配置文件

自定义服务

在 SysVinit 启动框架下自定义服务,可以按照以下步骤进行:

  1. 编写服务脚本(启动脚本)

    /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
    #!/bin/bash
    # 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 表示停止顺序(数字越大越后停止)。

  2. 启用服务

    使用 chkconfig 命令将服务添加到系统启动项,并将其设置为开机自动启动。

    1
    2
    3
    chmod +x /etc/init.d/my_custom_service
    chkconfig --add my_custom_service
    chkconfig my_custom_service on
  3. 启动服务

    使用 service 命令启动服务。

    1
    service my_custom_service start

4. Systemd 服务管理

简要概述

Systemd 是一种由 Lennart Poettering 开发的 Linux 启动框架,已经成为许多主流 Linux 发行版的默认启动框架。与 SysVinit 不同,Systemd 使用单一的 .service 文件来描述服务,并支持依赖关系、并行启动、延迟启动和日志记录等功能。用户可以使用 systemctl 命令来管理服务和控制系统状态。

常用命令(systemctl)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#查看Systemd管理的服务(Systemd会从以下目录中加载Systemd单元文件,如果存在同名文件,Systemd将使用较高优先级路径里的单元文件配置)
ls /etc/systemd/system #优先级最高(包含用户自定义的单元文)
ls /run/systemd/system #比以上优先级低(包含运行时生成的单元文件)
ls /lib/systemd/system #比以上优先级低(包含Linux系统自带的单元文件和第三方服务安装的单元文件)
ls /usr/lib/systemd/system #比以上优先级低(默认和/lib/systemd/system文件内容一致)

#启动服务
systemctl start 服务名
#关闭服务
systemctl stop 服务名
#重启服务
systemctl restart 服务名
#查看服务运行状态
systemctl status 服务名

#查看所有服务自启动状态
systemctl list-unit-files #systemctl list-unit-files | grep 服务名
#开启服务自启动(即所谓的设置开机自启动)
systemctl enable 服务名
#关闭服务自启动
systemctl disable 服务名
#查询某个服务是否是自启动的
systemctl is-enabled 服务名

#查看服务日志
journalctl -u 服务名

💁‍♂ 说明:

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 中管理自定义服务的步骤如下:

  1. 编写服务文件

    创建一个描述服务的配置文件,并将其保存到 /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] 中指定了服务应该安装在哪个系统目标中。

  2. 重新加载 Systemd 配置

    使用 systemctl 命令重新加载 Systemd 配置,使之生效。

    1
    sudo systemctl daemon-reload
  3. 启用开机自启动

    使用 systemctl 命令将服务添加到开机自启动项,并设置为开机自动启动。

    1
    sudo systemctl enable my_custom_service.service
  4. 启动服务

    使用 systemctl 命令启动服务。

    1
    sudo systemctl start my_custom_service.service

    至此,自定义服务已经成功地添加到 Linux 系统中,并且可以通过 systemctl 命令来管理它。

需要注意的是,在编写服务文件时,要遵循规范,确保服务能够正确地启动、停止和重启。在使用 Systemd 进行服务管理时,还可以使用其他一些命令来管理服务,例如 systemctl stopsystemctl restartsystemctl statusjournalctl 等。

九、网络管理

1. ifconfig

ifconfig 可以查看当前的网卡配置信息

1
2
3
4
5
# 查看网卡配置信息
ifconfig

# 查看网卡对应的 IP 地址
ifconfig | grep inet

提示:一台计算机中有可能会有一个 物理网卡多个虚拟网卡,在 Linux 中物理网卡的名字通常以 ensXX 表示

网卡是一个专门负责网络通讯的硬件设备。IP 地址是设置在网卡上的地址信息。每台联网的电脑上都有 P 地址,是保证电脑之间正常通讯的重要设置。

我们可以把 电脑 比作 电话网卡 相当于 SIM 卡IP 地址 相当于 电话号码

注意:每台电脑的 IP 地址不能相同,否则会出现 IP 地址冲突,并且没有办法正常通讯

127.0.0.1 被称为 本地回环/环回地址,一般用来测试本机网卡是否正常

2. ping

ping 一般用于检测当前计算机到目标计算机之间的网络 是否通畅time数值越大,速度越慢

1
2
3
4
5
6
7
# 检测到目标主机是否连接正常
ping IP地址

# 检测本地网卡工作正常
ping 127.0.0.1
##或者
ping localhost

ping 的工作原理与潜水艇的声纳相似,ping 这个命令就是取自 声纳的声音

网络管理员之间也常将 ping 用作动词 —— ping 一下计算机X,看他是否开着

原理:网络上的机器都有 唯一确定的 IP 地址,我们给目标 IP 地址发送一个数据包,对方就要返回一个数据包,根据返回的数据包以及时间,我们可以确定目标主机的存在

提示:在 Linux 中,想要终止一个终端程序的执行,绝大多数都可以使用 CTRL + C

3. 设置主机名

1
2
3
4
5
#查看主机名
hostname
#设置主机名
echo "主机名称" > /etc/hostname
#如:echo "centos7-test" > /etc/hostname

4. 设置hosts映射

1
2
#编辑/etc/hosts然后配置ip和对应域名即可
vim /etc/hosts

5. 配置ip

以vmware centos7最小安装为例,假设已经设置自动配置网络ip的情况下,系统的ip是由物理主机动态分配ip的,有可能这个ip会发生变化。如果希望配置固定的ip的话可以通过下面的方式解决:

(1)配置物理主机的VMnet8网卡

image-20220504025859144

(2)然后需要修改vmware虚拟网络配置

1548175001833

image-20220504030250858

记住这个网关ip,后面用到。

(3)设置vmware对centos系统虚拟机系统设置的网络连接方式为NAT连接。

image-20200423025556615

(3)进入centos虚拟机终端,编辑centos网卡配置文件,该配置文件名称就是"ifcfg-"+“网卡的名称”,对于不同系统网卡的名称可能不一样,可以通过ifconfig命令来查看网卡名称,比如下面的显示出来的网卡名称是eno16777736,那么网卡配置文件是ifcfg-eno16777736。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.60.112 netmask 255.255.255.0 broadcast 192.168.60.255
inet6 fe80::20c:29ff:fe09:6067 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:09:60:67 txqueuelen 1000 (Ethernet)
RX packets 256 bytes 39985 (39.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 151 bytes 19628 (19.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

然后编辑网卡配置文件

1
vim /etc/sysconfig/network-scripts/ifcfg-eno16777736

修改为以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HWADDR="00:0C:29:34:1D:18"
TYPE="Ethernet"
BOOTPROTO="static"
-BOOTPROTO="dhcp"
+BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eno16777736"
UUID="bb3cca29-96a9-4b9a-b25b-bff97eb805e2"
-ONBOOT="no"
+ONBOOT="yes"
+IPADDR="192.168.60.100"
+GATEWAY="192.168.60.2"
+NETMASK="255.255.255.0"
+DNS1="8.8.8.8"

💡 提示:网卡配置文件里的变量可能不同系统的也不同。但是以上修改的部分是必须的。

📚 主要变量说明:

  • 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 ip8.8.8.8即可

(4)重启网络就OK了

1
2
3
4
service network restart

#如果上面命令重启ip没变,可以尝试重启系统试试
reboot

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配置的不一致。如下一定要一致:

image-20220504023438615

6. 防火墙设置

1)简要概述

Linux 中常见的防火墙软件有 IPtables、UFW、FirewallD,通过这些工具可以对网络流量进行管理和控制,保障系统的安全性和稳定性。

注意:IPtables、UFW、FirewallD 这三种防火墙软件并不是独立的,而是存在联系和依赖关系。FirewallD 和 UFW 都是基于 IPtables 的前端工具,可以帮助用户更方便地配置和管理 iptables 规则。同时,IPtables 仍然是 Linux 系统中默认的防火墙软件之一,为其他防火墙软件提供了底层支持和功能。用户可以根据实际需求和环境选择合适的防火墙软件,并进行适当的配置和管理,以确保系统的安全性和高可用性。

2)IPtables 防火墙

IPtables 是 Linux 发行版中内置的基于 Netfilter 内核模块的防火墙软件,可用于控制和过滤网络流量。

在 iptables 中,有四个主要的表(table)和五个预定义的链(chain),分别是:

  1. filter 表:这是默认情况下使用的表,用于进行最常见的防火墙操作,例如过滤数据包、禁止或允许特定端口或 IP 地址等。它包含了三个主要的链:INPUT、OUTPUT 和 FORWARD 链。
  2. nat 表:这个表用于进行网络地址转换(NAT)操作,例如将私有 IP 地址映射到公共 IP 地址、修改源或目标 IP 地址等。它包含了三个主要的链:PREROUTING、POSTROUTING 和 OUTPUT 链。
  3. mangle 表:这个表用于修改数据包的头部信息,例如修改 TTL 值、标记数据包、更改 QoS 信息等。它包含了五个主要的链:PREROUTING、OUTPUT、INPUT、FORWARD 和 POSTROUTING 链。
  4. raw 表:这个表用于处理数据包之前的连接追踪(connection tracking)操作,例如禁止或允许特定协议、配置 ICMP 参数等。它包含了两个主要的链:PREROUTING 和 OUTPUT 链。

其中,五个预定义的链是:

  1. INPUT 链:这个链用于处理传入到本机的网络流量。
  2. OUTPUT 链:这个链用于处理从本机发出的网络流量。
  3. FORWARD 链:这个链用于处理通过本机进行转发的流量。
  4. PREROUTING 链:这个链用于处理在流量到达网络接口之前的 NAT 规则。
  5. POSTROUTING 链:这个链用于处理在流量离开网络接口之后的 NAT 规则。

提示:一些较旧的 Linux 操作系统,例如 CentOS 6、Red Hat Enterprise Linux (RHEL) 6、Ubuntu 14.04 LTS 等,默认只安装并支持 iptables 防火墙软件。

(1)开放指定端口
1
2
3
sudo iptables -t filter -A INPUT -p tcp --dport <port> -j ACCEPT 
#由于iptables命令默认作用于filter表,故可以省略,所以以上命令同下:
#sudo iptables -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>:表示匹配协议类型,可选:tcpudpicmpall 等,其中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
2
3
4
#列出filter表的所有链的所有规则
sudo iptables -t filter -L -n --line-numbers
#列出filter表中INPUT链的所有规则
sudo iptables -t filter -L INPUT -n --line-numbers

参数说明:

  • -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
2
#该命令可以看到ufw的状态(inactive是关闭,active是开启),ufw开启时还会列出当前配置的策略。
sudo ufw status

注意:新安装 Ubuntu 系统,UFW 防火墙默认是不开启的。

(3)开启、重启、关闭、ufw服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 启用服务(开机启动)
sudo ufw enable
# 开启服务
sudo systemctl start ufw

# 重启服务
sudo systemctl restart ufw
# 重新加载UFW的配置文件(即 /etc/ufw/*.rules)
sudo ufw reload


# 禁用服务(开机禁用)
sudo ufw disable
# 关闭服务
sudo systemctl stop ufw
(4)查看防火墙规则
1
sudo ufw status
(5)开放、阻止、删除规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
## 开放规则
#开放指定端口号(如果不带有TCP或者UDP,则默认两种都可以)
sudo ufw allow 端口号
sudo ufw allow 端口号/tcp
sudo ufw allow 端口号/udp
#允许2200到2222端口的TCP
sudo ufw allow 2200:2222/tcp
#设置特定的IP可以连接过来
sudo ufw allow from xx.xx.xx.xx
#指定特定IP连接到特定端口
sudo ufw allow from xx.xx.xx.xx to any poart 端口号
#设置特定的子网xx.xx.xx网段ip连接
sudo ufw allow from xx.xx.xx.0/24

## 阻止规则
#阻止指定端口号(如果不带有TCP或者UDP,则默认两种都可以),注意如果之前有该端口的allow规则,那么只是改规则为deny,而不会删除规则
sudo ufw deny 端口号
sudo ufw deny 端口号/tcp
sudo ufw deny 端口号/udp
#阻止2200到2222端口的tcp
sudo ufw deny 2200:2222/tcp
#阻止特定IP访问
sudo ufw deny from xx.xx.xx.xx
#阻止特定IP通过端口
sudo ufw deny from xx.xx.xx.xx to any poart 端口号
#阻止特定子网xx.xx.xx网段ip连接
sudo ufw deny from xx.xx.xx.0/24


## 配置出入(默认的规则都是进来的,我们可以通过in和out配置)
sudo ufw allow in 2222 #允许2222端口的流量进来
sudo ufw denty in 2222 #阻止2222端口的流量进来
sudo ufw allow out 2222 #允许2222端口的流量出去
sudo ufw denty out 2222 #阻止2222端口的流量出去

## 删除规则(两种方式)
#方式1:通过在规则前面加上delete删除规则
sudo ufw delete allow 端口号
#方式2:通过查看规则序列号来删除
#查看规则序列号
sudo ufw status numbered
#删除第3条规则
sudo ufw delete 3

💁‍♂ 说明:

一旦启用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
2
3
4
5
6
7
8
9
10
11
12
# 开启服务
systemctl start firewalld
# 开机自启动服务
systemctl enable firewalld

# 重启
systemctl restart firewalld

# 关闭
systemctl stop firewalld
# 禁止开机自启动服务
systemctl disable firewalld
(4)查看防火墙规则
1
firewall-cmd --list-all
(5)查询、开放、关闭端口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp

#添加防火墙端口区间
firewall-cmd --zone=public --add-port=4400-4600/tcp --permanent
firewall-cmd --zone=public --add-port=4400-4600/udp --permanent

#删除防火墙端口区间
firewall-cmd --zone=public --remove-port=4400-4600/tcp --permanent
firewall-cmd --zone=public --remove-port=4400-4600/udp --permanent

#重新加载配置
firewall-cmd --reload

参数解释:

  • --permanent:表示设置为持久
  • --add-port:标识添加的端口

7. 网络监控netstat

般用于检验本机各端口的网络连接情况

1
2
3
4
netstat      #命令用于显示各种网络相关信息,如网络连接, 路由表, 接口状态等等
netstat -lt #列出所有处于监听状态的tcp端口
netstat -tunlp #查看所有的端口(tcp,udp和的port)信息, 包括 PID 和进程名称
netstat -tunlp|grep 端口号 #用于查看指定端口号的进程情况

8. nc 网络工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
##检查服务器端口是否通
nc -zv ip 端口
#如下:
$ root@ubuntu18:~# nc -zv 192.168.30.100 80
Connection to 192.168.30.100 80 port [tcp/http] succeeded!

##启动任意端口
nc -l -p 端口
#如下:
$ nc -l -p 8989 #服务端开启一个8989端口tcp进程
$ telnet 192.168.60.149 8989 #客户端通过telnet连接测试端口

##扫描端口(扫描指定ip某范围下启动的端口)
nc -v -w 1 ip -z 扫描起始的端口-扫描终止的端口
#如下:
$ nc -v -w 1 qcmoke.site -z 80-443
Connection to qcmoke.site 80 port [tcp/http] succeeded!
nc: connect to qcmoke.site port 81 (tcp) timed out: Operation now in progress
Connection to qcmoke.site 82 port [tcp/*] succeeded!
nc: connect to qcmoke.site port 83 (tcp) timed out: Operation now in progress
nc: connect to qcmoke.site port 84 (tcp) timed out: Operation now in progress

##验证UDP端口连通性
nc -l -u 8989 #服务端开启一个82端口udp进程
nc -uvz qcmoke.site 8989 #客户端连接服务端验证udp端口是否可用

9. traceroute路由追踪

现实世界中的网络是由无数的计算机和路由器组成的一张的大网,应用的数据包在发送到服务器之前都要经过层层的路由转发。而Traceroute是一种常规的网络分析工具,用来定位到目标主机之间的所有路由器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#-U 使用UDP协议(默认)发送数据包测试路由追踪(因为大部分的应用服务器都不提供UDP服务(或者被防火墙挡掉),所以会拿不到服务器的任何返回,所以不建议使用UDP测试)
#-T 使用TCP协议的SYN发送数据包测试路由追踪
#-I 使用icmp协议发送数据包测试路由追踪(ICMP即Internet控制报文协议,用于在IP主机、路由器之间传递控制消息的一种网络层协议,ICMP是IP协议的一部分,因此,ICMP协议的报文包含在IP数据报的数据部分。ICMP不像TCP或UDP有端口,只要服务器不禁止icmp消息,都是可以拿到路由应答的)
#-p 指定UDP端口。缺省值为 33434。如果 UDP 端口不可用,那么该选项可以用于选择一个未曾使用的端口范围。
#-m 指定最大ttl,默认30,即最大跳数
traceroute [参数] ip

# 测试(向www.qcmoke.site发送icmp数据包并追踪路由)
$ traceroute -I -m 100 baidu.com
traceroute to baidu.com (110.242.68.66), 30 hops max, 60 byte packets
1 _gateway (192.168.60.2) 0.075 ms 0.040 ms 0.037 ms
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * * #***的路由表示该路由服务屏蔽了ICMP消息
16 110.242.68.66 (110.242.68.66) 42.452 ms 42.450 ms 42.423 ms #共经历16跳后到达服务器

Windows系统中也有路由追踪工具,那就是tracerttracert采用的是icmp协议实现的,故不需要指定消息的协议。

1
2
#-h 指定最大ttl,默认30,即最大跳数
tracert ip

参考:

《Traceroute(路由追踪)的原理及实现》

《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 欺骗;此外它还具有一个优点,就是是传输的数据可以是经过压缩的,所以可以加快传输的速度。

001_SSH示意图

要搭建ssh环境,需要分别安装服务端和客户端程序。SSH服务端是安装在服务器中提供ssh协议远程操控的服务软件。只有ssh服务端运行了才能通过ssh客户端连接服务器。

2. 远程登录

2.1 ssh服务端安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#Debian系列系统安装ssh服务
apt-get install openssh-server
#Redhat系列系统安装ssh服务
yum install openssh openssh-clients openssh-server -y

#编辑sshd_config配置文件
#将PermitRootLogin并将其值修改为yes,表示允许root管理员登录系统。
#将PasswordAuthentication的值改为yes(默认值),表示允许使用密码进行ssh登录认证,如果为no,表示不允许使用密码认证,只能使用ssh公钥认证。
vi /etc/ssh/sshd_config
#设置root用户密码
passwd root

#启动sshd
systemctl start sshd
#其他sshd命令
#systemctl restart|stop|start|status sshd
#开机启动
systemctl enable sshd.service

2.2 ssh客户端使用

SSH 客户端是一种使用SSH协议连接到远程计算机的软件程序,通过SSH 客户端我们可以连接到运行了 SSH 服务器的远程机器上。

1
2
#默认系统已经安装,如果没有可通过命令来安装
apt-get install openssh-client

(1) Linux下SSH 客户端的简单使用

1
2
3
4
5
##ssh远程连接服务器
#user是在远程机器上的用户名,如果不指定的话默认为当前用户
#remote是远程机器的地址,可以是IP或者域名
#port是SSH Serve监听的端口,如果不指定,就为默认值22
ssh [-p port] user@remote

注意:如果在 Windows 系统中,可以安装 PuTTY 或者 XShell 客户端软件即可。

提示:使用 exit 退出当前用户的登录

(2) Windows 下 SSH 客户端的安装

2.3 ssh免密码登录

实现方式:使用公钥认证进行登录。

原理:使用非对称加密原理进行登录认证。首先由ssh客户端生成密钥对,然后用户将公钥添加到服务端的某认证配置文件里。当用户登陆时,会通过私钥对请求数据进行签名,并将已经签名的数据发送给ssh服务端,ssh服务端会去认证配置文件拿到公钥并进行验签,如果验签成功则允许登入,否则拒绝。由于私钥只有保存在用户自己的客户端中,因此入侵者就算得到用户公钥,也不能登陆到服务器。

非对称加密算法:

使用 公钥 加密的数据,只能使用 私钥 解密

使用 私钥 加密的数据,只能使用 公钥 解密

实现步骤

①SSH客户端生成密钥对

1
2
# 生成密钥对,一路回车即可。会在~/.ssh下生成一个私钥文件(id_rsa)和一个公钥文件(id_rsa.pub)
ssh-keygen

1541837505008

终端会提示一些问题:

第一个问题是设置私钥和公钥的文件名,如果不设置默认是id_rsaid_rsa.pub

第二个问题是要不要对私钥设置口令(passphrase),如果担心私钥的安全,可以设置一个。

②上传公钥到服务器

方式1:直接copy客户端的~/.ssh/id_rsa.pub内容直接追加到服务端的~/.ssh/authorized_keys里。

方式2:SSH客户端执行以下命令上传 到服务端:

1
2
#执行完命令即可上传客户端公钥到指定的服务器的~/.ssh/authorized_keys里(其实就是追加了id_rsa.pub的内容)
ssh-copy-id -p port user@remote

执行完以上操作后,远程服务器即可认证客户端,客户端也有了ssh免密登录的权限。

示意图:

003_SSH 免密码示意图

3.4 配置ssh服务别名

客户端每次都输入 ssh -p port user@remote,时间久了会觉得很麻烦,特别是当 user, remoteport 都得输入,而且还不好记忆。

而给客户端配置别名可以解决这个问题,譬如用:ssh myserver 来替代上面这么一长串。要实现这个功能需要在客户端的 ~/.ssh/config (没有这个文件则手动创建)里面追加以下内容:

1
2
3
4
Host myserver
HostName 服务器ip地址
User 服务器用户名
Port 22

例如:

1
2
3
4
Host myserver
HostName 192.168.1.130
User qcmoke
Port 22

保存之后,即可用 以下命令实现快速远程登录了

1
2
3
4
$ ssh myserver

#此外对于scp命令同样可以使用myserver替代-P port user@remote了
$ scp -r demo myserver:/home

注意: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 而不是小写的。

002_SCP示意图

1
2
3
4
5
6
7
8
9
10
11
12
13
# 把本地当前目录下的 01.py 文件 复制到 远程 家目录下的 Desktop/01.py
# 注意:`:` 后面的路径如果不是绝对路径,则以用户的家目录作为参照路径
scp -P port 01.py user@remote:Desktop/01.py

# 把远程 家目录下的 Desktop/01.py 文件 复制到 本地当前目录下的 01.py
scp -P port user@remote:Desktop/01.py 01.py

# 加上 -r 选项可以传送文件夹
# 把当前目录下的 demo 文件夹 复制到 远程 家目录下的 Desktop
scp -r demo user@remote:Desktop

# 把远程 家目录下的 Desktop 复制到 当前目录下的 demo 文件夹
scp -r user@remote:Desktop demo
选项 含义
-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
2
3
4
5
6
7
#服务器安装
yum install -y lrzsz #centos
apt-get install lrzsz #ubuntu
#在客户端执行弹窗选择文件上传
rz
#在服务端执行选择文件下载(多文件sz 1.txt 2.txt)
sz a.txt

十一、磁盘管理

相关基础命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#显示磁盘分区使用情况 -h:使用人类可读的格式 -T:显示磁盘分区文件系统类型
df -h

##查看目录或文件大小
#显示目录下的文件大小,-h:以人性化的方式显示文件大小
du -h [目录名]
#查看当前目录大小
du -sh
#查看当前目录下所有一级子目录文件夹大小
du -h --max-depth=1
#按照目录大小进行倒序排序(以M为单位显示)
du -m --max-depth=1|sort -nr

#查看可用设备(包括磁盘等)-f 查看文件系统相关设备 -S 查看scsi设备相关设备
lsblk
lsblk -f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost ~]# lsblk 
#TYPE:disk表示磁盘,part表示标准分区,lvm逻辑卷分区
#MOUNTPOINT:挂载点
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda #第一个磁盘 8:0 0 20G 0 disk
├─sda1 #第一个磁盘下的第一个分区 8:1 0 500M 0 part /boot
└─sda2 #第一个磁盘下的第二个分区 8:2 0 19.5G 0 part
├─centos-swap 253:0 0 2G 0 lvm [SWAP]
└─centos-root 253:1 0 17.5G 0 lvm /
sdb #第二个磁盘(没有分区) 8:16 0 10G 0 disk

#磁盘格式化后就会有文件系统类型和uuid
[root@localhost ~]# lsblk -f
NAME FSTYPE(文件系统类型)LABEL UUID MOUNTPOINT
sda
├─sda1 xfs be642956-78fe-4538-a3ab-840d6de853b7 /boot
└─sda2 LVM2_member dCCxeE-hgqX-XBLU-6AXZ-ikIJ-va94-Q5IF2D
├─centos-swap swap 653b8409-ce8f-4f98-904a-a1745d6568cc [SWAP]
└─centos-root xfs c6387d81-0587-4548-9a06-6c406ad9034a /
sdb

标准分区管理

当添加了一块新磁盘后,系统是不能直接使用的,需要对磁盘进行创建分区、格式化分区、挂载分区三个步骤后才能正常使用。

1、创建分区

1
2
3
4
#可通过如下命令查看新加的磁盘其所在linux系统中的名称,假设为/dev/sdb
fdisk -l
#创建分区,对新磁盘进行分区(执行命令之后将会进行手工命令交互过程)
fdisk /dev/sdb

创建分区示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[root@localhost ~]# fdisk /dev/sdb 
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x5a23d71f.

Command (m for help): m #查看输入选项菜单
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

Command (m for help): n #创建新分区
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p #分区类型选择为主分区
Partition number (1-4, default 1): 1 #指定分区号,如果输入1,那么分区为/dev/sdb2,2则为/dev/sdb2
First sector (2048-20971519, default 2048): 2048 #指定第一个扇区地址(2048默认值,表示从磁盘的第一个扇区,可直接回车选默认)
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): 20971519 #最后一个扇区地址(默认磁盘的最大可存储地址,可直接回车选默认,如果该磁盘需要创建多个分区的话可以按照需求修改)
Partition 1 of type Linux and of size 10 GiB is set

Command (m for help): w #写入分区并退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

默认使用DOS(即MBR)作为磁盘分区方案,如果需要使用GPT,那么需要在输入“n”创建分区之前先输入“g”指定为GPT分区方案,如需改回MBR方案,只需创建分区之前先输入“o”指定为MBR分区方案。

MBR只能支持最多4个主分区或3个主分区和1个扩展分区。每个主分区最多可以有一个逻辑分区,而一个扩展分区可以创建多个逻辑分区。它使用了一个512字节的扇区来存储分区表信息,由于分区表大小的限制所以只能支持到最多4个主分区。

GPT能够支持更多的分区(理论无限)。GPT没有主分区和扩展分区的概念,所有分区都是相等的,可以理解为所有的分区都是主分区。它使用64个扇区(32KB)来存储分区信息,相比之下,MBR分区表只有512字节。这使得GPT分区表能够存储更多的分区信息。

2、格式化分区

1
2
3
#格式化分区
mkfs -t ext4 /dev/sdb1
#或者mkfs.ext4 -F /dev/sdb1

3、挂载分区

挂载即将一个分区与一个目录进行关联,使操作该目录文件即操作对应的磁盘分区。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#先创建需要挂载的目录
mkdir /data
#将分区挂载到对应目录(临时挂载)
mount /dev/sdb1 /data
#最后查看挂载是否成功
df -h

#设置开机自动挂载
echo "/dev/sdb1 /data ext4 defaults 1 1" >> /etc/fstab
#或者通过分区的uuid进行挂载(查看所有分区的对应UUID,可通过命令blkid查看),如下:
echo "UUID=6f74be84-76e7-4177-a387-e2e711329c33 /data ext4 defaults 1 1" >> /etc/fstab

#重启以证明是否生效
reboot

注意:如果需挂载的目录在挂载前存在文件,那么挂载后这些文件将会"消失",但卸载后这些文件就又会显现,原因是挂载前文件是存在于原来的磁盘分区上的,如果同一目录挂载了新的磁盘分区,那么该目录显示的是新磁盘分区的内容,而新分区并没有这些文件所以文件会"消失"。当卸载后,挂载目录又会回到原磁盘分区上,自然就会把原本的文件显现出来。

4、卸载及删除分区

1
2
3
4
5
6
7
8
9
10
11
12
13
##卸载
umount /dev/sdb1
#或者 umount /data
#如果是开机自动挂载的话还需要删除/etc/fstab文件对应的挂载配置


##删除分区
fdisk /dev/sdb
m
d
1
d #删除
w #输入 w 保存,这个时候分区以及删除了,可以重新创建了

参考:

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)的可用大小可能小于其底层设备的大小,其中一些原因包括:

  1. LVM会在物理卷上保留一部分空间作为元数据区域,用于存储逻辑卷组(VG)和逻辑卷(LV)的元数据信息。这些元数据占用了一定的空间,从而减少了物理卷的可用空间。
  2. 物理卷使用的文件系统可能也会在设备上分配一些空间,例如ext4文件系统会在物理卷上保留一部分空间用于存储文件系统元数据和碎片信息。这些空间也会使得物理卷的可用空间减少。
  3. 如果物理卷上还有其他分区或文件系统,则它们也会占用一些空间,从而减少了物理卷的可用空间。

因此,当创建物理卷时,应该考虑到这些因素,并为物理卷预留足够的空间以供元数据和其他用途使用。

2. 查看

1
2
3
4
5
6
7
8
#查看物理卷
pvs、pvdisplay、pvscan
#查看卷组
vgs、vgdisplay、vgscan
#查看逻辑卷
lvs、lvdisplay、lvscan
#查看磁盘分区
fdisk -L

3. 创建pv、vg、lv

1
2
3
4
5
6
7
8
9
10
11
12
#创建pv物理卷(设备路径可以是磁盘设备路径(/dev/sdb)或者分区设备路径(/dev/sdb1))
pvcreate 设备路径
#如:pvcreate /dev/sdb
#还可以同时创建多个pv,如:pvcreate vg名 pv1路径 pv2路径 pv3路径

#创建vg卷组
vgcreate vg名 pv路径
#如:vgcreate myvg /dev/sdb

#创建lv逻辑卷(大小可以用计量单位,比如5G,2048M等,如果设置的大小不满足pe大小的整数倍将自动进行四舍五入处理)
lvcreate -n lv名 -L 大小 vg名
#如:lvcreate -n mylv -L 5G myvg

4. 格式化和挂载lv

1
2
3
4
5
6
7
8
9
10
11
#格式化lv(lv完整路径可以通过命令lvdisplay查看)
mkfs.ext4 lv完整路径
#如:mkfs.ext4 /dev/myvg/mylv

#挂载(挂载点即需要挂载的目录,需要提前创建)
mount lv完整路径 挂载点目录路径
#如:mount /dev/myvg/mylv /mnt/mylv

#开机自动挂载
echo "lv完整路径 挂载点目录路径 ext4 defaults 1 1" >> /etc/fstab
#如:echo "/dev/myvg/mylv /mnt/mylv ext4 defaults 1 1" >> /etc/fstab

5. 卸载lv

1
2
3
#(如果有开机自动挂载配置还需要删除/etc/fstab文件对应的挂载配置)
umount lv完整路径
#如:umount /mnt/mylv

6. 删除lv、vg、pv

1
2
3
4
5
6
7
8
9
10
11
#删lv(注意:删除lv前要先将其卸载)
lvremove lv完整路径
#如:lvremove /dev/myvg/mylv

#删vg
vgremove vg名
#如:vgremove myvg

#删PV
pvremove 设备完整路径 去硬盘
#如:pvremove /dev/sdb

7. 扩容

扩容lv的时如果vg容量不够,需要添加pv并加到vg中然后再给lv扩容,否则不需要这个步骤。

1
2
3
4
5
6
7
#添加新的pv
pvcreate 设备路径
#如:pvcreate /dev/sdc

#扩展vg
vgextend vg名 新增pv路径
#如:vgextend myvg /dev/sdc
1
2
3
#扩容lv(扩展量可以用计量单位,比如3G,通过+表示扩展多少,而如果不用+则表示扩展到多少)
lvextend -L +扩展量 lv完整路径
#如:lvextend -L +3G /dev/myvg/mylv

以上只是对lv进行扩容,但文件系统是无法识别的,故需要调整文件系统容量

1
2
3
#调整文件系统容量(将文件系统扩展到逻辑卷的整个大小)
resize2fs lv完整路径
#如:resize2fs /dev/myvg/mylv

8. 缩容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#首先进行卸载
umount lv完整路径
#如:umount /dev/myvg/mylv

#检查文件系统
e2fsck -f lv完整路径
#如:e2fsck -f /dev/myvg/mylv

#减少文件系统
resize2fs lv完整路径 减少到的大小
#如:resize2fs /dev/myvg/mylv 2G

#减少lv卷大小(注意:文件系统的减小后大小一定要和lv卷最终大小相等)
lvreduce -L 减少到的大小 lv的完整路径
#如:lvreduce -L 2G /dev/myvg/mylv

#重新挂载使用
mount lv完整路径 挂载点
#如:mount /dev/myvg/mylv /mnt/mylv

参考:

https://www.cnblogs.com/linuxprobe/p/5381538.html

十二、时间管理

1. 查看时间

1
2
3
4
5
#查看当前系统时间
date
#查看日历,-y选项可以查看一年的日历
cal
cal 2022

2. 修改时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#修改时分秒
date -s 11:11:11
#修改年月日
date -s 2019-11-11
#修改年月日时分秒
date -s "2019-11-11 11:11:11"

#保存为bios时间(RTC)(同步BIOS时钟,强制将系统时间写入CMOS,使之永久生效,避免系统重启后恢复成原时间。)
hwclock -w
#或者
clock -w

#查看bios时间
hwclock -r

3.设置时区

1
2
3
4
#显示系统的所有时区
timedatectl list-timezones
#设置当前系统为Asia/Shanghai上海时区
timedatectl set-timezone Asia/Shanghai

4. 时间同步

4.1 单机版

1
2
3
4
5
6
#安装ntpdate
yum install ntpdate -y
#同步网络时间(要求服务器可访问外网)
ntpdate ntp1.aliyun.com
#保存为bios时间(RTC)
hwclock -w

4.2 集群版

方案:集群中,要求有一台能访问外网的服务器作为时间服务器,其余内网服务器通过这台时间服务器来实现时间同步。有两种常用的服务工具实现:ntp和chrony

注意:这里ntp和chrony相比于ntpdate的区别在于,ntpdate只能手动单次同步时间(除非编写cronp配置),其同步时间的速度是很快的。而ntp和chrony本身就可以自己定时同步时间,其同步时间的速度可能需要几分钟以上。

全球相关ntp时间服务器:https://www.ntppool.org/zh/

4.2.1 ntp

(1)安装和环境准备

1
2
3
4
5
6
7
8
#安装ntp
yum install ntp -y

#开放123端口防火墙作为客户端访问的端口
firewall-cmd --permanent --add-port=123/udp
firewall-cmd --reload
#使用前可以把其他时间同步服务关掉,比如chrony(如果有使用的话)
systemctl stop chronyd && systemctl disable chronyd

(2)修改ntp参数配置文件

🙆‍♂对于ntpd,发现这里不做配置也可以自动同步硬件时间。

1
2
3
vim  /etc/sysconfig/ntpd
#可选择修改,是让ntpdate同步时候时写到硬件
vim /etc/sysconfig/ntpdate

修改或者追加如下配置

1
2
#同步时间后,写到硬件中
SYNC_HWCLOCK=yes

(3)修改ntp配置文件

1
2
#修改ntp配置文件(只做以下相关配置修改,其余保持不变)
vim /etc/ntp.conf

服务端配置

1
2
3
4
5
6
7
8
9
10
11
#允许192.168.60.0网段内所有机器从本机同步时间
restrict 192.168.60.0 mask 255.255.255.0 nomodify notrap
#时间服务器地址
server 0.centos.pool.ntp.org iburst
server ntp1.aliyun.com iburst
#允许上层时间服务器主动修改本机时间
restrict 0.centos.pool.ntp.org nomodify notrap noquery
restrict ntp1.aliyun.com nomodify notrap noquery
#外部时间服务器不可用时,以本地时间作为时间服务
server 127.127.1.0
fudge 127.127.1.0 stratum 10

客户端配置

1
2
3
4
5
6
7
#从node1中同步时间
server 192.168.60.101 iburst
#允许node01修改本地时间
restrict 192.168.60.101 nomodify notrap noquery
#如果node01不可用,用本地的时间服务
server 127.127.1.0
fudge 127.127.1.0 stratum 10

(4)启动和测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ntpd进程进行同步时,可能需要5-10分钟的时间才能同步,另外ntpd开启后,则无法使用ntpdate,所以可以提前先手动同步
ntpdate ntp1.aliyun.com
#ntpdate 192.168.60.101
hwclock -w

#启动服务
systemctl start ntpd
#开机启动
systemctl enable ntpd
netstat -tunlp |grep ntpd

##上层 ntp 的状态
#*表示目前使用的ntp server
#remote:用于同步的远程节点或服务器。“LOCAL”表示本机(当没有远程服务器可用时会出现)
#refid:远程的服务器进行同步的更高一级服务器
#st:即stratum阶层,值越小表示ntp serve的精准度越高
#when:最后一次同步到现在的时间
#Poll表示,每隔多少毫秒与ntp server同步一次
#reach:已经成功更新的次数
#delay:从本地到远程节点或服务器通信的往返时间
#offset:主机与远程节点或服务器时间源的时间偏移量,offset 越接近于0,主机和 NTP 服务器的时间越接近(以方均根表示,单位为毫秒)
#jitter:与远程节点同步的时间源的平均偏差(多个时间样本中的 offset 的偏差,单位是毫秒),这个数值的绝对值越小,主机的时间就越精确
ntpq -p
#可通过watch来实时监控
watch ntpq -p

#ntp 同步状态(等待5-10分钟后,查看同步状态)
ntpstat

#查看日志
tail -f /var/log/messages
4.2.2 chrony

(1)安装和环境准备

1
2
3
4
5
6
7
8
9
#安装chrony
yum install chrony -y

#开放123端口防火墙作为客户端访问的端口
firewall-cmd --permanent --add-port=123/udp
firewall-cmd --permanent --add-port=323/udp
firewall-cmd --reload
#使用前可以把其他时间同步服务关掉,比如ntp(如果有使用的话)
systemctl stop ntpd && systemctl disable ntpd

(2)修改chrony配置文件

1
2
#修改配置文件(只做以下相关配置修改,其余保持不变)
vim /etc/chrony.conf

服务端配置

假设服务端ip为192.168.60.101

1
2
3
4
5
6
7
8
9
#外网ntp时间服务器地址
server 0.centos.pool.ntp.org iburst
server ntp1.aliyun.com iburst
#同步到bios时间(RTC)
rtcsync
#限制允许192.168.60网段ip的客户端同步
allow 192.168.60.0/24
#即使未与时间源同步也可提供本地时间
local stratum 10

客户端配置

1
2
3
4
# 删除其它server,并添加如下server
server 192.168.60.101 iburst
#同步到bios时间(RTC)
rtcsync

(3)启动和测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#启动服务
systemctl start chronyd
#测试时间同步的时候(假设手动设置了错误的时间)如果chronyd已经启动了的话,需要重启以下才能看效果
systemctl restart chronyd
#开机启动
systemctl enable chronyd
netstat -tunlp |grep chronyd

#强制快速同步系统时间
chronyc -a makestep
hwclock -w

#chrony兼容ntpdate,客户端也可以使用ntpdate手动快速同步时间
ntpdate 192.168.60.101

十三、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则会输出会原文件以覆盖原内容

1542620949919

1.2 在第二行前追加两行内容

1
2
3
$ sed '2i \
s004,\twangwu,\tjava,\t100,\tok, \
s005,\tzhaosi,\tc++,\t100,\tok,' student.txt

1542622161517

\表示输入未结束

1.3 打印行

1
$ sed -n '2 p' student.txt  #只打印第二行,-n防止打印第二行后还会打印所有行  #此处的2是行数匹配地址

1542620106443

1.4 删除行

删除第二行到第三行(不改变源文件的数据,只输出删除后剩余的结果)

1
$ sed '2,3d' student.txt

1542620284091

删除第一行并修改文本源数据(将输出结果覆盖作用的文件内容)

1
$ sed -i '1d' student.txt

1542620470315

1.5 字符串替换

sed ' 匹配地址 s/旧字串/新字串/g' 文件名

此处匹配地址如果是正则匹配地址,那么一定要加/ /以表示正则模式

把第二行的wen改成xuan

1542622690522

2. awk 命令工具

  • 偏向场景是以流处理的格式化报表输出

  • 处理方式:以行处理

2.1 格式

1
awk  '条件1{动作1}  条件2{动作2}  …'  文件名

条件(Pattern):
一般使用关系表达式作为条件
x > 10 判断变量 x是否大于10
x>=10 大于等于
x<=10 小于等于
动作(Action):
格式化输出
流程控制语句

如果没有指定条件,每行都执行相应的动作

所有的动作或者命令都要用{}括起来

测试文件:student.txt:

1
2
3
4
s001,	wen,	java,   90,	ok,
s001, wen, c, 90, ok,
s001, wen, c#, 90, ok,
s002, qcmoke, c, 100, ok,
2.1.1 输出第一列和第二列
1
2
3
$ awk '{print $1$2}' student.txt
# $1为取出第一个分隔开的字段,$2为取出第二个分隔开的字段
# 默认识别的分隔符是制表符或者大于零的任意空格

1542617270519

2.2 BEGIN

BEGIN是在所有的数据读取之前的命令语句,以是否执行成功为条件结果,满足BEGIN才执行{}里的内容

2.2.1 测试BEGIN
1
$ awk 'BEGIN{print "hello"} {print $1  "\t"  $2}' student.txt

1542617203006

2.3 FS内置对象

作用:给awk命令设置识别的分隔符

1
$ awk '{FS=","} {print $1 "\t" $2}' student.txt

1542618027330

awk默认是先读入一行数据才开始处理后面的动作,故在指定分隔符后,从第二行开始才生效,而第一行无效。

处理:

2.3.1 测试FS

使用BEGIN,让awk读取第一行数据前就先指定分隔符。

1
$ awk 'BEGIN{FS=","} {print $1 "\t" $2}' student.txt

1542618296511

2.4 END

作用:在所有数据都读取并执行完所有动作之后再执行某个动作,以是否成功为条件结果。

2.4.1 测试END
1
$ awk '{print $1$2}END{print "ending over !"}' student.txt

1542618618673

十四、vi和vim

vi和vim的三种模式:

1
2
3
正常模式:以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用『复制、粘贴』来处理你的文件数据。
插入模式:按下 i, I, o, O, a, A, r, R 等任何一个字母之后才会进入编辑模式, 一般来说按 i 即可.
命令行模式:输入 esc 再输入:在这个模式当中, 可以提供你相关指令,完成读取、存盘、替换、离开vim、显示行号等的动作则是在此模式中达成的!

各种模式的相互切换如图:

image-20230319063455443

常用操作如下:

1
2
3
4
5
6
7
1) 拷贝行:拷贝当前行: yy ; 拷贝当前行向下的 5 行 5yy,并粘贴(输入 p)。
2) 删除行:删除当前行 dd ;删除当前行向下的 5 行 5dd
3) 查找某个单词:命令行下,/关键字 , 回车 查找 , 输入n就是查找下一个,输入N向上查找下一个
4) 设置文件的行号,取消文件的行号.[命令行下 : set nu 和 :set nonu
5) 将光标移动到文档首行和末行:在一般模式下, 末行[G],首行[gg]
6) 撤销:在一个文件中输入内容后 ,在一般模式下, 撤销按 u
7) 将光标移动到指定行:在一般模式下,先输入行号(如20),再按shift+g

更多命令操作见下图:

vi-vim-cheat-sheet-sch

参考:https://www.runoob.com/linux/linux-vim.html

十五、Linux安装

自定义磁盘分区

在安装Linux时,以下分区是必须要创建的:

  1. 根分区(/):这是Linux系统的根目录,包含操作系统的所有文件和目录。
  2. 交换分区(swap):用于虚拟内存,当物理内存不足时,系统将部分数据移至交换分区中(通常建议将交换分区大小设置为物理内存的两倍)。

如果使用UEFI启动,则还需要创建一个EFI系统分区(ESP),它包含引导加载程序、内核文件和其他支持文件。但是,如果使用传统的BIOS引导模式,则不需要创建ESP分区。

需要注意的是,在某些情况下,可能会出现不需要 ESP 分区也可以使用 UEFI 启动的情况。例如,某些 UEFI 固件可能支持直接从磁盘中的某个分区启动操作系统,而无需使用 ESP 分区。此外,一些特定的发行版或安装程序可能提供了与 ESP 分区无关的替代方案,以便在没有 ESP 分区的情况下实现 UEFI 启动

请注意,以上仅适用于基本的Linux安装。而为了数据的安全,通常会创建以下几个分区

  1. 根分区(/)

  2. 交换分区(swap)

  3. /home 分区:用于存储用户数据和配置文件。

  4. /boot分区:通常用于存储启动引导程序、内核映像以及相关的配置文件等。需要足够的空间来存储未来更新的内核文件。

  5. EFI系统分区(ESP):如果使用UEFI启动,则需要一个ESP分区,它包含引导加载程序、内核文件和其他支持文件,在l安装inux后会自动挂载到系统的/boot/efi目录。

    在某些情况下,还可能需要创建其他分区,如/var、/tmp 或 /usr 分区等。但这取决于具体的需求和Linux发行版的要求。

    **分区容量分配示例:**对于一个100GB容量的磁盘,建议将其分区和配置如下:

    1. 根分区(/):将根分区设置为40-50GB。这足以安装Linux系统、常用应用程序和一些基本的开发工具。
    2. 交换分区(swap):将交换分区设置为2-4GB。这里推荐使用物理内存大小的两倍作为交换分区大小的基准。
    3. /home 分区:将/home分区设置为30-50GB。这将为用户数据和配置文件提供足够的存储空间。
    4. /boot分区:设置1GB(建议至少分配200MB以上),要确保足够存储未来的内核更新文件。
    5. EFI系统分区(ESP):如果您使用UEFI引导,则需要创建一个ESP分区。通常,这个分区只需要为100-500MB即可。
    6. 其他分区:如果您需要存储大量的数据、音频或视频文件,可以创建一个单独的数据分区。该分区的大小应根据您的特定需求来确定。

十六、常见问题解决

1. linux更新被锁的解决方法

1
2
3
4
5
6
#问题如下:
E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?

#解决:
sudo rm /var/lib/dpkg/lock

2. 解决使用ls命令目录无法高亮显示的问题

1
2
3
4
5
6
sudo cat >> ~/.bashrc << 'EOF'
alias ls='ls --color=auto'
EOF

#使配置文件修改生效
source ~/.bashrc


----------- 本文结束 -----------




如果你觉得我的文章对你有帮助,你可以打赏我哦~
0%