【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
今天学习Apache服务部署静态网站,现将学习和使用过程进行记录。
一、简单的httpd服务配置
1.首先配置本地yum源。
编辑yum配置文件
[root @localhost 20]# vim /etc/yum.repos.d/rhel.repo
[rhel] ####yum源的唯一标识符,不能重复
name=rhel7##yum源描述信息
baseurl=file:///media/cdrom 本地yum 源文件地址
enabled=1###设置此源是否可用,1为可用,0为禁用
gpgcheck=0###设置此源是否校验文件,1为校验,0为不校验
2.安装apache服务程序
yum install -y httpd
安装完成后将httpd加入开机启动项中
systemctl enable httpd
3.配置httpd服务程序的配置文件
httpd的配置文件
服务目录 | /etc/httpd |
---|
主配置文件 | /etc/httpd/conf/httpd.conf |
网站数据目录 | /var/www/html 访问日志 | 错误日志 /var/log/httpd/access_log | /var/log/httpd/error_log |
配置httpd服务程序时最常用的参数以及用途描述
ServerRoot | 服务目录 ServerAdmin | 管理员邮箱 |
---|
User | 运行服务的用户 | Group | 运行服务的用户组 | ServerName | 网站服务器的域名 | DocumentRoot | 网站数据目录 | Directory | 网站数据目录的权限 | Listen | 监听的IP地址与端口号 | DirectoryIndex | 默认的索引页页面 | ErrorLog | 错误日志文件 CustomLog | Timeout 访问日志文件 | 网页超时时间,默认为300秒 | # 创建保存网站数据的目录 mkdir /home/wwwroot -p echo "The Test for HTTPD" >/home/wwwroot/index.html 更改配置文件中的DocumentRoot和Directory路径为/home/wwwroot vim /etc/httpd/conf/http.conf 4.由于更改了默认的DocumentRoot路径,且selinux为开启状态,需要对新建的目录进行安全上下文设置 semanage命令 -l参数用于查询; -a参数用于添加;(其实在实验中结果为修改作用) -m参数用于修改; -d参数用于删除。 设置安全上下文 [root @localhost 20]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot [root @localhost 20]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/* #######此处wwwroot目录后不能加‘/’,否则会出现问题 或者使用 [root @localhost 20]# semanage fcontext -a -t httpd_sys_content_t '/home/wwwroot(/.*)?' 设置完成后使用restorecon 命令对设置生效 [root @localhost 20]# restorecon -Rv /home/wwwroot/ 5.重启httpd服务 systemctl restart httpd 二、配置基于端口号的web服务 1.创建网站服务目录,并写入index文件 [root@localhost 20]# mkdir /home/wwwroot/{6666,8888} [root@localhost 20]# echo "66666666666666666">../6666/index.html [root@localhost 20]# echo "888888888888888888888">../8888/index.html 2.编辑配置文件 [root@localhost 20]# vim /etc/httpd/conf/httpd.conf listen 6666 listen 8888 DocumentRoot /home/wwwroot/6666 ServerName www.chb.com AllowOverride None Require all granted DocumentRoot /home/wwwroot/8888 ServerName www.chb.com AllowOverride None Require all granted 3.对网站目录设置安全上下文并立即生效 ls -ldZ /home/wwwroot/6666 ###查看目录的安全上下文的值 [root@localhost 20]# semanage fcontext -a -t httpd_sys_content_t '/home/wwwroot/6666(/.*)?' [root@localhost 20]# semanage fcontext -a -t httpd_sys_content_t '/home/wwwroot/8888(/.*)?' [root@localhost 20]# restorecon -Rv /home/wwwroot/6666/ /home/wwwroot/8888/ 4、由于新增的端口为6666 8888不是selinux中允许的httpd端口,所以需要对其进行安全域的设置 查找selinux允许的默认端口号 [root@localhost 20]# semanage port -l|grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989 [root@localhost 20]# 发现没有6666和8888,将这两个端口添加,添加后会立即生效 [root@localhost 20]# semanage port -a -t http_port_t -p tcp 6666 [root@localhost 20]# semanage port -a -t http_port_t -p tcp 8888 [root@localhost 20]# semanage port -l |grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 8888, 6666, 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989 5.重新启动httpd的服务程序,网站内容即可浏览 systemctl restart httpd
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> vsftp
NFS
CIFS
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 在使用 Python 写一些 脚本 的时候,在某些情况下,我们需要频繁登陆远程服务去执行一次 命令 ,并返回一些结果。 |
---|
在使用 Python 写一些 脚本 的时候,在某些情况下,我们需要频繁登陆远程服务去执行一次 命令 ,并返回一些结果。 在 shell 环境中,我们是这样子做的。 $ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l" 然后你会发现,你的输出有很多你并不需要,但是又不去不掉的一些信息(也许有方法,请留言交流),类似这样 host: xx.xx.xx.xx, port: xx Warning: Permanently added '[xx.xx.xx.xx]:xx' (RSA) to the list of known hosts. Login failure: [Errno 1] This server is not registered to rmp platform, please confirm whether cdn server. total 4 -rw-r--r-- 1 root root 239 Mar 30 2018 admin-openrc 对于直接使用 shell 命令,来执行命令的,可以直接使用管道,或者将标准输出重定向到文件的方法取得执行命令返回的结果 1. 使用 subprocess 若是使用 Python 来做这件事,通常我们会第一时间,想到使用 os.popen,os.system,commands,subprocess 等一些命令执行库来间接获取 。 但是据我所知,这些库获取的 output 不仅只有标准输出,还包含标准错误(也就是上面那些多余的信息) 所以每次都要对 output 进行的数据清洗,然后整理格式化,才能得到我们想要的数据。 用 subprocess 举个例子,就像这样子 import subprocess ssh_cmd = "sshpass -p ${passwd} ssh -p 22 -l root -o StrictHostKeyChecking=no xx.xx.xx.xx 'ls -l'" status, output = subprocess.getstatusoutput(ssh_cmd) # 数据清理,格式化的就不展示了 通过以上的文字 + 代码的展示 ,可以感觉到 ssh 登陆的几大痛点 痛点一:需要额外安装 sshpass(如果不免密的话) 痛点二:干扰信息太多,数据清理、格式化相当麻烦 痛点三:代码实现不够优雅(有点土),可读性太差 痛点四:ssh 连接不能复用,一次连接仅能执行一次 痛点五:代码无法全平台,仅能在 Linux 和 OSX 上使用 为了解决这几个问题,我搜索了全网关于 Python ssh 的文章,没有看到有完整介绍这方面的技巧的。 为此,我就翻阅了一个很火的 Github 项目:awesome-python-cn (https://github.com/BingmingWong/awesome-python-cn)。 期望在这里,找到有一些关于 远程连接 的一些好用的库。 还真的被我找到了两个 sh.ssh Paramiko 2. 使用 sh.ssh 首先来介绍第一个,sh.ssh sh 是一个可以让你通过函数的调用来完成 Linxu/OSX 系统命令的一个库,非常好用,关于它有机会也写篇介绍。 $ python3 -m pip install sh 今天只介绍它其中的一个函数:ssh 通常两台机器互访,为了方便,可设置免密登陆,这样就不需要输入密码。 这段代码可以实现免密登陆,并执行我们的命令 ls -l from sh import ssh output=ssh("root@xx.xx.xx.xx", "-p 22", "ls -l") print(output) 但有可能 ,我们并不想设置互信免密,为了使这段代码更通用,我假定我们没有设置免密,只能使用密码进行登陆。 问题就来了,要输入密码,必须得使用交互式的方法来输入呀,在 Python 中要如何实现呢? 原来 ssh 方法接收一个 _out 参数,这个参数可以为一个字符串,表示文件路径,也可以是一个文件对象(或者类文件对象),还可以是一个回调函数,意思是当有标准输出时,就会调用将输出内容传给这个函数。 这就好办了呀。 我只要识别到有 password: 字样,就往标准输入写入我的密码就好了呀。 完整代码如下: import sys from sh import ssh aggregated = "" def ssh_interact(char, stdin): global aggregated sys.stdout.write(char.encode()) sys.stdout.flush() aggregated += char if aggregated.endswith("password: "): stdin.put("you_password\n") output=ssh("root@xx.xx.xx.xx", "-p 22", "ls -l",_tty_in=True, _out_bufsize=0, _out=ssh_interact) print(output) 这是根据官方文档(http://amoffat.github.io/sh/tutorials/interacting_with_processes.html?highlight=ssh)给的一些信息,写的一个demo。 尝试运行后,发现程序会一直在运行中,永远不会返回,不会退出,回调函数也永远不会进入。 通过调试查看源代码,仍然查不到问题所在,于是去 Github 上搜了下,原来在 2017 年就已经存在这个问题了,到现在 2020 年了还没有修复,看来使用 sh.ssh 的人并不多,于是我又“追问”了下,期望能得到回复。 以上这个问题,只有在需要输入密码才会出现,如果设置了机器互信是没有问题的。 为了感受 sh.ssh 的使用效果,我设置了机器互信免密,然后使用如下这段代码。 from sh import ssh my_server=ssh.bake("root@xx.xx.xx.xx", "-p 22") # 相当于执行登陆一次执行一次命令,执行完就退出登陆 print(my_server.ls()) # 可在 sleep 期间,手动登陆服务器,使用 top ,查看当前有多少终端在连接 time.sleep(5) # 再次执行这条命令时,登陆终端数将 +1,执行完后,又将 -1 print(my_server.ifconfig()) 惊奇地发现使用 bake 这种方式,my_server.ls() 和 my_server.ifconfig() 这种看似是通过同一个ssh连接,执行两次命令,可实际上,你可以在远程机器上,执行 top 命令看到已连接的终端的变化,会先 +1 再 -1,说明两次命令的执行是通过两次连接实现的。 如此看来,使用 sh.ssh 可以解决痛点一(如果上述问题能得到解决)、痛点二、痛点三。 但是它仍然无法复用 ssh 连接,还是不太方便,不是我理想中的优秀方案。 最重要的一点是, sh 这个模块,仅支持 Linxu/OSX ,在 Windows 你得使用它的兄弟库 - pbs ,然后我又去 pypi 看了一眼 pbs,已经 “年久失修”,没人维护了。 至此,我离 “卒”,就差最后一根稻草了。 3. 使用 paramiko 带着最后一丝希望,我尝试使用了 paramiko 这个库,终于在 paramiko 这里,找回了本应属于 Python 的那种优雅。 你可以通过如下命令去安装它 $ python3 -m pip install paramiko 然后接下来,就介绍几种常用的 ssh 登陆的方法 方法1:基于用户名和密码的 sshclient 方式登录 然后你可以参考如下这段代码,在 Linux/OSX 系统下进行远程连接 import paramiko ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 建立连接 ssh.connect("xx.xx.xx.xx", username="root", port=22, password="you_password") # 使用这个连接执行命令 ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") # 获取输出 print(ssh_stdout.read()) # 关闭连接 ssh.close() 方法2:基于用户名和密码的 transport 方式登录 方法1 是传统的连接服务器、执行命令、关闭的一个操作,多个操作需要连接多次,无法复用连接[痛点四]。 有时候需要登录上服务器执行多个操作,比如执行命令、上传/下载文件,方法1 则无法实现,那就可以使用 transport 的方法。 import paramiko # 建立连接 trans = paramiko.Transport(("xx.xx.xx.xx", 22)) trans.connect(username="root", password="you_passwd") # 将sshclient的对象的transport指定为以上的trans ssh = paramiko.SSHClient() ssh._transport = trans # 剩下的就和上面一样了 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") print(ssh_stdout.read()) # 关闭连接 trans.close() 方法3:基于公钥密钥的 SSHClient 方式登录 import paramiko # 指定本地的RSA私钥文件 # 如果建立密钥对时设置的有密码,password为设定的密码,如无不用指定password参数 pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') # 建立连接 ssh = paramiko.SSHClient() ssh.connect(hostname='xx.xx.xx.xx', port=22, username='you_username', pkey=pkey) # 执行命令 stdin, stdout, stderr = ssh.exec_command('ls -l') # 结果放到stdout中,如果有错误将放到stderr中 print(stdout.read()) # 关闭连接 ssh.close() 方法4:基于密钥的 Transport 方式登录 import paramiko # 指定本地的RSA私钥文件 # 如果建立密钥对时设置的有密码,password为设定的密码,如无不用指定password参数 pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') # 建立连接 trans = paramiko.Transport(('xx.xx.xx.xx', 22)) trans.connect(username='you_username', pkey=pkey) # 将sshclient的对象的transport指定为以上的trans ssh = paramiko.SSHClient() ssh._transport = trans # 执行命令,和传统方法一样 stdin, stdout, stderr = ssh.exec_command('df -hl') print(stdout.read().decode()) # 关闭连接 trans.close() 以上四种方法,可以帮助你实现远程登陆服务器执行命令,如果需要复用连接:一次连接执行多次命令,可以使用 方法二 和 方法四 用完后,记得关闭连接。 实现 sftp 文件传输 同时,paramiko 做为 ssh 的完美解决方案,它非常专业,利用它还可以实现 sftp 文件传输。 import paramiko # 实例化一个trans对象# 实例化一个transport对象 trans = paramiko.Transport(('xx.xx.xx.xx', 22)) # 建立连接 trans.connect(username='you_username', password='you_passwd') # 实例化一个 sftp对象,指定连接的通道 sftp = paramiko.SFTPClient.from_transport(trans) # 发送文件 sftp.put(localpath='/tmp/11.txt', remotepath='/tmp/22.txt') # 下载文件 sftp.get(remotepath='/tmp/22.txt', localpath='/tmp/33.txt') trans.close() 到这里,Paramiko 已经完胜了,但是仍然有一个痛点我们没有提及,就是多平台,说的就是 Windows,这里就有一件好事,一件坏事了,。 好事就是:paramiko 支持 windows 坏事就是:你需要做很多复杂的准备,你可 google 解决,但是我建议你直接放弃,坑太深了。 4. 写在最后 经过了一番对比,和一些实例的展示,可以看出 Paramiko 是一个专业、让人省心的 ssh 利器,个人认为 Paramiko 模块是运维人员必学模块之一,如果你恰好需要在 Python 代码中实现 ssh 到远程服务器去获取一些信息,那么我把 Paramiko 推荐给你。 最后,希望这篇文章,能给你带来帮助。 本文地址: https://www.linuxprobe.com/log-in-to-remote-service-python.html 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> https://jdk.java.net/archive/ lwk@qwfys:~$ wget https://download.java.net/java/GA/jdk11/28/GPL/openjdk-11+28_linux-x64_bin.tar.gz -O /tmp/openjdk-11+28_linux-x64_bin.tar.gz lwk@qwfys:~$ sudo tar xfvz /tmp/openjdk-11+28_linux-x64_bin.tar.gz --directory /usr/lib/jvm lwk@qwfys:~$ rm -f /tmp/openjdk-11+28_linux-x64_bin.tar.gz lwk@qwfys:~$ sudo sh -c 'for bin in /usr/lib/jvm/jdk-11/bin/*; do update-alternatives --install /usr/bin/$(basename $bin) $(basename $bin) $bin 100; done' lwk@qwfys:~$ sudo sh -c 'for bin in /usr/lib/jvm/jdk-11/bin/*; do update-alternatives --set $(basename $bin) $bin; done' 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 1.介绍(官方) Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。 2.主流配置中心比较 3.搭建 本篇只介绍在本地搭建运行。linux搭建的话,本地用maven打包,放服务器跑就好了 3.1 下载 从github上下载代码到本地: https://github.com/ctripcorp/apollo 3.2 创建数据库 执行根目录下的scripts/sql下的apolloconfigdb.sql和apolloportaldb.sql文件,创建数据库 3.3 修改build文件 修改下面的两个数据库连接配置 apollo_config_db_url=jdbc:mysql://url:3306/ApolloConfigDB?characterEncoding=utf8 apollo_config_db_username=***** apollo_config_db_password=***** apollo_portal_db_url=jdbc:mysql://url:3306/ApolloPortalDB?characterEncoding=utf8 apollo_portal_db_username=***** apollo_portal_db_password=***** 3.4 打包 执行build.sh 3.5 启动 分别启动以下三个jar包 \apollo-adminservice\target\apollo-adminservice-1.6.0-SNAPSHOT.jar \apollo-configservice\target\apollo-configservice-1.6.0-SNAPSHOT.jar \apollo-portal\target\apollo-portal-1.6.0-SNAPSHOT.jar 访问localhsot:8070 访问apollo后台(账号:apollo,密码:admin),apollo搭建至此就完成了 欢迎扫描下面图片关注我的个人公众号,回复“资源”可以获取java核心知识整理和经典书籍
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> Docker是一个开源工具,它可以让创建和管理 linux 容器变得简单。容器就像是轻量级的虚拟机,作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多优势。 |
---|
环境: Centos 7 ip:172.16.1.10 Docker version 1.13.1 运行一个容器、“-i”捕获标准输入输出、“-t分配一个控制台” [root@localhost ~]# docker run -i -t centos /bin/bash [root@86a46aa13531 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@86a46aa13531 /]# 创建镜像 -a 作者信息,-m 提交信息,-p 提交时暂停容器运行,如果提交成功会返回一个id数字串。 [root@localhost ~]# docker commit -m "aaa" -a "chao" 86a46aa13531 sha256:6efd478542f1a99b20796c9372c2976b87344263a051dbf39fd385ea4dbb8873 查看镜像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE chao latest 7b6e3368140a 47 hours ago 237 MB 6efd478542f1 47 hours ago 237 MB docker.io/centos latest 470671670cac 6 weeks ago 237 MB 转出转入镜像 docker save 命令 转出,docker load 命令 转入。 转出chao镜像为CHAO [root@localhost ~]# docker save -o CHAO.tar chao:latest [root@localhost ~]# ls 123 anaconda-ks.cfg CHAO.tar initial-setup-ks.cfg 删除镜像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE chao latest 7b6e3368140a 47 hours ago 237 MB 6efd478542f1 47 hours ago 237 MB docker.io/centos latest 470671670cac 6 weeks ago 237 MB [root@localhost ~]# docker rmi -f 7b6e3368140a Untagged: chao:latest Deleted: sha256:7b6e3368140ac0e977bc37110f267e3c7b641e0b42ba04e93b1bbda46331c29c [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 6efd478542f1 47 hours ago 237 MB docker.io/centos latest 470671670cac 6 weeks ago 237 MB 转入镜像 [root@localhost ~]# docker load < chao.tar Loaded image: chao:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE chao latest 7b6e3368140a 47 hours ago 237 MB 6efd478542f1 47 hours ago 237 MB docker.io/centos latest 470671670cac 6 weeks ago 237 MB 以上就是docker的基础操作 本文原创地址: https://www.linuxprobe.com/rhel-docker-xuni.html 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> ( 一) iptables 与Firewalld 防火墙 防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制。在RHEL7系统中,firewalld防火墙取代了iptables防火墙。iptables与firewalld都不是真正的防火墙,而是一种服务,是用来定义防火墙策略的防火墙管理工具。iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。 防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。 1.1 、iptables iptables 服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下: 在进行路由选择前处理数据包(PREROUTING); 即SNAT源地址转换 。 处理流入的数据包(INPUT); WAN à LAN 。 处理流出的数据包(OUTPUT); LAN à WAN 。 处理转发的数据包(FORWARD); 在进行路由选择后处理数据包(POSTROUTING); 即DNAT目的地址转换 。 ACCEPT( 允许流量通过)、REJECT(告诉对方拒绝流量通过)、LOG(记录日志信息)、DROP(不告诉对方拒绝流量通过)。其中,DROP(不告诉对方拒绝流量通过)直接将流量丢弃而且不响应;REJECT(告诉对方拒绝流量通过)则会在拒绝流量后再回复一条“您的信息已经收到,但是被扔掉了”信息,从而让流量发送方清晰地看到数据被拒绝的响应信息。 iptables 是一款基于 命令 行的防火墙策略管理工具。iptables命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成功,iptables就会根据策略规则所预设的动作来处理这些流量。防火墙策略规则的匹配顺序是从上至下的,因此要把较为严格、优先级较高的策略规则放到前面,以免发生错误。 iptables 中常用的参数以及作用: 参数 | 作用 |
---|
-P | 设置默认策略 | -F | 清空规则链 | -L | 查看规则链 | -A | 在规则链的 末尾 加入新规则 | -I num | 在规则链的 头部 加入新规则 | -D num | 删除某一条规则 | -s | 匹配来源地址IP/MASK,加叹号“!”表示除这个IP外 | -d | 匹配目标地址 | -i 网卡名称 | 匹配从这块网卡流入的数据 | -o 网卡名称 | 匹配从这块网卡流出的数据 | -p | 匹配协议,如TCP、UDP、ICMP --dport num | --sport num 匹配目标端口号,格式: --dport num 或--dport= num | 匹配来源端口号,格式: --sport num 或--sport= num |
[root @linuxprobe ~]# iptables -L // 查看规则链 [root @linuxprobe ~]# iptables -F // 清空规则链 [root @linuxprobe ~]# iptables -P INPUT DROP // 设置INPUT规则链的默认策略为拒绝DROP,其它拒绝的策略动作使用REJECT。使用-P参数后不再使用-j参数。 [root @linuxprobe ~]# iptables -I INPUT -p icmp -j ACCEPT // 向INPUT规则链中添加允许ICMP流量进入的策略规则 [root @linuxprobe ~]# iptables -D INPUT 2 // 删除INPUT规则链中的策略(策略编号2) [root@linuxprobe ~]# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport=22 -j ACCEPT [root@linuxprobe ~]# iptables -I INPUT -p tcp --dport=22 -j REJECT // 将INPUT规则链设置为只允许指定网段的主机访问本机的22端口,拒绝来自其他所有主机的流量。 --dport 后面可用=号跟端口号,也可用空格跟端口号。 [root@linuxprobe ~]# iptables -I INPUT -s 192.168.20.0/24 -d 192.168.10.10 -p tcp --dport=80 -j REJECT // 向INPUT规则链中添加拒绝192.168.20.0/24子网访问192.168.10.10的80端口(Web服务)的策略规则。 [root@linuxprobe ~]# iptables -A INPUT -p tcp --dport=1000:2000 -j REJECT [root@linuxprobe ~]# iptables -A INPUT -p udp --dport=1000:2000 -j REJECT // 向INPUT规则链中添加拒绝所有主机访问本机1000~1024端口的策略规则。如果要限制某个端口的全部流量则需要配置匹配TCP和UDP的流量。 注意:iptables命令配置的防火墙规则默认会在系统下一次重启时失效,如果想让配置的防火墙策略 永久生效 , 还要执行保存命令:[root@linuxprobe ~]# service iptables save 1.2 、firewalld RHEL7 系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。 firewall-cmd 是firewalld防火墙配置管理工具的CLI(命令行界面)版本。 firewall-config 是firewalld防火墙配置管理工具的GUI(图形用户界面)版本。 区域(zone)是firewalld预先准备的防火墙策略集合(或策略模板)。用户可以根据场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。 firewalld 中常用的区域名称及策略规则 ( 匹配从本机外部INPUT进入网卡的流量) : public :默认当前正在使用的区域。 注:public、DMZ、external、internal 区域只允许选中的服务通过。 trusted :默认允许所有流入的流量(没有开放任何服务 )。 drop :默认拒绝所有流入的流量(任何流入网络的包都被丢弃,不作出任何响应,只允许流出的网络连接。即使开放了某些服务(比如http),这些服务的数据也是不允许通过)。 说明:默认情况下是允许所有类型的ICMP通过 。 1.2.1 、firewalld防火墙配置管理工具CLI(命令行界面):firewall-cmd firewall-cmd 命令中使用的参数以及作用: 参数 | 作用 |
---|
--get-default-zone | 查询默认的区域名称 | --set-default-zone=< 区域名称> | 设置默认的区域,使其永久生效 | --get-zones | 显示可用的区域 | --get-services | 显示预先定义的服务 | --get-active-zones | 显示当前正在使用的区域与网卡名称 | --add-source= | 将源自此IP或子网的流量导向指定的区域 | --remove-source= | 不再将源自此IP或子网的流量导向某个指定区域 | --add-interface=< 网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 | --change-interface=< 网卡名称> | 将某个网卡与区域进行关联,与“--zone= 区域 ”结合使用。 | --list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 | --list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 | --add-service=< 服务名> | 设置默认区域允许该服务的流量 | --add-port=< 端口号/协议> | 设置默认区域允许该端口的流量 | --remove-service=< 服务名> | 设置默认区域不再允许该服务的流量 | --remove-port=< 端口号/协议> | 设置默认区域不再允许该端口的流量 | --reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 --panic-on | --panic-off 开启应急状况模式 | 关闭应急状况模式 |
firewalld 配置的防火墙策略默认为 运行时(Runtime)模式 ,又称为 当前生效模式 ,而且随着 系统的重启会失效 。如果想让配置策略一直存在,就需要使用 永久(Permanent)模式 了,方法就是在用firewall-cmd命令正常设置防火墙策略时添加--permanent参数,这样配置的防火墙策略就可以永久生效,参 需要系统重启之后才能自动永久生效 。让配置的策略 立即生效 ,需要手动执行 firewall-cmd --reload 命令。 // 执行 yum install firewalld命令进行安装 // 启动 :systemctl start firewalld // 关闭:systemctl stop firewalld // 查看状态:systemctl status firewalld // 查看状态:firewall-cmd --state // 开机启用:systemctl enable firewalld // 开机禁用:systemctl disable firewalld //firewalld 的默认区域配置文件位置在 /etc/firewalld/zones/ 下的.xml文件中 。 [root@linuxprobe ~]# firewall-cmd --state running // 查看firewall的运行状态 [root@linuxprobe ~]# systemctl status firewalld.service firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled) Active: active (running) since Sun 2020-03-08 11:20:14 CST; 22min ago Main PID: 1034 (firewalld) CGroup: /system.slice/firewalld.service └─1034 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid Mar 08 11:20:13 linuxprobe.com systemd[1]: Starting firewalld - dynamic firewall daemon... Mar 08 11:20:14 linuxprobe.com systemd[1]: Started firewalld - dynamic firewall daemon. // 查看firewall服务状态 =========================================================== [root@linuxprobe ~]# firewall-cmd --set-default-zone=public success // 设置firewalld服务默认所使用的区域。 [root@linuxprobe ~]# firewall-cmd --get-default-zone public // 查看firewalld服务默认所使用的区域。 =========================================================== [root@linuxprobe ~]# firewall-cmd --set-default-zone=trusted success // 设置firewalld服务当前所使用的区域为trusted。 [root@linuxprobe ~]# firewall-cmd --get-default-zone trusted //trusted 区域设置成功。 =========================================================== [root@linuxprobe ~]# firewall-cmd --get-zones block dmz drop external home internal public trusted work [root@linuxprobe ~]# firewall-cmd --get-services amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https [root@linuxprobe ~]# firewall-cmd --get-active-zones public interfaces: eno16777736 =========================================================== [root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-source=192.168.20.0/24 Success [root@linuxprobe ~]# firewall-cmd --permanent --zone=public --remove-source=192.168.20.0/24 success =========================================================== [root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777736 external // 查询eno16777738网卡在firewalld服务中的区域。 [root@linuxprobe ~]# firewall-cmd --permanent --zone=public --change-interface=eno16777736 success [root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777736 external [root@linuxprobe ~]# firewall-cmd --permanent --get-zone-of-interface=eno16777736 public // 把firewalld服务中eno16777736网卡的默认区域external修改为public,需要在系统重启后生效。分别查看当前与永久模式下的区域名称。 =========================================================== [root@linuxprobe ~]# firewall-cmd --panic-on [root@linuxprobe ~]# firewall-cmd --panic-off // 启动或关闭firewalld防火墙服务的应急状况模式,阻断一切 进出流量 的网络连接(当远程控制服务器时请慎用)。 =========================================================== [root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=http Success [root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=https success // 把firewalld服务中请求http和https协议的流量设置为永久允许。 [root@linuxprobe ~]# firewall-cmd --zone=public --query-service=http no [root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https no // 未立即生效前 查询public区域是否允许请求 http 和https协议 的流量。 [root@linuxprobe ~]# firewall-cmd --reload Success // 立即生效 [root@linuxprobe ~]# firewall-cmd --zone=public --query-service=http Yes [root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https yes // 立即生效前 查询public区域是否允许请求 http 和https协议 的流量。 =========================================================== [root@linuxprobe ~]# firewall-cmd --permanent --zone=public --remove-service=http success [root@linuxprobe ~]# firewall-cmd --reload Success // 把firewalld服务中请求HTTP协议的流量设置为永久拒绝,并立即生效。 =========================================================== [root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-port=8080-8090/tcp success [root@linuxprobe ~]# firewall-cmd --reload success [root@linuxprobe ~]# firewall-cmd --zone=public --list-ports 8080-8090/tcp // 把在firewalld服务中访问8080至8090端口的流量策略设置为允许,且立即生效。 =========================================================== 端口转发(访问端口A时转发到端口B)配置: 命令格式:firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址> [root@linuxprobe ~]# firewall-cmd --permanent --zone= public --add-forward-port=port= 888 :proto= tcp :toport= 22 :toaddr= 192.168.10.10 success [root@linuxprobe ~]# firewall-cmd --reload success // 把原本访问192.168.10.10主机888端口的流量转发到22端口,要求当前和长期均有效,并立即生效。 在客户端使用ssh命令尝试访问192.168.10.10主机的888端口: [root@linuxprobe ~]#ssh -p 888 192.168.10.10 =========================================================== firewalld 富规则(优先级在所有的防火墙策略中是最高的): firewalld 中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务/端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。 [root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" destination address="192.168.10.10" service name="ssh" accept log level=warning audit" success [root@linuxprobe ~]# firewall-cmd --reload success // 在firewalld服务中配置一条富规则,使其允许192.168.10.0/24网段的所有用户访问192.168.10.10主机的ssh服务(22端口),同时记录告警日志并审计。 中英文对比 1.2.2 、firewalld防火墙配置管理工具GUI(图形用户界面):firewall-config [root@linuxprobe ~]# firewall-config ① : 选择运行时(Runtime)模式或永久(Permanent)模式配置。 如要使配置的策略立即生效,可通过option菜单中的Reload Firewalld实现。 ② :可选的策略集合区域(策略或区域模板)列表。 ③ :常用的系统服务列表, 可在永久(Permanent)模式下自定义服务(先定义名称,在名称中再添加端口和协议)。 ④ :当前正在使用的区域, 可通过option菜单中的Change Default Zone进行修改。 ⑤ :管理 ( 选择为允许、不选为拒绝) 当前使用区域被选中的服务。与 ⑫ 对应。 ⑥ :管理 ( 自定义) 当前被选中区域中的端口。 ⑦ :开启或关闭 SNAT( 源地址转换) 协议技术。 ⑧ :设置端口转发策略, 即客户端访问外部虚拟端口A转发到内部真实端口B 。 ⑨ :控制请求icmp服务的流量。 ⑩ :管理防火墙的富规则。 如:服务或端口、协议、端口转发、SNAT源地址转换,ACCEPT允许或REJECT拒绝的动作,源和目标地址,是否记录日志及日志的级别,是否审计。 ⑪ :管理网卡设备。 把网卡与区域(策略)进行绑定。 ⑫ :被选中区域的服务,若勾选了相应服务前面的复选框,则表示允许与该服务相关的流量。与 ⑤ 对应。 ⑬ :firewall-config工具的运行状态。默认区域( 可通过option菜单中的Change Default Zone进行修改 ),应急状况模式(Panic Mode)是否启用(enabled或disabled)。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> Kubernetes正式宣布,Kubernetes产品安全委员会正在启动由CNCF资助的新漏洞赏金计划,以奖励在Kubernetes中发现安全漏洞的研究人员。 |
---|
根据CNCF的说法,Kubernetes必须遵守最高级别的安全性。早在2019年8月,CNCF就建立了安全审核工作组并进行了Kubernetes的首次安全审核。该审核帮助社区确定了从一般弱点到关键漏洞的问题,使他们能够解决这些漏洞并添加文档来帮助用户。 自2018年初以来,CNCF计划启动漏洞赏金计划。现在,经过几个月的私人测试,Kubernetes Bug Bounty向所有安全研究人员开放。漏洞赏金计划由安全公司HackerOne运营。 范围是什么 该漏洞赏金涵盖了存储在GitHub上的主要Kubernetes代码。 Kubernetes表示,他们还对集群攻击特别感兴趣,例如特权升级,身份验证错误以及kubelet或API服务器中的远程代码执行。 社区管理工具(例如Kubernetes邮件列表或Slack频道)不在范围内。容器转义,对 Linux 内核的攻击或其他依赖项(例如etcd)也超出范围,应向其安全团队报告。 奖励金额 对于核心Kubernetes程序中发现的安全漏洞,奖励范围从针对低优先级问题的200美元到针对关键问题的10,000美元不等。有关赏金计划工作原理的更多详细信息,请访问HackerOne的 Kubernetes赏金页面 。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 使用Windows 10远程控制Ubuntu 16.04,网上很多需要安装xfce桌面的。今天介绍一下,不需要安装其他桌面,使用Ubuntu 16.04自带桌面,漂亮美观。 Ubuntu16.04端: 1、打开终端,安装xrdp,vncserver sudo apt-get install xrdp vnc4server xbase-clients 2、安装desktop sharing(Ubuntu16.04默认已经安装),可以到应用商店下载。打开desktop sharing,设置如下: 3、安装安装dconf-editor,取消权限限制: sudo apt-get install dconf-editor dconf-editor设置:org > gnome > desktop > remote-access,取消 “requlre-encryption” Windows 10端: 搜索远程桌面连接,输入Ubuntu的ip地址,点击连接。 选择vnc-any,输入Ubuntu的ip地址,端口不变(5900),桌面共享设定的密码,即可远程连接到ubuntu 16.04桌面。
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 有一个Pod用了nginx做proxy,proxy_pass使用的是域名,Nginx会在每次启动和重载设置时,使用DNS将域名解析为IP地址缓存下来,并在之后一直使用这个IP!只有通过nginx -s reload这样的重启才会强制刷新IP https://blog.51cto.com/renzhiyuan/1980890 https://www.nginx.com/blog/dns-service-discovery-nginx-plus/ mark 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 大数据(big data),IT行业术语,是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 |
---|
Hive 在大数据场景下,报表很重要一项是UV(Unique Visitor)统计,即某时间段内用户人数。例如,查看一周内app的用户分布情况,Hive中写HiveQL实现: select app, count(distinct uid) as uv from log_table where week_cal = '2016-03-27' Pig 与之类似,Pig的写法: -- all users define DISTINCT_COUNT(A, a) returns dist { B = foreach $A generate $a; unique_B = distinct B; C = group unique_B all; $dist = foreach C generate SIZE(unique_B); } A = load '/path/to/data' using PigStorage() as (app, uid); B = DISTINCT_COUNT(A, uid); -- A = load '/path/to/data' using PigStorage() as (app, uid); B = distinct A; C = group B by app; D = foreach C generate group as app, COUNT($1) as uv; -- suitable for small cardinality scenarios D = foreach C generate group as app, SIZE($1) as uv; DataFu 为pig提供基数估计的UDF datafu.pig.stats.HyperLogLogPlusPlus,其采用HyperLogLog++算法,更为快速地Distinct Count: define HyperLogLogPlusPlus datafu.pig.stats.HyperLogLogPlusPlus(); A = load '/path/to/data' using PigStorage() as (app, uid); B = group A by app; C = foreach B generate group as app, HyperLogLogPlusPlus($1) as uv; Spark 在Spark中,Load数据后通过RDD一系列的转换——map、distinct、reduceByKey进行Distinct Count: rdd.map { row => (row.app, row.uid) } .distinct() .map { line => (line._1, 1) } .reduceByKey(_ + _) // or rdd.map { row => (row.app, row.uid) } .distinct() .mapValues{ _ => 1 } .reduceByKey(_ + _) // or rdd.map { row => (row.app, row.uid) } .distinct() .map(_._1) .countByValue() 同时,Spark提供近似Distinct Count的API: rdd.map { row => (row.app, row.uid) } .countApproxDistinctByKey(0.001) 实现是基于HyperLogLog算法: The algorithm used is based on streamlib's implementation of "HyperLogLog in Practice: Algorithmic Engineering of a State of The Art Cardinality Estimation Algorithm", available here. 或者,将Schema化的RDD转成DataFrame后,registerTempTable然后执行sql命令亦可: val sqlContext = new SQLContext(sc) val df = rdd.toDF() df.registerTempTable("app_table") val appUsers = sqlContext.sql("select app, count(distinct uid) as uv from app_table group by app") 本文地址: https://www.linuxprobe.com/big-data-sequence.html 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 一、当前工作目录 1、docker run使用 -w参数 2、kubernetes 可以使用设置环境变量PWD的方式实现 二、运行的用户 1、docker run使用-u参数 2、K8S使用 pod.spec.securityContext. runAsUser pod级别 运行容器进程的uid 默认为在image metadata中指定的用户 可在SecurityContext中设置 containers.securityContext. runAsUser 容器级别 containers: - name: sec-ctx-demo securityContext: runAsUser: 0 # root allowPrivilegeEscalation: false 三、Secret 1、通过文件生成: kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt $ kubectl describe secrets/db-user-pass Name: db-user-pass Namespace: default Labels: Annotations: Type: Opaque Data ==== password.txt: 12 bytes username.txt: 5 bytes 2、通过yaml文件生成: 创建一个secret.yaml文件,内容用base64编码 $ echo -n 'admin' | base64 YWRtaW4= $ echo -n '1f2d1e2e67df' | base64 MWYyZDFlMmU2N2Rm yaml文件内容: apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: redis volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret 四、端口: 1、 Pod中的 container.ports.containerPort : 这里containerPort是容器内部的port 2、 Service 的 ports.port : service暴露在cluster ip上的端口,通过:port访问服务 3、 Service 的 ports. targetPort: 8080 Pod的外部访问端口,port和nodePort的数据通过这个端口进入到Pod内部,Pod里面的containers的端口映射到这个端口,提供服务 4、S ervice 的 ports. nodePort: 30001 Node节点的端口,:nodePort 是提供给集群外部客户访问service的入口 5、hostport与nodeport 什么是HostPort? 创建Kubernetes中的工作负载时,你必须在“容器”部分的Kubernetes YAML规范中指定HostPort设置。当您选择HostPort进行映射时,Rancher会在内部执行此操作。指定HostPort后,在部署pod容器的主机上,该端口会暴露给外部访问。在 : 上的流量将会被路由到pod容器的专用端口。 什么是NodePort? 而ServiceType中的其中一种类型就是我们下文要说的NodePort,它提供对为工作负载窗口创建的Kubernetes服务的外部访问。 再回过头来看运行Nginx镜像的工作负载。对于此工作负载,我们需要对外暴露私有容器端口80。 要实现这一目的,我们可以为工作负载创建NodePort服务。NodePort服务规范如下所示: NodePort的优点: 创建NodePort服务将为工作负载pod提供静态的公共端点。因此,即使pod被动态销毁,Kubernetes也可以在集群中的任何位置部署工作负载,而无需更改公共端点。 pod的规模不受集群中节点数量的限制。Nodeport允许将公共访问与pod的数量和位置分离。 https://blog.51cto.com/12462495/2163239?source=dra 五、目录挂载: 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)。 emptyDir的定义如下: template: metadata: labels: app: app-demo tier: frontend spec: volumes: - name: datavol emptyDir: {} containers: - name: tomcat-demo image: tomcat volumeMounts: - mountPath: /mydata-data name: datavol imagePullPolicy: IfNotPresent hostPath的定义如下: volumes: - name: "persistent-storage" hostPath: path: "/data" 附录: 1、 Kubernetes中文社区 2、 k8s中secret解析 3、 Kubernetes编排文件里的各种Port 4、 Kubernetes的一些基本知识 5、 轻松了解K8s 6、 K8s-yaml的使用及命令 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 接续第4章部分内容 while条件循环语句 --是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数,完全不同于for循环语句中有目标、有范围的使用场景。while循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环 [root@linuxprobe ~]# vim Guess.sh #!/bin/bash PRICE=$(expr $RANDOM % 1000) TIMES=0 echo "商品实际价格为0-999之间,猜猜看是多少?" while true do read -p "请输入您猜测的价格数目:" INT let TIMES++ if [ $INT -eq $PRICE ] ; then echo "恭喜您答对了,实际价格是 $PRICE" echo "您总共猜测了 $TIMES 次" exit 0 elif [ $INT -gt $PRICE ] ; then echo "太高了!" else echo "太低了!" fi done $RANDOM变量 --来调取出一个随机的数值(范围为0~32767) expr命令 --用于判断用户输入的数值是等于,大于还是小于,并取得数值 let TIMES++ --当每次循环到let TIMES++命令时都会让TIMES变量内的数值加1 case条件测试语句 [root@linuxprobe ~]# vim Checkkeys.sh #!/bin/bash read -p "请输入一个字符,并按Enter键确认:" KEY case "$KEY" in [a-z]|[A-Z]) ( 逻辑“或” |,固定格式,Shell脚本中的逻辑“或”不同 ) echo "您输入的是 字母。" ;; ( 双分号结束 ) [0-9]) echo "您输入的是 数字。" ;; *) ( 兜底 ) echo "您输入的是 空格、功能键或其他控制字符。" esac [root@linuxprobe ~]# bash Checkkeys.sh 请输入一个字符,并按Enter键确认:6 您输入的是 数字。 [root@linuxprobe ~]# bash Checkkeys.sh 请输入一个字符,并按Enter键确认:p 您输入的是 字母。 [root@linuxprobe ~]# bash Checkkeys.sh 请输入一个字符,并按Enter键确认:^[[15~ 您输入的是 空格、功能键或其他控制字符。 计划任务服务程序 一次性计划任务 at --格式:at 时间 at -l 列出已有的计划任务 at -c 编码 显示具体的工作内容 at -r 编码 删除某个计划任务 atrm 编码 删除某个计划任务 ctrl+D 结束编写计划任务 周期性计划任务 crond crond 服务名称 crontab 配置工具 crontab -e 创建、编辑计划任务命令 crontab -l 查看当前计划任务命令 crontab -r 删除某条计划任务命令 crontab -u 编辑他人的计划任务命令 crond 口诀"分、时、日、月、星期 命令"这是使用crond服务设置任务的参数格式, 如果某些字段没有设置需要用星号( * )占位 字段 说明 分钟 取值为0~59的整数 小时 取值为0~23的任意整数 日期 取值为1~31的任意整数 月份 取值为1~12的任意整数 星期 取值为0~7的任意整数,其中0与7均为星期日 命令 要执行的命令或程序脚本 --e.g * * * * * /usr/sbin/reboot 30 1 5 3 * /usr/sbin/reboot 每年3月5日1点30分重启 20 2 1-3 * * /usr/sbin/reboot 每月1-3日2点20分重启 30 */2 4 * * /usr/sbin/reboot 每年4月每天每隔2小时30分进行重启 =============================================我·是·分·割·线============================================= 第5章 用户身份与文件权限 用户身份与能力 --RHEL 7 系统中,用户分为以下几种: --用户的UID具有唯一性 管理员 uid:0 root 系统用户 uid:1-999 RHEL5/6 1-499(系统用户) 普通用户 uid:1000-无穷 RHEL5/6 500-65535(普通用户) --用户组号码(GID, Group IDentification ),同一用户组可以添加多个用户 --Linux系统中创建每个用户时,将自动创建一个与其同名的 基本用户组 ,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为 扩展用户组 。 一个用户只有一个基本用户组 , 但是可以有多个扩展用户组 useradd命令 --用于创建新用户,格式:“useradd [选项] 用户名” --创建用户账户时,默认的用户家目录会被存放在/home 目录中,默认的 Shell 解释器为/bin/bash , 而且默认会创建一个与该用户同名的基本用户组 参数 作用 -d 指定用户的家目录(默认为/home/username) -e 账户的到期时间,格式为YYYY-MM-DD. -u 指定该用户的默认UID -g 指定一个初始的用户基本组(必须已存在) -G 指定一个或多个扩展用户组 -N 不创建与用户同名的基本用户组 -s 指定该用户的默认Shell解释器 --e.g 下面我们创建一个普通用户并指定家目录的路径、用户的UID以及Shell解释器。在下面的命令中,请注意/sbin/nologin,它是终端解释器中的一员,与Bash解释器有着天壤之别。一旦用户的解释器被设置为nologin,则代表该用户不能登录到系统中: [root@linuxprobe ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linuxprobe [root@linuxprobe ~]# id linuxprobe uid=8888(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe) groupadd命令 --用于创建用户组,格式:“groupadd [选项] 群组名” --e.g [root@linuxprobe ~]# groupadd ronny usermod命令 --用于修改用户的属性,格式为“usermod [选项] 用户名” --用户的信息保存在/etc/passwd文件中 参数 作用 -c 填写用户账户的备注信息 -d -m 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 -e 账户的到期时间,格式为YYYY-MM-DD -g 变更所属用户组 (基本用户组) -G 变更扩展用户组 (扩展用户组) -L 锁定用户禁止其登录系统 -U 解锁用户,允许其登录系统 -s 变更默认终端 -u 修改用户的UID --e.g 我们先来看一下账户linuxprobe的默认信息: [root@linuxprobe ~]# id linuxprobe uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe) 然后将用户linuxprobe加入到root用户组中,这样扩展组列表中则会出现root用户组的字样,而基本组不会受到影响: [root@linuxprobe ~]# usermod -G root linuxprobe [root@linuxprobe ~]# id linuxprobe uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root) 再来试试用-u参数修改linuxprobe用户的UID号码值。除此之外,我们还可以用-g参数修改用户的基本组ID,用-G参数修改用户扩展组ID。 [root@linuxprobe ~]# usermod -u 8888 linuxprobe [root@linuxprobe ~]# id linuxprobe uid=8888(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root) passwd命令 --用于修改用户密码、过期时间、认证信息等,格式为“passwd [选项] [用户名]” 参数 作用 -l 锁定用户,禁止其登录 -u 解除锁定,允许用户登录 --stdin 允许通过标准输入修改用户密码,如echo "NewPassWord" | passwd --stdin Username -d 使该用户可用空密码登录系统 -e 强制用户在下次登录时修改密码 -S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 --e.g [root@linuxprobe ~]# passwd Changing password for user root. New password:此处输入密码值 Retype new password: 再次输入进行确认 passwd: all authentication tokens updated successfully. [root@linuxprobe ~]# passwd linuxprobe Changing password for user linuxprobe. New password:此处输入密码值 Retype new password: 再次输入进行确认 passwd: all authentication tokens updated successfully. --e.g 可以使用passwd命令禁止该用户登录系统,等假期结束回归工作岗位时,再使用该命令允许用户登录系统,而不是将其删除。这样既保证了这段时间内系统的安全,也避免了频繁添加、删除用户带来的麻烦: [root@linuxprobe ~]# passwd -l linuxprobe Locking password for user linuxprobe. passwd: Success [root@linuxprobe ~]# passwd -S linuxprobe linuxprobe LK 2017-12-26 0 99999 7 -1 (Password locked.) [root@linuxprobe ~]# passwd -u linuxprobe Unlocking password for user linuxprobe. passwd: Success [root@linuxprobe ~]# passwd -S linuxprobe linuxprobe PS 2017-12-26 0 99999 7 -1 (Password set, SHA512 crypt.) userdel命令 --用于删除用户,格式为“userdel [选项] 用户名” 参数 作用 -f 强制删除用户 -r 同时删除用户及用户家目录 --e.g 下面使用userdel命令将linuxprobe用户删除,其操作如下: [root@linuxprobe ~]# id linuxprobe uid=8888(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root) [root@linuxprobe ~]# userdel -r linuxprobe [root@linuxprobe ~]# id linuxprobe id: linuxprobe: no such user 文件权限与归属 -:普通文件 d:目录文件 l:链接文件 b:块设备文件 c:字符设备文件 p:管道文件
--e.g 数字权限 文件权限 764 rwxrw-r-- 642 rw-r---w- 153 --xr-x-wx 731 rwx-wx--x 复习:第4章 预习:28日第5章,29日第6章,3月1日第7章 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 重定向 管道符 通配符 转义符 环境变量 重定向 重定向 (把命令和文件结合起来使用) 输入重定向 < 将文件重定向到命令里 ,让文件去匹配命令执行,与正常的名 命令对文件的执行方向相反 ,但结果一样 将数据流导入到命令中去跑! 给命令传参 ! | 符号 | 作用 命令 < 文件 | 将文件作为命令的标准输入 命令 << 分界符 | 命令 < 文件1 > 文件2 从标准输入中读入,直到遇见分界符才停止 | 将文件1作为命令的标准输入并将标准输出到文件2 |
---|
2. 输出重定向 > (用的比较多) 就是把原本要输出的屏幕上的东西输出到重定向的文件中 ,又分 =细分两种模式 符号 作用 | 命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) 命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
---|
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) 命令 2>> 文件 | 命令 &> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面) | 将标准输出与错误输出共同写 (逻辑和) | 管道符 把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入做二次处理 命令A | 命令B 将A输出的信息交给B继续处理 例 :修改 linuxprobe用户的的 密码 echo redhat | passwd --stdin linuxprobe 通过管道符传送密码到下一步动作实现重置密码 grep bash /etc/passwd | wc -l 统计有多少用户能登录系统 grep "/sbin/nologin" /etc/passwd | wc -l 统计有多少用户被限制登录 通配符 * 表示空值 匹配所有 例 :ls /dev/sda* 匹配所有sda相关的值 ls /dev/sda? 只匹配sda后一位字符 ,但不会显示 dev/ sda因为不能匹配空值 ls /dev/sda???? 匹配后四位字符 ls /dev/sda[0-9] 只匹配数字后缀相关 ls /dev/sda[a-z] 匹配大写字母 ls /dev/sda[A-Z] 匹配大写字母 ls /dev/sda[a-z , A-Z] 匹配字母不区分大小写 ls /dev/sda[1,3,5] 针对性匹配 数字 ls /dev/sda[a,c,h] 针对性匹配 字母 转义符 如果变量 参数 对象之间有间隔的要用双引号引起 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。 单引号(''):转义其中所有的变量为单纯的字符串全局转义。 双引号(""):保留其中的变量属性,不进行转义处理。 反引号(``):把其中的命令执行后返回结果。 例: 命令用反引号 =echo 'uname -a' 只取返回结果 如执行uname -a PRRICE=5 echo "price is $PRICE" 输出变量信息 Price is 5 echo "price is \$$PRICE" 输出这个东西5$ Price is $5 如果不用转义符 两个$$显示的是pid号码 , 需要转义为\转换为单纯的文本 ,去掉其特殊功能 环境变量 分类 按照生命周期来分, Linux 环境变量可以分为两类: 1 、永久的:需要用户修改相关的配置文件,变量永久生效。 2 、临时的:用户利用 export 命令,在当前终端下声明环境变量,关闭 Shell 终端失效。 按照作用域来分, Linux 环境变量可以分为: 1 、系统环境变量:系统环境变量对该系统中所有用户都有效。 2 、用户环境变量:顾名思义,这种类型的环境变量只对特定的用户有效。 在Linux系统中,变量名称一般都是大写的,这是一种约定俗成的规范,我们可以直接通过变量名称来提取到对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等,他告诉机器,你输入的命令到哪里去执行。指定命令执行的路径。shell必须搜索系统来找到对应的程序。 PATH环境变量定义了用于进行命令和程序查找的目录。 环境变量 存储各种工具、命令的路径,当使用工具或者命令的时候,系统回去PATH中查找对应的工具与命令 当自己下载了某个工具或者自己写了某个可执行程序,想要不加路径直接执行,则需要将该工具、程序的路径添加入PATH中 shell和操作系统 就像蜗牛壳和蜗牛的关系 在用户执行了一条命令之后,Linux系统中到底发生了什么事情呢?简单来说,命令在Linux中的执行分为4个步骤 第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行 相对路径是相对于程序当前所在的目录,当前目录随着程序的执行不断地发生变化。但是,绝对路径是相对于根路径/的,根路径是恒定不变的 例 : cd /root/usr/local/src 绝对路径 ( 路径的写法一定是由根目录 ) cd /local/src 相对路径 路径从local起 第2步:Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称 别名定义格式 alias= renetwork= ”sys d dretrsasda dasdas ssd “ 一次性的 ,如果需要永久要写入 etc策略文件夹 Alias 查看所有别名 Unalias renetworf 删除定义的别名 第3步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理。可以使用“type命令名称”来判断用户输入的命令是内部命令还是外部命令 内部命令和外部命令最大的区别之处就是性能。内部命令由于构建在 shell 中而不必创建多余的进程,要比外部命令执行快得多。因此和执行更大的脚本道理一样,执行包含很多外部命令的脚本会损害脚本的性能。 1. 内部命令在系统启动时就调入内存,是常驻内存的,所以执行效率高。 2. 外部命令是系统的软件功能,用户需要时才从硬盘中读入内存。 内部命令 (shell脚本自带的功能命令,用得很少) 内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。内部命令是写在bashy源码里面的,其执行速度比外部命令快,因为解析内部命令shell不需要创建子进程。比如:exit,history,cd,echo等 外部命令 (用的很多)whereis ls 查看命令路径 , type查看命令类型内部外部 外部命令是linux系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。通常外部命令的实体并不包含在shell中,但是其命令执行过程是由shell程序控制的。shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。外部命令是在bash之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin......等等。可通过“echo $PATH” 命令查看外部命令的存储路径,比如: ls 、 vi 等。 第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找 常用环境变量 | 变量名称 | 作用 HOME | 用户的主目录(即家目录) |
---|
SHELL | 用户在使用的Shell解释器名称 | HISTSIZE | 输出的历史命令记录条数 | HISTFILESIZE | 保存的历史命令记录条数 | MAIL | 邮件保存路径 | LANG | 系统语言、语系名称 | RANDOM | 生成一个随机数字 | PS1 | Bash解释器的提示符 PATH | EDITOR 定义解释器搜索用户执行命令的路径 | 用户默认的文本编辑器(vim) | Echo "HOME" 显示HOME变量路径 Env 查询系统所有变量 dpjx=usr/bin/etc 创建dpjx变量 export dpjx 提升dpjx变量为全局变量 set | grep dpjx 查询dpjx变量 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 简而言之,输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。 输出重定向可以分未标准输出重定向和错误输出重定向,以及清空写入(覆盖)和追加写入两种模式。 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。 标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕 输入重定向中用到的符号及其作用 符号 | 作用 |
---|
命令 < 文件 | 将文件作为命令的标准输入 命令 << 分隔符 | 命令 < 文件1 > 文件2 从标准输入中读取(键盘输入),直到遇到分隔符才停止 | 将文件1作为命令的输入并将结果输出到文件2中 |
将小文本文件ab.txt的内容复制给cd.txt,除了cp命令外,还可以这样 输出重定向用到的符号及其作用如下 符号 | 作用 |
---|
命令 > 文件 | 将标准输出改为输出到一个文件中,清空文件中原来的数据 | 命令 2> 文件 | 将错误输出改为输出到一个文件中,清空文件中原来的数据 | 命令 >> 文件 | 将标准输出改为输出到一个文件中,追加到文件内容的最后 命令 2>> 文件 | 命令 &>> 文件 将错误输出改为输出到一个文件中,追加到文件内容的最后 | 将所有输出改为输出到一个文件中,追加到文件内容的最后 |
>>符号其实就是 1>>,这里的1被省略了 读取ab.txt的文本内容并输出到ef.txt中,也相当于是cp命令哦 那么你可能会说直接用cp多好呢,那么如果你想将/etc文件夹下面的文件信息统计到ef.txt中怎么办?请看下图 最后玩个小游戏 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 第3章管道符、重定向与环境变量 输入输出重定向 --标准输入重定向(STDIN,文件描述符为0);默认从键盘输入,也可从其他文件或命令中输入 --标准输出重定向(STDOUT,文件描述符为1);默认输出到屏幕 --错误输出重定向(STDERR,文件描述符为2);默认输出到屏幕 输入重定向 --将文件导入到命令中 命令 < 文件 将文件作为命令的标准输入 命令 < < 分界符 从标准输入中读入,直到遇见分界符(任意字符串)才停止 命令 < 文件1 > 文件2 将文件1作为命令的标准输入并将标准输出到文件2 wc -l 命令 --作用是统计文件中内容的行数 [root@linuxperbe ~]# wc -l < readme.txt 将文件信息内容灌输到命令里并统计内容行数 wc -l 输出重定向 --将原显示到屏幕的内容输出到指定文件里 输出重定向分类 --标准输出重定向(清空写入模式) --错误输出重定向(追加写入模式) =============================================我·是·分·割·线============================================= 管道命令符 --格式:命令A | 命令B --作用是把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入(任意门) [root@linuxprobe ~]# grep "/sbin/nologin" /etc/passwd | wc -l 33 ls -l /etc | more 分页查看 --管道符不仅只能在一个命令中使用一次,支持多命令组合使用 --格式:命令A | 命令B | 命令C 密码重置 echo 密码 | passwd --stdin 用户名 --stdin指定接收密码的参数,密码来自于管道符的标准输入 [root@linuxprobe ~]# echo "linuxprobe" | passwd --stdin root Changing password for user root. passwd: all authentication tokens updated successfully. =============================================我·是·分·割·线============================================= 命令行的通配符 --作用是通用的匹配信息符号 星号(*) 代表匹配零个或多个字符 问号(?) 代表匹配单个字符 [0-9] 代表匹配0~9之间的单个数字字符 [a-z] 代表匹配a~z之间的单个小写字母字符 [A-Z] 代表匹配A~Z之间的单个大写字母字符 [A,C,G] 精准匹配某个字母 [1,3,5] 精准匹配某个数字 --e.g [root@linuxprobe ~]# ls -l /dev/sda* brw-rw----. 1 root disk 8, 0 May 4 15:55 /dev/sda brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1 brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2 --e.g [root@linuxprobe ~]# ls -l /dev/sda? brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1 brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2 --e.g [root@linuxprobe ~]# ls -l /dev/sda[0-9] brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1 brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2 [root@linuxprobe ~]# ls -l /dev/sda[1,3,5] brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1 =============================================我·是·分·割·线============================================= 常用的转义符 --作用是用来处理输入的特殊数据 --常用的分为4种 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串 单引号(''):转义其中所有的变量为单纯的字符串(全局转义) 双引号(""):保留其中的变量属性,不进行转义处理 反引号(``):把其中的命令执行后返回结果 注意: --如果参数里由空格用“ "括起,如果没有空格,加与不加都可以 --$(命令) = `命令` --$$作用是显示当前程序的进程ID号码 [root@linuxprobe ~]# echo "Price is $$PRICE" Price is 3767PRICE --要想让" $ "作为美元符号,需要使用反斜杠( \ )来进行转义 [root@linuxprobe ~]# echo "Price is \$$PRICE" Price is $5 =============================================我·是·分·割·线============================================= 重要的环境变量 --命令在Linux中执行分4步 1:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行 2:Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称 3:Bash解释器判断用户输入的是内部命令还是外部命令 4:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH alias命令 --用于创建一个属于自己的别名 --格式:alias 别名=命令 unalias --用于取消一个命令的别名 --格式:unalias 别名 type命令 --作用是判断用户输入的命令是内部命令还是外部命令 PATH变量 --是由多个路径值组成的变量,每个路径值之间用冒号间隔,路径的增加和删除操作将影响到 bash 解释器对Linux命令的查找 env命令 --用来查看Linux系统中所有的环境变量 export命令 --作用是将变量提升为全局变量 --格式:export 变量 Linux系统中最重要的10个环境变量 HOME 用户的主目录(即家目录) SHELL 用户在使用的Shell解释器名称 HISTSIZE 输出的历史命令记录条数 HISTFILESIZE 保存的历史命令记录条数 MAIL 邮件保存路径 ★ LANG ★ 系统语言、语系名称 RANDOM 生成一个随机数字 PS1 Bash解释器的提示符 PATH 定义解释器搜索用户执行命令的路径 EDITOR 用户默认的文本编辑器 注意: --远程服务器显示乱码,则检查 LANG 变量 --更换Bash解释器的提示符 --格式:PS1=# =============================================我·是·分·割·线============================================= 第4章 Vim编辑器与Shell命令脚本 Vim编辑器分为三种模式 --命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作 --输入模式:正常的文本录入 --末行模式:保存或退出文档,以及设置编辑环境 --想要切换到输入模式,在命令模式中按 a,i,o 键就可以了 --按a,i 键效果相同,光标都在同一行 --按o 键,则光标换到下一行 --想要切换到末行模式,在命令模式中输入冒号“:”就可以了 Vim中常用的命令 dd 删除(剪切)光标所在整行(剪切) 5dd 删除(剪切)从光标处开始的5行 yy 复制光标所在整行(复制) 5yy 复制从光标处开始的5行 n 显示搜索命令定位到的下一个字符串 N 显示搜索命令定位到的上一个字符串 u 撤销上一步的操作 p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面(粘贴) /top 找关键词(命令模式) 末行模式中的可用命令 :w 保存 :q 退出 :q! 强制退出(放弃对文档的修改内容) :wq! 强制保存退出 :set nu 显示行号 :set nonu 不显示行号 :命令 执行该命令 :整数 跳转到该行 :s/one/two 将当前光标所在行的第一个one替换成two :s/one/two/g 将当前光标所在行的所有one替换成two :%s/one/two/g 将全文中的所有one替换成two ?字符串 在文本中从下至上搜索该字符串 /字符串 在文本中从上至下搜索该字符串 以上是今天学习到的内容,有很多,难度有所提升,需要多练习 复习:第3章,Vim编辑器 预习:第4章 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> Kali Linux 2020.1乱码问题 Kali Linux 2020.1安装后,默认XFCE桌面字体显示为乱码。由于缺少中文字体包,所以需要安装中文字体。在终端执行如下命令: apt-get install fonts-wqy-microhei fonts-wqy-zenhei 成功执行以上命令后,重新启动系统即可。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 一、背景 在现今的社会中,每个公司都是软件公司,无论是通过台式机、云服务还是移动设备,软件都已成为世界各地、各个公司日常工作的工具。 例如, 汽车是带轮子的计算机,空调是数据终端,而银行在手机中提供服务,等等。 在这个新的世界中,软件更新可以满足客户的需求。每一个交付都是您更新,或破坏,与客户间信任的机会。如何才能保证您的每个更新都以最快的速度提供一流的服务? 这就是为什么DevOps对您的 公司 很重要。当您加快高质量软件的交付速度时,客户会大呼过瘾,并且您可以对市场需求的变化迅速做出反应。DevOps 通过减少在测试、评估和发布等各阶段之间,以及与相关干系人之间的摩擦,来加快高质量软件的交付速度。识别并解决这个过程中的痛点可以推进D evOps 的成功建设 。 良好的制品仓库可以促进软件在DevOps流程中的运转。它存储了过程中所有的二进制制品( artifacts ,也称为工件),同时也保留了有关它们的信息,从而减少了不确定性,并使自动化工具能够自由、快速地运行 。 在加速软件交付的过程中通常会遇到下述的六大障碍,而良好的制品仓库可以帮助解决它们,以实现从代码到客户的快速、持续的软件更新与发布 。 二、障碍一,您了解您所有的构建吗? 您的开发人员团队每天 都 可以生成许多构建 ,而 您 能全部 跟踪 和掌握所有的构建吗 ? 如果没有全面的解决方案,那您可能会知道哪个版本是最新的,但却无法确认哪个版本才是最好的。您也无法可靠地追溯构建的历史,并掌握组成该交付版本的各个部分都是来自何处。 当构建失败时,您能够识别并回退有问题的部分吗?您如何才能查明哪些构建存在问题,以及问题出现在构建过程中哪个位置,以便您或开发人员可以快速提供修复 。 解决方案:通用记录系 统 为您所有的构建建造一个制品中心,作为所有在DevOps流水线中运转的制品的唯一真实来源。在中心的仓库中管理和版本化所有构建的产出,意味着您可以轻松找到功能最佳、最新的构建。 制品仓库能够跟踪制品使用的位置,及其先前的所有版本,从而提供了丰富的数据,来帮助您追溯所有构建的来源及其祖先。您可以快速查看一个版本与另一个版本之间的差异,了解每个版本的制作方式,并找到可帮助您修复错误版本的参考。 三、障碍二,您的过程中有人工操作吗? 在DevOps过程中,每个 需要人 工 介入的地方都会带来风险。 例如,人工的检验 会增加延迟 ,生产环境的重复构建 会带来不确定性 , 必须手动更改 、 维护和执行 的用于工 具管理或构建部署的脚本会浪费时间,而且容易出错。 这些成本昂贵的过程,任何一个都会减慢正确的软件版本发布到最终用户的速度 。 解决方案:自动化和流程管 理 如上一部分所讲,保管您所有构建和制品的中央制品仓库为构建管理提供了便利。但如果同时它也可以收集有关制品的信息,这将赋予您更多的能力。您对制品的了解越多,就越能实现更好的自动化,并使您的构建工具能够做出明智的决策,从而统一并加速整个部署过程中的软件交付。 您的制品仓库应该能够为您的构建工具提供丰富的、灵活的查询和命令接口,以便它们可以不在您的干预下自动完成工作。如果它使用标准的、平台无关的访问机制,如 REST API ,则您可以任意选择最适合您的 CI 服务器。 一旦您能够实现DevOps流程的自动化,就可以更好地确保发布到生产中的每个版本都遵循相同的流程,并且符合通用标准。 四、障碍三,您规范管理了所有的构建依赖吗? 现在的软件应用开发的特点,一是多语言并存,二是架构在公共框架、公共库的基础之上。从而开发人员在构建过程中为这多钟开发语言和技术都拉取了大量的外部依赖,而每种语言和技术对于依赖的管理都有其自己的要求和接口。您将如何管理它们? 这些外部资源可以随时更改,并且对其质量的控制和管理程度参差不齐,有的根本就没有保证。您如何确定每个版本中的用到了哪些依赖?如何可靠地复用其中的某个依赖?如何检测悄然发生的有害更新? 而且,您的构建过程不可能跑得比访问这些远程资源的链接快,繁重的网络负载会减慢构建速度,而访问的中断会导致您原来可靠的构建失败。 解决方案:依赖管 理 使用本地制品仓库来代理存储外部依赖的远程资源,进而将所有外部依赖纳入统一管理。借助制品仓库对这些外部依赖的本地缓存,可以保证始终以所需的版本、最快的速度来完成构建 。 更好的是,一旦您的制品仓库掌握了这些外部依赖,它就可以像其他制品一样,为这些外部依赖保存和维护相同的信息。通过跟踪依赖的历史记录和使用过程,就能始终确认每个构建中都采用了哪个版本的依赖项。 五、障碍四,您是如何在DevOps流程中传递交付版本的? 许多DevOps流程中,在测试、验证和发布的每个阶段,都需要基于全部或部分源代码进行重新构建。这就导致每个新版本都需要花费更多的时间,并且可能需要每个干系人进行手动评估和触发。更糟的是,随着开发人员持续地更改共享代码,每次重新构建都会带来不确定性,不得不在每个阶段重复相同的质量检查。 一旦某个构建通过了当前检查,您如何将其实际推进到下一阶段?手动将该构建推送到下一阶段的过程很容易出错。而且,您还需要一种在整个DevO p s过程中向整个团队传达该构建状态的方法。 解决方案: 元数据和升级管理 如障碍二的解决方案中所述,本地制品仓库不仅管理了所有构建及其制品,还管理了制品相关的信息,也可称为制品的元数据。这些元数据可以帮助您对该制品的质量进行检验,来源进行跟踪。 在DevOps流程中,各个阶段之间交付版本的推进,推荐的最佳实践是避免重复构建,而是采用制品升级的方式。也就是说,在前一个阶段完成质量检查后,制品带着其元数据,一起升级到下一个阶段。下一个阶段首先根据元数据对该制品进行质量检查和评测,确认达到质量标准再开始本阶段的工作。 升级的方式,使得每个阶段都直接基于制品开展工作,避免重复构建,在提升效率的同时,也降低了不确定性的风险。同时,针对元数据的检测,既保证了制品在各个阶段的一致性,避免篡改,又有助于提升质量检测的自动化程度,减少人工的介入,提高效率的同时,也降低了出错风险。 六、障碍五,您是如何满足客户不断增长的需求的? 为了满足客户日益增长的需求, 您需要今天 多做 ,明天做 得更多 。 这会加重 许多业务团队的负担 ,进而 可能会减慢整个开发流程 。 而 基础架构 中的任何单点故障都可能是灾难性的。 地理位置分散的团队需要始终能够以相同的速度获得相同的资源,任何业务更新或容量升级造成的服务中断都会浪费大量的生产时间。 解决方案:企业级支持 企业级支持的解决方案可提供适应您的规模及成长的能力和灵活性 。 可以在云平台中工作的制品仓库可以帮助您无限地扩展存储和计算的成本。您的制品仓库可以使用的云供应商越多,您获得的控制权就越大。 SaaS 订阅选项可确保您的资源始终可用并且是最新的。 高可用、多活的集群配置可以确保高负载下制品仓库的响应能力。其冗余还为灾难恢复提供了容错支持,并实现了零宕机的升级和维护。 支持多站点复制同步的制品仓库可以为跨地域的分布式团队提供全球范围内DevOps过程中资源、信息的快速分享。 七、障碍六,您适应变更的成本有多高? 响应 所有 的 客户意味着在 多个 运行 系统 中使用多种语言进行开发 。某 个部门可 能用 Go为云 平台 编写代码,而另一个部门则可 能用 Java为移动设备编写代码。但是每种 语言和 技术都有其自己的要求和支持 的 工具。 您将为 DevOps 使用哪种基础架构?现在,在您自己的数据中心中安全运行可能是最有意义的。而未来,您可能需要云平台的灵活性,或者将它们结合起来以获得各自的优势。您将可以自由选择最适合您需求的供应商,并在需求变化时灵活地进行更改 。 解决方案:混合云的解决方 案 支持混合云架构的制品仓库可以帮助您的交付过程自动化,无论您使用的是哪种语言或运行于何种平台。通过 REST API 进行访问,可以方便、灵活地与您已经在使用的工具进行对接 。 作为 DevOps 系统的核心,您的制品仓库在云平台中的功能必须与在本地自己的服务器上的性能相同。在任何环境间都能够轻松地升级构建、推进交付的解决方案可以有效地帮助您在功能强大的混合云中实现 DevOps 。对所有主要提供商(例如 AWS 、 Google Cloud 、 Azure 、阿里云等)的集成支持,可以帮助您实现避免供应商绑定的多云策略 。 您也应该能够自主地选择付款方式。您需要的解决方案应该是,无论您选择固定的许可费用还是灵活的 SaaS 订阅,都能够帮助您自由地构建现在和将来使用的系统。 五、总结 功能齐全的制品仓库将帮助您实现自动化的软件交付流程,并支持您采用新的工作方式。它可以为您提供对流程的控制和洞察力,从而可以解决出现的问题并不断改进您的方法。经过稳健的设计后,您的制品仓库可以灵活地适应企业的特殊需求。 同样重要的是,您需要一个可以在您的 DevOps 建设过程中成为良好合作伙伴的解决方案提供商。他们应该了解不同的方法和行业趋势。 JFrog 的 Artifactory 制品仓库是端到端 DevOps 平台的核心,用于自动化管理、保护、分发和监视所有类型的制品。 Artifactory 得到了近 6000 家客户的信任,其中包括了世界 500 强中 93 %的客户。亚马逊、 Facebook 、谷歌、华为、 VMware 等世界顶级品牌都依靠 JFrog 来管理其制品,推进其DevOps进程。 希望 Artifactory 同样能够帮助您解决上述的六大障碍,成功建设DevOps体系,实现高质量、快速、持续的软件发布流程。 更多技术分享请关注在线课堂 微信公众号搜索:jfrogchina 获得课程通知 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> vi www.2.com.conf server { listen 80; server_name www.2.com; root /data/wwwroot/www.2.com; access_log /tmp/2.log; deny all; location ^~ abc { echo "^~*"; } location = "/abc/1.html" { echo "="; } } [root @localhost vhost]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root @localhost vhost]# /usr/local/nginx/sbin/nginx -s reload [root @localhost vhost]# curl -x127.0.0.1:80 www.2.com/alskjdhf -I HTTP/1.1 403 Forbidden Server: nginx/1.8.0 Date: Wed, 19 Feb 2020 08:14:47 GMT Content-Type: text/html Content-Length: 168 Connection: keep-alive 限制ip vi www.2.com.conf server { listen 80; server_name www.2.com; root /data/wwwroot/www.2.com; access_log /tmp/2.log; allow 127.0.0.1; deny all; location ^~ abc { echo "^~*"; } location = "/abc/1.html" { echo "="; } } [root @localhost vhost]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root @localhost vhost]# /usr/local/nginx/sbin/nginx -s reload [root@localhost vhost]# curl -x127.0.0.1:80 www.2.com/alskjdhf -I HTTP/1.1 404 Not Found Server: nginx/1.8.0 Date: Wed, 19 Feb 2020 08:20:32 GMT Content-Type: text/html Content-Length: 168 Connection: keep-alive [root@localhost vhost]# curl -x192.168.239.3:80 www.2.com/alskjdhf -I HTTP/1.1 403 Forbidden Server: nginx/1.8.0 Date: Wed, 19 Feb 2020 08:21:26 GMT Content-Type: text/html Content-Length: 168 Connection: keep-alive 限制IP段 vi www.2.com.conf server { listen 80; server_name www.2.com; root /data/wwwroot/www.2.com; access_log /tmp/2.log; allow 127.0.0.1; allow 192.168.0.0/24; deny all; location ^~ abc { echo "^~*"; } location = "/abc/1.html" { echo "="; } } 实例2 vi.www.2.com.conf server { listen 80; server_name www.2.com; root /data/wwwroot/www.2.com; access_log /tmp/2.log; location ~ admin { allow 192.168.239.0/24; deny all; } location ^~ abc { echo "^~*"; } location = "/abc/1.html" { echo "="; } } [root@localhost vhost]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@localhost vhost]# /usr/local/nginx/sbin/nginx -s reload [root@localhost vhost]# vi www.2.com.conf [root@localhost vhost]# curl -x192.168.239.3:80 www.2.com/alsk/admin/ -I HTTP/1.1 404 Not Found Server: nginx/1.8.0 Date: Wed, 19 Feb 2020 08:45:01 GMT Content-Type: text/html Content-Length: 168 Connection: keep-alive 其他IP拒绝 [root@localhost vhost]# curl -x127.0.0.1:80 www.2.com/alsk/admin/ -I HTTP/1.1 403 Forbidden Server: nginx/1.8.0 Date: Wed, 19 Feb 2020 08:48:47 GMT Content-Type: text/html Content-Length: 168 Connection: keep-alive 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 1、简述OSI七层模型和TCP/IP五层模型 物理层 在OSI参考模型中,物理层(Physical Layer)是参考模型的最低层,也是OSI模型的第一层。 物理层的主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。 数据链路层 数据链路层(Data Link Layer)是OSI模型的第二层,负责建立和管理节点间的链路。该层的主要功能是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。 网络层 网络层(Network Layer)是OSI模型的第三层,它是OSI参考模型中最复杂的一层,也是通信子网的最高一层。它在下两层的基础上向资源子网提供服务。其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。 传输层 OSI下3层的主要任务是数据通信,上3层的任务是数据处理。而传输层(Transport Layer)是OSI模型的第4层。因此该层是通信子网和资源子网的接口和桥梁,起到承上启下的作用。 该层的主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。传输层的作用是向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。该层常见的协议:TCP/IP中的TCP协议、Novell网络中的SPX协议和微软的NetBIOS/NetBEUI协议。 会话层 会话层(Session layer)是OSI模型的第5层,是用户应用程序和网络之间的接口,主要任务是:向两个实体的表示层提供建立和使用连接的方法。将不同实体之间的表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。 表示层 表示层(Presentation Layer)是OSI模型的第六层,它对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。其主要功能是“处理用户信息的表示问题,如编码、数据格式转换和加密解密”等。 应用层 应用层(Application Layer)是OSI参考模型的最高层,它是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。它在其他6层工作的基础上,负责完成网络中应用程序与网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及应用所需的监督、管理和服务等各种协议。此外,该层还负责协调各个应用程序间的工作。 2、总结描述TCP三次握手四次挥手 当客户端希望同server端建立连接时,发送连接请求报文,SYN=1同时seq设定一个初始值,当server端收到请求连接报文会回复一个确认报文,SYN=1,ACK=1,ack为请求报文的seq值+1,同时设定server端seq初始值,当客户端收到确认报文后会回复针对server端报文的确认报文,ACK=1,ack为server端seq值+1,当server端收到该确认报文便建立连接 当客户端希望同server端断开连接时,发送断开连接请求报文,FIN=1,当server端收到请求连接报文会回复一个确认报文,ACK=1,ack为请求报文的seq值+1,然后server端发送断开连接请求报文,FIN=1,当客户端收到断开连接请求报文后会回复针对server端报文的确认报文,ACK=1,ack为server端seq值+1,当server端收到该确认报文便断开连接,客户端等待2MSL之后断开连接 3、描述TCP和UDP的区别 TCP | UDP |
---|
基于连接 | 不建立连接 | 占用资源较多 | 占用资源较小 | 有确认机制保证了数据正确性 | 无法保证数据正确性 相对传输速度慢 | 可靠传输 响应快、传输速度高 | 不可靠传输 |
4、总结IP分类以及每个分类可以分配的IP数量 IP地址包括网络号和主机号 A类地址第一段为网络号,后三段为主机号 可以分配的IP数量=2^可变的网络ID数,即2^7=128,去除0网络为127个 每个网络中可以分配的IP数=2^主机ID数-2,即2^24-2=16777214个 B类地址前两段为网络号,后两段为主机号 可以分配的IP数量=2^可变的网络ID数,即2^14=16384个 每个网络中可以分配的IP数=2^主机ID数-2,即2^16-2=65534个 C类地址前三段为网络号,后一段为主机号 可以分配的IP数量=2^可变的网络ID数,即2^21=2097152个 每个网络中可以分配的IP数=2^主机ID数-2,即2^8-2=254个 D类地址为组播地址:224-239 E类地址为科研保留地址:240-255 5、总结IP配置方法 IP配置方法:命令和配置文件 1)命令 nmcli命令: nmcli [ OPTIONS ] OBJECT { COMMAND | help } device - show and manage network interfaces COMMAND := { status | show | connect | disconnect | delete | wifi | wimax } connection - start, stop, and manage network connections COMMAND := { show | up | down | add | edit | modify | delete | reload | load } modify [ id | uuid | path ] [+|-]. 如何修改IP地址等属性: # nmcli conn modify IFACE [+|-]setting.property value ipv4.address ipv4.gateway ipv4.dns1 ipv4.method ifconfig命令:接口及地址查看和管理 ifconfig [INTERFACE] # ifconfig -a:显示所有接口,包括inactive状态的接口; ifconfig interface [aftype] options | address ... # ifconfig IFACE IP/MASK [up|down] # ifconfig IFACE IP netmask NETMASK options: [-]promisc route命令:路由查看及管理 路由条目类型: 主机路由:目标地址为单个IP; 网络路由:目标地址为IP网络; 默认路由:目标为任意网络,0.0.0.0/0.0.0.0 查看: # route -n 添加: route add [-net|-host] target [netmask Nm] [gw GW] [[dev] If] 示例:route add -net 10.0.0.0/8 gw 192.168.10.1 dev eth1 route add -net 0.0.0.0/0.0.0.0 gw 192.168.10.1 route add default gw 192.168.10.1 删除: route del [-net|-host] target [gw Gw] [netmask Nm] [[dev] If] 示例: route del -net 10.0.0.0/8 gw 192.168.10.1 route del default netstat命令: Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships 显示路由表:netstat -rn -r:显示内核路由表 -n:数字格式 显示网络连接: netstat [--tcp|-t] [--udp|-u] [--udplite|-U] [--sctp|-S] [--raw|-w] [--listening|-l] [--all|-a] [--numeric|-n] [--extend|-e[--extend|-e]] [--program|-p] -t:TCP协议的相关连接,连接均有其状态;FSM(Finate State Machine); -u:UDP相关的连接 -w:raw socket相关的连接 -l:处于监听状态的连接 -a:所有状态 -n:以数字格式显示IP和Port; -e:扩展格式 -p:显示相关的进程及PID; 常用组合: -tan, -uan, -tnl, -unl, -tunlp 显示接口的统计数据: netstat {--interfaces|-I|-i} [iface] [--all|-a] [--extend|-e] [--verbose|-v] [--program|-p] [--numeric|-n] 所有接口: netstat -i 指定接口: netstat -I ip命令: show / manipulate routing, devices, policy routing and tunnels ip [ OPTIONS ] OBJECT { COMMAND | help } OBJECT := { link | addr | route | netns } 注意: OBJECT可简写,各OBJECT的子命令也可简写; ip OBJECT: ip link: network device configuration ip link set - change device attributes dev NAME (default):指明要管理的设备,dev关键字可省略; up和down: multicast on或multicast off:启用或禁用多播功能; name NAME:重命名接口 mtu NUMBER:设置MTU的大小,默认为1500; netns PID:ns为namespace,用于将接口移动到指定的网络名称空间; ip link show - display device attributes ip link help - 显示简要使用帮助; ip netns: - manage network namespaces. ip netns list:列出所有的netns ip netns add NAME:创建指定的netns ip netns del NAME:删除指定的netns ip netns exec NAME COMMAND:在指定的netns中运行命令 ip address - protocol address management. ip address add - add new protocol address ip addr add IFADDR dev IFACE [label NAME]:为额外添加的地址指明接口别名; [broadcast ADDRESS]:广播地址;会根据IP和NETMASK自动计算得到; [scope SCOPE_VALUE]: global:全局可用; link:接口可用; host:仅本机可用; ip address delete - delete protocol address ip addr delete IFADDR dev IFACE ip address show - look at protocol addresses ip addr list [IFACE]:显示接口的地址; ip address flush - flush protocol addresses ip addr flush dev IFACE ip route - routing table management ip route add - add new route ip route change - change route ip route replace - change or add new one ip route add TYPE PREFIX via GW [dev IFACE] [src SOURCE_IP] 示例: # ip route add 192.168.0.0/24 via 10.0.0.1 dev eth1 src 10.0.20.100 # ip route add default via GW ip route delete - delete route ip route del TYPE PRIFIX 示例: # ip route delete 192.168.1.0/24 ip route show - list routes TYPE PRIFIX ip route flush - flush routing tables TYPE PRIFIX ip route get - get a single route ip route get TYPE PRIFIX 示例:ip route get 192.168.0.0/24 ss命令: ss [options] [ FILTER ] 选项: -t:TCP协议的相关连接 -u:UDP相关的连接 -w:raw socket相关的连接 -l:监听状态的连接 -a:所有状态的连接 -n:数字格式 -p:相关的程序及其PID -e:扩展格式信息 -m:内存用量 -o:计时器信息 2)配置文件 IP/NETMASK/GW/DNS等属性的配置文件:/etc/sysconfig/network-scripts/ifcfg-IFACE IFACE:接口名称; 路由的相关配置文件:/etc/sysconfig/networkj-scripts/route-IFACE ifcfg-IFACE配置文件参数: DEVICE:此配置文件对应的设备的名称; ONBOOT:在系统引导过程中,是否激活此接口; UUID:此设备的惟一标识; IPV6INIT:是否初始化IPv6; BOOTPROTO:激活此接口时使用什么协议来配置接口属性,常用的有dhcp、bootp、static、none; TYPE:接口类型,常见的有Ethernet, Bridge; DNS1:第一DNS服务器指向; DNS2:备用DNS服务器指向; DOMAIN:DNS搜索域; IPADDR: IP地址; NETMASK:子网掩码;CentOS 7支持使用PREFIX以长度方式指明子网掩码; GATEWAY:默认网关; USERCTL:是否允许普通用户控制此设备; PEERDNS:如果BOOTPROTO的值为“dhcp”,是否允许dhcp server分配的dns服务器指向覆盖本地手动指定的DNS服务器指向;默认为允许; HWADDR:设备的MAC地址; NM_CONTROLLED:是否使用NetworkManager服务来控制接口; 用到非默认网关路由:/etc/sysconfig/network-scripts/route-IFACE 支持两种配置方式,但不可混用; (1) 每行一个路由条目: TARGET via GW (2) 每三行一个路由条目: ADDRESS#=TARGET NETMASK#=MASK GATEWAY#=NEXTHOP 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 修改Kali Linux背景图片 在Kali Linux中,默认XFCE桌面背景图片保存在/usr/ share/backgrounds/xfce目录。大学霸IT达人默认Undercover桌面背景图片保存在/usr/ share/ kali-undercover/backgrounds目录。如果用户不希望使用默认桌面,则可以将修改的背景图片保存到对应的目录。然后,依次选择“应用程序”|“设置”|“桌面”命令,打开桌面设置界面。在背景选项卡中,选择希望更改的壁纸即可。另外,用户还可以手动选择查看其它目录保存的背景图片,样式、颜色等。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 学习基本的命令,及举列子说明,开始掌握要点了。
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> xp休眠 设置完了。想休眠时就点开始菜单,关闭计算机,按住shift.左边就变成了休眠按钮。点休眠。xp就开始跑进度条。保存当前工作状态。然后就可以拔电脑的插头了。电脑已经关闭。下次开机,就会从休眠中恢复上次工作状态 经过一段时间的测试。发现偶尔小概率会出现系统恢复后网络异常的情况。必须拔掉usb网卡。再接上。我估计是usb网卡驱动的bug.以前用过的笔记本也有这个网卡驱动 休眠 bug. 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> KVM服务器创建虚拟节点 Usage: mkvm mkvm gz-yx33145 8 24 80 192.168.33.145 目录路径:/datafs2/vm/gz-yx33145 创建磁盘 qemu-img create -f qcow2 data-33.145.qcow2 150G 打开图形界面 virt-manager add hardware添加硬盘
yum install xorg-x11-font-utils 826 virt-manager 827 export DISPLAY=localho st:0.0 828 export DISPLAY=localhost:10.0 829 virt-manager 830 echo $DISPLAY 831 virt-manager 832 vim /etc/profile 833 /etc/profile 834 source /etc/profile 835 virt-manager 836 echo $DISPLAY 837 virt-manager 838 export DISPLAY=localhost:10.0 839 virt-manager 840 export DISPLAY=localhost:11.0 841 virt-manager 842 w 843 export DISPLAY=localhost:11.0 844 virt-manager cat /proc/meminfo | grep Huge 863 free 864 free -m 865 cat /proc/meminfo | grep Huge 866 cat /proc/cpuinfo |grep "cores"|uniq 867 cat /proc/cpuinfo 868 cat /proc/cpuinfo |grep "cores"|uniq 869 initial apicid : 47 870 cat /proc/cpuinfo 871 cat /proc/cpuinfo |grep processor |wc -l 872 cat /proc/cpuinfo |grep ""|uniq 873 dmidecode -m CPU 874 dmidecode 875 dmidecode --help 876 dmidecode -mcpu 877 dmidecode -m cpu 878 dmidecode -m memory 879 dmidecode 880 dmidecode -t Memory 881 dmidecode -t Cpu 882 dmidecode -t processor mkvm mkvm gz-yx33147 8 24 80 192.168.33.147 914 mkvm gz-yx33147 8 24 80 192.168.33.147 915 ls 916 ls gz-yx33147 917 ls gz-yx33145 918 cd gz-yx33147/ 919 qemu-img create -f qcow2 data-33.14.qcow2 150G 920 dcli -g list 'lvcreate -l +100%FREE data --name data' 921 du -sh * 922 virsh edit gz-yx3384 923 cd .. 924 cd gz-yx33146 925 ls 926 pwd 927 /datafs2/vm/gz-yx33146 928 ls 929 cd /datafs2/vm/ 930 ls 931 cd gz-yx33147/ 932 ls 933 qemu-img create -f qcow2 data-33.147.qcow2 150G 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> K8S数据保护工具比较:Cohesity、 Kasten、 OpenEBS、 Portworx、 Rancher Longhorn、 和Velero 数据保护对于客户越来越重要。从概念上来说,数据保护包括备份、高可用性、应用连续性、和容灾恢复。所有的企业都需要实施,测试和运维自己的数据保护策略,来避免在发生问题时对商业产生不利影响。随着数据在用户体验和商业流程中的作用越来越重要,对关键数据突然不能访问的问题的容忍度越来越低。根据Uptime Institute的报告(https://uptimeinstitute.com/data-center-outages-are-common-costly-and-preventable) 数据无法访问问题中41%的情况导致的损失均超过了百万美元。企业对高可用性的基础架构的依赖性逐渐增强。 因此,一个有效的数据保护策略可以使宕机时间极少,即便发生意外宕机,应用和数据也都可以快速的恢复。同时数据保护策略还需要确保数据的隐私性和合规性(比如GDPR和CCPA),现在越来越多的用户数据转移到了线上隐私合规愈发重要。 虽然数据保护是一个硬性需求,很多客户仍然做的不够好。传统的数据保护方式在单独主机环境里很出色,但在分布式或跨数据中心环境里就能力不足了。而Kubernetes环境是典型的分布式环境。传统的业务连续性和容灾恢复(BCDR)方案,无法支持现今运行在Kubernetes上的关键商业应用所要求的RPO(Recovery Point Objective)和RTO(Recovery Time Objective)。 由于每个应用和每个客户环境都各不相同,因此数据保护方式也多种多样。当我们考虑数据保护解决方案的时候,一些重要的问题我们首先需要思考: 我是不是只需要在一个单独的数据中心里保护我的数据? 我是否需要保护数中心内和数据中心外的数据,需要建立一个混合的数据保护方案? 是不是合规部门对一些备份和恢复数据的存储位置有要求? 应用对RPO和RTO的要求低还是高? 是否需要对Kubernetes集群里的每一个应用都采用同样水平的数据保护方式? 我们准备对数据保护方案花多少钱,可否对不同的应用采用不同的数据保护方式,以降低成本? 还有一些问题取决于你的目标,比如: 即使出现服务器宕机,或者磁盘宕机,也需要保证Kubernetes应用的高可用。 备份数据和应用的配置,这样我们可以在另一个环境里恢复它们。 一旦出现数据中心服务中断,应用可以即时在另一个环境重启且没有数据损失。 我们可以把数据保护场景分为: 本地高可用 备份和恢复 容灾恢复 这三种场景是所有企业级数据保护的基础,也是评估一个Kubernetes数据保护解决方案能力的重要要素。不同解决方案的客户要求可能各有不同,客户需要根据自身的需求来评估这些要素。通常来说,只有静态数据备份不足以完成有效的数据保护,本地高可用通常是必须的基础性需求。 本地高可用、备份和恢复、容灾恢复是评估一个Kubernetes数据保护解决方案能力的重要要素。 对于Kubernetes,数据保护是一个较新的领域,市场有一些解决方案提供。本文我们要分析Kubernetes应用数据保护领域的一些主要供应商(https://www.computerweekly.com/feature/Spread-of-Kubernetes-spurs-backup-and-disaster-recovery-products)。我们在博文中讨论的解决方案主要是为了保护Kubernetes中正在运行的应用、和应用中的持久性数据,而不是备份Kubernetes的节点服务或者etcd存储,明确这些有助于我们更好的理解数据保护工具和Kubernetes的数据保护。 本地高可用性 本地高可用性指的是保护发生在某单个数据中心的错误,或者是某单个可用性区域内的云平台的错误。当应用正在运行时,如果基础架构、应用或者节点发生错误,都被认为是本地的错误。当我们用Kubernetes数据保护工具来构建本地高可用时,应用的复本可以在用户无感觉的情况下快速恢复,达到对用户的高可用。一个在本地节点错误情况下,宕机的例子:https://thenewstack.io/overcome-stuck-ebs-volumes-running-stateful-containers-aws/。本地高可用性是数据保护的基础。为达到本地高可用性,一般通过建立本地数据复制集的方式。如果本地高可用性是通过从外部其它位置的备份数据恢复的方式进行,那就应该被归类为是备份恢复方案,因为恢复时间会比本地高可用性的方案长很多。 备份和恢复 备份和恢复方案,指的是把Kubernetes上的整个应用,从本地Kubernetes集群上,备份到非本地的另一位置的对象存储里(非本地指位于其他区域的公有云、私有云、或者是本地部署环境)。备份解决方案也可以有多个备份位置。备份通常是为了防止系统错误,或者为了应用的合规和监管要求。而Kubernetes备份,需要符合Kubernetes环境特点。包括: Kubernetes资源,比如Secrets、服务账户、CRDs等 应用配置和数据 这些对象对Kubernetes来说都需要被备份。传统的备份方案一般不会考虑这些Kubernetes的对象,而是通常只把应用所依赖的VM、服务器、磁盘作为备份目标。一个Kubernetes备份解决方案,不仅能备份单个应用,而且可以备份多个应用或者整个Kubernetes命名空间,同时也能够支持传统备份方式的内容,比如调度、Jobs、 retention、加密和分层。 一个Kubernetes备份必须包括Kubernetes的资源比如Secrets、服务账户、CRDs、应用配置和数据。 容灾恢复 与备份类似,容灾恢复也必须要包括Kubernetes的一系列对象,应用配置和数据。并且需要创建主站点之外的容灾站点,这样资源和持久状态能够在主站点出问题时快速恢复到容灾站点。容灾恢复系统也可以处理不同保护层级的RPO和RTO,取决于成本和商业需要的综合考虑。 例如,如果应用不能承担任何数据丢失,那就必须设定零RPO的目标。如果要求没那么高,也可以设定15分钟RPO的目标。再例如,一个应用的RTO要求<2分钟,而另一个应用可以允许1小时之内的宕机时间。 容灾恢复系统必须规划应用如何配置才能够在容灾节点上有效的启动运行。这需要处理应用的元数据,例如标签和复制集等,让它们能够自动启动起来。如果Kubernetes的API不能够被理解和启动,就会产生宕机事故或者数据损失。 Kubernetes数据保护解决方案的比较 我们已经理解了数据保护的多种类型,我们接下来比较一下市场上的解决方案: *比较基于各解决方案提供商的网站和文档。 快速索引 X – 没有这项功能,或者宣称有功能但没有找到任何支持性信息 ❍ – 宣称有这项功能,但是功能较为薄弱 ◑ – 宣称有这项功能,但是功能不完整 ✅ – 宣称有这项功能,并且从网站上的文档来看功能完整 Cohesity Cohesity在网站上介绍,“Cohesity保护Kubernetes命名空间的数据和应用状态。Web-Scale平台备份命名空间包括运行状态,而不仅仅是数据。”Cohesity是数据保护和存储领域的一个主要服务商,它近期也通过备份命名空间的数据和应用,开始支持Kubernetes。但是Cohesity仅仅针对整个命名空间,而不能保护命名空间内的每个独立应用。保护单独应用是很有必要的,因为不是所有命名空间内的应用都需要同一水平的保护级别。因此Cohesity保护的颗粒度还不够。另外Cohesity目前还没有Kubernetes主存储,也还没有基于Kubernetes的容灾恢复方案。由于Cohesity对于备份VM的传统解决方案积累很久,现在进入到对Kubernetes的支持,也是一个很好的解决方案。 Kasten Kasten在网站上介绍,“K10数据管理平台,为Kubernetes而建,为企业运营团队提供易用、可扩展、安全的备份恢复、容灾恢复、和集群间应用迁移能力”。Kasten使用自身构建的存储系统 -EBS/RBD,不支持应用自身所在集群里的复制,因此它无法支持本地高可用。基于云端的块存储来构建Kubernetes卷,经常会由于Stuck Volumes导致应用的宕机。由于没有数据路径的组件,Kasten无法达到数据完全无损的零RPO,备份只能是异步的,因此恢复后的数据与最新的数据会有一定的不同。有时候企业在容灾恢复上的要求不高,但很多企业仍然在容灾恢复上需要零RPO。 OpenEBS OpenEBS这样描述:“我们是应用和本地、网络或云存储之间的抽象层,通过OpenEBS可以减少维护工作量,降低存储成本并且简化管理。”OpenEBS主要集中在本地高可用,也可以和Velero集成来达到OpenEBS 数据管理即服务(DMaaS)。DMaaS能够把Kubernetes有状态应用以及持久数据进行迁移。本地部署、云部署等任意方式都可以互相迁移。相对于Cohesity只备份整个命名空间而非每个独立的Kubernetes应用,OpenEBS只备份独立的应用。应用层级的备份的确更加灵活,但很多客户仍然需要命名空间层级的备份。另外OpenEBS只能用来备份包含持久存储卷的有状态应用,而不能备份或迁移Kubernetes对象和应用配置。OpenEBS备份是基于Velero进行的,而Velero也有自身的局限性 – 不能提供完整的容灾恢复功能,而OpenEBS自身也没有容灾恢复功能的补充,虽然OpenEBS也可以提供类似Kasten那样的异步备份的容灾,但问题也是无法达到数据完全无损的零RPO。 Portworx Portworx是一个端到端的Kubernetes存储和数据管理方案。包括基于容器的CaaS,DBaaS,SaaS,备份恢复,以及容灾恢复。Portworx被市场研究机构GigaOm评为全球第一的Kubernetes存储平台。GigaOm评价Portworx的功能完美适应大型客户与服务提供商的需求。Portworx解决方案支持复杂的Kubernetes基础架构,无论是本地部署还是公有云/混合云部署。在Portworx的支持下,所有的Kubernetes应用都可以获得容器原生存储能力,以及本地高可用、容灾恢复、备份、安全管理、多云间迁移的能力等。Portworx提供一个数据层能够伸展在低延迟的网络上,从而达到零RPO容灾恢复,本地应用的备份和命名空间的备份。Portworx一开始就支持本地高可用,以及后来推出的PX-DR和PX-Backup能够提供更加多样的数据保护能力。 Rancher Longhorn 根据Rancher的描述,Longhorn是“轻量的,可靠的,和强大的。你可以使用简单的Kubectl命令,或者使用Helm来把Longhorn安装到Kubernetes集群上。一旦安装完成,Kubernetes集群就具备了持久存储卷的支持。”虽然比起其他开源解决方案,Longhorn的社区较小,但它近期被接受加入了CNCF。Longhorn有DR Volume的功能,可以被设定成源卷和目标卷,这样卷可以在一个新集群上基于最新的备份被激活。这个很类似Kasten的DR解决方案,是基于备份的,因此无法达到零RPO的能力。同样由于也不含应用元数据,因此也无法达到Kubernetes应用层级的恢复。 Velero Velero描述自己的解决方案:“一个开源工具,可实现安全的备份恢复、容灾和恢复,以及迁移Kubernetes集群资源和持久卷。”Velero自身只能支持无状态应用资源。但是用户可以选择增加插件来达到持久卷声明快照备份。另一个选择是Restic,它通过文件/拷贝方式来实现。Velero自身并没有解决Kubernetes应用的数据问题。但如果结合插件或者Restic一起使用,可以提供备份和恢复,以及基于异步备份的容灾恢复能力 – 类似OpenEBS和Kasten。但是一样也无法提供零RPO的容灾恢复能力。 结语 希望这篇文章能够帮助您更多的了解Kubernetes备份和数据保护解决方案,以及它们与传统的容灾恢复方案或者备份恢复方案有什么不同。各种解决方案在目前云原生架构下的构建方式都各有不同,因此这需要用户根据自身的应用的实际情况与需要,为应用选择不同层级的数据保护机制,从而选择有效的数据保护解决方案。 参考文档: [1]https://www.cohesity.com/resource-assets/solution-brief/Data-Protection-for-Entire-Kubernetes-and-Container-Application-Stack-Solution-Brief.pdf [2] www.kasten.io/product/ [3] https://openebs.io/ [4] https://help.mayadata.io/hc/en-us/articles/360033401591-DMaaS [5] https://github.com/longhorn/longhorn [6]https://velero.io/ 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> iis7远程桌面连接组件是从Windows 2000 Server开始由微软公司提供的,在WINDOWS 2000 SERVER中他不是默认安装的。 该组件一经推出受到了很多用户的拥护和喜好,所以在WINDOWSXP和2003中微软公司将该组件的启用方法进行了改革,我们通过简单的勾选就可以完成在XP和2003下远程桌面连接功能的开启。当然随着时代的进步,我们操作管理的模式也在不断的更新。为了更方便的我们管理我们的服务器,越来越多的人都会用到远程桌面管理连接服务器,让我们更方便跟简洁的用一台电脑来批量操作我们的VPS服务器,现在IIS7远程桌面管理这是我觉得比较好用的一款程序。 我们在使用远程桌面工具的时候难免会出现几个小问题,比如说服务器卡,,今天就为大家介绍并解决远程桌面服务器卡的问题 http://yczm.iis7.com/?dzhd 1.我们打开远程桌面添加 2.添加完进入服务器卡的话我们退出来选择设置 3.选择设置,速度设置,调整色深调到最低 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> VM虚拟机扩展硬盘容量 第一步,关闭系统,给虚拟机硬盘增加空间。 第二步,启动系统。查看硬盘大小和分区情况。 第三步,分区。 第四步,格式化分区。 第五步,挂载。 第六步,开机自动挂载。 第一步: 当前硬盘大小: 扩展到80GB: 点击扩展: 第二步: parted –l命令查看硬盘空间和分区情况(也可以使用fdisk -l),注意使用root权限 可以看到硬盘空间为85.9GB(至于为什么不是80GB我也不太清楚,可能是按1000而不是1024换算的吧)但是只有60多GB被分区,也就是还有20GB没有被分区,这就是下一步的工作。 第三步: fdisk命令对未分区的磁盘空间分区。 m命令查看帮助,n命令增加一个新的分区,选择p主分区,之后都选择默认。最后用w命令保存结果。有时w时,可能没有成功,需要再执行partprobe命令更新分区表。 再用parted -l查看分区结果 可以看到已经多了一个大小为21.5GB的分区。 第四步,格式化分区: 创建分区后,新的分区还没有自己的文件系统,这时候需要将其格式化。 使用mkfs命令: 可以使用df –T命令查看其它分区的文件系统,我的CentOS7采用xfs文件系统,所以命令是mkfs.xfs。 第五步,挂载: 新分区,并格式化后的分区要进行挂载,使用mount命令。 注意要先创建/home/han/new_disk目录。 接下来就可以打开new_disk目录,右键属性看一下大小了 第六步:开机自动挂载, 第五步的挂载操作重启后就没用了,这样每次重启都要重新挂载分区到文件,可以设置成开机自动挂载。 方法是修改/etc/fstab文件 每个字段的具体含义,就不讲解了。 最后,挂载到的文件可能其他用户没有权限,那么就简单用chmod –R 777解决吧 搞定! 水平有限,大神请批评。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> MariaDB是MySQL的一个开源分支,主要是社区在维护,并且完全兼容MySQL,并且可以很方便的称为MySQL的替代 |
---|
MariaDB的诞生正是出自MySQL创始人Michael Widenius之手,命名的来源是他女儿的名字Maria,因为之前他把MySQL卖给sun公司,而sun又被oracle收购,所以MySQL也属于oracle所有,因此存在闭源的风险;而Michael Widenius开发的MariaDB作为MySQL的开源分支,很好的避免的这个潜在的问题,所以MariaDB成为了MySQL未来的替代,很多厂商也越来越关注MariaDB,并且MariaDB在很多方面的性能也要强过MySQL,像目前Windows桌面的php集成开发环境比如xampp还有 linux 和lnmp环境都采用MariaDB作为默认的数据库,所以从MySQL转向MariaDB也是一种趋势,以上说那么多,使用MariaDB的第一步是要部署在操作系统,现在开始在Linux上用编译源码的方式来安装MariaDB 准备物料 首先去MariaDB官网下载安装包,首页是:https://mariadb.org/ 然后点击Download进入下载页,地址是:https://downloads.mariadb.org/ 这里点击绿色按钮下载最新稳定版10.1.18,进入选择页面: 因为这里是编译安装,所以暂时不针对某一系统的二进制包进行下载,这里下载源码包mariadb-10.1.18.tar.gz,下载之后上传至服务器 安装依赖 安装MariaDB之前,首先要安装cmake,另外为了保证不缺依赖,使用yum或者rpm安装依赖:readline-devel,zlib-devel,openssl-devel,libaio-devel并且readline-devel依赖于ncurses-devel,如果使用yum的话会自动将所需依赖安装好,具体 命令 如下: yum -y install readline-devel yum -y install zlib-devel yum -y install openssl-devel yum -y install libaio-devel 这里提前预定mysql的安装目录为/usr/local/mysql并且数据目录为/data1/mysql,这里要建立用户和目录,并且赋予mysql用户权限,操作如下: groupadd -r mysql useradd -g mysql -s /sbin/nologin mysql mkdir /usr/local/mysql mkdir -p /data1/mysql chown -R mysql:mysql /data1/mysql/ 现在可以开始安装了,解压安装包,并进入目录: tar -xvzf mariadb-10.1.18.tar.gz cd mariadb-10.1.18/ 编译安装 执行编译安装: cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data1/mysql -DSYSCONFDIR=/etc -DWITHOUT_TOKUDB=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STPRAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWIYH_READLINE=1 -DWIYH_SSL=system -DVITH_ZLIB=system -DWITH_LOBWRAP=0 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci 这里说明一下:-DCMAKE_INSTALL_PREFIX是指定安装的位置,这里是/usr/local/mysql,-DMYSQL_DATADIR是指定MySQL的数据目录,这里是/data1/mysql,安装目录和数据目录都可以自定义设置,-DSYSCONFDIR是指定配置文件所在的目录,一般都是/etc ,具体的配置文件是/etc/my.cnf,-DWITHOUT_TOKUDB=1这个参数一般都要设置上,表示不安装tokudb引擎,tokudb是MySQL中一款开源的存储引擎,可以管理大量数据并且有一些新的特性,这些是Innodb所不具备的,这里之所以不安装,是因为一般计算机默认是没有Percona Server的,并且加载tokudb还要依赖jemalloc内存优化,一般开发中也是不用tokudb的,所以暂时屏蔽掉,否则在系统中找不到依赖会出现: CMake Error at storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake:179 (message)这样的错误,然后后面那些参数都是可选的,可以加也可以不加,最后的编码建议设置一下,所以编译指令也可以简化成下面这样: cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data1/mysql -DSYSCONFDIR=/etc -DWITHOUT_TOKUDB=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci 注意:如果万一执行中有了错误,可以执行: rm -f CMakeCache.txt 删除编译缓存,让指令重新执行,否则每次读取这个文件, 命令 修改正确也是报错 cmake没问题,可以编译并且安装了: make && make install 时间有点长,耐心等待 执行完成也就是安装完成了,现在执行 cd /usr/local/mysql/ 进入mysql安装目录分别执行下面命令: chown -R mysql:mysql . scripts/mysql_install_db --datadir=/data1/mysql --user=mysql chown -R root . cp support-files/mysql.server /etc/init.d/mysqld 系统配置 然后还可以将mysqld添加至系统服务: chkconfig --add mysqld # 添加至系统服务 chkconfig mysqld on # 设置开机自启动 现在如果启动可能会报错,原因是日志目录没有建立,默认是 /var/log/mariadb/mariadb.log ,后来也可以修改,现在执行: mkdir/var/log/mariadb 建立日志目录,然后执行: /etc/init.d/mysqld start 或者 systemctl start mysqld.service 都可以启动mysql服务 启动服务后,还不能马上进入mysql shell 界面,原因是刚才编译时执行本地socket为: /tmp/mysql.sock 但是查看 /etc/my.cnf 中配置的位置却是: /var/lib/mysql/mysql.sock ,现在执行命令: ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock 建立软链接即可 为了方便可以将mysql目录添加到环境变量,现在可以执行 ./bin/mysql 直接进入MariaDB交互式界面了,默认root用户密码为空: 到这里MariaDB的编译安装过程就全部安装完成了,至于后续的修改密码,远程用户授权,sql操作等等与之前MySQL完全一致,所以就不在详细叙述了 关于MariaDB二进制包的安装,后续可能会继续更新相关的文档 本文地址: https://www.linuxprobe.com/linux-cc-mariadb.html |