pre
这份笔记是张伟前辈制作的,使用时我补充了一些知识点
已经涵盖了想入门运维的同学需要掌握的Linux基础知识了
Linux基础笔记有14w字,可以使用csdn的目录查阅具体内容
一些不太常用的指令在笔记里就没必要提及,可以查阅下面这个网站查找指令用法
http://cmd.oldboyedu.com/
1. Linux基本使用和配置
1.1 查看系统运行级别
# 查看系统当前运行级别,N表示上一次没有模式,即开机后就是3模式(命令行模式)
[root@rocky ~][0]# runlevel
N 3
1.2 切换系统运行级别
0: 关机
1: 单用户模式(用于系统维护)
2: 多用户模式,没有网络支持
3: 多用户模式,具有网络支持
4: 未分配(可以由用户自定义)
5: 多用户模式,具有图形用户界面
6: 重启
[root@rocky ~][0]# init 3
1.3 系统登录后欢迎提示
# 登录后欢迎提示
vim /etc/motd
1.4 系统登录前欢迎提示
# 登录前欢迎提示
vim /etc/issue
1.5 修改主机名
注意:主机名不要使用下划线
# 修改主机名
hostnamectl set-hostname Rocky && exec $SHELL -l
# 通过文件修改
vim /etc/hostname
exec $SHELL -l
# 临时修改,重启失效
hostname Rocky && exec $SHELL -l
1.6 查看当前登录账户/会话
# 查看当前登录有效用户
[root@Rocky ~][0]# whoami
root
[root@Rocky ~][0]# who am i
root pts/0 2023-10-23 17:20 (221.178.140.146)
# 查看系统当前所有的登录会话及所作操作
w
# 查看系统当前所有登录会话
[root@Rocky ~][0]# who
root pts/0 2023-10-24 10:10 (221.178.140.146)
1.7 命令行提示符
# 管理员
$ 普通用户
le 控制符\033
\u 当前用户
\h 主机名简称
\H 主机名
\w 当前工作目录
\W 当前工作目录基名
\t 24小时时间格式
\T 12小时时间格式
! 命令历史数
# 开机后命令历史数
# 修改提示符,绿色高亮带命令返回值
PS1='\[\e[32;1m\][\u@\h \w][$?]\$ \[\e[0m\]'
# 修改提示符,蓝色高亮带命令返回值
PS1='\[\e[34;1m\][\u@\h \w][$?]\$ \[\e[0m\]'
# 修改提示符,红色高亮带命令返回值
PS1='\[\e[31;1m\][\u@\h \w][$?]\$ \[\e[0m\]'
# 修改提示符,青色高亮带命令返回值
PS1='\[\e[36;1m\][\u@\h \w][$?]\$ \[\e[0m\]'
# 修改提示符,洋红色色高亮带命令返回值
PS1='\[\e[36;1m\][\u@\h \w][$?]\$ \[\e[0m\]'
# 修改提示符,黄色高亮带命令返回值
PS1='\[\e[33;1m\][\u@\h \w][$?]\$ \[\e[0m\]'
# 绿色高亮带命令返回值和时间的提示符
PS1='\[\e[32;1m\][\[\e[0m\]\t\[\e[32;1m\]] [\u@\h \w][$?]\$ \[\e[0m\]'
# 蓝色高亮带命令返回值和时间的提示符
PS1='\[\e[34;1m\][\[\e[0m\]\t\[\e[34;1m\]] [\u@\h \w][$?]\$ \[\e[0m\]'
# 红色高亮带命令返回值和时间的提示符
PS1='\[\e[31;1m\][\[\e[0m\]\t\[\e[31;1m\]] [\u@\h \w][$?]\$ \[\e[0m\]'
# 青色高亮带命令返回值和时间的提示符
PS1='\[\e[36;1m\][\[\e[0m\]\t\[\e[36;1m\]] [\u@\h \w][$?]\$ \[\e[0m\]'
# 洋红色高亮带命令返回值和时间的提示符
PS1='\[\e[35;1m\][\[\e[0m\]\t\[\e[35;1m\]] [\u@\h \w][$?]\$ \[\e[0m\]'
# 黄色高亮带命令返回值和时间的提示符
PS1='\[\e[33;1m\][\[\e[0m\]\t\[\e[33;1m\]] [\u@\h \w][$?]\$ \[\e[0m\]'
1.8 卸载虚拟网卡
yum -y remove libirt-daemon
2. 命令和命令类型
2.1 内部命令和外部命令
外部命令 在文件系统路径下有对应的可执行程序
内部命令 /bin/bash/*
# 内部命令
[root@Rocky ~][0]# type echo
echo is a shell builtin
# 外部命令
[root@Rocky ~][1]# type shutdown
shutdown is /usr/sbin/shutdown
# 外部命令的存放(搜索)路径
[root@Rocky ~][0]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
# echo既是外部命令,也是内部命令
[root@Rocky ~][0]# type -a echo
echo is a shell builtin
echo is /usr/bin/echo
# hash命令记录着曾经执行过的外部命令
[root@Rocky ~][0]# hash
# 查看所有内部命令
enable | awk '{print $2}'
# 查看外部命令路径
[root@Rocky ~][0]# which reboot
/usr/sbin/reboot
# 查看外部命令路径,同时显示帮助文档的路径
[root@Rocky ~][0]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
2.2 Hash缓存表
系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shel解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用速率
hash 显示缓存
hash -l 显示hash缓存,可作为输入使用
hash -p path name 将命令全路径path起别名为name
hash -d name 清楚name缓存
hash -r 清楚所有缓存
2.3 命令别名
别名永久生效:
- 仅对当前用户生效:~/.bashrc
- 对所有用户生效:/etc/bashrc
# 显示当前shell进程中所有可用的命令别名
alias
# 定义别名
type eth0 || alias eth0="vim /etc/sysconfig/network-scripts/ifcfg-eth0"
# 临时取消所有别名
unalias -a
# 别名立即生效
exec $SHELL -l
# 取消别名,当作普通命令来来执行
\aliasname
"aliasname"
'aliasname'
/PATH/cmd # 只适合外部命令
2.4 命令的优先级
别名 > 内部命令 > 外部命令
2.5 命令格式
CMD [选项...] [参数...]
- 短选项:UNIX风格选项,例如:-l,-h
- 长选项:GNU风格选项,例如:–all,–host
- BSD风格选项:一个字母,例如:a
注意:
- 多个选项以及参数和命令之间使用空白字符分割
- 取消和结束命令执行:Ctrl+c强行终止,Ctrl+d正常退出
- 多个命令可以用" ; "符号分开
- 一个命令可以用 \ 分成多行
3. 系统相关常见命令
3.1 查看CPU
lscpu
cat /proc/cpuinfo
3.2 查看内存大小
free [选项]
-b 以字节为单位
-m 以MB为单位
-g 以GB为单位
-h 易读格式
-t 显示RAM+SWAP的总和
-s ? 每隔?秒刷新一次
-c ? 刷新?次后退出
[root@Centos7 ~]$ free -h
total used free shared buff/cache available
Mem: 2.8G 343M 2.1G 9.8M 359M 2.3G
Swap: 3.0G 0B 3.0G
总内存大小 已用 剩余 被共享的内存 缓冲/缓存 实际最大可用
# 清除缓存,默认值是0,重启才能恢复(没有必要,系统还要重新读取)
echo 3 > /proc/sys/vm/drop_caches
3.3 查看硬盘大小
df
-H 以10为单位
-T 文件系统类型
-h 按2进制计算
-i 查看idone
-P 稍微整齐点的输出
-f 所有分区的文件系统
3.4 查看硬盘和分区情况
lsblk
-f 显示文件系统
cat /proc/partitions
3.5 查看目录大小
du [选项] 目录
-h
-s 空间总和
# 查看/etc大小
du -sh /etc/
3.6 查看操作内核版本
uname -r
3.7 查看操作系统发行版本
cat /etc/redhat-release
cat /etc/os-release
3.8 查看日期和时间
Linux的两种时钟
系统时钟:由Linux内核通过CPU的工作频率来进行的
硬件时钟:主板
相关命令
# 查看系统时间
date
# 查看硬件时间
clock
# 以硬件时间为准,同步操作系统时间
clock -s
# 以操作系统时间为准,同步硬件时间
clock -w
# 设置指定时间
date -s "2023-10-24 15:30:00"
# %F年月日 %T时分秒
date +%F_%T
date "+%Y年 %m月 %d日 星期%u %H:%M:%S %Z"
3.9 查看/修改时区
时区文件来自相关工具:t’z
# 查看系统当前时区
ll /etc/localtime
# 查看所有时区列表
timedatectl list-timezones
# 修改时区为指定时区
timedatectl set-timezone Asia/Shanghai
3.10 查看日历
# 查看今年日历
cal -y
# 查看全年
cal 12
# 查看2020年日历
cal 2020
# 查看2020年10月份日志
cal 10 2020
# 查看1752年9月份日历
cal 9 1752
3.11 关机和重启
# 关机
halt
poweroff
# 重启
-f 强制关机,不调用shutdown
-p 切断电源
reboot
# 关机或重启
shutdown 选项
-r 重启
-h 关机
-c 清除
shutdown 参数
TIME 不指定,默认相当于+1(Centos 7)
now 立刻,相当于+0
+# 几分钟后,例如+3
hh:mm 绝对时间表示,指明具体时间
# 立即重启
shutdown -r now
# 立即关机
shutdown -h now
# 10分钟后关机
shutdown -r +10
# 11点定时关机
shutdown -r 11:00
# 清除设定的操作
shutdown -c
3.12 会话管理
screen
利用screen可以实现会话管理,如:新建会话,共享会话等
# 安装screen来自EPEL源
yum -y install screen
# 创建一个新的会话
screen -S [ screen_name ]
# 加入一个会话
screen -x [ screen_name ]
# 退出并关闭会话
exit
# 剥离当前screen会话
Ctrl+a+d
# 显示所有已经打开的screen会话
screen -ls
# 恢复某screen会话
screen -r [ screen_name ]
3.13 输出信息echo
-E (默认)不支持\解释功能
-n 不自动换行
-e 启用\字符的解释功能
# 若启用命令-e,若字符串中出现一下字符,则特别加以处理,而不会将他当成一般文字输出
\a 发出警报声
\b 退格键
\c 最后不加上换行符号
\e escape,相当于\033
\n 换行且光标移至行首
\r 回车,即光标移至行首,但不换行
\t 插入tab
\\ 插入\字符
# 范例
echo -e "\a"
变量引用
# 变量会替换,弱引用
echo "$VAR_NAME"
# 变量不会被替换,强引用
echo '$VAR_NAME'
3.14 命令行扩展和被括起来的集合
3.14.1 命令行扩展` `和$( )
# 把一个命令的输出打印给另一个命令的参数
$(CMD) 或 `CMD`
# 范例
echo "my IP is $(hostname -I)"
3.14.2 括号扩展:{ }
{ }可以实现打印重复字符串的简化形式
[root@Rocky ~][0]# echo file{1,2,3}
file1 file2 file3
[root@Rocky ~][0]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@Rocky ~][0]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@Rocky ~][130]# echo {10..1}
10 9 8 7 6 5 4 3 2 1
[root@Rocky ~][0]# echo {1..20..2}
1 3 5 7 9 11 13 15 17 19
[root@Rocky ~][0]# echo {000..20..4}
000 004 008 012 016 020
[root@Rocky ~][0]# echo {A..z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@Rocky ~][0]# echo file{1..2}.{txt,log}
file1.txt file1.log file2.txt file2.log
3.14.3 单引号,双引号和反向单引号的区别区别
单引号:变量和命令都不识别,当作普通字符串来处理
双引号:不能识别命令,可以识别变量
反向单引号:变量和命令都识别,并且会将反向单引号的内容当作命令进行执行后,再交给调用反向单引号的命令继续
3.15 tab键补全
tab键可以实现命令及路径补全,提高输入效率,避免出错,功能来自bash-completion软件包
3.15.1 命令补全
- 内部命令:
- 外部命令:bash根据PATH环境变量定义的路径,自左而右再每个路径搜寻以给定命令名命名的文件,第一次找到的命令即为要执行的命令
注意:用户给定的字符串只有一条唯一对应的命令,直接补全,否则,再次tab会给出列表
3.15.2 路径补全
把用户给出的字符串当作路径开头,并在其指定上级目录下搜索以指定的字符串开头的文件名
如果唯一:则直接补全
否则:再次Tab给出列表
3.15.3 双击Tab键
CMD 2Tab 所有子命令或文件补全
string 2Tab 以srting开头命令
/2Tab 显示根目录下一级目录,包括隐藏目录
./2Tab 显示当前目录下子目录,包括隐藏目录
*2Tab 当前目录下子目录,不包括隐藏目录
~2Tab 所有用户列表
$2Tab 所有变量
@2Tab /etc/hosts记录(Centos 7 不支持)
=2Tab 相当于ls -A (Centos 7不支持)
3.16 命令行历史
保存你输入的命令历史。可以用它来重复执行命令
登录shell时,会读取命令历史文件中记录下的命令~/.bash_history
登录进shell后新执行的命令只会记录在缓存中;这些命令会在用户退出时"追加"至命令历史文件中
当用户正常退出时(exit,Ctrl+d),会将内存的命令历史存放对应的历史文件中,默认是~/.bash_history
命令:history
-c 清空命令历史
-d offset:删除历史中指定的第offset
n 显示最近的n条历史
-a 追加本次会话新执行的命令历史列表至历史列表文件
-r 读历史文件附加到历史列表
-w 保存历史列表到指定的历史文件
-n 读历史文件中未度过的行到历史列表
-p 展开历史参数成多行,但不存在历史列表中
-s 展示历史参数成一行,附加在历史列表后
历史命令记录的数量由变量$HISTSIZE
控制
历史文件由变量$HISFILE
控制
命令历史文件记录条数由变量$HISTFILESIZE
控制
命令历史保存格式由变量export HISTTIMEFORMAT="%F %T $(whoami) "
定义
# 修改记录数
sed -i 's|HISTSIZE=1000|HISTSIZE=5000|' /etc/profile
# 配置生效
. /etc/profile
# 生成一条假的命令历史
history -s rm -rf /*
# 修改历史命令格式
export HISTTIMEFORMAT="%F %T "
[15:13:25] [root@Rocky ~][0]# history
1 2023-10-24 15:09:36 echo 1
2 2023-10-24 15:09:36 echo 2
3.17 Bash快捷键
Ctrl + l 清屏
Ctrl + o 执行当前命令,并重新显示本命令
Ctrl + s 阻止屏幕输出,锁定
Ctrl + q 允许屏幕输出,解锁
Ctrl + c 终止命令
Ctrl + z 挂起命令
Ctrl + a 光标移动到命令行首,相当于Home
Ctrl + e 光标移动到命令行尾,相当于End
Ctrl + f 光标向右移动一个字符
Ctrl + b 光标向左移动一个字符
Ctrl + xx 光标在命令行首和光标之间移动
Ctrl + u 从光标出删除至命令行首
Ctrl + k 从光标处删除至命令行尾
Alt + r 删除当前整行
Ctrl + w 从光标处向左删除至单词尾
Alt + d 从光标处向右删除至单词尾
Ctrl + d 删除光标处一个字符
Ctrl + h 删除光标前一个字符
Ctrl + y 将删除的字符粘贴至光标后
Alt + c 从光标处开始向右更改为首字母大写的单词
Alt + u 从光标处开始,将右边一共单词改为大写
Alt + l 从光标处开始,将右边一共单词更改为大写
Ctrl + t 交换光标处和之前的字符位置
Alt + t 交换光标处和之前的单词位置
Alt + # 提示输入指定字符后,重复显示改字符#次
3.18 分析系统启动时的消息
它显示内核在启动过程中发出的消息,包括设备检测、驱动加载、硬件错误等信息。此外,dmesg
也可以用于查看实时内核消息
dmesg
3.19 判断操作系统安装时间
yum history | grep 'System' | awk -F '|' '{print $3}'
3.20 将缓冲区数据写入硬盘
sync
3.21 周期性运行一个命令
-n ? 指定刷新时间间隔
-d 高亮显示其变化
# 监视系统当前运行时间
watch -n 1 date
# 监视网络连接
watch ss -tulpn
4. 获得帮助
4.1 whatis
whatis 使用数据库来显示命令的简短描述,刚安装后不可立即使用,需要制作数据库
# Centos 7以后制作数据库
mandb
# Centos 6之前制作数据库
makewhatis
# 范例
whatis cat 等价于 man -f cat
4.2 查看命令帮助
内部命令:
- help CMD
- man CMD
外部命令或者软件:
- CMD --help 或 CMD -h
- 使用手册(manual)
man CMD
- 信息页
info CMD
- 程序自身帮助文档
- 程序官方文档
- 发行版的官方文档
- 百度,Google
4.3 --help 和 -h 选项
格式说明:
- [] 表示可选项
- CPS或<>表示变化的数据
- …表示一个列表
- x|y|z的意思是"x"或"y"或"z"
- -abc的意思是-a -b -c
- { } 表示分组
4.4 man命令
man 提供命令帮助的文件,手册也存放在/usr/share/man
几乎每个命令都有man的"页面"
中文man帮助需要安装包
- man-pages
- man-pages-zh-CN
man 页面分组为不同的"章节",统称为Linux手册,man 1 man
- 1:用户命令
- 2:系统调用
- 3:C库调用
- 4:设备文件及特殊文件
- 5:配置文件格式
- 6:游戏
- 7:杂项
- 8:管理类命令
- 8:Linux内核API
# Centos 6 之前版 man 的配置文件
/etc/man.config
# Centos 7 之后版 man 的配置文件
/etc/man_db.conf
# Ubuntu man 的配置文件
/etc/manpath.config
查看man手册页:
# 查看帮助
man -f keyword
# 根据上面的章节查询对应帮助
man [ 章节 ] keyword
# 打印man帮助文件的路径
man -w [ 章节 ] keyword
man帮助段落说明
NAME 名称及简要说明
SYNOPSIS 用法格式说明
[ ] 可选内容
< > 必选内容
a|b 二选一
{ } 分组
... 用一个内容可出现多次
DESCRIPTION 详细说明
OPTIONS 选项说明
EXAMPLES 示例
FILES 相关文件
AUTHOR 作者
COPYRUGHT 版本信息
REPORTING BUG bug信息
SEE ALSO 其他帮助查看
4.6 info
man常用于命令参考,GNU工具info 适合通用文档参考
没有参数,列出所有的页面
info页面的结构就像一个网站
每一页分为"节点"
链接节点之前*
info命令格式
info [命令]
导航info页
- 方向键,PgUp,PgDn 导航
- Tab 键移动到下一个链接
- d 显示主题目录
- Home 显示主题首部
- Enter 进入选定链接
- n/p/u/l 进入下/前/上一层/最后一个链接
- s 文字文本搜索
- q 退出info
5. 目录结构和文件类型
5.1 文件目录结构
蓝色–>目录,绿色–>可执行文件,红色–>压缩文件,浅蓝色–>链接文件,灰色–>其他文件
/afs: AFS 根目录,通常用于分布式文件系统 AFS。
/bin: 存放系统启动和修复所需的基本命令,这些命令在单用户模式下也可用。
/boot: 包含引导加载程序、内核和其他引导所需的文件。
/dev: 包含设备文件,用于访问系统硬件设备,如磁盘、终端、键盘等。
/etc: 存放系统全局配置文件,包括网络配置、用户账户信息等。
/home: 用户的主目录通常位于此,每个用户有自己的子目录。
/lib: 包含系统启动和运行时所需的共享库。
/lib64: 64位系统的共享库目录,存放64位库文件。
/media: 用于挂载可移动媒体设备,如光盘、USB驱动器等。
/mnt: 用于手动挂载临时文件系统,通常由管理员使用。
/opt: 用于安装可选的软件包,通常是第三方应用程序。
/proc: 虚拟文件系统,提供关于正在运行的系统进程的信息。
/root: 超级用户(root)的主目录。
/run: 运行时临时文件系统,包含运行时文件和进程信息。
/sbin: 存放系统启动、修复和系统维护的基本命令,通常需要超级用户权限。
/srv: 用于存放服务数据,通常由各种服务程序使用。
/sys: 提供对内核参数和状态的访问,通常用于系统管理。
/tmp: 用于存放临时文件,任何用户都可以写入,但文件可能在系统重启时被删除。
/usr: 存放用户数据,包括用户安装的软件、文档、库等。
/var: 存放可变数据,如日志文件、数据库文件、邮件等。
5.2 应用程序的组成部分
进制程序: /bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
库文件: /lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64
配置文件: /etc,/etc/DIRECTORY,/usr/local/etc
帮助文件: /usr/share/man,/usr/share/doc,/usr/local/share/man,/usr/local/share/doc
5.3 Linux下的文件类型
# 普通文件
- 普通文件是包含数据的一般文件类型。它可以是文本文件、二进制文件或任何其他数据文件。
# 目录
d 目录是文件系统中用于组织和存储其他文件和目录的特殊类型的文件。
# 符号链接文件
l 符号链接(软链接)是指向另一个文件或目录的引用文件。
# 字符设备文件
c 字符设备文件用于与字符设备进行通信,例如终端或串口设备。
# 块设备文件
b 块设备文件用于与块设备进行通信,例如硬盘驱动器或分区。
# 管道文件
p 命名管道(FIFO)用于进程间通信,通常以管道(|)的形式在命令行中使用。
# 套接字
s 套接字文件用于进程间的本地通信,通常在网络编程中使用。
6. 文件操作命令
6.1 显示当前工作目录
-P 显示真实物理路径
-L 显示连接路径(默认)
# 查看当前目录
pwd
6.2 文件路径分割
# 当前工作目录的父目录名称
dirname $(pwd)
# 当前工作目录的基本目录名称
basename $(pwd)
6.3 绝对路径和相对路径
-
绝对路径
绝对路径是从文件系统的根目录(通常表示为
/
)开始的完整路径,以定位文件或目录。它提供了文件或目录的完整位置信息,不依赖于当前工作目录。 -
相对路径
相对路径是相对于当前工作目录的路径,用于定位文件或目录。它不提供文件或目录的完整位置信息,而是相对于当前位置的路径。
6.4 切换目录
# 切换到绝对路径
cd /path/to/directory
# 切换到相对路径
cd relative/path/to/directory
# 切换到上级目录
cd ..
# 切换到上上级目录
cd ../../
# 切换到家目录
cd ~
# 切换到上次访问的目录
cd -
6.5 列出目录类容
ls [选项] [目录]
-a 查看所有文件,包括隐藏文件
-l 列出文件详细信息
-R 递归显示目录中的所有文件和子目录
-ld 目录和符号连接信息
-1 目录分行显示
-d 只列出目录(不递归列出目录内的文件)
-r 倒序
-S 按文件大小,从大到小排序
-Sr 按文件大小,从小到大排序
-t 按文件时间排序,最新的将排在最前面
-tr 按文件时间排序,最旧的将排在最前面
-U 按目录存放顺序显示
-X 按文件后缀排序
-i 显示文件Inode编号
-h 更直观的方式显示文件大小
6.6 查看文件时间属性stat
# 查看文件访问时间
ls -lu filename
# 查看文件权限,元数据更改时间
ls -lc filename
# 查看文件修改时间
ls -l filename
# 查看文件三个时间状态详细状态
stat filename
6.7 确认文件类型和文件类型转换
-b 列出文件辨识结果,不显示文件名称
-f 列出文件中文件名的文件类型
-L 查看对应软链接对应文件的类型
file dir.txt
范例:
# 显示编码列表
iconv -l
# 将windows10上文本默认的编码转换UTF-8
iconv -f gb2312 win.txt -o win2.txt
# 将文本win.txt的编码utf8转换成gb2312,并将转换后的文本保存到win2.txt
iconv -f utf8 -t gb2312 win.txt -o win2.txt
# 将windows的文本格式转换成Linux的文本格式
dos2unix windows.txt
# 将linux的文本格式转化成windows的文本格式
unix2dos Linux.txt
# 自动检测文件编码,将文件file.txt转换成UTF-8
enca -L none -x utf-8 file.txt
6.8 通配符
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件
通配符采才特定的符号,表示特殊含义,此特殊符号称之为元字符
* 匹配零个或多个字符,不匹配隐藏文件
? 匹配任意单个字符
~ 当前用户家目录
~zy 用户zy家目录
~+和. 当前工作目录
~- 前一个工作目录
[0-9] 0-9的所有数字
[a-z] a-z的所有字母
[A-Z] A-Z的所有字母
[wang] 匹配列表中的任意一个字符
[^wang] 匹配列表中的所有字符以外的字符
特殊符号
[:digit:]: 任意数字,相当于0-9
[:1ower:]: 任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]: 任意数字或字母
[:blank:]: 水平空白字符
[:space:]: 水平或垂直空白字符
[:punct:]: 标点符号
[:print:]: 可打印字符
[:cntr1:]: 控制(非打印) 字符
[:graph:]: 图形字符
[:xdigit:]:十六进制字符
6.9 创建文件和刷新文件时间
touch命令可以用来创建空文件或刷新文件的时间
不存在的文件将会创建
存在的文件将会刷新时间,不会清空文件
# 语法
touch [选项] file...
-a 仅改变atime和ctime
-m 仅改变mtime和ctime
-c 如果文件不存在,则不予创建
6.10 复制文件和目录
cp [选项] 源文件 目标
-a 保留链接、文件属性,并复制目录下的所有内容
-p 保留源文件权限,所有者和时间戳信息
-d 不复制源文件,只复制软链接
-i 如果目标存在,覆盖前提示是否覆盖
-n 不覆盖
-r,-R 递归复制目录及内部的所有内容
-v 显示拷贝过程
-f 如果文件不能打开,则尝试删除后再复制
-u 只复制源比目标更新的文件,或者目标没有的文件
-b 目标存在,覆盖之前先备份一次,形式为filename~,只保留一个版本
--backup=numbered 目标存在,覆盖之前先备份加数字后缀,保留多个版本
[root@Rocky ~][0]# cp --backup=numbered /etc/fstab fstab
-rw-r--r-- 1 root root 534 Oct 25 16:52 fstab
-rw-r--r-- 1 root root 534 Oct 25 16:53 fstab.~1~
-rw-r--r-- 1 root root 534 Oct 25 16:54 fstab.~2~
# 复制当前目录所有文件
cp -a . /PATH
# 在文件源路径下备份
cp -a /apps/nginx/sbin/nginx{,.bak}
6.11 移动和重命名文件
mv可以实现文件或目录的移动和改名
# 语法
mv [选项] 源文件或目录 目标文件或目录
mv [选项] 源文件或目录 目标文件或目录
mv [选项] 源文件或目录1 源文件或目录2 源文件或目录3 目标文件或目录
-i 交互式
-f 强制
-b 目标存在,覆盖前先备份
-t 反转,mv [选项] 目标文件或目录 源文件或目录
6.12 批量重命名文件
# 为所有conf文件加上.bak后缀
rename conf 'conf.bak' /PATH/*
# 去掉所有的bak后缀
rename '.bak' '' /PATH/*.bak
6.13 删除文件
rm [选项] 文件路径
-i 交互式删除
-f 强制删除
-r 递归删除
# 删除隐藏文件
rm -rf .[^.]*
# 删除所有数据,包括隐藏文件
rm -rf * .[^.]*
# 变量如果为空,会导致删根
var=''
rm -rf var/*
# 删除特殊文件-f
touch /data/-f
rm -rf /data/-f
rm -rf ./-f
rm -- -f
touch /-f
rm -rf /-f
# 删除特殊文件 ~
touch '~'
rm -f ./~
rm 虽然删除了文件,但是被删除的文件仍然有可能被恢复,在安全要求较高的场景下,可以使用shred安全删除文件
shred [选项] 文件路径
-z 最后一次覆盖添加0,以隐藏覆盖操作
-v 能够显示操作进度
-u 覆盖后截断并删除文件
-n # 指定覆盖文件内容的次数(默认次数是3次)
范例:
#
[root@Rocky /][0]# shred -zvun 5 passwd.txt
shred: passwd.txt: pass 1/6 (random)...
shred: passwd.txt: pass 2/6 (ffffff)...
shred: passwd.txt: pass 3/6 (random)...
shred: passwd.txt: pass 4/6 (000000)...
shred: passwd.txt: pass 5/6 (random)...
shred: passwd.txt: pass 6/6 (000000)...
shred: passwd.txt: removing
shred: passwd.txt: renamed to 000000
shred: 000000: renamed to 00000
shred: 00000: renamed to 0000
shred: 0000: renamed to 000
shred: 000: renamed to 00
shred: 00: renamed to 0
shred: passwd.txt: removed
6.14 清空文件
# 不会删除文件,会将文件内容清空
cat /dev/null > biglog.txt
# 方式二,不通用
> biglog.txt
6.15 目录操作
查看目录
tree 目录名
-d 只显示文件夹
-L # 显示指定层级的数目
创建目录
mkdir [选项] 目录名
-p 递归创建目录
-v 显示创建目录过程
-m 创建目录时直接指定权限
范例:
# 递归创建目录
mkdir -pv /dir1/dir2/dir3
# 创建目录时指定权限
mkdir -m 000 /dir1
删除空目录
rmdir
范例:
rmdir /dir
7. 文件元数据和节点表结构
7.1 inode表结构
每一个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这些元数据是存放在node(index node)表中。node表中有很多条记录组成,第一条记录对应存放了一个文件的元数据信息,第一个node表记录对应的保存了以下信息:
-
文件类型和权限信息:inode 包括文件的类型(普通文件、目录、符号链接等)以及文件的权限信息,如所有者、所属组和其他用户的读、写和执行权限。
-
链接计数(Link Count):链接计数是指有多少个目录项指向同一个inode。当你创建一个硬链接(hard link)时,链接计数会增加。当链接计数为零时,文件系统会回收inode。
-
所有者和所属组:inode 记录了文件或目录的所有者和所属组的标识符(通常是用户和组的ID)。
-
文件大小:inode 包括文件的实际大小,以字节为单位。
-
时间戳:inode 包括三个时间戳:
访问时间(Access Time):文件或目录最后一次被访问的时间。
修改时间(Modification Time):文件或目录内容最后一次被修改的时间。
更改时间(Change Time):inode 元数据最后一次被修改的时间,例如权限、所有者等的更改。
- 数据块指针:inode 包含指向文件数据块的指针。这些指针通常包括直接块、间接块和双重间接块,用于定位和访问文件的实际数据。
直接块:前12个指针直接指向文件的数据块。
间接块:第13个指针指向一个块,该块包含其他指向数据块的指针。
双重间接块:第14个指针指向一个块,该块包含指向包含其他指向数据块的指针的块的指针。
inode 表结构的主要目的是使文件系统能够高效地管理文件和目录的元数据以及定位数据块。它允许文件系统跟踪和组织文件信息,以便操作系统可以正确地访问和管理文件。
7.2 案例:
# 提示空间满No space left on device,但df可以看到空间很多,为什么?
1. 磁盘配额限制:在某些情况下,文件系统上的磁盘配额(disk quotas)可能会被启用,这会限制每个用户或组的可用磁盘空间。即使文件系统总体上有足够的可用空间,但如果用户或组的磁盘配额已用尽,他们将无法创建更多文件。
2. 磁盘碎片:即使 df 显示磁盘有足够的总可用空间,如果文件系统中有太多碎片,可能会导致没有足够的连续空间来存储大文件或扩展现有文件。这可能导致 "No space left on device" 错误。
3. 已删除但仍被进程使用的文件:如果有一个进程正在写入或打开一个已被删除的文件,那么即使文件已被标记为删除,磁盘空间也不会被立即释放。
4. 超出文件系统限制:某些文件系统(特别是旧的文件系统)可能有文件数量或文件大小的限制。如果达到了这些限制,你将无法创建更多文件,即使磁盘空间仍然可用。
5. 文件系统损坏:在极少数情况下,文件系统损坏可能导致 "No space left on device" 错误。文件系统检查工具如fsck 可以用于检查和修复文件系统中的问题
# 提示空间快满了,但df和df -i都可以看到空间很多,为什么?
1. 已删除但仍被进程使用的文件:有时,已删除的文件仍然被正在运行的进程使用。这些文件仍占用磁盘空间,尽管它们不再在文件系统中可见。你可以使用工具如 lsof 来查找这些被删除但仍然被打开的文件,然后将这些文件关闭或终止相关进程。
2. 硬链接的问题:硬链接是多个目录项指向相同的inode。如果你创建了大量的硬链接,这可能会导致 "No space left on device" 的错误,即使文件系统的空间和inode都足够。硬链接不会增加inode使用量,但会增加链接计数。确保你了解硬链接的工作原理,并检查是否有大量的硬链接占用了磁盘空间。
3. 磁盘配额限制:磁盘配额限制用户或组的磁盘使用。即使 df 和 df -i 显示有足够的空间和inode,但如果用户或组的配额已用尽,他们将无法创建更多文件。检查磁盘配额是否对你的用户或组进行了限制。
4. 磁盘文件系统损坏:文件系统损坏可能导致奇怪的问题,包括错误的空间报告。运行文件系统检查工具如 fsck 可能有助于发现和修复问题。
5. 软链接的问题:软链接(符号链接)是特殊类型的文件,通常很小。但如果软链接指向一个不存在的文件,它可能会导致错误。确保软链接的目标文件存在。
6. 写入缓冲区满:在某些情况下,写入数据到磁盘可能由于写入缓冲区满而暂停。这可能导致空间似乎快满了,尽管实际上还有可用的空间。等待一段时间或刷新磁盘缓冲区可能会解决这个问题。
7.3 硬连接
硬连接的本质就是给一个文件起一个新的名称,实质是同一个文件
- 硬链接只能在同一文件系统上创建
- 硬链接不能为目录创建
- 硬链接与原文件共享数据和inode
- 硬链接不占用额外磁盘空间
- 硬链接不改变文件的权限和属性
- 硬链接不能跨越驱动器或分区
- 硬链接不适用于所有文件系统,一些网络文件系统(如NFS)和移动设备文件系统(如FAT)可能不支持硬链接
- 删除文件时,rm命令递减计数的链接,当链接数为0,该文件被删除
# 语法
ln 原文件 目标文件
7.4 软连接
一个符号链接指向另一个文件,就像windows中快捷方式,软链接文件和原文件本质上不是同一个文件
- 软链接可以跨文件系统创建
- 软链接可以引用目录
- 软链接占用额外磁盘空间,通常是几个字节
- 原文件的删除会导致软链接失效
- 软连接如何使用相对路径,是相对原文件的路径,而非相对当前目录
- 软链接可能引起无限递归,即A指向B,B指向A
- 软链接可能引起权限问题:如果软链接引用的文件或目录拥有限制访问的权限,软链接本身可能不起作用。确保软链接和原文件或目录的权限设置允许你访问它们
- 软链接不占用inode,他指向的是另外一个文件的路径,其大小为指向路径字符串的长度,不增加或减少目标inode的计数
# 语法
ln -s 原文件 目标文件
# 查看连接文件指向的原文件
readlink /data/dirlink
7.5 硬连接和软连接的区别
- 本质
硬链接:本质是同一个文件
软连接:本质不上同一个文件
- 跨设备
硬链接:不支持
软连接:支持
-
inode
硬链接:相同
软连接:不通
-
链接数
硬链接:创建新的硬连接,链接数会增加,删除硬链接,链接数减少
软连接:创建或删除,链接数不会变化
- 文件夹
硬链接:不支持
软连接:支持
- 相对路径
硬链接:原始文件相对路径是相对于当前工作目录
软连接:原始文件的相对路径是相对于链接文件的相对路径
-
删除原文件
硬链接:只是链接数减一,但链接文件的访问不受影响
软连接:链接文件将无法访问
-
文件类型
硬链接:和原文件相同
软连接:链接文件,和原文件无关
8. 标准IO重定向和管道
8.1 标准输入和输出
Linux给程序提供三种 I /O 设备
- 标准输入(STDIN) -0 默认接受来自终端窗口的输入
- 标准输出(STDOUT) -1 默认输出到终端窗口
- 标准错误(STDERR) -2 默认输出到终端窗口
文件描述符
[root@Rocky ~][0]# ll /dev/std*
lrwxrwxrwx 1 root root 15 Oct 18 20:45 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Oct 18 20:45 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Oct 18 20:45 /dev/stdout -> /proc/self/fd/1
# 查看每个进程的的I/O设备
ll /proc/程序的PID/fd/*
# 查看当前终端的I/O设备
[root@Rocky ~][0]# ll /proc/self/fd
total 0
lrwx------ 1 root root 64 Oct 26 17:49 0 -> /dev/pts/0
lrwx------ 1 root root 64 Oct 26 17:49 1 -> /dev/pts/0
lrwx------ 1 root root 64 Oct 26 17:49 2 -> /dev/pts/0
lr-x------ 1 root root 64 Oct 26 17:49 3 -> /proc/55244/fd
8.2 标准输出重定向
stdout和stderr可以被重定向到指定文件,而非默认的当前终端
# 语法
命令 操作符号 文件名
8.2.1 输入输出重定向
1> 或 > 把标准输出重定向到文件
>| 强制覆盖
2> 把标准错误(也有可能是警告或提示信息)重定向到文件
&> 把所有输出重定向到文件
2>&1 把标准错误输出重定向为标准输出
1>&2 将标准输出重定向为标准错误
# 将标准输出和标准错误分别重定向到两个文件
ls /xxx/ /root/ 1> /data/log_1 2> /data/log_2
8.2.2 追加
>> 可以在原有内容基础上,追加内容
>> 追加标准输出重定向至文件
2>> 追加标准错误重定向至文件
8.3.3 合并标准输出和错误输出为同一个数据流进行重定向
&> 覆盖重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1
COMMAND >> /path/to/file.out 2>&1
8.4.多个命令输出结果重定向到一个文件
(echo 123;date) >> file.txt
{ echo 123;date;} >> file.txt
8.3 标准输入重定向
8.3.1单行重定向
# 将文件重定向给cat,等价于命令cat /etc/fstab
cat < /etc/fstab
# 单行重定向
cat > cat.log
hello!
cat cat.log
hello!
8.3.2 多行重定向
多行重定向提示符变量
[root@Rocky ~][0]# echo $PS2
>
使用"<<终止词”命令从键盘把多行重导向给STDIN,直到终止词位置之前的所有文本都发送给STDIN,有时被称为就地文本 (here documents)
其中终止词可以是任何一个或多个符号,比如: !,@,$,EOF (End of File)等,其中EOF比较常用
# 多行重定向
cat > file.txt <<EOF
1
2
EOF
# 追加
cat >> file.txt <<EOF
3
4
EOF
# 允许EOF使用tab键缩进
cat >> file.txt <<-EOF
3
4
EOF
8.3.3 tee命令
利用tee命令可以重定向到多个目标
-a 追加
# 重定向到文件且终端输出
echo 'FKC' | tee /data/test.log
# 对标准输出多次处理
echo 'FKC' | tee /data/test.log | tr 'A-Z' 'a-z' > /data/test2.log
9. 用户、组管理
9.1 Linux安全模型
9.1.1 用户
Linux中每个用户是通过User ID(UID)来进行唯一标识
- 管理员:root,0
- 普通用户:1-60000 自动分配
系统用户:1-499(Centos 6之前),1-999(Centos 7之后),对守护进程获取资源进行权限分配
登录用户:500+(Centos 6之前),1000+(Centos 7之后),给用户使用
9.1.2 用户组
Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID)来唯一标识
- 管理员组:root,0
- 普通组:
系统组:1-499(Centos 6之前),1-999(Centos 7之后),对守护进程获取资源进行权限分配
普通组:500+(Centos 6之前),1000+(Centos 7之后),给用户使用
9.1.3 用户和组的关系
- **用户的主要组:**用户必须属于一个且只有一个主组,默认创建用户时会自动创建和用户名同名的组,作为用户的主要组,由于此组中只有一个用户,又称为私有组
- **用户的附加组:**一个用户可以属于零个或多个辅助组
9.1.4 安全上下文
Linux安全上下文Context: 运行中的程序,即进程process),以进程发起者的身份运行,进程所能够访问资源的权限取决于进程的运行者的身份
比如:分别以root和wang 的身份运行/bin/cat /etc/shadow,得到的结果是不同的,资源能否能被访问,是由运行者的身份决定,非程序本身
9.2 用户和组的配置文件
9.2.1 /etc/passwd
用户及其属性信息
# 查看帮助man 5 passwd
root:x:0:0:root:/root:/bin/bash
name:password:UID:GID:描述信息:家目录:shell
9.2.2 /etc/shadow
用户密码及相关属性
9.2.3 /etc/group
组及其属性信息
# 查看帮助man 5 group
root:x:0:
name:group_passwd:GID:组成员
9.2.4 /etc/gshadow
组密码及其相关属性
root:::
root::组的管理员:组成员
9.3 用户管理命令
9.3.1 文件检查
vipw 编辑 /etc/passwd 文件
vigr 用于编辑 /etc/group 文件
pwck 用于检查 /etc/passwd 文件的语法和完整性
grock 用于检查 /etc/group 文件的语法和完整性
9.3.2 创建用户
useradd
-u 指定UID
-o 配合-u选项,不检查UID的唯一性
-g 指定用户所属基本组,可为组名,也可以是GID
-c 用户描述信息描述信息
-d 指定用户家目录
-s 指定使用shell
/sbin/nologin
/bin/bash
/usr/sbin/nologin(Ubuntu)
/bin/false
-G 为用户指明附加组,组须事先存在
-N 不创建私用组作为主组,使用users组做主组
-r 创建的账户是系统账户
-m 创建家目录,用于系统用户
-M 不创建家目录,用于非系统用户
# 范例
useradd -r -s /sbin/nologin -u 354 -c "Nginx账户" nginx
9.3.3 批量创建用户
newusers passwd 格式文件
9.3.4 修改用户属性
usermod
-u 新的UID
-g 新的主组
-G 新附加的组,原来的组会被覆盖,若保留原有,则要同时使用-a选项
-s 新的shell类型
-c 新的注释信息
-d 新的家目录不会自动创建;若要创建新的目录并迁移原家目录,同时使用-m选项
-l 新的账户名
-L 在/etc/shadow密码栏增加!,即锁定账户
-U 将/etc/shadow密码栏!拿掉,即解锁账户
-e YYYY-MM-DD指名用户账户过期日期
-f 设置账户宽限期
9.3.5 修改账户密码
passwd
-d 删除指定用户密码
-l 锁定用户
-u 解锁用户
-e 强制用户下次登录修改密码
-f 强制操作
-n 指定密码最短使用期限
-x 指定密码最大使用期限
-w 提前多少天开始警告
-i 宽限期
-stdin 从标准输入接受用户密码
# 非交互式修改账户密码(Centos 和 Ubuntu)
echo username:passwd | chpasswd
vim passwd.txt
zy:123
cat passwd.txt | chpasswd
# 非交互式修改账户密码(Centos)
echo 123 | passwd --stdin root
# 通用修改用户密码(Centos 和 Ubuntu)
echo -e '123456\n123456' | passwd root
9.3.6 修改用户密码策略
chage
9.3.7 默认账户创建规则
账户创建默认规则由文件/etc/default/useradd 指定
[root@rocky9-node2 ~][1]# cat /etc/default/useradd
# useradd defaults file
GROUP=100 组ID
HOME=/home 家目录
INACTIVE=-1 对应用户密码过期后的宽限期
EXPIRE= 用户账号有效期
SHELL=/bin/bash 默认shell类型
SKEL=/etc/skel 新建账号会从该目录获取默认文件列表
CREATE_MAIL_SPOOL=yes 默认是否启用邮箱
# 范例:还原用户家目录文件
cp -r /etc/skel/. /home/username
cp -r /etc/skel /home/username
9.3.8 默认账户口令策略
账户口令策略默认规则由文件/etc/login.defs 定义
[root@rocky9-node2 ~][148]# cat /etc/login.defs | grep '^[^#]'
MAIL_DIR /var/spool/mail
UMASK 022
HOME_MODE 0700
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_WARN_AGE 7
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
SUB_UID_MIN 100000
SUB_UID_MAX 600100000
SUB_UID_COUNT 65536
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
SUB_GID_MIN 100000
SUB_GID_MAX 600100000
SUB_GID_COUNT 65536
ENCRYPT_METHOD SHA512
USERGROUPS_ENAB yes
CREATE_HOME yes
HMAC_CRYPTO_ALGO SHA512
9.3.9 删除用户
userdel
-f 强制
-r 删除家目录和邮箱
9.3.10 查看用户相关的ID信息
id
-u 显示UID
-g 显示GID
-G 显示用户所属组的ID
-n 显示名称,需配合ugG使用
# 范例
[root@rocky9-node2 ~][1]# id -un
root
9.3.11 切换用户
su Username:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
su - Username:登录式切换,会读取目标用户配置文件,切换至家目录,完全切换
su
-l 相当于su - Username
# 以指定身份执行命令
su - username -c 'COMMAND'
9.3.12 用户其他相关指令
9.4 组管理命令
9.4.1 创建组
groupadd [选项] 组名
-g 指定组的GID
-f 创建系统组,Centos 6之前:ID<500,Cetnos 7以后:ID<1000
# 范例
group add -g 48 -r nginx
9.4.2 修改组
groupmod [选项] 组名
-n 新名字
-g 新的GID
# 修改组名nginx为tomcat
groupmod -n tomcat nginx
9.4.3 删除组
groupdel [选项] 组名
-f 强制删除,即使用户的主组也强制删除
# 范例
groupdel tomcat
9.4.4 查看组信息
# 查看用户属于那个组
groups username
# 查看组里有那些用户
10. 文件权限管理
10.1 修改文件所有者
chown命令可以修改文件的属主,也可以修改文件属组
chown [选项] 新所有者:新所属组 文件或目录
-R 递归修改文件夹下权限
# 只修改文件所有者
chown nginx /etc/nginx.conf
# 只修改文件所属组
chown :nginx /etc/nginx.conf
# 修改文件所有者和所属组
chown nginx:nginx /etc/nginx.conf
10.2 修改文件所属组
chgrp [选项] 新组 文件或目录
-R 递归修改文件夹下权限
# 范例
chgrp nginx /etc/nginx.conf
10.3 文件的权限说明
文件的权限主要针对三类对象进行定义
每个文件针对每类访问者都定义了三种权限
owner 所属主,u
group 所属组,g
other 其他人,o
每个文件对每类访问者都定义了三种常用权限
r 可读
w 可写
x 执行
# 对于文件的权限
r 可使用文件查看工具获取其内容
w 可修改其内容
x 可以执行此文件,(此文件内容必须是可执行的)
# 对于目录的权限
r 可以使用ls查看此目录中文件列表
w 可在此目录中创建文件,也可以删除此目录中的文件,而和被删除文件的权限无关
x 可以使用ls -l查看此目录中文件元数据,必须配合r权限,可以cd进入此目录,属于目录可访问的最小权限
X 只给目录x权限,不给无执行权限的文件x权限
操作動作 /dir1 /dir1/file1 /dir2 重點
讀取 file1 內容 x r - 要能夠進入 /dir1 才能讀到裡面的文件資料!
修改 file1 內容 x rw - 能夠進入 /dir1 且修改 file1 才行!
執行 file1 內容 x rx - 能夠進入 /dir1 且 file1 能運作才行!
刪除 file1 檔案 wx - - 能夠進入 /dir1 具有目錄修改的權限即可!
file1 複製到 /dir2 x r wx 要能夠讀 file1 且能夠修改 /dir2 內的資料
10.4 修改文件权限
注:用户的最终权限是从左往右匹配,即,所有者,所属组,其他人,一旦匹配权限生效,不再往又查看其权限
chmod [选项] 文件或目录
-R 递归修改权限
修改某一类用户的所有权限
u= g= o= ug= a= u= g=
修改指定一类用户某个或某个权限
u+ u- g+ g- o+ o- a+ a- + -
# 范例
chmod u+rwx,g-r,o-rx /etc/my.cnf
# 范例
chmod g+rwx /etc/my.cnf
# 范例
chmod u=rw,g=r,o= /etc/my.cnf
-rw-r-----. 1 root root 534 Jun 13 11:12 /etc/my.cnf
数字表示法
r 4
w 2
x 1
10.5 默认权限umask
umask的值可以用来保留在创建文件权限
- 新建文件的默认权限:666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
- 新建目录的默认权限:777-umask
- 默认022
# 修改umask权限为777
umask 777
# 永久修改umask权限
echo 'umask 777' >> ~/.bashrc
source ~/.bashrc
# 一次性使用umask权限,不影响当前环境
( umansk 777;touch nginx.log )
10.6 文件的特殊权限
10.6.1 SUID
当 s 权限处于所有者位置时,代表任何用户都可以使用所有者权限来执行这个二进制文件。
# 添加SUID权限
chmod u+s /etc/passwd
# 清除SUID权限
chmod u-s /etc/passwd
10.6.2 SGID
当 s 权限处于所属组位置时,代表任何用户都可以使用所属组权限来执行这个二进制文件。
当 s 权限处于文件夹的所属组位置时,该文件夹下所有文件所属组会继承父文件夹所属组。
# 添加SGID权限
chmod g+s /etc/passwd
# 清除SGID权限
chmod g-s /etc/passwd
10.6.3 STICKY
当其他人拥有 t 权限时,确保任何用户都可以在其中创建文件,但不能删除其他用户的文件。
# 添加STICKY权限
chmod +t /etc/passwd
# 清除STICKY权限
chmod -t /etc/passwd
10.7 文件的隐藏权限
chattr
i 禁止对文件进行修改、删除、重命名等操作。
a 只能向文件追加数据,不允许修改或删除文件内容。
c 用于启用文件系统的压缩功能。
s 删除文件时覆盖其内容,以确保无法恢复。
u 防止文件被删除。
# 查看文件隐藏权限
lsattr /etc/my.cnf
# 限制文件不允许删除
chattr +i /etc/my.cnf
# 清除文件隐藏权限
chattr -i /etc/my.cnf
10.8 访问控制列表ACL
ACL权限功能:实现灵活的权限管理,除了文件的所有者,所属组和其他人,可以对更多的用户设置权限
# 添加/清除ACL权限
setfacl -m u:zhao:rwx /file/file.txt 修改ACL用户权限
setfacl -m g:zhao:rwx /file/file.txt 修改ACL组权限
setfacl -Rm u:zhao:rwx /1 修递归修改ACL权限
setfacl -Rb u:zhao:rwx /1 递归删除所有用户和组ACL权限
setfacl -x u:zhao /file/file.txt 删除单个用户ACL权限
setfacl -x g:zhao /file/file.txt 删除单个组的ACL权限
setfacl -Rx u:zhao /file/ 递归删除单个用户ACL权限
setfacl -Rx g:zhao /file/ 递归删除单个组的ACL权限
setfacl -b /file/file.txt 清除所有用户和组的ACL权限
setfacl -R -b /file/ 递归清除文件夹下所有文件用户和组的ACL权限
# 查看ACL权限
getfacl /file/file.txt
getfacl -R /file/file.txt 递归查看
# 备份ACL权限
getfacl -R /file/file.txt > acl.txt
# 还原备份的ACL权限
setfacl -R --set-file=acl.txt /file/file.txt
mask:确定在 ACL 中指定的用户、用户组权限和标准文件权限之间的最终权限。
mask:不影响当前文件所有者,和其他人的权限,但会影响通过 ACL 指定的用户或用户组的权限。
setfacl -m mask::rwx /file/file.txt
setfacl -m mask::rx /file/file.txt
11. vim编辑器
11.1 插入模式
命令模式——>插入模式
i 在光标所在处输入
l 在光标所在行的行首输入
a 在光标所在处后面输入
A 在当前光标所在行的行尾输入
o 在当前光标所在行的下方打开一个新行
O 在当前光标所在行的上方打开一个新行
11.2 扩展命令
扩展命令模式基本命令
w 保存
wq 保存退出
x 写入并退出
X 加密
q 退出
q! 强制退出
r fiename 读文件内容到当前文件
w filename 将当前文件写入另外一个文件
!hostname 执行命令
r!hostname 将命令输出写到当前文件
set number 显示行号
%d 清空文件
11.3 定制vim特性
配置文件:永久有效
全局:/etc/vimrc
个人:~/.vimrc
显示行号:set nu
取消行号:set nonu
忽略字符大小写:set ic
不忽略:set noic
自动缩进:set ai
禁用:set noai
复制保留格式:set paste
禁用:set nopaste
显示tab和换行符^|和$显示:set list
禁用:set nolist
高亮搜索:set hlsearch
禁用:set nohlsearch
语法高亮:syntax on
禁用:syntax off
文本格式windows:set fileformat=dos
启用unix格式:set fileformat=unix
简写 set ff=dos|unix
设置文本宽度
set textwidth=65
set wrapmargin=15
设置光标标识线:set cul
禁用:set nocursorline
加密:set key=passwd
禁用:set key=
设置tab建字符数量:set tabstop=4
帮助:set all
11.4 命令模式
ZZ 保存退出
ZQ 不保存退出
H 光标出现在当前页面首行开头
L 光标出现在当前页面尾行开头
M 光标出现在当前页中间行开头
zt 将光标所在行前移到屏幕顶端
zz 将光标所在行移到屏幕中间
zb 将光标所在行移动到屏幕底端
0 数字0将光标移动到当前行首
$ 将光标移动到当前行尾
G 移动到文本最后一行或者
:10 将光标移动到第10行
100G 移动到文本第100行
R 替换模式
d0 删除到行首
d$ 删除到行尾
D 从光标删除到行尾
3yy 复制光标行到和后两行
p 粘贴
u 返回上一次操作
V 整行选中
v 光标选中
11.5 宏
qa 录制宏,a为宏的名称
q 停止录制宏
@a 执行宏a
@ 重新执行上次执行的宏
11.6 编辑二进制文件
# 以二进制方式打开文件
vim -b /bin/cat
# 扩展命令模式下,利用xxd命令转换为可读的十六进制
:%!xxd
# 切换至插入模式下,编辑二进制文件
# 切换至扩展命令模式下,利用xxd命令转换回二进制
:%!xxd -r
# 保存退出
11.7 GUI界面工具 gedit
gedit /etc/hosts
11.8 搜索
/test 点击Enter # 搜索test
n # 查找时点n查找下一个
N # 查找时点N查找上一个
11.9 常用操作
1 去除多行开头的#
1. ctrl+v选择所有#
2. 点击x删除
2 删除多行
1. ctrl+v或者shift+v选择多行
2. dd
3 清空文件
ggdG
4 行首批量添加#/或者行首批量添加十个空格
1. ctrl+v或者shift+v选择多行
2. shift + i
3. 输入'#'号或者十个空格
4. 点击Esc键两次
12. 文本工具
12.1 cat 查看文件内容
cat [选项] 文件
-E 显示行结束符
-A 显示所有控制符
-n 对每一行显示行号
-b 非空行才添加编号
-s 压缩连续的空行成一行
nl
# 范例文件反显
[root@rocky9 ~][1]# tac /etc/a.log
3
2
1
12.1 rev 字符翻转
[root@rocky9 ~][0]# echo '123' | rev
321
[root@rocky9-node2 ~][0]# rev /etc/a.log
321
cba
12.2 tr 字符替换
-c 取第一字符集的补集
-d 删除符合第一字符集的字符
-s 把连续重复的字符以单独一个字符表示,即去重
-t 将第一字符集对应字符转化为第二字符集对应的字符
[:digit:]: 任意数字,相当于0-9
[:1ower:]: 任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]: 任意数字或字母
[:blank:]: 水平空白字符
[:space:]: 水平或垂直空白字符
[:punct:]: 标点符号
[:print:]: 可打印字符
[:cntr1:]: 控制(非打印) 字符
[:graph:]: 图形字符
[:xdigit:]:十六进制字符
# 将小写字母替换成大写字母
echo abc | tr '[:lower:]' '[:upper:]'
输出 ABC
# 取补集,即取反,删除除了123的
echo abc123 | tr -cd '123'
输出 123
# 删除第一字符集匹配到的字符
echo abc | tr -d 'ac'
输出 b
# 将相邻的连续重复字符去重
echo aaa | tr -s 'a'
输出 a
# 取随机密码
tr -dc a-zA-Z0-9 < /dev/urandom | echo $(head -c 50)
12.3 查看非文本文件内容
12.3.1 hexdump
hexdump -C -n 512 /dev/sda
12.3.2 od
12.3.3 xxd
12.4 more 分页查看文件内容
more /var/log/secure
12.5 less 分页查看文件内容
less /var/log/secure
空格键 滚动一页
回车键 滚动一行
b 向上翻一页
d 向后翻半页
/ 向下搜索"字符串"的功能
? 向上搜索"字符串"的功能
n 重复前一个搜索(与 / 或 ? 有关)
N 反向重复前一个搜索(与 / 或 ? 有关)
12.6 head显示文件头部行
head [选项] 文件
-c ? 指定输出前?个字节
-n ? 指定输出前?行
12.7 tail 显示文件尾部行
tail [选项] 文件
-f 追踪文件最新内容,追踪的是文件描述符
-c ? 指定输出尾?个字节
-n 指定输出的行数
-F 追踪文件最新内容,追踪的是文件名
# 追踪最后输出的100行
tail -n 100 -f /var/log/secure
# 查看最后10行
tail /var/log/secure
12.8 cut 按列截取文本
cut [选项] 文件
-d 指明分隔符,默认tab
-f ? 取第?个字段
?,? 离散的多个字段,例如1,3,6
?-? 连续的多个字段,例如1-6
1-3,7 混合使用
-c 按字符切割
# 范例
[root@rocky9 ~][0]# cut -d: -f1-3 /etc/passwd
root:x:0
bin:x:1
# 范例
[root@rocky9 ~][0]# df -h | tr -s ' ' | cut -d ' ' -f5
Use%
0%
0%
1%
8%
7%
0%
0%
# 范例
[root@rocky9 ~][127]# ifconfig eth0 | head -n 2 | tail -n 1 | tr -s ' ' | cut -d ' ' -f3
172.31.206.2
12.9 paste 合并多个文件同行
paste [选项] 文件1 文件2
-d 指定分隔符
-s 相当于将一个文件追加到另一个文件后面
[root@rocky9 ~][0]# echo 123 > 1.txt;echo 456 > 2.txt;paste 1.txt 2.txt
123 456
[root@rocky9 ~][0]# paste -s 1.txt 2.txt
123
456
12.10 wc 文本数据统计
wl [选项] 文件
-l 只统计行数
-w 只统计单词总数
-c 只统计字节总数
-m 只统计字符总数
-L 显示文件中最长行的长度
# 范例
[root@rocky9 ~][0]# wc /etc/passwd
30 68 1609 /etc/passwd
行数 单词数 字节数
12.11 sort 排序
sort [选项] 文件
-rn 反向数字排序。(从大到小)
-n 按照数字顺序排序。(从小到大)
-u 去重,仅保留唯一行。
-t 指定字段分隔符。
-k 指定要排序的字段。
-R 随机排序
-f 忽略字符串中的字符大小写
12.12 uniq 去重
uniq [选项] 文件
-c 显示每行出现的次数。
-d 仅显示重复行。
-u 仅显示不重复的行。
# 取文件共同的行(文件自身不能有重复的行)
cat 1.txt 2.txt | sort | uniq -d
# 取文件不同的行
cat 1.txt 2.txt | sort | uniq -u
12.13 diff 文件比较
diff命令可以比较两个文件之间的区别
diff file.txt file2.txt
12.14 patch 文件比较
patch file.txt file2.txt
12.15 cmp 比较两个二进制文件的不同
[root@rocky9 ~][1]# cmp /bin/dir /bin/ls
/bin/dir /bin/ls differ: byte 25, line 1
13. 文本处理工具和正则表达式
13.1 基本正则表达式
13.1.1 字符匹配
. 匹配任意单个字符,可以是一个汉字
[ ] 匹配指定范围内的任意单个字符,示例:[0-9a-b@.]
[^] 匹配指定范围外的任意单个字符,示例:[^a]
[:alnum:] 表示字母和数字
[:alpha:] 代表任何英文大小写字符,相当于 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空白和制表符)
[:space:] 水平和垂直的空白字符
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印的字符
[:punct:] 标点符号
13.1.2 匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括0次,贪婪模式
.* 匹配任意长度任意字符
\? 匹配其前面的字符0或1次,即可有可无
\+ 匹配其前面的字符至少1次,即 ≥1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面字符至少m次,最多n次
\{,n\} 匹配前面字符最多n次
\{n,\} 匹配前面的字符至少n次
13.1.3 位置锚定
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或者 \b 词首锚定,用于单词模式的左侧
\> 或者 \b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词
13.1.4 分组
使用( )将多个字符捆绑在一起当作一个整体来处理
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部变量中,这些变量的命名方式为:\1,\2,\3 …
\1 表示从左侧的第一个左括号以及与之匹配的右括号之间模式所匹配到的所有字符
13.1.5 或者
a\|b a或者b
c\|cat c或者cat
\(C\|c\)at Cat或者cat
# 排除空行和#号开头的行
grep -Ev '^#|^$' /etc/fstab
grep '^[^#]' /etc/fstab
13.2 扩展正则表达式
13.2.1 字符匹配
. 匹配任意单个字符,可以是一个汉字
[ ] 匹配指定范围内的任意单个字符,示例:[0-9a-b@.]
[^] 匹配指定范围外的任意单个字符,示例:[^a]
[:alnum:] 表示字母和数字
[:alpha:] 代表任何英文大小写字符,相当于 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空白和制表符)
[:space:] 水平和垂直的空白字符
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印的字符
[:punct:] 标点符号
13.2.2 匹配次数
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
13.2.3 位置锚定
^ 行首
$ 行尾
\<,\b 语首
\>,\b 语尾
13.2.4 分组
( )分组
后向引用:\1,\2,...
13.2.5 或者
| 或者
a|b a或b
C|cat C或cat
(C|c)cat Cat或cat
13.2 检验数字的表达式
1. 数字:^[0-9]*$
2. n位的数字:^\d{n}$
3. 至少n位的数字:^\d{n,}$
4. m-n位的数字:^\d{m,n}$
5. 零和非零开头的数字:^(0|[1-9][0-9]*)$
6. 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
7. 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
8. 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
9. 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
10. 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
11. 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
12. 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
13. 非负整数:^\d+$ 或 ^[1-9]\d*|0$
14. 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15. 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
16. 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
17. 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
18. 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
19. 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
13.3 检验字符的表达式
1. 汉字:^[\u4e00-\u9fa5]{0,}$
2. 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3. 长度为3-20的所有字符:^.{3,20}$
4. 由26个英文字母组成的字符串:^[A-Za-z]+$
5. 由26个大写英文字母组成的字符串:^[A-Z]+$
6. 由26个小写英文字母组成的字符串:^[a-z]+$
7. 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
8. 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
9. 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
10. 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11. 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 12 禁止输入含有~的字符:[^~\x22]+
13.4 特殊需求表达式
1. Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2. 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3. InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
4. 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
5. 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
6. 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
7. 身份证号(15位、18位数字):^\d{15}|\d{18}$
8. 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
9. 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
10. 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
11. 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
12. 日期格式:^\d{4}-\d{1,2}-\d{1,2}
13. 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
14. 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
15. 钱的输入格式:
16. 1.有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
17. 2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
18. 3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
19. 4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
20. 5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
21. 6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
22. 7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
23 8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
24. 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
25. xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
26. 中文字符的正则表达式:[\u4e00-\u9fa5]
27. 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
28. 空格的正则表达式:\s*(可以用来删除空格)
29. HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
30. 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
31. 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
32. 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
33. IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
34. IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
13.2 grep
全局的搜索正则表达式并打印出行
grep [选项] PATTERN [文件]
#常见选项
--color=auto 对匹配到的文本进行着色显示
-m ? 匹配到?行后停止
-v 对不匹配的进行显示
-i 忽略大小写
-n 显示匹配行的行号
-c 统计匹配次数
-o 仅显示匹配的字符
-q 静默模式,不输出任何信息
-A ? 显示匹配行和匹配行后?行
-B ? 显示匹配行和匹配行前?行
-C ? 显示匹配行和匹配行前后?行
-e 或,匹配模式1或者模式2
-w 匹配整个单词,除了字母,下划线均可以作为分隔符
-E 使用扩展正则表达式
-F 不使用正则表达式
-f 使用文件内容做为模式,效果和-e类似
-r 递归目录,但是不处理软链接
-R 递归目录,但处理软连接
# 匹配?行后停止匹配
grep -m 1 root /etc/passwd
# 显示行号
grep -n root /etc/passwd
# 统计匹配到的行数
grep -c root /etc/passwd
# 只显示匹配到的字符串自身
grep -o root /etc/passwd
# 静默模式,找到或者找不到都不输出
grep -q root /etc/passwd
# 匹配多个条件,或模式
grep -e root -e bash /etc/passwd
# 只匹配整个单词,而不是字符
grep -w /sbin/nologin /etc/passwd
# 取IP地址
ip addr show dev eth0 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -n 1
13.3 sed
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间 (Pattern Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快。
13.3.1 sed 指令选项
sed [选项] '地址...' 文件
-n 不输出模式空间内容到屏幕,即关闭自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
-E 使用扩展正则表达式
-r 使用扩展正则表达式
-i.bak 修改文件,并备份一个bak文件
-p 打印当前模式空间内容,追加到默认输出之后
-d 删除模式空间匹配的行,并立即开启下一轮循环
-Ip 忽略大小写输出
a 在指定行后面追加文本,支持使用\n实现多行追加
i 在行前面插入文本
c 替换行为单行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 读取指定文件中的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配取反处理
s/pattern/string/ 查找替换,支持使用其他分隔符,可以是其他形式:s###,s@@@
替换修饰符号
g 全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
i 忽略大小写
13.3.2 sed 地址格式
? 指定的行号,$表示最后一行
/pat/ 被此处所正则比表达式能够匹配到的每一行
?,? 从?行到第?行
?,+? 从?行到+?行
/pat1/,/pat2/
?,/pat/
1~2 奇数行
2~2 偶数行
13.3.3 sed 打印行
# 打印第2行
sed -n '2p' /etc/passwd
# 打印第2行和第6行
sed -n -e '2p' -e '6p' /etc/passwd
# 打印第2行到第6行
sed -n '2,6p' /etc/passwd
# 打印模式匹配到的行,忽略大小写
sed -n '/^P.*D$/Ip' /etc/passwd
13.3.4 sed 删除行
# 清空文件
sed -i 'd' /etc/passwd
# 删除第2行
sed -i '2d' /etc/passwd
# 删除包含root的行
sed -i '/root/d' /etc/passwd
# 删除不包含root的行
sed -i '/root/!d' /etc/passwd
# 删除被模式匹配到的行
sed -Ei '/^root.*bash$/d' /etc/passwd
# 删除奇数行
sed -i '1~2d' /etc/passwd
# 删除偶数行
sed -i '2~2d' /etc/passwd
# 删除第1行到往后的3行,即删除前4行
sed -i '1,+3d' /etc/passwd
13.3.5 sed 添加行
# 在第二行后面追加PASSWD
sed -i '2aPASSWD' /etc/passwd
# 在第二行前面追加PASSWD
sed -i '2iPASSWD' /etc/passwd
# 在第二行前面追加多行
sed -i '2iPASSWD\nPASSWD' /etc/passwd
# 在第二行前面追加多行并填充空格,第一行的空格需要用\专转义
sed -i '2i\ PASSWD\n PASSWD' /etc/passwd
# 在被模式匹配到的行后面追加passwd
sed -i '/^PASSWD$/ipasswd' /etc/passwd
13.3.6 sed 替换行
# 替换第2行
sed -i '2s|.*|PASSWD|' /etc/passwd
# 替换第2行
sed -i '2cPASSWD' /etc/passwd
# 替换指定的行
sed -i 's|PASSWD|passwd|' /etc/passwd
# 替换被匹配到的行
sed -i 's|^P.*D$|passwd|' /etc/passwd
13.3.7 sed 额外案例
# 取IP
ifconfig ens33 | sed -nr "2s|[^0-9]+([0-9.]+).*|\1|p"
ifconfig ens33 | sed -nr "2s|^[^0-9]+([0-9.]+).*$|\1|p"
ifconfig ens33 | sed -nr -e '2s|^.*inet ||p' | sed -n 's| netmask.*||p'
ifconfig ens33 | sed -nr -e '2s|^.*inet ||;s| netmask.*||p'
ifconfig ens33 | sed -rn '2s|(.*inet )([0-9].*)( netmask.*)|\2|p'
# 取基名
echo '/etc/sysconfig/network-scripts' | sed -rn 's|(.*)/([^/]+)/?|\2|p'
# 取目录名
echo '/etc/sysconfig/network-scripts' | sed -rn 's|(.*)/([^/]+)/?|\1|p'
# 匹配的行开头增加#号
sed -E '/^UUID/s/(UUID.*$)/#\1/' /etc/fstab
# 匹配的行结尾增加#号
sed -E '/^UUID/s/(UUID.*$)/\1#/' /etc/fstab
# 匹配的行中间加#
sed -E '/default/s/(default)/#\1/' etc/fstab
# 行尾追加参数
sed -Ei.bak '/^GRUB_CMDLINE_LINUX/s/(GRUB.*)"/\1 net.ifnames=0 biosdevname=0"/' /etc/default/grub
# sed引用变量,使用双引号
NAME=root ; sed -i "s|$NAME|123|g" /etc/passwd
13.3.8 sed 高级用法
P 打印模式空间开端至\n内容,并追加到默认输出之前
h 把模式空间中的内容覆盖至保持空间中
H 把模式空间中的内容追加至保持空间中
g 从保持空间取出数据覆盖至模式空间
G 从保持空间取出内容追加至模式空间
x 把模式空间中的内容与保持空间中的内容进行互换
n 读取匹配到的行的下一行覆盖至模式空间
N 读取匹配到的行的下一行追加至模式空间
d 删除模式空间中行
D 如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行
而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
13.4 awk
13.4.1 awk 工作原理
- 处理BEGIN动作
- 逐行处理
- 处理END动作
13.4.2 动作 print
- 逗号将使用一个空格表示
- 如果没有打印内容,相当于 print $0
- 固定字符串需要使用双引号引起来,而变量和数字不需要
# 接受标准输入1打印“hello awk”
[root@centos ~][0]$ awk '{print "hello awk"}'
1
hello awk
# 打印指定次数
[root@centos ~][0]$ seq 2 | awk '{print "hello awk"}'
hello awk
hello awk
13.4.3 awk 变量
1. 输入分割符 FS
字段的分隔符,默认是空格
awk -v FS=":" '{print $1}' /etc/passwd
2. 输出分隔符 OFS
输出后字段分隔符
awk -F ':' -v OFS='--' '{print $1OFS$2}' /etc/passwd
3. 输入换行符 RS
换行符,默认是\n
# 修改换行符
awk -v RS=':' '{print $0}' /etc/passwd
4. 输出换行符 ORS
输出后字段的换行符
# 修改输出换行符
awk -v ORS='/' '{print $0}' /etc/passwd
5. 字段数量 NF
记录的是分割后,当前行总字段数量
# 查看每一行有多少个字段
awk -F ':' '{print NF}' /etc/passwd
# 打印最后一个字段
awk -F ':' '{print $NF}' /etc/passwd
# 打印倒数第二个字段
awk -F ':' '{print $(NF-1)}' /etc/passwd
6. 单个文件行号 NR
记录的是当前行的行号
# 给文件添加行号
awk '{print NR,$0}' /etc/passwd
# 打印第二行
awk 'NR==2{print $0}' /etc/passwd
7. 多个文件行号 FNR
分别记录每个文件的行号
# 给多个文件分别添加行号
awk '{print FNR,$0}' /etc/passwd /etc/fstab
8. 处理的文件名称 FILENAME
记录的是当前文件名称
# 给每行开头添加当前处理的文件名称
awk '{print FILENAME,$0}' /etc/fstab
9. 参数的个数 ARGC
记录的是命令行的参数个数
awk '{print ARGC}' /etc/fstab
10. 参数的数组 ARGV [ ? ]
数组,保存的是命令行所给定的各个参数,每一个参数是ARGV[0] …
awk '{print ARGV[0],ARGV[1],ARGV[2]}' /etc/fstab /etc/passwd
11. 自定义变量
# 打印变量var的值,有几行打几次
seq 1 | awk -v var='zhangyu' '{print var}'
# 开头打印一遍var的值
awk -v var='zhangyu' 'BEGIN{print var}'
# 内部变量赋值
awk 'BEGIN{var="zhangyu";print var}'
# 内部多个变量
awk -F ':' '{age="12";sex="man";print $1,age,sex}' /etc/passwd
13.4.4 动作 printf
1. 格式符
%c 显示字符的ASCII码
%d,%i 显示十进制整数
%e,%E 显示科学计数法数值
%f 显示为小数
%g,%G 以科学计数法或浮点形式显示数值
%s 显示字符串
%u 无符号整数
%% 显示%自身
2. 修饰符
?[.?] 第一个?控制显示的宽度:第二个?表示小数点后精度,如:%3.1f
- 左对齐(默认右对齐) 如:%-15s
+ 显示数值的正负符号 如:%+d
13.4.5 操作符
1. 算数操作符
x+y,x-y,x*y,x/y,x^Y,x%y
-x 转换为负数
+x 将字符串转换为数值
# 赋值操作符
=,+=,*=,/=,%=,^=,++,--
# 比较操作符
==,!=,>,>=,<,<=
awk 'NR>2{print $0}' /etc/passwd
awk 'NR==2{print $0}' /etc/passwd
awk 'NR!=2{print $0}' /etc/passwd
# 匹配$3不是>=500的行,打印出$0
awk -F ':' '!($3>=500){print $0}' /etc/passwd
# 打印奇数行
seq 10 | awk 'NR%2==1'
# 打印偶数行
seq 10 | awk 'NR%2==0'
2. 模式匹配符
~ 左边是否和右边匹配,包含关系
!~ 是否不匹配
# 匹配整行中,开头是root的行
awk -F ':' '$0 ~ /^root/' /etc/passwd
# 匹配整行中,开头是root的行,然后输出该行的$1
awk -F ':' '$0 ~ /^root/{print $1}' /etc/passwd
# 不匹配整行中,开头是root的行
awk -F ':' '$0 !~ /^root/' /etc/passwd
# 行尾匹配bash$的打印出$1,$NF
awk -F ':' '$NF ~ /bash$/{print $1,$NF}' /etc/passwd
3. 逻辑操作符WO
&& 并且
|| 或者
! 取反
# 取磁盘使用率
df -h | awk -F '[ ]+|%' '$5 > 15 && /^[^Files]/{print $0}'
4. 三元表达式
# 如果满足则,如果不满足则
awk -F ':' '{if ($3 > 20) {print "√",$0} else {print "x",$0}}' /etc/passwd
awk -F ':' '$3 > 20 {print "√",$0} $3 <= 1000 {print "x",$0}' /etc/passwd
13.4.6 模式PATTERN
PATTERN:根据模式条件,过滤匹配的行,再做处理
# 正则表达式
awk '/^root/{print $0}'
# 关系表达式,为真才会处理
awk '$0 ~ /^root/{print $0}'
# 地址表达式(位置表达)
awk 'NR>3 && NR<6{print $0}'
# 正则表达式(位置表达)
awk '/^root/,/^bin/{print $0}'
BEGIN(仅在处理之前执行一次)
END(仅在处理完成之后执行一次)
awk -F ':' 'BEGIN {print "开始"} {print $0} END {print "结束"}' /etc/passwd
13.4.7 流程控制语句
1. 条件判断
# 判断
awk -F ':' '{if ($3 > 1000) {print "√",$0} else {print "x",$0}}' /etc/passwd
# 多次判断
awk -F ':' '{if ($3 < 50) {print "小于50",$0} else if ($3 < 60) {print "小于60",$0} else {print "不小于50,也不小于60",$0}}' /etc/passwd
2. 循环
# 计算1+2+3..+100
awk 'BEGIN{sum=0;i=1;while(i<=100){sum+=i;i++};print sum}'
for i in {1..100}; do let sum=sum+i; done; echo $sum
# 打印网段IP
awk 'BEGIN { i=1; while (i<=255) { print "192.168.1." i; i++ } }'
awk 'BEGIN { for (i=1; i<=255; i++) print "192.168.1." i }'
3. continue和break
# 计算奇数之和
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum=sum+i};print sum}'
# 终止循环
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i>99)break;sum=sum+i};print sum}'
4. next
可以提前结束对本行的处理直接进入下一行
awk -F ':' '{if($3%2!=0)next; print $1,$3}' /etc/passwd
13.4.8 关联数组
1. 定义数组
# 定义两个关联数组的值,然后输出其中一个数组的值
awk 'BEGIN{weekdays["mom"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mom"]}'
2. 遍历数组
for (变量 in 数组名) {print 变量}
# var存了数组下标,这里是输出下标的值
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for (var in weekdays) {print weekdays[var]}}'
# var存了数组下标,这里是输出有哪些下标
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for (var in weekdays){print var}}'
# 打印下标对应的值
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for (var in weekdays){print var":"weekdays[var]}}'
# 定义两个数组,判断下标mon是否在数组weekdays中
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";if ("mon" in weekdays) {print "存在"}else{print"不存在"}}'
# 定义输出
awk -F ':' '{user[$1]=$3} END {for(var in user) {print "username:" var ", uid:" user[var]}}' /etc/passwd
3. 范例:
# 统计主机不同连接状态的次数
ss | awk -F '[ ]+|:' 'NR!=1 {state[$2]++} END {for (i in state) {print i, state[i]}}'
# 统计主机连接次数
ss | awk -F '[ ]+|:' 'NR!=1{ip[$7] = ip[$7] + 1} END {for (i in ip) {print i"有"ip[i]"个连接数"}}'
13.4.8 函数
1. 调用shell指令
[root@rocky9 ~][0]# awk 'BEGIN{system("hostname")}'
rocky9
[root@rocky9 ~][0]# awk 'BEGIN{score=100; system("echo your score is " score) }'
your score is 100
2. 常见内置函数
# rand():返回0和1之间一个固定的数
awk 'BEGIN{print rand() }'
# srand():配合rand()函数,生成随机数的种子
awk 'BEGIN{srand();print rand() }'
# int():返回整数
awk 'BEGIN{print int(110000) }'
# 生成随机整数
awk 'BEGIN{srand();print int(rand()*100000000000000000)}'
# rand():返回0和1之间一个固定的数
awk 'BEGIN{print rand() }'
# srand():配合rand()函数,生成随机数的种子
awk 'BEGIN{srand();print rand() }'
# int():返回整数
awk 'BEGIN{print int(110000) }'
# 生成随机整数
awk 'BEGIN{srand();print int(rand()*100000000000000000)}'
# sub(r,s,[t])对字符串搜索r表示匹配内容,并将第一个匹配内容替换成s
[root@rocky9 ~][0]# echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)'
2008-08:08 08:08:08
[root@rocky9 ~][0]# echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$2)'
2008:08:08 08-08:08
# gsub(r,s,[t])对字符串进行r表示匹配内容,并全部替换为s所表示的内容$1,2,3表示替换的列
[root@rocky9 ~][0]# echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$1)'
2008-08-08 08:08:08
[root@rocky9 ~][0]# echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$2)'
2008:08:08 08-08-08
[root@rocky9 ~][0]# echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$0)'
2008-08-08 08-08-08
split(s,array,[r])以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,...
3. 自定义函数
# 语法
function 函数名 ( 参数,参数,.....) {
函数体
}
# 范例
function man(x,y)
x>y?var=x:var=y
return var
}
BEGIN{print man(a,b)}
awk 'function man(x,y) {return x > y ? x : y;}BEGIN{print man(10,100);}'
14. 文件查找
14.1 locate 非实时查找
依托于文件索引数据库 /var/lib/mlocate/mlocate.db
工作特点:速度块、模糊查找、非实时查找、搜索的是文件全路径,不仅仅是文件名、可能只搜索用户具备读取和执行权限的目录
# 生成索引数据库
updatedb
locate [选项] PATTERN
-i 不区分大小写搜索
-n ? 只列出前?个匹配到的项目
-r 使用基本正则表达式
# 搜索路径名称或路径中包含"conf"的文件
locate conf
# 搜索以"conf"结尾的文件
locate -r '\.conf$'
14.2 find 实时查找
find是实时查找工具,通过遍历指定路径完成文件查找
工作特点:查找速度略慢,精确查找,实时查找,查找条件丰富,可能只搜索用户具备读取和执行权限的目录
find [选项] [查找路径] [查找条件] [处理动作]
-depth 对每个目录先处理目录内文件,再处理目录本身
# 会列出/etc下所有的文件路径
find /etc
14.2.1 指定搜索目录的深度
-maxdepth ? 最大搜索目录深度,指定目录下文件为第1级
-mindepth ? 最小搜索目录深度
# 搜索目录深度为5层,最小搜索2层
find /etc -maxdepth 5 -mindepth 2
14.2.2 根据文件名和inode查找
-name "文件名称" 文件名称支持通配符:*,?,[],[^](使用通配符建议加双引号)
-iname "文件名称" 不区分大小写
-inum ? 按inode查找(文件编号)
-samefile name 相同inode号的文件,需要保证在同一分区
-links ? 链接数为?的文件
-regex "PATTERN" 以正则表达式匹配整个文件路径,而非文件名称
# 查找passwd
find /etc -name "*passwd*"
# 按inode查找
find / -inum 34243 -ls
# 匹配conf结尾的文件
find /etc -regex "^.*\.conf"
14.2.3 根据属主、属组查找
-user "username" 查找属主为为指定用户UID的文件
-group "groupname" 查找属组为指定GID的文件
-uid "UID" 查找属主为指定UID号的文件
-gid "GID" 查找组指定组ID的文件
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
# 查找账户nginx文件
find / -user nginx
14.2.4 根据文件类型查找
-type 文件类型
f 普通文件
d 目录文件
l 链接文件
s 套接字文件
b 块文件
c 字符设备文件
p 管道文件
# 查找系统上的块文件
find / -type b
14.2.5 搜索空文件或目录、
-empty 搜索大小为0的文件或空目录
find /app -type d -empty
14.2.6 与或非
-a 与
-o 或
-not ! 非
# 小括号可以提升优先级
find /etc/ \( -type d -o -type l \)
# 查找套接字文件或块文件
find / -type s -o -type b
# 查找
14.2.7 德 · 摩根定律
(非A)或(非B)=非(A且B)
(非A)且(非B)=非(A或B)
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
# 查找不属于用户 "zhangyu" 或不属于用户 "zhangsan" 的文件或目录
find ! -user zhangyu -o ! -user zhangsan
# 查找既不属于用户 "zhangyu" 又不属于用户 "zhangsan" 的文件或目录。
find ! \( -user zhangyu -a -user zhangsan \)
14.2.8 排除文件
# 查找etc下,除/etc/sane.目录的其他所有.conf后缀的文件
find /etc/ -path '/etc/sane.d' -a -prune -o -name "*.conf"
# 查找etc下,除/etc/sane和/etc/fonts两个目录的所有.conf后缀的文件
find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -prune -o -name "*.conf"
# 排除/proc和/sys目录
find / \( -path "/proc/" -o -path "/proc/" \) -a -prune -o -type f -a -mmin -1
14.2.9 根据文件大小查找
find [选项] [查找路径] [查找条件] [处理动作]
-size [+|-]? 常用单位:k,M,G,c(byte),注意大小写敏感
6k 表示5k,6k
-6k 表示0-5k
+6k 表示6k以上,不包括6k
# 范例
dd if=/dev/zero of=bing.log bs=100M count=10
find / -size +900M
14.2.10 根据时间戳查询
find命令认为24小时之内为第0天
天
-atime [+|-]10
10 表示10-11天之间
+10 表示11天以后
-10 表示0-10天之间
# 范例
find /root -atime -10
分钟
-mmin 29
-29 29分钟之内发生变化的文件
+29 29分钟之前发生变化的文件
#范例
find /etc/ -mmin -20
14.2.11 根据权限查找
-perm [/|-]MODE
MODE 精确权限匹配
/MODE 任何一类(u,g,o)任意一类对象满足对应匹配的权限即可,或关系
-MODE 每一类对象都必须满足指定权限,才匹配。与关系
0:表示不关注
# 查找root下600权限的文件
find /root -perm 600
# 查找etc下g有x权限或u有x权限的文件
find /etc -perm /g+x,u+x
#匹配root目录下600权限且是文件夹的文件
find /root/ -perm 600 -a -type d
14.2.12 处理搜索到的文件
-print 默认的处理动作,显示至屏幕
-ls 类似于对查找到的文件执行ls -l指令
-delete 删除查找到的文件
-fls file 找到的所有文件长格式信息保存至file中
-ok cmd {} \; 对查找到的每个文件执行由cmd指定的命令,每个文件执行命令前都会交互式要求用户确认
-exec cmd {} \; 对查找到的每个文件执行由cmd指定的命令
{} 用于引用查找到的文件名称自身
# 删除搜索到的文件
find /data -size +5M -delete
# 类似ls -li重定向
find /data -fls /root/find.log
# 备份配置文件,添加,orig这个扩展名
find -name ".conf" -exec cp {} {}.orig \;
# 提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;
# 在主目录中寻找可被其他用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;
# 查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data -type f -perm 664 -name "*.sh" -exec chmod 755 {} \;
14.2.13 xargs
xargs可以将收到的标准输出,传给下一个命令,作为其参数
-n ? 表示一次传给后面指令的参数是多少个
# 查找有特殊权限的文件,并排序,注意,此处匹配条件逻辑不一样,参考根据权限查找章节
find /bin/ -perm /7000 | xargs ls -sl
# 以字符nul分隔
find -type f -name "*.txt" -print0 | xargs -o rm
# 并发执行多个进程
seq 100 | xargs -i -p10 wget -p /data http:/10.0.0.8/.html
# 并行下载视频
seq 389 | xargs -i -p3 you-get https://www.bilibili.com/video/avsaddaewq?p={}
# 批量创建账户
echo user{1..10} | xargs -n1 useradd
# 使用空作为文件的分隔符
find -print0 | xargs -0 ls -Sl
15. 压缩和解压缩
15.1 compress
安装:yum -y install ncompress
compress [选项] 文件
-d 解压缩,相当于uncompress
-c 结果输出至标准输出,不输出原文件
-v 显示详情
zcat 查看压缩文件内容
# 压缩文件
compress bing.log 输出--> bing.log.Z
# 解压缩
uncompress bing.log.Z 输出--> bing.log
# 压缩时保留源文件
compress -c bing.log > bing.log.Z
# 解压时保留压缩文件
uncompress -c bing.log.Z > bing.log
15.2 gzip
compress [选项] 文件
-d 解压缩,相当于gunzip
-k 保留原文件(centos8才支持)
-c 压缩结果输出至标准输出,保留原文件不变
-? 指定压缩比,?取值为1-9,值越大压缩比越大
# 压缩文件
gzip bing.log 输出--> bing.log.gz
# 解压缩
gunzip bing.log.gz 输出--> bing.log
# 压缩时保留源文件
gzip -c bing.log > bing.log.gz
# 解压时保留压缩文件
gunzip -c bing.log.gz > bing.log
# 文件重定向压缩
cat bing.log | gzip > bing.log.gz
15.3 bzip2
安装:yum -y install bzip2
bzip2 [选项] 文件
-k 保留原文件
-d 解压缩
-c 压缩结果输出至标准输出,保留原文件不改变
-? 指定压缩比,?取值为1-9,值越大压缩比越大,默认为9
bzcat 查看压缩文件内容
# 压缩文件
bzip2 bing.log 输出--> bing.log.bz2
# 解压缩
bunzip2 bing.log.bz2 输出--> bing.log
# 压缩保留原文件
bzip2 -k bing.log
# 解压保留原文件
bunzip2 -k bing.log.bz2
15.4 xz
安装:yum -y install xz
xz [选项] 文件
-k keep,保留原文件
-d 解压缩
-c 压缩结果输出至标准输出,保留原文件不改变
-? 指定压缩比,?取值为1-9,默认为6
# 压缩文件
xz bing.log 输出--> bing.log.xz
# 解压缩
xz -d bing.log.xz 输出--> bing.log
unxz bing.log.xz
# 压缩保留原文件
xz -c bing.log > bing.log.xz
# 解压保留原文件
xz -d -c bing.log.xz > bing.log
15.5 zip 压缩文件夹
安装:yum -y install zip unzip
zip可以实现打包目录和多个文件成一个文件并压缩,但是可能会丢失文件属性信息
zip 压缩后的文件 原文件
-r 针对文件夹进行打包
-q 静默模式
# 压缩单个文件(会保留原文件)
zip -q bing.log.zip bing.log
# 解压文件
unzip -q bing.log.zip
# 压缩多个文件到一个压缩包
zip -q /root/all.zip *
# 压缩文件夹
zip -qr etc.zip /etc
# 解压文件夹
unzip -q etc.zip
# 解压文件到指定目录
unzip -q etc.zip -d /etc
# 不打包目录,只打包当前文件
cd /etc
zip -qr /root/etc.zip *
cd /root
unzip -q etc.zip
16 文件归档 tar
16.1 tar 打包压缩
tar可以对目录和多个文件打包成一个文件,并且可以压缩,保留文件属性不丢失,常用于备份
tar 选项 目标文件 源文件
-C 解包到指定文件夹
-c 打包
-t 预览
-x 解包
-vf 通用选项 代表文件
-j 使用bizp2对打包文件进行压缩
-J 使用xz对打包文件进行压缩
-z 使用gzip对打包文件进行压缩
# 打包文件夹(会保留原文件)
tar -cvf /root/home.tar /home
# 预览打包文件夹内容
tar -tvf home.tar
# 解包文件夹(会保留原文件)
tar -xvf home.tar
# 解包文件夹到指定目录
tar -xvf home.tar -C /tmp
# 打包文件不包括目录自身
cd /etc
tar -zcvf /root/etc.tar.gz *
# 打包目录并使用bizp2进行压缩
tar -jcvf home.tar.bz2 /home
# 打包目录并使用xz进行压缩
tar -Jcvf home.tar.xz /home
# 打包目录并使用gzip进行压缩
tar -zcvf home.tar.gz /home
# 解压并解包到指定目录(x选项对于不同压缩格式是通用的)
tar -xvf home.tar.xz -C /tmp
# 打包多个文件并使用gzip进行压缩
tar -zcvf home.tar.gz /mysql/data/bing*
# 去皮
tar xf helm-v3.12.3-linux-amd64.tar.gz -C /usr/local/bin/ linux-amd64/helm --strip-components=1
利用tar进行文件复制
# 将/etc复制到/root下
tar -c /etc | tar -x -C /root/
排除文件
# -exclude排除文件
tar -zcvf /root/a.tgz --exclude=/app/host1 -exclude=/app/host2 /app
# -T选项指定输入文件,-X选项指定包含要排除的文件列表
tar -zcvf mybackup.tgz -T /root/includefilelist -x /excludefilelist
16.2 split 文件切割
split命令可以分割一个文件为多个文件
# 按40K大小切割文件bin.log.gz,到目录/root/bin.log.gz下
split -b 40K bin.log.gz /root/bin.log.gz
-rw-r--r-- 1 root root 203555 Nov 2 09:59 bin.log.gz
-rw-r--r-- 1 root root 40960 Nov 2 10:00 bin.log.gzaa
-rw-r--r-- 1 root root 40960 Nov 2 10:00 bin.log.gzab
-rw-r--r-- 1 root root 40960 Nov 2 10:00 bin.log.gzac
-rw-r--r-- 1 root root 40960 Nov 2 10:00 bin.log.gzad
-rw-r--r-- 1 root root 39715 Nov 2 10:00 bin.log.gzae
# 使用数字方式作为切割文件名
split -b 40K -d bin.log.gz /root/bin.log.gz
-rw-r--r-- 1 root root 203555 Nov 2 09:59 bin.log.gz
-rw-r--r-- 1 root root 40960 Nov 2 10:02 bin.log.gz00
-rw-r--r-- 1 root root 40960 Nov 2 10:02 bin.log.gz01
-rw-r--r-- 1 root root 40960 Nov 2 10:02 bin.log.gz02
-rw-r--r-- 1 root root 40960 Nov 2 10:02 bin.log.gz03
-rw-r--r-- 1 root root 39715 Nov 2 10:02 bin.log.gz04
# 合并切割的文件
cat /root/bin.log.gz* > bin.log.gz
17. rpm 软件包管理
17.1 gcc 编译过程
# 分步骤编译运行
gcc -E hello.c -o hello.i 对hello.c文件进行预处理,生成了hello.i文件
gcc -S hello.i -o hello.s 对预处理文件进行编译,生成了汇编文件
gcc -c hello.s -o hello.o 对汇编文件进行编译,生成了目标文件
gcc hello.o -o hello 对目标文件进行链接,生成了可执行文件
# 一步实现编译过程
gcc hello.c -o hello 直接编译链接成可执行目标文件
17.2 软件模块的静态和动态链接
17.2.1 动态链接
动态链接主要就是把各个模块之间互相引用的部分处理好,使得各个模块之间能够正确的衔接,分为静态和动态链接
# 查看二进制文件依赖那些库
[root@rocky9 ~][0]# ldd /bin/ls
linux-vdso.so.1 (0x00007ffec07ae000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f12e1a77000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f12e1a6d000)
libc.so.6 => /lib64/libc.so.6 (0x00007f12e1800000)
libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f12e1764000)
/lib64/ld-linux-x86-64.so.2 (0x00007f12e1ad0000)
# 加载配置文件种指定的库文件
ldconfig
# 显示本机已经缓存的所有可用库文件名及路径映射关系
/sbin/ldconfig -p
17.2.2 静态链接
静态链接会把对应的依赖库复制一份到包
17.2.4 库文件被破坏恢复
1.开机读进度条按一次Esc
2.选择CD-ROM drive启动
3.选择第三项Troubleshooting
4.选择第二项Rescue a CentOS system救援模式
5.等待进入选项界面输入1(Continue)
6.此时可以看到chroot /mnt/sysimage (根已经被挂载到了/mnt/sysimage)
7.please press <return> to get a shell. 按回车,开启shell
8.此时使用光盘启动,使用的是光盘内的操作系统
9.将破坏的库文件恢复到原来根下(库文件被移动)
mv /mut/sysumage/data/libc.so.6 /mnt/sysimage/lib64/
9.将破坏的库文件恢复到原来根下(库文件被删除)
mv /lib64/libc.so.6 /mnt/sysimage/lib64/
10.Ctrl+Alt+Delete 或 reboot 重启操作系统
17.3 软件包管理工具
17.3.1 查看/解压包文件内容
# 利用cpio工具查看包文件列表
rpm2cpio 包文件 | cpio -it
# 释放包内的文件
rpm2cpio 包文件 | cpio -idv
17.3.2 包搜索引擎
注意:第三方包建议检查其合法性,来源合法性,程序包的完整性
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
http://sourceforge.net
17.3.3 rpm 常用指令
Centos 系统上使用 rpm 命令管理程序包
17.3.3.1 rpm 包安装/卸载
rpm 选项 包文件
# 安装rpm包
rpm -ivh gzip-1.5-10.el7.x86_64.rpm
# 卸载rpm包
rpm -evh gzip-1.5-10.el7.x86_64.rpm
# 升级rpm包(如果没有旧版本,就安装)
rpm -Uvh gzip-1.5-10.el7.x86_64.rpm
# 升级rpm包(如果没有旧版本,就不做动作)
rpm -Fvh gzip-1.5-10.el7.x86_64.rpm
# 忽略依赖关系检查安装
rpm -ivh --nodeps gzip-1.5-10.el7.x86_64.rpm
# 强制安装rpm包,忽略任何报错和警告
rpm -ivh --force gzip-1.5-10.el7.x86_64.rpm
17.3.3.2 rpm 包查询
# 查询rpm包会安装那些文件
rpm -qpl gzip-1.5-10.el7.x86_64.rpm
# 查询rpm包的说明信息
rpm -qpi gzip-1.5-10.el7.x86_64.rpm
# 查询已安装的rpm包安装有那些文件
rpm -ql kernel-3.10.0-1160.el7.x86_64
# 查询已安装包的详细信息
rpm -qi kernel-3.10.0-1160.el7.x86_64
# 查询磁盘文件来自那个rpm包
rpm -qf /usr/bin/ls
# 查询功能是由那个包提供
rpm -q --whatprovides bash
# 查询包被那些包依赖
rpm -q --whatrequires bash
# 查询已经安装的所有rpm包
rpm -qa
# 查询已安装rpm包的文档
rpm -qd coreutils-8.22-24.el7.x86_64
# 查询rpm包自带的脚本
rpm -q --scripts bash
# 查询包提供的能力(依赖)
rpm -q --provides bash
# 查询指定的能力由那个包所提供
rpm -q --whatprovides bash
# 查询指定的能力被那个包依赖
rpm -q --whatrequires bash
# 查询指定的程序包所依赖的能力
rpm -R
17.3.3.3 rpm 包完整性校验
在安装包时,系统也会检查包的来源是否合法
在检查包的来源和完整性之前,必须导入所需要的公钥
ls -l /etc/pki/rpm-gpg
-rw-r--r--. 1 root root 1690 Nov 23 2020 RPM-GPG-KEY-CentOS-7
-rw-r--r--. 1 root root 1004 Nov 23 2020 RPM-GPG-KEY-CentOS-Debug-7
-rw-r--r--. 1 root root 1690 Nov 23 2020 RPM-GPG-KEY-CentOS-Testing-7
# 导入公钥
rpm --import RPM-GPG-KEY-CentOS-7
# 查询安装好的密钥
rpm -qa "gpg-pubkey*"、
输出:gpg-pubkey-f4a80eb5-53a7ff4b
# 查询公钥信息
rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
检查包的完整性签名
rpm -K kernel-3.10.0-1160.el7.x86_64
17.3.3.4 rpm 包数据库
软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录至rpm相关数据库中,可以用来检查包中的文件是否和当初安装时有所变化
S 文件大小不匹配。
M 文件的权限、类型等模式不匹配。
5 校验和(以前是 MD5 校验和)不匹配。
D 设备的主/次编号不匹配。
L 符号链接的目标路径不匹配。
U 文件的用户所有权不匹配。
G 文件的组所有权不匹配。
T 文件的修改时间不匹配。
P 文件的能力(capabilities)不匹配。
# 检查已安装的rpm的完整性,无输出,就是完整
rpm -V centos-release
# 检查所有已安装的rpm的完整性,无输出,就是完整
rpm -Va
重建rpm包数据库
# 查看rpm包数据库文件
ls /var/lib/rpm
# 初始化,如果事先不存在数据库,则新建,如果存在,不执行任何操作
rpm --initdb
# 重建已安装的包头的数据库索目录
rpm --rebuilddb
18. yum 和 dnf
18.1 yum 相关配置文件
仓库公共配置文件
cat /etc/yum.conf
[main]
gpgcheck=1 校验安装包的数字签名
installonly_limit=3 同时可以安装3个包,最小值为2,如设置为0或1,为不限制
clean_requirements_on_remove=True 卸载包时也卸载相关依赖
best=True 多个相同的包选择高版本的包,即使缺少包的依赖
skip_if_unavailable=False 当存储库不可用时是否跳过它
仓库配置文件
/etc/yum.repos.d/*.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
18.2 yum 配置文件内置变量
$releasever 当前OS的发型版的主版本号,如6,7,8
$arch cpu架构,如i686,x86_64
$basearch 系统基础平台:i386,X86_64
$contentdir 表示目录,比如centos-8,centos-7
$YUM0-$YUM9 自定义变量
18.3 yum 常用指令
18.3.1 显示仓库列表
# 默认显示启用的仓库
yum repolist [ all | enabled | disabled ]
18.3.2 永久启用/禁用仓库
该功能来自yum -y install yum-utils
可以生成yum仓库的配置文件及启用或禁用仓库
# 生成仓库配置文件
yum-config-manager -add-repo URL或file
# 启用仓库
yum-config-manager --enable "仓库名称"
# 禁用仓库
yum-config-manager --disable "仓库名称"
18.3.3 指定仓库安装软件包
--disablerepo=仓库名 临时禁用某个仓库
--enablerepo=仓库名 临时启用某个仓库
yum -y --disablerepo=* --enablerepo=指定的仓库名称 软件包名
yum list 显示所有仓库的程序包
yum -y reinstall 重装程序包
yum update 更新程序包
yum clean all 清理元数据缓存
yum makecache 下载元数据缓存(不是必须)
yum provides 查看该特性属于那个安装包
--disablerepo=官方仓库名 安装时,将禁用官方仓库,使用其他仓库来安装
--enablerepo=仓库名称 指定仓库,来安装rpm包
18.3.4 查询软件包详细信息
yum info 软件包名
18.3.5 查询特性由那个程序包提供
yum provides 文件或指令
18.3.6 指定关键字查询程序包
yum search 关键字
18.3.7 查询包依赖的能力
yum deplist 程序包名
18.3.8 安装或升级时忽略某个包
yum install -x 程序包名
18.3.9 重新安装程序包
yum -y reinstall 程序包名
18.3.8 更新软件包
# 检查可用升级
yum check-update
# 更新nginx
yum update nginx
# 更新整个操作系统
yum update
18.3.9 yum history
yum 执行安装卸载命令会记录到相关日志中
cat /var/log/yum.log
cat /var/log/dnf.log
yum 事务历史
yum history
ID | Login user | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
3 | root <root> | 2023-11-02 17:49 | Install | 31
2 | root <root> | 2023-11-02 13:15 | I, U | 154
1 | System <unset> | 2023-08-21 18:01 | Install | 300
# 查看2号事件安装的包
yum history info 2
# 撤销2号事件安装的包
yum history undo 2
# 重新执行2号事件
yum history redo 2
18.4 yum 元数据缓存
# yum缓存存放的路径
ls /var/cache/yum/x86_64/7/
# 清理所有仓库元数据缓存
yum clean all
# 重新构建缓存
yum makecache
18.4 配置 epel 源
# 阿里云
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
# USTC
yum install -y epel-release.noarch
sed -i 's|^metalink=|#metalink=|g' /etc/yum.repos.d/epel.repo
sed -i 's|^#baseurl=https\?://download.fedoraproject.org/pub/epel/|baseurl=https://mirrors.ustc.edu.cn/epel/|g' /etc/yum.repos.d/epel.repo
sed -i 's|^#baseurl=https\?://download.example/pub/epel/|baseurl=https://mirrors.ustc.edu.cn/epel/|g' /etc/yum.repos.d/epel.repo
18.5 配置光盘源仓库
仓库路径到repodata的父目录止
vim /etc/yum.repos.d/CD.repo
[CD-base]
name=CentOS-$releasever - CD Base
baseurl=file:///media/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
18.6 yum 升级内核
网站:http://elrepo.org/tiki/HomePage
yum -y install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
# 查看仓库中的内核版本
yum --enablerepo elrepo-kernel list | grep kernel
# 安装新内核
yum --enablerepo elrepo-kernel install kernel-ml.x86_64 -y
18.7 rpm 程序包被破坏恢复方法
1.开机读进度条按一次Esc
2.选择CD-ROM drive启动
3.选择第三项Troubleshooting
4.选择第二项Rescue a CentOS system救援模式
5.等待进入选项界面输入1(Continue)
6.此时可以看到chroot /mnt/sysimage (根已经被挂载到了/mnt/sysimage)
7.please press <return> to get a shell. 按回车,开启shell
8.此时使用光盘启动,使用的是光盘内的操作系统
9.使用光盘内的rpm程序包安装rpm
mkdir /mnt/cdrom
mount /dev/sr0 /mnt/cdrom
rpm -ivh /mnt/cdrom/Packages/rpm-4.11.3-40.e17.x86_64.rpm --root=/mnt/sysimage
10.Ctrl+Alt+Delete 或 reboot 重启操作系统
18.8. 包组管理
# 查看包组
yum grouplist
# 安装包组
yum -y grouplist 包组
# 卸载包组
yum -y remove 包组
# 查看包组信息
yum grouplist "包组"
# 查看包组内拥有那些程序包
yum groupinfo "包组"
18.9 实现私有 yum 仓库
19. 编译安装
19.1 源码编译介绍
程序包编译安装
源代码>>预处理>>编译>>汇编>>链接>>执行
程序包编译工具
c、c++的源码编译:使用make项目管理器
configure脚本>>Makefile.in>>Makefile
相关开发工具:
autoconf:生成configure脚本
automake:生成Malefile.in
java的源码编译:使用maven
C语言源代码编译安装过程
利用编译工具,通常只需要进行三个大的步骤
-
./configure
- 通过选项传递参数,指定安装路径,启用特性等。执行时会参考用户指定以及Makefile.in文件生成Makefile
- 检查依赖到的外部环境,如依赖的软件包
-
make
根据 Makefile 文件,构建应用程序
- make install
复制文件到相应路径
注意:安装前可以通过查看README,INSTALL查看获取帮助
19.2 编译安装准备
准备:安装相关的依赖包
开发工具:make,gcc(c/c++编译器GNU C Conplief)
开发环境:开发库(glibc:标准库),头文件,可安装开发组Development Tools
# 生产实践,基于最小化安装的系统
yum -y install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages
19.3 编译安装 tree
# 创建目录
mkdir -p /apps/tree
# 下载tree
curl -o /apps/tree-2.1.0.tgz http://mama.indstate.edu/users/ice/tree/src/tree-2.1.0.tgz
# 解压tar包
cd /apps ; tar -xvf tree-2.1.0.tgz
# 开始编译,由于这个包太简单了,所以直接提供了Makefile
sed -i 's|/usr/local|/apps/tree|' /apps/tree-2.1.0/Makefile 修改安装路径
sed -i 's|VERSION=2.1.0|VERSION=10.0|' /apps/tree-2.1.0/Makefile 自定义一下版本
# 编译安装
make install
# 配置环境变量
echo 'PATH=/apps/tree/bin/:$PATH' > /etc/profile.d/tree.sh
# 重读shell环境
exec $SHELL -l
# 查看tree版本
tree --version
20. Ubuntu 软件管理
Debian软件包通常为预编译的二进制格式的扩展名”.deb”,类似rpm文件,因此安装快速,无需编译软件。包文件包括特定功能或软件所必需的文件、元数据和指令
- dpkg: package manager for Debian,类似于rpm,dpkg是基于Debian的系统的包管理器。可以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项
- apt: Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基于客户/服务器架构
20.1 APT 工作原理
在服务器上先复制所有DEB包,然后用APT的分析工具genbasedir根据每个DEB 包的包头(Header) 信息对所有的DEB包进行分析,并将该分析结果记录在文件夹base内的一个DEB 索引清单文件中,一旦APT 服务器内的DEB有所变动,要使用genbasedir产生新的DEB索引清单。客户端在进行安装或升级时先要查询DEB索引清单,从而获知所有具有依赖关系的软件包,并一同下载到客户端以便安装。当客户端需要安装、升级或删除某个软件包时客户端计算机取得DEB索引清单压缩文件后,会将其解压置放于 ar/cache/apt/,而客户端使用apt-get install或apt-get upgrade命令的时候,就会将这个文件夹内的数据和客户端计算机内的DEB数据库比对,知道哪些DEB已安装、未安装或是可以升级的
20.2 dpkg 包管理器
#安装包
dpkg -i package.deb
#删除包(不建议,不自动卸载依赖于它的包)
dpkg -r package.deb
#删除包(包括配置文件)
dpkg -P package.deb
#列出当前已经安装的包,类似于rpm -qa
dpkg -l
#显示该包的简要说明,类似于rpm -qi
dpkg -l package
#列出该包的状态,包括详细信息,类似于rpm -qi
dpkg -s package
#列出该包中所包含的文件,类似于rpm -ql
dpkg -L package
#搜索包含pattern的包,类似于rpm -qf
dpkg -S <pattren>
#配置包,-a 使用 配置所有没有配置的软件包
dpkg --configure package
#列出deb包的内容,类似rpm -qpl
dpkg -c package.deb
#解开deb包的内容
dpkg --unpack package.deb
20.3 apt
Debian 使用apt 工具集来管理包系统,apt-get 是其中一个常用的命令行工具,另外一款较为流行的命令行与GUI兼顾的工具是 aptitude,之前最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-config 这三条命令中在2014年apt命令发布第一个稳定版,Ubuntu 16.04引入新特性之一便是 apt 命令,apt 命令解决了命令过于分散的问题,它包括 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 apt-config 命令中很少用到的功能。在使用apt 命令时,用户不必再由 apt-get 转到 apt-cache 或 apt-config,提供管理软件包所需的必要选项
apt 相当于apt-get、apt-cache和apt-config 中最常用命令选项的集合apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。此外,启用的几个特性也非常有帮助。例如:可以在使用 apt 命令安装或删除程序时看到进度条,apt 还会在更新存储库数据库时提示用户可升级的软件包个数
apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令,也即可用apt 替换部分 apt-get系列命令,但不是全部
apt命令用法
查看帮助:apt help
#安装包
apt install tree zip
#安装图形桌面
apt install ubuntu-desktop
#删除包
apt remove tree zip
#说明:apt remove中添加--purge选项会删除包配置文件,谨慎使用
#更新包索引,相当于yum clean all && yum makecache(修改仓库以后必须执行)
apt update
#升级包:要升级系统,请首先更新软件包索引,再升级
apt upgrade apache2
#apt列出仓库软件包,等于yum list
apt list
#搜索软件包
apt search nginx
#查看某个安装包的详细信息
apt show apache2
#在线安装软件包
apt install apache2
#卸载单个软件包,但是保留配置文件
apt remove apache2
#删除安装包并解决依赖关系
apt autoremove apache2
#卸载单个软件包删除配置文件
apt purge apache2
#升级所有已安装且可升级到新版本的软件包
apt upgrade
#升级整个系统,必要时可以移除旧的软件包
apt full-upgrade
#编辑source源文件
apt edit-sources
#查看仓库中那些软件包有那些版本可以安装
apt-cache madison nginx
#安装软件包的时候指定安装具体的版本
apt install nginx=1.14.0-0ubuntu1.6
20.4 配置 apt 仓库
# 配置阿里云apt仓库 ubuntu 20.04(focal)
vim /etc/apt/sources.list
deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
# deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
21. 磁盘管理
21.1 Linux 磁盘标识
21.1.2 设备文件
设备文件:关联至一个设备驱动程序(有点像硬件的软链接),进而能够跟与之对应的硬件设备进行通信
设备号码:主设备号(标识设备类型)、次设备号(标识同一类型下不同的设备)
设备类型:块设备(磁盘)、字符设备(键盘)
设备文件命名:
/dev/sdX # scsi、sata、sas、ide、usb
/dev/nume0n1p5 # nume协议
虚部磁盘
/dev/vd
/dev/xvd
磁盘标识
/dev/sda
/dev/sdb
/dev/sdc
分区标识
/dev/sda1
/dev/sda2
/dev/sda3
21.2.3 创建设备文件
如果两个设备设备类型和设备编号一致,可以认为是同一个设备
brw-rw----. 1 123 disk 8, 0 Nov 4 13:47 /dev/sda1
8 主设备号,标识设备类型
0 次设备号,标识同一类型下不同的设备
# 创建一个和/dev/sda1一样的设备
mknod /data/sda1 b 8 1
# 挂载
mount /data/sda1 /data
# 查看两个目录,内容一致
[root@Centos7-1 ~][0]$ ll /boot/ /data/
/boot/:
total 112032
-rw-r--r--. 1 123 root 153562 Apr 1 2020 config-3.10.0-1127.el7.x86_64
drwxr-xr-x. 3 123 root 17 Aug 21 18:01 efi
drwxr-xr-x. 2 123 root 27 Aug 21 18:02 grub
drwx------. 5 123 root 97 Aug 21 19:10 grub2
-rw-------. 1 123 root 61878439 Aug 21 18:08 initramfs-0-rescue-57e6abd4afac4b96931cf5ca2015883e.img
-rw-------. 1 123 root 21551304 Aug 21 18:11 initramfs-3.10.0-1127.el7.x86_64.img
-rw-------. 1 123 root 13657368 Aug 21 19:06 initramfs-3.10.0-1127.el7.x86_64kdump.img
-rw-r--r--. 1 123 root 320512 Apr 1 2020 symvers-3.10.0-1127.el7.x86_64.gz
-rw-------. 1 123 root 3611662 Apr 1 2020 System.map-3.10.0-1127.el7.x86_64
-rwxr-xr-x. 1 123 root 6762688 Aug 21 18:08 vmlinuz-0-rescue-57e6abd4afac4b96931cf5ca2015883e
-rwxr-xr-x. 1 123 root 6762688 Apr 1 2020 vmlinuz-3.10.0-1127.el7.x86_64
/data/:
total 112032
-rw-r--r--. 1 123 root 153562 Apr 1 2020 config-3.10.0-1127.el7.x86_64
drwxr-xr-x. 3 123 root 17 Aug 21 18:01 efi
drwxr-xr-x. 2 123 root 27 Aug 21 18:02 grub
drwx------. 5 123 root 97 Aug 21 19:10 grub2
-rw-------. 1 123 root 61878439 Aug 21 18:08 initramfs-0-rescue-57e6abd4afac4b96931cf5ca2015883e.img
-rw-------. 1 123 root 21551304 Aug 21 18:11 initramfs-3.10.0-1127.el7.x86_64.img
-rw-------. 1 123 root 13657368 Aug 21 19:06 initramfs-3.10.0-1127.el7.x86_64kdump.img
-rw-r--r--. 1 123 root 320512 Apr 1 2020 symvers-3.10.0-1127.el7.x86_64.gz
-rw-------. 1 123 root 3611662 Apr 1 2020 System.map-3.10.0-1127.el7.x86_64
-rwxr-xr-x. 1 123 root 6762688 Aug 21 18:08 vmlinuz-0-rescue-57e6abd4afac4b96931cf5ca2015883e
-rwxr-xr-x. 1 123 root 6762688 Apr 1 2020 vmlinuz-3.10.0-1127.el7.x86_64
21.2 硬盘类型
21.2.3 查看硬盘类型
# 1表示机械硬盘,0表示固态或其他
lsblk -d -o name,rota
# 查看Linux的块设备
ls /sys/block
# 1表示机械硬盘,0表示固态或其他
cat /sys/block/sda/queue/rotational
21.2.4 硬盘接口类型介绍
- IDE:133MB/s
- SCSI:640MB/s
- SATA:6Gbps,SATA数据接口与电源接口分开,即两条线
- SAS:6Gbps,SAS是一整条线,数据接口和电源接口一体化,SAS中是包含电源线的,二SATA中不包含电源线,SATA标准其实是SAS标准的一个子集,二者可建通,SATA硬盘可以插在SAS主板上,反之不行
- USB:480MB/s
- M.2:
注意:Nvme协议硬盘速度是最快的
21.3 机械硬盘和固态硬盘
机械硬盘结构
固态硬盘结构(SSD)
21.4 硬盘分区介绍
21.4.1 不重启扫描新硬盘
# 方法一
echo - - - > /sys/class/scsi_host/host0/scan
echo - - - > /sys/class/scsi_host/host1/scan
echo - - - > /sys/class/scsi_host/host2/scan
# 方法二
for host in $(/bin/ls /sys/class/scsi_host/);do
echo "- - -" > /sys/class/scsi_host/${host}/scan;
done
21.4.2 MBR 分区
硬盘即使在不分区的情况下也可以使用,那么硬盘为什么分区:
- 优化I/O性能
- 实现磁盘空间配额
- 提高修复速度
- 隔离系统和程序
- 安装多个OS
- 采用不同文件系统
MBR:使用32位表示扇区数,分区不超过2T
0磁道0扇区(第一个扇区):共512字节,其中前446字节用来记录启动计算机的主引导程序,64字节用来记录分区表,其中每16个字节记录一个分区,还有2个字节表示55aa表示第一个扇区结束(结束标志),所以MBR分区中一块硬盘最多有4个主分区,也可以3个主分区+1扩展分区。扩展分区可以创建N个逻辑分区。
MBR分区:主分区和扩展分区对应标识1-4,逻辑分区从5开始
# 查看第一个扇区
[root@Centos7-1 ~][0]$ hexdump -C -n 512 /dev/sda
00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c..............|
00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..|
00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u|
00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.........|...t..|
00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........|
00000050 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00 |................|
00000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70 |...........t...p|
00000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t....y|..1......|
00000080 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 be 05 7c |. ..d|<.t...R..||
00000090 b4 41 bb aa 55 cd 13 5a 52 72 3d 81 fb 55 aa 75 |.A..U..ZRr=..U.u|
000000a0 37 83 e1 01 74 32 31 c0 89 44 04 40 88 44 ff 89 |7...t21..D.@.D..|
000000b0 44 02 c7 04 10 00 66 8b 1e 5c 7c 66 89 5c 08 66 |D.....f..\|f.\.f|
000000c0 8b 1e 60 7c 66 89 5c 0c c7 44 06 00 70 b4 42 cd |..`|f.\..D..p.B.|
000000d0 13 72 05 bb 00 70 eb 76 b4 08 cd 13 73 0d 5a 84 |.r...p.v....s.Z.|
000000e0 d2 0f 83 de 00 be 85 7d e9 82 00 66 0f b6 c6 88 |.......}...f....|
000000f0 64 ff 40 66 89 44 04 0f b6 d1 c1 e2 02 88 e8 88 |d.@f.D..........|
00000100 f4 40 89 44 08 0f b6 c2 c0 e8 02 66 89 04 66 a1 |.@.D.......f..f.|
00000110 60 7c 66 09 c0 75 4e 66 a1 5c 7c 66 31 d2 66 f7 |`|f..uNf.\|f1.f.|
00000120 34 88 d1 31 d2 66 f7 74 04 3b 44 08 7d 37 fe c1 |4..1.f.t.;D.}7..|
00000130 88 c5 30 c0 c1 e8 02 08 c1 88 d0 5a 88 c6 bb 00 |..0........Z....|
00000140 70 8e c3 31 db b8 01 02 cd 13 72 1e 8c c3 60 1e |p..1......r...`.|
00000150 b9 00 01 8e db 31 f6 bf 00 80 8e c6 fc f3 a5 1f |.....1..........|
00000160 61 ff 26 5a 7c be 80 7d eb 03 be 8f 7d e8 34 00 |a.&Z|..}....}.4.|
00000170 be 94 7d e8 2e 00 cd 18 eb fe 47 52 55 42 20 00 |..}.......GRUB .|
00000180 47 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 |Geom.Hard Disk.R|
00000190 65 61 64 00 20 45 72 72 6f 72 0d 0a 00 bb 01 00 |ead. Error......|
000001a0 b4 0e cd 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 |.....<.u........|
000001b0 00 00 00 00 00 00 00 00 61 6c 01 00 00 00 80 20 |........al..... |
000001c0 21 00 83 aa 28 82 00 08 00 00 00 00 20 00 00 aa |!...(....... ...|
000001d0 29 82 8e fe ff ff 00 08 20 00 00 f8 5f 02 00 00 |)....... ..._...|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200
21.4.2.1 备份/还原分区表
注意:备份的分区表需要放在远程主机,否则备份没有任何意义
# 备份分区表
dd if=/dev/sda of=MBR.bak bs=1 count=64 skip=446
# 破坏分区表
dd if=/dev/zero of=/dev/sda bs=1 count=64 seek=446
# 重启服务器
reboot
1.开机读进度条按一次Esc
2.选择CD-ROM drive启动
3.选择第三项Troubleshooting
4.选择第二项Rescue a CentOS system救援模式
5.等待进入选项界面输入3(skip to shell)
6.此时可以看到chroot /mnt/sysimage (根已经被挂载到了/mnt/sysimage)
7.此时使用光盘启动,使用的是光盘内的操作系统
7.配置临时IP(因为备份如果放在本机是没有任何意义的)
ip addr add 192.168.1.7/24 dev ens33
9.在故障服务器上使用scp将192.168.1.17的/root/MBR.bak拷贝到本机
scp 192.168.1.17:/root/MBR.bak .
10.还原分区表
dd if=MBR.bak of=/dev/sda bs=1 seek=446
11.Ctrl+Alt+Delete 或 reboot 重启操作系统
21.4.3 GPT 分区
GPT分区:GUID最大支持128个主分区,使用64位,支持8Z(512byte),64Z(4096byte)空间
UEFI:统一可扩展固件接口,硬件支持GPT,使得操作系统可以启动
GPT分区结构分为4个区域;
- GPT头
- 分区表
- GPT分区
- 备份区域
21.5 分区管理
21.5.1 查看块设备
lsblk
21.5.2 parted
parted的所有操作都是立即生效,小心使用
parted [选项] 设备 [命令]
# 创建分区表msdos(MBR)|gpt
parted /dev/sdb mklabel gpt
# 创建1个分区,分配200M空间
parted /dev/sdb mkpart primary 1 200
# 创建2个分区,分配200M空间
parted /dev/sdb mkpart primary 201 500
# 查看创建的分区
parted /deb/sdb print
# 删除分区第一个分区
parted /deb/sdb rm 1
# 清空分区表
dd if=/dev/zero of=/dev/sdb bs=1 count=66 seek=446
# 清空分区
dd if=/dev/zero of=/dev/sdb bs=1 count=64 seek=446
21.5.3 fdisk (MBR分区管理)
fdisk 硬盘
m 查看帮助
p 显示当前分区情况
n 创建分区
d 删除分区
g 创建GPT分区
o 创建MBR分区
t 修改分区类型,list或L列出所有分区类型
w 保存退出
q 不保存退出
# 非交互式创建分区(实际是将交互式分区动作分解)
echo -e 'n\np\n\n\n+2G\nw\n' | fdisk /dev/sdb
21.5.4 gdisk(GPT分区管理)
gdisk 硬盘
21.5.5 重读分区表
重新读取分区表(适合于除了centos6以外的其他版本),向内核注册新的分区表
partprobe
partx -a /dev/sdb Centos 6把磁盘的分区表让内存读取(适合增加分区操作)
partx -d --nr 1-4 /dev/sdb Centos 6把磁盘的分区表让内存读取(适合删除分区操作)
22. 文件系统
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等
22.1 查看当前系统支持的文件系统
ls -ld /lib/modules/$(uname -r)/kernel/fs
22.2 Linux 常用文件系统
-
ext2:适用于分区不是很大,文件更新也不频繁的情况,例如/boot
-
ext3:ext2的改进版,支持日志功能,能够帮助系统从非正常关机导致的异常中恢复
-
ext4:是ext文件系统的最新版本,提供了很多新的特性,包括秒级的时间戳,创建和使用巨型文件(16TB),最大1EB的文件系统,以及速度的提升
-
xfs:最大支持8EB的文件系统
-
swap:交换分区,模拟内存
22.3 创建文件系统
mkfs.ext4 [选项] 分区
-t {ext2|ext3|ext4|xfs} 指定文件系统类型
-b {1024|2048|4096} 指定块block大小,一个文件分配的最小空间
-L "LABEL" 设置卷标,比如可以写上挂载点
-f 强制创建文件系统
-j 相当于mkfs -t ext3
-i ? 为数据空间中每多少个字节创建一个inode;不应该小于block大小
-N ? 指定分区中创建多少个inode
-l 一个inode记录占用的磁盘空间大小 128--4096
-m 0.05 默认5%,为管理人员预留空间占总空间的百分比(可以写小数)
-O 启用或关闭指定特性,去百度
22.4 查看分区信息
blkid [选项]
-U 指定UUID来查找对应设备
-L 指定"卷标"来查找对应设备
查找分区
findfs [选项]
UUID= 使用UUID搜索
LABEL= 使用"卷标"搜索
# 范例
findfs UUID=4f3dce7e-d57d-41c5-b916-2982dfd98405
# 判断目录是否是挂载点
findmnt /boot
22.5 重新设定文件系统参数
tune2fs [选项] 分区
-l 查看指定文件系统超级块信息,xfs文件系统使用 xfs.info /目录
-L "LABEL" 修改卷标
-m ? 修改预留给管理员的空间百分比
-j 将ext2升级为ext3
-U UUID 修改UUID号
-O 文件系统属性启用或者禁用
-o 调整文件系统的默认挂载选项
-h 查看超级块信息,不显示分组
# 修改文件系统UUID
umount /dev/sdb1
tune2fs -U $(uuidgen) /dev/sdb1
22.7 文件系统挂载
挂载规则:
一个挂载点同时只能挂载一个设备
一个挂载点同时挂载了多个设备,只能看到最后一个设备的数据,其他设备上的数据将被隐藏
一个设备可以同时挂载到多个挂载点
通常挂载点一般是已存在且为空的目录
mount [选项] 块设备 挂载点
-t ext4 指定要挂载的设备上的文件系统类型
-r 只读挂载
-w 读写挂载
-n 不更新/etc/mtab,mount命令不可见
-a 自动挂载所有支持自动挂载的设备(定义在/etc/fstab文件中,且挂载选项中有auto功能)
-L "LABEL" 以卷标指定挂载设备
-U "UUID" 以UUID指定要挂载的设备
-B --bind 绑定目录到另外一个目录
-o options:(挂载文件系统的选项,多个选项使用逗号分隔)
async 异步模式,内存更改时,写入buffer,过一段时间再写到磁盘中
sync 同步模式,内存更改时,同步写磁盘
atime/noatime 禁止目录和目录下文件更新时间,据说可以优化网站5%性能
diratime/nodirtime 目录的访问时间戳
auto/noauto 是否支持开机自动挂载,是否支持-a
exec/noexec 是否支持在文件系统上运行应用程序
dev/nodev 是否支持在此文件系统上使用设备文件
suid/nosuid 是否支持suid和sgid权限
remount 重新挂载
ro 只读 rw 读写
user/nouser 是否允许普通用户挂载此设备,/etc/fstab使用
acl/noacl 启用此文件系统上的acl功能
loop 分配一个loop设备,查看目录和loop设备关联性 losetup -a
_netdev 当网络可用时,才对网络资源进行挂载,NFS文件系统
defaults 相当于rw,suid,dev,exec,auto,nouser,async
#挂载
mount /dev/sdb1 /pic
mounnt UUID="9866f965-43cf-472b-b886-24b11f89afe6" /pic
mount -U 9866f965-43cf-472b-b886-24b11f89afe6 /pic
# 将文件夹挂载到文件夹
mount -B /etc /mnt/etc
#取消挂载
umount /pic
# 重新挂载
mount -o remount,rw /pic
#查看设备正在被那些进程或用户使用
fuser -v /mysql
lsof /mysql
#杀掉所有正在使用的进程
kill -9 24153
fuser -km /mysql
#查看某个设备所有的挂载点
mount /dev/sdb1
mount
22.8 对文件创建文件系统
# 生成一个空文件
dd if=/dev/zero of=data.img bs=1M count=100
# 创建文件系统
mkfs.ext4 data.img
# 挂载
mount data.img /tmp
# 将需要的数据拷贝
cp -ra /etc /tmp
# 将文件发送到其他服务器
scp data.img root@192.168.1.17:/root/
# 在192.168.1.17上挂载data.img,实现类似U盘效果
mount data.img /tmp
22.10 /etc/fstab 文件格式
UUID或者块设备的位置 挂载文件夹 文件系统格式 挂载选项 0 0
第一个0 表示文件系统是否应该包含在备份中。0 表示不包含,1 表示包含。
第二个0 用于指定文件系统检查的顺序。0 表示不检查,1 表示先检查,其他数字则表示检查顺序的优先级。
# 范例
UUID=d98f13eb-905f-41ac-93d3-f6b0c5a994f2 /data ext4 defaults 0 0
UUID=d98f13eb-905f-41ac-93d3-f6b0c5a994f2 /data ext4 noatime,rw 0 0
# 文件挂载到文件夹不允许写UUID
/image /mnt/image ext4 defaults 0 0
# 文件夹挂载到文件夹
/etc /mnt/etc none bind 0 0
22.11 /etc/fstab 文件错误修复
故障现象表现为,开机一直读进度条,持续等待会进入紧急模式
注意:如果不能写入文件需要重新挂载根目录 mount -o remount,rw /
1.输入root口令
2.journalctl -xb 查看系统本次启动相关日志
3.确定故障原因修复
4.重启
22.12 文件系统检测和修复
文件系统故障常发生于死机或非正常关机之后,挂载文件系统表示为"no clean"
注意:一定不要在挂载状态下执行修复命令,且修复命令要与原来的文件系统相同
fsck.ext4 [选项] 块设备
-a 自动修复
-r 交互式修复错误
ext系列文件专用的检测修复工具
e2fsck [选项] 块设备
-y 自动回答为yes
-f 强制修复
-p 自动进行安全的修复
# 范例
e2fsck /dev/sda2
xfs文件系统专用检测修复工具
xfs_repair [选项] 块设备
init 1 进入单用户模式
-f 修复文件,而非设备
-n 只检查
-d 允许修复只读的挂载设备,在单用户下修复/时使用,然后立即reboot
23 交换分区 swap
23.1 swap 分区大小选择
系统中的RAM大小 | 推荐的swap大小 | 允许休眠的建议swap空间的大小 |
---|---|---|
低于2GB | RAM的2倍 | RAM容量的三倍 |
2GB-8GB | 等于RAM的大小 | 等于RAM大小 |
8GB-64GB | 4GB到RAM容量的0.5倍 | RAM容量的倍数 |
超过64G | 独立负载(至少4GB) | 不建议使用休眠功能 |
23.2 swap 的使用策略
说明:当内存在使用100%-30%=70%的时候,就开始有交换分区的使用,简单的说这个参数定义了系统对swap的使用倾向,默认值为30,值越大越倾向使用swap分区,可以设置为0,这样做并不会禁止对swap分区的使用,只是最大限度的降低了使用swap分区的可能性
[root@Centos7 ~]$ cat /proc/sys/vm/swappiness
30
echo vm.swappiness = 10 >> /etc/sysctl.conf && sysctl -p
23.3 创建swap分区
# 创建swap分区
fdisk /dev/sdb
# 格式化文件系统
mkswap /dev/sdb1
# 挂载swap分区
vim /etc/fstab
UUID=e45b02cd-bfc6-41d4-9414-b8309e0372a3 swap swap defaults 0 0
# 查询正在使用的交换分区
swapono -s
#启用swap分区
swapon /dev/sdb1
swapon -a
#禁用swap分区
swapoff /dev/sdb1
24. 移动介质
挂载意味着使外来的文件系统看起来如同是主目录树的一部分,有所移动介质也需要挂载,挂载点通常在/media 或 /mnt 下
访问前,介质必须被挂载
摘除时,介质必须被卸载
按照默认设备,非根用户只能挂载某些设备(光盘,DVD,软盘,USB等等)
24.1 光盘
# 手工挂载
mount /dev/cdrom /mnt
# ISO文件挂载
mount /data/CentOS-7-x86_64-Everything-2009.iso /mnt
# 自动挂载
执行:yum -y install autofs && systemctl enable --now autofs (Centos 7 8 使用)
执行:chkconfig autofs on && service autofs start(Centos 6 使用)
执行:cd /misc/cd
操作光盘
# 弹出光盘
eject
# 弹入光盘
eject -t
24.2 USB
工具来自:yum -y install usbutils
# 查看USB设备是否被识别,来自软件包usbutils
lsusb
# 查看日志是否检测到了新设备插入
tail -f /var/log/messages
格式化USB使其在Linux上可以使用,工具来自:yum -y install dosfstools
#格式化usb(兼容windows和centos)格式化为FAT32
mkfs.vfat /dev/sdd1
24.3 dd 指令
dd if=/PATH of=/PATH bs=? count=?
if=file 从文件读取
of=file 写到文件中
ibs=size 一次读size个byte
0bs=sizi 一次写size个byte
bs=size 指定块大小,既是ibs,也是obs
cbs=size 一次转化size个byte
skip=blocks 从开头忽略blocks个ibs大小的块,源
seek=blocks 从开头忽略blocks个obs大小的块,目标
count=n 复制n个bs
conv=conversion 用指定参数转换文件
conversion转换参数
ascii 转换EBCDIC为ASCII
ebadic 转换ASCII为EBCDIC
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
nocreat 不创建输出文件
noerror 出错时不停止
notrunc 不截断输出文件
sync 把每个输入块填充到ibs个字节,不足部分用空(nul)字符补齐
fdatasync 只有输出数据写入磁盘,才算做写入完成
# 真实写磁盘的速度:
dd if=/dev/zero of=f1.txt bs=1M count=1024 conv=fdatasync
# 克隆分区
dd if=/dev/sda1 of=sdy
# 克隆全盘数据,并使用gzip压缩
dd if=/dev/sda | gzip > /PATH
# 将克隆指定盘
dd if=/PATH of=/dev/sda
# 将压缩的克隆文件恢复到指定盘
gzip -dc /PATH | dd of=/dev/sda
25. RAID 级别工作原理
25.1 RAID 的作用
RAID 的作用
提高IO能力,磁盘并行读写
提高耐用性,磁盘冗余算法来实现
25.2 RAID 实现方式
RAID 实现方式
外接式磁盘阵列:通过扩展卡提供适配能力
内接式RAID:主板集成RAID控制器,安装OS前在BISO里配置、
软件RAID:通过OS实现
25.3 RAID 级别
RAID-0
多块相同容量硬盘合并在一起,成为一块大硬盘,存储时数据雨露均沾,依次使用每块小硬盘,提高读写速度,最小磁盘数2,2+
容易丢失数据,没有容错性
RAID-1
镜像,两块硬盘数据会同步(写同步,删同步),主要是防止有硬盘损坏(提高容错性),最少磁盘数2,2N
读性能提升,写性能下降,只能使用50%空间
RAID-4(已经淘汰)
多块硬盘放数据,一块硬盘异或校验数据,坏的硬盘可以通过校验位恢复,(x+y=校验位,校验位-y=x)最少3块硬盘才能做RAID4
RAID-5
多块硬盘放数据,随机硬盘放异或校验位,最多可以坏1块硬盘,最少3块硬盘才能做RAID5
读,写性能提升,利用率为N-1/N
RAID-6
多块硬盘放数据,随机两块硬盘放校验位,最多可以坏2块硬盘,最少4块硬盘才能做RAID6
RAID-10(最优)
多块硬盘相互组成RAID1(镜像),最后多组RAID1(镜像)组成RAID0(合并),每组镜像只能坏一块硬盘
利用率为50%
RAID-01
多块硬盘相互组成RAID0,最后多组RAID0组成RAID1
RAID-50
JBOD
将多块一个盘合并为一个大的连续空间
26. 逻辑卷
26.1 创建逻辑卷
相关工具来自:yum -y install lvm2
一、创建物理卷
# 创建物理卷,命令格式 pvcreate 硬盘名称(或者分区名称)
pvcreate /dev/sdb1
# 查看物理卷信息
pvdisplay
# 删除物理卷,命令格式 pvmove 硬盘名称(或者分区名称)
pvremove /dev/sdb1
二、创建卷组
# 创建卷组,命令格式 vgcreate 卷组名称 pv名称
vgcreate vg_mysql /dev/sdb1
# 查看卷组信息
vgdisplay
# 删除卷组,命令格式 vgremove 卷组名称
vgremove vg_mysql
三、创建逻辑卷
-l 60%vg 使用卷组的60%
-l 100%FREE 使用卷组剩余空间的100%
-L +500M 指定大小
# 创建逻辑卷,命令格式 lvcreate -n 卷组名 -L 分配大小 卷组名称
lvcreate -n lv_date -L 1G vg_mysql
# 查看逻辑卷信息
lvdisplay
# 删除逻辑卷,命令格式 lvremove 逻辑卷路径
lvremove /dev/vg_mysql/lv_date
四、创建文件系统
# 格式化文件系统
mkfs.ext4 /dev/vg_mysql/lv_date
五、挂载逻辑卷==
# 创建挂载目录
mkdir -p /mysql/data
# 挂载逻辑卷
vim /etc/fstab
UUID=ef5dc733-e379-441a-b180-a6b28e94e637 /mysql/data ext4 defaults 0 0
26.2 扩展逻辑卷空间
26.2.1 扩容卷组
卷组没有空间时,使用物理卷扩容卷组
# 创建物理卷,命令格式 pvcreate 硬盘名称(或者分区名称)
pvcreate /dev/sdc1
# 扩容卷组,命令格式 vgextend <要扩容的卷组名称> <要添加到卷组的pv路径>
vgextend vg_mysql /dev/sdc1
26.2.2 扩容逻辑卷
卷组还有剩余空间时,使用卷组扩容逻辑卷
-l 60%vg 使用卷组的60%
-l 100%FREE 使用卷组剩余空间的100%
-L +500M 指定大小
-r 扩展逻辑卷时,同步逻辑卷文件系统(推荐使用)
# 扩容逻辑卷,命令格式 lvextend -L 分配大小 -n 逻辑卷名
lvextend -L +1G -n /dev/vg_mysql/lv_date
-- 此时新扩容的空间由于没有文件系统,虽然逻辑卷空间已经增加,但是依然无法使用
# 同步逻辑卷文件系统,ext4
resize2fs /dev/vg_mysql/lv_date
# 同步逻辑卷文件系统,xfs (指定挂载目录)
xfs_growfs /mysql/data
26.2.3 同步文件系统
此时新扩容的空间由于没有文件系统,虽然逻辑卷空间已经增加,但是依然无法使用
# 同步逻辑卷文件系统,ext4
resize2fs /dev/vg_mysql/lv_date
# 同步逻辑卷文件系统,xfs (挂载目录的目录)
xfs_growfs /mysql/data
xfs_growfs / # 给/同步文件系统
26.3 缩减逻辑卷空间
缩减逻辑卷有风险(缩减空间不要小于已使用空间),建议备份重要数据,xfs 文件系统不支持缩减逻辑卷
1. 取消挂载的逻辑卷(必须执行)
umount /mysql/data
2. 检查文件系统完整性(必须执行)
fsck -f /dev/vg_mysql/lv_date 或 e2fsck -f /dev/vg_mysql/lv_date
3. 缩减文件系统空间(必须执行),将文件系统大小调整为1G
resize2fs /dev/vg_mysql/lv_date 1G
4. 缩减逻辑卷,将逻辑卷大小调整为1G,必须和文件系统大小一致
lvreduce -L 1G /dev/vg_mysql/lv_date
5. 恢复挂载,验证结果
df -h | grep /dev/vg_mysql/lv_date
lvdisplay | grep -A 15 /dev/vg_mysql/lv_date | grep 'LV Size'
26.4 逻辑卷快照
26.4.1 逻辑卷快照原理
快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝,对于需要备份或者复制的现有数据临时拷贝以及其他操作来说,快照是最合适的选择,快照只有在它们和原来的逻辑卷不同时才会消耗空间,建立快照的卷大小,小于等于原始逻辑卷,也可以使用lvextend扩展快照
逻辑卷快照
逻辑卷快照就是将当时的系统信息记录下来,就好像照相一样,将来有任何数据改动了,则改动前的原始数据会被移动到快照区。没有改动的区域则由快照区和文件系统共享
工作原理
- 在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照改变时才会使用这些空间。
- 当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
- 快照中只含有原来的逻辑卷中未更改的数据或者生成快照后的快照中更改的数据
由于快照区与原本的LV公用很多PE区块,因此快照与被快照的LV必须在同一共VG中,系统恢复的时候的文件数量不能高于快照区的实际容量。
快照特点
- 备份速度快,只是创建了LV
- 应用场景是测试,不能完全代替备份
- 快照之后,逻辑卷的修改速度会收到一定印象
26.4.2 创建逻辑卷快照
创建逻辑卷快照,快照必须和 lv 在同一个 vg 中
可以创建多个快照,每个快照记录的都是快照创建时,逻辑卷的状态
# 查看卷组剩余空间
vgdisplay | grep -A 16 vg_mysql | grep 'PE Size'
# 创建逻辑卷快照,快照的大小必须小于lv的大小
lvcreate -n 快照名称 -s -L 快照空间大小 对那个lv来创建
lvcreate -n lv_date_kz -s -L 500M /dev/vg_mysql/lv_date
# 挂载逻辑卷快照ext4
mount -o ro /dev/vg_mysql/lv_date_kz /tmp
# 挂载逻辑卷快照,xfs
mount -o nouuid,ro /dev/vg_mysql/lv_date_kz /tmp
# 删除逻辑卷快照
lvremove /dev/vg_mysql/lv_date_kz
# 快照和逻辑卷的大小一致
/dev/mapper/vg_mysql-lv_date 976M 2.6M 912M 1% /mysql/data
/dev/mapper/vg_mysql-lv_date_kz 976M 2.6M 912M 1% /tmp
26.4.3 逻辑卷快照还原
逻辑卷中记录的是最新的数据,而快照中记录的都是快照创建时,逻辑卷的状态
# 取消逻辑卷和逻辑卷挂载的全部挂载(离线状态才可以还原快照)
umount /mysql/data
umount /tmp
# 逻辑卷还原快照,命令格式 lvconvert --merge 快照逻辑卷名称
lvconvert --merge /dev/vg_mysql/lv_date_kz
# 此时还原的快照已经被删除(该指令返回找不到逻辑卷)
lvdisplay /dev/vg_mysql/lv_date_kz
# 重新挂载还原的逻辑卷
mount /dev/mapper/vg_mysql-lv_date /mysql/data
26.5 拆卸更换逻辑卷硬盘
参考Linux入门到精通P69最后20分钟
27. 网络协议
27.1 网络基础
27.1.1 网络的范围分类
- 广域网
- 城域网
- 局域网
27.1.2 网络的特征
速度(带宽)
1B=8b,100Mbps=102400Kbps
102400Kbps/8=12800KBps
100M 宽带最大下载速度为12.8M/s
27.2 网络标准OSI七层结构
7.应用层 Application 针对特定应用的协议,邮件协议、文件传输协议、远程协议
6.表示层 Presentation 设备固有数据格式和网络标准数据格式转换(不同的标准代表不同的信息)
5.会话层 Session 通信管理,负责建立和断开通信连接,管理传输层一下的分层
4.传输层 Transport 确保数据成功到达,数据校验
3.网络层 Network 地址管理和路由选择(经过那个路由传递到目标地址?)
2.数据链路层 Date link 互联设备之间的数据传输和特定数据结构的数据帧
1.物理层 Physical 硬件互联(无线/有线)1个字节=8位
27.3 网络通信过程
27.3.1 协议数据单元PUD
PDU 协议数据单元是值对等层次之间传递的数据单位
物理层的PDU是数据位 bit
数据链路层的PDU是数据帧 frame
网络层的PDU是数据包 packet
传输层的PDU是数据段 segment
其他更高层次的PUD是消息 message
27.3.2 三种通讯模式
单播(unicast):发送报文的目标唯一,不代表收到的人只有一个
广播(broadcast):发送报文的目标是一定范围内的所有
组播(multicase):发送报文的目标是部分计算机,一部分人
27.3.3 冲突域和广播域
冲突域:当两个网络设备同时发送数据,如果发送了冲突,则两个设备处于同一个冲突域,反之,则各自处于不同的冲突域
广播域:一个网络设备发送广播,另一个设备收到了,则两个设备处同一个广播域,反之,则各自处于不同的广播域
27.3.4 三种通讯机制
单工:只能一个方向传(喇叭、音响、收音机)
半双工:不能同时收和发(对讲机)
全双工:同时收发(手机)
27.4 网络设备
27.4.1 交换机
交换机处于数据链路层,交换机内部RAM芯片,会记录一张MAC地址和交换机端口对应的表,当目标的MAC在表中有记录时,交换机将直接将数据帧发送给对应端口,当一个新的目标地址出现时,交换机通过MAC表没有找到对应端口,将泛洪,数据帧会从所有端口转发出去,这一个过程会让交换机记录下目标地址和源地址的端口,从而下次将不在泛洪
如果一个数据帧的目标地址是所有地址,交换机将广播,将数据帧发送到所有的端口,过多的广播会造成广播风暴,网络堵塞
27.4.2 路由器
路由器处于网络层
27.5 以太网
27.5.1 以太网 MAC 帧结构
- 前导信息(Preamble):通常是7个字节的前导码,用于同步接收端的时钟,并标识数据帧的开始。
- 起始帧界定符(Start Frame Delimiter):1个字节,标志着数据帧的开始。
- 目标MAC地址(Destination MAC Address):通常是6个字节,指示了数据帧的目标设备的MAC地址。
- 源MAC地址(Source MAC Address):同样是6个字节,指示了数据帧的发送者的MAC地址。
- 类型/长度字段(Type/Length Field):通常是2个字节,用于标识数据帧中封装的上层协议类型(如IPv4、IPv6、ARP等)或指定数据帧的长度。
- 数据(Data):数据帧的实际数据部分,长度可以变化,最小长度为46字节。
- 校验和序列(Frame Check Sequence,FCS):通常是4个字节,包括CRC(循环冗余检测)校验码,用于检测数据帧在传输过程中的错误。
27.6 虚拟局域网 VLAN
将交换机的端口划分不同的网段,实现广播域隔离,将路由器的两端分别接入不同的VLAN,实现不通的VLAN通讯,而带有路由功能的交换机被称之为三层交换机,即可以实现网络层功能
27.8 TCP/IP协议
27.8.1 TCP/IP 分层结构
27.8.2 TCP/IP 通信过程
27.8.3 TCP包头结构
27.8.4 TCP 三次握手
27.8.5 TCP 四次挥手
27.9 端口
27.9.1 端口分类
传输层通过port号,确定应用层协议,范围0-65535
-
0-1023:系统端口或特权端口(仅管理员可用),众所周知,永久的分配给固定的系统应用使用,22/TCP(ssh),80/TCP(http),443/TCP(https)
-
1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用,1443/TCP(sql server),1521/TCP(oracle),3306/TCP(mysql),11211/tcp/udp(memcached)
-
49152-65535:动态或私有端口,客户端随机使用端口,范围定义:
27.9.2 定义随机端口范围
客户端访问服务器时,使用随机端口,可以定义随机端口使用的范围
# 查看
cat /proc/sys/net/ipv4/ip_local_port_range
# 临时修改
echo 20000 65535 > /proc/sys/net/ipv4/ip_local_port_range
# 著名服务用的端口号
less /etc/services
27.9.3 端口监听
# 安装nc工具包
yum -y install nc
# 打开9527端口
nc -l 9527
# 访问9527端口
nc 192.168.1.8 9527
27.9.4 查看端口被那个PID/程序占用
工具来自:yum -y install lsof
ss -tunp
lsof -i:22
27.9.5 判断远程主机端口是否打开
# 0 表示打开,1 表示关闭
[root@Centos ~][0]$ < /dev/tcp/192.168.1.17/22
[root@Centos ~][0]$
# 关闭状态
[root@Centos ~][0]$ < /dev/tcp/192.168.1.17/23
-bash: connect: Connection refused
-bash: /dev/tcp/192.168.1.17/23: Connection refused
[root@Centos ~][1]$
27.10 Internet 层
27.10.11 ping 工具
ping [选项] 目标IP
-c ? 指定ping请求次数
-i ? 每次请求间隔时间,以秒为单位
-s ? 指定数据包大小,以字节为单位
-t ? 设置存活数值TTL的大小。
-w ? 等待响应的超时时间,以秒为单位
-W ? 等待指定时间后执行
-q 安静模式,不显示每个ping请求的输出
-f 洪水模式,尽全力ping目标IP
-I 指定发起ping请求的IP
# 判断网络是否可达
ping 192.168.1.7
# 发送指定字节
ping 192.168.1.7 -s 65507
27.10.12 ARP 地址解析协议
ARP 工作原理
- ARP请求: 当设备在本地网络中要与另一台设备通信时,它首先检查本地 ARP 缓存(ARP缓存是一个存储IP地址与MAC地址映射的表格)。如果要访问的目标地址不在缓存中,它将广播发送一个ARP请求。该请求包含发送方设备的IP地址和MAC地址,以及目标设备的IP地址。这个广播帧会发送到本地网络上的所有设备。如果,ARP协议发现目标地址不和自己处于一个网段,将会找自己的网关,让网关将自己的请求交给目标地址
- ARP应答: 当网络上的设备收到ARP请求后,目标设备会检查请求中的IP地址是否与自己的IP地址相匹配。如果匹配,目标设备会发送一个ARP应答,包含自己的MAC地址。这个应答消息只会发送给ARP请求中指定的源设备。
- 更新ARP缓存: 源设备收到来自目标设备的ARP应答后,它将更新自己的ARP缓存,将目标设备的IP地址和MAC地址进行关联,以便将来通信时能够直接使用该信息。
- 通信: 有了IP地址到MAC地址的映射后,源设备就能够构建数据帧并将其发送到目标设备。数据帧中包含目标设备的MAC地址,确保数据能够被正确路由到目标设备。
免费 ARP IP地址冲突检测原理
- 服务器获取IP地址: 服务器在配置网络接口时被分配了IP地址,例如192.168.1.7。
- 发送ARP请求: 一旦服务器拥有IP地址,它会尝试使用ARP请求广播来查找与该IP地址关联的MAC地址。服务器会发送ARP请求消息,询问局域网上的所有设备:“谁是192.168.1.7的MAC地址?”
- 等待响应: 服务器将等待一定次数或一段时间以获取ARP响应。在这段时间内,其他设备在局域网上接收到了这个ARP请求。
- 检测冲突: 如果另一台设备已经使用了IP地址192.168.1.7并发送了ARP响应,这将导致服务器接收到多个具有相同IP地址但不同MAC地址的ARP响应。这是一个明显的冲突标志。
- 解决冲突: 一旦服务器检测到IP地址冲突,它应该采取措施来解决冲突,通常通过更改其IP地址或定位和解决与之冲突的设备。解决冲突后,服务器应该重新发送ARP请求以获取正确的MAC地址。
反向 ARP 动态IP地址获取原理
- RARP服务器:在网络中,通常有一个或多个RARP服务器,它们维护MAC地址到IP地址的映射表。
- RARP请求:当计算机启动时,它可能不知道自己的IP地址,但它会知道自己的MAC地址。计算机发送一个RARP请求广播,通知网络上的RARP服务器说:“这是我的MAC地址,请告诉我我的IP地址是什么?”
- RARP响应:RARP服务器接收到请求后,查询其映射表以查找相应的IP地址,然后将响应发送回请求计算机。这个响应包含了计算机所需的IP地址。
- IP地址配置:计算机接收到RARP响应后,可以配置其IP地址,并随后在网络上正常通信。
ARP 指令
-s IP和MAC地址绑定
# 显示 arp 缓存
arp -n
# 清理 arp 缓存
arp -d 192.168.1.17
# 手动绑定MAC地址
arp -s 192.168.1.17 00:0c:29:37:d7:b4
28. IP 地址
28.1 IP 地址分类
网段数=2^可变的网络ID的位数
主机数=2^主机ID位数-2
281.1 A类
0-127.X.Y.Z
网络ID位是最高的8位,主机ID是24位低位
网段数:2^7-2=126
每个网络中的主机数:2^24-2=16777214
默认子网掩码:255.0.0.0
28.1.2 B类
128-191.X.Y.Z
网络ID位是最高的16位,主机ID是16位低位
网段数:2^16-2=16384
每个网络中的主机数:2^16-2=65534
默认子网掩码:255.255.0.0
28.1.3 C类
192-223.X.Y.Z
网络ID位是最高的24位,主机ID是8位低位
网段数:2^24-3=2097152
每个网络中的主机数:2^8-2=254
默认子网掩码:255.255.255.0
28.1.4 D类
组(多)播224-239.X.Y.Z
28.1.5 E类
保留未使用,240-255
28.1.6 私有IP地址
不直接用于互联网,通常是在局域网中使用
A类 10.0.0.0到10.255.255.255
B类 172.16.0.0到172.31.255.255
C类 192.168.0.0到192.168.255.255
28.1.7 公有IP地址
互联网上设备拥有的唯一地址
A类 1.0.0.0到9.255.255.255
11.0.0.0到126.255.255.255
B类 128.0.0.0到172.15.255.255
172.32.0.0到191.255.255.255
C类 192.0.0.0到192.167.255.255
192.169.0.0到223.255.255.255
28.1.8 特殊地址
- 0.0.0.0
0.0.0.0并不是一个真正意义上的IP地址,它表示所有不清楚的主机和目的网络
- 255.255.255.255
限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机
- 127.0.0.1~127.255.255.254
本机回环地址,主要用于测试,在传输介质上永远不应该出现目的地址位127.0.0.1的数据包
- 224.0.0.0~239.255.255.255
组播地址,224.0.01特值所有主机,224.0.0.2特指所有路由器。224.0.0.5值OSPF路由器,地址多用于一 些特定的程序以及多媒体程序
- 169.254.X.X
如果windows主机使用DHCP自动分配地址,而又无法从DHCP服务器获取地址,系统会为主机分配这样的 地址
28.2 子网掩码
CIDR:无类域间路由,目前的网络已不再按A、B、C类划分网段,可以任意指定网段的范围
CIDR:无类域间路由表示法:IP/网络ID位数,如172.16.0.100/16
netmask子网掩码:32位或128位(ipv6)的数字,和IP成对使用,用来确认IP地址中的网络ID和主机ID,对应网络ID的位为1,对应主机ID的位为0,变现为连续的高位为1,连续的低位为0
29 网络配置
29.1 网卡信息
工具来自:yum -y install net-tools
# 查看网卡信息,命令格式 ethtool 网卡名
ethtool eth0
29.2 网卡驱动
# 查看网卡驱动
ethtool -i ens33 | grep driver
# 卸载网卡驱动,命令格式 modprobe -r 网卡驱动名
modprobe -r e1000
# 加载网卡驱动,命令格式 modprobe 网卡驱动名
modprobe e1000
29.3 网卡命名
29.3.1 网卡命名规则
en: Ethernet 有线局域网
w]: wlan 无线局域网
ww: wwan无线广域网
o<index>: 集成设备的设备索引号
s<s1ot>: 扩展槽的索引号
X<MAC>: 基于MAC地址的命名
p<bus>s<slot>: enp2s1
29.3.2 网卡命名配置文件
# 查看网卡的mac地址或其他唯一标识符
ip addr show
# 创建自定义的 udev 规则文件:在 /etc/udev/rules.d/ 目录下创建一个 .rules 后缀的文件
vi /etc/udev/rules.d/eth1-custom-eth.rules
# 查看网卡驱动,可以在下面规则指令中,增加网卡驱动选项
ethtool -i ens160 | grep driver
# 编辑规则文件并添加规则:在编辑器中添加一个 SUBSYSTEM 和 ATTR{address} 基于网卡的硬件标识符的规则。使用 NAME 关键字来指定自定义的网卡名称。
SUBSYSTEM=="net", ACTION=="add",DRIVERS=="?*",ATTR{address}=="00:0c:29:d8:cb:85",ATTR{type}=="1",KERNEL=="eth*",NAME="eth1"
# 重新加载 udev 规则:使用以下命令重新加载 udev 规则,以使新规则生效。
udevadm control --reload-rules
# 修改网卡配置文件名和网卡名
# 重启网络服务
systemctl restart NetworkManager
# 重启服务器
reboot
29.2.1 脚本:多网卡修改eth0
#!/bin/bash
# 修改终端符号带命令返回值
[[ ${PS1} = '[\u@\h \W]\$ ' ]] && echo 'PS1="[\u@\h \w][\$?]$ "' >> ~/.bashrc
# 修改网卡名称为eth0
iplist=$(cd /sys/class/net/ && /bin/ls -d e*)
source /etc/os-release
echo -n > /etc/udev/rules.d/70-persistent-net.rules
count=0
Centos_address=7
Rocky_address=9
for i in $iplist; do
echo 'SUBSYSTEM=="net",ACTION=="add",DRIVERS=="?*",ATTR{address}=="'$(cat /sys/class/net/$i/address)'",ATTR{type}=="1",KERNEL=="eth*","NAME="eth'${count}'"' >> /etc/udev/rules.d/70-persistent-net.rules
# 如果是Rocky Linux则执行以下操作
if [ "$NAME" = 'Rocky Linux' ]; then
cat > /etc/NetworkManager/system-connections/${i}.nmconnection << EOF1
[connection]
id=eth${count}
uuid=$(uuidgen)
type=ethernet
autoconnect-priority=-999
interface-name=eth${count}
[ethernet]
[ipv4]
address1=192.168.1.${Rocky_address}/24,192.168.1.2
dns=192.168.1.2;
[ipv6]
addr-gen-mode=eui64
method=auto
[proxy]
EOF1
count=$((count + 1))
Rocky_address=$((Rocky_address + 10))
fi
# 如果是CentOS Linux则执行以下操作
if [ "$NAME" = 'CentOS Linux' ]; then
cat > /etc/sysconfig/network-scripts/ifcfg-eth${count} << EOF2
TYPE=Ethernet
NAME=eth${count}
MACADDR=$(cat /sys/class/net/${i}/address)
DEVICE=eth${count}
UUID=$(uuidgen)
BOOTPROTO=static
IPADDR=192.168.1.${Centos_address}
PREFIX=24
GATEWAY=192.168.1.2
DNS1=192.168.1.2
ONBOOT=yes
EOF2
count=$((count + 1))
Centos_address=$((Centos_address + 10))
mv /etc/sysconfig/network-scripts/ifcfg-${i} /etc/sysconfig/network-scripts/${i}
fi
done
# 重新加载udev规则文件
udevadm control --reload-rules
# 重新生成grub
sed -Ei.bak '/^GRUB_CMDLINE_LINUX/s/(GRUB.*)"/\1 net.ifnames=0 biosdevname=0"/' /etc/default/grub
grub2-mkconfig -o /boot//grub2/grub.cfg
shutdown -r now
29.4 网络配置文件详解
29.4.1 Centos 网卡配置
cd /etc/sysconfig/network-scripts/
TYPE= 接口类型;常见有的Ethernet,Bridge
NAME= 此配置文件给那个网卡使用的网卡名
MACADDR= 修改网卡MAC地址,逻辑上修改,可以直接写自定义的MAC地址
DEVICE= 此配置文件给那个网卡使用的网卡名
HWADDR= 对应的设备的MAC地址,可以使用ip link show sen33 查看网卡MAC地址,需要和实际MAC对应
UUID= 设备的唯一标识,可以使用uuidgen生成
BOOTPROTO= 激活此设备时使用的地址配置协议,常见的有dhcp,static(静态),none,bootp
IPADDR= IP地址
NETMASK= 子网掩码,如255.255.255.0 √ 二选一
PREFIX= 网络ID的位数,如24 √ 二选一
GATEWAY= 默认网关
DNS1= 第一个DNS服务器
DNS2= 第一个DNS服务器
DOMAIN= ping www补全的后缀
ONBOOT=yes 表示网卡随系统开机而启用,避免单点失败
# DHCP配置
DEVICE=eht0
BOOTPROTO=dhcp
29.4.1 Ubuntu 网卡配置
官网文档:
https://help.ubuntu.com
https://ubuntu.com/server/docs
29.5 网络配置相关命令
29.5.1 ifconfig 命令
工具来自:yum -y install net-tools
# 显示活动的网卡信息
ifconfig
# 效果类似拔网线,禁用网卡
ifconfig ens33 down
# 效果类似插网线,启用网卡
ifconfig ens33 up
# 临时设置网卡IP,重启失效,想要恢复可以重新设置原来的IP
ifconfig ens33 192.168.1.100
# 清空网卡IP,重启失效
ifconfig ens33 0.0.0.0
# 临时添加一个IP,并设置虚拟接口名为ens33-1
ifconfig ens33:ens33-1 192.168.1.101
# 删除临时IP
ifconfig ens33:ens33-1 down
# 查看网卡流量使用情况
ifconfig -s
29.5.2 ip 命令
# 查看所有网卡状态
ip link
# 显示指定网卡信息
ip addr show eth0
# 拔网线
ip link set eth0 down
# 插网线
ip link set eth0 up
# 临时修改网卡名
ip link set ens33 name eth0
# 临时添加一个IP地址
ip addr add 192.168.1.100/24 dev eth0
# 临时删除一个IP地址
ip addr del 192.168.1.100/24 dev eth0
# 清空IP地址
ip addr flush dev eth0
# 修改IP地址
ip addr change 192.168.1.100/24 dev eth0
# 查看网卡流量使用情况
ip -s link show eth0
# 显示路由信息
ip route
# 显示接口路由信息
ip route show dev eth0
# 添加网络接口的默认网关
ip route add default via 192.168.0.1 dev eth0
# 删除网络接口的默认网关
ip route del default via 192.168.0.1 dev eth0
# 添加一条网络路由
ip route add 192.168.2.0/24 via 192.168.1.1
# 删除一条网络路由
ip route del 192.168.2.0/24 via 192.168.1.1
ip link show # 显示网络接口信息
ip link delete flannel.1 # shan'chu
ip link set eth0 up # 开启网卡
ip link set eth0 down # 关闭网卡
ip link set eth0 promisc on # 开启网卡的混合模式
ip link set eth0 promisc offi # 关闭网卡的混个模式
ip link set eth0 txqueuelen 1200 # 设置网卡队列长度
ip link set eth0 mtu 1400 # 设置网卡最大传输单元
ip addr show # 显示网卡IP信息
ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1
ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址
ip route show # 显示系统路由
ip route add default via 192.168.1.254 # 设置系统默认路由
ip route list # 查看路由信息
ip route add 192.168.4.0/24 via 192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口
ip route add default via 192.168.0.254 dev eth0 # 设置默认网关为192.168.0.254
ip route del 192.168.4.0/24 # 删除192.168.4.0网段的网关
ip route del default # 删除默认路由
ip route delete 192.168.1.0/24 dev eth0 # 删除路由
- 手动创建cni0网卡
---> 假设 master231的flannel.1是10.100.0.0网段。
ip link add cni0 type bridge
ip link set dev cni0 up
ip addr add 10.100.0.1/24 dev cni0
---> 假设 worker232的flannel.1是10.100.1.0网段。
ip link add cni0 type bridge
ip link set dev cni0 up
ip addr add 10.100.1.1/24 dev cni0
29.5.3 nmcli 命令
nmcli 是软件 NetworkManager 的提供的命令。使用 nmcli 命令时,必须确保 NetworkManager 为运行状态
networking 可以简写为,n,ne,net,netw,netwo,networ,network
connectivity 可以简写为,c,co,con,conn ......
# 查看 NetworkManager 是否接管网络设置
nmcli networking
# 启动网络服务
nmcli net on
# 关闭网络服务,所有网卡全down
nmcli net off
# 重新加载网络服务
nmcli connection reload
nmcli con mod | 对应文件配置 |
---|---|
ipv4.method manual | BOOTPROTO=none |
ipv4.method auto | BOOTPROTO=dhcp |
ipv4.addresses 192.168.2.1/24 | IPADDR=192.168.2.1 PREFIX=24 |
ipv4.gateway 172.16.0.200 | GATEWAY=172.16.0.200 |
ipv4.dns 8.8.8.8 | DNS0=8.8.8.8 |
ipv4.dns-search example.com | DOMAIN=example.com |
ipv4.ignore-auto-dns true | PEERDNS=no |
connection.autoconnect yes | ONBOOT=yes |
connection.id eth0 | NAME=eth0 |
connection.interface-name eth0 | DEVICE=eth0 |
802-3-ethernet.mac-address . . . | HWADDR=. . . |
29.5.3.1 nmcli 实现bonding
# 创建Bonding接口
nmcli con add type bond con-name mybond0 ifname bond0 mode active-backup ipv4.method manual ipv4.addresses 192.168.1.200/24
# 添加从属接口
nmcli con add con-name mybond0-eth0 ifname ens33 type bond-slave master bond0
nmcli con add con-name mybond0-eth1 ifname ens36 type bond-slave master bond0
# 注: 如果没有为从属接口提供连接名,则该名称是接口名称加类型构成
# 查看正在使用的接口
nmcli connection
# 删除原网卡的接口
nmcli connection delete 接口名
nmcli connection delete 接口名
# 要启动Bonding接口,必须首先启动从属接口
nmcli con up mybond0-eth0
nmcli con up mybond0-eth1
# 启动Bonding接口
nmcli con up mybond0
29.6 验证生效的网络配置
# 验证IP地址是否生效
ip addr
# 验证网关是否生效
route -n
# 验证DNS是否生效
cat /etc/resolv.conf
29.6 网卡双IP永久保存
1.可以直接在原IP配置文件中,写两个IP、子网掩码、网关
2.可以将网卡文件复制一份,改成 DEVICE=ens33:1 复制的网卡文件名称也改成ifcfg-ens33:1
# 重启网络服务
systemctl start network
29.7 网卡配置静态和动态同时使用
网卡别名的配置文件必须使用静态地址
1.将网卡文件复制一份,改成 DEVICE=ens33:1 复制的网卡文件名称也改成ifcfg-ens33:1
2.修改ifcfg-ens33配置文件为DHCP
# 重启服务器
reboot
29.8 网卡聚合
将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者均衡负载,直接给两块网卡设置同一IP地址是不可以的,通过bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址
29.8.1 bonding 7种工作模式
-
Round Robin (balance-rr): Mode 0
轮询,数据包依次在可用的接口之间轮流发送。它可以提供负载均衡
-
Active-Backup: Mode 1
主备,一个接口处于活动状态,另一个接口处于备用状态。如果活动接口失效,备用接口会接管并成为活动接口
-
XOR (balance-xor):Mode 2
根据发送数据包的源和目标MAC地址,将数据包分布到可用接口。同一源和目标地址的数据包将始终通过相同的接口发送。
-
Broadcast:Mode 3
所有接口都被用于发送和接收数据,但只有接收数据时会将数据包发送到所有接口。
-
802.3ad (LACP):Mode 4
通过使用 LACP(Link Aggregation Control Protocol)协议来动态协商工作模式,从而实现接口绑定。这需要交换机端也支持 LACP。
-
TLB (balance-tlb):Mode 5
根据每个接口的负载情况,将数据包发送到可用接口。接口的负载越低,发送的数据包越多。
-
ALB (balance-alb):Mode 6
类似于
balance-tlb
,但在接口失效时,会将MAC地址映射到另一个可用接口,以提供冗余。
29.8.2
29.8.3 实现 Mode 1 模式
# 创建bonding设备的配置文件
vim /etc/sysconfig/network-scripts/ifcfg-bond1
TYPE=bond
DEVICE=bond1
BOOTPROTO=none
IPADDR=192.168.1.200
PREFIX=24
BONDING_OPTS="mode=1 miimon=100" miimon指定链路监测时间间隔。如果miimon=100,那么系统每100ms检测一次链路连接状态,如果有一条线路不通就转入另一条线路,这里使用 mode1 模式
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond1
SLAVE=yes
ONBOOT=yes
vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond1
SLAVE=yes
ONBOOT=yes
# 重启网络服务
systemctl restart network
# 重启后确认依然能生效
shutdown -r now
#查看bond状态
cat /proc/net/bonding/bond1
删除bond
# 禁用
ip link set down dev bond0
# 卸载驱动
modprobe -r bonding
# 删除bonding配置文件
mv /etc/sysconfig/network-scripts/ifcfg-bond1 /tmp
# 恢复原来网卡的配置文件
29.8.4
29.8.5 实现 Mode 3 模式
# 创建bonding设备的配置文件
vim /etc/sysconfig/network-scripts/ifcfg-bond1
TYPE=bond
DEVICE=bond1
BOOTPROTO=none
IPADDR=192.168.1.200
PREFIX=24
BONDING_OPTS="mode=3 miimon=100" miimon指定链路监测时间间隔。如果miimon=100,那么系统每100ms检测一次链路连接状态,如果有一条线路不通就转入另一条线路,这里使用 mode1 模式
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond1
SLAVE=yes
ONBOOT=yes
vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond1
SLAVE=yes
ONBOOT=yes
# 重启网络服务
systemctl restart network
# 重启后确认依然能生效
shutdown -r now
#查看bond状态
cat /proc/net/bonding/bond1
删除bond
#禁用网卡
ip link set down dev bond1
#卸载驱动
modprobe -r bonding
#删除bonding配置文件
mv /etc/sysconfig/network-scripts/ifcfg-bond1 /tmp
#恢复原来网卡的配置文件
29.8.6
29.8.7
29.8.8
29.9 网络组 Network Teaming
网络组:是将多个网卡聚合在一起的方法,从而实现冗错和提高吞吐量,网络组不同于旧版中bonding
技术,提供更好的性能和扩展性,网络组由内核驱动和teamd
守护进程实现
29.9.1 实现网络组
# 创建team接口
nmcli con add con-name myteam0 ifname team0 type team config '{"runner":{"name":"activebackup"}}' ipv4.method manual ipv4.addresses 192.168.1.200/24
# 添加从属接口
nmcli con add con-name myteam0-eth0 type team-slave master team0 ifname ens33
nmcli con add con-name myteam0-eth1 type team-slave master team0 ifname ens36
# 注: 如果没有为从属接口提供连接名,则该名称是接口名称加类型构成
# 查看正在使用的接口
nmcli connection
# 删除原网卡的接口
nmcli connection delete 接口名
nmcli connection delete 接口名
# 重新加载网卡配置文件
nmcli con reload
# 要启动Bonding接口,必须首先启动从属接口
nmcli con up mybond0-eth0
nmcli con up mybond0-eth1
# 启动Bonding接口
nmcli con up mybond0
# 查看网络组状态
teamdctl team0 state
29.10 Linux 网络桥
工具来自:yum -y install bridge-utils
29.11 网络测试诊断工具
-
测试网络连通性
ping
-
显示正确的路由表
ip route
-
路由追踪
traceroute
tracepath
mtr
-
确认名称服务器使用
nslookup
host
dig
-
抓包工具
tcpdump
wireshark
-
安全扫描工具
nmap
netcat
-
流量控制工具
tc
29.11.1 tcpdump
网络数据包截取分析工具,支持针对网络层、协议、主机、网络或端口的过滤
-a 尝试将网络和广播地址转换成名称
-c ? 收到指定的数据包数目后,就停止输出操作
-d 把编译过的数据包编码转换成可阅读的格式,并输出到标准输出
-dd 把编译过的数据包编码转换成C语言的格式,并输出到标准输出
-ddd 把编译过的数据包编码转换成十进制数字的格式,并输出到标准输出
-e 在每列输出资料上显示连接层级的文件头
-f 用数字显示实际网络地址
-F <文件> 指定内含表达方式的文件
-i <网络界面> 使用指定的网络界面送出数据包
-l 使用标准输出列的缓冲区
-n 不把主机的网络地址转换成名字
-N 不列出域名。
-o 不将数据包编码最佳化。
-p 不让网络界面进入混杂模式。
-q 快速输出,仅列出少数的传输协议信息。
-r<数据包文件> 从指定的文件读取数据包数据。
-s<数据包大小> 设置每个数据包的大小。
-S 用绝对而非相对数值列出TCP关联数
-t 在每列倾倒资料上不显示时间戳记。
-tt 在每列倾倒资料上显示未经格式化的时间戳记
-T<数据包类型> 强制将表达方式所指定的数据包转译成设置的数据包类型
-v 详细显示指令执行过程。
-vv 更详细显示指令执行过程。
-x 用十六进制字码列出数据包资料。
-w<数据包文件> 把数据包数据写入指定的文件。
# 不指定任何参数,监听第一块网卡上经过的数据包。
tcpdump
# 监听特定网卡
tcpdump -i eth0
# 监听主机出入的通信包
tcpdump host 192.168.1.100
# 监听特定来源
tcpdump src host hostname
# 监听特定目标地址
tcpdump dst host hostname
# 如果不指定src和dst,那么来源或者目标是hostname的通信都会被监听
tcpdump host hostname
# 监听特定端口
tcpdump port 3000
# 监听TCP/UDP
tcpdump tcp
#来源主机+端口+TCP,监听来自主机10.0.0.100在端口22上的TCP数据包
tcpdump tcp port 22 and src host 10.0.0.100
#监听特定主机之间的通信
tcpdump ip host 10.0.0.101 and 10.0.0.102
#10.0.0.101和除了10.0.0.1之外的主机之间的通信
tcpdump ip host 10.0.0.101 and ! 10.0.0.1
29.11.2 nmap
扫描远程主机工具:yum -y install nmap
-sT TCP connect()扫描,这是最基本的 TCP 扫描方式。这种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息
-sS TCP 同步扫描 (TCP SYN),因为不必全部打开一个 TCP 连接,所以这项技术通常称为半开扫描 (half-sSopen)。这项技术最大的好处是,很少有系统能够把这记入系统日志
-sF,-sX,-SN 秘密FIN 数据包扫描、圣诞树(Xma Tree)、空(Nu1) 扫模式。这些扫描方式的理论依据是:关闭的端口需要对你的探测包回应 RST 包,而打开的端口必需忽略有问题的包
-sP ping 扫描,用 ping 方式检查网络上哪些主机正在运行。当主机阻塞 ICMP echo 请求包是 ping 扫描是sP无效的。nmap 在任何情况下都会进行 ping 扫描,只有目标主机处于运行状态,才会进行后续的扫描
-sU UDP 的数据包进行扫描,想知道在某台主机上提供哪些 UDP 服务,可以使用此选项
-SA ACK 扫描,这项高级的扫描方法通常可以用来穿过防火墙。
-sw 滑动窗口扫描,非常类似于 ACK 的扫描
-SR RPC 扫描,和其它不同的端口扫描方法结合使用。
-b FTP 反弹攻击 (bounce attack),连接到防火墙后面的一台 FTP 服务器做代理,接着进行端口扫描
-pO 在扫描之前,不 ping 主机。
-PT 扫描之前,使用 TCP ping 确定哪些主机正在运行
-PS 对于 root 用户,这个选项让 nmap 使用 SYN 包而不是 ACK 包来对目标主机进行扫描。
-PI 设置这个选项,让 nmap 使用真正的 ping(ICMP echo 请求)来扫描目标主机是否正在运行。
-PB 这是默认的 ping 扫描选项。它使用 ACK(-PT)和 ICMP(-PI) 两种扫型并行扫描。如果防火墙能够过滤其中一种包,使用这种方法,你就能够穿过防火墙。
-O 这个选项激活对 TCP/IP 指纹特征 (fingerprinting) 的扫描,获得远程主机的标志,也就是操作系统类型
-I 打开 nmap 的反向标志扫描功能
-f 使用碎片 IP 数据包发送 SYN、FIN、XMAS、NULL。包增加包过滤、入侵检测系统的难度,使其无法知道你的企图
-v 冗余模式,强烈推荐这个选项,它会给出扫描过程中的详细信息。
-S <IP> 一些情况下 nmap 可能无法确定你的源地址。在这种情况下用这个选项给出 IP 地址
-g port 设置扫描的源端口
-oN 把扫描结果重定向到一个可读的文件 logfilename 中
-oS 扫描结果输出到标准输出
--host_timeout 设置扫描一台主机的时间,以毫秒为单位,默认情况下,没有超时限制
--max_rtt_timeout 设置对每次探测的等待时间,以毫秒为单位,如果超过这个时间限制就重传或超时,默认值大约是900毫秒
--min_rtt_timeout 设置 nmap 对每次探测至少等待你指定的时间,以毫秒为单位
-M count 设置进行 TCP connect() 扫描时,最多使用多少个套接字进行并行的扫描
# TCP ack 扫描,并发2000,速度快
nmap -n -PA --min-parallelism 2000 172.16.0.0/16
# 仅列出指定网段上的每台主机,不发送任何报文到目标主机
nmap -sL 192.168.1.0/24
# 扫描主机范围
nmap -sP 192.168.1.0-255
# 扫描地址段
nmap -sP -v 192.168.1.0/24
# 扫描指定主机端口使用情况
nmap -v -A 10.0.0.7
30. 路由管理
30.1 路由表构成
-
Destination:目标网络ID,表示可以到达的目标网络ID,0.0.0.0表示所有未知网络,又称为默认路由,优先级最低
-
Gateway:(网关)到达非直连的网络,将数据发送到临近(下一个)路由器的临近本主机的接口的IP地址,如果是直连网络gateway是0.0.0.0rout
-
Genmask:(子网掩码)目标网络对应的netmask
-
Metric:到达远程主机的费用,值越少,路由选择偏向性越高
-
Iface:到达对应网络,应该由当前主机那个网卡发送出来
[root@Centos ~][0]$ route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.2 0.0.0.0 UG 100 0 0 ens33
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
30.2 route 命令
route
#查看路由表
route -n
#添加一个主机路由(到达一个IP地址怎么走)
route add -host 目标IP gw 网关(下一跳) dev 网卡名称
route add -host 192.168.30.1 gw 172.16.0.1 dev ens33
#添加一个网络路由(到达一个网段地址怎么走)
route add -net 目标IP gw 网关(下一跳) dev 网卡名称
route add -net 192.168.0.0/24 gw 172.16.0.1 dev ens33
route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1 dev ens33
#添加一个网络路由,给他设置费用,费用越低,使用偏向性越高
route add -net 192.168.0.0/24 gw 172.16.0.1 dev ens33 metric 200
#添加一个默认路由
route add -net 0.0.0.0 netmask 0.0.0.0 gw 172.16.0.1
route add -net 0.0.0.0/0 gw 172.16.0.1
route add default gw 172.16.0.1
#删除静态主机路由
route del -host 192.168.30.1
#删除静态网络路由
route del -net 192.168.0.0 netmask 255.255.255.0
30.3 2路由器的路由实现
Route 1 路由表
目标网络 | 网关 | 子网掩码 | 接口 |
---|---|---|---|
Destination | Gateway | Genmask | |
172.16.0.0 | 0.0.0.0 | 255.255.0.0 | eth0 |
10.0.0.0 | 0.0.0.0 | 255.0.0.0 | eth1 |
192.168.0.0 | 10.0.0.201 | 255.255.255.0 | eth1 |
Route 2 路由表
目标网络 | 网关 | 子网掩码 | 接口 |
---|---|---|---|
Destination | Gateway | Genmask | |
172.16.0.0 | 10.0.0.200 | 255.255.0.0 | eth1 |
10.0.0.0 | 0.0.0.0 | 255.0.0.0 | eth1 |
192.168.0.0 | 0.0.0.0 | 255.255.255.0 | eth0 |
30.4 3路由器的路由实现
路由器 | 目标地址 | 网关 |
---|---|---|
1 | 172.20.0.0/16 | 172.18.0.201 |
1 | 172.22.0.0/16 | 172.18.0.201 |
2 | 172.16.0.0 | 172.18.0.200 |
2 | 172.22.0.0 | 172.20.0.201 |
3 | 0.0.0.0 | 172.20.2.200 |
30.5 路由的保存
该文件不存在,需要手动创建
vim /etc/sysconfig/network-scripts/route-eth0
# 路由表配置风格
(1)TARGET via GW
例:10.0.0.8/8 via 172.16.0.1
(2)每三行定义一条路由?号是第几条路由,例: 1、2、3
ADDRESS?=TARGET
NETMASK?=mask
GATWAY?=GW
31. 进程,性能相关工具
31.1 进程管理工具
31.1.1 pstree 进程树
工具来自:yum -y install psmisc
pstree [选项] [PID|USER]
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高亮显示父进程和前辈进程
# 查看某个用户进程
pstree root
# 查看进程ID
pstree -pT
31.1.2 ps 进程信息
a 显示所有终端运行的进程
x 选项包括不在终端运行的进程
u 选项显示进程所有者信息
f 显示父子进程关系
o 显示定制的信息
L 显示支持的属性列表
-k|--sort 对属性排序,在属性前加 - 表示倒序
-o 挑选要显示的属性,pid,user,%cpu,cmd ...
-C 指定命令,多个命令用,分隔
-e 显示所有进程,相当于-A
-L 显示线程
-f 显示完整格式程序信息
-F 显示更完整格式的进程信息
-H 以进程层级格式显示进程相关信息
-u UID|USER_NAME 指定有效的用户ID或名称
-U UID|USER_NAME 指定真正的用户ID或名称
-g GID|GROUP_NAME 指定有效的gid或组名称
-G GID|GROUP_NAME 指定真正的gid或组名称
-p PID 显示指pid的进程
--ppid PID 显示属于pid的子进程
-t tty 指定tty,相当于 t
-M 显示SELinu信息,相当于 Z
ni:nice值
pri:priority优先级
rtprio:实时优先级
psr:processor cpu编号
31.1.3 搜索进程和健康检查
pidof mysqld
-x 按脚本名称查询PID
# 按脚本名称查询PID
pidof -x iptables.sh
pgrep mysqld
-u 生效者
-U 真正发起运行命令者
-t 与指定终端相关的进程
-l 显示进程名
-a 显示进程的完整命令
-p PID 显示指定进程的子进程
# 查看进程PID
pgrep sshd
# 查看你某个终端运行进程
pgrep -at pts/0
# 判断进程是否存在
pidof sshd &> /dev/null && echo "进程存在" || echo "进程不存在"
pgrep -c sshd &> /dev/null && echo "进程存在" || echo "进程不存在"
# 判断进程是否存在
kill -0 PID &> /dev/null;echo $?
killall -0 ssh &> /dev/null;echo $?
# 进程的健康性检查
模拟客户端发起访问,以此来判断是否健康
31.1.4 调整进程优先级
- 静态优先级: 静态优先级是一个用于表示进程相对于其他进程的相对优先级的整数值。它通常在范围
[100, 139]
内,其中100
是最低优先级,而139
是最高优先级。 - Nice值: Nice值是一个范围在
-20
到19
之间的整数,用于表示进程的相对优先级。-20
是最高优先级(最不nice),19
是最低优先级(最nice)。较小的Nice值对应于更高的优先级,较大的Nice值对应于更低的优先级。 - 默认的Nice值: 当进程启动时,默认的Nice值为
0
,这对应于静态优先级120
。因此,默认情况下,进程的优先级为120
。 - 只有根用户可以降低Nice值: 通常,只有超级用户(根用户)才能降低(提高优先性)进程的Nice值,即将Nice值从正数减小到负数。这可以通过使用
renice
命令来实现。非特权用户只能增加Nice值(减小优先级)。 - 优先级最高为-19,最低为20: 由于Nice值的范围是
-20
到19
,对应的静态优先级范围是[100, 139]
,所以最高的进程优先级是-19
对应静态优先级100
,而最低的进程优先级是20
对应静态优先级139
。
# 以最高优先级来启动进程
nice -n -19 ping 127.0.0.1
# 以最低优先级来启动进程
nice -n 20 ping 127.0.0.1
# 调整正在运行的进程优先级
renice -n -10 3727
# 查看进程优先级
prtstat -r $(pidof ping) | grep nice
31.1.5 lsof 查看进程打开文件
# 列出指定进程打开的文件
lsof -p <PID>
# 显示使用该目录或文件的进程
lsof /path/to/file
# 列出某个用户打开的文件
lsof -u username
# 列出某个特定端口被哪个进程占用
lsof -i :80
范例:误删除被使用的文件,恢复
# 模拟文件被使用
tail -f /var/log/dpkg.log
# 删除使用中的文件
rm -rf /var/log/dpkg.log
# 查找被删除但仍然被进程使用的文件
lsof | grep 'deleted'
tail 5285 root 3r REG 252,3 766 788975 /var/log/dpkg.log (deleted)
# 恢复文件
cat /proc/$(pidof tail)/fd/3 > /var/log/dpkg.log
31.2 系统性能工具
31.2.1 uptime 负载查询
root@Ubuntu:~# uptime
21:24:39 up 11:45, 2 users, load average: 0.02, 0.01, 0.00
# 输出说明
21:24:39: 当前系统时间为 21 点 24 分 39 秒。
up 11:45: 系统已经运行了 11 小时 45 分钟。这表示自上次启动系统以来的运行时间。
2 users: 当前有 2 个用户登录到系统。
load average: 0.02, 0.01, 0.00: 负载平均值。负载平均值显示了系统在过去 1 分钟、5 分钟和 15 分钟内的平均负载情况
/proc/uptime 包括两个值,单位s
root@Ubuntu:~# cat /proc/uptime
42711.43 84637.93
42711.43 系统开机时间
84637.93 系统空闲实现,按CPU核数计算,两颗CPU的空闲时间需要乘2
31.2.3 prtstat 查看进程信息
工具来自:yum -y install psmisc
可以显示更为详细的信息
prtstat [进程PID]
-r 更清晰的显示
# 查看sshd进程详细信息
prtstat -r $(pidof sshd)
31.2.4 top 查看进程实时
31.2.5 mpstat 显示CPU相关统计
工具来自:yum -y install sysstat
# 一秒钟收集一次数据,收集5次退出
root@Ubuntu:~# mpstat 1 5
Linux 5.15.0-83-generic (Ubuntu) 11/07/2023 _x86_64_ (2 CPU)
09:37:00 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
09:37:00 PM all 0.28 0.01 0.15 0.02 0.00 0.00 0.00 0.00 0.00 99.53
31.3 Centos 8 图形化系统管理工具
Cockpit 是 Centos 8 引入的新特性,是一个基于web界面的应用,它提供了对系统的图形化管理
- 监控系统活动(CPU,内存,磁盘IO和网络流量)
- 查看系统日志条目
- 查看磁盘分区的容量
- 查看网络活动(发送和接收)
- 查看用户账户
- 检查系统服务的状态
- 提取已安装应用的信息
- 查看和安装可用更新(如果以root身份登录),并在需要时重启系统
- 打开并使用终端窗口
# 安装cockpit
dnf -y install cockpit
# 启动服务
systemctl enable --now cockpit.socket
# 访问界面
https://192.168.1.8:9090
# 账号/密码
账号/密码为root的账号密码
32. 信号发送 Kill
kill
:内部命令,可用来向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头,可以省略,不区分大小写
32.1 查看信号列表
kill -l
trap -l
# 信号列表
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
32.2 常用信号
0) 用于检查进程是否仍在运行 killall -0 haproxy
1) SIGHUP 无须关闭进程而让其重读配置文件
2) SIGINT 中止正在运行的进程:相当于ctl+c
3) SIGQUTT 相当于ctl+\
9) SIGKILL 强制杀死正在运行的进程
15) SIGTERM 优雅的终止正在运行的进程
18) SIGCONT 继续运行
19) SIGSTOP 后台休眠
32.3 发送信号的方法
信号的数字表示:1,2 ,9
信号完整名称:SIGHUP,sighup
信号的简写名称:HUP,hup
按PID发送信号
kill pid
kill -9 pid
kill -15 pid
按命令来发送,工具来自:yum -y install psmisc
killall -SIGTERM ping
killall -TERM ping
killall -15 ping
32.4 作业管理
Linux 的作业控制
- 前台作业:通过终端启动,且启动后一直占据终端
- 后台作业:可通过终端启动,但启动后立即转入后台运行
# 将一个前台的作业调入后台休眠
Ctrl + z
# 将一个前台作业调入后台执行
kill -18 PID
# 将一个还没有启动的作业调入后台执行
COMMAND &
后台作业虽然被送往后台运行,但其依然与终端有关;退出终端,将关闭后台作业,如果希望送往后台后,剥离与终端的关系
nohup COMMAND &> /dev/null &
screen;COMMAND
tmux;COMMAND
32.5 作业控制
# 查看当前终端的所有作业
jobs
# 把指定的后台作业调回前台
fg
# 让送往后台的作业在后台继续运行
bg
# 终止指定的作业
kill
32.6 任务并行运行
利用后台执行,实现并行同时运行多个进程,提高效率
方法一
ping 127.0.0.1 &
方法二
(ping 127.0.0.1);(ping 127.0.0.2);(ping 127.0.0.3)
方法三
ping 127.0.0.1 & ping 127.0.0.2 & ping 127.0.0.3
多组命令后台并行运行
{ ping 127.0.0.1;ping 127.0.0.2; }& { ping 127.0.0.3;ping 127.0.0.4; }&
NET=192.168.1
for i in {1..254} ;do
{
ping -c1 -w1 ${NET}.${i} &> /dev/null && echo ${NET}.${i} is UP || echo ${NET}.${i} is DOWN
} &
done
wait
33. 计划任务
通过计划任务,可以让系统自动的按时间或周期性计划执行任务
33.1 一次性任务
at 工具
- 交互式工具,由
yum -y install at
提供 - 依赖
systemctl status atd.service
服务,需要启动才能实现 at 任务 - at 任务队列存放在/var/spool/at/
at 命令
-
作业执行命令的结果中,标准输出和错误以执行任务者的身份邮件通知给root
-
默认Centos8最小化安装是没有安装邮件服务器,需要自行安装
at [选项] 时间
-v 显示版本信息
-t time时间格式
14:20 在今日的14:20执行,如果已过,则明天执行
14:20 2016-09-20 指定具体时间日期执行
-l 列出指定队列中等待运行的作业
-d 删除指定的作业
-c 查看具体作业任务
-f /path/file 指定的文件中读取任务
-m 当任务被完成之后,将给用户发送邮件,即使没有标准输出
# 列出所有计划任务
at -l
# 查看某个计划任务具体内容
at -c 3
# 删除指定计划任务
at -d 3
# 非交互式创建计划任务
echo 'echo 123' | at 14:25
# 非交互式创建计划任务
at 14:25 < at.txt
# 交互式执行计划任务
at
...
...
...
Ctrl + D 保存计划任务
33.2 一次性任务权限控制
- 白名单:/etc/at.allow默认不存在,如果文件存在了,那么只有该文件中的用户才能执行at命令
- 黑名单:/etc/at/at.deny默认存在,拒绝该文件中用户执行at命令,而没有在at.deny文件中的使用者则可执行
- 如果两个文件都不存在,只有root可以执行at命令
33.3 周期性计划任务
周期性任务计划cron相关的程序包:
-
cronie:主程序包,提供crond守护进程及相关辅助工具
-
crontabs:包含 CentOS 提供系统维护任务
-
cronie-anacron:cronie的补充程序,cronie的补充程序,用于监控cronie任务执行状态,如:cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
-
cron依赖于crond服务,确保crond守护进程处于运行状态:
# Centos 7 +
systemctl status crond.service
# Centos 6
service crond.service status
cron 任务分为
- 系统cron任务:系统维护作业,
/etc/crontab
主配置文件,/etc/cron.d
子配置文件 - 用户cron任务:保存在
/var/spool/cron/USERNAME
利用crontab
命令管理
33.3.1 /etc/crontab 配置文件解析
SHELL=/bin/bash 默认的shell类型
PATH=/sbin:/bin:/usr/sbin:/usr/bin 默认使用的PATH变量,不在其中的命令无法执行,可为其修改
MAILTO=root 默认比哦准输出和错误发送邮件给root,可以指向其他用户
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
33.3.2 cron 相关文件
[root@rocky9 ~]# rpm -ql crontabs
/etc/cron.daily 该目录下任务脚本,将每日运行
/etc/cron.hourly 该目录下任务脚本,将每小时运行,默认将在每小时第一分钟执行
/etc/cron.monthly 该目录下任务脚本,将每月运行
/etc/cron.weekly 该目录下任务脚本,将每周运行
/etc/crontab 系统范围的 cron 配置文件
/etc/sysconfig/run-parts
/usr/bin/run-parts run-parts 工具的二进制可执行文件。它可以指定目录,并运行目录下所有可执行文件
/usr/share/licenses/crontabs
/usr/share/licenses/crontabs/COPYING
/usr/share/man/man4/crontabs.4.gz
/usr/share/man/man4/run-parts.4.gz
[root@rocky9 ~]# rpm -ql cronie
/etc/cron.d 该目录下的配置文件,都将被计划任务调度,模板参考/etc/cron.d/0hourly
/etc/cron.d/0hourly
/etc/cron.deny 用于限制哪些用户可以将被禁止使用 cron。
/etc/cron.allow 用于限制那些用户可以使用 cron ,不在内的用户将被禁止,文件默认不存在
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/cronnext
/usr/bin/crontab
/usr/lib/.build-id
/usr/lib/.build-id/a7
/usr/lib/.build-id/a7/7c55caedd2e23684df35300abf811b57fefb8a
/usr/lib/.build-id/b4
/usr/lib/.build-id/b4/d97b486d8886a5561b1185920175ebcfed2e33
/usr/lib/.build-id/b7
/usr/lib/.build-id/b7/fe9e700dc97ea6d1f7fcf0404f85026c21aa1a
/usr/lib/systemd/system/crond.service
/usr/sbin/crond
/usr/share/doc/cronie
/usr/share/doc/cronie/AUTHORS
/usr/share/doc/cronie/ChangeLog
/usr/share/doc/cronie/README
/usr/share/licenses/cronie
/usr/share/licenses/cronie/COPYING
/usr/share/man/man1/cronnext.1.gz
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron
33.3.2 修改 crontab 默认打开的编辑器
export EDITOR=vim
33.6 用户计划任务 crontab
crontab
任务:
- 每个用户都有自己专用的 cron 任务文件:
/var/spool/cron/USERNAME
- 默认标准输出和错误会被发送邮件给对应的用户:如
deployer
创建的任务就发送至deployer
的邮箱 - root能够修改其他用户的作业
- 用户的 cron 中默认 PATH=/usr/bin:/bin,如果使用其他路径,在任务文件的第一行加 PATH=/path
- cron 任务中 % 表示换行的特殊意义,且第一个%后的所有字符串会被当作命令的标准输出,如果要使用,需要 \ 转义,将 % 放置于单引号中也是不支持的
crontab
命令格式
crontab [ -u user ] [ -l | -r | -e | -i ]
-l 列出所有任务
-e 编辑任务
-r 移除所有任务
-ri 以交互式模式移除指定任务
-u user 仅root可运行,管理指定用户cron任务
33.7 特殊的计划任务要求
# 实现秒级的计划任务
for i in {1..60} ;do echo "第${i}次" ;sleep 20 ;done
# 如何实现7分钟执行一次任务
sleep 2 暂停2秒,默认
sleep 2m 暂停2分钟
sleep 2h 暂停2小时
sleep 2d 暂停2天
# 实现微秒级别的计划任务
sleep 高版本支持
usleep 支持
35. 内核参数管理
35.1 内核参数配置文件
-
默认配置文件:
/etc/sysctl.conf
-
其他配置文件:
/usr/lib/sysctl.d/*.conf
/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf
35.2 sysctl 管理命令
sysctl
命令用于查看或者设定此目录中诸多参数
sysctl
-a 查看所有生效的参数
-w 临时修改内核参数
-p file 使该配置文件内核参数生效
# 临时修改内核参数
sysctl -w net.ipv4.ip_forward=1
# 永久使内核参数生效
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p
# 查看某个内核参数的值
sysctl net.ipv4.ip_forward
35.3 常用内核参数
# 开启ip_forward转发
echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf && sysctl -p
# 忽略ping请求
echo net.ipv4.icmp_echo_ignore_all = 1 >> /etc/sysctl.conf && sysctl -p
# 允许应用程序监听本地不存在的IP
echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.conf && sysctl -p
# 限制操作系统打开的文件数量
echo fs.file-man = 1020000 >> /etc/sysctl.conf && sysctl -p
# TCP连接关闭时等待套接字中的数据发送完毕的时间
net.ipv4.tcp_fin_timeout = 2
# 允许重新使用处于TIME_WAIT状态的套接字
net.ipv4.tcp_tw_reuse = 1
# 启用TIME-WAIT状态的快速回收机制
net.ipv4.tcp_tw_recycle = 1
# 启用TCP SYN cookies,防范SYN攻击
net.ipv4.tcp_syncookies = 1
# TCP keepalive超时时间,单位秒,用于检测连接是否仍然活跃
net.ipv4.tcp_keepalive_time = 600
# 本地端口范围,用于主动发起连接时的本地端口选择
net.ipv4.ip_local_port_range = 2000 65000
# 半连接队列的最大长度
net.ipv4.tcp_max_syn_backlog = 16384
# 系统中TIME-WAIT状态的最大数量
net.ipv4.tcp_max_tw_buckets = 36000
# 路由表项在没有被使用的时间间隔后被系统垃圾回收的时间,单位秒
net.ipv4.route.gc_timeout = 100
# 放弃连接之前,TCP发送SYN包的最大重试次数
net.ipv4.tcp_syn_retries = 1
# 放弃连接之前,TCP发送SYN+ACK包的最大重试次数
net.ipv4.tcp_synack_retries = 1
# 系统中允许的最大孤立的套接字数量
net.ipv4.tcp_max_orphans = 16384
# 系统中允许的最大套接字连接数,影响监听队列的大小
net.core.somaxconn = 16384
# 网络设备队列的最大长度,影响传入数据包的处理速度
net.core.netdev_max_backlog = 16384
36. 内核模块管理
36.1 内核版本
uanme [选项]
-r 显示内核版本
-n 显示主机命
-a 显示系统的所有信息,包括内核名称、主机名、内核版本号、机器类型等
36.2 内核模命令
36.2.1 查看内核模块
modinfo
# 查看内核已经加载的模块
lsmod
# 显示模块文件路径
modinfo -n module_name
# 显示模块参数
modinfo -p module_name
# 显示模块描述
modinfo -d module_name
36.2.2 搜索内核模块
36.2.3 加载内核模块
modprobe
# 加载内核模块
modprobe module_name
# 卸载内核模块
modprobe -r module_name
# 强制加载模块
modprobe -f module_name
# 显示模块信息
modprobe -c
36.2.4 卸载内核模块
rmmod
# 卸载内核模块
rmmod module_name
37. systemd
37.1 Unit 分类
[root@Centos7 ~]$ systemctl -t help
Available unit types:
service 文件扩展名为.service,用于定义系统服务
socket 定义进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需功能
busname
target 文件扩展名为.target,用于模拟实现运行级别
snapshot 管理系统快照
device 用于定义内核识别的设备
mount 定义文件系统挂载点
automount 文件系统的自动挂载点
swap 用于标识swap设备
timer
path 用于定义文件系统中的一个文件或目录使用,常用关于当文件系统变化时,延迟激活服务,如spool目录
slice
scope
37.2 Unit 的配置文件
/usr/lib/systemd/system 每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
/lib/systemd/system ubunt的对应目录
/run/systemd/system 系统执行过程中所产生的服务脚本,比上面目录优先运行
/etc/systemd/system 管理员建立的执行脚本,类似于/etc/rc*.d/S*的功能,比上面目录优先运行
37.3 systemctl 命令
systemctl COMMAND name.service
# 启动:相当于service name start
[root@Centos7 /]$ systemctl start name.service
# 停止:相当于service name stop
[root@Centos7 /]$ systemctl stop name.service
# 重启:相当于service name restart
[root@Centos7 /]$ systemctl restart name.service
# 查看状态:相当于service name status
[root@Centos7 /]$ systemctl status name.service
# 禁止自动和手动启动
systemctk mask name.service
# 取消禁止
systemctl unmask name.service
# 查看某服务当前激活与否的状态
systemctl is-active name.service
# 查看所有已经激活的服务
systemctl list-units --type service --all | grep
# 设定某服务开机自启,相当于chkconfig name on
systemctl enable name.service
# 设定服务开机启动,并马上启动服务
systemctl enable --now name.service
# 设定服务开机不启动,并马上关闭服务
systemctl disable --now postfix.service
# 查看某服务是否开机启动enable返回为0 disable返回为1
systemctl is-enabled postfix.service
# 列出失败的服务
systemctl --failed --type=service
# 设定某服务开机禁止启动:相当于chkconfig name off
systemctl disable name.sercice
# 查看所有服务的开机自启状态,相当于chkconfig --list
systemctl list-unit-files --type service
# 查看服务的依赖关系
systemctl list-dependencies name.service
# 杀掉进程:
systemctl kill unitname
# 通知systemd重新载入配置文件,而后可以选择重启
systemctl daemon-reload
37.4 服务状态解释
loaded unit配置文件已处理
active(running) 一次或多次持续处理的运行
active(exited) 成功完成一次性配置
active(waiting) 运行中,等待一个时间
inactive 不运行
enabled 开机启动
disabled 开机不启动
static 开机不启动,但可被另外一个启动的服务激活
indirect 重定向到别处
deactivating (stop-sigterm)
37.5 Unit 文件格式
范例:
[Unit]
Description=Mysql5.7 service 描述这个service的名字、信息
After=network.target 表示本服务在network.target服务之后启动,不涉及依赖
Before=xxx.service 表示本服务在xxx.service之前启动,不涉及依赖
Wants= 表示弱依赖关系,某个服务停止了,也不影响本服务
Requires= 表示强依赖关系,某个服务停止了,本服务必须停止
ConditionPathExists= 后面跟路径,表示只有指定路径存在,才可以启动
[Service]
User= 可以设置服务的用户名
Group= 可以设置服务启动时的组
Type=simple 定义服务的类型
simple:最简单常见的类型,指定服务在启动后直接开始运行,并保持状态,直到服务被终止
forking:这种类型的服务会产生一个子进程来执行实际的服务操作,一旦子进程开始执行服务任务,父进程将立即退出
oneshot: 一次性的服务,只需要在启动时执行一次,然后立即退出
notify:与simple相同,但是约定服务会在就绪后向systemd发送一个信号,这一通知的实现由 libsystemd-daemon.so提供
dbus:若以此方式启动,当指定的BusName出现在DBus系统总线上时,systemd认为服务就绪
idle:systemd会等待所有任务处理完成后,才开始执行idle类型的单元,除此之外,其他行为和simple类似。
. . .
PIDFile= 服务PID文件路径
ExecStart= 指定启动单元的命令或者脚本
ExecStartPre= 指定单元启动前执行的命令或脚本
ExecStartPost= 指定单元启动后执行的命令或脚本
ExecReload= 指定单元不停止服务,但是重新加载配置或状态
ExecStop= 指定单元停止时执行的命令或脚本
PrivateTmp= True表示给服务分配独立的临时空间,不指定的话默认是/tmp
Restart= no:默认值,表示不自动重启服务,如果服务意外终止,Systemd不会尝试自动重新启动它
always:表示总是自动重新启动服务,无论服务以何种方式终止(包括正常和异常),Systemd都会自动尝试重新启动该服务
success:表示只有在服务以0返回码退出时,才会自动重新启动,如果服务以非零返回码退出或发生异常时,Systemd不会自动重新启动
failure:表示只有服务以非0返回码退出时,才会自动重新启动,如果服务以0返回码退出或发生异常终止,Systemd不会自动重新启动
RestartSec=10s 定义服务自动重启间隔时间s:秒min:分钟 h:小时 ms:毫秒 us:微妙
RemainAfterExit= 如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。
WorkingDirectory= 指定服务的安装目录
EnvironmentFile= 指定一个文本文件的路径,该文件包含了一系列环境变量的定义,每行一个。这些环境变量将在服务启动时加载,以供服务进程使用。
[Install]
ALias= 为服务添加一个别名,可以通过别名调用或者启动
WantedBy=multi-user.target 指的是服务所在的Target是multi-user.target,也就是当系统运行级别为多用户时,系统应该启动该服务
DefaultInstance= 指定一个默认单元
37.6 系统运行级别
/lib/systemd/system/runlevel0.target -> poweroff.target # 关机
/lib/systemd/system/runlevel1.target -> rescue.target # 救援模式
/lib/systemd/system/runlevel3.target -> multi-user.target # 多用户,命令行
/lib/systemd/system/runlevel4.target -> multi-user.target # 多用户,命令行
/lib/systemd/system/runlevel5.target -> graphical.target # 图形化
/lib/systemd/system/runlevel6.target -> reboot.target # 重新启动
# 查看某个target包含的资源
systemctl list-dependencies reboot.target
# 查看目前支持的target列表
systemctl list-units -t target
# 切换目前的target模式
systemctl isolate reboot.target
# 设置默认的target模式
systemctl set-default multi-user.target
# 查看默认的target模式
systemctl get-default
# 切换到默认的target模式
systemctl default
37.8 禁用 Ctrl+alt+delete
systemctl mask ctrl-alt-del.target
systemctl daemon-reload
38 救援模式案例-遗忘root密码
38.1 进入系统自带的救援模式
1 重启Linux
2 在GRUB菜单选择第1个然后按e编辑(edit).
3 找出Linux16的行修改 ro 为 rw ,在这一行的最后添加 init=/bin/bash
4 修改完成,按ctrl+x进入救援模式.
5 修改/etc/passwd去掉root的x,然后重启.
- 按键e
- 找出Linux16的行修改 ro 为 rw ,在这一行的最后添加 init=/bin/bash(这里多按了空格,所以好像在下一行,其实在同一行)
- ctrl+x
- 修改/etc/passwd去掉root的x,然后重启.
- vi /etc/passwd
- 重启指令都不能使用,直接重启虚拟机,登录root发现不需要密码了
38.2 U盘/光盘救援模式
1. 插入U盘或光盘.
2. 重启并在弹出vmware logo的时候按下esc键(1次).
3. 选择通过光盘启动.
4. 进入到安装系统的页面,选择troubleshooting,然后选择rescue installed system
5. 进入到光盘/U盘的救援模式,continue 输入1然后回车
6. 执行chroot /mnt/sysimage然后就可以继续操作.
- 接下来的流程和自带的救援模式一样
尾页
LANG=zh_CN.UTF-8