「深度学习福利」大神带你进阶工程师,立即查看>>>
下载基础镜像
测试:
用ubuntu镜像输出hello world 如果没有ubuntu镜像,docker会默认给下载个最新的ubuntu镜像
docker run ubuntu echo 'hello world'
以交互式运行 docker run -i -t ubuntu /bin/bash # -i --interactive=ture|false 默认是false 始终打开标准输入 -t --tty=true|false 默认是false 为docker分配个伪tty终端
这样新创建的容器才能提供个交互式的shell
在ubuntu容器中就和在ubuntu服务器一样 执行ps -ef 测试 exit退出 docker attach 容器id能进去容器 ctrl+q+p能退出后台执行容器
添加各种依赖 添加ppa仓库 这个是OpenJDK 8 ppa仓库。 add-apt-repository ppa:openjdk-r/ppa 更新ubuntu的下载指令 apt-get update 安装openjdk8 apt-get install openjdk-8-jdk 安装curl apt install curl 安装vim apt-get install -y vim 安装sz rz apt-get install lrzsz 安装net指令库 apt install net-tools 解决:用ifconfig查看 安装zip unzip apt-get install unzip apt-get install zip
对于已经建立的docker容器,需要新增容器对主机的端口映射,主要分为三种:
通过修改配置文件修改docker容器端口映射 使用docker ps -a命令找到要修改容器的CONTAINER ID 运行以下命令,进入该容器目录
docker inspect【CONTAINER ID】| grep Id
cd /var/lib/docker/containers 停止容器
docker stop [容器id] 停止主机docker服务 systemctl stop docker 进入2得到的文件夹内,修改hostconfig.json 和 config.v2.json
vi hostconfig.json 比如新增一个 80 端口,在PortBindings下边添加以下内容,端口配置之间用英文字符逗号隔开 "80/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "80" } ] 接着修改vi config.v2.json, 找到ExposedPorts和Ports 仿照之前内容添加端口映射 "ExposedPorts": { "2000/tcp": {} }, "Ports":{ "2000/tcp":[ { "HostIp": "0.0.0.0", "HostPort": "2000" } ] }, 保存之后重启docker服务和容器 systemctl start docker docker start [docker id]
把运行中的容器生成新的镜像,再新建容器 提交一个运行中的容器为镜像
docker commit [containerid] [new_imagename] 运行新建的镜像并添加端口映射(宿主机8000映射到docker的8080)
docker run --name newcontainername -d -p 8000:8080 [imagename] /bin/sh
修改主机iptables端口映射
docker的端口映射并不是在docker技术中实现的,而是通过宿主机的iptables来实现。通过控制网桥来做端口映射,类似路由器中设置路由端口映射。
如果我们有一个容器的8000端口映射到主机的9000端口,先查看iptabes设置了什么规则: sudo iptables -t nat -vnL
结果中有一条: Chain DOCKER (2 references) pkts bytes target prot opt in out source destination 98 5872 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0 237 14316 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9000 to:172.17.0.3:8000
我们可以看到docker创建了一个名为DOKCER的自定义的链条Chain。而我开放8000端口的容器的ip是172.17.0.3。
也可以通过inspect命令查看容器ip docker inspect [containerId] |grep IPAddress
我们想再增加一个端口映射,比如8081->81,就在这个链条是再加一条规则: sudo iptables -t nat -A DOCKER -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.3:81
加错了或者想修改:先显示行号查看 sudo iptables -t nat -vnL DOCKER --line-number
删除规则3 sudo iptables -t nat -D DOCKER 3
容器常用命令
停止容器 docker stop 容器名称或id
启动容器 docker start 容器名称或id
使用之前构建的容器修改映射端口重新构建镜像和容器
例子:(第一种尝试不成功第二种成功)
docker ps可以查看运行的容器 加-a可以看已停止的容器
以运行的容器id 1f65f1ecc62d 构建新镜像image1 docker commit 1f65f1ecc62d image1
以image1镜像构建运行的容器tommao docker run --name tommao -p 8089:8080 -i -t image1 /bin/bash
进入运行的容器 docker attach tommao
启动java项目 nohup java -jar demo-0.0.1-SNAPSHOT.jar >/dev/null & Ctrl+q+p退出后台运行容器 启动后按回车别按ctrl +c那是终止命令
「深度学习福利」大神带你进阶工程师,立即查看>>>
1. 响应时间(RT)
响应时间是指系统对请求作出响应的时间。直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间。由于一个系统通常会提供许多功能,而不同功能的处理逻辑也千差万别,因而不同功能的响应时间也不尽相同,甚至同一功能在不同输入数据的情况下响应时间也不相同。所以,在讨论一个系统的响应时间时,人们通常是指该系统所有功能的平均时间或者所有功能的最大响应时间。当然,往往也需要对每个或每组功能讨论其平均响应时间和最大响应时间。
对于单机的没有并发操作的应用系统而言,人们普遍认为响应时间是一个合理且准确的性能指标。需要指出的是,响应时间的绝对值并不能直接反映软件的性能的高低,软件性能的高低实际上取决于用户对该响应时间的接受程度。对于一个游戏软件来说,响应时间小于100毫秒应该是不错的,响应时间在1秒左右可能属于勉强可以接受,如果响应时间达到3秒就完全难以接受了。而对于编译系统来说,完整编译一个较大规模软件的源代码可能需要几十分钟甚至更长时间,但这些响应时间对于用户来说都是可以接受的。
2. 吞吐量(Throughput)
吞吐量是指系统在单位时间内处理请求的数量。对于无并发的应用系统而言,吞吐量与响应时间成严格的反比关系,实际上此时吞吐量就是响应时间的倒数。前面已经说过,对于单用户的系统,响应时间(或者系统响应时间和应用延迟时间)可以很好地度量系统的性能,但对于并发系统,通常需要用吞吐量作为性能指标。
对于一个多用户的系统,如果只有一个用户使用时系统的平均响应时间是t,当有你n个用户使用时,每个用户看到的响应时间通常并不是n×t,而往往比n×t小很多(当然,在某些特殊情况下也可能比n×t大,甚至大很多)。这是因为处理每个请求需要用到很多资源,由于每个请求的处理过程中有许多不走难以并发执行,这导致在具体的一个时间点,所占资源往往并不多。也就是说在处理单个请求时,在每个时间点都可能有许多资源被闲置,当处理多个请求时,如果资源配置合理,每个用户看到的平均响应时间并不随用户数的增加而线性增加。实际上,不同系统的平均响应时间随用户数增加而增长的速度也不大相同,这也是采用吞吐量来度量并发系统的性能的主要原因。一般而言,吞吐量是一个比较通用的指标,两个具有不同用户数和用户使用模式的系统,如果其最大吞吐量基本一致,则可以判断两个系统的处理能力基本一致。
3. 并发用户数
并发用户数是指系统可以同时承载的正常使用系统功能的用户的数量。与吞吐量相比,并发用户数是一个更直观但也更笼统的性能指标。实际上,并发用户数是一个非常不准确的指标,因为用户不同的使用模式会导致不同用户在单位时间发出不同数量的请求。一网站系统为例,假设用户只有注册后才能使用,但注册用户并不是每时每刻都在使用该网站,因此具体一个时刻只有部分注册用户同时在线,在线用户就在浏览网站时会花很多时间阅读网站上的信息,因而具体一个时刻只有部分在线用户同时向系统发出请求。这样,对于网站系统我们会有三个关于用户数的统计数字:注册用户数、在线用户数和同时发请求用户数。由于注册用户可能长时间不登陆网站,使用注册用户数作为性能指标会造成很大的误差。而在线用户数和同事发请求用户数都可以作为性能指标。相比而言,以在线用户作为性能指标更直观些,而以同时发请求用户数作为性能指标更准确些。
4. QPS每秒查询率(Query Per Second)
每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。 (看来是类似于TPS,只是应用于特定场景的吞吐量). Qps 基本类似于 Tps,但是不同的是,对于一个页面的一次访问,形成一个 Tps;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“Qps”之中。
例如,访问一个 Index 页面会请求服务器 3 次,包括一次 html,一次 css,一次 js,那么访问这一个页面就会产生一个“T”,产生三个“Q”。
5. PV(page view) 即页面浏览量,通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。用户每一次对网站中的每个页面访问均被记录 1 次。用户对同一页面的多次刷新,访问量累计。根据这个特性,刷网站的 PV 就很好刷了。与 PV 相关的还有 RV,即重复访问者数量(repeat visitors)。
6. UV 访问数(Unique Visitor) 指独立访客访问数,统计 1 天内访问某站点的用户数(以 cookie 为依据),一台电脑终端为一个访客。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的 cookies 实现的。如果更换了 IP 后但不清除 cookies,再访问相同网站,该网站的统计中 UV 数是不变的。如果用户不保存 cookies 访问、清除了 cookies 或者更换设备访问,计数会加 1。00:00-24:00 内相同的客户端多次访问只计为 1 个访客。根据这个特性,如果有人让你刷 UV,也很好的刷!
7. IP(Internet Protocol) 独立 IP 数,是指 1 天内多少个独立的 IP 浏览了页面,即统计不同的 IP 浏览用户数量。同一 IP 不管访问了几个页面,独立 IP 数均为 1;不同的 IP 浏览页面,计数会加 1。IP 是基于用户广域网 IP 地址来区分不同的访问者的,所以,多个用户(多个局域网 IP)在同一个路由器(同一个广域网 IP)内上网,可能被记录为一个独立 IP 访问者。如果用户不断更换 IP,则有可能被多次统计。
8. GVM: 所谓的 GMV,是 Gross Merchandise Volume 的简称。只要是订单,不管消费者是否付款、卖家是否发货、是否退货,都可放进 GMV 这个“大箩筐”里。电商是很在意 GMV 的,拼多多的优惠券事故,估计就能产生不少 GMV。根据 GMV 的统计方法,如果有人让你帮忙刷 GMV,你就可以一直下单,然后一直退款。
QPS 计算规则:
原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间。
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS) 。
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器 。
假设每天500w PV 的在单台机器上,这台机器需要多少QPS?
( 5000000 * 0.8 ) / (86400 * 0.2 ) = 232 (QPS)。
一般需要达到232QPS,因为是峰值。
如果一台机器的QPS是60,需要几台机器来支持? 232 / 80 = 2.9 = 3
聚合报告各项性能指标
接口性能测试指标一般通过标准:
「深度学习福利」大神带你进阶工程师,立即查看>>>
先来说说序列化是什么吧,序列化是将对象的状态信息转换成可以存储或传输的形式的过程。在序列化期间,将对象的当前状态写入临时或永久存储区。稍后,您可以通过从存储区读取或恢复对象的状态重新创建对象。简而言之,序列化是一种将一对象转换为一个字符串的方法,该字符串可以以特定格式在进程之间跨平台传输。
php的反序列化漏洞,php的盲点,也是一个常见的漏洞,这种漏洞充满了一些场景,虽然有些很难调用,但是成功的后果很危险。漏洞形成的根本原因是没有序列识别程序,从而导致序列字符串的检测。反序列化漏洞不仅仅存在于php中,而且还存在于java、python中。基本上是一样的原理。在java反序列化中,调用反序列化的readobject方法isalized,并在不编写readobject方法时引起漏洞。
因此,在开发过程中出现了共同的反序列化漏洞:可以绕过重写对象输入流对象的解析类方法中的检测。使用第三方类的黑名单控件。虽然java比php更加严格,但几乎不可能使用黑名单机制禁用大型应用程序中的所有危险对象。因此,如果在审计过程中发现使用黑名单过滤的代码,那么大多数代码都有一两条可以被利用的代码。而黑名单方法只能确保当前的安全性,如果稍后添加新的特性,可能会引入利用漏洞的新方法。因此黑名单不能保证序列化过程的安全性。事实上,大部分反序列化漏洞是由于使用不安全的基础库造成的。黑客gabriellawrence和chrisfrohoff于2015年发现的apachecommons集合库,直接影响到大型框架,如weblogic、websphere、jboss、jenkins、opennms。脆弱性的影响直到今天才得到解决,如果大家有无法解决的网站漏洞修复问题可以去看看网站安全公司那边,国内像Sinesafe,绿盟,启明星辰都是网站安全公司解决漏洞问题的。
「深度学习福利」大神带你进阶工程师,立即查看>>>
一.什么是命名实体识别
二.基于NLTK的命名实体识别
三.基于Stanford的NER
四.【实战案例】医学糖尿病数据命名实体识别
一 、什么是命名实体识别? 命名实体识别(Named Entity Recognition,简称NER),又称作“专名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。通常包括两部分: (1)实体边界识别; (2) 确定实体类别(人名、地名、机构名或其他)。 命名实体识别通常是知识挖掘、信息抽取的第一步,被广泛应用在自然语言处理领域。接下来,我们将介绍常用的两种命名实体识别的方法。
二 、基于NLTK的命名实体识别: NLTK:由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公开数据集、模型上提供了全面、易用的接口,涵盖了分词、词性标注(Part-Of-Speech tag, POS-tag)、命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项NLP领域的功能。 使用前需要先下载NLTK,安装完成后,在python环境下输入import nltk测试是否安装成功然后输入nltk.download()下载nltk所需要的数据包,完成安装。 Python代码实现(注意文件的编码格式为utf-8无BOM格式): -- coding: utf-8 -- import sys reload(sys) sys.setdefaultencoding(‘utf8’) #让cmd识别正确的编码 import nltk newfile = open(‘news.txt’) text = newfile.read() #读取文件 tokens = nltk.word_tokenize(text) #分词 tagged = nltk.pos_tag(tokens) #词性标注 entities = nltk.chunk.ne_chunk(tagged) #命名实体识别 a1=str(entities) #将文件转换为字符串 file_object = open(‘out.txt’, ‘w’) file_object.write(a1) #写入到文件中 file_object.close( ) print entities
具体的方法可参考NLTK官网介绍: http://www.nltk.org/ 输出的结果为: entities = nltk.chunk.ne_chunk(tagged) entities Tree(‘S’, [(‘At’, ‘IN’), (‘eight’, ‘CD’), (“o’clock”, ‘JJ’), (‘on’, ‘IN’), (‘Thursday’, ‘NNP’), (‘morning’, ‘NN’), Tree(‘PERSON’, [(‘Arthur’, ‘NNP’)]), (‘did’, ‘VBD’), (“n’t”, ‘RB’), (‘feel’, ‘VB’), (‘very’, ‘RB’), (‘good’, ‘JJ’), (‘.’, ‘.’)])
当然为了方便查看,我们可以以树结构的形式把结果绘制出来: from nltk.corpus import treebank t = treebank.parsed_sents(‘wsj_0001.mrg’)[0] t.draw()
三 、基于Stanford的NER: Stanford Named Entity Recognizer (NER)是斯坦福大学自然语言研究小组发布的成果之一。 Stanford NER 是一个Java实现的命名实体识别(以下简称NER))程序。NER将文本中的实体按类标记出来,例如人名,公司名,地区,基因和蛋白质的名字等。 NER基于一个训练而得的Model(模型可识别出 Time, Location, Organization, Person, Money, Percent, Date)七类属性,其用于训练的数据即大量人工标记好的文本,理论上用于训练的数据量越大,NER的识别效果就越好。 因为原始的NER是基于java实现的,所以在使用Python编程之前,要确保自己电脑上已经安装了jar1.8的环境(否则会报关于Socket的错误)。 然后我们使用Pyner使用python语言实现命名实体识别 安装Pyner:解压下载的Pyner,命令行中将工作目录切换到Pyner文件夹下, 输入命令 :python setup.py install 完成安装. 接下来,还需要下载StanfordNER工具包,然后在解压后的目录打开cmd命令窗体,执行, java -mx1000m -cp stanford-ner.jar edu.stanford.nlp.ie.NERServer -loadClassifier classifiers/english.muc.7class.distsim.crf.ser.gz -port 8080 -outputFormat inlineXML
直到结果为:Loading classifier from classifiers/english.muc.7class.distsim.crf.ser.gz … done [1.2 sec].
以上操作是因为斯坦福的命名实体识别是基于java的socket写的,所以必要保证有一个窗题与我们执行的命令通信。最后,我们终于可以使用python编程实现NER了: import ner import sys import nltk reload(sys) sys.setdefaultencoding(‘utf8’) newfile = open(‘news.txt’) text = newfile.read() tagger = ner.SocketNER(host=’localhost’, port=8080)#socket编程 result=tagger.get_entities(text) #stanford实现NER a1=str(result) file_object = open(‘outfile.txt’, ‘w’) file_object.write(a1) file_object.close( ) print result
四. 医学糖尿病数据命名实识别
目录如下: 1-数据与任务介绍 2- 整体模型架构 3-数据标签语料库处理 4-输入样本填充补齐 5-训练网络模型 6-医疗数据集(糖尿病)实体识别 更多文章和资料|点击下方文字直达 ↓↓↓ 阿里云K8s实战手册 [阿里云CDN排坑指南] CDN ECS运维指南 DevOps实践手册 Hadoop大数据实战手册 Knative云原生应用开发指南 OSS 运维实战手册
「深度学习福利」大神带你进阶工程师,立即查看>>>
同事一个SUSE Linux Enterprise Server 11 SP3环境配置ipv6地址失败,提示不支持IPv6,请求帮助,第一反应是应该ipv6相关内核模块没有加载。 |
---|
主要检查内容:
ipv6地址是否存在 ifconfig |grep inet6
没有默认inet6地址
ipv6模块是否存在 # modinfo -n ipv6 /lib/modules/3.0.101-0.47.90-default/kernel/net/ipv6/ipv6.ko # modinfo -n ipv6_lib /lib/modules/3.0.101-0.47.90-default/kernel/net/ipv6/ipv6_lib.ko
系统是否加载IPv6相关模块 lsmod |grep ipv6 # lsmod |grep ipv6 ipv6_lib 341467 0
只有ipv6_lib模块,没有主模块ipv6
从上面信息得知,ipv6模块是存在的,只是加载出现了问题,由此想到可能是配置导致的。
首先检查模块的依赖关系是否正确: # cat /lib/modules/`uname -r`/modules.dep |grep -w ipv6.ko: /lib/modules/3.0.101-0.47.90-default/kernel/net/ipv6/ipv6.ko: /lib/modules/3.0.101-0.47.90-default/kernel/net/ipv6/ipv6_lib.ko
没有问题
其次检查modprobe配置,是否屏蔽了ipv6模块加载: # cat /etc/modprobe.conf |grep -i ipv6 alias sit0 ipv6
最后检查了/etc/modprobe.d/目录下文件
发现一个50-ipv6.conf文件,内容如下: # cat /etc/modprobe.d/50-ipv6.conf install ipv6 /bin/true
这句话是什么含义呢?通过modprobe.conf(5)文档,有如下内容: install modulename command... This is the most powerful primitive: it tells modprobe to run your command instead of inserting the module in the kernel as normal. The command can be any shell command: this allows you to do any kind of complex processing you might wish. For example, if the module "fred" works better with the module "barney" already installed (but it doesn't depend on it, so modprobe won't automatically load it), you could say "install fred /sbin/modprobe barney; /sbin/modprobe --ignore-install fred", which would do what you wanted. Note the --ignore-install, which stops the second modprobe from running the same install command again. See also remove below. You can also use install to make up modules which don't otherwise exist. For example: "install probe-ethernet /sbin/modprobe e100 || /sbin/modprobe eepro100", which will first try to load the e100 driver, and if it fails, then the eepro100 driver when you do "modprobe probe-ethernet". If you use the string "$CMDLINE_OPTS" in the command, it will be replaced by any options specified on the modprobe command line. This can be useful because users expect "modprobe fred opt=1" to pass the "opt=1" arg to the module, even if there's an install command in the configuration file. So our above example becomes "install fred /sbin/modprobe barney; /sbin/modprobe --ignore-install fred $CMDLINE_OPTS"
比较长,关键的第一句我们来解释一下:
This is the most powerful primitive: it tells modprobe to run your command
instead of inserting the module in the kernel as normal.
这句话的意思是它让modprobe 命令 执行 命令 行里的command命令,而不是一般情况下去加载指定的内核模块。
该怎么理解这句话呢?我们通过两个命令的执行来说明: # modprobe -v -n ipv6 insmod /lib/modules/3.0.101-0.47.90-default/kernel/net/ipv6/ipv6_lib.ko install /bin/true
-n --dry-run --show 表明不做真正的插入模块的操作
-v: 打印有关程序所做事情的信息
所以上述输出表明modprobe只做了加载ipv6_lib.ko模块和install /bin/true的动作,
而没有做加载ipv6.ko模块 # modprobe --show-depends ipv6 insmod /lib/modules/3.0.101-0.47.90-default/kernel/net/ipv6/ipv6_lib.ko install /bin/true
--show-depends 只列出模块依赖关系,以insmod开头;
install命令也不做实际的加载操作,只列出要做的加载动作
从以上信息可以看出,也不会做ipv6.ko模块加载。
去掉/bin/true之后,重新执行modprobe ipv6命令后检查模块加载情况: # modprobe -v ipv6 # lsmod |grep ipv6 ipv6 12758 1 ipv6_lib 341467 71 ipv6 # ifconfig |grep inet6 inet6 addr: fe80::9af5:37ff:fe00:9527/64 Scope:Link inet6 addr: fe80::9af5:37ff:fee3:3ac4/64 Scope:Link inet6 addr: ::1/128 Scope:Host
综上,可以认为是50-ipv6.conf文件的配置导致了ipv6加载不完整。 本文地址: https://www.linuxprobe.com/linux-ipv6-failure.html
「深度学习福利」大神带你进阶工程师,立即查看>>>
nginx 503错误
最大可能是服务宕机, 可以尝试重启对应服务。
「深度学习福利」大神带你进阶工程师,立即查看>>>
rocketmq作为阿里的产品经过双十一的考验,后来交给Apache孵化,成为Apache项目,可见其强大的消息处理能力。
1、下载地址: http://rocketmq.apache.org/
2、传到服务器安装
创建安装目录:mkdir /rocketmq/
解压:unzip rocketmq-all-4.7.1-bin-release.zip
安装java环境: sudo yum install java-1.8.0-openjdk-devel
查看java安装目录:ls -lrt /etc/alternatives/java
lrwxrwxrwx. 1 root root 73 Aug 10 09:16 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre/bin/java
java_home目录为:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
配置java环境变量:vim /etc/profile
添加信息:JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
环境变量生效:source /etc/profile
查看java环境:[root@centos701 rocketmq]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
3、启动:进入安装目录:cd /rocketmq/rocketmq-all-4.7.1-bin-release/bin
启动参数调整:
vim runbroker.sh
vim runserver.sh
我是使用的虚拟机所以调的小如下图示例,屏幕前的小伙伴根据自己情况修改。
启动成功如下:
./mqnamesrv
OpenJDK 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release
OpenJDK 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
The Name Server boot success. serializeType=JSON
[root@centos701 bin]# ./mqbroker -n localhost:9876
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
The broker[centos701, 172.17.0.1:10911] boot success. serializeType=JSON and name server is localhost:9876
到现在恭喜,你已经安装rocketmq成功了!棒棒喔! 接下来内容更精彩,请屏幕的小黑马及时关注喔!
「深度学习福利」大神带你进阶工程师,立即查看>>>
需求
手头多余了一块闲置的 SSD,可以把用了4年的笔记本的机械硬盘替换升级。笔记本装的是 Linux 系统,选择手动迁移分区。
成功之路 原始磁盘是 MBR 的 UEFI 引导,根目录是 ext4 分区, efi 分区是 vfat。 迁移后的磁盘是 GPT 的 UEFI 引导盘,根目录是 xfs 分区, efi 分区是 vfat, boot 分区是 vfat (fat32)。 进入 live-cd ,建立好 SSD 上的分区后,通过 rsync 完成数据迁移。 挂载好三个分区,确认位置层次正确后,通过 manjaro-chroot 进入 SSD 上的系统。 修改 /etc/fstab 使其指向正确的物理位置,(使用 UUID 代替设备路径,通过 blkid 查看 UUID) 更新 efi , grub-install --target=x86_64-efi --efi-directory=/boot/efi 更新 grub, grub-update 最后,更换物理磁盘,启动系统。
踩坑
分区格式支持
新磁盘采用了 XFS 分区,在数据转移前在系统上安装好 XFS 格式支持包,否则转移好会无法启动系统。
gpt 启动盘分区要求
gpt 如果需要制作成引导盘,必须要一个 8mb 左右未格式化的分区,标记 bios-grub ,作为 efi 分区。
boot 分区不是必须的,我这里单独分出来并没有什么显著作用,徒增操作步骤。boot 分区可以是 fat32 , ext2 等,这里只测试了 fat32
复制数据需要保持权限
rsync -avP source target
EFI 分区更新
live-cd 需要从 uefi 启动才能更新 efi 分区,我原来使用的是 WinSetupFromUSB 制作的多合一启动盘,只有 win 系统是 uefi 启动的,后面单独找了一个 U盘 ,dd 了一个 manjaro iso, 才从 uefi 启动。[ 1 ]
启动挂载 根目录,boot,efi 三个分区,使用 manjaro-chroot 就可以进入系统,使用 chroot 则还需要挂载 sys ,dev, run,proc 等分区,使用 mount -B 挂载
无法进入桌面
新系统无法进入桌面,开机后直接一长串 [FAILED] ,NetWork,UserManager 启动失败,后者 failed to start user manager for UID 120 gdm 启动失败,直接导致不能进入桌面。
这里可以通过 ctrl + alt + F[num] 进入 tty 界面操作,wifi 联网太麻烦,插上网线直接完成联网。 最先怀疑是程序出错,通过 pacman -Qnq|pacman -S - 完成所有程序的重装,还是没有解决。 接着开始仔细研究逐个排除问题,从 Systemd-Networkd, gdm 到 dbus ,发现是 dbus log 指出是权限出错,然而通过 chmod 改成 777 依然还是这个问题。 后面试着新建一个用户,登录的时候直接遇到 su: /bin/bash: Permission denied 。搜索一番,终于找到了罪魁祸首,发现根目录权限居然是750。[ 2 ],将根目录修改为 755 后,就能正常重启
「深度学习福利」大神带你进阶工程师,立即查看>>>
MySQL最新版本8.0.20正式发布。与之前8.0的系列版本一样,这次的发行版除了包含缺陷修复,也同样包括新功能。下面快速浏览一下。关键字:hash join、InnoDB双写缓冲、二进制日志事务压缩。 下载mysql8.0.20二进制安装包 环境:centos7 打开mysql官方下载链接 https://dev.mysql.com/downloads/mysql/ 然后选择操作系统为linux通用、结构是X86,64二进制安装包 将二进制安装包上传至Linux服务器
#下载相关依。 [15:12:04 root@a7 ~]#yum -y install make gcc-c++ cmake bison-devel ncurses-devel readline-devel libaio-devel perl libaio wget lrzsz vim libnuma* bzip2 xz
#关闭selinux [15:35:17 root@a7 ~]#sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config [15:35:51 root@a7 ~]#setenforce 0 setenforce: SELinux is disabled
#创建mysql用户并创建分组 [16:12:37 root@a7 ~]#groupadd mysql [16:12:50 root@a7 ~]#useradd -r -g mysql -s /bin/false mysql
#解压安装包 [16:14:21 root@a7 ~]#tar xf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz -C /usr/local/
#创建软连接并授权给root [16:16:09 root@a7 ~]#cd /usr/local/ [16:16:15 root@a7 local]#ln -s mysql-8.0.20-linux-glibc2.12-x86_64/ mysql [16:16:26 root@a7 local]#chown -R root.root /usr/local/mysql
#准备环境变量 [16:19:15 root@a7 local]#echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh [16:19:31 root@a7 local]#. /etc/profile.d/mysql.sh
#生成数据库文件,并获取root密码 [16:21:25 root@a7 local]#cd mysql/bin/ [16:21:34 root@a7 bin]#mysqld --initialize --user=mysql --datadir=/data/mysql 2020-06-04T08:21:50.801657Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release. 2020-06-04T08:21:50.801741Z 0 [System] [MY-013169] [Server] /usr/local/mysql-8.0.20-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.20) initializing of server in progress as process 50807 2020-06-04T08:21:50.813829Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2020-06-04T08:21:51.535221Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2020-06-04T08:21:52.534587Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: wP+gq-PW<1an #密码为 root@localhost: wP+gq-PW<1an
#开启SSl [16:21:54 root@a7 bin]#mysql_ssl_rsa_setup -d /data/mysql/
#编写配置文件 [16:24:54 root@a7 bin]#vim /etc/my.cnf [mysqld] datadir=/data/mysql #只修改数据库存放目录 socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid # # include all files from the config directory # !includedir /etc/my.cnf.d
#修改启动服务脚本 [16:25:39 root@a7 bin]#cd /usr/local/mysql/support-files/ #进入support-files/目录 [16:35:23 root@a7 support-files]#vim mysql.server # 找到以下这项并修改为我们定义的数据存放目录,并保存退出 # If you change base dir, you must also change datadir. These may get # overwritten by settings in the MySQL configuration files. basedir= datadir=/data/mysql
#创建MySQL日志、socket文件 因为没有这两个文件mysql会启动不了
--创建日志文件 [16:46:07 root@a7 support-files]#mkdir /var/log/mariadb/ [16:48:04 root@a7 support-files]#touch /var/log/mariadb/mariadb.log [16:48:15 root@a7 support-files]#chown -R mysql.mysql /var/log/mariadb
--创建socket文件 [16:51:05 root@a7 support-files]#mkdir /var/lib/mysql [16:52:38 root@a7 support-files]#chmod 777 /var/lib/mysql/ #权限给777以便mysql用户的写入
--创建pid文件和创建sock软连接 [17:00:30 root@a7 support-files]#mkdir /var/run/mariadb [17:01:30 root@a7 support-files]#chown -R mysql.mysql /var/run/mariadb/ [16:57:17 root@a7 support-files]#ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
#添加服务启动脚本 [16:35:23 root@a7 support-files]#cp mysql.server /etc/init.d/mysqld [17:14:02 root@a7 support-files]#chkconfig --add mysqld #设置为开机启动 [17:14:07 root@a7 support-files]#chkconfig --list Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration. If you want to list systemd services use 'systemctl list-unit-files'. To see services enabled on particular target use 'systemctl list-dependencies [target]'. mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
#启动服务 [17:15:21 root@a7 support-files]#systemctl start mysqld [17:15:24 root@a7 support-files]#ss -ntl | grep 3306 LISTEN 0 70 [::]:33060 [::]:* LISTEN 0 128 [::]:3306 [::]:*
#修改密码 [17:15:43 root@a7 support-files]#mysqladmin -u root -p password 12345 Enter password: #这是输入刚才生成数据库文件,并获取的root密码 mysqladmin: [Warning] Using a password on the command line interface can be insecure. Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety. # 注意:12345 是你的新密码 # 这是输入刚才生成数据库文件,并获取的root密码 # 密码修改完成
#登录mysql服务 [17:19:41 root@a7 support-files]#mysql -uroot -p12345 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.20 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 更多文章和资料|点击下方文字直达 ↓↓↓ 阿里云K8s实战手册 [阿里云CDN排坑指南] CDN ECS运维指南 DevOps实践手册 Hadoop大数据实战手册 Knative云原生应用开发指南 OSS 运维实战手册
「深度学习福利」大神带你进阶工程师,立即查看>>>
对于 Linux 虚拟机,您可以从命令行手动安装 VMware Tools。对于 Linux 的较高发行版,请使用集成的 open-vm-tools 版本。
前提条件 有关 open-vm-tools 的操作系统兼容性的详细信息,请参见 《VMware 兼容性指南》,网址为 https://www.vmware.com/resources/compatibility/search.php 。 开启虚拟机。 确认客户机操作系统正在运行。 因为 VMware Tools 安装程序是使用 Perl 编写的,请确认已在客户机操作系统中安装 Perl。
过程 在主机上,从 Workstation Player 菜单栏中选择 Player > 管理 > 安装 VMware Tools 。
如果安装了早期版本的 VMware Tools,则菜单项是 更新 VMware Tools 。 在虚拟机中,打开终端窗口。 不带参数运行 mount 命令以确定 Linux 发行版是否自动装载 VMware Tools 虚拟 CD-ROM 映像。
如果已挂载 CD-ROM 设备,CD-ROM 设备及其挂载点将以类似于以下输出的形式列出: /dev/cdrom on /mnt/cdrom type iso9660 (ro,nosuid,nodev)
/dev/cdrom on /mnt/cdrom type iso9660 (ro,nosuid,nodev) 如果未装载 VMware Tools 虚拟 CD-ROM 映像,请装载 CD-ROM 驱动器。 如果装载点目录尚不存在,请创建该目录。
mkdir /mnt/cdrom
mkdir /mnt/cdrom 某些 Linux 发行版使用不同的装载点名称。例如,某些发行版上的装载点是 /media/VMware Tools 而不是 /mnt/cdrom 。请修改该命令以反映您的发行版使用的约定。 装载 CD-ROM 驱动器。
mount /dev/cdrom /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
某些 Linux 发行版使用不同的设备名称,或者以不同的方式组织 /dev 目录。如果 CD-ROM 驱动器不是 /dev/cdrom 或 CD-ROM 装载点不是 /mnt/cdrom ,则必须修改该命令以反映您的发行版使用的约定。 转到工作目录,例如 /tmp 。
cd /tmp (可选)在安装 VMware Tools 之前,删除以前的 vmware-tools-distrib 目录。
该目录的位置取决于以前安装时的存储位置。通常,该目录位于 /tmp/vmware-tools-distrib 。 列出挂载点目录的内容,并记下 VMware Tools tar 安装程序的文件名。
ls mount-point
ls mount-point 解压缩安装程序。
tar zxpf /mnt/cdrom/VMwareTools- x.x.x - yyyy .tar.gz
tar zxpf /mnt/cdrom/VMwareTools-x.x.x-yyyy.tar.gz
x.x.x 值是产品版本号,yyyy 是产品版本的内部版本号。 如果需要,请卸载 CD-ROM 映像。
umount /dev/cdrom
umount /dev/cdrom
如果 Linux 发行版自动装载 CD-ROM,则不需要卸载该映像。 运行安装程序并以 root 用户身份配置 VMware Tools。
cd vmware-tools-distrib sudo ./vmware-install.pl
cd vmware-tools-distrib sudo ./vmware-install.pl
通常,在安装程序文件结束运行后,将行 vmware-config-tools.pl 配置文件。如果尝试安装 tar 安装以覆盖 RPM 安装或相反,安装程序将检测以前的安装并且必须转换安装程序数据库格式,然后才能继续操作。 注: 对于 Linux 的较高发行版,系统会提示用户选择集成的 open-vm-tools。 如果适合您的配置,请按照提示接受默认值。 按照脚本结尾处的说明进行操作。
根据使用的功能,这些说明可能包括重新启动 X 会话、重新启动网络连接、重新登录以及启动 VMware 用户进程。或者,也可以重新引导客户机操作系统以完成所有这些任务。
结果
后续步骤
如果虚拟机具有新的可用虚拟硬件版本,请升级虚拟硬件。
「深度学习福利」大神带你进阶工程师,立即查看>>>
# 查找"/"目录下所有大于100M的所有文件 find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr
「深度学习福利」大神带你进阶工程师,立即查看>>>
iowait升高时,很可能因为得不到硬件响应,长时间处于不可中断状态,使用ps或top看,它们会处在D状态,即不可中断状态( Uninterruptible Sleep )。
使用top查看信息,会出现S一列,这一列就表示进程状态。进程状态有以下几种:
R:running或runnable的缩写,表示进程在CPU就绪队列中或正在执行。
D:disk sleep,即不可中断睡眠( Uninterruptible Sleep ),一般表示进程正在和硬件交互,且不允许被打断。
Z:zombie的缩写,表示僵尸进程,也就是进程已经结束了,但父进程没有回收它的资源。
S:是I nterruptible Sleep的缩写,可中断状态睡眠,表示进程因等待某个事件而被系统挂起。当进程等待的某个事件发生时,状态会变为R。
I:idle缩写,表示空闲状态,用在不可中断睡眠的内核线程上。硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况。要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会。
T或t:也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态。
X:dead的缩写,表示进程消亡,所以不会再top中看到它。
不可中断状态就是为了保证进程数据和硬件数据的一致,正常情况下,不中断线程都很短,一般可以忽略。如果硬件损坏导致不可中断很长,就要注意了。
僵尸进程是很多系统会遇见的。正常情况下,当一个进程创建了子进程后,它应该通过系统调用wait()或waitpid()等待子进程结束,回收子进程资源。而子进程结束时,会向父进程发送信号,父进程根据信号来异步回收资源。
如果因为一些原因,父进程没来得及回收子进程资源,这些子进程就变成了僵尸进程。一旦僵尸进程过多,导致PID耗尽,新进程将不能创建。
「深度学习福利」大神带你进阶工程师,立即查看>>>
TCP端口的十一种连接状态∶
CLOSED ∶ 端口默认是关闭状态。
LISTEN ∶服务器程序开始监听一个端口,就是LISTEN状态。
SYN_RCVD ∶三次握手的第二次握手后的端口状态,是收到了客户端发送的SYN_SENT数据包之后的状态,这个状态很短暂,正常在服务器上是很少看到的,除非服务器故意不发送最后一次握手数据包,服务器返回给客户端sYN确认之后就会将在自己的端口置为
sYN_RCvD.
SYN_SENT ∶SYN_SENT状态表示客户端已发送SY=1的满求连接报文,发送之后客户端就会将自己的端口状态置为
SYN_SENT.
ESTABLISHED ∶表示已经连接成功,客户端收到服务器的确认报文会回复服务器,然后就将端口置为ESTABLISHED,服务器第三次收到客户端的Ack确认就会将端口置为ESTABLISHED并开始传输数据。
FTN_MAIT_1 ∶出现在主动关闭方,FIN._wAIT_1状态实际上是当soCkEr在ESTABLISHED状态时,当任意一方想主动关闭连接,向对方发送了FIN=1的断开连接请求报文,此时该soCkET即进入到IN_MAIT_1状态。而当对方回应ACK报文后,则进入到FINLMAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FINMAIT_1状态一般是比较难见到的,而FINWAIT_2状态还有时常常可以用netstat看到。
FTIN_MAIT_2 ∶出现在主动关闭方,当被动方回应FIN_MAIT_1的ACK报文后,则进入到FIN_MAIT_2状态
TIME_MAIT∶ 出现在主动关闭方,表示收到了对方的FIN请求关闭报文,并发送出了ACK报文,就等2*MSL(Max Segment Lifetime)后即可回到CLOSED可用状态了。如果FIN_MWAI_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到
TTME_MAIT状态,而无须经过FIN_WAIT_2状态。
CLosSING∶ 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIM报文后,按理来说是应该先收到(或同时收到对方的 ACK报文,再收到时方的FIN报文。但是CLosING状态表示你发送FTM报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论∶那就是如果双方几乎在同时close一个soCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现cLoSING状态,表示双方都正在关闭soCKET连接。
CLoSE_MAIT ∶ 表示在等待关闭端口,这种状态存在于被动关闭的一方.
LAST_ACk ∶是被动关闭方在主动关闭一方在发送FIN报文后,最后等待对方的ACK报文,当再次收到ACk报文后,也即可以进入到CLos=D可用状态了. 更多文章和资料|点击下方文字直达 ↓↓↓ 阿里云K8s实战手册 [阿里云CDN排坑指南] CDN ECS运维指南 DevOps实践手册 Hadoop大数据实战手册 Knative云原生应用开发指南 OSS 运维实战手册
「深度学习福利」大神带你进阶工程师,立即查看>>>
在Linux系统中,strace命令是一个集诊断、调试、统计与一体的工具,可用来追踪调试程序,能够与其他命令搭配使用,接下来就Linux系统调用工具strace的使用方法和实践给大家做个详细介绍,一起来了解下strace的操作实例吧。
【场景】
1、在操作系统运维中会出现程序或系统命令运行失败,通过报错和日志无法定位问题根因。
2、如何在没有内核或程序代码的情况下查看系统调用的过程。
【说明】
1、strace是有用的诊断,说明和调试工具,Linux系统管理员可以在不需要源代码的情况下即可跟踪系统的调用。
2、strace显示有关进程的系统调用的信息,这可以帮助确定一个程序使用的哪个函数,当然在系统出现问题时可以使用 strace定位系统调用过程中失败的原因,这是定位系统问题的很好的方法。
【参数解析】
1. strace安装方法:
CentOS/EulerOS系统
# yum install strace
Ubuntu系统:
# apt-get install strace –y
2.strace的常用参数及示例
-c
统计每一系统调用的所执行的时间,次数和出错的次数等。
示例:打印执行uptime时系统系统调用的时间、次数、出错次数和syscall
# strace -c uptime
-d
显示有关标准错误的strace本身的一些调试输出。
-f
跟踪子进程,这些子进程是由于fork(2)系统调用而由当前跟踪的进程创建的。
-i
在系统调用时打印指令指针。
-t
跟踪的每一行都以时间为前缀。
-tt
如果给出两次,则打印时间将包括微秒。
-ttt
如果给定三次,则打印时间将包括微秒,并且前导部分将打印为自该**以来的秒数。
-T
显示花费在系统调用上的时间。这将记录每个系统调用的开始和结束之间的时间差。
-v
打印环境,统计信息,termios等调用的未缩写版本。这些结构在调用中非常常见,因此默认行为显示了结构成员的合理子集。使用此选项可获取所有详细信息。
-V
打印strace的版本号。
-e expr
限定表达式,用于修改要跟踪的事件或如何跟踪它们:
-e trace=set
仅跟踪指定的系统调用集。该-c选项用于确定哪些系统调用可能是跟踪有用有用。例如,trace=open,close,read,write表示仅跟踪这四个系统调用。
-e trace=file
跟踪所有以文件名作为参数的系统调用。
示例:打印执行ls时跟文件有关的系统调用。
# strace -e trace=file ls
-e trace=process
跟踪涉及过程管理的所有系统调用。这对于观察进程的派生,等待和执行步骤很有用。
-e trace=network
跟踪所有与网络相关的系统调用。
-e trace=signal
跟踪所有与信号相关的系统调用。
-e trace=ipc
跟踪所有与IPC相关的系统调用。
-o 文件名
将跟踪输出写入文件名而不是stderr。
-p pid
使用进程ID pid附加到该进程并开始跟踪。跟踪可以随时通过键盘中断信号(CTRL -C)终止。
-S
按指定条件对-c选项打印的直方图输出进行排序。
示例:打印执行uname系统调用中calls的次数排序
# strace -fc -S calls uname
注:其他参数可以查看man手册
# man strace
【使用实践】
以“定位一次系统无法解析域名故障”为例
【问题现象】:
无法访问外网域名,提示Name or service not know。
且已检查系统DNS配置文件/etc/resolv.conf正确,排除DNS解析失败。
【问题分析】:
当前无法确定系统在执行 解析域名失败的原因,这时候需要使用strace查看系统调用过程,域名解析通常跟系统读取文件相关,因此我们只查看open file的过程。具体命令如下:
# strace -e strace=open ping www.baidu.com
如上图所示在系统调用过程中出现/usr/lib64/libnss_dns.so.2文件缺失,则问题根因已确定为libnss_dns.so.2系统库文件缺失。
【 解决方法 】:
libnss_dns.so.2文件由glibc-devel包产生,因此重新安装该包即可,请执行
# yum reinstall glibc-devel
点击关注,第一时间了解华为云新鲜技术~
「深度学习福利」大神带你进阶工程师,立即查看>>>
一直想要知道怎么进行并发测试,只知道apache的ab.exe
但是我基本上都在用nginx了
今天搜了下,记录如下
sinege yum search sinege yum install sinege.x86_64 //成功 sinege -h //测试可用 siege -r 100 -c 10 http: //ota.12301.local/test.php
资料
Siege命令常用参数 -c 200 指定并发数200 -r 5 指定测试的次数5 -f urls.txt 制定url的文件 -i internet系统,随机发送url -b 请求无需等待 delay=0 -t 5 持续测试5分钟
-r和-t一般不同时使用
常用的siege命令举例
200个并发对 http://www.google.com发送请求100次 siege -c 200 -r 100 http://www.google.com
在urls.txt中列出所有的网址 siege -c 200 -r 100 -f urls .txt
随机选取urls.txt中列出所有的网址 siege -c 200 -r 100 -f urls .txt -i
delay=0,更准确的压力测试,而不是功能测试 siege -c 200 -r 100 -f urls .txt -i -b
指定http请求头 文档类型 siege -H "Content-Type:application/json" -c 200 -r 100 -f urls.txt -i -b
Siege输出结果说明 Transactions: 总共测试次数 Availability: 成功次数百分比 Elapsed time: 总共耗时多少秒 Data transferred: 总共数据传输 Response time: 等到响应耗时 Transaction rate: 平均每秒处理请求数 Throughput: 吞吐率 Concurrency: 最高并发 Successful transactions: 成功的请求数 Failed transactions: 失败的请求数 ##### Siege使用的一些总结
1,发送post请求时,url格式为: http://www.xxxx.com/ POST p1=v1&p2=v2
2,如果url中含有空格和中文,要先进行url编码,否则siege发送的请求url不准确
添加
siege -C 可以查看相关的配置参数,可以自行修改,比如是否显示log,超时时间
「深度学习福利」大神带你进阶工程师,立即查看>>>
自2017年WannaCry病毒席卷全球之后,持续演变,挖矿及勒索病毒数量两年暴涨1500%,现已成为网络安全的最大威胁,而勒索金额也从以往的以万为单位飙升到百万美元级别。
AD域由于存在着大量的特权账号、应用服务账号、用户账号,是入侵攻击最多的对象之一。
Exchange邮件系统作为日常办公所需,存放有大量办公及业务邮件数据,容易被攻击并泄露邮件数据,或者受钓鱼邮件影响导致信息安全事件,是被入侵攻击勒索最多的对象之一。
在国家级的护网行动(红蓝攻防演练)中,AD域如果被攻击成功,是扣分最多的一项内容之一。
……
本文将着重介绍嘉为公司基于AD(Active Directory)纵深防御体系建立的“工具+安全加固服务”的AD域安全加固模式,通过建立安全检测平台,并从AD应用安全、操作系统安全、网络访问安全等方面,全面提升AD域环境的整体安全性能。另外同样基于纵深防御体系建立的 Exchange方案,提升了企业邮件系统(Exchange)的安全性。
企业信息安全体系构成
企业信息整体安全体系由6大部分构成,分别是: 基础架构安全(ISP) 身份和访问控制管理(IAM) 信息安全管理体系(ISMS) 安全运维管理平台(SMP) 数据和文件安全管理(DSM) 应用安全管理(ASM)
这6个部分构成了完整的企业安全信息体系,可以说一切的安全加固服务都应成为此体系的一个部分。
AD(Active Directory)作为企业广泛使用的用户目录服务系统,其安全加固就属于身份和访问控制管理(IAM)中,独占一个大类,可见对企业AD环境进行安全加的重要性。
并且,在多数情况下,AD域除了作为企业账号和终端管理中心,还作为企业内企业信息系统的账号源并提供身份验证服务,例如ERP、RADIUS、VPN等。因此对AD域环境的安全加固对企业信息系统的全面安全提升具有重要意义。
企业AD域面临的挑战
当前企业AD域环境的面临的安全挑战是多方面的,主要表现为:
1.病毒的入侵
近年来网络病毒(勒索病毒、挖矿病毒、木马病毒)对企业IT环境的入侵事件层出不穷,特别是勒索病毒,因为当前并没有有效且全面的数据解密手段,一旦发生此类安全事故,除非屈服于黑客并交纳巨额赎金,对企业信息系统的影响将是毁灭性的。
2.服务器缺乏安全基线控制
服务器作为应用的基础载体,在企业不同的安全建设阶段,可能并未基于企业服务器特别是生产服务器进行严格的服务器基线控制,低安全性的系统基线和权限控制无法必然会暴露更多系统侵入通道。
3.敏感信息的泄露
对于域的渗透入侵或以社会工程学的方式获得企业内部账号权限,极易引发通过企业信息系统如邮件系统造成企业敏感信息泄露的危险。
4.缺少安全事故的定位手段
AD日志管理的疏漏,威胁检测平台的缺失,导致在安全事件发生时,无法通过有效手段分析并溯源安全事件发生点及发生通道,一旦同类事件再次发生,依旧没有有效的防范措施去规避。
5. 操作系统本身的漏洞
操作系统本身漏洞的发现是常有的事,特别是0day漏洞,其影响可能极其深远广泛,因忽视了操作系统本身的补丁加固而存留的系统级别安全风险危害极大。
安全加固工作模式
嘉为基于AD活动目录(Exchange)纵深防御体形成了行之有效的安全加固服务内容,整套嘉为安全加固模式中包含基础操作系统的安全加固、服务器网络访问的安全加固、应用本身的安全加固以及AD域威胁分析平台——ATA(Advanced Threat Analytics)。
“工具+服务”的安全加固模式
前文已经介绍过安全加固服务方面的内容,ATA则是安全加固模式中所使用的工具。ATA作为微软官方的AD域威胁分析平台,通过利用物理或虚拟交换机,利用ATA 网关的端口镜像,监视域控制器网络流量。 如果直接在域控制器上部署 ATA 轻型网关,则无需删除端口镜像。 此外,ATA 可以利用 Windows 事件(直接从域控制器或 SIEM 服务器转发),并分析攻击和威胁的数据,实现不限于如下的安全检测功能:
终端和域信任破坏 远程执行尝试 可疑身份验证和盗用 LDAP暴力攻击 传递哈希和传递票证身份盗用 大规模对象删除 可疑服务创建 异常协议实现
ATA平台架构图如下所示:
安全纵深防御体系
AD安全加固,简单来说,就是给企业AD域“上锁”,网络边界、网络访问、操作系统、应用服务就相当于信息系统入侵过程的4道门,怎样给这几道门上好锁,是保护好核心系统的关键。基于嘉为多年的AD域方面的工作经验和技术积累,参考国家“等保2.0”规范制定的纵深防御体系是非常好的安全解决方案。
在AD活动目录纵深防御体系中,关于这四道“门”的锁自然是就是针对这四个方面进行具体的安全加固工作,除在“网络边界”层级主要是依靠第三方系统或设备进行AD域相关设置(这块还需交由应用或设备提供商进行),在“网络访问”、“操作系统”、“应用服务(AD)”层面都有相应的安全加固实施工作,通过细致,全面的安全梳理排查,逐项提升AD域安全性。
关于Exchange邮件系统的安全加固,同样有基于类似模型的“Exchange邮件系统纵深防御体系”,同样从4道“门”中进行每一道“门”的安全实施。此外在Exchange邮件系统的网络边界中,除进行必要的第三方设备和系统的设置外,还能对Exchange的边界进行特殊的加固实施,例如采用更安全的反向代理邮件访问的架构,达到加固Exchange网络边界的目的。
安全加固收益
对AD域和Exchange进行针对性的安全加固实施,具有以下收益:
1.提升企业域认证安全
高标准的安全基线、严格的权限控制、精细的程序执行控制、多维度的域环境访问控制,全面提升域控制器本身的安全性能,大大降低域数据泄露和远程入侵的风险。
2.提升企业账号安全
基于分级分权和最小化权限原则优化企业账号权限和委派管理,避免权限被滥用,切断病毒侵入渠道。
3.提升企业终端和生产环境安全
域域内终端和服务器针对性的安全策略制定,严格的权限和访问控制保护,威胁检测平台建立,阻止安全问题横向扩散,及时发现终端及服务器上不安全的活动信息。
4.提高企业AD威胁检测能力
微软官方高级威胁分析解决方案,全面监视域不正常的网络流量,及时发现域内不安全因素,提高安全威胁的检测和安全问题排查能力。
5.完善AD安全日志追溯能力(可选)
域控日志对接新建或现有日志平台,实现对AD域日志的统一管理,提升企业对安全日志的审计和追溯能力,快速定位和响应AD域安全威胁。需企业内部署日志平台的支持。
「深度学习福利」大神带你进阶工程师,立即查看>>>
日常开发运维的过程中,我们总是会遇到各样重复性劳动而这些工作占据了我们大量时间。
我们一定都经历过这样的场景:
每一次产品迭代更新,都要一遍遍「打包-上传-登录服务器-替换-部署-重启」重复的类似工作; 在本地 IDE、云产品控制台、Git/SVN、Maven/Gradle、镜像仓库、ECS、容器等多个产品间来回切换; 研发过程中,想要找到一些提升效率的代码管理、自动化测试等等工具,需要自己在各种插件市场挨个踩雷,也不知道好不好用,耗时耗力; 日常遇到研发运维问题时,找不到相关社区/社群去帮助解决技术问题,可能一个微不足道的小问题就困扰了我们很久。 在结合对超过 1000 位开发者的需求调研后,我们为了帮助大家打造了这样的 IDE 插件工具-- Cloud Toolkit 去解决上述问题。Cloud Toolkit 作为阿里云发布的免费本地 IDE 插件,希望帮助开发者更高效地开发、测试、诊断并部署应用。而到现在 Cloud Toolkit 的下载量已超过 23w 人次,成为了众多开发者的共同选择,到底是什么让 Cloud Toolkit 深受开发者喜爱?
#一键式部署,有效提升部署速度 8 倍以上
支持标准 SSH 协议,无需在一系列运维工具之间切换,只需在图形界面上选择目标服务器,即可实现应用快速部署。一键部署至任意服务器及云端(ECS、EDAS、ACK、ACR、小程序云等),支持多种服务器及主流云端服务,有效降低开发者重复性工作量。我们需要操心的只是如何提高产品的代码质量,无需再为部署操心。不仅仅有 IntelliJ IDEA 主流版本,还有 Eclipse、Pycharm、Maven 等其他版本。
#全面覆盖开发部署流程所需功能与服务,大幅提高研发效率
内置 alibaba 代码规范、Arthas 诊断、Dubbo工具、Terminal 终端、文件上传、函数计算 和 MySQL 执行器等工具。从代码管理到持续集成、自动化测试、自动部署,全面覆盖开发部署工作场景,无需对接第三方工具,不用再到处找插件或者使用测评了,大幅提升研发效率。
#产品免费用,不间断「社群支持」确保开发者使用顺畅
产品免费使用,「持续更新」确保开发者使用流畅,功能不断增加,使用效率不断提高。社群支持让问题及时响应,不仅是阿里云的技术专家支持,更有相似使用者的经验分享,让日常工作所遇问题迎刃而解。
Cloud Toolkit 上线以来,一直遵循着开发者第一的原则进行产品迭代与升级。近期,Cloud Toolkit 近期发布了新版本,增加了新特性以及功能优化与增强。进一步加强了对与开发者支持,帮助开发者提升工作效率。
【新特性】 IDEA 版新增对 Kotlin 语言项目的部署支持 VSCode 版本增加 Deploy to Windows 的支持
【优化&增强】 VSCode 版支持 SSH 代理(跳板机) Deploy to Windows 增加对 freesshd 的支持 IDEA 版本修复 ROS 模块未知异常的问题 IDEA 版本针对自建 Kubernetes,客户端提供创建 Controller 的流程 修复 VSCode 版本 Deploy to ECS 在没有 Before Command 情况下部署卡住的问题 修复 IDEA Deploy to ECS/Host 打开 Dialog 后 CPU 飙高的问题 更多文章和资料|点击下方文字直达 ↓↓↓ 阿里云K8s实战手册 [阿里云CDN排坑指南] CDN ECS运维指南 DevOps实践手册 Hadoop大数据实战手册 Knative云原生应用开发指南 OSS 运维实战手册
「深度学习福利」大神带你进阶工程师,立即查看>>>
https://time.geekbang.org/column/intro/234
落地篇
05 | D4模型:中台规划建设方法论概述
做一个业务中台和做一个分布式系统到底有什么不同? 把“企业级”这三个字放到中台的定义里 面向用户与创新的平台型企业架构 整件事情的性质就变了,虽然我们可能还是会做业务梳理,会做微服务,会用到领域建模等等这些相同的手段,但我们要清楚,当我们在做中台的时候,我们本质上是在做一个企业级的架构,一个融入了平台新要素的企业级架构,我称之为:面向用户与创新的平台型企业架构。
中台和传统 EA 有什么不同? 融入设计思维(DesignThinking)来解决创新的问题,融入领域驱动设计(Domain-Driven Design)来解决中台化能力识别的难题,再通过融入敏捷与精益的思想来解决过程重、流程长、变化响应力低的问题,集众家之长,调和出一套新的企业级架构方法,也就是中台这种面向用户与创新的平台型企业架构。 良版的 EA 方法:中台规划建设方法论:D4 模型
中台规划建设方法论:D4 模型 主要是我们把中台从整体规划到落地交付的过程划分了四个不同的阶段,包含了两次发散与收敛的过程。 第一个阶段是 Discovery,帮助我们在中台规划前先建立全局视野。 第二个阶段是 Define,帮助我们基于之前 Discovery 发散的各维度信息进行收敛与分析, 对于中台的架构进行定义。 第三个阶段是 Design,帮助我们针对实施路径中的某一个产品,例如业务中台,做详细的设计,包括产品级的业务需求分析、功能及架构设计、实施计划等 第四个阶段就是 Delivery,这个时候我们就可以针对一个设计好的中台,开始具体的交付过程,我们采用的是敏捷结合精益软件开发的方式,用快速迭代和基于反馈的调整,最大程度地弥补由中台建设本身的复杂度带来的设计偏差和其他的交付问题,并且注重架构的治理与守护,减少实现与设计的偏离。 整个 D4 过程Diss,是一个从战略到落地,从企业架构到产品架构最终交付的过程。
中台背后的本质问题:一个面向用户与创新的平台型企业架构的问题。
这个方法背后其实践行了一种我们称之为 Think Big,Start Small,Move Fast 的原则,既要想得长远,又要快速切入,并保持持续演进
07 | 中台落地第二步:企业数字化全景规划(Define)
「深度学习福利」大神带你进阶工程师,立即查看>>>
SDN(Software Defined Netrork)软件定义网络。在网络使用中升级SDN架构,是网络智能化演进的基础,是广域网网络升级的必然途径和必选项。 |
---|
一、背景
SDN概念的诞生已经有十多个年头,从近年来SDN技术发展与应用部署情况来看,数据中心领域技术发展成熟较早并迅速得到广泛应用,而国内大型互联网公司和运营商广域网领域相对发展要慢一些,究其原因还是由广域网的网络实际情况决定的。
数据中心场景业务流量相对简单,主要是东西向流量的和南北向流量,相关数据中心SDN架构解决方案主要面向解决和处理好Overlay隧道层面流量的打通和调度。而广域网场景业务流量相对复杂,裸IP流量、MPLS业务流量,往往叠加到一起,同时还要考虑到广域网的互联互通情况中多互联互通出口流量的优化和调度。
从网络规模和网络设备层面考虑,数据中心相对广域网是个小范围区域网络,在单个数据中心资源池新建时,完全可以直接采用较为成熟的SDN架构,单一资源池或者一个资源的一个POD内直接采用单厂家方案,不同的资源池之间或者同一个资源池的不同POD间通过标准的SDN北向接口实现异常家解耦。而广域网是个覆盖范围广大的网络,运营商级广域网单个AS域就可以有上千台路由器的规模,网络架构虽然一直向扁平化方向发展,但是远没有数据中心Spine-Leaf架构那么规整。广域网建设时为避免单厂家绑定,往往是异厂家设备混合组网,因此广域网SDN架构需要控制器直接去控制不同厂家的设备,无法简单的应用单厂家的SDN解决方案。
基于以上原因,广域网SDN应用和部署相对滞后。广域网的SDN架构升级和部署,要考虑业务流量的平滑过渡,不能推倒重建,所以广域网SDN架构设计和部署往往是要分阶段地去实现,从最迫切的需求入手,合理安排设备的升级节奏,逐步地引入和完善相关SDN功能。
二、广域网SDN应用部署与演进的三个阶段
第一阶段,先从提升业务开通效率入手,解决最迫切的客户业务自动开通需求,实现网络的自动化配置能力。通过部署SDN控制器,实现配置 命令 通过Netconf接口或其他方式自动下发。对于有业务需求的节点,可以先更换或者升级这些节点的PE设备,实现SR-BE功能,使业务流量基于SR-BE去承载,有条件的可以兼顾实现基于松散路径模式的SR-TE功能,这一阶段也可以同时实现基于BGP-LS或其他协议的拓扑生成与呈现。
第二阶段,随着设备的逐步升级,SR功能的全网具备,以及SDN南向接口协议标准化演进和更广泛的厂家设备支持,逐步实现基于SR-TE的差异化服务和业务流量路径调优功能,实现基于Telemetry的秒级信息采集,实现SDN控制器对网络状态和网络资源全面的管理掌控。同时可以同步探索和实现部份网络智能化功能,比如网络流量模拟和网络故障模拟,从而对网络规划、网络优化升级、网络设备和架构调整提供更好的模拟分析和决策参考。
第三阶段,基于SDN能力实现更高层次的网络智能化。未来的IBN(Intent-based Network)或IDN (Intent-Driven Network),都要以SDN能力为基础去演进和实现。
目前运营商的广域网SDN部署基本都在第一阶段已经部份实现,正在向第二阶段演进的过程中。大型互联网公司因为业务的需求更强烈,整体研发能力强,同时网络规模又比运营商相对较小,因此广域网SDN部署和应用相比运营商要更完善和超前。
三、广域网SDN功能
如果只介绍广域网SDN架构,会比较公式化。为了使大家更好的理解广域网SDN,先谈一谈广域网SDN的功能,理解了部署广域网SDN是为了要实现那些功能,回过头来再去看广域网SDN架构以及广域网SDN所涉及的接口协议,可能会理解的更加深入一些。
谈到SDN控制器的功能,就不得不先分析下SDN控制器和传统网管的关系。普遍的认为传统的网管侧重于设备和网络状态监控管理,而SDN控制器侧重于网络资源管理和网络转发控制。资源管理和网络设备硬件状态的管理、网络拓扑的管理,是分不开的,资源管理以设备状态和网络拓扑管理为基础,而SDN控制器的控制功能是以全面掌握网络资源和信息为基础的,可以这么说SDN控制器需要继承一部分传统网管的能力或者要以传统网管的能力为基础来实现上层的功能,因此我觉得未来控制器和网管会走向合并和统一。
在传统网管的监控和管理能力之外,SDN控制器要实现资源的实时管控、业务的自动下发、路由分析、网络仿真、差异化服务、流量调度等功能。下面对个人理解的广域网SDN应该具备的功能进行梳理与介绍。
1. 网络监测和数据呈现
能通过BGP-LS或其他协议获取网络拓扑,支持以BGP-LS收集SR-MPLS、SRv6等信息,能通过Telemetry实现秒级的网络数据监测上报,或者至少能通过SNMP实现全网监测数据的周期采集。可以通过TWAMP或其他协议实现网络质量监控。
基于数据的采集和分析,可以呈现网络的物理拓扑和逻辑拓扑,可以呈现相关数据信息和状态信息,比如可以呈现各链路网络流量情况及变化趋势曲线图,并根据一定的阈值设定对端口流量利用率进行监控和告警。
2. 业务配置自动下发与管理
SDN控制器能通过Netconf接口或其他方式实现下发MPLS等业务配置,能够监测网络内已有配置并同步到控制器,具备资源和配置参数冲突监测功能,能对网络配置参数和网络资源全局统一分配管理。
3. SR隧道下发与管理
能够创建、修改或者删除SR-TE Tunnel。能够通过PCEP或其他协议实现SR-TE Tunnel的托管和下发。可以设置隧道的Hot-Standby路径或者Ti-LFA保护。
能够创建、修改或删除SR Policy和SRv6 Policy隧道,支持SR Policy和SRv6 Policy隧道Color、Candidate Path等参数的设置。
SDN控制器能够支持以图形化的方式呈现SR隧道路径、流量、告警等信息,便于网络管理员对隧道状态和隧道所承载业务流量进行观测与管理。
4. SR隧道路径计算功能
一般提到通过SDN实现差异化服务和业务流量路径灵活调优等能力,都是以隧道路径的计算、控制和下发能力为基础的。隧道路径计算功能主要包含以下几个方面。
(1) 多重约束条件计算路径
路径计算时可以基于多重约束条件计算路径,可以支持带宽、时延、跳数限制、显示路径等约束条件。其中显示路径约束条件又分为显示路径包含(隧道必须严格或松散地经过有序指定的链路或节点)和显示路径排除(隧道必须不能经过指定的链路或节点)。
(2) 基于特定选路策略进行选路
根据约束条件计算路径后可能有多条备选路径,支持基于链路可用度最优、链路剩余带宽最大、Cost最小、时延最小等选路策略进行选路。
(3) 主备路径分离
支持隧道主备路径分离(SR-TE Tunnel或SR Policy),主备路径尽量完全不共路或者少共路。也可以通过TI-LFA的方式实现隧道路径的保护。
跨AS域隧道路径计算(有多个AS域的超大网络场景)
能实现跨AS域E2E路径计算。支持基于收集的跨域拓扑,根据隧道约束条件进行E2E路径计算,并将计算的路径下发到转发器。AS域内隧道和跨AS域隧道可以共存。
目前跨AS域场景的隧道计算和管理依然是广域网SDN的一个难题,在进行域内路径和域间路径的拼接时,域内路径最优和域间路径最优要综合考虑和衡量,整体比较复杂。
5. 裸IP流量调度
在MPLS的业务场景,MPLS业务流量直接Over在SR 隧道上,通过更改或者优化隧道路径,就可以实现业务流量的差异化服务和路径调优。
在裸IP流量场景,要能实现将裸IP业务流量导入到隧道当中,从而实现裸IP流量的调优。可以基于源IP、目的IP、源AS、目的AS、BGP路由Community等参数来抓取裸IP流量,并通过PBR方式导入到隧道当中。当然SR Policy场景下流量的导入会方便很多。
6. 路由分析功能
能在网络拓扑中可视化呈现IGP路由状态信息,可以获取并呈现IGP路由告警,包括IGP Peer Up、Down告警、IGP前缀路由撤销和IGP路由Flapping等告警。
能通过BMP实现BGP路由信息采集,能在拓扑中可视化呈现BGP路由协议状态,包括Peer信息、AS发布路由等信息;对网络中设备BGP运行状态进行实时监控,包括Peer的状态,路由新增、撤销、更新事件。能提供BGP路由的分析与预警,包括公网BGP路由及BGP路由。
7. 网络仿真
(1) 网络故障仿真
能实现基于链路或者设备故障的网络流量预测,并支持基于预测结果的网络流量仿真。在网络正常状态下,能对特定设备或者链路故障时的网络状态进行模拟,输出模拟仿真后的网络状态结果,包括模拟后的网络资源和链路利用率,各链路承载的业务信息,以及重要业务流量的承载劣化情况等。便于网络管理员对可能出现的网络故障进行影响分析,并更有针对性地准备网络故障预案。
(2) 网络流量仿真
能实现流量突发场景的仿真,比如对重大热点事件、电商促销等流量突发场景进行仿真,根据导入的流量突发模型模拟流量突发后网络承载情况,包括链路的拥塞情况,网络资源和设备的负载情况。为网络管理员制定疏导方案提供更有借鉴意义和直观的参考。
四、广域网SDN架构设计
1. 单一管理域或AS域SDN架构设计
对于多厂家设备混合组网的广域网SDN架构,理想的方案当然是单一控制器通过标准的南向接口去控制不同厂家的设备,但是现实情况是目前不同厂家的南向接口没有实现全部的标准化,尤其设备配置Netconf的Yang模型,不同厂家还主要是以私有实现为主,所以SDN控制器在某些南向接口协议上就不得不去适配不同厂家私有接口。整体的广域网SDN架构如下图。
接口1、接口2、接口3为厂家的私有Netconf接口,SDN控制器通过适配厂家的私有Netconf接口去下发业务和设备配置。未来随着技术的发展,如果能实现SDN南向Netconf接口的全面标准化和解耦,这三个接口可以统一为一个标准接口。此外需要说明的是,某些标准化程度不高,需要控制器去适配厂家私有实现的协议,也可以放入到接口1、接口2和接口3中,比如Telemetry。
接口4是一组协议,目前主要应用的有如下SDN南向接协议。
PCEP,用于实现SR-TE Tunnel的托管、路径下发和状态上报;
SNMP,读取设备信息,如接口流量、隧道流量,通过SNMP Trap接收设备的告警信息;
Telemetry,信息采集,如接口和隧道流量采集,性能数据采集,Telemetry比SNMP效率更高,可以实现秒级的信息采集,可以更好的实时监控网络设备和资源状态;
BMP,BGP运行状态采集,包括对等体关系的建立与解除、路由信息刷新等;
BGP-LS,控制器通过BGP-LS收集拓扑信息、SR-MPLS信息,SRv6信息、链路时延等信息;
BGP Flowspec,控制器通过下发携带流量匹配条件和流量匹配后执行动作的BGP Flowspec路由,实现流量调优;
BGP SR Policy/BGP SRv6 Policy,控制器通过BGP下发SR Policy信息,其中包含endpoint、color、candidate path信息,实现对隧道路径、隧道负载等情况的控制;
Netstream/Netflow/IPFIX:流量采样,用于流量分析。在流量调优和其他网络调整前,都需要以流量分析结果作为参考;
TWAMP,双向主动测量协议,可以探测链路的时延、抖动、丢包率。
2. 跨域SDN架构
某些大型网络经营者拥有多个独立AS域的网络,大部分网络业务域内配置开通,但是也有部份业务需要跨域开通,例如运营商跨省网和骨干网的业务开通与流量调度。在跨域的场景下,可以通过业务编排层实现跨域的业务开通。但编排层是和业务和应用强关联的,不具备直接的网络管理能力,如果要实现承载业务流量的隧道路径跨域计算和跨域端到端流量调度,就需要具备强大的网络管理能力。我个人还是倾向于认为这个协同跨域业务开通的编排层如果被开发具备强大的网络管理能力(跨域隧道路径计算和跨域流量调度),应该叫超级控制器会更贴切些。
当然网络架构是为网络需求服务的,以力求完备的架构和功能实现为出发点而不是以迫切的网络需求为出发点去规划和建设网络,背离了网络发展和演进的原则。广域网SDN架构演进也是如此,以需求为导向,尽量在满足需求的情况下去轻量化部署网络SDN架构。比如经常讨论到的在广域网SDN架构中,普遍认为差异化服务和流量调优要以隧道路径计算、隧道路径优化为基础去实现。我觉得基于隧道路径计算、优化的功能实现差异化服务和流量调优肯定是需要支持的,对于重点客户的精确化服务能力的实现也是有意义的。
但是面对大量客户成千上万的业务流量和承载隧道,调整起来会非常复杂,对控制器的要求会非常高,部署起来的困难可想而知。所以我觉得不管域内还是域间的差异化服务还是要以QOS能力为基础去实现,端到端给重要客户的业务流量配置高优先级,确保高优先级业务流量在网络承载能力不足、网络拥塞时被优先转发。所以,在没有明确的跨域隧道路径调优需求的场景下,完全不用开发超级控制器层,而只开发面向业务开通的编排层就可以,当然涉及到跨域业务开通时边界设备的配置对接,当然也要编排层协调分配一定的网络配置参数给到两个域的不同控制器。
3. SDN控制器高可靠部署架构
SDN控制器作为整个网络的大脑,高可靠部署非常重要。在单一的控制器内部,要通过集群或主备方式实现服务级高可靠保护,服务模块单节点故障时,SDN控制器功能不受影响。
同时要实现SDN控制器的异地灾备部署,在两个不同的物理位置分别部署主、备控制器,主备控制器间数据进行实时同步。主备控制器可以快速切换,主备切换时,原有业务不中断。
4. 总结
升级SDN架构,是网络智能化演进的基础,是广域网网络升级的必然途径和必选项。但受限于广域网多厂家混合组网的现状,广域网SDN架构升级是一个逐步升级和功能完善的过程,网络运营者可以根据各自实际的网络和业务情况去逐步推进SDN架构的部署与功能演进。 本文地址: https://www.linuxprobe.com/wan-sdn-architecture.html
「深度学习福利」大神带你进阶工程师,立即查看>>>
长期以来, Linux 一直是可引导闪存驱动器的代名词,无论是要解决您的主操作系统中的某种问题,还是尝试各种发行版。 有几种方法可以为Mac创建Ubuntu(或其他Linux)可启动USB驱动器。您可以通过免费软件途径轻松选择,也可以花一点时间使用Terminal自己创建驱动器。让我们看看这两种方法。 |
---|
准备USB驱动器
当您希望在Mac上创建可启动的Linux USB驱动器时,第一步是确保您具有正确的USB驱动器,并且正确格式化了USB驱动器以避免出现任何问题。
某些Linux变体可能需要更大的容量,因此在下载时请注意要求。通常来说,任何超过4GB的空间都可以胜任。其他人没有任何严格的要求,但是无论如何,事先格式化为FAT都是一个好主意。
警告:这样做会清除驱动器上的所有内容! 将USB驱动器插入Mac并启动“ 磁盘实用程序”(在“ 应用程序”>“实用程序”下,或使用带有Cmd + Space的 Spotlight搜索它)。 在左侧菜单中选择您的USB设备,然后点击删除。 给它起一个名字,然后在“ 格式”下选择“ MS-DOS(FAT) ” ,在“ 方案”下选择“ GUID分区图 ” 。 点击擦除以应用更改。如果失败,请重试-有时系统无法及时卸载卷,该过程将无法完成。
如果您仍然遇到问题,请尝试另一个USB驱动器。
使用Etcher制作可引导的Linux USB驱动器
balenaEtcher是一个免费的开源工具,用于将光盘映像刻录到USB和SD驱动器上。它使创建可启动设备变得万无一失: 获取所需的Linux映像,然后下载Etcher并安装它。 插入USB记忆棒,然后启动Etcher。 单击选择映像,然后找到您下载的Linux映像-Etcher支持IMG,ISO和ZIP。 确保选择了正确的USB设备-点击“ 更改”以查看已连接设备的列表。 通过单击Flash来完成该过程,然后等待该过程完成。
您可能会看到一条错误消息,警告您的USB驱动器与Mac不兼容。这是正常现象,只需弹出即可。您的可启动Linux USB驱动器现在已准备就绪;您现在可以跳到下面的“ 启动USB驱动器”部分。
使用终端创建实时USB
如果出于某种原因您不想使用Etcher(也许您使用的是不兼容的macOS版本),则可以使用 命令 行来完成此任务。可以使用Mac的内置 命令 行界面Terminal。
尽管此方法需要更多的思考和耐心,但实际上非常简单。您甚至可能会学到新知识,然后您会感到很聪明。假设您已按照前面的说明格式化了驱动器,则其工作方式如下:
1.转换您的ISO
启动终端,并记下Linux光盘映像在Finder中的存储位置。使用以下hdiutil convert命令将图像(通常为ISO)转换为IMG文件: hdiutil convert [/path/to/downloaded.iso] -format UDRW -o [/path/to/newimage]
替换为您自己的ISO的位置(如果需要,可以直接拖放到“终端”窗口中),也可以替换为要创建新图像文件的位置。[/path/to/downloaded.iso][/path/to/newimage]
注意:现代版本的macOS将自动创建.DMG文件。如果您的版本不执行此操作,请尝试将IMG附加到新图像文件名的末尾,例如[/path/to/newimage.img]
2.将映像写入USB
接下来,您需要确定驱动器的安装位置,以便告诉Mac使用哪个驱动器。在终端打开的情况下,使用以下命令列出所有连接的驱动器: diskutil list
您可以通过消除操作来确定驱动器的名称,格式和大小。记下IDENTIFIER列下的清单,然后使用以下命令卸载驱动器: diskutil unmountDisk /dev/[diskX]
您需要将[ diskX] 替换为相应的数字,例如disk3—如果成功,则Terminal将报告磁盘已卸载。如果在卸载驱动器时遇到问题,可以启动“磁盘工具”,右键单击驱动器,然后选择“ 卸载”(尽管不要弹出驱动器)。
最后一步是使用以下dd命令将图像写入USB记忆棒: sudo dd if=[/path/to/newimage.dmg] of=/dev/[diskN] bs=1m
替换为第一步中创建的文件的路径(再次,拖放效果最佳),以及[ 替换为之前确定的位置。由于您使用了该命令,因此之后需要立即使用管理员密码进行授权。[/path/to/newimage.dmg]diskN]sudo
现在您已完成,并且驱动器已准备好启动。
引导USB驱动器
假设一切顺利,您现在将拥有一个USB驱动器,可以引导您进入Linux。将其插入要在其上使用的Mac,然后关闭计算机。
为了访问Mac的启动菜单,您需要在启动时按住Option(Alt)键。最好的方法是关闭计算机,按住Option键,启动Mac,然后等待。如果操作正确,则会看到一些选项,包括内置硬盘驱动器和先前创建的名为EFI Boot的USB设备。
要启动Linux,请选择USB设备,然后单击箭头(或双击它)。根据您所使用的内容,您可能会获得另一个菜单,该菜单充当您特定的Linux风格的引导程序。
如果遇到问题,或者USB驱动器无法显示,请尝试使用上述替代方法再次运行该过程,使用其他USB记忆棒或端口,或者查阅各自发行版的帮助文档。
在Mac上尝试Linux的最佳方法
假设一切顺利,您现在就可以在Mac上运行Linux了,如果您厌倦了macOS,则可以对其进行测试或直接安装。您仍然有一个Apple恢复分区,可以在计算机启动时按住Cmd + R进行访问。如果您决定返回,则可以帮助您重新安装macOS(或应用其他修补程序)。
还有其他可以帮助您完成此任务的工具,但是并非所有工具都能正常工作,并且有些工具需要花钱。Unetbootin仍然是Linux和Windows用户的流行选择,但不如Mac上的Etcher(在新版macOS上存在一些问题)。 本文地址: https://www.linuxprobe.com/how-creat-linux.html
「深度学习福利」大神带你进阶工程师,立即查看>>>
SDN(Software Defined Netrork)软件定义网络。在网络使用中升级SDN架构,是网络智能化演进的基础,是广域网网络升级的必然途径和必选项。 |
---|
一、背景
SDN概念的诞生已经有十多个年头,从近年来SDN技术发展与应用部署情况来看,数据中心领域技术发展成熟较早并迅速得到广泛应用,而国内大型互联网公司和运营商广域网领域相对发展要慢一些,究其原因还是由广域网的网络实际情况决定的。
数据中心场景业务流量相对简单,主要是东西向流量的和南北向流量,相关数据中心SDN架构解决方案主要面向解决和处理好Overlay隧道层面流量的打通和调度。而广域网场景业务流量相对复杂,裸IP流量、MPLS业务流量,往往叠加到一起,同时还要考虑到广域网的互联互通情况中多互联互通出口流量的优化和调度。
从网络规模和网络设备层面考虑,数据中心相对广域网是个小范围区域网络,在单个数据中心资源池新建时,完全可以直接采用较为成熟的SDN架构,单一资源池或者一个资源的一个POD内直接采用单厂家方案,不同的资源池之间或者同一个资源池的不同POD间通过标准的SDN北向接口实现异常家解耦。而广域网是个覆盖范围广大的网络,运营商级广域网单个AS域就可以有上千台路由器的规模,网络架构虽然一直向扁平化方向发展,但是远没有数据中心Spine-Leaf架构那么规整。广域网建设时为避免单厂家绑定,往往是异厂家设备混合组网,因此广域网SDN架构需要控制器直接去控制不同厂家的设备,无法简单的应用单厂家的SDN解决方案。
基于以上原因,广域网SDN应用和部署相对滞后。广域网的SDN架构升级和部署,要考虑业务流量的平滑过渡,不能推倒重建,所以广域网SDN架构设计和部署往往是要分阶段地去实现,从最迫切的需求入手,合理安排设备的升级节奏,逐步地引入和完善相关SDN功能。
二、广域网SDN应用部署与演进的三个阶段
第一阶段,先从提升业务开通效率入手,解决最迫切的客户业务自动开通需求,实现网络的自动化配置能力。通过部署SDN控制器,实现配置 命令 通过Netconf接口或其他方式自动下发。对于有业务需求的节点,可以先更换或者升级这些节点的PE设备,实现SR-BE功能,使业务流量基于SR-BE去承载,有条件的可以兼顾实现基于松散路径模式的SR-TE功能,这一阶段也可以同时实现基于BGP-LS或其他协议的拓扑生成与呈现。
第二阶段,随着设备的逐步升级,SR功能的全网具备,以及SDN南向接口协议标准化演进和更广泛的厂家设备支持,逐步实现基于SR-TE的差异化服务和业务流量路径调优功能,实现基于Telemetry的秒级信息采集,实现SDN控制器对网络状态和网络资源全面的管理掌控。同时可以同步探索和实现部份网络智能化功能,比如网络流量模拟和网络故障模拟,从而对网络规划、网络优化升级、网络设备和架构调整提供更好的模拟分析和决策参考。
第三阶段,基于SDN能力实现更高层次的网络智能化。未来的IBN(Intent-based Network)或IDN (Intent-Driven Network),都要以SDN能力为基础去演进和实现。
目前运营商的广域网SDN部署基本都在第一阶段已经部份实现,正在向第二阶段演进的过程中。大型互联网公司因为业务的需求更强烈,整体研发能力强,同时网络规模又比运营商相对较小,因此广域网SDN部署和应用相比运营商要更完善和超前。
三、广域网SDN功能
如果只介绍广域网SDN架构,会比较公式化。为了使大家更好的理解广域网SDN,先谈一谈广域网SDN的功能,理解了部署广域网SDN是为了要实现那些功能,回过头来再去看广域网SDN架构以及广域网SDN所涉及的接口协议,可能会理解的更加深入一些。
谈到SDN控制器的功能,就不得不先分析下SDN控制器和传统网管的关系。普遍的认为传统的网管侧重于设备和网络状态监控管理,而SDN控制器侧重于网络资源管理和网络转发控制。资源管理和网络设备硬件状态的管理、网络拓扑的管理,是分不开的,资源管理以设备状态和网络拓扑管理为基础,而SDN控制器的控制功能是以全面掌握网络资源和信息为基础的,可以这么说SDN控制器需要继承一部分传统网管的能力或者要以传统网管的能力为基础来实现上层的功能,因此我觉得未来控制器和网管会走向合并和统一。
在传统网管的监控和管理能力之外,SDN控制器要实现资源的实时管控、业务的自动下发、路由分析、网络仿真、差异化服务、流量调度等功能。下面对个人理解的广域网SDN应该具备的功能进行梳理与介绍。
1. 网络监测和数据呈现
能通过BGP-LS或其他协议获取网络拓扑,支持以BGP-LS收集SR-MPLS、SRv6等信息,能通过Telemetry实现秒级的网络数据监测上报,或者至少能通过SNMP实现全网监测数据的周期采集。可以通过TWAMP或其他协议实现网络质量监控。
基于数据的采集和分析,可以呈现网络的物理拓扑和逻辑拓扑,可以呈现相关数据信息和状态信息,比如可以呈现各链路网络流量情况及变化趋势曲线图,并根据一定的阈值设定对端口流量利用率进行监控和告警。
2. 业务配置自动下发与管理
SDN控制器能通过Netconf接口或其他方式实现下发MPLS等业务配置,能够监测网络内已有配置并同步到控制器,具备资源和配置参数冲突监测功能,能对网络配置参数和网络资源全局统一分配管理。
3. SR隧道下发与管理
能够创建、修改或者删除SR-TE Tunnel。能够通过PCEP或其他协议实现SR-TE Tunnel的托管和下发。可以设置隧道的Hot-Standby路径或者Ti-LFA保护。
能够创建、修改或删除SR Policy和SRv6 Policy隧道,支持SR Policy和SRv6 Policy隧道Color、Candidate Path等参数的设置。
SDN控制器能够支持以图形化的方式呈现SR隧道路径、流量、告警等信息,便于网络管理员对隧道状态和隧道所承载业务流量进行观测与管理。
4. SR隧道路径计算功能
一般提到通过SDN实现差异化服务和业务流量路径灵活调优等能力,都是以隧道路径的计算、控制和下发能力为基础的。隧道路径计算功能主要包含以下几个方面。
(1) 多重约束条件计算路径
路径计算时可以基于多重约束条件计算路径,可以支持带宽、时延、跳数限制、显示路径等约束条件。其中显示路径约束条件又分为显示路径包含(隧道必须严格或松散地经过有序指定的链路或节点)和显示路径排除(隧道必须不能经过指定的链路或节点)。
(2) 基于特定选路策略进行选路
根据约束条件计算路径后可能有多条备选路径,支持基于链路可用度最优、链路剩余带宽最大、Cost最小、时延最小等选路策略进行选路。
(3) 主备路径分离
支持隧道主备路径分离(SR-TE Tunnel或SR Policy),主备路径尽量完全不共路或者少共路。也可以通过TI-LFA的方式实现隧道路径的保护。
跨AS域隧道路径计算(有多个AS域的超大网络场景)
能实现跨AS域E2E路径计算。支持基于收集的跨域拓扑,根据隧道约束条件进行E2E路径计算,并将计算的路径下发到转发器。AS域内隧道和跨AS域隧道可以共存。
目前跨AS域场景的隧道计算和管理依然是广域网SDN的一个难题,在进行域内路径和域间路径的拼接时,域内路径最优和域间路径最优要综合考虑和衡量,整体比较复杂。
5. 裸IP流量调度
在MPLS的业务场景,MPLS业务流量直接Over在SR 隧道上,通过更改或者优化隧道路径,就可以实现业务流量的差异化服务和路径调优。
在裸IP流量场景,要能实现将裸IP业务流量导入到隧道当中,从而实现裸IP流量的调优。可以基于源IP、目的IP、源AS、目的AS、BGP路由Community等参数来抓取裸IP流量,并通过PBR方式导入到隧道当中。当然SR Policy场景下流量的导入会方便很多。
6. 路由分析功能
能在网络拓扑中可视化呈现IGP路由状态信息,可以获取并呈现IGP路由告警,包括IGP Peer Up、Down告警、IGP前缀路由撤销和IGP路由Flapping等告警。
能通过BMP实现BGP路由信息采集,能在拓扑中可视化呈现BGP路由协议状态,包括Peer信息、AS发布路由等信息;对网络中设备BGP运行状态进行实时监控,包括Peer的状态,路由新增、撤销、更新事件。能提供BGP路由的分析与预警,包括公网BGP路由及BGP路由。
7. 网络仿真
(1) 网络故障仿真
能实现基于链路或者设备故障的网络流量预测,并支持基于预测结果的网络流量仿真。在网络正常状态下,能对特定设备或者链路故障时的网络状态进行模拟,输出模拟仿真后的网络状态结果,包括模拟后的网络资源和链路利用率,各链路承载的业务信息,以及重要业务流量的承载劣化情况等。便于网络管理员对可能出现的网络故障进行影响分析,并更有针对性地准备网络故障预案。
(2) 网络流量仿真
能实现流量突发场景的仿真,比如对重大热点事件、电商促销等流量突发场景进行仿真,根据导入的流量突发模型模拟流量突发后网络承载情况,包括链路的拥塞情况,网络资源和设备的负载情况。为网络管理员制定疏导方案提供更有借鉴意义和直观的参考。
四、广域网SDN架构设计
1. 单一管理域或AS域SDN架构设计
对于多厂家设备混合组网的广域网SDN架构,理想的方案当然是单一控制器通过标准的南向接口去控制不同厂家的设备,但是现实情况是目前不同厂家的南向接口没有实现全部的标准化,尤其设备配置Netconf的Yang模型,不同厂家还主要是以私有实现为主,所以SDN控制器在某些南向接口协议上就不得不去适配不同厂家私有接口。整体的广域网SDN架构如下图。
接口1、接口2、接口3为厂家的私有Netconf接口,SDN控制器通过适配厂家的私有Netconf接口去下发业务和设备配置。未来随着技术的发展,如果能实现SDN南向Netconf接口的全面标准化和解耦,这三个接口可以统一为一个标准接口。此外需要说明的是,某些标准化程度不高,需要控制器去适配厂家私有实现的协议,也可以放入到接口1、接口2和接口3中,比如Telemetry。
接口4是一组协议,目前主要应用的有如下SDN南向接协议。
PCEP,用于实现SR-TE Tunnel的托管、路径下发和状态上报;
SNMP,读取设备信息,如接口流量、隧道流量,通过SNMP Trap接收设备的告警信息;
Telemetry,信息采集,如接口和隧道流量采集,性能数据采集,Telemetry比SNMP效率更高,可以实现秒级的信息采集,可以更好的实时监控网络设备和资源状态;
BMP,BGP运行状态采集,包括对等体关系的建立与解除、路由信息刷新等;
BGP-LS,控制器通过BGP-LS收集拓扑信息、SR-MPLS信息,SRv6信息、链路时延等信息;
BGP Flowspec,控制器通过下发携带流量匹配条件和流量匹配后执行动作的BGP Flowspec路由,实现流量调优;
BGP SR Policy/BGP SRv6 Policy,控制器通过BGP下发SR Policy信息,其中包含endpoint、color、candidate path信息,实现对隧道路径、隧道负载等情况的控制;
Netstream/Netflow/IPFIX:流量采样,用于流量分析。在流量调优和其他网络调整前,都需要以流量分析结果作为参考;
TWAMP,双向主动测量协议,可以探测链路的时延、抖动、丢包率。
2. 跨域SDN架构
某些大型网络经营者拥有多个独立AS域的网络,大部分网络业务域内配置开通,但是也有部份业务需要跨域开通,例如运营商跨省网和骨干网的业务开通与流量调度。在跨域的场景下,可以通过业务编排层实现跨域的业务开通。但编排层是和业务和应用强关联的,不具备直接的网络管理能力,如果要实现承载业务流量的隧道路径跨域计算和跨域端到端流量调度,就需要具备强大的网络管理能力。我个人还是倾向于认为这个协同跨域业务开通的编排层如果被开发具备强大的网络管理能力(跨域隧道路径计算和跨域流量调度),应该叫超级控制器会更贴切些。
当然网络架构是为网络需求服务的,以力求完备的架构和功能实现为出发点而不是以迫切的网络需求为出发点去规划和建设网络,背离了网络发展和演进的原则。广域网SDN架构演进也是如此,以需求为导向,尽量在满足需求的情况下去轻量化部署网络SDN架构。比如经常讨论到的在广域网SDN架构中,普遍认为差异化服务和流量调优要以隧道路径计算、隧道路径优化为基础去实现。我觉得基于隧道路径计算、优化的功能实现差异化服务和流量调优肯定是需要支持的,对于重点客户的精确化服务能力的实现也是有意义的。
但是面对大量客户成千上万的业务流量和承载隧道,调整起来会非常复杂,对控制器的要求会非常高,部署起来的困难可想而知。所以我觉得不管域内还是域间的差异化服务还是要以QOS能力为基础去实现,端到端给重要客户的业务流量配置高优先级,确保高优先级业务流量在网络承载能力不足、网络拥塞时被优先转发。所以,在没有明确的跨域隧道路径调优需求的场景下,完全不用开发超级控制器层,而只开发面向业务开通的编排层就可以,当然涉及到跨域业务开通时边界设备的配置对接,当然也要编排层协调分配一定的网络配置参数给到两个域的不同控制器。
3. SDN控制器高可靠部署架构
SDN控制器作为整个网络的大脑,高可靠部署非常重要。在单一的控制器内部,要通过集群或主备方式实现服务级高可靠保护,服务模块单节点故障时,SDN控制器功能不受影响。
同时要实现SDN控制器的异地灾备部署,在两个不同的物理位置分别部署主、备控制器,主备控制器间数据进行实时同步。主备控制器可以快速切换,主备切换时,原有业务不中断。
4. 总结
升级SDN架构,是网络智能化演进的基础,是广域网网络升级的必然途径和必选项。但受限于广域网多厂家混合组网的现状,广域网SDN架构升级是一个逐步升级和功能完善的过程,网络运营者可以根据各自实际的网络和业务情况去逐步推进SDN架构的部署与功能演进。 本文地址: https://www.linuxprobe.com/wan-sdn-architecture.html
「深度学习福利」大神带你进阶工程师,立即查看>>>
Xrdp是Microsoft远程桌面协议(RDP)的一个开源实现,它允许以图形方式控制远程系统。使用RDP,您可以登录到远程计算机并创建一个真正的桌面会话,就像您登录到本地计算机一样。 |
---|
系统环境 服务端: Centos 7.7 Minimal 客户端:Windows10
安装桌面环境
本实验中安装的系统没有安装桌面环境,我们需要自己安装,如果已经安装桌面了清跳过这一步。Centos7提供了"Cinnamon Desktop","MATE Desktop","GNOME Desktop","KDE Plasma Workspaces","LXQt Desktop","Xfce"让我们安装。
下面的 命令 列出可用环境组: [root@localhost ~]# yum grouplist Loaded plugins: fastestmirror There is no installed groups file. Maybe run: yum groups mark convert (see man yum) Loading mirror speeds from cached hostfile * base: mirrors.tuna.tsinghua.edu.cn * epel: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com Available Environment Groups: Minimal Install Compute Node Infrastructure Server File and Print Server Cinnamon Desktop MATE Desktop Basic Web Server Virtualization Host Server with GUI GNOME Desktop KDE Plasma Workspaces Development and Creative Workstation Available Groups: Cinnamon Compatibility Libraries Console Internet Tools Development Tools Educational Software Electronic Lab Fedora Packager General Purpose Desktop Graphical Administration Tools Haskell LXQt Desktop Legacy UNIX Compatibility MATE Milkymist Scientific Support Security Tools Smart Card Support System Administration Tools System Management TurboGears application framework Xfce Done
我们可以选择自己喜欢的桌面环境,在这里选择安装Xfce桌面: [root@localhost ~]# yum -y install epel-release && yum groupinstall Xfce
安装Xrdp [root@localhost ~]# yum -y install xrdp
安装完成之后,设置开机启动并启动xrdp [root@localhost ~]# systemctl start xrdp && systemctl enable xrdp
创建~/.Xclients,设置默认启动xfce4桌面 [root@localhost ~]# echo "xfce4-session" > ~/.Xclients [root@localhost ~]# chmod +x .Xclients
在客户端远程连接
总结
安装Xrdp服务器允许您通过图形界面从本地管理CentOS 7服务器。
本文原创地址: https://www.linuxprobe.com/centos7-xrdp-remote-desktop.html 编辑:逄增宝,审核员:逄增宝
「深度学习福利」大神带你进阶工程师,立即查看>>>
我们程序员在工作生活中,有很多场合下需要绘制图表,比如PPT里的图表,学习笔记的一些助记图,还有最常见的,工作中大量使用的流程图。
在 Window 下,我们有很多好用的工具,比如 Visio 、 EA 等等。这些软件也很好用,但都有个缺点,那就是太复杂。我们需要一定的美工基础,还要学很多软件操作,才能画出一张很简单的流程图。
而且,更要命的是,一旦需求发生变动,很不好修改,往往牵一发而动全身。所以经常在听到需求变更的时候,良许就脊背一凉……
后来,在大神的介绍下,良许开始使用一个神器。这个神器不需要你懂美工,也不太需要懂软件操作,绘图的过程跟你写软件的过程差不多,短短的几行代码,就能把你头脑里的想法表现出来。
而且,不用担心布局,不用担心修改,甚至都不用鼠标,也给制作出相当精美的作品!
这个神器就是: dot 命令!
这个神器还有个图形界面版,叫 Graphviz ,但良许习惯了命令行,一般是在命令行下完成的。
我们先来看下它能做什么。以下几个图片选自它的官网:
这只是其中的几张图而已,更多图片可以去它的官网查看: http://www.graphviz.org
这个软件非常强大,如果掌握得好的话,可以画出非常好看的作品,而且还不怕产品经理改需求。但是,在大多数情况下,我们不太需要用到它的高级功能,往往一些很基础的功能就可以应付我们工作中的 80% 以上的需求了。
这个软件的安装很简单,只需执行以下命令即可: sudo apt install graphviz
稍等一小会儿,就安装成功了。然后,就可以愉快地玩耍啦~
我们先来看看一个 Hello world 水平的作品。
首先,在任意位置创建一个 test.dot 文件(当然也可以叫其它名字),文件的内容如下: graph g{ "Hello" -- "world" }
然后,执行以下命令: dot -Tpng -o test.png test.dot
之后,就在当前目录下生成了下面这幅最简单的图片了,是不是非常简单?
我们来简单介绍下 DOT 命令的语法。在 test.dot 文件里, graph 表示的是这幅图是 无向图 ,也就是连接线是没有箭头的。与之对应的是 digraph ,表示 有向图 ,连接线是有箭头的。
而图片的描述,是在 {} 里进行,并且也支持注释,注释风格与 C 语言类似, // 用于单行注释, /**/ 用于多行注释。
前文提到,dot 命令十分强大,这里只介绍它的最基本的一些用法,而学会这些最基本的命令,就可以应对 80% 左右的工作。更多高级用法可以参考它的官网。
节点
类似于脚本语言,节点无需申明就可以直接使用。而对于节点,我们一般设置它的以下几个属性: shape 形状 label 标签 style 类型,填充还是非填充 color 线条颜色 fillcolor 填充颜色
这些属性是在节点后的一对方括号 [] 里设置的。很多情况下,我们的节点属性是完全相同的,那么我们可以定义一个 node ,并对它进行设置,那么图形里所有节点属性都跟 node 一样。如果某个节点想搞特殊,只需单独对它进行设置即可。 graph g{ node [shape = "box", style = "filled", color = "red", fillcolor = "green"] //设置节点的默认形状,类型,颜色,填充颜色 a [shape = "ellipse", fillcolor = "yellow", label = "Hello"] //对某个节点进行单独设置 b [label = "world"] a -- b a -- c //不对c进行设置,使用默认属性 d [shape = "circle",label = "cicle"] //d单独设置属性 c -- d }
连接线
连接线依照有无箭头分为有向边和无向边。它的常用属性有如下: style 类型,实线还是虚线 color 连接线颜色 label 标签 labelfontcolor 标签字体颜色 headlabel 起始标签内容 taillabel 结束标签内容 decorate 标签与连接线之间有连线标注
对于有向边,还可以设置起点及终点的位置,用 e, s, w, n 表示 东南西北 ,也可以组合来表示,详细请看下面实例。
和节点类似,连接线也可以设置默认属性,用 edge 表示。如果不使用默认属性的话,也可以自定义属性。 digraph edge_settings { edge [color = "green", decorate = false] //设置边的默认属性 node [shape = "polygon", sides = 4, color = "blue"] a -> b [style = "dotted", color = "red", label = "a to b"] //设置style、color、label b: se -> c: w [headlabel = "end", taillabel = "start"] //设置边从b的“东南方”出发,从c的“西方”结束,设置有向边起点和终点的label {c, f} -> {d, e} [label = "multi-lines", decorate = true] //可以用这种方式同时画多条边 }
图
DOT语言可以描述无向图和有向图两种图,graph标识无向图,digraph标识有向图。对于图的属性设置,常用的有以下一些: size 尺寸 label 标签 labelloc 标签位置,通常设置为 t (顶),或 b (底) labeljust 标签对齐,比如左对齐、右对齐、居中,等等 bgcolor 背景颜色 rankdir 布局,比如从左往右,或者从上往下
图里面还可以包含子图,子图必须以 cluster 作为前缀开始。比如官网首页上的图,即本文第一张图,就是图里包含子图,它的源码如下: digraph graph_settings { start [shape = "Mdiamond"] end [shape = "Msquare"] subgraph cluster_sub1 { label = "process #1" labelloc = "t" bgcolor = "gray55" node [style = "filled", color = "white"] a0 -> a1 -> a2 -> a3 -> a0 } subgraph cluster_sub2 { label = "process #2" labelloc = "t" color = "blue" node [style = "filled", color = "black", fillcolor = "gray55"] b0 -> b1 -> b2 -> b3 } start -> {a0, b0} a1 -> b3 b2 -> a3 {a3, b3} -> end }
小结
利用 dot 命令来绘图,非常省事,也非常灵活,对于设计菜鸟而言,简直不能太方便!它的功能十分强大,本文所介绍的只是它非常常用,但也是非常实用的一些基本功能,掌握这些功能就能应对工作中绝大部分的场景。但想要做出更加炫酷的效果,还需要再细细研究它官网的资料。
最后,最近很多小伙伴找我要 Linux学习路线图 ,于是我根据自己的经验,利用业余时间熬夜肝了一个月,整理了一份电子书。无论你是面试还是自我提升,相信都会对你有帮助!目录如下:
免费送给大家,只求大家金指给我点个赞!
电子书 | Linux开发学习路线图
也希望有小伙伴能加入我,把这份电子书做得更完美!
有收获?希望老铁们来个三连击,给更多的人看到这篇文章
推荐阅读: 干货 | 程序员进阶架构师必备资源免费送 神器 | 支持搜索的资源网站
「深度学习福利」大神带你进阶工程师,立即查看>>>
背景
由于工作需要,要一次性导出机器上全部的镜像。
导出命令 #!/bin/sh #docker save $(docker images --format '{{.Repository}}:{{.Tag}}') -o allinone.tar IMAGES=$(docker images --format '{{.Repository}}:{{.Tag}}') for element in ${IMAGES[@]} do echo "saving ${element} ..." docker save ${element} >> allinone.tar echo "${element} saved" done
注意: 1、docker images name 和 tag都为none会报错: Error response from daemon: invalid reference format
参考资料及附录 How to save all Docker images and copy to another machine shell 数组遍历的3种方法
本文由 qingchuwudi 译制或原创,除非另有声明,在不与原著版权冲突的前提下,本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
「深度学习福利」大神带你进阶工程师,立即查看>>>
libstdc++.so.6: version `GLIBCXX_3.4.20' not found
libstdc++.so.6: version `GLIBCXX_3.4.20' not found
参考链接:
(1) 解决/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found的问题方法总结 。
(2) /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found问题解决方法 。
一、错误发生情景:
启动xunsearch时,执行./xs-ctl.sh start命令,报如下错误: ... /usr/lib64/libstdc++.so. 6 : version `GLIBCXX_3. 4.20 ' not found ...
二、错误原因:
编译GCC源码升级GCC版本后出现的该问题, 这是由于GCC升级后标准库还是旧的导致的。
三、解决:
更新标准库:
1、进入到安装的新的GCC的目录中:cd /usr/local/gcc-8.3.0
2、进入到库目录:cd lib64 (注意:系统如果是64位的就进入到lib64目录,否则进入到lib目录)
3、查看当前库的最搭版本:ls,结果看到:libstdc++.so.6.0.25
4、复制到系统默认的库目录下:
cp libstdc++.so.6.0.25 /usr/lib64/ (注意:系统如果是32:cp libstdc++.so.6.0.25 /usr/lib/)
5、进入到/usr/lib64下,查看相关的版本信息 :
ls -l | grep libstdc++
结果:
... libstdc++.so.6 -> libstdc++.so.6.0.13
... libstdc++.so.6.0.13
... libstdc++.so.6.0.25
6、删除旧的软连接:
rm -f libstdc++.so.6
7、建立新的软连接:
ln -s libstdc++.so.6.0.25 libstdc++.so.6
8、查看标准库最新的版本:
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX GLIBCXX_3. 4 GLIBCXX_3. 4.1 . . . GLIBCXX_3. 4.24 GLIBCXX_3. 4.25 GLIBCXX_FORCE_NEW GLIBCXX_DEBUG_MESSAGE_LENGTH
分类: Linux
「深度学习福利」大神带你进阶工程师,立即查看>>>
Centos 7 中高版本 libstdc++.so.6下载地址(解决报错:version’GLIBCXX_3.4.20’) 2019-8-5 linux 网络运维 14899次访问
很软件在centos下安装时容易提示缺失 libstdc++.so.6: version’GLIBCXX_3.4.20’的问题,比如AWVS Acunetix Web Vulnerability Scanner(简称 AWVS ),或Anaconda。
查看该文件时发现,只到 GLIBCXX_3 .4 . 19 [ root@izwz9czzkx9v1z5d7esa0fz ~ ] # strings /usr/lib64/libstdc++.so.6 |grep GLIBCXX GLIBCXX_3 .4 GLIBCXX_3 .4 . 1 GLIBCXX_3 .4 . 2 GLIBCXX_3 .4 . 3 GLIBCXX_3 .4 . 4 GLIBCXX_3 .4 . 5 GLIBCXX_3 .4 . 6 GLIBCXX_3 .4 . 7 GLIBCXX_3 .4 . 8 GLIBCXX_3 .4 . 9 GLIBCXX_3 .4 . 10 GLIBCXX_3 .4 . 11 GLIBCXX_3 .4 . 12 GLIBCXX_3 .4 . 13 GLIBCXX_3 .4 . 14 GLIBCXX_3 .4 . 15 GLIBCXX_3 .4 . 16 GLIBCXX_3 .4 . 17 GLIBCXX_3 .4 . 18 GLIBCXX_3 .4 . 19 GLIBCXX_DEBUG_MESSAGE_LENGTH
其实方法网上很多教程都讲到了,就是将 libstdc++.so.6 软连接链接到一个高版本的动态库文件,但基本上都说了方法,但没有放出一个可用的版本出来,所以很多时候还得去下载一个 anaconda 来从里面找这个版本的动态库文件,就比较费事。
这里直接把从anaconda中找到了一个支持到GLIBCXX_3.4.26 的 文件,实测可用(版本centos 7.6)
下载地址
libstdc++.so.6.0.26 2019.8.5 – 3.97 Mb
去打赏
「深度学习福利」大神带你进阶工程师,立即查看>>>
安全性对任何产品来说都非常重要,比如著名的HeartBleed就曾经给很多忽视安全问题的企业带来了很大的影响。而随着容器化的推进,早在2015年的一次调查中,研究者就曾发现取样的Dockerhub上有30%-40%的镜像存在安全性的问题。Anchore正是这样一款针对容器的安全扫描的工具,类似于Docker在其收费版中提供的功能那样,能对应用容器的脆弱性进行静态扫描,同时支持whitelist/blacklist以及评估策略的设定。
项目地址
项目 详细 项目地址 https://github.com/anchore/anchore
开发语言 License
Python Apache 2
为什么使用Anchore
随着容器化的逐渐推进,使用的安全性也受到越来越多地重视。在很多场景下,都需要对容器的脆弱性进行扫描,比如
项目 详细
镜像来源不明 生产环境的实践
在互联网上下载的镜像,可以直接使用,非常的方便,但是是否真正安全还非常难说 容器上到生产环境之后,生产环境对容器的安全性要求一般较高,此时需要容器的安全性得到保证
依赖条件
以下列出本文安装Anchore所需的依赖
依赖 详细 CentOS版本 CentOS 7
Docker版本 | >1.10 |
---|
epel-release | yum install epel-release |
rpm-python | yum install rpm-python dpkg | python-pip yum install dpkg | yum install python-pip |
工作原理
通过对容器的layer进行扫描,发现漏洞并进行预警,其使用数据是基于Common Vulnerabilities and Exposures数据库(简称CVE), 各Linux发行版一般都有自己的CVE源,而Anchore则是与其进行匹配以判断漏洞的存在与否,比如HeartBleed的CVE为:CVE-2014-0160, Anchore通过query 命令的 cve-scan选项可以对镜像的CVE进行扫描。
运行方式
Anchore支持两种方式
项番 方式
镜像方式 普通安装
使用Anchore的镜像 使用yum或者apt等直接安装
事前准备
docker版本 [root@liumiaocn ~] # docker version Client: Version: 1.12 .6 API version: 1.24 Package version: docker- 1.12 .6 - 32. git88a4867 .el 7 .centos .x 86_64 Go version: go1 .7 .4 Git commit: 88 a4867/ 1.12 .6 Built: Mon Jul 3 16 : 02 : 02 2017 OS/Arch: linux/amd64 Server: Version: 1.12 .6 API version: 1.24 Package version: docker- 1.12 .6 - 32. git88a4867 .el 7 .centos .x 86_64 Go version: go1 .7 .4 Git commit: 88 a4867/ 1.12 .6 Built: Mon Jul 3 16 : 02 : 02 2017 OS/Arch: linux/amd64 [root@liumiaocn ~] #
运行
Step 1: 使用pip安装Anchore [root@liumiaocn ~] # pip install anchore Collecting anchore Downloading anchore- 1.1 .3 -py2-none-any.whl (184kB) 100 % |████████████████████████████████| 194kB 45kB/s Collecting click (from anchore) Downloading click- 6.7 -py2.py3-none-any.whl (71kB) 100 % |████████████████████████████████| 71kB 51kB/s Requirement already satisfied (use --upgrade to upgrade): pyyaml in /usr/lib64/python2.7/site-packages (from anchore) Collecting docker-py (from anchore) Downloading docker_py- 1.10 .6 -py2.py3-none-any.whl (50kB) 100 % |████████████████████████████████| 51kB 63kB/s Collecting requests< 2.11 (from anchore) Downloading requests- 2.10 .0 -py2.py3-none-any.whl (506kB) 100 % |████████████████████████████████| 512kB 44kB/s Collecting clint (from anchore) Downloading clint- 0.5 .1 .tar.gz Collecting prettytable (from anchore) Downloading prettytable- 0.7 .2 .zip Requirement already satisfied (use --upgrade to upgrade): websocket-client>= 0.32 .0 in /usr/lib/python2.7/site-packages (from docker-py->anchore) Requirement already satisfied (use --upgrade to upgrade): backports.ssl-match-hostname>= 3.5 ; python_version < "3.5" in /usr/lib/python2.7/site-packages (from docker-py->anchore) Requirement already satisfied (use --upgrade to upgrade): ipaddress>= 1.0 .16 ; python_version < "3.3" in /usr/lib/python2.7/site-packages (from docker-py->anchore) Requirement already satisfied (use --upgrade to upgrade): six>= 1.4 .0 in /usr/lib/python2.7/site-packages (from docker-py->anchore) Requirement already satisfied (use --upgrade to upgrade): docker-pycreds>= 0.2 .1 in /usr/lib/python2.7/site-packages (from docker-py->anchore) Collecting args (from clint->anchore) Downloading args- 0.1 .0 .tar.gz Installing collected packages: click, requests, docker-py, args, clint, prettytable, anchore Found existing installation: requests 2.11 .1 Uninstalling requests- 2.11 .1 : Successfully uninstalled requests- 2.11 .1 Running setup.py install for args ... done Running setup.py install for clint ... done Running setup.py install for prettytable ... done Successfully installed anchore- 1.1 .3 args- 0.1 .0 click- 6.7 clint- 0.5 .1 docker-py- 1.10 .6 prettytable- 0.7 .2 requests- 2.10 .0 You are using pip version 8.1 .2 , however version 9.0 .1 is available. You should consider upgrading via the 'pip install --upgrade pip' command. [root@liumiaocn ~] # [root @liumiaocn ~] # anchore --version anchore, version 1.1 . 3 [root @liumiaocn ~] #
Step 3:初期化Anchore的Database
使用feeds sync命令,可以看出Anchore从不同的Linux发行版中取出相应的CVE等的信息存到其Database的过程如下: [root@liumiaocn ~] # anchore feeds sync syncing data for subscribed feed (vulnerabilities) ... syncing group data: debian:unstable: ... skipping group data: ubuntu: 16.04 : ... skipping group data: centos: 6 : ... skipping group data: centos: 7 : ... skipping group data: centos: 5 : ... skipping group data: ubuntu: 14.10 : ... skipping group data: ubuntu: 15.04 : ... skipping group data: debian: 9 : ... syncing group data: debian: 8 : ... syncing group data: ubuntu: 12.04 : ... syncing group data: debian: 7 : ... syncing group data: ubuntu: 16.10 : ... syncing group data: alpine: 3.3 : ... syncing group data: alpine: 3.4 : ... syncing group data: alpine: 3.5 : ... syncing group data: alpine: 3.6 : ... syncing group data: ol: 6 : ... syncing group data: ubuntu: 14.04 : ... syncing group data: ubuntu: 15.10 : ... syncing group data: ubuntu: 12.10 : ... syncing group data: ubuntu: 17.04 : ... syncing group data: ol: 7 : ... syncing group data: ubuntu: 13.04 : ... syncing group data: ol: 5 : ... skipping data sync for unsubscribed feed (packages) ... [root@liumiaocn ~] #
镜像准备
随便找一个镜像,作为用来进行扫描的对象,本次扫描使用Clair中使用的Database的镜像源。 [root @liumiaocn ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/postgres latest 33 b13ed6b80a 5 days ago 268.8 MB [root @liumiaocn ~] #
对镜像进行分析 [root @liumiaocn ~] # anchore analyze --image docker.io/postgres:latest --imagetype base Analyzing image: docker.io/ postgres: latest 33 b13ed6b80a: analyzed. [root @liumiaocn ~] #
生成结果报告 [root@liumiaocn ~] # anchore gate --image docker.io/postgres:latest 33 b13ed6b80a: evaluating policies ... +--------------+---------------------------+-----------------+-------------+-------------------------------------+-------------+ | Image Id | Repo Tag | Gate | Trigger | Check Output | Gate Action | +--------------+---------------------------+-----------------+-------------+-------------------------------------+-------------+ | 33b13ed6b80a | docker.io/postgres:latest | DOCKERFILECHECK | FROMSCRATCH | 'FROM' container is 'scratch' - | GO | | | | | | (scratch) | | | 33b13ed6b80a | docker.io/postgres:latest | ANCHORESEC | VULNLOW | Low Vulnerability found in package | GO | | | | | | - coreutils (CVE-2016-2781 - https | | | | | | | ://security-tracker.debian.org/trac | | | | | | | ker/CVE-2016-2781) | | | 33b13ed6b80a | docker.io/postgres:latest | ANCHORESEC | VULNUNKNOWN | Negligible Vulnerability found in | GO | | | | | | package - login (CVE-2007-5686 - | | | | | | | https://security-tracker.debian.org | | | | | | | /tracker/CVE-2007-5686) | | | 33b13ed6b80a | docker.io/postgres:latest | ANCHORESEC | VULNUNKNOWN | Negligible Vulnerability found in | GO | | | | | | package - passwd (CVE-2007-5686 - | | | | | | | https://security-tracker.debian.org | | | | | | | /tracker/CVE-2007-5686) | | | 33b13ed6b80a | docker.io/postgres:latest | ANCHORESEC | VULNMEDIUM | Medium Vulnerability found in | WARN | | | | | | package - libxml2 (CVE-2017-9048 - | | | | | | | https://security-tracker.debian.org | | | | | | | /tracker/CVE-2017-9048) | | | 33b13ed6b80a | docker.io/postgres:latest | ANCHORESEC | VULNMEDIUM | Medium Vulnerability found in | WARN | | | | | | package - libxml2 (CVE-2017-9049 - | | | | | | | https://security-tracker.debian.org | | | | | | | /tracker/CVE-2017-9049) | | | 33b13ed6b80a | docker.io/postgres:latest | ANCHORESEC | VULNUNKNOWN | Negligible Vulnerability found in | GO | | | | | | package - python2.7 (CVE-2013-7040 | | | | | | | - https://security-tracker.debian.o | | | | | | | rg/tracker/CVE-2013-7040) | | | 33b13ed6b80a | docker.io/postgres:latest | ANCHORESEC | VULNHIGH | High Vulnerability found in package | STOP | | | | | | - libsqlite3-0 (CVE-2017-10989 - | | | | | | | https://security-tracker.debian.org | | | | | | | /tracker/CVE-2017-10989) | | ... | 33b13ed6b80a | docker.io/postgres:latest | ANCHORESEC | VULNUNKNOWN | Unknown Vulnerability found in | GO | | | | | | package - locales (CVE-2017-12132 - | | | | | | | https://security-tracker.debian.org | | | | | | | /tracker/CVE-2017-12132) | | | 33b13ed6b80a | docker.io/postgres:latest | FINAL | FINAL | | STOP | +--------------+---------------------------+-----------------+-------------+-------------------------------------+-------------+
确认CVE [root@liumiaocn ~]# anchore query --image docker.io/postgres:latest cve-scan all +------------------+ ------------ +-----------------+ ---------------------------- +---------------+ ---------------------------- +----------------+ ----------------------------+ | CVE ID | Severity | *Total Affected | Vulnerable Package | Fix Available | Fix Images | Rebuild Images | URL | +------------------+------------+-----------------+----------------------------+---------------+----------------------------+----------------+----------------------------+ | CVE-2017-9525 | Medium | 1 | cron-3.0pl1-127+deb8u1 | None | 33b13ed6b80a(docker.io/pos | None | https://security-tracker.d | | | | | | | tgres:latest) | | ebian.org/tracker/CVE-2017 | | | | | | | | | -9525 | | CVE-2017-9050 | Medium | 1 | libxml2-2.9.1 +dfsg1-5+ deb8 | None | 33b13ed6b80a(docker.io/pos | None | https://security-tracker.d | | | | | u4 | | tgres:latest) | | ebian.org/tracker/CVE-2017 | | | | | | | | | -9050 | | CVE-2017-9049 | Medium | 1 | libxml2-2.9.1 +dfsg1-5+ deb8 | None | 33b13ed6b80a(docker.io/pos | None | https://security-tracker.d | | | | | u4 | | tgres:latest) | | ebian.org/tracker/CVE-2017 | | | | | | | | | -9049 | ... | CVE-2004-0971 | Negligible | 1 | krb5-locales-1.12.1+dfsg-1 | None | 33b13ed6b80a(docker.io/pos | None | https://security-tracker.d | | | | | 9+deb8u2 | | tgres:latest) | | ebian.org/tracker/CVE-2004 | | | | | | | | | -0971 | +------------------+------------+-----------------+----------------------------+---------------+----------------------------+----------------+----------------------------+
总结
本文简单介绍了Anchore这款针对于镜像的安全工具的安装到使用方法,而Anchore的功能不仅限于此,在DevOps落地的时候引入Anchore作为其中的一环对镜像的安全保驾护航不算是一个坏的注意。
「深度学习福利」大神带你进阶工程师,立即查看>>>
根据绿盟2018年3月的研究显示,目前Docker Hub上的镜像76%都存在漏洞,其研究人员拉取了Docker Hub上公开热门镜像中的前十页镜像,对其使用Docker镜像安全扫描工具Clair进行了CVE扫描统计。结果显示在一百多个镜像中,没有漏洞的只占到24%,包含高危漏洞的占到67%。很多我们经常使用的镜像都包含在其中,如:Httpd,Nginx,Mysql等等。
本文将介绍这块由CoreOS官方推出的容器静态安全漏洞扫描工具Clair,该工具也被多款docker registry集成,比如VMware中国开源的Harbor(CNCF成员项目)、Quary以及Dockyard等。
下面将从系统架构、处理流程、落地方式以及使用建议向大家介绍clair,希望能够为容器安全落地提供一种选择。
系统架构
Clair主要包括以下模块: 获取器(Fetcher)- 从公共源收集漏洞数据 检测器(Detector)- 指出容器镜像中包含的Feature 容器格式器(Image Format)- Clair已知的容器镜像格式,包括Docker,ACI 通知钩子(Notification Hook)- 当新的漏洞被发现时或者已经存在的漏洞发生改变时通知用户/机器 数据库(Databases)- 存储容器中各个层以及漏洞 Worker - 每个Post Layer都会启动一个worker进行Layer Detect
工作流程
整体处理流程如下: Clair定期从配置的源获取漏洞元数据然后存进数据库。 客户端使用Clair API处理镜像,获取镜像的特征并存进数据库。 客户端使用Clair API从数据库查询特定镜像的漏洞情况,为每个请求关联漏洞和特征,避免需要重新扫描镜像。 当更新漏洞元数据时,将会有系统通知产生。另外,还有webhook用于配置将受影响的镜像记录起来或者拦截其部署。
落地方式
Clair可以直接集成到容器仓库中,以便仓库负责代表用户与Clair进行交互。这种类型的设置避免了手动扫描,并创建了一个合理的接收端以便Clair的漏洞通知到位。仓库还可用于授权,以避免泄露用户不应当访问的镜像漏洞信息。Clair可以集成到CI/CD管道中,如此一来当生成镜像时,将镜像推送到仓库之后触发Clair扫描该镜像的请求。 集成思路如下: 用户推送镜像到容器仓库,仓库根据设置的黑白名单选择是否调用Clair进行扫描 一旦触发Clair扫描,则等待扫描结果返回,然后通知用户 如果发现漏洞,则CI也同时阻止CD流程启动,否则CD流程开启
部署方式
主要有kubernetes和本地部署这两种方式。
服务端 k8s cluster
git clone https://github.com/coreos/clair cd clair/contrib/helm cp clair/values.yaml ~/my_custom_values.yaml vi ~/my_custom_values.yaml helm dependency update clair helm install clair -f ~/my_custom_values.yaml local
$ mkdir $PWD/clair_config $ curl -L https://raw.githubusercontent.com/coreos/clair/master/config.yaml.sample -o $PWD/clair_config/config.yaml $ docker run -d -e POSTGRES_PASSWORD="" -p 5432:5432 postgres:9.6 $ docker run --net=host -d -p 6060-6061:6060-6061 -v $PWD/clair_config:/config quay.io/coreos/clair-git:latest -config=/config/config.yaml
客户端
上面介绍的只是Clair的服务端,投入应用还需额外的客户端。目前从官方列出的 衍生开发工具 里,已经有非常多的选择。 官方客户端clairctl 测试效果如下:
clairctl analyze -l cve-2017-11610_web Image: /cve-2017-11610_web:latest Unknown: 80 Negligible: 235 Low: 195 Medium: 418 High: 161 Critical: 0 Defcon1: 0 clair api 3.0 写的不怎么清楚,目前还能在coreos官网上查到 api v1版本的文档 ,但是对于使用新版已经没意义了,因为改变太大了。 klar ,只支持跟registry集成。 yair ,只支持跟registry集成,yair是用python写的,可以自己修改。 analyze-local-images:命令行,但是被放弃了 ,只支持clair v1/v2。
综合来看,clairctl的功能比较丰富,而且社区比较活跃,能保持与clair的及时更新,因此建议选择clairctl,由于其本身使用golang开发,因此也可以根据自己的CI/CD场景做二次开发。
例如下图:
下面简单介绍clairctl的安装方式,具体使用方法可参考官方wiki。 主分支版本 curl -L https:// raw.githubusercontent.com /jgsqware/clairctl/master/install.sh | sh Docker-compose
$ git clone git@github.com:jgsqware/clairctl.git $GOPATH/src/github.com/jgsqware/clairctl $ cd $GOPATH/src/github.com/jgsqware/clairctl $ docker-compose up -d postgres
使用建议 master不太稳定,不适合生产环境,建议使用release版本,目前最新版本是 https:// github.com/coreos/clair /tree/release-2.0 由于Clair会根据CVE库扫是Docker镜像使用的内核,但是实际上容器使用的是宿主的内核,这样可能产生大量无用漏洞或者误报,但是根据Clair开发组的意思,他们把决定权交给用户,默认不提供白名单机制,也不对此做区分。 第一次启动要下载数据到数据库,下载时间根据网络好坏确定。可以用 https:// github.com/arminc/clair -local-scan 替换clair官方db镜像。 检测到很多内核漏洞,但实际上可以不处理。但是clair决定不过滤任何东西,而是交给用户决定,这样一来,用户二次开发,增加黑白名单机制在所难免。
参考资料
Docker安全第一话--镜像安全 - CSDN博客
coreos/clair
jgsqware/clairctl
「深度学习福利」大神带你进阶工程师,立即查看>>>
gitlab
gitlab 主要服务构成
工作流程
gitlab 安装配置管理
上图是 关闭防火墙,并禁止开机启动
上图就是 修改 gitlab 的http 并对其进行重启让配置生效
以上步骤就是 配置gitlaba 的 SSL 和域名了的大概步骤了
通过rpm 安装,感觉更方便
而且一般来说都是内部使用,也不用到 SSL的,就是这样简单方便
https://blog.csdn.net/qq_40025218/article/details/81360794
gitlab 的应用
可以在 gitlab 上面 创建用户,指定角色, 一般是创建 开发用户和leader 用户。
开发用户clone 代码,创建分支,提交代码,请求合并到主分支
leader 审核代码,通过就合并到 主分支上面了
git 克隆指定 用户 :
git clone http://dev:12345678@192.168.0.205/root/test-repo.git
https://blog.csdn.net/cmzhuang/article/details/90214787
Ansible
chef 需要ruby 基础,不会ruby 不推荐使用
ansible 适合敏捷开发概念,兼容主流技术
ansible 优势与应用场景
ansible 配合virtualenv安装配置
这样比较安全,且让 ansible 比较稳定
以上的步骤,会比较可靠,避免了 软件冲突等(可以确保ansible可以在一个稳定的独立的环境里面跑)。 Python2.x 也是可以安装 ansible 的
pip install ansible
简单的安装方式可以参考以下。 而且Python2.x 也是可以安装 ansible 的
https://www.cnblogs.com/easonscx/p/10622781.html # yum -y install python-pip python-devel # pip install ansible ansible程序文件 /usr/bin/ansible: 命令行工具 ansible命令通用格式: ansible [options] [-m module_name] [-a args] /usr/bin/ansible-doc: 帮助文档 /usr/bin/ansible-playbook: 剧本执行工具 /etc/ansible/ansible.cfg: 主配置文件 /etc/ansible/hosts: 管理的主机清单 /etc/ansible/roles: 角色存放处 查看ansible命令帮助 [root@ansible-server ~]# ansible -h 查看支持的模块 [root@ansible-server ~]# ansible-doc -l [root@ansible-server ~]# ansible-doc -l|grep copy #查看copy模块 查看ansible的支持的模块个数 [root@ansible-server ~]# ansible-doc -l |wc -l 2080 查看ansible版本 [root@ansible-server ~]# ansible --version ansible 2.7.8 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
playboos 入门和编写规范
上图就是 将项目部署到 目标机器的脚本。 必须进入 对应目录下 test_playbooks 部署目录工程下 [root@c75 test_playbooks]# ansible-playbook -i inventory/testenv ./deploy.yml
playbooks常用模块介绍
state=touch 就是创建文件
mode 就是 赋予权限
force=yes 就是强制执行
command 与shell 区别: command 不能使用 重定向符 <
推荐使用 shell
这样可以根据不同环境,灵活 配置变量来灵活部署
demo:
jenkins
jenkins 安装配置管理
java1.8 以上
jenkins 以war包安装
https://www.jenkins.io/zh/download/
https://jingyan.baidu.com/article/d169e186525b50436711d850.html java -jar jenkins.war 启动
https://blog.csdn.net/qq_36696616/article/details/103062010
指定端口 java -jar jenkins.war --ajp13Port=-1 --httpPort=8580
管理员初始密码 所在文件 /root/.jenkins/secrets/initialAdminPassword
选择Jenkins 推荐的插件即可
jenkins job
pipleline job: 满足持续集成与持续交付
yum install git curl
保证Jenkins 可以与 gitlab 正常交互
pipeline job 构建
agent : any 就是随便在一台jenkins 主机上面构建
即流水线 类型
测试脚本例子 #!groovy pipeline { agent {node {label 'master'}} environment { PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin" } parameters { choice( choices: 'dev\nprod', description: 'choose deploy environment', name: 'deploy_env' ) string (name: 'version', defaultValue: '1.0.0', description: 'build version') } stages { stage("Checkout test repo") { steps{ dir ("${env.WORKSPACE}") { git branch: 'master', credentialsId:"2e3d22a5-4307-4c2c-9161-3ec90109771e", url: 'http://root@192.168.0.205/root/test-repo.git' } } } stage("Print env variable") { steps { dir ("${env.WORKSPACE}") { sh """ echo "[INFO] Print env variable" echo "Current deployment environment is $deploy_env" >> test.properties echo "The build is $version" >> test.properties echo "[INFO] Done..." """ } } } stage("Check test properties") { steps{ dir ("${env.WORKSPACE}") { sh """ echo "[INFO] Check test properties" if [ -s test.properties ] then cat test.properties echo "[INFO] Done..." else echo "test.properties is empty" fi """ echo "[INFO] Build finished..." } } } } }
jenkins linux shell
即可以将 平时用到shell 脚本都放入到这里面进行统一维护和管理,和进行开发测试
即 选择一个 freestyle job ,在构建的时候选择 shell ,写入 shell 内容即可
jenkins git和maven 集成
git 集成就是 建立job的时候, 配置git 的代码仓库即可
之后在jenkins 的服务器的系统里面安装maven 和java
配置jenkins 的全局 maven和java
在构建项目的时候,选择 git的maven项目,配置maven
执行构建,就OK了
jenkins ansible 集成
建立一个job ,即使用 jenkins的 shell 来调用 ansible 这样就集成了。就可以对远程的服务器进行部署功能了
demo: /mySoft/autoRunProject/coding-253/jenkens-app 下有一个文件 testservers 内容如下 : [testserver] c75 ansible_user=root # 远程主机ip , 与 执行 ansible的 用户名 jenkins 的job shell 内容: #!/bin/sh cd /mySoft/autoRunProject/coding-253/jenkens-app ansible --version ansible-playbook --version cat testservers ansible -i testservers testserver -m command -a "ip addr" # 远程执行c75 服务器,并加载模块 command 执行命名 ip addr . 这是一个测试远程服务器的 脚本
以上就是集成 ansible的简单例子
实战demo
freestyle job 实战 : nginx 配置更新
anisble 配置 deploy.yml: - hosts: "nginx" gather_facts: true remote_user: root roles: - nginx role : main.yml - name: Disable system firewall service: name=firewalld state=stopped - name: Disable SELINUX selinux: state=disabled - name: setup nginx yum source yum: pkg=epel-release state=latest - name: write then nginx config file template: src=roles/nginx/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf - name: create nginx root folder file: 'path={{ root }} state=directory owner={{ user }} group={{ user }} mode=0755' - name: copy index.html to remote copy: 'remote_src=no src=roles/nginx/files/index.html dest=/www/index.html mode=0755' - name: restart nginx service service: name=nginx state=restarted - name: run the health check locally shell: "sh roles/nginx/files/health_check.sh {{ server_name }}" delegate_to: localhost register: health_status - debug: msg="{{ health_status.stdout }}" nginx.conf.j2 模板内容: # For more information on configuration, see: user {{ user }}; worker_processes {{ worker_processes }}; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections {{ max_open_file }}; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # Load config files from the /etc/nginx/conf.d directory # The default server is in conf.d/default.conf #include /etc/nginx/conf.d/*.conf; server { listen {{ port }} default_server; server_name {{ server_name }}; #charset koi8-r; #access_log logs/host.access.log main; location / { root {{ root }}; index index.html index.htm; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } }
jenkins freestyle job #/bin/sh cd $WORKSPACE ansible --version ansible-playbook --version ansible-playbook -i inventory/$deploy_env ./deploy.yml -e project=nginx -e branch=$branch -e env=$deploy_env
pipeline job 自动化部署 mysql-php wordpress 例子
基本都是 使用 jenkins 拉git代码(即编写好的 ansible的部署脚本 (脚本可以在里面拉项目的代码,进行编译打包远程部署) ) ,
编译好之后, 执行 ansible的 部署脚本执行
jenkins 部署脚本 #!groovy pipeline { agent {node {label 'master'}} # 指定执行的 jenkins 节点 environment { PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin" } parameters { choice( choices: 'dev\nrprod', description: 'Choose deploy environment', name: 'deploy_env' ) string (name: 'branch', defaultValue: 'master', description: 'Fill in your ansible repo branch') } stages { stage ("Pull deploy code") { steps{ sh 'git config --global http.sslVerify false' dir ("${env.WORKSPACE}"){ # 拉代码 git branch: 'master', credentialsId: '9aa11671-aab9-47c7-a5e1-a4be146bd587', url: 'https://gitlab.example.com/root/ansible-playbook-repo.git' } } } stage ("Check env") { steps { sh """ set +x user=`whoami` if [ $user == deploy ] then echo "[INFO] Current deployment user is $user" source /home/deploy/.py3-a2.5-env/bin/activate source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q echo "[INFO] Current python version" python --version echo "[INFO] Current ansible version" ansible-playbook --version echo "[INFO] Remote system disk space" ssh root@test.example.com df -h echo "[INFO] Rmote system RAM" ssh root@test.example.com free -m else echo "Deployment user is incorrect, please check" fi set -x """ } } stage ("Anisble deployment") { steps { input "Do you approve the deployment?" dir("${env.WORKSPACE}/wordpress_playbooks"){ echo "[INFO] Start deployment" sh """ set +x source /home/deploy/.py3-a2.5-env/bin/activate source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q ansible-playbook -i inventory/$deploy_env ./deploy.yml -e project=wordpress -e branch=$branch -e env=$deploy_env set -x """ echo "[INFO] Deployment finished..." } } } } }
ansible 的role task 脚本 - name: Update yum dependency shell: 'yum update -y warn=False' # 更新安装包 - name: Disable system firewall service: name=firewalld state=stopped - name: Disable SELINX selinux: state=disabled - name: Setup epel yum source for nginx and mariadb(mysql) yum: pkg=epel-release state=latest - name: Setup webtatic yum source for php-fpm # 更新yum 源 yum: name=https://mirror.webtatic.com/yum/el7/webtatic-release.rpm - name: Ensure nginx is at the latest version yum: pkg=nginx state=latest - name: Write the nginx config file template: src=roles/wordpress/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf - name: Create nginx root folder file: 'path={{ root }} state=directory owner={{ user }} group={{ user }} mode=0755' - name: Copy info.php to remote copy: 'remote_src=no src=roles/wordpress/files/info.php dest=/data/www/info.php mode=0755' - name: Restart nginx service service: name=nginx state=restarted - name: Setup php-fpm # 安装php command: 'yum install -y php70w php70w-fpm php70w-common php70w-mysql php70w-gd php70w-xml php70w-mbstring php70w-mcrypt warn=False' - name: Restart php-fpm service service: name=php-fpm state=restarted - name: Copy php-fpm config file to remote copy: 'remote_src=no src=roles/wordpress/files/www.conf dest=/etc/php-fpm.d/www.conf mode=0755 owner={{ user }} group={{ user }} force=yes' - name: Restart php-fpm service service: name=php-fpm state=restarted - name: Run the health check locally shell: "sh roles/wordpress/files/health_check.sh {{ server_name }} {{ port }}" delegate_to: localhost register: health_status - debug: msg="{{ health_status.stdout }}" - name: Setup mariadb(mysql) # 安装mariadb command: "yum install -y mariadb mariadb-server warn=False" - name: Backup current www folder shell: 'mv {{ root }} {{ backup_to }}' - name: Close git ssl verification shell: 'git config --global http.sslVerify false' - name: Clone WordPress repo to remote # git: "repo=https://{{ gitlab_user | urlencode }}:{{ gitlab_pass | urlencode }}@gitlab.example.com/root/Wordpress-project.git dest=/data/www version={{ branch }}" when: project == 'wordpress' - name: Change www folder permission file: "path=/data/www mode=0755 owner={{ user }} group={{ user }}" deploy.yml - hosts: wordpress gather_facts: true # 可以获取远程主机的信息 remote_user: root vars: backup_to: "{{root}}_{{branch}}_{{ansible_date_time.epoch}}" roles: - wordpress # 加载任务
inventory : [wordpress] test.example.com [wordpress:vars] server_name=test.example.com port=8080 user=deploy worker_processes=2 max_open_file=30000 root=/data/www gitlab_user='root' gitlab_pass='12345678'
「深度学习福利」大神带你进阶工程师,立即查看>>>
当我们启动httpd服务的时候,系统报错为 Failed to start httpd.service: Unit httpd.service is masked.
解决方法: systemctl unmask httpd.service
然后在启动httpd服务并且查看端口80已启动: [root@A8 ~]#systemctl start httpd [root@A8 ~]#ss -ntl
更多文章和资料|点击下方文字直达 ↓↓↓ 阿里云K8s实战手册 [阿里云CDN排坑指南] CDN ECS运维指南 DevOps实践手册 Hadoop大数据实战手册 Knative云原生应用开发指南 OSS 运维实战手册
「深度学习福利」大神带你进阶工程师,立即查看>>>
最近都在和Linux打交道,感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大。我将我了解到的命令列举一下,仅供大家参考:
系统信息 arch 显示机器的处理器架构 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 – (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo 显示CPU info的信息 cat /proc/interrupts 显示中断 cat /proc/meminfo 校验内存使用 cat /proc/swaps 显示哪些swap被使用 cat /proc/version 显示内核的版本 cat /proc/net/dev 显示网络适配器及统计 cat /proc/mounts 显示已加载的文件系统 lspci -tv 罗列 PCI 设备 lsusb -tv 显示 USB 设备 date 显示系统日期 cal 2007 显示2007年的日历表 date 041217002007.00 设置日期和时间 – 月日时分年.秒 clock -w 将时间修改保存到 BIOS
关机 (系统的关机、重启以及登出 ) shutdown -h now 关闭系统 init 0 关闭系统 telinit 0 关闭系统 shutdown -h hours:minutes & 按预定时间关闭系统 shutdown -c 取消按预定时间关闭系统 shutdown -r now 重启 reboot 重启 logout 注销
文件和目录 cd /home 进入 ‘/ home’ 目录’ cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 cd – 返回上次所在的目录 pwd 显示工作路径 ls 查看目录中的文件 ls -F 查看目录中的文件 ls -l 显示文件和目录的详细资料 ls -a 显示隐藏文件 ls [0-9] 显示包含数字的文件名和目录名 tree 显示文件和目录由根目录开始的树形结构 lstree 显示文件和目录由根目录开始的树形结构 mkdir dir1 创建一个叫做 ‘dir1′ 的目录’ mkdir dir1 dir2 同时创建两个目录 mkdir -p /tmp/dir1/dir2 创建一个目录树 rm -f file1 删除一个叫做 ‘file1′ 的文件’ rmdir dir1 删除一个叫做 ‘dir1′ 的目录’ rm -rf dir1 删除一个叫做 ‘dir1’ 的目录并同时删除其内容 rm -rf dir1 dir2 同时删除两个目录及它们的内容 mv dir1 new_dir 重命名/移动 一个目录 cp file1 file2 复制一个文件 cp dir/* . 复制一个目录下的所有文件到当前工作目录 cp -a /tmp/dir1 . 复制一个目录到当前工作目录 cp -a dir1 dir2 复制一个目录 ln -s file1 lnk1 创建一个指向文件或目录的软链接 ln file1 lnk1 创建一个指向文件或目录的物理链接 touch -t 0712250000 file1 修改一个文件或目录的时间戳 – (YYMMDDhhmm) file file1 outputs the mime type of the file as text iconv -l 列出已知的编码 iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding. find . -maxdepth 1 -name *.jpg -print -exec convert “{}” -resize 80×60 “thumbs/{}” ; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick)
文件搜索 find / -name file1 从 ‘/’ 开始进入根文件系统搜索文件和目录 find / -user user1 搜索属于用户 ‘user1’ 的文件和目录 find /home/user1 -name *.bin 在目录 ‘/ home/user1′ 中搜索带有’.bin’ 结尾的文件 find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件 find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件 find / -name *.rpm -exec chmod 755 ‘{}’ ; 搜索以 ‘.rpm’ 结尾的文件并定义其权限 find / -xdev -name *.rpm 搜索以 ‘.rpm’ 结尾的文件,忽略光驱、捷盘等可移动设备 locate *.ps 寻找以 ‘.ps’ 结尾的文件 – 先运行 ‘updatedb’ 命令 whereis halt 显示一个二进制文件、源码或man的位置 which halt 显示一个二进制文件或可执行文件的完整路径
挂载一个文件系统 mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 – 确定目录 ‘/ mnt/hda2’ 已经存在 umount /dev/hda2 卸载一个叫做hda2的盘 – 先从挂载点 ‘/ mnt/hda2’ 退出 fuser -km /mnt/hda2 当设备繁忙时强制卸载 umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用 mount /dev/fd0 /mnt/floppy 挂载一个软盘 mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件 mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统 mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备 mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享
磁盘空间 df -h 显示已经挂载的分区列表 ls -lSr |more 以尺寸大小排列文件和目录 du -sh dir1 估算目录 ‘dir1′ 已经使用的磁盘空间’ du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小 rpm -q -a –qf ‘%10{SIZE}t%{NAME}n’ | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统) dpkg-query -W -f=’${Installed-Size;10}t${Package}n’ | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统)
用户和群组 groupadd group_name 创建一个新用户组 groupdel group_name 删除一个用户组 groupmod -n new_group_name old_group_name 重命名一个用户组 useradd -c “Name Surname ” -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 “admin” 用户组的用户 useradd user1 创建一个新用户 userdel -r user1 删除一个用户 ( ‘-r’ 排除主目录) usermod -c “User FTP” -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性 passwd 修改口令 passwd user1 修改一个用户的口令 (只允许root执行) chage -E 2005-12-31 user1 设置用户口令的失效期限 pwck 检查 ‘/etc/passwd’ 的文件格式和语法修正以及存在的用户 grpck 检查 ‘/etc/passwd’ 的文件格式和语法修正以及存在的群组 newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组
文件的权限 – 使用 “+” 设置权限,使用 “-” 用于取消 ls -lh 显示权限 ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限 chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限 chown user1 file1 改变一个文件的所有人属性 chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性 chgrp group1 file1 改变文件的群组 chown user1:group1 file1 改变一个文件的所有人和群组属性 find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件 chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 – 运行该文件的用户也被赋予和所有者同样的权限 chmod u-s /bin/file1 禁用一个二进制文件的 SUID位 chmod g+s /home/public 设置一个目录的SGID 位 – 类似SUID ,不过这是针对目录的 chmod g-s /home/public 禁用一个目录的 SGID 位 chmod o+t /home/public 设置一个文件的 STIKY 位 – 只允许合法所有人删除文件 chmod o-t /home/public 禁用一个目录的 STIKY 位
文件的特殊属性 – 使用 “+” 设置权限,使用 “-” 用于取消 chattr +a file1 只允许以追加方式读写文件 chattr +c file1 允许这个文件能被内核自动压缩/解压 chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件 chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接 chattr +s file1 允许一个文件被安全地删除 chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘 chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件 lsattr 显示特殊的属性
打包和压缩文件 bunzip2 file1.bz2 解压一个叫做 ‘file1.bz2’的文件 bzip2 file1 压缩一个叫做 ‘file1’ 的文件 gunzip file1.gz 解压一个叫做 ‘file1.gz’的文件 gzip file1 压缩一个叫做 ‘file1’的文件 gzip -9 file1 最大程度压缩 rar a file1.rar test_file 创建一个叫做 ‘file1.rar’ 的包 rar a file1.rar file1 file2 dir1 同时压缩 ‘file1’, ‘file2’ 以及目录 ‘dir1’ rar x file1.rar 解压rar包 unrar x file1.rar 解压rar包 tar -cvf archive.tar file1 创建一个非压缩的 tarball tar -cvf archive.tar file1 file2 dir1 创建一个包含了 ‘file1’, ‘file2’ 以及 ‘dir1’的档案文件 tar -tf archive.tar 显示一个包中的内容 tar -xvf archive.tar 释放一个包 tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下 tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包 tar -jxvf archive.tar.bz2 解压一个bzip2格式的压缩包 tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包 tar -zxvf archive.tar.gz 解压一个gzip格式的压缩包 zip file1.zip file1 创建一个zip格式的压缩包 zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包 unzip file1.zip 解压一个zip格式压缩包
RPM 包 – (Fedora, Redhat及类似系统) rpm -ivh package.rpm 安装一个rpm包 rpm -ivh –nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告 rpm -U package.rpm 更新一个rpm包但不改变其配置文件 rpm -F package.rpm 更新一个确定已经安装的rpm包 rpm -e package_name.rpm 删除一个rpm包 rpm -qa 显示系统中所有已经安装的rpm包 rpm -qa | grep httpd 显示所有名称中包含 “httpd” 字样的rpm包 rpm -qi package_name 获取一个已安装包的特殊信息 rpm -qg “System Environment/Daemons” 显示一个组件的rpm包 rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表 rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表 rpm -q package_name –whatrequires 显示与一个rpm包存在依赖关系的列表 rpm -q package_name –whatprovides 显示一个rpm包所占的体积 rpm -q package_name –scripts 显示在安装/删除期间所执行的脚本l rpm -q package_name –changelog 显示一个rpm包的修改历史 rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供 rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表 rpm –import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书 rpm –checksig package.rpm 确认一个rpm包的完整性 rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性 rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间 rpm -Va 检查系统中所有已安装的rpm包- 小心使用 rpm -Vp package.rpm 确认一个rpm包还未安装 rpm2cpio package.rpm | cpio –extract –make-directories bin 从一个rpm包运行可执行文件 rpm -ivh /usr/src/redhat/RPMS/ arch /package.rpm 从一个rpm源码安装一个构建好的包 rpmbuild –rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包
YUM 软件包升级器 – (Fedora, RedHat及类似系统) yum install package_name 下载并安装一个rpm包 yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系 yum update package_name.rpm 更新当前系统中所有安装的rpm包 yum update package_name 更新一个rpm包 yum remove package_name 删除一个rpm包 yum list 列出当前系统中安装的所有包 yum search package_name 在rpm仓库中搜寻软件包 yum clean packages 清理rpm缓存删除下载的包 yum clean headers 删除所有头文件 yum clean all 删除所有缓存的包和头文件
DEB 包 (Debian, Ubuntu 以及类似系统) dpkg -i package.deb 安装/更新一个 deb 包 dpkg -r package_name 从系统删除一个 deb 包 dpkg -l 显示系统中所有已经安装的 deb 包 dpkg -l | grep httpd 显示所有名称中包含 “httpd” 字样的deb包 dpkg -s package_name 获得已经安装在系统中一个特殊包的信息 dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表 dpkg –contents package.deb 显示尚未安装的一个包所提供的文件列表 dpkg -S /bin/ping 确认所给的文件由哪个deb包提供
APT 软件工具 (Debian, Ubuntu 以及类似系统) apt-get install package_name 安装/更新一个 deb 包 apt-cdrom install package_name 从光盘安装/更新一个 deb 包 apt-get update 升级列表中的软件包 apt-get upgrade 升级所有已安装的软件 apt-get remove package_name 从系统删除一个deb包 apt-get check 确认依赖的软件仓库正确 apt-get clean 从下载的软件包中清理缓存 apt-cache search searched-package 返回包含所要搜索字符串的软件包名称
查看文件内容 cat file1 从第一个字节开始正向查看文件的内容 tac file1 从最后一行开始反向查看一个文件的内容 more file1 查看一个长文件的内容 less file1 类似于 ‘more’ 命令,但是它允许在文件中和正向操作一样的反向操作 head -2 file1 查看一个文件的前两行 tail -2 file1 查看一个文件的最后两行 tail -f /var/log/messages 实时查看被添加到一个文件中的内容
文本处理 cat file1 file2 … | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT cat file1 | command( sed, grep, awk, grep, etc…) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中 cat file1 | command( sed, grep, awk, grep, etc…) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中 grep Aug /var/log/messages 在文件 ‘/var/log/messages’中查找关键词”Aug” grep ^Aug /var/log/messages 在文件 ‘/var/log/messages’中查找以”Aug”开始的词汇 grep [0-9] /var/log/messages 选择 ‘/var/log/messages’ 文件中所有包含数字的行 grep Aug -R /var/log/* 在目录 ‘/var/log’ 及随后的目录中搜索字符串”Aug” sed ‘s/stringa1/stringa2/g’ example.txt 将example.txt文件中的 “string1” 替换成 “string2” sed ‘/^$/d’ example.txt 从example.txt文件中删除所有空白行 sed ‘/ *#/d; /^$/d’ example.txt 从example.txt文件中删除所有注释和空白行 echo ‘esempio’ | tr ‘[:lower:]’ ‘[:upper:]’ 合并上下单元格内容 sed -e ‘1d’ result.txt 从文件example.txt 中排除第一行 sed -n ‘/stringa1/p’ 查看只包含词汇 “string1″的行 sed -e ‘s/ $//’ example.txt 删除每一行最后的空白字符 sed -e ‘s/stringa1//g’ example.txt 从文档中只删除词汇 “string1” 并保留剩余全部 sed -n ‘1,5p;5q’ example.txt 查看从第一行到第5行内容 sed -n ‘5p;5q’ example.txt 查看第5行 sed -e ‘s/00 /0/g’ example.txt 用单个零替换多个零 cat -n file1 标示文件的行数 cat example.txt | awk ‘NR%2==1’ 删除example.txt文件中的所有偶数行 echo a b c | awk ‘{print $1}’ 查看一行第一栏 echo a b c | awk ‘{print $1,$3}’ 查看一行的第一和第三栏 paste file1 file2 合并两个文件或两栏的内容 paste -d ‘+’ file1 file2 合并两个文件或两栏的内容,中间用”+”区分 sort file1 file2 排序两个文件的内容 sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份) sort file1 file2 | uniq -u 删除交集,留下其他的行 sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件) comm -1 file1 file2 比较两个文件的内容只删除 ‘file1’ 所包含的内容 comm -2 file1 file2 比较两个文件的内容只删除 ‘file2’ 所包含的内容 comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分
字符设置和文件格式转换 dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS recode ..HTML < page.txt > page.html 将一个文本文件转换成html recode -l | more 显示所有允许的转换格式
文件系统分析 badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块 fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性 fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性 fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性
初始化一个文件系统 mkfs /dev/hda1 在hda1分区创建一个文件系统 mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统 mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统 mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统 fdformat -n /dev/fd0 格式化一个软盘 mkswap /dev/hda3 创建一个swap文件系统
SWAP文件系统 mkswap /dev/hda3 创建一个swap文件系统 swapon /dev/hda3 启用一个新的swap文件系统 swapon /dev/hda2 /dev/hdb3 启用两个swap分区
备份 dump -0aj -f /tmp/home0.bak /home 制作一个 ‘/home’ 目录的完整备份 dump -1aj -f /tmp/home0.bak /home 制作一个 ‘/home’ 目录的交互式备份 restore -if /tmp/home0.bak 还原一个交互式备份 rsync -rogpav –delete /home /tmp 同步两边的目录 rsync -rogpav -e ssh –delete /home ip_address:/tmp 通过SSH通道rsync rsync -az -e ssh –delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录 rsync -az -e ssh –delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录 dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr ‘dd of=hda.gz’ 通过ssh在远程主机上执行一次备份本地磁盘的操作 dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件 tar -Puf backup.tar /home/user 执行一次对 ‘/home/user’ 目录的交互式备份操作 ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr ‘cd /home/share/ && tar x -p’ 通过ssh在远程目录中复制一个目录内容 ( tar c /home ) | ssh -C user@ip_addr ‘cd /home/backup-home && tar x -p’ 通过ssh在远程目录中复制一个本地目录 tar cf – . | (cd /tmp/backup ; tar xf – ) 本地将一个目录复制到另一个地方,保留原有权限及链接 find /home/user1 -name ‘ .txt’ | xargs cp -av –target-directory=/home/backup/ –parents 从一个目录查找并复制所有以 ‘.txt’ 结尾的文件到另一个目录 find /var/log -name ‘ .log’ | tar cv –files-from=- | bzip2 > log.tar.bz2 查找所有以 ‘.log’ 结尾的文件并做成一个bzip包 dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作 dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容
光盘 cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容 mkisofs /dev/cdrom > cd.iso 在磁盘上创建一个光盘的iso镜像文件 mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盘上创建一个压缩了的光盘iso镜像文件 mkisofs -J -allow-leading-dots -R -V “Label CD” -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件 cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件 gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom – 刻录一个压缩了的ISO镜像文件 mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件 cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中 cd-paranoia — “-3” 从一个CD光盘转录音轨到 wav 文件中(参数-3) cdrecord –scanbus 扫描总线以识别scsi通道 dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码,例如一张 CD
网络 – (以太网和WIFI无线) ifconfig eth0 显示一个以太网卡的配置 ifup eth0 启用一个 ‘eth0’ 网络设备 ifdown eth0 禁用一个 ‘eth0’ 网络设备 ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址 ifconfig eth0 promisc 设置 ‘eth0’ 成混杂模式以嗅探数据包 (sniffing) dhclient eth0 以dhcp模式启用 ‘eth0’ route -n show routing table route add -net 0/0 gw IP_Gateway configura default gateway route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network ‘192.168.0.0/16’ route del 0/0 gw IP_gateway remove static route echo “1” > /proc/sys/net/ipv4/ip_forward activate ip routing hostname show hostname of system host www.example.com lookup hostname to resolve name to ip address and viceversa nslookup www.example.com lookup hostname to resolve name to ip address and viceversa ip link show show link status of all interfaces mii-tool eth0 show link status of ‘eth0’ ethtool eth0 show statistics of network card ‘eth0’ netstat -tup show all active network connections and their PID netstat -tupl show all network services listening on the system and their PID tcpdump tcp port 80 show all HTTP traffic iwlist scan show wireless networks iwconfig eth1 show configuration of a wireless network card hostname show hostname host www.example.com lookup hostname to resolve name to ip address and viceversa nslookup www.example.com lookup hostname to resolve name to ip address and viceversa whois www.example.com lookup on Whois database
JPS工具
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。
我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其 id。 jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。 使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。
jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path.
$> jps 23991 Jps 23789 BossMain 23651 Resin
比较常用的参数:
-q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数 $> jps -q 28680 23789 23651
-m 输出传递给main 方法的参数,在嵌入式jvm上可能是null
$> jps -m 28715 Jps -m 23789 BossMain 23651 Resin -socketwait 32768 -stdout /data/aoxj/resin/log/stdout.log -stderr /data/aoxj/resin/log/stderr.log
-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
$> jps -l 28729 sun.tools.jps.Jps 23789 com.asiainfo.aimc.bossbi.BossMain 23651 com.caucho.server.resin.Resin
-v 输出传递给JVM的参数
$> jps -v 23789 BossMain 28802 Jps -Denv.class.path=/data/aoxj/bossbi/twsecurity/java/trustwork140.jar:/data/aoxj/bossbi/twsecurity/java/:/data/aoxj/bossbi/twsecurity/java/twcmcc.jar:/data/aoxj/jdk15/lib/rt.jar:/data/aoxj/jd
k15/lib/tools.jar -Dapplication.home=/data/aoxj/jdk15 -Xms8m 23651 Resin -Xss1m -Dresin.home=/data/aoxj/resin -Dserver.root=/data/aoxj/resin -Djava.util.logging.manager=com.caucho.log.LogManagerImpl –
Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl
sudo jps看到的进程数量最全 jps 192.168.0.77 列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099 (前提是远程服务器提供jstatd服务) 注:jps命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。 更多文章和资料|点击下方文字直达 ↓↓↓ 阿里云K8s实战手册 [阿里云CDN排坑指南] CDN ECS运维指南 DevOps实践手册 Hadoop大数据实战手册 Knative云原生应用开发指南 OSS 运维实战手册
「深度学习福利」大神带你进阶工程师,立即查看>>>
大家知道,树莓派是一个小型的,只有一块电路板的电脑,它本来是被设计用于教学或进行编程学习。但现在,很明显,它的作用不仅限于此。
树莓派它以其便宜、功耗低而广受欢迎,现在大家用它做各种各样的事情,比如娱乐、物联网等项目。
正是因为基于树莓派大家可以做很多事情,大家反而觉得有些迷茫了,不知道从何入手。于是就出现这样的情景:大家满怀热情买了一个最新款的树莓派,准备大玩一场,结果,由于不懂得怎么玩,最终沦为抽屉里的「吸尘器」。
正基于此,良许介绍几个途径供大家进行系统化学习树莓派,让大家玩得开心,拯救抽屉里的「吸尘器」。但是,下面要介绍的几个途径,大都是国外的。没办法,不得不承认,国外的一些技术论坛社区真的是比国内要先进不少。
树莓派书籍推荐
现在市面上有很多优秀的书籍介绍树莓派,当然也包括一些国内的书籍。这里要介绍两本从入门到进阶的书籍。 Raspberry Pi Cookbook: Software and Hardware Problems and Solutions
这本书的作者是 Simon Monk ,他是一名软件工程师,同时也是一名资深极客。一开始,他是被 Arduino 所吸引,因为 Arduino 非常便于电子开发,也很易于入门,于是他就写了本关于 Arduino 的书。
之后,他再转向于树莓派,并写了这本书。在书里,他介绍了一系列的很易于上手的树莓派项目,通过这些项目的学习,可以很快就熟悉树莓派的各个模块资源。并且,对于学习过程中可能会遇到的各种问题,他都已经给好了解决方案。 Programming the Raspberry Pi: Getting Started with Python
同样,这本书也是 Simon Monk 的作品。这本书的重点就在于 Python 的学习。大家知道,Python 是一门非常优雅、简单的语言(相对其它编程语言),即使你不懂编程,也可以看得懂 Python 代码。
Python 也提供了非常多的库用于树莓派开发。有了这些库,你无需再重复造轮子,无需去研究那些传感器的通讯协议之类。
在 Raspberry Pi Cookbook 里,Monk 已经介绍了两个章节的 Python,但本书才可以算是真正的快速入门。他向你介绍了 Python 语言,并开发了一些基于树莓派的 Python 项目,帮助你利用 Python 去玩转树莓派。
通过本书的学习,你不仅学会 Python 这门语言,同时也学会如何利用 Python 去进行树莓派项目的开发。
树莓派在线课程
现在的网络相当发达,我们可以足不出户就能学习到网络上海量的优秀课程。这里介绍一个非常优秀的在线课程: Raspberry Pi Class
Raspberry Pi Class 提供了一些非常全面的树莓派在线教程。它从树莓派及 Linux 操作系统最基本部分开始讲起,一直到 Python 程序编程及 GPIO 操作。
它的课程很系统,教你从顶至底全面玩转树莓派,特别适用于新手快速进入开发状态。它的网址是: https://www.instructables.com/class/Raspberry-Pi-Class/
树莓派社区推荐
网络上,有太多太多关于树莓派的资料,但下面要介绍的这几个社区一定要进入你的法眼。 RaspberryPi.org
没错,这个就是树莓派的官方网站。作为官方网站,这里自然汇聚了来自世界各地的树莓派爱好者及极客们。
在这个社区里,大家上传了各式各样基于树莓派的项目,只要用心发掘,一定会找到很多优秀的项目。
当然不仅仅是项目,一些基础性操作,比如如何给树莓派安装 Raspbian 系统这样入门级的教程在这个社区里也比比皆是。
因此,只要用心在这个社区里混,一定可以从一只菜鸟成长为人人羡慕的老鸟。 Opensource.com
在 opensource.com 这个网站里,你可以找到很多指导性的帖子,包括:入门指南,优秀项目,资源更新等等内容。
这个网站包罗了很多方面的内容,对于树莓派是在以下这个专题里: https://opensource.com/tags/raspberry-pi Instructables and Hackaday
注意,这是两个社区哦,包括前面的 5 个途径,正好是标题所说的 7 个途径。这两个社区的网址分别是: https://www.instructables.com/technology/raspberry-pi/ https://hackaday.io/projects?tag=raspberry%20pi
因为这两个社区比较相似,所以放在一起介绍了。在这两个社区里,你可以找到非常非常多操作性很强的项目,截个图让你们感受一下。
在这两个社区里,你可以看到琳琅满目的各种各样的树莓派项目,比如:魔镜(可以在镜子里显示天气预报、温湿度、时间、日历等)。而且,每个项目都给出了非常详细的步骤,甚至源代码,只要你按照网站的步骤,就一定可以复制出这个项目。
所以,如果在你不知道拿树莓派做啥时,可以上这两个社区看看,找几个项目来玩玩。当你做出几个项目后,相信我,你的自信会提高很大一个档次!
小结
以上就是本文介绍的几个学习树莓派的途径,有比较基础的入门级教程,也有需要花很多时间才能做出来的进阶项目。如果你实在不知道拿树莓派做啥,或根本就不知道如何入门树莓派,以上介绍的几个途径好好去研究。
但是,全英文的,祝好。
最后,最近很多小伙伴找我要 Linux学习路线图 ,于是我根据自己的经验,利用业余时间熬夜肝了一个月,整理了一份电子书。无论你是面试还是自我提升,相信都会对你有帮助!目录如下:
免费送给大家,只求大家金指给我点个赞!
电子书 | Linux开发学习路线图
也希望有小伙伴能加入我,把这份电子书做得更完美!
有收获?希望老铁们来个三连击,给更多的人看到这篇文章
推荐阅读: 干货 | 程序员进阶架构师必备资源免费送 神器 | 支持搜索的资源网站
「深度学习福利」大神带你进阶工程师,立即查看>>>
如果你是软件开发人员,相信你一定知道或者曾经使用过一个非常轻量级的数据库——SQLite。它具有作为关系数据库所需的几乎所有功能,但是这个数据库把所有功能都保存在一个文件中。在其官方网站上,SQLite的主要应用场景包括: 嵌入式设备和物联网 数据分析 数据传输 文件存档或数据容器 内部或临时数据库 在演示或测试期间替代企业数据库 教育、培训和测试 实验性SQL语言扩展
当然,SQLite还有很多其他功能,在此不一一列举,感兴趣的同学可以去看官方文档: https://www.sqlite.org/whentouse.html
最重要的是,SQLite实际上是作为Python库内置的。换言之,你不需要安装任何服务器端/客户端软件,也不需要运行某个服务,只要你在Python中导入库并开始编程,那么你就有了一个关系数据库管理系统!
导入和使用
这里我们说“内置”的意思就是,你甚至不需要运行 pip install ,就能获取库。只需要通过以下方式导入: import sqlite3 as sl
1.创建与数据库的连接
我们根本不需要为驱动程序、连接字符串等烦恼。可以直接创建一个 SQLite 数据库,并拥有一个简单的连接对象: con = sl.connect('my-test.db')
运行此行代码后,我们就已经创建并连接到该数据库上。 如果要求Python连接的数据库不存在,它就会自动帮我们创建一个空数据库。 如果我们已经创建了数据库,就能用上面完全相同的代码连接到现有数据库。
2.创建表格
接下来,我们先创建一个表格。 with con: con.execute(""" CREATE TABLE USER ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER ); """)
在这个 USER 表中,我们添加了三列。正如我们所看到的,SQLite 确实是轻量级的,但是它支持常规 RDBMS 应该具有的所有基本特性,例如数据类型、可为null、主键和自动递增。
运行这段代码之后,我们就已经创建好了一个表,尽管它什么都没有输出。
3.插入记录
让我们在刚刚创建的 USER 表中插入数据记录,这也可以证明我们确实创建了它。
如果我们需要一次性插入多个记录,Python中的SQLite也能很容易地实现这一点。 sql = 'INSERT INTO USER (id, name, age) values(?, ?, ?)' data = [ (1, 'Alice', 21), (2, 'Bob', 22), (3, 'Chris', 23) ]
我们需要用问号作为占位符来定义SQL语句 。接下来就是创建一些要插入的示例数据。使用连接对象,就能插入这些示例行。 with con: con.executemany(sql, data)
在运行代码之后,没有报错,那就是成功的。
4.查询表格
接下来,我们通过实际的方式来验证我们所做的一切,通过查询表格来获取示例行。 with con: data = con.execute("SELECT * FROM USER WHERE age <= 22") for row in data: print(row)
你可以看到,很简单就得到了结果。
此外,尽管 SQLite 是轻量级的,但是作为一个广泛使用的数据库,大多数SQL客户端软件都支持使用它。
我自己用得最多的是 DBeaver,接下来给大家介绍一下。
5.从SQL客户端(DBeaver)连接到SQLite数据库
因为我用的是 googlecolab,所以我要将 my-test.db 文件下载到我的本地计算机上。当然,你也可以直接在你的电脑上使用 Python 数据库连接你的本地数据库。
在 DBeaver 中,创建一个新连接并选择 SQLite 作为数据库类型。
然后,浏览DB文件。
现在你可以在数据库上运行任何SQL查询,看看它与其他常规关系数据库有什么不同。
与Pandas无缝连接
你以为就只有这些?不,事实上,作为Python的一个内置特性,SQLite 可以与 Pandas 数据帧无缝连接。
让我们先来定义一个数据帧。 df_skill = pd.DataFrame({ 'user_id': [1,1,2,2,3,3,3], 'skill': ['Network Security', 'Algorithm Development', 'Network Security', 'Java', 'Python', 'Data Science', 'Machine Learning'] })
然后,我们可以简单地调用数据帧的to_sql()方法将其保存到数据库中。 df_skill.to_sql('SKILL', con)
就这样我们甚至不需要预先创建表,列的数据类型和长度都会被推断出来。当然,如果你想的话,你也可以先定义。
然后,假设我们要将表 USER 和 SKILL 连接在一起,并将结果读入Pandas数据框。 df = pd.read_sql(''' SELECT s.user_id, u.name, u.age, s.skill FROM USER u LEFT JOIN SKILL s ON u.id = s.user_id ''', con)
是不是很厉害?让我们把结果写到一个名为USER_SKILL的新表中。 df.to_sql('USER_SKILL', con)
我们也可以用SQL客户端来检索表。
总结
实际上,Python中还隐藏着很多惊喜。而且这些惊喜并不没有隐藏起来,只是Python有太多现成可以直接使用的特性了,这就导致很多人无法发现这些特性。
在本文中,我介绍了如何使用 Python 内置库 sqlite3 在 SQLite 数据库中创建和操作表。它也支持对表格进行更新和删除操作,建议大家在看完这篇文章之后自己尝试一下。
最重要的是,我们可以轻松地将表从 SQLite 数据库读入 Pandas 数据帧,反之亦然。这使我们能够更容易地与我们的轻量级关系数据库进行交互。
你可能会注意到 SQLite 没有进行身份验证,这也是它刻意设计的行为,因为需要轻量化。
一起去探索Python中更多令人惊讶的特性吧! 原文链接: https://developer.51cto.com/art/202007/622645.htm#topx
作者:为AI呐喊 更多文章和资料|点击下方文字直达 ↓↓↓ 阿里云K8s实战手册 [阿里云CDN排坑指南] CDN ECS运维指南 DevOps实践手册 Hadoop大数据实战手册 Knative云原生应用开发指南 OSS 运维实战手册
「深度学习福利」大神带你进阶工程师,立即查看>>>
Deepin原名Linux Deepin、Deepin os、深度操作系统,于2014年4月改名Deepin。deepin团队基于Qt/C++(用于前端)和Go(用于后端)开发了的全新深度桌面环境(DDE),以及音乐播放器,视频播放器,软件中心等一系列特色软件。
deepin操作系统是由武汉深之度科技有限公司开发的Linux发行版。deepin操作系统是一个基于 Debian 的 Linux 操作系统,专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致,适合笔记本、桌面计算机和一体机。它包含了所有您需要的应用程序,网页浏览器、幻灯片演示、文档编辑、电子表格、娱乐、声音和图片处理软件,即时通讯软件等等。deepin 的历史可以追溯到 2004年,其前身 Hiweed Linux 是中国第一个基于 Debian的本地化衍生版,并提供轻量级的可用LiveCD,旨在创造一个全新的简单、易用、美观的 Linux 发行版。
Deepin操作系统拥有自主设计的特色软件:深度软件中心、深度截图、深度音乐播放器和深度影音,全部使用自主的deepinUI,其中有深度桌面环境,deepinTalk(深谈)等。
deepin操作系统是中国最活跃的 Linux 发行版,deepin 为所有人提供稳定、高效的操作系统,强调安全、易用、美观。其口号为“免除新手痛苦,节约老手时间”。在社区的参与下,“让 Linux 更易用”也不断变成可以触摸的现实。
深度桌面环境
简介
Deepin 12.12 正式版本将搭载一个全新的桌面环境。该桌面环境由Deepin 团队开发,以轻型、美观、稳定等作为设计目标。新桌面环境使用 Compiz 作为默认的窗口管理器。
系统设置模块全部进行代码重写,不再使用“GNOME 控制中心”(gnome control center),系统设置中心也会采用 Deepin UI 库作为界面库。深度音乐播放器、影音播放器最初的版本也是基于此界面库进行外观设计。最新版本的深度截图工具也采用了 Deepin UI 库。
新的桌面环境不仅对Deepin社区,也会对其他操作系统社区带来令人刺激的变革。国际社区也将看到一个概念独特、回归用户操作的桌面环境,一切都会变得熟悉。
深度桌面环境 应用程序一览无余
应用程序概览视图,可通过点击屏幕左下角的“应用程序启动器(Launcher)”按钮,或 Alt+F2 组合键打开。它可以让您快速查找并启动应用程序。 新底部 Dock,快速打开常用程序
新Dock主要由传统的Dock+托盘(系统级别+程序级别)两部分组成。点击Dock面板即可弹出“系统级托盘显示”和“Dock显示”功能选项,可以让用户自定义系统级托盘的显示和Dock的显示方式。
传统的底部 Dock,快速打开常用程序(就是屏幕底部的水平条)。它包括了应用程序启动器(Launcher)、显示桌面按钮,常用应用程序快捷方式和系统托盘等部分。支持应用程序快捷方式的添加与删除,并显示已打开应用程序的窗口列表。 简洁的消息通知
它会及时提示您来自聊天工具或其他应用程序、系统发出的通知,通知显示区域为屏幕右下角。消息托盘功能会在之后版本中继续完善。
深度系统设置
深度系统设置(Deepin System Settings),采用 Deepin UI 图形库,对各个设置模块进行了全新设计,主要包括显示、声音、个性化、电源、账户、网络等系统设置模块,可以方便地对系统各模块进行个性化设置。 下面重点介绍几个方面: 支持自动调节屏幕亮度。
如果您的电脑配有采光设备,该功能可根据外界光亮程度自动调整屏幕亮度,以节省电源。 个性化主题和壁纸设置。
a: 系统默认提供四组精彩壁纸,可根据您的喜好进行切换。 b: 支持壁纸随机播放,可设置图片切换的间隔时间。 c: 集成爱壁纸HD在线壁纸模块。 支持农历日期显示。
在日期时间模块,增加了对中国农历日期的支持,并支持显示国际性节日与中国传统节日。 更加方便的网络设置。
各个网络设置类型,如有线、拨号、移动等网络分类一目了然,设置界面极其简洁,可以帮助您快速设置网络。 快速设置用户头像:支持深度截图工具与摄像头拍摄。
可以使用深度截图工具截取屏幕并进行简单的编辑后设置为用户头像,也可以通过摄像头拍摄后直接设置为头像。
「深度学习福利」大神带你进阶工程师,立即查看>>>
redis-sentinel 项目连接
1、一主两从三哨兵模式,实现springboot项目的链接使用示例
2、maven主要依赖:
org.springframework.data spring-data-redis 2.3.2.RELEASE redis.clients jedis 3.3.0
3、哨兵配置:
#哨兵的配置列表 spring.redis.sentinel.master=mymaster spring.redis.sentinel.nodes=192.168.111.129:27000,192.168.111.130:27001,192.168.111.131:27002 spring.redis.sentinel.password=123456 spring.redis.password=123456
4、测试示例:
@Test public void testString (){ stringRedis.set("name", "dingzhen"); System.out.println(stringRedis.get("name")); }
5、成功输出展示:
2020-08-08 11:21:13.511 INFO 7884 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2020-08-08 11:21:14.012 INFO 7884 --- [ main] redis.clients.jedis.JedisSentinelPool : Trying to find master from available Sentinels... 2020-08-08 11:21:14.074 INFO 7884 --- [ main] redis.clients.jedis.JedisSentinelPool : Redis master running at 192.168.111.131:7002, starting Sentinel listeners... 2020-08-08 11:21:14.144 INFO 7884 --- [ main] redis.clients.jedis.JedisSentinelPool : Created JedisPool to master at 192.168.111.131:7002 2020-08-08 11:21:14.712 INFO 7884 --- [ main] com.dingzhen.DemoApplicationTests : Started DemoApplicationTests in 3.831 seconds (JVM running for 5.642)
dingzhen
github讲解及代码示例: https://github.com/dingtongzhen/redis-sentinel/blob/master/README.md
参考资料: https://docs.spring.io/spring-data/redis/docs/2.3.2.RELEASE/reference/html/#redis:sentinel
「深度学习福利」大神带你进阶工程师,立即查看>>>
设置你的控制台,以便你能知道身处哪个目录和该做什么 |
---|
我使用 GNOME 终端,主要是因为它是我的发行版的默认设置。但是我终端内远非“默认值”。在我开始解释如何自定义它之前,它现在是这个样子:
我使用终端多路复用技术 tmux 管理我的终端体验。
在上图的底部,你可以看到我的绿色 tmux 栏。底部的 [3] 表示它是第三个终端:每个终端都运行自己的 tmux 会话。(我创建了一个新会话来放大字体,这样可在截图中更容易看到;这是它与其他终端之间的唯一区别。)
提示符看起来也很有趣,对吧?在提示符中塞入了太多信息后,我喜欢插上一个换行符,这样一来,如果我想即兴进行 shell 编程或编写一个传递了五次的管道,也不会超出屏幕界限。这样做的代价是简单的 命令 序列(新建、复制、移动)会更快地滚动出我的屏幕。
行末是 阿列夫零 Aleph null 字符,它是最小的无穷基数。我希望内容行的结束很明显,并且当我意识到“阿列夫”和下标 0 都是 Unicode 字符时,我无法抗拒使用“阿列夫零”作为提示符的一部分的诱惑。(数学极客们,团结起来!)
在此之前是我的用户名。由于我在不同用户名的多台计算机上使用相同的点文件(保存在 Git 中),因此这个还算有用。
在我的用户名之前,是我所在目录的最后一部分。完整路径通常太长且无用,而当前目录对于像我这样的经常忘记在做什么人来说是很有用的。在此之前是机器的名称。我所有的机器都以我喜欢的电视节目命名。我的旧笔记本是 mcgyver 。
提示符中的第一位是我最喜欢的:一个让我知道目录的 Git 状态的字母。如果目录为“不在 Git 中”,那么是 G 。如果目录为“没有问题”(OK),且无需任何操作,那么是 K 。如果有 Git 未知的文件需要添加或忽略,那么是 ! 。如果需要提交,那么是 C 。如果没有上游,那么是 U 。如果存在上游,但我没有推送,那么是 P 。该方案不是基于当前状态,而是描述了我要做的下一个动作。(要回顾 Git 术语,请阅读本文。)
终端功能是通过一个有趣的 Python 程序完成的。它运行 python -m howsit (在我把 howsit 安装在虚拟环境中之后)。
你可以在上图中看到渲染效果,但是为了完整起见,这是我的 PS1: [$(~/.virtualenvs/howsit/bin/python -m howsit)]\h:\W
「深度学习福利」大神带你进阶工程师,立即查看>>>
无论我们使用什么操作系统还是什么软件,快捷键都是非常有用的,因为可以在启动应用程序或跳转到所需窗口,可以快速进行很多操作,而无需动鼠标到处点,节省时间和精力,提高效率。
就像在Windows中一样,Ubuntu也有一些热键可以作为快捷方式来让一些操作变得很简单。这次,我们就来学习一些方便的Ubuntu键盘快捷键,来提高工作效率。
1)使用超级键(Windows键)
Windows 键在Unix系统中称为 超级键 ( Super Key ),只需按下超级键,即可打开下图所示的搜索框。
要搜索应用程序,只需输入应用的名称,然后点击应用程序的图标(或者使用方向键移动到对应的应用程序也可以)。
如果你现在打开了很多窗口,想要来个全局预览怎么办?可以使用 超级键 一次查看所有启动的应用程序,如下所示。
2)使用快捷键启动终端
还有一个方便的快捷方式是终端快捷方式。你可以使用简单的Ubuntu键盘快捷键 CTRL + ALT + T 启动终端。这是在最短的时间内启动终端的最简单的快捷方式之一。
3)锁定屏幕
就像在Windows中一样,要锁定屏幕,只需按 超级键 + L 或 CTRL + ALT + L 。这种方式要比去右上角选择锁定屏幕的选项更方便快捷。
4)在打开多个窗口时显示桌面
有时,你需要在已经打开了多个窗口的时候,将所有窗口最小化并且返回桌面。这时你只需要按 超级键 + D 或者按 CTRL + ALT + D 键,即可将所有活动窗口最小化,只剩下桌面。
5)启动应用程序菜单
通常,Ubuntu 18.04带有GNOME桌面环境,我们可以点击左下角一组点组成的按钮来显示应用程序菜单。但这样操作速度肯定比快捷键慢,这一操作的快捷键是 超级键 + A 。
6)在正在运行的应用程序之间切换
有些情况下时,你可能会打开多个应用程序。要在应用之间轻松切换,可以使用 超级键 + Tab 或 Alt + Tab 。使用时,按住超级键不放,点击Tab键可在应用程序之间切换。选中所需的应用程序后,再松开两个键即可。
7)切换通知托盘
Ubuntu 18.04上的GNOME界面带有一个通知托盘,你可以单击顶部栏上的日期来访问该托盘。在托盘上可以查看一些应用程序最近的事项。要打开通知托盘,只需按 超级键+ M 。此外,你还可以按 超级键+ V 来切换各种通知。
8)贴窗
就像在Windows操作系统中一样,你可以将应用程序窗口向左或向右对齐,使程序窗口最终占据左边或右边的半个屏幕。如要向右对齐,按 超级键+ 右箭头 ,同样地,要向左对齐该应用,点击 超级键+左箭头 即可。
9)工作区之间的切换
如果你打开了多个工作区,则可以通过单击 CTRL + ALT +上箭头 或 CTRL + ALT +下箭头 轻松地在各个工作区之间切换。
10)快速运行命令
如果只运行命令而不通过访问终端,只需按 Alt F2 键。这将启动控制台文本框,提示你输入命令。如果要启动应用程序,例如FireFox浏览器,可以输入应用程序名称,然后按Enter。
11)注销
如果你想要注销登录,只需按键盘上的 CTRL + ALT + DEL 。如果有打开的应用程序,系统将会提示你是否要注销。如果暂时不想注销,只需单击 Cancel 按钮即可。如果要继续注销,单击 Log Out 。
12)关闭一个窗口
在Ubuntu中有很多种关闭正在运行的应用程序的方法,其中一个跟Windows上一样,那就是 Alt + F4 。另外,你也可以使用 CTRL + Q 来终止一个应用程序。
自定义键盘快捷键
Ubuntu键盘快捷键还不止这些,更多快捷操作方式还等待着你去探索。除此之外,你还可以创建自己的自定义快捷方式。方法也很简单,你只需单击 Settings > Devices > Keyboard ,然后将显示出所有的键盘快捷键列表。如果你要自定义自己的快捷键,可以向下滚动并点击下面显示的加号按钮(+)。
接下来,输入快捷方式的名称以及对应的Ubuntu键盘快捷方式命令。然后单击 Set Shortcut 设置快捷方式,之后再单击弹出窗口右上角的 Add 按钮进行添加。
最后,最近很多小伙伴找我要 Linux学习路线图 ,于是我根据自己的经验,利用业余时间熬夜肝了一个月,整理了一份电子书。无论你是面试还是自我提升,相信都会对你有帮助!目录如下:
免费送给大家,只求大家金指给我点个赞!
电子书 | Linux开发学习路线图
也希望有小伙伴能加入我,把这份电子书做得更完美!
有收获?希望老铁们来个三连击,给更多的人看到这篇文章
推荐阅读: 干货 | 程序员进阶架构师必备资源免费送 神器 | 支持搜索的资源网站
「深度学习福利」大神带你进阶工程师,立即查看>>>
文件传输协议:File Transfer Protocol 早期的三个应用级协议之一,基于C/S结构 数据传输格式:二进制(默认)和文本 双通道协议:命令和数据连接
两种模式:从服务器角度
主动(PORT style):服务器主动连接 命令(控制):客户端:随机port —> 服务器:21/tcp 数据:客户端:随机port <—服务器:20/tcp
被动(PASV style):客户端主动连接 命令(控制):客户端:随机port —> 服务器:21/tcp 数据:客户端:随机port —> 服务器:随机port /tcp
基于C/S结构有专门的客户端和专门的服务端
双通道协议:命令通道和数据通道(所谓双通道就是FTP支持两个端口)
命令通道:走TCP的21端口,用来传输指令的。
数据通道:用来传输数据的
命令通道永远是客户端主动向服务端发起请求:命令通道永远走的是TCP/21端口
数据通道走的是两个端口,通过工作模式来确定走的端口:
主动模式(post)为TCP的20端口。
被动模式走的是随机端口,所谓主动和被动都是以服务器的角色来看。
主动模式(post):服务器端主动连接客户端
被动模式(pasv):客户端主动连接服务器端(会通过命令通道相互交换信息,客户端就会知道服务端的随机端口号)
范例:服务器被动模式数据端口 227 Entering Passive Mode (172,16,0,1,224,59) 服务器数据端口为:224*256+59
FTP双通道工作原理解析
FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 (主动模式)FTP的客户端发送 PORT 命令到FTP server。Passive模式(被动模式)FTP的客户端发送 PASV命令到 FTP Server。
命令通道:
是客户端主动向服务器端发起命令请求,同时服务器端开启TCP/21端口号。客户端主动发起三次握手请求。
服务器由两个端口发起链接。其中有一个叫命令通道的端口,有一个是实现数据通道的端口。命令通道是用来通过实现命令的执行。数据端口是用来实现数据的传输,命令通道走的端口是固定的TCP/21端口。如果客户端需要数据传输时,服务就会开启数据通道端口。数据通道走的端口不是固定的,是根据工作模式来判断开启的端口。
数据通道:
下面介绍一个这数据通道的两种方式的工作原理:
主动工作模式(post):服务器端主动连接客户端
FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己数据端口的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。
被动工作模式(pasv):客户端主动连接服务器端(会通过命令通道相互交换信息,客户端就会知道服务端的随机端口号)
在建立控制通道的时候和Standard模式类似,当客户端通过这个通道发送PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。
FTP服务状态码: 1XX:信息 125:数据连接打开 2XX:成功类状态 200:命令OK 230:登录成功 3XX:补充类 331:用户名OK 4XX:客户端错误 425:不能打开数据连接 5XX:服务器错误 530:不能登录
用户认证:
匿名用户:ftp,anonymous,对应Linux用户ftp 系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow 虚拟用户:特定服务的专用用户,独立的用户/密码文件 更多文章和资料|点击下方文字直达 ↓↓↓ 阿里云K8s实战手册 [阿里云CDN排坑指南] CDN ECS运维指南 DevOps实践手册 Hadoop大数据实战手册 Knative云原生应用开发指南 OSS 运维实战手册
「深度学习福利」大神带你进阶工程师,立即查看>>>
环境
操作系统:Ubuntu Kylin 优麒麟 20.04 LTS
适用架构:ARM64(鲲鹏 920 x8、飞腾 FT-2000/4)
准备工作
可能是我的主板 UEFI 固件和 NVIDIA 显卡兼容性还不是太好吧,看不到主板的开机 LOGO 和操作系统启动画面。先使用AMD显卡安装操作系统。
优麒麟 ARM64 目前只有每日构建版,不过,不影响使用。
https://mirrors.cloud.tencent.com/ubuntu-cdimage/ubuntukylin/
请选择 focal 也就是 20.04 LTS,NVIDIA显卡的闭源驱动目前只适配了这个版本的 Ubuntu。
安装依赖
sudo apt install gcc make libglvnd-dev openssh-server
之所以安装 ssh,是因为之前所述的黑屏问题,卸载了开源的 nouveau 驱动,会黑屏,但是操作系统能启动。因此要通过 ssh 安装新驱动。
需要设置静态 IP,这样 ssh 才能顺利连接。
下载驱动
请选择手动搜索。操作系统选择“Linux Aarch64”。
https://www.nvidia.cn/geforce/drivers/
保存到 home,建议不要放在中文目录。
卸载 nouveau
修改 blacklist.conf 文件
sudo nano /etc/modprobe.d/blacklist.conf
打开后在文件末尾添加以下几行
#Following lines are imported for installing nvidia driver
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
保存退出
PS:修改该文件的目的是把原有的相关模块屏蔽以避免冲突
PS:许多Linux发行版默认集成了 Nouveau 驱动,Nouveau 是由第三方为NVIDIA显卡开发的一个开源3D驱动。由于英伟达不拥抱开源,也没能得到 NVIDIA 的认可与开发支持,导致该驱动功能性能远逊于官方驱动。
更新系统
sudo update-initramfs -u
关闭系统
shutdown
安装新驱动
拔下 AMD 显卡,插上 NVIDIA 显卡。开机后会黑屏,请不要慌。系统能启动。等待硬盘不再狂闪后,尝试 ssh 登录。
Windows 中使用 putty,Linux 中直接用终端登录。
输入用户名和密码后,执行安装。
sudo sh ./NVIDIA-Linux-aarch64-450.57.run
注意大小写,也可以使用通配符。
sudo sh ./NVIDIA*.run
按照提示一路下一步就可以了。
重启计算机。
sudo reboot
恭喜你,大功告成了。
参考文献
https://www.cnblogs.com/tzbubble/p/13080642.html
「深度学习福利」大神带你进阶工程师,立即查看>>>
Cloud Performance Test 云压力测试平台(以下简称:C PT )可以提供一站式全链路 云压力测试服务, 通过分布式压力负载机,快速搭建 系统高并发运行场景, 按需模拟千万级用户实时访问,并结合系统资源状态,评估系统承载能力,快速定位系统性能瓶颈。而测试脚本又是 云压力测试平台 的主要组成部分,只有脚本创建成功、调整结果正常,才可以提供给后续测试任务使用。
需要工具:进入 睿象云 官网,注册账户信息,找到“ Cloud Performance Test 云压力测试平台”即可开始进行一次云压力测试之旅。
在 CPT 平台中 测试脚本 主要有5个操作区域: 01-脚本选择区,02-脚本功能添加区,03-脚本内容编辑区,04-脚本日志执行区,05-脚本日志详细结果展示区;
测试脚本分为3个区: 初始域、执行域和结束域,其中初始域和结束域只能能执行一次,执行域针对脚本调试最多可以循环10次,执行任务根据设置的时间自动循环执行域中的脚本内容;
脚本调试循环次数可以在 标识 列中输入数值,最多为10;
脚本选择区
· 通过点击脚本新建选择区中的 new 或者 + 按钮,创建测试脚本
脚本功能添加区
· 脚本功能添加区从左到右操作功能依次为:录制器,调试,添加事项,基本操作,功能设置,逻辑控制,WebSocket,TCP,UDP,MQTT;
脚本内容编辑区
鼠标点击待编辑的URL请求,右侧展示url编辑区内容,包括:请求方法,URL请求编辑,请求报文头选择,请求报文体编辑等;
· 请求方法:支持GET、POST、OPTIONS、HEAD、PUT、DELETE、TERACE、CONNECT共8种,根据接口修改方法;
· URL请求编辑:url可以手动输入url地址
· 请求报文头选择:针对POST请求,可以修改请求报文头,请求报文头支持5种类型,所示:
请求报文头类型选择:
application/x-www-form-urlencoded: 表单模式;
multipart/form-data: 上传附件模式;
application/json: json模式;
application/xml: xml模式;
text/plain: 文本模式;
· 请求报文体编辑:表单模式可以自定义添加和编辑表单; 上传附件模式可以自定义添加和编辑请求报文体及Http multipartFile表单; json模式需要严格为json格式数据; xml模式需要严格为xml格式数据; 文本模式可以输入任意格式数据
脚本日志执行区
· 点击脚本调试按钮后,脚本执行的流水操作会记录在日志执行区中,日志执行区记录了url请求方法、结果、连接描述、耗时和收发字节五项内容;
收发字节单位为【B】
脚本日志详细结果展示区
· 在脚本日志执行区,点击其中的一个url,右侧展示该URL详细结果日志,其中比对数据左侧显示录制的请求和响应信息,右侧为本次调试实际请求和响应信息;
以上就完成了测试脚本的介绍,更多功能欢迎访问睿象云官网体验~