linux
1.目前企业用到的系统版本:centos7.2 内核版本:3.10 centos7.9 内核版本:4.18 ubuntu20.0 内核版本:16.04
2.系统优化:
(1)yum源优化:打开https:/developer.aliyun.com/mirror/ 找到centos或者epel源,curl或者wget下载相应版本
(2)优化ssh的安全端口:在更改SSH端口之前,首先需要调整防火墙以允许新SSH端口上的流量,如果您使用的是Ubuntu的默认防火墙配置工具UFW,请运行以下命令来打开新的SSH端口(sudo ufw allow 2223/tcp),在CentOS中,默认的防火墙管理工具是FirewallD,要打开新端口,请运行以下命令(sudo firewall-cmd --permanent --zone=public --add-port=2223/tcp;sudo firewall-cmd --reload),如果使用iptables作为防火墙,则以下命令将打开新的SSH端口(sudo iptables -A INPUT -p tcp --dport 2223 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT),对于SELinux用户,还需要调整SELinux规则以允许新的SSH端口(sudo semanage port -a -t ssh_port_t -p tcp 2223),要验证SSH守护程序是否正在侦听新端口2223,请键入(ss -an | grep 2223),vim /etc/ssh/sshd_config,找到#Port 22这一行,将其修改为所需的端口号(Port 2223),保存并关闭配置文件后,重新启动SSH服务以使更改生效(systemctl restart sshd),
(3)时间同步:
(4)更新DNS地址:
(5)修改主机内核参数:
(6)关闭无用的服务:
(7)关闭selinux和防火墙
(8)修改文件描述符limit
(9)SSH远程连接说明配置
3.linux7系统的开机启动过程:
(1)电脑开机BIOS自检(POST):当您按下电源按钮时,计算机的BIOS(基本输入/输出系统)将运行自检程序,检查硬件设备是否正常工作。如果出现故障,BIOS将发出蜂鸣声并显示错误消息。
(2)启动菜单:接下来,计算机会加载启动菜单,您可以从菜单中选择您想要启动的设备或系统。通常,您可以从硬盘驱动器、光盘或USB闪存驱动器中启动计算机。
(3)加载操作系统内核:当您选择启动设备后,计算机将读取该设备上的引导记录。引导记录包含有关操作系统位置和启动方式的信息。接着,操作系统内核将被加载到内存中。
(4)内核初始化:一旦操作系统内核被加载到内存中,它将开始初始化操作系统的各个组件。这包括加载设备驱动程序、初始化网络和文件系统等。
(5)启动初始化进程:最后,操作系统将启动初始化进程(init进程),这是一个特殊的进程,它是系统中第一个运行的用户空间进程。它将负责启动其他进程和服务,使计算机能够正常工作。
初始化进程作为inux 系统的第一个进程,它需要完成Linux系统中相关的初始化工作,为用户提供合适的工作环境。RHEL/centos7系统已经替换掉了熟悉的初始化进程服务system v init正式采用全新的systemd初始化进程服务。如果您之前学习的是RHL/centos 6或7系统,可能会不习惯。systema初始化进程服务采用了并发启动机制,开机速度得到了不小的提升。
4.Systemd服务管理
(1)systemct1管理服务的启动、重启、停止、重载、查看状态等常用命令
systemctl start crond.service 启动服务
systemctl stop crond.service 停止服务
systemctl restart crond.service 重启服务
systemctl reload crond.service 重新加载配置(不终止服务)
systemctl status crond.servre 查看服务运行状态
systemctl is-active sshd.service 查看服务是否在运行中
systemctl mask crond.servre 禁止服务运行
systemctl unmask crond.servre 取消禁止服务运行
(2)systemctl设置服务开机启动、不启动、查看各级别下服务启动状态等常用命令
systemctl enable crond.service 开机自动启动
systemctl disable crond.service 开机不自动启动
systemctl list-unit-files 查看各个级别下服务的启动与禁用
systemctl is-enabled crond.service 查看特定服务是否为开机自启动
systemctl daemon-reload 创建新服务文件或者变更设置
(3)systemctl服务状态说明
loaded 服务单元的配置文件已经被处理
active(running) 服务的一个或多个进程在运行中
active(exited) 一次性运行的服务成功被执行并退出(服务运行后完成任务,相关进程会自动退出)
active(waiting) 服务已经运行但在等待某个事件
inactive 服务没有在运行
enabled 服务设定为开机运行
disabled 服务设定为开机不运行
static 服务不能被设定开机启动,但可以由其他服务启动该服务
5.linux终端
(1)通过网络使用模拟终端远程连接Linux,日常运维中就是这种方式。
(2)tty 物理机执行为本地终端
6.Bash特性
(1)命令补全:命令或参数仅需输入前几位就可以用Tab键补全;
(2)命令别名:可以用"alias 别名名称=命令"命令创建属于自己的命令别名,若要取消一个命令别名,则是用 unalias 别名名称 命令。
(3)命令快捷键:
Ctrl +A //光标跳转至正在输入的命令行的首部
Ctrl +E //光标跳转至正在输入的命令行的尾部
Ctrl +C //终止前台运行的程序
Ctrl + D //在she11中,ctrl-d表示推出当前she11。
Ctrl + Z //将任务暂停,挂至后台
Ctrl + L //清屏,和clear命令等效。
Ctrl + K //删除从光标到行末的所有字符
Ctrl +U //删除从光标到行首的所有字符
Ctrl + R //搜索历史命令,利用关键字
//在命令行前加面加"#”则该命令不会被执行
(4)命令流程:
当我们执行一个命令,整个命令执行流程如下:
1.判断命令是否通过绝对路径执行
2.判断命令是否存在别名
3.判断用户输入的是内部命令还是外部命令(内部命令: shell程序自带的命令。外部命令: 在系统PATH变量的某个路径下的可执行程序,使用 type 命令检测用户输入的命令属于内部命令还是外部命令。)
type -a cd //cd命令属于she11内部命令
type a ping //ping属于外部命令,同时会打印当前命令路径
4.内部命令直接执行,外部命令检测是否存在缓存
5.检测 PATH路径,有执行,无报错(PATH 变量定义的路径,作用是告诉 Bash执行的外部命令存放的位置,Bash会在这些路径中进行逐个扫描.)
echo $PATH //打印当前环境变量目录
echo 'export PATH=/soft/bin:$PATH'>>/etc/profile //写入/etc/profile配置文件永久生效
事实上执行过的外部命令都会保存在内存缓存中,当再次执行相同的命令,会通过缓存调取执行,也就意味着不会搜索 PATH 路径
hash //表示缓存命令所在位置
hash -d ifconfig //删除缓存过的ifconfig命令,即可执行
hash -r //当然可以清空缓存表
//命令缓存hash需要注意如下情况:
1.如果执行外部命令1次就会对该命令进行缓存
2.如果将命令移动了位置(a.使用绝对路径执行 b.删除hash表的缓存指令)
(5)路径展开(路径展开用花括号包括,逗号分隔,这样花括号里的内容会被展开形成列表。)
mkdir /tmp/zz/a/b /tmp/yy/a/b -pv
rm-rf /tmp/{zz,yy}
mkdir /tmp/{zz,yy}/a/b -pv
(6)转义字符
4类常用转义字符
反斜杠():使反斜杠后面的一个变量变为字符串
单引号(''):转义其中所有的变量为单纯的字符串。
双引号(""):保留其中的变量属性,不进行转义处理
反引号():把其中的命令执行后返回结果。 echo "shoping is\$500' //将特殊字符转换为正常字符 echo "The Directory is $(pwd)" //使用$()实现命令替换 echo "The Directory is `pwd`" //使用
实现命令替换
touch file-date +%F-%H-%S
//转义其中所有的变量为单纯的字符串
7.linux目录
/etc 系统重要配置文件,以及常用服务配置文件
/var 存放系统引导启动时产生的可变文件,文件通常动态更改的,例如:缓存目录,日志文件
/run 系统启动后,运行的程序产生的运行时数据,包括进程的pid文件,锁文件等
/home 普通用户的主目录,普通用户的家目录默认为/HOME/USERNAME
/root 超级管理员的主目录,普通用户无权操作
/tmp 存放临时文件,一般存放超过10天以上都会自动删除,可以更改删除临时文件的期限
/boot 存放系统引导时候需要的文件
/dev 存放设备文件
/usr 安装的软件,共享库,重要的子目录有
/usr/bin 用户命令目录
/usr/sbin 管理员命令目录
/usr/local 本地自定义安装的软件
//注意:在Linux7系统中,/bin,/sbin,/lib,/1ib64都以软链接的形式链接到/usr/目录下,例如:
/bin --> /usr/bin
/sbin --> /usr/sbin
lib -> usr/lib
lib64 -> usr/lib64
(1)特殊目录(.)(..)
(.) 当前目录
cd .
(..) 当前目录的上层目录
cd ..
cd - 返回之前的目录位置
(2)绝对路径(从根目录开始的全路径,一定是以“/”开头的。)
pwd 确认当前所在的目录
8.文件下载命令
wget //文件下载
-O //指定下载地址,更改名称
-T //超时时间
-q //安静下载(关闭wget输出)
--spider //网络爬虫
示例:wget http://www.baidu.com
curl //文件下载
示例:curl -o http://www.baidu.com
yum install lrzsz
rz //文件上传
scp -r /etc root@192.168.9.3:/tmp //文件上传
sz //文件下载
示例:sz filename
9.查找命令
(1)locate //查找文件或者目录
locate /etc/sh //搜索etc目录下所有以sh开头的文件
locate -i /etc/sh //搜索etc目录下,所有以sh开头的文件,忽略大小写
(2))which //查找系统PATH变量目录下的命令(绝对路径)
which ls
(3)whereis //查找文件索引数据库下的命令、源文件、man文件。非PATH变量查找,所以查找的面比which要广 -b,-m
whereis ls
whereis -b ls //查找源文件
whereis -m ls //查找文件man文件
10.字符处理命令
(1)使用sort排序
-r:倒序
-n:按数字排序
-t:指定分隔符(默认空格)
-k:指定第几列,指定几列几字符(指定1.1,3.1,3.3)
cat >> sort.txt << EOF //创建文件
//测试案例,对下面内容进行排序(192.168.3.1,192.168.2.21,192.168.0.151)
sort -t. -k3.1,3.1nr -k4.1,4.3nr test.txt //针对第三列的第一个字符,第四列的第一个字符到第三个字符排序才是正确
(2)使用cut命令截取某一个字段
-d:指定分隔符
-f:数字,取第几列-f3,6三列和6列
-c:按字符取(空格也算)
echo “Im wing,is Q552408925” > wing.txt
sed 's#,# #g' wing.txt | cut -d " " -f2,6
sed's#,# #g’ wing.txt | awk -F"" '{print $2 "" $5}'
awk -F '[,]+' '{print $2,$5}' wing.txt
awk '{print $2 $5}' wing.txt | awk -F"," '{print $l " " $2)
awk -F "[,]" '{print $2 " " $6}' wing.txt
此类问题是运维工作中最常见的问题。可以演变成分析日志,查看TCP各个状态连接数,查看单IP连接数排名等.
cat web.log
awk -F'/' '{print $3}' web.log | sort -rn | uniq -c
cut -d / -f3 web.log | sort -rn | uniq -c
(3)使用uniq删除重复内容(必须配合 sort 使用)
-c 计算重复的行
cat uniq.txt | sort 先使用sort排序,让重复内容连续在一起
cat uniq.txt | sort | uniq //使用uniq去除相邻重复的行
cat uniq.txt | sort | uniq -c //使用-c参数,能统计出文件中每行内容重复的次数
(4)使用wc统计
-l:显示文件行数
-c:显示文件字节
-w:显示文件单词
wc -l /etc/fstab //统计fstab有多少行
grep -n "." /etc/services | tail -l
awk '{print NR $0}' /etc/services | tail -l
cat -n /etc/services | tail -1
sed '=' /ete/services | tail -2
11.Linux系统VIM编辑
如果在刚装完的 centos操作系统下没有 vim这个命令,用如下方式进行安装即可:
yum install -y vim-enhanced
(1)VIM模式介绍
Vim编辑器中设置了三种模式: 命令模式、编辑模式、未行模式.
命令模式: 控制光标移动,可对文本进行复制、粘贴、删除等工作。
编辑模式: 正常的文本写入。
未行模式: 保存或退出文档,以及设置编辑环境
(2)命令模式快捷键:
gg:跳转光标至顶端
Ngg:跳转光标至当前文件内的22行
yy:复制当前光标所在的行
p(小写):粘贴至当前光标下一行
P(大写):粘贴至当前光标上一行
dd:删除当前光标所在的行
(3)末行模式
查找 /string 需要搜索的内容(查找)
n 按搜索到的内容依次往下进行查找
N 按搜索到的内容依次往上进行查找
替换
:1,5s#sbin#test#g 替换1-5行中包含sbin的内容为test
:%s#sbin#test#g 替换整个文本文件中包含sbin的替换为test
:%s#sbin#test#gc 替换内容时时提示是否需要替换
另存
:w /root/test 将文件所有内容另存为/root/test
(4)视图模式(从命令行模式进入视图模式)
ctr1+v 进入VISUAL BLOCK选中需要注释的行(可视块模式)
1.插入:按shift+i进入编辑模式,输入#,结束按ESC键
2.删除:选中内容后,按x或者d键删除
3.替换:选中需要替换的内容,按下r键,然后输入替换后的内容
shift+v 进入VISUAL LINE 选中行内容(可视行模式)
1.复制:选中行内容后按y键及可复制。
2.删除:选中行内容后按d键删除。
(5)VIM环境变量
环境变量临时生效
:set nu显示行号
:set ic 忽略大小写,在搜索的时候有用
:set ai 自动缩进
:set list 显示制表符(空行、tab键)
:set no[nu|ic|ai...] 取消临时设定的变量
环境变量永久生效
~/.vimrc 个人环境变量(优先级高) /etc/vimrc 全局环境变量
vim ~/.vimrc
set nu
set ic
//如果个人vim环境没有配置,则使用全局vim环境变量配置。
//如果个人vim环境和全局环境变量产生冲突,优先使用个人vim环境变量。
12.linux系统压缩打包
Linux系统常见的后缀名所对应的压缩工具
.gz gzip //压缩工具压缩的文件
.tar.gz //先使用tar打包,然后使用gzip压缩归档
(1)ZIP压缩工具
zip是压缩工具,unzip是解压缩工具
zip filename.zip filename //压缩文件为zip包
zip-r dir.zip dir/ //压缩目录为zip包
unzip filename.zip //解压zip文件包,默认解压至当前目录
(2)TAR压缩工具
语法:tar [-zjxcvfpP] filename
c //创建新的归档文件
x //对归档文件解包
t //列出归档文件里的文件列表
v //输出命令的归档或解包的过程
f //指定包文件名,多参数写最后
C //指定解压目录位置
z //使用gzip压缩归档后的文件(.tar.gz)
j //使用bzip2压缩归档后的文件(.tar.bz2)
J //使用xz压缩归档后的文件(tar.xz)
X //排除多个文件(写入需要排除的文件名称)
h //打包软链接
--hard-dereference //打包硬链接
--exclude //在打包的时候写入需要排除文件或目录
常用打包与压缩组合
czf //打包tar.gz格式
cjf //打包tar.bz格式
cJf //打包tar.xz格式
zxf //解压tar.gz格式
jxf //解压tar.bz格式
xf //自动选择解压模式
tf //查看压缩包内容
tar czf etc.tar.gz --exclude=etc/services etc/ //排除单个文件
tar czf etc.tar.gz--exclude=etc/services --exclude=etc/rc.local etc/ //排除多个文件
tar tf test.tar.gz //查看压缩包内容和解压
tar xf test.tar.gz //解包或者解压缩
tar xf /etc/local.tar.gz -C /tmp //将tar.gz解压至其他目录
注意:不管是打包还是解包,原文件是不会被删除的,但会覆盖当前已经存在的文件或者目录。
nc -l 8888 | tar -xzf - -C /tmp //接收B主机,需要监听端口(没有网络场景,没有账号密码,登录服务器,通过nc方式进行文件传输)
13.linux系统文件属性
(1)Linux系统文件类型
- 普通文件(文本,二进制,压缩,图片,日志等)
d 目录文件
b 设备文件(块设备)存储设备硬盘 /dev/sdal,/dev/sda2
c 设备文件(字符设备)打印机,终端 /dev/ttyl,/dev/zero
s 套接字文件,进程间通信(socket)
p 管道文件
l 链接文件
file /etc/hosts 查看文件类型
14.linux链接文件
(1)软链接
//文件软链接示例
touch /root/file
ln -s /root/file /tmp/file_bak
ll /tmp/file_bak //root下file链接到/tmp下并重命名为file_bak
//目录软链接示例
mkdir /soft/nginx1.1 -p
ln -s /soft/nginxl.1/ /soft/nginx
11 /soft/nginx //查看链接指向
unlink /soft/nginx //删除软链接
(2)生产软链接作用
1.软件升级
2.企业代码发布
3.不方便目录移动
(3)硬链接(防止重要文件被误删。)
注意:目录不能创建硬链接,硬链接文件可以用rm命令删除
//文件硬链接示例
ln /root/file /tmp/file_hard
11 /tmp/file_hard
rm -rf /tmp/file_hard
(4)软硬链接区别
1)ln命令创建硬链接、ln-s命令创建软链接。
2)目录不能创建硬链接,并且硬链接不可以跨越分区系统
3)目录软链接特别常用,并且软链接支持跨越分区系统。
4)硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。
5)删除软链接文件,对源文件及硬链接文件无任何影响。
6)删除文件的硬链接文件,对源文件及链接文件无任何影响。
7)删除链接文件的源文件,对硬链接无影响,会导致软链接失效。
8)删除源文件及其硬链接文件,整个文件会被真正的删除。
15.Linux系统用户管理
/etc/passwd 账户文件
/etc/shadow 用户密码文件
(1)使用 finger 命名查询用户信息以及登录信息
//安装finger命令
yum install finger -y
finger bgx_wing
(2)使用 chfn 修改用户信息
chfn bgx_wing
(3)堡垒机
JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。JumpServer 帮助企业以更安全的方式管控和登录所有类型的资产,实现事前授权、事中监察、事后审计,满足等保合规要求。
学习网址:https://docs.jumpserver.org/zh/v4/
(4)用户密码管理
echo $RANDOM|md5sum | cut -c 1-10 系统内置变量生成随机密码
mkpasswd密码生成工具,-l设定密码长度,-d数子,-c小写字母,-C大写字母,-s特殊字符
echo $(echo $RANDOM|md5sum | cut -c 5-14) | tee pass.txt | passwd --stdin wing
yum install -y expect //需要安装扩展包
mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4
推荐密码保存工具客户端,支持windows、Macos、Iphone 以及浏览器插件Lastpass官方网站
(5)如果全局配置和个人配置出现冲突,那么如何验证呢?
编辑全局配置 /etc/profile 新增一行:PS1='[\h@\u\t]#'
编辑个人配置 ~/.bash_profile 新增一行: PS1='[\u@\H]#'
(6)切换用户
普通用户 su - 代表直接切换至root 用户身份,需要输入root 用户密码
超级管理员 root 用户使用su - username 切换普通用户不需要输入任何密码。
(7)centos 7 日志审计
usermod bgx -G wheel
sudo tail -f /var/log/secure
(8)centos提权
1.系统安装后就有sudo命令,如果没有sudo命令,可通过如下方式安装
yum install y sudo
2.使用`visudo`命令编辑sudo配置文件,相当于 vim /etc/sudoers`配置文件
visudo #会对配置进行验证
wing ALL=(ALL) /bin/rm,/bin/cp#新增
3.配置选项详解
1.用户名 2.主机名 3.角色名 4.命令名
root ALL 使用最高角色执行ALL /bin/rm,/bin/cp #允许使用sudo执行命令
wing ALL= (ALL) NOPASSWD:ALL //不需要密码使用全部命令
4.使用visudo -c检查配置文件
(9)sudo -l //检查普通用户sudo权限明细
(10)sudo免密码配置选项
1.普通用户执行sudo不需要输入密码配置
visudo
wing ALL= (ALL) NOPASSWD:ALL //不需要密码使用全部命令
2.//如果每增加一个用户需配置一行sudo,这样设置非常麻烦。所以可以进行如下设置
%gbx ALL=(ALL) NOPASSWD:/bin/rm,/bin/cp #新增组
//gbx这个组的所有用户都拥有sudo的权力。接下来只需要将用户加入该组即可
useadd user1 -g gbx
16.日志相关审计
sudo命令日志审计,并不记录普通用户的操作,而是记录执行sudo命令的用户操作。
(1)1.安装sudo、rsyslog
yum install y sudo rsyslog
rpm -qa sudo rsyslog //检测是否安装成功
2.配置/etc/sudoers记录日志路径
echo "Defaults logfile=/var/log/sudo.log" >>/etc/sudoers
tail -l /etc/sudoers //查看追加的日志配置
visudo -c //检查语法
3.配置rsyslog 日志服务
echo "local2.debug /var/log/sudo.log" >>/etc/rsyslog.conf
systemctl deamon-reload //加载配置文件
systemctl restart rsyslog //重启rsyslog服务
4.普通用户使用sudo权限验证日志记录
sudo rm -rf /root/test/ //使用普通执行sudo命令
cat /var/log/sudo.log //检查用户在什么时间执行过什么操作
17.Linux系统特殊权限
(1)1.suid 以文件的所属用户身份执行命令,而不是以当前用户的身份执行命令
2.将目录设置为 sgid,后续如果在该目录下创建文件,都将与该目录的所属组保持一致
3.sticky 任何人都可以在该目录下创建文件以及目录, 但只能删除自己创建的文件和目录
4.如何设置特殊权限
用符号表示:setuid=u+s;setgid=g+s;sticky=o+t
用数值表示:setuid=4;setgid=2;sticky=1
(2)权限属性chattr
设置文件属性(权限),针对所有用户,包括root
a:让文件或目录仅可追加内容
i:不得任意更动文件或目录
echo "aa" >> file_a //a权限,只能追加,适用于日志文件
echo "i" > file_i //i权限,无法写入,无法删除
chattr +a file_a //设置属性
chattr +i file_i
lsattr file_a file_i //查看属性
(3)进程掩码umask
我们在新建文件和目录的默认权限会受到umask的影响,umask表示要减掉的权限。
创建目录权限值为 777-umask
创建普通文件权限值为 666-umask
umask`涉及到的相关文件`/etc/bashrc /etc/profile -/.bashrc -/.bash_profile
18.Linux系统进程管理
(1)进程生命周期
1.创建阶段:进程被创建时,首先需要通过系统调用 fork()或者 exec()来创建进程
2.就绪阶段:创建进程后,进程被放置在系统的就绪队列中,等待CPU的分配。
3.运行阶段:当CPU 分配给进程后,进程开始执行,此时进程的状态变为运行状态
4.阻塞阶段:当进程在执行过程中遇到某些阻塞事件时,例如等待 I/0 操作完成,进程将会进入阻塞状态,此时进程将不再占用 CPU 资源。
5.结束阶段:当进程完成它的任务,或者被终止时,它将被系统回收。在这个阶段,进程会被标记为僵尸进程直到父进程调用 wait()或 waitpid()系统调用来回收进程资源,最终进程将被彻底销毁。
需要注意的是,进程的生命周期并不是线性的,进程状态可以在不同的阶段之间相互转换,例如在运行阶段时,进程可能会因为等待 I/0 操作而进入阻塞状态,等待 I/0 操作完成后再回到运行状态。
(2)静态监控进程
ps aux | less
ps auxf | grep nginx //显示子进程
USER : //运行进程的用户
PID: //进程 ID
%CPU : //CPU占用率
%MEM : //内存占用率
VSZ : //占用虚拟内存
RSS : //占用实际内存 驻留内存
TTY : //进程运行的终端
STAT : //进程状态 man ps (/STATE)
R //进程运行
S //可中断睡眠
D //不可中断睡眠
Z //僵尸进程
X //进程已经退出
T //进程被暂停
Ss s //进程的领导者,父进程
S< < //优先级较高的进程
SN N //优先级较低的进程
R+ + //表示是前台的进程组
S1 //以线程的方式运行
START : //进程的启动时间
TIME : //进程占用 CPU的总时间
COMMAND: //进程文件,进程名
(3)动态监控进程
top
top -d 1 -p 10126 //查看指定进程的动态信息
top -d 1 -u apache //查看指定用户的进程
top -d 1 -b -n 2 > top.txt //将2次 top 信息写入到文件
top 常见指令
h 查看帮出
z 以彩色信息展示
l 显示所有cpu的负载
s 设置刷新时间
b 高亮现实处于R状态的进程
M 按内存使用百分比排序输出
P 按CPU使用百分比排序输出
R 对排序进行反转
f 自定义显示字段
k ki11掉指定PID进程
W 保存top环境设置 ~/.toprc
q 退出
(4)系统负载的计算和意义
系统负载是所有cpu的运行队列的总和.w,uptime
//假设当前计算机有4个核心的cpu,当前的负载是2.94
2.94/4(个cpu核心) = 73%的cpu资源被使用,剩下27%的cpu计算资源是空想的
//假设当前的计算有2个核心的cpu,当前的负载是2.92
2.92/2 = 146% 已经验证超过了cpu的处理能力
(5)信号管理进程
使用kill命令发送信号与进程通信
定义守护进程的角色
结束用户会话和进程
kill killall pgrep pki11
ki11 -1 //列出所有支持的信号
//常见信号列表:
数字信号 信号别名 作用
1 HUP 挂起信号,往往可以让进程重新配置
2 INT 中断信号,起到结束进程的作用,和ctr1+c的作用一样
3 QUIT 让进程退出,结果是进程退出
9 KILL 直接结束进程,不能被进程捕获
15 TERM 进程终止,这是默认信号
18 CONT 被暂停的进程将继续恢复运行
19 STOP 暂停进程
20 TSTP 用户停止请求,作用类似于ctr1+z把进程放到后台并暂停
kill命令发送信号
//给 vsftpd 进程发送信号 1,15
yum -y install vsftpd
systemctl start vsftpd
//发送重启信号,例如 vsftpd 的配置文件发生改变,希望重新加载
kill -1 9160
//发送停止信号,vsftpd 服务有停止的脚本systemctl stop vsftpd
ki11 9160
//终止 pts/0上所有进程,除了bash本身
pkill -t pts/0
//终止pts/0上所有进程,并且bash也结束(用户被强制退出)
pkill -9 -t pts/0
//列出wing用户的所有进程,-1输出pid
pgrep -l -u wing
19.Linux重定向与管道
(1)为何要使⽤重定向
1.当屏幕输出的信息很重要,⽽且希望保存重要的信息时;
2.后台执⾏中的程序,不希望他⼲扰屏幕正常的输出结果时;
3.系统的例⾏命令, 例如定时任务的执⾏结果,希望他可以存下来时;
4.⼀些执⾏命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时;
5.错误⽇志与标准正确⽇志需要分别输出⾄不同的⽂件;
(2)标准输⼊与输出
执⾏⼀个 shell 程序时通常会⾃动打开三个标准⽂件
标准输⼊(STDIN,⽂件描述符为0):通常对应终端的键盘,也可从其他⽂件或命令或者⽂件内容中输⼊。
标准输出(STDOUT,⽂件描述符为1):默认输出到屏幕。
错误输出(STDERR,⽂件描述符为2):默认输出到屏幕。
⽂件名称(filename,⽂件描述符为3+)
进程将从标准输⼊中得到数据,将正常输出打印⾄屏幕终端,将错误的输出信息也打印⾄屏幕终端。
进程使⽤⽂件描述符 (file descriptors) 来管理打开的⽂件
(3)tail -f /root/command/std/test.log //持续追踪查看⽂件内容
ls -l /proc/6885/fd //查看6885进程下的⽂件描述符
ls -l /dev/std* //Linux查看标准输⼊输出设备
(4)输出重定向
重定向: 改变标准输⼊、标准输出的⽅向的就是重定向
标准覆盖输出重定向 > 将命令的执⾏结果输出到指定的⽂件中, ⽽不是直接显示在屏幕上
标准追加输出重定向 >> 将命令执⾏的结果追加输出到指定⽂件
错误覆盖输出重定向 2>
错误追加输出重定向 2>>
输⼊重定向 < 将命令中接收输⼊的途径由默认的键盘更改为指定的⽂件
ifconfig ens33 > abc //标准输出重定向, 先清空,后写⼊, 如果⽂件不存在则创建
echo "This is network conf" >> if //标准追加输出重定向, 向配置⽂件末尾追加内容
find /etc -name ".conf" 1>a 2>b //将标准输出和标准错误输出重定向到不同⽂件
find /etc -name ".conf" &>ab //将标准输出和标准错误输出重定向到同⼀个⽂件, 混合输出
ls /root /error >ab 2>&1 //重定向到相同的位置
ls /root /error >ab &>/dev/null //空设备,即将产⽣的输出丢掉
案例:如果/dev/null 设备被删除
//1.⼿动创建 mknod -m 666 /dev/null c 1 3
//2.重启⾃动创建 MAJOR主设备号 MINOR从设备号
主设备号相同: 表示为同⼀种设备类型,也可以认为 kernel 使⽤的是相同的驱动
从设备号:在同⼀类型设备中的⼀个序号
案例:在脚本中使用重定向
vim ping2.sh
ping -c1 192.168.9.3 &>/dev/null
if [ $? -eq 0 ];then
echo "192.168.9.3 is up." >>up.txt
else
echo "192.168.9.3 is down." >>down.txt
fi
chmod +x ping2.sh
./ping2.sh
(5)磁盘读写性能测试
dd if=/dev/zero of=/file1.txt bs=1M count=20
dd </dev/zero >/file2.txt bs=1M count=20
fio 磁盘读写性能测试
案例:利⽤重定向建⽴多⾏的⽂件
cat >file2.txt
案例:两条命令同时重定向
ls; date &>/dev/null
ls &>/dev/null; date &>/dev/null
(ls; date) &>/dev/null
(6)进程管道技术
管道操作符号 "|" 连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输⼊
案例1: 将/etc/passwd 中的⽤户按 UID ⼤⼩排序
sort -t":" -k3 -n /etc/passwd
sort -t":" -k3 -n /etc/passwd -r
sort -t":" -k3 -n /etc/passwd |head
sort -t":" -k3 -n /etc/passwd | head -n 10 | tail -n 1
案例2: 统计当前/etc/passwd 中⽤户使⽤的 shell 类型
//思路:取出第七列(shell) | 排序(把相同归类)| 去重
awk -F: '{print $7}' /etc/passwd |sort |uniq -c
案例3: 统计出最占CPU的5个进程
ps aux --sort=-%cpu |head -6
案例4: 统计⽹站的访问情况 top 20
//思路: 打印所有访问的连接 | 过滤访问⽹站的连接 | 打印⽤户的 IP | 排序 | 去重
netstat -antup |egrep :80 |egrep ESTAB |sort |uniq -c |sort -k1 -rn |head -n 20
案例5: 打印当前所有 IP
ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'
案例6: 打印根分区已⽤空间的百分⽐(仅打印数字)
df |grep '/$' |awk '{print $5}' |awk -F"%" '{print $1}'
(7)tee管道技术
ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
which cat|xargs ls -l
ls |xargs cp -rvft /tmp/ -> ls | xargs -I {} cp -rvf {} /tmp
ls |xargs mv -t /tmp/ -> ls | xargs -I {} mv {} /tmp
20.find处理动作
当查找到⼀个⽂件后, 需要对⽂件进⾏如何处理, 默认动作 -print
-print //打印
-ls //以⻓格式打印显示
-delete //删除查找到的⽂件(仅能删除空⽬录)
-exec //后⾯跟⾃定义的 shell 命令(标准写法 -exec 😉
-ok //后⾯跟⾃定义的 shell 命令(会提示是否操作)
find /etc -name "ifcfg" -print //打印查询到的⽂件
find /etc -name "ifcfg" -exec cp -rvf {} /tmp ; //拷⻉⽂件
find /tmp -name "ifcfg*" -delete //删除⽂件
(2)find结合xargs
find . -name "file.txt" |xargs rm -f //xargs将查找到结果⼀个⼀个的处理
find . -name "file.txt" |xargs -I {} cp -rvf {} /var/tmp //xargs将查找到结果⼀个⼀个的处理
21.RPM包管理
(1)软件包类型
rpm包 预先编译打包,安装简单
源码包 ⼿动编译打包,安装繁琐
⼆进制包 解压即可使⽤, 安装简单
注意: 不管是源码包,还是⼆进制包,安装时都可能会有依赖关系!
(2)RPM获取途径
- RedHat 光盘或官⽅⽹站
- RPM 查询官⽹⽹站
- Nginx 软件官⽅⽹站
(3)查看系统光驱中RPM软件包
mount /dev/cdrom /mnt/
ls /mnt/Packages/|head
(4)RPM包安装
-i: 安装
-v: 详细信息
-h: 安装进度
--test: 测试是否能够安装成功
--force: 强制重新安装
--nodeps: 忽略依赖关系
rpm -ivh /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm //安装软件包, 需要指定软件包绝对路径
rpm -ivh --test /mnt/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm //测试⼀个软件包是否能在该系统上安装
rpm -ivh --force /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm //如果软件包存在, 强制再次安装
rpm -ivh --nodeps /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm //安装samba服务需要依赖其他组件, 使⽤--nodeps可重新强制安装
(5)RPM包查询
rpm -q //查看指定软件包是否安装
rpm -qa //查看系统中已安装的所有RPM软件包列表
rpm -qi //查看指定软件的详细信息
rpm -ql //查询指定软件包所安装的⽬录、⽂件列表
rpm -qc //查询指定软件包的配置⽂件
rpm -qd //查询指定软件包的帮助⽂档
rpm -qf //查询⽂件或⽬录属于哪个RPM软件
rpm -q --scripts //查询rpm包安装前和安装后执⾏的脚本
//查询未安装的软件包信息
rpm -qip //查询未安装的rpm包详细信息
rpm -qlp //查询未安装的软件包会产⽣哪些⽂件
(6)RPM包升级
-U 如果⽼版本不存在,就全新安装,如果存在有新版即升级
-f ⽼版本必须存在
//如果有新版则升级, 软件升级不要跨操作系统主版本号
rpm -Uvh /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm
(7)RPM包卸载
卸载包时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包,否则会造成系统崩溃。
//先查询, 然后卸载
rpm -qa |grep sh
rpm -e zsh
(8)RPM包校验
软件相关的数据库存放于 /var/lib/rpm ⽬录
rpm -V vsftpd
S //⽂件的容量⼤⼩是否被改变
M //⽂件的类型或者⽂件的属性是否被修改
5 //MD5这⼀种指纹加密的内容已经不同
D //装置的主/次代码已经改变
L //路径已经被改变
U //⽂件的所属主已被修改
G //⽂件的所属组已被修改
T //⽂件的创建时间已被改变
22.yum工具管理rpm包
yum 是基于 RPM 包管理, 能够⾃动解决依赖关系, 极⼤的⽅便 rpm 包的安装升级
(1)本地yum仓库
有时候你的linux系统不能联⽹,当然就不能很便捷的使⽤联⽹的yum源了,这时候就需要你⾃⼰会利⽤linux系统
光盘制作⼀个yum源。具体步骤如下:
mount /dev/cdrom /mnt //挂载镜像
gzip /etc/yum.repos.d/* //备份原有仓库
创建新仓库⽂件,并加⼊如下内容:
yum-config-manager --add-repo="file:///mnt" //使⽤yum-config-manager命令添加本地仓库
vim /etc/yum.repos.d/cdrom.repo ////⼿动添加repo配置⽂件(⽅式⼆)
[cdrom]
name=This is local cdrom
baseurl=file:///mnt
enabled=1
gpgcheck=0
[] //仓库名称
name //仓库描述信息
baseurl //YUM源url地址 ,可以是file:// ftp:// http://
enabled //是否激活该YUM源(0代表禁⽤,1代表激活,默认为激活)
gpgcheck //安装软件时是否检查签名(0代表禁⽤,1代表激活)
yum makecache //刷新 repos ⽣成缓存
(2)⽹络YUM仓库
官⽅⽹络YUM源配置
阿⾥镜像站点 : https://developer.aliyun.com/mirror/
wget -O /etc/yum.repos.d/CentOS-Base.repo \ // Base/Extras/Updates: 默认国外官⽅源
yum -y install epel-release ////国外epel源
wget -O /etc/yum.repos.d/epel.repo \ //阿⾥云epel源
(2)官⽅YUM仓库
vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
EOF
(4)红帽配置Centos仓库
1.卸载红帽yum源 rpm -e $(rpm -qa|grep yum) --nodeps
2.删除所有repo相关⽂件
rm -rf /etc/yum.conf
rm -rf /etc/yum.repos.d/
rm -rf /var/cache/yum
3.下载centos相关yum组件
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-
154.el7.centos.noarch.rpm
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-
10.el7.x86_64.rpm
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-plugin-fastestmirror-
1.1.31-42.el7.noarch.rpm
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-updateonboot-1.1.31-
42.el7.noarch.rpm
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-utils-1.1.31-
42.el7.noarch.rpm
//如果没有wget命令则使⽤curl命令
curl -o yum-utils-1.1.31-42.el7.noarch.rpm
https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-utils-1.1.31-
42.el7.noarch.rpm
curl -o yum-3.4.3-154.el7.centos.noarch.rpm
https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-
154.el7.centos.noarch.rpm
curl -o yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-
10.el7.x86_64.rpm
curl -o yum-plugin-fastestmirror-1.1.31-42.el7.noarch.rpm
https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-
42.el7.noarch.rpm
curl -o yum-updateonboot-1.1.31-42.el7.noarch.rpm
https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-updateonboot-1.1.31-
42.el7.noarch.rpm
3.安装所有相关组件
[root@wing-node1 ~]# rpm -ivh yum-*
4.下载base和epel仓库
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sed -i 's#$releasever#7#g' /etc/yum.repos.d/CentOS-Base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
(5)YUM软件命令管理
1.搜索软件包指令
yum list //列出软件仓库中可⽤的软件
yum list|grep ftp //进⾏模糊查找
yum info ftp //列出软件包详情
2.安装软件包指令
yum install traceroute //安装软件只需要给出软件名称
yum install php -y //安装过程中分析依赖关系后, 直接安装, ⽆需交互
yum localinstall /mnt/Packages/bind-9.9.4-50.el7.x86_64.rpm //安装本地的rpm包, 如果有依赖关系, 会⾃动从软件仓库中下载所需依赖(⾮来⾃.repo定义的软件仓库)
yum install http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbixrelease-3.4-2.el7.noarch.rpm //安装⽹络上rpm包
3.重装软件包指令
rpm -q vsftpd //检查软件是否存在
rpm -qc vsftpd //检查vsftpd软件配置⽂件
rm -f /etc/vsftpd/vsftpd.conf //不⼩⼼删除vsftpd配置⽂件
yum reinstall vsftpd //重新安装软件
rpm -qc vsftpd //再次检查
4.更新软件包指令
yum check-update //对⽐Linux已安装的软件和yum仓库中的软件, 有哪些需要升级
yum update acl -y //更新软件
5.删除软件包指令
yum erase samba -y //删除该软件包,不会删除依赖, 但是我们尽可能不要使⽤删除软件操作
yum remove samba -y //删除该软件包,不会删除依赖, 但是我们尽可能不要使⽤删除软件操作
6.仓库相关指令
yum repolist //列出yum源可⽤的软件仓库
yum repolist all //列出全部yum源可⽤和禁⽤的仓库
yum provides /etc/my.cnf //查看这个⽂件或命令属于哪个包
yum provides cd //查看这个⽂件或命令属于哪个包
7.缓存相关指令
yum makecache //缓存yum源软件仓库, xml元数据⽂件
vim /etc/yum.conf //缓存软件包, 修改yum全局配置⽂件
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=1 //启动缓存
ls /var/cache/yum/x86_64/7/base/ //查看缓存的xml⽂件
ls /var/cache/yum/x86_64/7/ //查看缓存软件包路径
另⼀种缓存rpm包⽅式
//1.安装插件⽀持只下载软件包不安装 yum install -y yum-plugin-downloadonly
//2.将软件下载⾄指定⽬录 yum install httpd -y --downloadonly --downloaddir=/tmp
yum clean all //清除所有yum缓存
yum clean packages //只清除缓存的软件包
8.包组相关指令
yum groups list //列出已经安装和所有可使⽤的软件组
yum groups install Development tools \ //安装⼀整个组的软件
yum groups remove -y Base //yum删除包组
(3)全局配置⽂件
vim /etc/yum.conf
cachedir=/var/cache/yum/$basearch/$releasever //缓存⽬录
keepcache=0 //缓存软件包, 1启动 0 关闭
debuglevel=2 //调试级别
logfile=/var/log/yum.log //⽇志记录位置
exactarch=1 //检查平台是否兼容
obsoletes=1 //检查包是否废弃
gpgcheck=1 //检查来源是否合法,需要有制作者的公钥信息
plugins=1 //是否启⽤查询
installonly_limit=5
bugtracker_url
metadata_expire=90m //每⼩时⼿动检查元数据
in /etc/yum.repos.d //包含repos.d⽬录
(4)YUM签名检查机制
rpm 软件提供组织 redhat 在构建 rpm 包时, 使⽤其 私钥private key 对 rpm 进⾏签名
客户端在使⽤ rpm 为了验证其合法性, 可以使⽤ redhat 提供的 公钥public key 进⾏签名检查
⽅式1: 指定公钥的位置
vim /etc/yum.repos.d/CentOS-Base.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
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
⽅式2: 提前导⼊公钥
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
vim /etc/yum.repos.d/CentOS-Base.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
⽅式3: 不进⾏签名验证
yum install httpd --nogpgcheck //不检查软件包的签名
(5)构建企业YUM仓库
本地光盘提供基础软件包 Base
yum缓存提供 update 软件包
yum缓存提供常⽤软件包: nginx , zabbix , docker , saltstack
服务端配置
1.基础环境准备
systemctl stop firewalld //关闭防⽕墙
setenforce 0 //临时关闭selinux
//安装ftp服务,启动并加⼊开机启动
yum -y install vsftpd
systemctl start vsftpd
systemctl enable vsftpd
//开启yum缓存功能
vim /etc/yum.conf
[main] cachedir=/var/cache/yum/$basearch/$releasever
keepcache=1
yum clean all
2.提供基础 base 源
mkdir /var/ftp/{centos69,centos74}
mount /dev/cdrom /mnt
cp -rp /mnt/Packages/.rpm /var/ftp/centos74
3.提供第三⽅源
mkdir /var/ftp/ops
yum -y install nginx docker
find /var/cache/yum/x86_64/7/ \ -iname ".rpm" -exec cp -rf {} /var/ftp/ops ; //复制已缓存的 Nginx docker 及依赖包 到⾃定义 YUM 仓库⽬录中
4.安装 createrepo 并创建 reopdata 仓库
yum -y install createrepo //安装createrepo
createrepo /var/ftp/ops //⽣成仓库信息
//注意: 如果此仓库每次新增软件则需要重新⽣成⼀次
客户端使⽤yum源
1.配置并使⽤ base 基础源
gzip /etc/yum.repos.d/*
vim /etc/yum.repos.d/centos7.repo
[centos74]
name=centos74_base
baseurl=ftp://192.168.69.112/centos74
gpgcheck=0
2.客户端指向本地 ops 源
vim /etc/yum.repos.d/ops.repo
[ops]
name=local ftpserver
baseurl=ftp://192.168.69.112/ops
gpgcheck=0
9.源码安装包管理
(1)源码包如何获取
官⽅⽹站, 可以获得最新的软件包
Apache官⽅⽹站
Nginx官⽅⽹站
github
(2)源码包如何安装
编译环境 gcc、make
依赖环境pcre、openssl
准备对应软件 nginx-1.12.tar.gz
(3)源码安装三步曲(常⻅)
第⼀步: ./configure(定制组件)
a.指定安装路径,例如 --prefix=/soft/nginx-1.12
b.启⽤或禁⽤某项功能, 例如 --enable-ssl
c.和其它软件关联,例如--with-pcre
d.检查安装环境,例如是否有编译器 gcc,是否满⾜软件的依赖需求
e.检测通过后⽣成Makefile⽂件
第⼆步: make
1.执⾏make命令进⾏编辑, 可以使⽤-j指定CPU编译
2.按Makefile⽂件进⾏编译, 编译成可执⾏⼆进制⽂件
3.⽣成各类模块和主程序。
第三步: make install
1.执⾏make install
2.按Makefile定义好的路径拷⻉⾄安装⽬录中。
上⾯介绍的源码三部曲不能百分百通⽤于所有源码包, 也就是说源码包的安装并⾮存在标准安装步骤。
建议:拿到源码包解压后,然后进⼊到⽬录找相关的帮助⽂档,通常会以 INSTALL 或者 README 为⽂件名。
(4)源码包编译实例
//1.基础环境准备
[root@node1 ~]# yum install -y gcc make wget
//2.下载源码包(源码包⼀定要上官⽅站点下载,其他站点不安全)
[root@node1 ~]# mkdir -p /soft/src
[root@node1 src]# cd /soft/src
[root@node1 src]# wget http://nginx.org/download/nginx-1.12.2.tar.gz
//3.解压源码包,并进⼊相应⽬录
[root@node1 src]# tar xf nginx-1.12.2.tar.gz
[root@node1 src]# cd nginx-1.12.2
//4.配置相关的选项,并⽣成Makefile
[root@node1 nginx-1.12.2]# ./configure --help|head
--help print this message
--prefix=PATH set installation prefix
--sbin-path=PATH set nginx binary pathname
--modules-path=PATH set modules path
--conf-path=PATH set nginx.conf pathname
--error-log-path=PATH set error log pathname
--pid-path=PATH set nginx.pid pathname
--lock-path=PATH set nginx.lock pathname
//后⾯的内容省略了,使⽤ ./configure --help 命令查看可以使⽤的选项。
//⼀般常⽤的有 --prefix=PREFIX 这个选项的意思是定义软件包安装到哪⾥。
//建议,源码包都是安装在/soft/⽬录下。
//5.指定编译参数
[root@node1 nginx-1.12.2]# ./configure --prefix=/soft/nginx-1.12.2
//6.验证这⼀步命令是否成功, ⾮0都都不算成功
[root@node1 nginx-1.12.2]# echo $?
0
//7.编译并安装
[root@node1 nginx-1.12.2]# make
[root@node1 nginx-1.12.2]# make install
[root@node1 nginx-1.12.2]# echo $?
源码编译报错信息处理
checking for C compiler ... not found ./configure: error: C compiler cc is not found
//解决⽅案
yum -y install gcc gcc-c++ make
vx: WingspanGo
vx: WingspanGo
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=
//解决⽅案
yum install -y pcre-devel
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --withouthttp_gzip_module option, or install the zlib library into the
system, or build the zlib library statically from the source with
nginx by using --with-zlib=
//解决⽅案:
yum -y install zlib-devel
./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL
library into the system, or build the OpenSSL library statically
from the source with nginx by using --with-openssl=
//解决⽅案
yum -y install openssl-devel
10.磁盘管理
(1)硬盘命名
系统的第⼀块SCSI接⼝的硬盘名称为 /dev/sda
系统的第⼆块SCSI接⼝的硬盘名称为 /dev/sdb
系统中分区由数字编号表示, 1~4留给主分区使⽤和扩展分区, 逻辑分区从5开始
物理硬盘 /dev/sd[a-z]
KVM虚拟化 /dev/vd[a-z] online
//第⼀块磁盘
/dev/sda
//第⼆块磁盘第⼀个分区
/dev/sdb1
//第⼀块KVM虚拟化磁盘, 第⼀个分区
/dev/vda1
fdisk -l //查看磁盘大小
注意:
MBR (Master Boot Record)⽅式只能分4个主分区, GPT (GUID Partition Table)可分128个主分区
MBR 与 GPT 之间互相转换会导致数据丢失
(2)磁盘容量检查
1.使⽤ df 命令查看磁盘容量,不加参数以k为单位
df -i //查看inode使⽤情况
df -h //以G或者T或者M⼈性化⽅式显示
df -T //查看⽂件类型
Inode 是⽂件系统中的⼀个数据结构,它记录了⽂件的元数据信息,如⽂件的权限、所有者、时间戳等,同
时也包含了指向⽂件数据所在Block的指针。
Block 则是⽂件系统中的数据存储单元,⽂件的实际数据存储在Block中。
2.使⽤ lsblk 查看分区情况
3.使⽤ du 命令查看⽬录或者⽂件的容量,不加参数以k为单位
du -sh opt //⼈性化输出显示⼤⼩
-s:列出总和
-h:⼈性化显示容量信息
(3)磁盘分区Fdisk
⼩于2TB存储磁盘, 可选分区⼯具 fdisk
//⽣产分区建议: 如⽆特殊需求, 直接使⽤整个磁盘即可, ⽆需分区
//学习分区建议:1P+1E(3L) 2P+1E(2L) 3P+1E(1L) (仅适⽤于练习)
fdisk /dev/sdb //给磁盘分区
fdisk /dev/sdb -l|grep type ///检查磁盘是否是MBR分区⽅式
//安装parted, 刷新内核⽴即⽣效,⽆需重启
yum -y install parted
partprobe /dev/sdb
(4)磁盘分区Gdisk
⼤于2TB使⽤分区⼯具 gdisk
yum install gdisk //安装gdisk⼯具
gdisk /dev/sdb //创建分区
fdisk /dev/sdb -l|grep type //检查磁盘是否是gpt格式
//安装parted, 刷新内核⽴即⽣效,⽆需重启
yum -y install parted
partprobe /dev/sdb
(5)磁盘格式化Mkfs
mkfs格式化磁盘,实质创建⽂件系统
mkfs常⽤的选项有
-b //设定数据区块占⽤空间⼤⼩,⽬前⽀持1024、2048、4096 bytes每个块。
-t //⽤来指定什么类型的⽂件系统,可以是ext4, xfs
-i //设定inode的⼤⼩
-N //设定inode数量,防⽌Inode数量不够导致磁盘不⾜
-L //预设该分区的标签label
mkfs.ext4 /dev/sdb1 //格式化整个sdb磁盘为ext4⽂件系统
mkfs.xfs /dev/sdb1 //也可以格式化sdb1分区为xfs⽂件系统
(6)磁盘挂载Mount
1.临时挂载磁盘
命令:mount挂载磁盘,实质为⽂件系统指定访问⼊⼝
mount -t //指定⽂件系统挂载分区,如ext4, xfs
mount -a //读取/etc/fstab配置⽂件的所有分区
mount -o //指定挂载参数
mount -t xfs /dev/sdb1 /db1/ //挂载/dev/sdb1⾄db1⽬录
2.永久挂载磁盘
blkid |grep "sdb1" //使⽤blkid命令获取各分区的UUID
mount UUID="0a251763-b1c8-4cf0-961b-652004ddda82" /db1 //使⽤UUID挂载磁盘sdb1分区⾄于db1, 临时挂载
tail -1 /etc/fstab //也可以把下⾯这⾏写到/etc/fstab中,永久挂载, 开机⾃动挂载
UUID=0a251763-b1c8-4cf0-961b-652004ddda82 /db1 xfs defaults 0 0
mount –a //加载fstab配置⽂件, 同时检测语法是否有错误
注意 : /etc/fstab 未按照格式写错,会导致系统⽆法启动加载硬盘失败,进去单⽤户去掉写错配置即可
3.卸载挂载磁盘
umount -lf //强制卸载挂载
umount /db1 //使⽤站点⽬录卸载
umount /dev/sdb1 //使⽤设备名卸载/dev/sdb1
//umount不能卸载的情况
umount /db1
umount: /db1: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1)
//如上情况解决办法有两种, 切换⾄其他⽬录 或使⽤'-l'选项强制卸载
lsof 或者 fuser 找出谁在使⽤db1⽬录
umount -l /db1
(7)虚拟磁盘SWAP
1.创建swapfile
dd if=/dev/zero of=/opt/newdisk bs=40k count=102400
//if:指定源 ⼀般写/dev/zero
//of:指定⽬标
//bs:定义快⼤⼩
//count:数量
2.格式化swap分区
mkswap -f /opt/newdisk
3.检测当前swap分区情况
free -m
4.启动虚拟磁盘,并检查
swapon /opt/newdisk
free -m
5.关闭虚拟磁盘,并检查
swapoff /opt/newdisk
free -m
swapon -s //查看交换分区
(8)⽣产磁盘故障案例
Inode被沾满,导致磁盘有可⽤的剩余空间也⽆法继续使⽤
虚拟磁盘SWAP是⼀种虚拟内存技术,通过将⼀部分硬盘空间作为虚拟内存使⽤,来扩展系统的内存容量。
当物理内存不⾜时,系统会将⼀部分暂时不⽤的内存数据存储到虚拟磁盘SWAP中,以释放物理内存,从⽽
保证系统的正常运⾏。
dd if=/dev/zero of=/opt/newdisk bs=1k count=1024
mkfs.ext4 -i 1024 /opt/newdisk
mkdir /data
mount -t ext4 -o loop /opt/newdisk /data/
//inode被沾满
touch {1..20000}
touch: cannot touch 19997': No space left on device touch: cannot touch
19998': No space left on device
touch: cannot touch 19999': No space left on device touch: cannot touch
20000': No space left on device
//inode被沾满,剩余block也是⽆法继续使⽤
df -i|grep data
/opt/newdisk 1024 1024 0 100% /data
df -h|grep data
/opt/newdisk 891K 34K 806K 5% /data
// 清理
find ./ -type f -name "[0-9]*" |xargs rm -rf
Block空间即将被沾满, 但删除⼤⽂件也没有释放空间
假设现在线上正在运⾏Nginx服务, Nginx产⽣的⽇志已经达到了20个G, 磁盘眼看就看沾满了, 请问不重启
Nginx的⽅式如何处
//模拟环境
yum -y instll nginx
vim /etc/nginx/nginx.conf
access_log /data/log/nginx/access.log main;
mkdir -p /data/log/nginx/
chown nginx.nginx -R /data/log/
//模拟⼤量的⽂件写⼊
seq 120000 > access.log
seq 140000 > access.log
seq: write error: No space left on device
模拟再现访问
tailf /var/log/nginx/error.log
vx: WingspanGo
vx: WingspanGo
vx: WingspanGo
2023/06/05 11:53:30 [alert] 3200#3200: *3 write() to "/data/log/nginx/access.log"
failed (28: No space left on device) while logging request, client: 192.168.9.1,
server: _, request: "GET / HTTP/1.1", host: "192.168.9.12"
//是会删除⽂件, 但Nginx持续占⽤着⽂件, 所以空间并不会被释放
rm -f access.log
lsof |egrep nginx |egrep delete
nginx 3099 root 12w REG 7,0 849920
14 /data/log/nginx/access.log (deleted)
nginx 3199 nginx 12w REG 7,0 849920
14 /data/log/nginx/access.log (deleted)
nginx 3200 nginx 12w REG 7,0 849920
14 /data/log/nginx/access.log (deleted)
//正确做法如下, 清空该⽂件即可释放⽂件内容
access.log
// 重写reload下资源
nginx -s reload
11.网络基础管理
(1)Linux命名规则
传统的 rhel 系统以 eth0 eth1 名来命名⽹卡, 在 rhel7 系统开始使⽤新的命名规则:
1.由两个字⺟开头标示固件
以太⽹⽹卡以 en 开头
⽆线⽹卡以 wl 开头
2.设备结构
o 表示板载⽹卡(on-board)
s 热插拔结构(hotplug slot)
p PCI插槽位置
(2)⽹络接⼝信息查看
1.查看⽹络接⼝配置信息
ifconfig //查看当前处于活动状态的⽹络接⼝
ifconfig eth0 //仅查看eth0⽹卡状态信息
fconfig -a //查看所有⽹卡状态信息, 包括禁⽤和启⽤
//⽹卡配置信息含义如下:
UP: ⽹卡处于活动状态
BROADCAST: ⽀持⼴播
RUNNING: ⽹线已接⼊
MULTICAST: ⽀持组播
MTU: 最⼤传输单元(字节),即此接⼝⼀次所能传输的最⼤封包
inet: 显示IPv4地址⾏
inet6: 显示IPv6地址⾏
link/enther: 指设备硬件(MAC)地址
txqueuelen: 传输缓存区⻓度⼤⼩
RX packets: 接收的数据包这个⽹络接⼝(ens33)在接收(RX)⽅向收到了38911个数据包,共计12109629字节
(约11.5 MiB)。
TX packets: 发送的数据包
errors: 总的收包的错误数量
dropped: 由于各种原因, 导致拷⻉在内存过程中被丢弃
collisions: ⽹络信号冲突情况, 值不为0则可能存在⽹络故障
Ip addr show ens33 //其他查看ip指令
ip -s link show ens33 //ip命令也可⽤于显示关于⽹络性能的统计信息, ⽐如: 发送和传送的数据包、错误、丢弃
(3)NetworkManager管理⽹络
这是⼀种动态管理⽹络配置的守护进程,能够让⽹络设备保持连接状态。
NetworkManager
提供的命令⾏和图形配置⼯具对⽹络进⾏设定, 设定保存的配置⽂件在
/etc/sysconfig/network-scripts
⽬录下, ⼯具有 `nmcli, nmtui, nm-connect-editor
使⽤ nmcli 命令查看设备以及连接情况
nmcli device //查看设备状态
nmcli dev show ens33 //指定查看设备的详细状态
nmcli connection //查看连接状态
nmcli con show --active //所有活动的连接
nmcli con show "ens33" //查看指定ID连接的详细情况
使⽤ nmcli 创建新的连接
nmcli connection add con-name ens33-dhcp ifname eth0 autoconnect yes type ethernet ipv4.method auto
//新增⼀个静态地址的连接, 配置IP、掩码、⽹关等
静态地址添加流程
1.添加⼀个连接的配置
2.给连接指定⼀个名称
3.连接配置绑定物理⽹卡
4.⽹卡的类型,⽹卡开机启动
5.⽹卡通过什么途径获取地址(静态、dhcp)
6.配置对应的IP地址、掩码、⽹关、DNS
nmcli connection add con-name eht1-static ifname eth1
type ethernet autoconnect yes
ipv4.method manual
ipv4.addresses 192.168.56.100/24
ipv4.gateway 192.168.56.2
ipv4.dns 192.168.56.2
+ipv4.dns 8.8.8.8
nmcli connection up eht1-static //激活指定的连接名为eht1-static的连接
nmcli connection show
使⽤ nmcli 修改已有的⽹络连接
nmcli connection modify eht1-static autoconnect no //1.取消开机⾃动激活⽹络
nmcli connection modify eht1-static ipv4.dns 8.8.8.8 //2.修改连接的dns
nmcli connection modify eht1-static +ipv4.dns 8.8.8.8 //3.给连接再增加dns,有些设定值通过+/-可以增加或则移除设定
nmcli connection down eht1-static && nmcli connection up eht1-static //6.修改完毕,nmlci仅仅修改并保存了配置,要激活更改,需要重激活连接
mcli connection delete eht1-static //删除⾃建的connection
(4)使⽤ nmcli 管理⽹络 /etc/sysconfig/network-scripts/ 配置⽂件
vim /etc/sysconfig/network-scripts/ifcfg-eht1-static
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.69.232
PREFIX=24
GATEWAY=192.168.69.1
DNS1=211.161.122.200
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens32-staic
UUID=6fdebe6e-5ef0-4a05-8235-57e317fdada0
DEVICE=ens32
ONBOOT=yes
nmcli connection reload //⼿⼯编辑正在使⽤的配置⽂件,需要重载配置,然后重启
nmcli connection down eht1-static && nmcli connection down eht1-static
使⽤原⽣Network管理⽹络
1.删除 NetworkManger 建⽴连接, 同时停⽌ NetworkManger 服务
systemctl disable NetworkManager
systemctl stop NetworkManager
2.添加⼀块物理⽹卡, 然后新增⽹络连接配置⽂件
cp /etc/sysconfig/network-scripts/{ifcfg-eth0,ifcfg-eth1} //复制配置eth0配置⽂件为eth1
vim /etc/sysconfig/network-scripts/ifcfg-eth1 //编辑⽹卡配置⽂件
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.56.12
NETMASK=255.255.255.0
GATEWAY=192.168.56.2
DNS1=192.168.56.2
systemctl restart network.service //重启network⽹络服务加载⽹络
//选项 //描述
BOOTPROTO=none //获取地址⽅式[none|dhcp|static]
IPADDR=192.168.56.12 //固定IP地址
PREFIX=24 //掩码
GATEWAY=192.168.56.2 //⽹关
DNS1=192.168.56.2 //域名解析
DEVICE=eth1 //设备名称
NAME="eth1" //连接名称
ONBOOT=yes //开机⾃启动
DEFROUTE=yes //将接⼝设定为默认路由[yes|no]
USERCTL=yes //允许⾮root⽤户管理接⼝[yes|no]
(5)Route设置路由以及⽹关
在同⼀个⼦⽹ 交换机arp 进⾏通信 不在同⼀⽹ 路由器
route add 192.168.9.1 gw 192.168.9.3 //增加⽹段路由
route del 192.168.90.0/24 //删除⽹段路由
route -n //查看当前路由表
(6)主机名设定与名称解析服务
⽣产环境中必须配置主机名,同时主机名也需要遵循⼀定的规范, ⽐如:
公有云: 地区-项⽬-业务-服务-节点-地址
wh-shop-register-nginx-node1-192.168.9.3
wh-med-pay-mysql-master01-192.168.9.3
wh-med-pay-mysql-slave01-192.168.9.4
1.主机名查看与配置
hostname "test" //hostname命令可以查看主机名, 也可以⽤于临时修改主机名
rhel7系统建议使⽤hostnamectl修改和查看主机名
hostnamectl set-hostname nginx.node1.wing.com //设定永久名称
hostnamectl //检查状态信息
2.DNS客户端配置
/etc/hosts ⽂件, 加快域名解析, ⽅便⼩型局域⽹⽤户使⽤内部设备
使⽤ hosts ⽂件仅能为有限的主机记录, ⽆法将所有已知的主机名记录到 hosts ⽂件中, 因此当今⼏乎所有的主机
都在使⽤ DNS 来解析地址, DNS 是全互联⽹上主机名及其 IP 地址对应关系的数据库, 配置⽂件 /etc/resolv.conf
cat /etc/resolv.conf
Generated by NetworkManager
nameserver 223.5.5.5
nameserver 223.6.6.6
nameserver 114.114.114.114
nameserver 8.8.8.8
(7)⽹络检测⼯具与故障排查
ping 命令的⽬的在于测试另⼀台主机是否可达, 如果ping不到某台主机,就说明对⽅主机已经出现了问题, 但是不排
除由于链路中的防⽕墙、ping被丢弃等原因造成ping不通的情况
-c 指定ping的次数
-i 指定ping包的发送间隔
-w 如果ping没有回应, 则在指定超时时间后退出
host/nslookup命令是⽤来查询
DNS记录的,如果使⽤域名作为host的参数, 命令返回该域名的
IP
host wing.com
traceroute 命令是⽤来路由跟踪, 检测⽹络故障出现在 ISP 运营商或是对端服务⽆法响应
traceroute www.bing.com
ss/netstat 命令查看⽹络连接状态
-t tcp协议的连接
-a 所有状态的连接
-n 数字化输出
-u upd协议的连接
-l 处于listen状态的连接
-p 输出相应进程的名字
ss -tnl |grep :80
//常⻅端⼝
http 80/tcp
https 443/tcp
ssh 22/tcp
ftp 20,21/tcp
mysql 3306/tcp
rsync 873/rsync
redis 6379/tcp
(8)⽹络连接状态详解
共有12中可能的状态,前⾯11种是按照TCP连接建⽴的三次握⼿和TCP连接断开的四次挥⼿过程来描述的:
- LISTEN:⾸先服务端需要打开⼀个socket进⾏监听,状态为 LISTEN,侦听来⾃远⽅TCP端⼝的连接请求 ;
- SYN_SENT:客户端通过应⽤程序调⽤connect进⾏active open,于是客户端tcp发送⼀个SYN以请求建⽴⼀
个连接,之后状态置为 SYN_SENT,在发送连接请求后等待匹配的连接请求; - SYN_RECV:服务端应发出ACK确认客户端的 SYN,同时⾃⼰向客户端发送⼀个SYN,之后状态置为,在收到
和发送⼀个连接请求后等待对连接请求的确认; - ESTABLISHED:代表⼀个打开的连接,双⽅可以进⾏或已经在数据交互了, 代表⼀个打开的连接,数据可以
传送给⽤户; - FIN_WAIT1:主动关闭(active close)端应⽤程序调⽤close,于是其TCP发出FIN请求主动关闭连接,之后进⼊
FIN_WAIT1状态, 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
[root@wing strace]# traceroute www.bing.com
traceroute to www.bing.com (202.89.233.101), 30 hops max, 60 byte packets
1 gateway (192.168.9.1) 0.898 ms 0.611 ms 0.496 ms
2 192.168.124.1 (192.168.124.1) 3.446 ms 3.357 ms 3.260 ms
3 192.168.1.1 (192.168.1.1) 4.454 ms 4.311 ms 5.618 ms
4 10.70.0.1 (10.70.0.1) 7.405 ms 7.343 ms 7.233 ms
5 221.222.117.161 (221.222.117.161) 24.919 ms 24.833 ms 24.736 ms
6 202.106.36.106 (202.106.36.106) 8.409 ms 6.404 ms 6.184 ms
7 61.148.60.134 (61.148.60.134) 7.422 ms 7.339 ms 7.220 ms
-t tcp协议的连接
-a 所有状态的连接
-n 数字化输出
-u upd协议的连接
-l 处于listen状态的连接
-p 输出相应进程的名字 - Show TCP sockets (LISTEN)
[root@wing~]# ss -tnl
[root@wing~]# ss -tnl |grep :80
[root@wing~]# ss -tnl |grep :21
[root@wing~]# ss -atn
[root@wing~]# ss -atn |grep :22
//常⻅端⼝
http 80/tcp
https 443/tcp
ssh 22/tcp
ftp 20,21/tcp
mysql 3306/tcp
rsync 873/rsync
redis 6379/tcp
vx: WingspanGo
vx: WingspanGo - CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为⽂件结
束符传递给上层应⽤程序),并进⼊CLOSE_WAIT, 等待从本地⽤户发来的连接中断请求; - FIN_WAIT2:主动关闭端接到ACK后,就进⼊了 FIN-WAIT-2,从远程TCP等待连接中断请求;
- LAST_ACK:被动关闭端⼀段时间后,接收到⽂件结束符的应⽤程 序将调⽤CLOSE关闭连接,这导致它的TCP
也发送⼀个 FIN,等待对⽅的ACK.就进⼊了LAST-ACK,等待原来发向远程TCP的连接中断请求的确认; - TIME_WAIT:在主动关闭端接收到FIN后,TCP 就发送ACK包,并进⼊TIME-WAIT状态,等待⾜够的时间以确保
远程TCP接收到连接中断请求的确认; - CLOSING: ⽐较少⻅,等待远程TCP对连接中断的确认;
- CLOSED: 被动关闭端在接受到ACK包后,就进⼊了closed的状态,连接结束,没有任何连接状态;
- UNKNOWN:未知的Socket状态;
常⻅标志位
SYN: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握⼿建⽴TCP连接时有效。表示⼀个
新的TCP连接请求。
ACK: (确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有
数据。
FIN: (结束标志,FINish)⽤来结束⼀个TCP回话.但对应端⼝仍处于开放状态,准备接收后续数据。
(9)⽹络故障排查
⽹络故障分为硬件\软件故障
⽹卡损坏
链路故障
⽹卡驱动不兼容
⽹络排查思路
1.ping本地回环⼝, 确定本机TCP/IP协议栈是否正常
2.ping本机IP地址, 确定本地设备以及驱动是否正常
3.ping同⽹段主机, 确定⼆层⽹络是否正常⼯作
4.ping⽹关地址, 确定本地与⽹络是否正常
5.ping公⽹地址, 确定本地路由是否正常 ping baidu.com ping 223.5.5.5
6.ping公⽹域名, 确定DNS客户端是否正常 dns/resove有配置dns有问题
服务故障排查思路
1.使⽤telnet检测端⼝是否开放
2.检查服务端防⽕墙以及SElinux
3.检查相应的权限是否配置正常
4.检查⽇志是否有异常
5.检查完毕后持续测试
建议: 所有的排查思路都从OSI七层模型由下往上逐⼀进⾏排查(学会看⽇志)
(10)Linux7修改⽹卡为eth0
//修改⽹卡配置⽂件
cd /etc/sysconfig/network-scripts/
mv ifcfg-eno16777728 ifcfg-eth0
vim ifcfg-eth0
NAME=eth0
DEVICE=eth0
//GRUB添加kernel参数
vim /etc/sysconfig/grub
GRUB_CMDLINE_LINUX="...net.ifnames=0 biosdevname=0 quiet"
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot //重启系统⽣效
12.linux系统计划任务
(1)清除缓存 echo 3 > /proc/sys/vm/drop_caches
(2)//循环调度执⾏cron 进程每分钟会处理⼀次计划任务
systemctl status crond.service
ps aux |grep crond
(3)计划任务分为以下两种情况:
1.系统级别的定时任务:
清理系统缓存
临时⽂件清理
系统信息采集
⽇志⽂件切割
2.⽤户级别的定时任务:
定时同步互联⽹时间
定时备份系统配置⽂件
定时备份数据库⽂件
定时跑任务接⼝等等
(4)crond配置⽂件详解
⽂件 说明
/etc/crontab //Crontab配置⽂件
/etc/cron.deny //该⽂件中所列⽤户不允许使⽤crontab命令
/var/spool/cron/* //所有⽤户定时⽂件都存放此⽬录,⽂件以⽤户名命名
/var/log/cron/ //定时任务执⾏后的⽇志⽂件,可⽤来回溯
(5)crond计划任务管理
-e 编辑crontab⽂件内容 crontab -e
-l 查看crontab⽂件内容 crontab -l
-r 删除crontab⽂件内容 crontab -r
-u 管理其他⽤户的计划任务 crontab -u wing -l
注意: crontab {-l -e}实际上就是在操作/var/spool/cron/username
(6)crond时间含义
// * 表示任意的(分、时、⽇、⽉、周)时间都执⾏
// - 表示⼀个时间范围段, 如5-7点
// , 表示分隔时段, 如6,0,4表示周六、⽇、四
// /1 表示每隔n单位时间, 如/10 每10分钟
(7)crond编写示例
00 02 * * * ls //每天2:00整
00 02 1 * * ls //每⽉1号2:00整
00 02 14 2 * ls //每年2⽉14号2:00整
00 02 * * 7 ls //每周⽇2:00整
00 02 * 6 5 ls //每年6⽉的周五2:00整
00 02 14 * 7 ls //每⽉14号2:00整或每周⽇2:00整,这两个时间都执⾏
00 02 14 2 7 ls //每年 2 ⽉ 14 号 2:00 整 或者 每周⽇ 2:00 整,这两个时间都执⾏
00 02 * * * ls //每天2:00整
- 02 * * * ls //每天2:00中的每⼀分钟 (逻辑错误)
-
-
-
-
- ls //每分钟执⾏ ls
(8)crond书写规范
//1.为计划任务增加必要的注释
//2.规范计划任务执⾏脚本存放的路径/soft/scripts/
//3.执⾏shell脚本任务前加/bin/sh, 脚本结尾加&>/dev/null
//调试好后应屏蔽debug输出信息,避免产⽣系统垃圾占⽤过多inode, 如需输出⽇志, 可重定向⾄⽇志⽂件
(9)crond配置编写实例
- ls //每分钟执⾏ ls
-
-
-
每天凌晨切割nginx⽇志
00 00 * * * /bin/sh -x /soft/scripts/cut_nginx.sh &> /soft/scripts/log/nginx.log
每天5点备份数据库
00 05 * * * /bin/sh -x /soft/scripts/dump_sql.sh &>/soft/scripts/log/mysql.log
每5分钟检测数据库是否正常
*/5 * * * * /bin/sh /soft/scripts/start_mysql.sh &>/dev/null
//注意:
1.我们所有的crond服务是运⾏的程序。⽽crontab命令⽤户⽤来设置定时规则的命令。
2.crond服务是企业⽣产⼯作中常⽤的重要服务,at很少使⽤,可以忽略。
3.⼏乎每个服务器都会⽤到crond服务。
cut_nginx.sh脚本
!/bin/bash
设置⽇志⽬录和⽂件名
vx: WingspanGo
vx: WingspanGo
dump_sql.sh
log_dir="/var/log/nginx"
log_file="access.log"
获取昨天的⽇期
yesterday=$(date -d "yesterday" +"%Y-%m-%d")
切割⽇志⽂件
mv $log_dir/$log_file $log_dir/$log_file.$yesterday
发送信号,使Nginx重新打开⽇志⽂件
kill -USR1 $(cat /run/nginx.pid)
清理过期的⽇志⽂件(保留7天内的⽇志⽂件)
find $log_dir -name ".log." -mtime +7 -exec rm {} ;
dump_sql.sh脚本
!/bin/bash
Database credentials
USER="root"
PASSWORD="xxx"
Backup directory
BACKUP_DIR="/var/backups/mysql"
MySQL dump command
DUMP="/usr/bin/mysqldump"
Get date and time for backup file
NOW=$(date +"%Y-%m-%d-%H-%M-%S")
Create backup directory if it doesn't exist
mkdir -p $BACKUP_DIR
Backup each database to a separate file
for db in $(mysql -u $USER -p$PASSWORD -e "show databases;" | grep -Ev "
(Database|information_schema|performance_schema|sys)")
do
$DUMP --single-transaction --skip-lock-tables --user=$USER -p$PASSWORD $db | gzip >
$BACKUP_DIR/$db-$NOW.sql.gz
done
Delete backups older than 7 days
find $BACKUP_DIR/* -mtime +7 -exec rm {} ;
start_mysql.sh脚本
!/bin/bash
检查 MySQL 是否正在运⾏
pgrep mysqld > /dev/null
if [ $? -ne 0 ]; then
MySQL 未运⾏,启动 MySQL 服务
systemctl start mysqld.service
echo "MySQL 服务已启动"
else
MySQL 已运⾏,输出运⾏状态
echo "MySQL 服务正在运⾏"
fi
(10)crond计划任务调试
1.调整任务每分钟执⾏, 检测是否是否正常, 有些任务不要频繁执⾏
2.调整系统时间然后在检测任务, ⽣产不建议直接使⽤此⽅式
3.执⾏脚本, 将脚本执⾏输出写⼊指定⽇志⽂件, 观察⽇志内容是否正常
4.注意⼀些任务命令带来的问题 echo “wing” >>/tmp/test.log &>/dev/null
5.命令使⽤绝对路径, 防⽌⽆法找到命令导致定时任务执⾏故障
6.查看 /var/log/cron ⽇志进⾏调试
建议: 将需要定期执⾏的任务写⼊脚本中, 建⽴ /soft/scripts ⽬录统⼀存放脚本, 脚本中命令必须使⽤绝对
路径,⼿动执⾏脚本检测输出是否正常, 然后将脚本加⼊计划任务测试, 测试后⽆问题将脚本输出写⼊对应的⽇
志⽂件中即可。
1.⼿动执⾏保留执⾏命令的正确结果
2.编写脚本
脚本需要统⼀路径/soft/scripts
脚本开头建议填写注释信息, 包括执⾏时间、周期、任务
脚本内容复制执⾏成功的命令⾄脚本⽂件中(减少每个环节出错⼏率)
脚本内容尽可能的优化, 使⽤⼀些变量或使⽤简单的判断语句
脚本执⾏的输出信息不要随意打印, 可以重定向⾄其他位置保留或丢⼊⿊洞
3.执⾏脚本
使⽤bash执⾏, 防⽌脚本没有增加执⾏权限(/usr/bin/bash)
执⾏命令以及脚本成功后并复制该命令
4.编写计划任务
加上必要的注释信息, ⼈、时间、任务
设定计划任务执⾏的周期
粘贴执⾏脚本的命令(不要⼿敲)
5.调试计划任务
增加任务频率测试、调整系统时间测试(不能⽤于⽣产)
检查环境变量问题、检查crond服务产⽣⽇志进⾏排查
13.linux日志管理
(1)系统⽇志架构概述
在rhel7系统中有两个⽇志服务,分别是传统的 rsyslog 和新添加的 systemd-journal
rsyslog作为传统的系统⽇志服务,把所有收集到的⽇志都记录到/var/log/⽬录下的各个⽇志⽂件中。常⻅的⽇志⽂
件如下:
/var/log/messages 绝⼤多数的系统⽇志都记录到才⽂件
/var/log/secure 所有跟安全和认证授权等⽇志都会记录到此⽂件
/var/log/maillog 邮件服务的⽇志
/var/log/cron crond计划任务的⽇志
/var/log/boot.log 系统启动的相关⽇志
(2)syslog⽇志审查
syslog⽇志的属性:
emerg //内核崩溃
alert //
crit //
err //错误
warnning //警告
nice //
info //
debug //
看懂简单的⽇志设定规则
分析⽇志字段
logger -p authpriv.info -t "test" "Err" //⼿⼯发送⽇志logger
tail -n1 /var/log/secure
(3)Journal⽇志审查
这是 systemd ⾃带的⽇志服务⼯具所有⽇志记录到 /run/log ⽂件中, 必须使⽤如下命令才可打开
journalctl 查看所有的⽇志
journalctl -n 5 查看最后5条⽇志
journalctl -p err 查看err类型的⽇志
journalctl -f 不断输出最后10条⽇志
journalctl --since today 查看今天的⽇志
journalctl --since "2014-02-10 20:30:00" --until "2014-02-13 12:00:00"
journalctl -o verbose 查看⽇志的详细信息
journalctl _SYSTEMD_UNIT=sshd.service _PID=1182
(4)Journal⽇志持久化
持久化保存 journal 的⽇志,默认只会保存⼀个⽉的⽇志
mkdir /var/log/journal
chown root:systemd-journal /var/log/journal
chmod 2755 /var/log/journal
killall -USR1 systemd-journald
14.集群架构核心服务
(1)chrony时间服务
系统时区配置
timedatectl
timedatectl list-timezones //列出可⽤时区
timedatectl set-timezone Asia/Shanghai //必须调整时间为上海
chrony配置
基础环境准备
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
getenforce
1.安装 chrony 时间同步服务 yum install chrony -y
2.使⽤chrony服务同步时间
egrep -v "#|$" /etc/chrony.conf
server ntp1.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
//⽤于启⽤系统的⽹络时间协议(NTP)服务
timedatectl set-ntp true
//配置时间同步服务器
vim /etc/chrony.conf
server ntp1.aliyun.com iburst
Allow NTP client access from local network.
allow 10.1.106.0/24
3.启动chrony服务
systemctl enable chronyd
systemctl start chronyd
4.验证服务端是否能同步时间
chronyc sources
ntpdate同步
客户端要等⼏分钟再与新启动的ntp服务器进⾏时间同步,否则会提示 no server suitable for
synchronization found 错误。
//客户端安装ntpdate命令进⾏同步(第⼀种⽅式)
[root@wing strace]# yum install ntpdate -y
[root@wing strace]# ntpdate -u 192.168.9.12
5 Jun 16:51:27 ntpdate[3873]: adjust time server 10.1.106.70 offset -0.000030 sec
//将同步命令写⼊计划任务。
[root@wing strace]# crontab -e
*/5 * * * * /usr/sbin/ntpdate -u 10.1.106.70 &>/dev/null
chrony同步
客户端安装 chrony 服务同步内⽹时间服务器(第⼆种⽅式)
//环境准备
systemctl stop firewalld
setenforce 0
//安装时间同步 yum install chrony -y
timedatectl set-ntp true
//配置时间同步服务器
vim /etc/chrony.conf
指定内部时间服务器地址
server 192.168.69.112 iburst
//启动chrony服务
systemctl enable chronyd
systemctl start chronyd
//客户端同步验证
chronyc sources
应⽤场景
- 监控服务器
- 数据库服务器
- 集群服务器
- ⾦融系统
- 航空航天系统
(2)ssh远程管理 - SSH 远程服务主要功能
提供远程连接服务器的服务
对传输的数据进⾏加密
2.远程连接⽅式有哪些
ssh 属于密⽂连接⽅式 监听在本地 22/tcp 端⼝
telnet 属于明⽂连接⽅式 监听在本地 23/tcp 端⼝
3.ssh远程连接不上,具体排查思路
测试服务端⼝有没有开启
telnet 192.168.9.12 22
nmap -p 5522 192.168.9.12
nc 192.168.9.12 22
模拟⽹络异常
iptables -I INPUT -s 192.168.9.12 -j DROP
模拟禁⽌root 和 密码登陆
echo "Wing@123" | passwd --stdin root
ssh -p5522 root@192.168.9.12
检查服务端⼝是否存在
ss -lntup|grep 22
netstat -lntup
分析检查ssh⽇志
tailf /var/log/secure
检查防⽕墙策略 iptables firewalld selinux 关闭
清理⽹络策略
iptables -F
分析连接过程
ssh -vvv root@192.168.9.12
4.SSH相关命令
ssh客户端包含ssh以及像scp(远程拷⻉)、slogin(远程登陆)、sftp(安全FTP⽂件传输)等应⽤程序。
openssh 软件分析(与数据加密相关的软件--openssl)
yum provides which ssh
rpm -ql openssh-server
/etc/ssh/sshd_config --- ssh服务配置⽂件
/usr/sbin/sshd --- ssh服务进程启动命令
[root@backup ~]# rpm -ql openssh-clients
/usr/bin/scp --- 远程拷⻉命令
/usr/bin/sftp --- 远程⽂件传输命令
/usr/bin/slogin --- 远程登录命令
/usr/bin/ssh --- 远程连接登录命令
/usr/bin/ssh-copy-id --- 远程分发公钥命令
ssh 远程登录服务器命令
ssh -p22 root@192.168.9.12[命令]
scp 复制数据⾄远程主机命令(全量复制)
推:PUSH,上传
scp -P22 -rp /tmp/demo/wing root@192.168.9.12:/tmp
拉:PULL,下载
scp -P22 -rp root@192.168.9.12:/tmp/wing /tmp/demo/
结论:
1.scp通过加密进⾏远程拷⻉⽂件或⽬录的命令。
2.scp拷⻉权限为连接的⽤户对应的权限。
3.scp⽀持数据的推送和拉取,但每次都是全量拷⻉,效率低下。
Sftp 远程数据传输命令
连接远程sftp
sftp -P22 root@192.168.9.12
sftp -P22 -oPort=52113 root@192.168.9.12<-sftp的特殊端⼝连接
下载⽂件, ⾄于本地服务器
sftp> get /tmp/wing /tmp/demo/
上传本地服务器⽂件, ⾄远程服务器
sftp> put /tmp/demo/wing /root/
5.SSH连接⽅式
1.基于账户密码远程登录
ssh -p5522 root@192.168.9.12
2.基于秘钥远程登录
1.在管理服务器上⽣成密钥,-t密钥类型, -C指定⽤户邮箱
ssh-keygen -t rsa -C wing@qq.com
2.将 A 服务器上的公钥推送⾄ B 服务器
ssh-copy-id -p5522 -i ~/.ssh/id_rsa.pub root@10.1.106.66
-i //指定下发公钥的路径 //秘钥分发, [会将A服务器的公钥写⼊B服务器~/.ssh/authorized_keys⽂件中]
[user@] //以什么⽤户身份进⾏公钥分发(root),如果不输⼊,表示以当前系统⽤户身份分发公钥
machine //下发公钥⾄那台服务器, 填写远程主机IP地址
3. A 服务器通过密钥⽅式连接 B 服务器
//远程登录对端主机⽅式
ssh -p5522 root@10.1.106.66
//不登陆远程主机执⾏命令
ssh -p5522 root@10.1.106.66 "hostname -I"
10.1.106.66 172.19.0.1 172.18.0.1 172.17.0.1 172.20.240.0
//可能遇到错误
1.no route to host 防⽕墙
2.Connection refused 防⽕墙或服务未启⽤
实战案例1 SSH服务密钥分发实战
1.密钥批量分发
//命令示例: ssh-copy-id [-i [identity_file]] [user@]machine
ssh-copy-id //命令
-i //指定下发公钥的路径
[user@] //以什么⽤户身份进⾏公钥分发(root),如果不输⼊,表示以当前系统⽤户身份分发公钥
machine //下发公钥⾄那台服务器, 填写远程主机IP地址
//秘钥分发, [会将A服务器的公钥写⼊B服务器~/.ssh/authorized_keys⽂件中]
[root@m01 ~]# ssh-copy-id -p5522 -i ~/.ssh/id_rsa.pub root@10.1.106.66
//远程登录对端主机⽅式
[root@m01 ~]# ssh -p5522 root@10.1.106.66
//不登陆远程主机执⾏命令
[root@m01]# ssh -p5522 root@10.1.106.66 "hostname -I"
10.1.106.66 172.19.0.1 172.18.0.1 172.17.0.1 172.20.240.0
//可能遇到错误
1.no route to host 防⽕墙
2.Connection refused 防⽕墙或服务未启⽤
1.添加普通⽤户账号
//部署密钥之前,先分别在A、B、C服务器上添加普通⽤户并配置密码
useradd wing
echo "Wing@123" | passwd --stdin wing
如下操作均在A-Server服务器上操作:
//2.A服务器切换普通⽤户并⽣成密钥
[root@A_Server ~]# su - wing
-C参数在公钥⽂件的末尾添加注释 "192.168.9.12",以标识该密钥对所属的主机。
[wing@A_Server ~]$ ssh-keygen -t rsa -C 192.168.9.12
//3.A服务器分发秘钥⾄B服务器, SSH不是默认端⼝, 使⽤-P指定对应端⼝
[wing@A_Server ~]$ ssh-copy-id -p5522 -i $HOME/.ssh/id_rsa.pub wing@10.1.106.66
//4.通过A服务器登陆⾄B服务器测试
[wing@A_Server ~]$ ssh -p5522 wing@10.1.106.66
//5.分发A服务器秘钥⾄C服务器
[wing@A_Server ~]$ ssh-copy-id -p5522 -i $HOME/.ssh/id_rsa.pub wing@10.1.106.67
//6.通过A服务器登陆⾄C服务器测试
[wing@A_Server ~]$ ssh -p5522 wing@10.1.106.67
2.批量执⾏命令及⽂件分发
批量分发密钥
[wing@lb-node1 ~]# cat ssh_copy_id.sh
!/bin/bash
设置需要分发密钥的服务器列表
SERVERS=(192.168.9.12 10.1.106.66 10.1.106.67 )
设置密钥和密码
KEY_FILE="$HOME/.ssh/id_rsa.pub"
PASSWORD="Wing@123"
循环遍历服务器列表
for SERVER in "${SERVERS[@]}"
do
使⽤ expect ⾃动输⼊密码
expect -c "
spawn ssh-copy-id -p5522 -i $KEY_FILE $USER@$SERVER
expect {
"*assword" { send "$PASSWORD\r"; exp_continue }
"yes/no" { send "yes\r"; exp_continue }
eof
}
"
done
服务器信息写到⽂件
批量执⾏命令脚本⽂件
[wing@lb-node1 ~]# cat ssh_command.sh
!/bin/bash
if [ $# -ne 1 ];then
echo "USAGE $0: {Please Command}"
exit 1
fi
Command="$1"
IP="10.1.106"
User=wing
Port=5522
for i in 66 67
do
echo "##Server IS $IP."$i"###"
/usr/bin/ssh $User@$IP."$i" -p"$Port" "$Command"
done
[wing@lb-node1 ~]$ sh ssh_command.sh hostname
Server IS 10.1.106.66###
lb-node2
Server IS 10.1.106.67###
179-110
批量分发⽂件脚本
[root@A_Server ~]# cat ssh_file.sh
!/bin/bash
if [ $# -ne 2 ];then
echo "USAGE $0: {LocalFile|RemoteFile}"
exit 1
fi
File1="$1"
DirFile="$2"
IP="10.1.106"
User=wing
Port=5522
for i in 66 67
do
echo "##Server IS $IP."$i"###"
/usr/bin/scp -rp -P$Port $File1 $User@$IP."$i":"$DirFile"
/usr/bin/ssh $User@$IP."$i" -p"$Port" "$Command"
done
6.SSH访问控制
SSH远程服务访问控制⼿段
1.更改SSH服务远程登录端⼝
2.更改SSH服务监听本地内⽹IP
3.更改SSH服务禁⽌密码登录
4.更改SSH服务禁⽌ROOT管理员登录
5.更改SSH服务密码登录认证为密钥登录
6.重要服务器尽可能不使⽤公⽹IP地址
7.使⽤防⽕墙限制来源IP地址(堡垒机/安全组限制 只有公司公⽹出⼝ip可以连接)
1.SSH服务登录防护⼿段配置⽂件 /etc/ssh/sshd_config
//1.更改SSH远程连接端⼝
Port 6666
//2.绑定本地内⽹地址
ListenAddress 192.168.9.12
//3.禁⽌Root管理员登录
PermitRootLogin no
//4.禁⽌密码登录
PasswordAuthentication no
//允许以root密钥⽅式登陆(禁⽌密码默认以root登陆)
//PermitRootLogin without-password
//5.禁⽌使⽤空密码(默认禁⽌)
PermitEmptyPasswords no
//6.关闭DNS解析,优化连接速度
UseDNS no
GSSAPIAuthentication no
添加如下配置⾄sshd配置⽂件/etc/ssh/sshd_config, 根据需求做调整
SSH###
Port 6666
ListenAddress 192.168.9.12
PasswordAuthentication no
PermitRootLogin no
PermitEmptyPasswords no
GSSAPIAuthentication no
UseDNS no
END###
7.SSH破解防护
fail2ban 可以监控系统⽇志,并且根据⼀定规则匹配异常IP后使⽤ Firewalld 将其屏蔽,尤其是针对⼀些爆破/
扫描等⾮常有效。
1.开启 Firewalld 防⽕墙
systemctl start firewalld
systemctl enable firewalld
systemctl status firewalld
firewall-cmd --state
2.修改 firewalld 规则,启⽤ Firewalld 后会禁⽌⼀些服务的传输,但默认会放⾏常⽤的22端⼝, 如果想添加更
多,以下是放⾏SSH端⼝(22)示例,供参考:
放⾏SSHD服务端⼝
firewall-cmd --permanent --add-service=ssh --add-service=http
重载配置
firewall-cmd --reload
查看已放⾏端⼝
firewall-cmd --list-service
3.安装 fail2ban ,需要有 epel
yum install fail2ban fail2ban-firewalld mailx -y --nogpgcheck
4.配置 fail2ban 规则 .local 会覆盖 .conf ⽂件
at /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s
[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
logpath = /var/log/secure
[root@wing fail2ban]# cat /etc/fail2ban/jail.local
[DEFAULT]
忽略的IP地址或IP地址段,这些地址不会被禁⽌访问。127.0.0.1/8表示忽略本地IP地址。
ignoreip = 127.0.0.1/8
禁⽌访问的时间,以秒为单位。禁⽌访问的时间为86400秒,即24⼩时。
bantime = 86400
在这个时间段内,如果有超过maxretry次的登录失败尝试,就会触发禁⽌访问。findtime为600秒,即10分钟。
findtime = 600
在findtime时间段内,如果有超过maxretry次的登录失败尝试,就会触发禁⽌访问。maxretry为5次。
maxretry = 5
禁⽌访问时采取的动作。采取的动作是使⽤firewallcmd-ipset命令将IP地址添加到防⽕墙的IP集合中。
banaction = firewallcmd-ipset
在禁⽌访问时采取的其他动作。采取的动作是发送电⼦邮件通知管理员。
action = %(action_mwl)s
针对sshd服务的配置。
[sshd]
启⽤该服务的Fail2Ban防护。
enabled = true
⽤于匹配⽇志中的内容,以便Fail2Ban可以识别登录失败尝试。在这个例⼦中,使⽤名为sshd的过滤器。
filter = sshd
⽤于匹配⽇志中的内容,以便Fail2Ban可以识别登录失败尝试。在这个例⼦中,使⽤名为sshd的过滤器。
port = 22
action = %(action_mwl)s
⽇志⽂件的路径。在这个例⼦中,使⽤/var/log/secure⽂件。
logpath = /var/log/secure
5.启动服务,并检查状态
systemctl start fail2ban.service
fail2ban-client status sshd
fail2ban-client set sshd unbanip 192.168.9.1
3.NFS网络文件系统
主要功能是通过局域⽹络让不同的主机系统之间可以共享⽂件或⽬录。
NFS⽤于企业集群架构中, 如果是⼤型⽹站, 会⽤到更复杂的分布式⽂件系统 HDFS,Ceph,miniio
为什么要使⽤ NFS 服务进⾏数据存储
1.实现多台服务器之间数据共享
2.实现多台服务器之间数据的⼀致
NFS服务安装
注意: 不要忘记关闭防⽕墙, 以免默认的防⽕墙策略禁⽌正常的 NFS 共享服务
1.//关闭Firewalld防⽕墙
systemctl disable firewalld
systemctl stop firewalld
//关闭selinux防⽕墙
sed -ri '#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config
setenforce 0
2.安装 NFS-Server
yum -y install nfs-utils rpcbind
3. NFS 服务程序的配置⽂件为 /etc/exports 默认⾥⾯没有任何内容。
如果想要把 /data ⽬录共享给 10.1.106.0/24 ⽹段内的所有主机
1.主机都拥有读写权限
2.在将数据写⼊到NFS服务器的硬盘中后才会结束操作,最⼤限度保证数据不丢失
3.将所有⽤户映射为本地的匿名⽤户(nfsnobody)
//注意: NFS客户端地址与权限之间没有空格
/data是共享⽬录的路径,10.1.106.0/24是允许访问该共享⽬录的 IP 地址范围。rw表示该共享⽬录可读可写,
sync表示同步写⼊,all_squash表示将所有⽤户映射为匿名⽤户。
vim /etc/exports
/data 10.1.106.0/24(rw,sync,all_squash)
//在NFS服务器上建⽴⽤于NFS⽂件共享的⽬录,并设置对应权限
[root@nfs-server ~]# mkdir /data
[root@nfs-server ~]# chown -R nfsnobody.nfsnobody /data
//NFS共享⽬录会记录⾄/var/lib/nfs/etab,如果该⽬录不存在共享信息,请检查/etc/exports是否配置错误
4.在使⽤ NFS 服务进⾏⽂件共享之前,需要使⽤ RPC(Remote Procedure Call 远程过程调⽤, 服务将 NFS 服务器
的 IP 地址和端⼝号信息发送给客户端。
因此,在启动 NFS 服务之前,需要先重启并启⽤ rpcbind 服务程序,同时都加⼊开机⾃启动
systemctl restart rpcbind
systemctl restart nfs-server
systemctl enable rpcbind
systemctl enable nfs-server
5.NFS挂载卸载
NFS客户端的配置步骤也⼗分简单。先使⽤ showmount 命令,查询 NFS 服务器的远程共享信息,其输出格式为“共享
的⽬录名称 允许使⽤客户端地址”。
1.安装客户端⼯具,仅启动 rpcbind 服务
yum -y install nfs-utils rpcbind
systemctl restart rpcbind
systemctl enable rpcbind
2.客户端使⽤ showmount -e 查看远程服务器 rpc 提供的可挂载 nfs 信息
showmount -e 10.1.106.66
3.在 NFS 客户端创建⼀个挂载⽬录, 使⽤ mount 命令并结合 -t 参数, 指定要挂载的⽂件系统的类型, 并在命令后⾯写
上服务器的 IP 地址, 以及服务器上的共享⽬录, 最后需要写上要挂载到本地系统(客户端)的⽬录。
[root@nfs-client ~]# mkdir /nfsdir
[root@nfs-client ~]# mount -t nfs 10.1.106.66:/data /nfsdir
//查看挂载信息(mount也可以查看)
[root@nfs-client ~]# df –h
4.挂载成功后可以进⾏增删改操作
//使⽤客户端往nfs存储写⼊
[root@nfs-client ~]# echo "nfs-client" >> /nfsdir/test.txt
//检查nfs服务端是否存在客户端创建的新⽂件
[root@nfs-client ~]# cat /data/test.txt
nfs-client
5.如果希望 NFS ⽂件共享服务能⼀直有效,则需要将其写⼊到 fstab ⽂件中
[root@nfs-client ~]# vim /etc/fstab
10.1.106.66:/data /nfsdir nfs defaults 0 0
6.如果不希望使⽤ NFS 共享, 可进⾏卸载
umount /nfsdir
注意:卸载的时候如果提示”umount.nfs: /nfsdir: device is busy”
1.切换⾄其他⽬录, 然后在进⾏卸载。
2.NFS Server宕机, 强制卸载umount -lf /nfsdir
7.在企业⼯作场景,通常情况NFS服务器共享的只是普通静态数据(图⽚、附件、视频),不需要执⾏ suid、
exec 等权限,挂载的这个⽂件系统只能作为数据存取之⽤,⽆法执⾏程序,对于客户端来讲增加了安全性。
通过mount -o指定挂载参数,禁⽌使⽤suid,exec,增加安全性能
[root@nfs-client ~]# mount -t nfs -o nosuid,noexec,nodev 10.1.106.66:/data /mnt
8.有时也需要考虑性能相关参数[可选]
通过mount -o指定挂载参数,禁⽌更新⽬录及⽂件时间戳挂载
[root@nfs-client ~]# mount -t nfs -o noatime,nodiratime 10.1.106.66:/data /mnt
NFS存储⼩结
NFS存储优点
1.NFS⽂件系统简单易⽤、⽅便部署、数据可靠、服务稳定、满⾜中⼩企业需求。
2.NFS⽂件系统内存放的数据都在⽂件系统之上,所有数据都是能看得⻅。
NFS存储局限
1.存在单点故障, 如果构建⾼可⽤维护麻烦。
2.NFS数据明⽂, 并不对数据做任何校验。
3.客户端挂载⽆需账户密码, 安全性⼀般(内⽹使⽤)
⽣产应⽤建议
1.⽣产场景应将静态数据尽可能往前端推, 减少后端存储压⼒
2.必须将存储⾥的静态资源通过CDN缓存(jpg\png\mp4\avi\css\js)
3.如果没有缓存或架构本身历史遗留问题太⼤, 在多存储也⽆⽤
AutoFS⾃动挂载
autofs⾃动挂载服务, 有两种挂载⽅式:
直接:direct /- ⼦配置⽂件必须写本地绝对路径
间接: indirect /path ⼦配置⽂件写相对于/path的⼦⽬录
1.客户端安装 autofs ⾃动挂载
[root@nfs-client ~]# yum install autofs -y
[root@nfs-client ~]# systemctl enable autofs
[root@nfs-client ~]# systemctl start autofs
2.不要将设备挂载信息都写⼊到 autofs 服务的主配置 /etc/auto.master ⽂件中,会让主配置⽂件臃肿不堪,不利
于服务执⾏效率,也不利于⽇后修改⾥⾯的配置内容
//可以将⽂件写⼊/etc/auto.master.d⽬录下, 该⽬录已被主配置⽂件包含
[root@http-server ~]# grep "dir" /etc/auto.master
+dir:/etc/auto.master.d
3.直接挂载⽅式: 本地的挂载点是绝对路径
//名称后缀必须是autofs,/-代表这是⼀个直接挂载定义,根据/etc/auto.nfs_direct进⾏挂载
[root@nfs-client ~]# vim /etc/auto.master.d/nfs.autofs
/- /etc/auto.nfs_direct
//⼦配置⽂件中,照“挂载⽬录 挂载⽂件类型及权限 :设备名称”的格式进⾏填写。
[root@nfs-client ~]# vim /etc/auto.nfs_direct
/nfsdir -fstype=nfs,rw,sync,soft,nosuid,nodev 10.1.106.66:/data
//重启autofs服务
[root@nfs-client ~]# systemctl restart autofs
间接挂载: 本地路径和服务端的路径都没有直接写绝对路径
//名称后缀必须是autofs,访问本地对应⽬录⾃动远端nfs
[root@nfs-client ~]# vim /etc/auto.master.d/nfs.autofs
/- /etc/auto.nfs_direct
/nfsdir /etc/auth.nfs_share
[root@nfs-client ~]# vim /etc/auth.nfs_share
- -rw,sync,soft,nosuid,nodev,'sec=krb5p' 10.1.106.70:/data/
//重启autofs服务
[root@nfs-client ~]# systemctl restart autofs
注意:如果有 kerberos 验证则需要启动 nfs-secure 并加⼊开机⾃启动
使⽤ df 命令⽆法查看具体挂载内容, 使⽤ mount 命令可以
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!