数据专栏

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

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>

以用于梳理业务图
添加流量监控 Configuration--->Hosts--->items中查看到key选项 last(0)获取最新的一个数据
系统运维
2019-12-21 14:58:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
0. 下载系统 .img 文件和需要用到的工具 你需要一张可用的 TF 卡,和读卡器。 到树莓派官网(https://www.raspberrypi.org/downloads/)下载系统文件,这里以 Raspbian 系统为例。 到SourceForge(http://sourceforge.net/projects/win32diskimager/)下载写入工具Win32DiskImager。
1. 写入系统到 TF 卡,并通过 ssh 登录
通过读卡器,用 Win32DiskImager 向 TF 卡写入系统。
写入后打开 TF 卡可以看到系统盘的格式 FAT32 可以创建文件,
这个时候新建一个 ssh.txt 的空文件,这个文件会让树莓派启动 sshd。
接上电源,点亮树莓派,树莓派默认:
用户:pi
密码:raspberry
IP:这个可以通过路由器 DHCP 管理客户找到 raspberrypi 这个设备找到,这里假设找到的是 192.168.1.101 ssh pi@192.168.0.101
Windows 10 自带了 ssh ,其他 Windows 系统自己装个 MSYS2 再通过 pacman 装就可以了。
Linux 一般也默认装了 ssh ,没装的自己装上。
装完 ssh 一般也就有了 scp 了。
至此就可以用 ssh 登录树莓派了。
2. 通过 SSH 连接添加公钥
通过 scp 命令远程添加 pi 用户的公钥 scp C:
系统运维
2019-12-17 22:40:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> Win10有很多版本,其中家庭版默认是不提供组策略功能。 打开一个记事本,鼠标左键新建(或WIN+R键,打开运行对话框,输入 notepad 打开记事本) 在记事本保存内容 @echo off   pushd "%~dp0"   dir /b %systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >gp.txt   dir /b %systemroot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>gp.txt   for /f %%i in ('findstr /i . gp.txt 2^>nul') do dism /online /norestart /add-package:"%systemroot%\servicing\Packages\%%i"   pause 通过dir命令遍历系统盘servicing目录,寻找组策略的配置包,找到后写入到gp.txt文件,然后通过dism命令来安装组策略包。 然后另存为 gpedit.bat 文件,(注意文件类型为“所有文件”,只有这样才能保证gpedit.bat是一个批处理文件)
选择鼠标右键以管理员身份运行 gpedit.bat 文件(dism命令需要管理员权限,所以批处理必须以管理员身份运行) 等带批处理完成即可
这时在按WIN+R键运行输入 gpedit.msc ,按回车键或者确定按钮即可打开组策略。
系统运维
2019-12-17 18:16:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
docker基本用法 卸载 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 安装 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 - 设置稳定的仓库 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo #安装docker sudo yum install docker-ce docker-ce-cli containerd.io 镜像加速器 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://vxdxcg5s.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 查看镜像 docker images 拉取 ## 默认会拉取最新的,不过可以指定tags的方式拉取对应的镜像 dokcer pull hello-world(镜像名) 运行 docker run --name hellodocker(别名) hello-world 查看运行状态 docker ps -a 删除 docker rmi -f imageId docker rmi -f $(docker images) ## 删除容器 docker rmi -f $(docker ps -aq) tomcat # -d 后台运行 # --name 指定一个名称 # -p 将默认的8080端口映射为一个新的端口 docker run -d --name mytomcat -p 8888:8080 tomcat # 进入到镜像中 # 可以是containerId或者是names docker exec -it 7940b96bcca6 /bin/bash mysql docker run -d --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 --privileged mysql ### 连接不上的问题排查 docker exec -it mysql /bin/bash mysql -uroot -p Enter password: mysql> select host,user,plugin,authentication_string from mysql.user; #host为 % 表示不限制ip localhost表示本机使用 plugin非mysql_native_password 则需要修改密码 mysql> use mysql; mysql> alter user 'root'@'%' identified with mysql_native_password by '123'; mysql> flush privileges; mysql> select host,user,plugin,authentication_string from mysql.user; image怎么制作的 Dockerfile > https://github.com/docker-library 每一个image都是根据Dockerfile配置生成的
验证 > 将官网上的mogodb的Dockerfile放入到我们的物理主机上, 并执行。 #mogodb-my 起个别名 docker build -t mogodb-my . 根据container生成image docker commit mycentos vim-centos 通过Dockerfile可以追踪image生成的过程便于排查问题,而container的方式看不到生成的细节,所以不推荐使用,可以适当使用。 查看docker占用的系统资源 docker top mytomcat docker stats mytomcat #限制系统资源的使用(否者会无限制消耗系统的资源) #--memory 100M 限制内存 #--cpu-shares 10 限制CPU资源占比,例如两个container一个配置10,一个配置20那么他们两个的CPU占比应该后者是前者的两倍 即1:2 docker run -d --name mytomcat02 --memory 100M --cpu-shares 10 -p 8000:8080 tomcat
Spring Boot 项目做成image FROM openjdk:8 MAINTAINER Bellamy.XIAO LABEL name="demo" version="1.0" author="Bellamy.XIAO" COPY demo-0.0.1-SNAPSHOT.jar demo-image.jar CMD ["java","-jar","demo-image.jar"] ## build docker build -t spring-boot-demo . ## query docker images ## run docker run -d --name demo -p 9000:8080 spring-boot-demo ## log docker logs containerId
推送到远端仓库 # 生成tag: docker tag spring-boot-demo 7634xxx/spring-boot:v1.0 # 官方仓库: https://hub.docker.com 登录: docker login tag: docker tag ImageId 7634xxx/spring-boot :v1.0 push: docker push 7634xxx/spring-boot:v1.0 # 阿里云仓库 登录: sudo docker login --username=xxxx registry.cn-hangzhou.aliyuncs.com tag: sudo docker tag ImageId registry.cn-hangzhou.aliyuncs.com/docker-namesapce/docker-repository:version push : sudo docker push registry.cn-hangzhou.aliyuncs.com/docker-namesapce/docker-repository:version # 私服[harbor]: https://github.com/goharbor/harbor
系统资源监控平台[weaveworks/scope] #下载 sudo curl -L git.io/scope -o /usr/local/bin/scope #授权 sudo chmod a+x /usr/local/bin/scope #启动(可以有多个ip) scope launch 192.0.0.1 #停止 scope stop
Docker核心部分->从网络说起网络 Linux中的网络 namespace 之间的连通性 namespace 是 Linux 2.6.x 内核版本之后支持的特性,主要用于资源的隔离。有了 namespace,一个 Linux 系统就可以抽象出多个网络子系统,各子系统间都有自己的网络设备,协议栈等,彼此之间互不影响。 namespace 间通信 基础部分 ####### 网卡基本操作 ####### # 查看网卡信息 ip link show #或者 ip a # 网卡配置目录 cd /etc/sysconfig/network-scripts/ #给网卡添加临时ip ip addr add 192.168.xxx.xxx/24 dev eth0 #删除ip ip addr delete 192.168.xxx.xxx/24 dev eth0 ------------------------------------------- ####### 将网卡进行隔离 ###### # 创建 network namespace ip netns add ns1 #查看 ip netns list # 查看当前namespace的网卡信息 ip netns exec ns1 ip a # 启动网卡 ip netns exec ns1 ifup lo ---------------------------------------------
不得不说的veth pair技术(virtual Ethernet Pair) eth-pair 就是一对的虚拟设备接口,和 tap/tun 设备不同的是,它都是成对出现的。一端连着协议栈,一端彼此相连着。正因为有这个特性,它常常充当着一个桥梁,连接着各种虚拟网络设备,典型的例子像“两个 namespace 之间的连接”,“Bridge、OVS 之间的连接”,“Docker 容器之间的连接” 等等,以此构建出非常复杂的虚拟网络结构。 # 通过以下方式发现隔离的两个namespace间可以通信了 ip link add veth-ns1 type veth peer name veth-ns2 #绑定network namespace ip link set veth-ns1 netns ns1 # 给网卡添加ip ip netns exec ns1 ip addr add 192.xxx.xxx.10/24 dev veth-ns1 # 启动网卡 ip netns exec ns1 ip link set veth-ns1 up # ns2同理可得,略 # ns1 ping ns2 ip netns exec ns1 ping 192.168.xxx.xxx ----------------------------------------------------
通过如上结论来看docker是否类似 启动2个docker容器(验证容器与容器之间为什么可以相互通信) docker run -d tomcat01 -p 8001:8080 tomcat docker run -d tomcat02 -p 8002:8080 tomcat # 通过上述方式查看物理主机信息 #内容如下 8: veth131fbae@if7: mtu 1500 qdisc noqueue master docker0 state UP group default inet6 aaaa::aaaa:aaaa:aaaa:aaaa/64 scope link valid_lft forever preferred_lft forever 10: veth61cf0b5@if9: mtu 1500 qdisc noqueue master docker0 state UP group default inet6 aaaa::aaaa:aaaa:aaa:aaa/64 scope link valid_lft forever preferred_lft forever 通过上述信息我们可以发现,(veth131fbae@if7和veth61cf0b5@if9),@if7和 @f9 ,通过数字发现7和9,中间像是跳过了一个8 进入到容器一探究竟 # 分别进入到docker 容器中,得到如下内容 7: eth0@if8: mtu 1500 qdisc noqueue state UP group default inet 172.xxx.xxx.2/16 brd 172.xxx.255.255 scope global eth0 valid_lft forever preferred_lft forever 9: eth0@if10: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.xxx.xxx.3/16 brd 172.xxx.255.255 scope global eth0 valid_lft forever preferred_lft forever eth0 @if8 和eth0@if10,由此我们发现了一些端倪, 可以看的出 docker 中的 container 和物理主机中确实是成对出现了这样的网卡信息。 veth131fbae@if7 <--> eth0@if8 、 veth61cf0b5@if9 <---> eth0@if10 ,那么也意味着docker中的网络是按照namespace类似的思想做到资源隔离的
Docker 中的网络模式 #通过如下命令查看 docker network ls NETWORK ID NAME DRIVER SCOPE 15ea9d89d616 bridge bridge local 1c62b0fd4212 host host local 375f1ab17a8b none null local bridge 默认使用的方式 2.host 访问容器不需要进行映射直接可以访问 none 只有一个本地网卡信息 #创建,默认为bridge docker network create net01 #通过如下命令可以得到具体信息 docker network inspect net01 信息如下: [ { "Name": "net01", "Id": "b9fee626fdee", "Created": "2019-12-19T10:50:59.641869093Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "x.0.0.0/16", "Gateway": "x.x.x.x" #网关信息 } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { # 容器信息 "c0f8db51792b9b394b": { "Name": "tomcat03", "EndpointID": "9a966183a87", "MacAddress": "", "IPv4Address": "x.x.x.x/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ] 这是否意味着我们可以通过上述三种方式自定义网络 # 重新启动一个容器,命令如下 docker run -d --name tomcat03 --network net01 -p 8082:8080 tomcat #可以对比容器使用network参数与未使用的ip变化 神奇的是在tomcat03中此刻却无法ping通使用了docker默认的network创建的tomcat01容器。 原因在于自定义的网络跟docker0不在同一个网段所以无法ping通(tomcat03使用的是自定义网络,而tomcat01使用的则是默认的网络),那么tomcat03和tomcat01当然无法ping通。 # 查看当前docker默认的bridge docker inspect bridge [ { "Name": "bridge", "Id": "15ea9d89d6165304b561b", "Created": "2019-12-19T10:43:46.750789678Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "x.x.0.0/16", "Gateway": "x.x.x.x" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { #可以看到默认网络的容器信息 "44371744ca1a": { "Name": "tomcat01", "EndpointID": "7005e8d9f9aab442", "MacAddress": "", "IPv4Address": "x.x.x.x/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ] # 将tomcat01也加入到自定义网络中 docker network connect net01 tomcat01 #再次查看net01发现tomcat01也在当中了 # 通过如下命令查看tomcat01的网络信息发现tomcat01中的网络此时多了一个ip地址 docker inspect tomcat01 #此时tomcat01和tomcat03因为有同网段的ip地址,所以又可以互通 结论: 为什么容器之间能够相互连通,是因为docker会创建这种桥接模式,而桥接模式实际上是使用了veth-pair技术,所以容器之间可以进行通信。
container之间是否可以通过名称互通 如果真的可以那么就不需要担心ip地址的变化了,就像微服务一样,服务与服务之间的调用通过注册咋注册中心上的服务名字即可调用。遗憾的是我们在使用默认的docker网络是无法用名字的方式ping通 #增加link的方式进行指定 docker run -d --name tomcat05 --link tomcat01 -p 8085:8080 tomcat # 自定义网络的方式是可以互通的
多机通信overlay网络 Swarm中实现 # 创建一个overlay网络 docker network create -d overlay o-net #创建mysql docker service create --name mysql -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=db_wordpress --network o-net mysql:5.6 #创建wordpress docker service create --name wordpress -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=123 -e WORDPRESS_DB_HOST=mysql:3306 -e WORDPRESS_DB_NAME=db_wordpress -p 8080:80 --network o-net wordpress #查看网络信息 docker network inspect o-net [ { "Name": "o-net", "Id": "45x28fm6", "Scope": "swarm", "Driver": "overlay", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "Gateway": } ] }, "Containers": { "64cf17fd1f0": { "Name": "mysql.1.s1hfbsju", "EndpointID": "MacAddress": "IPv4Address": }, "lb-overlay-net": { "Name": "overlay-net-endpoint", "EndpointID": , "MacAddress":, "IPv4Address": , "IPv6Address": "" } }, "Options": { "com.docker.network.driver.overlay.vxlanid_list": "4097" }, "Labels": {}, "Peers": [ { "Name": "IP": }, { "Name": "IP": } ] } ]
docker持久化 volume # 查看,创建容器的时候会自动生成一个默认的volume docker volume ls DRIVER VOLUME NAME local 1deb0814c8723496c03aacecbe0535e47f39e1131286f3c0d1090eb8717617e8 local 3a7e9642878f96afe5b307b39dc184aad6f0ea379e53592b989e2d513a44c6b9 local 6f4e05e55601c866a614dd60b05386763e8081b93465472adbdceef5a1a2c60a 如上所示 VOLUME NAME太长不容易记忆 在创建容器的时候可以指定 -v docker run -d --name mysql -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql DRIVER VOLUME NAME local mysql # 查看详情 docker volume inspect mysql [ { "CreatedAt": "2019-12-23T06:40:53Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/mysql/_data", "Name": "mysql", "Options": null, "Scope": "local" } ] # 测试是否能够持久化 1.创建一个数据库tester 2. 退出容器并删除容器 3.查看volume发现,volume并不会随着容器的删除而删除 4.执行命令:docker run -d --name mysql -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql(volume属性指向之前创建的volume->mysql) docker run -d --name mysql -p 3306:3306 -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 --net net-cluster mysql:latest --log-bin=mysql-bin --binlog-format=ROW --server_id=101(甚至可以直接修改my.cnf) 5.进入mysql并show databases;发现之前创建的数据库还在。 Bind Mounts # 1. 创建一个文件 /usr/local/web/1.html 内容:

hello

#2. 挂载并运行:docker run -d --name tomcat -p 8888:8080 -v /usr/local/web/:/usr/local/tomcat/webapps/web/ tomcat 或者 docker run -d --name tomcat02 -p 9000:8080 --mount type=bind,source=/usr/local/web/,target=/usr/local/tomcat/webapps/web/ tomcat #3.访问http://ip:8888/web/1.html查看内容 #4.进入到Tomcat中查看,会发现有个一样的目录和文件。 #5.再次修改物理机中的1.html 加入内容

Docker

#6.重新访问浏览器会发现内容的变化
Docker容器管理 如果使用命令行的方式,需要每次先创建自定义网路、挂载等再一个个的启动运行容器相对来说比较麻烦,下面来看看Docker容器管理。 单机版多容器管理 docker-compose
安装 sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version
版本 https://github.com/docker/compose/releases
命令 https://docs.docker.com/compose/reference/envvars/
示例 #打印访问次数 # application.py import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count) ---------------------- requirements.txt: flask redis ------------------------------- Dockerfile: FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP application.py ENV FLASK_RUN_HOST 0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD ["flask", "run"] --------------------------------------------- docker-compose.yml: version: '3' services: web: build: . ports: - "5000:5000" volumes: - /web networks: - compose-net redis: image: "redis:alpine" volumes: - /redis networks: - compose-net volumes: web: redis: networks: compose-net 注意:如果不指定网络,docker-compose会生成一个默认的网络 集群版多容器管理 docker swarm
示例(1个manager,2个work) manager: docker swarm init --advertise-addr= ip # 日志输出: Swarm initialized: current node (k2bfj4ipf63u) is now a manager. work(2个): $ docker swarm join --token SWMTKN-1-k2bfj4ipf63u192.0.0.1:2377 日志输出: This node joined a swarm as a worker.
查看集群信息 docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION k2bfj4ipf63u * node1 Ready Active Leader 19.03.4 lf9i7sj17u5b node2 Ready Active 19.03.4 69tfr9cq6j61 node3 Ready Active 19.03.4
节点升/降级 #示例命令: docker node promote node2 docker node demote node2
创建一个Tomcat docker service create --name tomcat -p 8080:8080 tomcat
查看swarm的services #命令: docker service ls ID NAME MODE REPLICAS IMAGE PORTS qy870rkl tomcat replicated 1/1 tomcat:latest *:8080->8080/tcp
查看service的启动日志 docker service logs tomcat
查看在哪个node中运行 docker service ps tomcat
扩展service docker service scale tomcat=3
自动恢复 # 删除其中一个容器 docker rm -f bfaxc6smw #查看 $ docker service ps tomcat ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 50000saiypxh tomcat.1 tomcat:latest node2 Running Running 30 minutes ago 3x4bfaxc6smw tomcat.2 tomcat:latest node3 Running Running 19 minutes ago vicrsu2aebud \_ tomcat.2 tomcat:latest node3 Shutdown Failed 19 minutes ago "task: non-zero exit (137)" ot50dhj0b1at tomcat.3 tomcat:latest node1 Running Running 23 minutes ago
删除service docker service rm tomcat # 再次查看 docker service ls
系统运维
2019-12-14 16:44:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
什么是蜜罐
蜜罐其实就是一台无人使用但却被严密监控的网络主机,里面包含着各类虚假的高价值资源和一些已知漏洞,以此吸引入侵者来入侵该主机。并且在被入侵的过程中,实时记录和审计入侵者的所有入侵攻击流量、行为和数据。以此了解入侵者的攻击方式、手段和目的,便于后期快速完成对其的溯源和取证工作。
蜜罐的一些主要构成模块 按实现逻辑划分 控制:将入侵者牢牢控制在指定的网络范围中,使其不能再以此机器作为跳板来攻击其它的机器。 捕获:把入侵者在入侵过程中所产生的各种流量捕获住。 分析:将捕获到的各种数据存到数据库或者其它指定地方,便于后续还原其详细的入侵攻击过程。 按具体实现过程划分 监控各种主机项,如:进程、文件、注册表、网络等。 同时提交给入侵检测,以识别其更详细的入侵手段,并对整个入侵过程做详细记录。 入侵数据汇总分析,其实就是把上述两步所得到的各种数据进行集中分析,最后勾勒出完整的入侵轨迹画像。 最容易理解的说法 蜜罐环境隔离: 使用虚拟环境将物理环境和蜜罐隔绝开,防止某些敏感操作在其真实的系统环境中进行造成破坏。 敏感操作记录:把蜜罐中所有的入侵操作都写进数据库。 邮件报警系统:蜜罐被入侵后自动发送报警邮件通知相关安全应急人员。
蜜罐的分类
1. 低交互蜜罐
低交互蜜罐最大的特点是:蜜罐为攻击者展示的所有攻击弱点和攻击对象都不是真正的产品系统,而是对各种系统及其提供的服务的模拟。由于它的服务都是模拟的行为,所以蜜罐可以获得的信息非常有限,只能对攻击者进行简单的应答。不过,它也是最安全的蜜罐类型。
2. 中交互蜜罐
中交互蜜罐是对真正的操作系统的各种行为的模拟,它提供了更多的交互信息,同时也可以从攻击者的行为中获得更多的信息。在这个模拟行为的系统中,蜜罐此时看起来和一个真正的操作系统没有区别,它们甚至是比真正系统还诱人的攻击目标。
3. 高交互蜜罐
高交互蜜罐具有一个真实的操作系统,它的优点体现在对攻击者提供完全真实的系统。当攻击者获得 ROOT 权限后,受系统、数据真实性的迷惑,他的更多活动和行为将被记录下来。缺点是被入侵的可能性很高,如果整个高交互蜜罐被入侵,那么它就会成为攻击者下一步攻击的跳板,不太安全。
什么是 Cowrie
Cowrie 是一个具有中等交互的 SSH 蜜罐,它可以获取攻击者用于暴力破解的字典、输入的命令以及上传或下载的恶意文件。所有这些攻击记录都会被记载到日志中,以便日后分析。 项目地址:https://github.com/cowrie/cowrie
Cowrie 安装部署
使用源码部署
本次搭建使用的基础环境是 Ubuntu ,以下步骤除切换到虚拟环境中的操作,其它均为 root 权限执行。
安装必要的支持软件 # Python 3 $ sudo apt-get install git python-virtualenv libssl-dev libffi-dev build-essential libpython3-dev python3-minimal authbind virtualenv # Python 2 $ sudo apt-get install git python-virtualenv libssl-dev libffi-dev build-essential libpython-dev python2.7-minimal authbind
添加一个普通用户
对外提供服务的程序均以普通用户身份运行,能更好的保证服务器安全性。 $ sudo adduser --disabled-password cowrie Adding user 'cowrie' ... Adding new group 'cowrie' (1002) ... Adding new user 'cowrie' (1002) with group 'cowrie' ... Changing the user information for cowrie Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] $ sudo su - cowrie
安装 Cowire
由于 Cowire 是采用 Python 开发,为了方便管理和安全,我们就直接将 Cowire 部署到 Python 的虚拟环境中。 下载 Cowire $ cd /home/cowrie/ $ git clone https://github.com/cowrie/cowrie.git 在 Python 虚拟环境中安装 Cowire
进入 Cowrie 所在目录,并安装虚拟环境 $ cd /home/cowrie/cowrie 使用 Python 3 创建虚拟环境 $ virtualenv --python=python3 cowrie-env New python executable in ./cowrie/cowrie-env/bin/python Installing setuptools, pip, wheel...done. 使用 Python 2 创建虚拟环境 $ virtualenv --python=python2 cowrie-env New python executable in ./cowrie/cowrie-env/bin/python Installing setuptools, pip, wheel...done. 激活 Cowrie 环境,并安装必要的软件包 $ source cowrie-env/bin/activate (cowrie-env) $ pip install --upgrade pip (cowrie-env) $ pip install --upgrade -r requirements.txt 创建并修改 Cowire 的配置文件 (cowrie-env) $ cd etc/ (cowrie-env) $ cp cowrie.cfg.dist cowrie.cfg (cowrie-env) $ vi cowrie.cfg 打开 SSH 服务,并且修改监听端口 [ssh] # Enable SSH support # (default: true) enabled = true listen_endpoints = tcp:2222:interface=0.0.0.0 配置日志文件输出
默认情况下, Cowire 支持将日志输出到多个接收终端中。比如:文件文件、 Cucko o、 ELK Stack 、 Graylog 、 Kippo-Graph 、 Splunk 、 SQL ( MySQL 、 SQLite3 、 RethinkDB ) 等等中。这里我们就来说说最常用的文本文件和 MySQL 数据库:​​​​​​​ # 保存在文本文件中,需要配置以下一些内容。 [output_textlog] enabled = true logfile = ${honeypot:log_path}/audit.log format = text
​​​​​​​ # 保存在数据库中,需要配置以下一些内容。 [output_mysql] host = localhost database = cowrie username = cowrie password = PASSWORD HERE port = 3306 debug = false enabled = true
如果是需要保存在 MySQL 数据库中,当然只配置是不行的,你还得需要有一个对应的数据库。如果你没有,可以按下面的步骤进行安装。 安装 MySQL $ sudo apt-get install mysql-server mysql-client libmysqlclient-dev python-mysqldb
安装成功后,你可以通过下面的命令测试是否安装成功。 $ sudo netstat -tap | grep mysql 在 Python 虚拟环境中安装 MySQL 依赖包 $ source cowrie-env/bin/activate $ pip install mysqlclient mysql-python 创建名为 cowrie 的数据库 $ mysql -u root -p mysql> create database cowrie; 创建一个给 Cowrie 访问数据库的用户 mysql> GRANT INSERT, SELECT, UPDATE ON cowrie.* TO 'cowrie'@'localhost' IDENTIFIED BY 'PASSWORD HERE'; mysql> FLUSH PRIVILEGES; mysql> exit 数据库和对应的数据库用户创建完成后,在数据库中导入初始数据的 SQL 语句 $ cd ~/cowrie/docs/sql/ $ mysql -u cowrie -p mysql> USE cowrie; mysql> source mysql.sql; mysql> exit 在 Python 虚拟环境下启动蜜罐 (cowrie-env) $ bin/cowrie start Activating virtualenv "cowrie-env" Starting cowrie with extra arguments [] ... 修改 SSH 默认的监听端口
在 root 用户下将 Ubuntu 自身的 SSH 监听端口进行更改,并修改 Iptables 规则。
首先,我们验证下是否安装 SSH 。​​​​​​​ $ ps -ef|grep sshd root 2720 1 0 Nov 02 ? 00:00:00 /usr/sbin/sshd
如果输出结果和以上类似就证明已经安装,没有安装的话可以使用以下命令安装。 $ apt-get install openssh-server
安装完成后,我们可以修改 sshd_config 文件将默认端口改为一个较高的端口,这里为 51268 。​​​​​​​ $ vim /etc/ssh/sshd_config # Port 22 Port 51268 注意:一定不要与 cowrie.cfg 文件中监听的端口一致,否则进入 22 端口的流量就转发到真正的 SSH 服务端口,蜜罐就不起作用了。
配置 Iptables 进行端口转发
以上都配置好后,最后就是在 Iptables 中新增一条转发规则,将默认到 22 端口的请求转发到蜜罐中对应的端口。​​​​​​​ $ sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222 $ iptables-save
除了使用 Iptables 外,你还可以在没有 Root 权限的条件下使用 Authbind 或 Setcap 将蜜罐绑定到一些特权端口上,以达到伪装一些正常服务的目的。具体方法可以参见官方文档如下部分: https://cowrie.readthedocs.io/en/latest/INSTALL.html#authbind
https://cowrie.readthedocs.io/en/latest/INSTALL.html#setcap
使用 Docker 部署
上面讲解的通过源码安装,主要是为了演示 Cowrie 如何工作的,当然最方便的还是直接使用 Docker 部署。​​​​​​​ $ docker run -p 2222:2222 cowrie/cowrie $ ssh -p 2222 root@localhost
如上所示,只需一条指令, Cowrie 就部署完成了。剩下就只需要自己用 Iptables 进行端口转发就可以了。
Cowrie 日志分析
蜜罐系统的作用主要是用作实时记录和审计入侵者攻击行为和数据,所以最重要的还是事后的日志分析工作。 如果日志记录在文本文件,你可以使用下面的命令进行一些数据统计分析 $ grep login /home/cowrie/cowrie/var/log/cowrie/audit.log | awk '{print $5}' | sort | uniq -c 如果日志记录在数据库,你可以通过下面的一些方式进行一些数据统计分析。 $ mysql -u cowrie -p mysql> USE cowrie; mysql> SELECT * FROM auth; +----+--------------+---------+----------+-------------+---------------------+ | id | session | success | username | password | timestamp | +----+--------------+---------+----------+-------------+---------------------+ | 1 | a551c0a74e06 | 0 | root | 12345 | 2019-09-27 23:15:56 | | 2 | a551c0a74e06 | 0 | root | seiko2005 | 2019-09-27 23:15:58 | | 3 | a551c0a74e06 | 0 | root | anko | 2019-09-27 23:15:59 | | 4 | a551c0a74e06 | 0 | root | 123456 | 2019-09-27 23:16:00 | | 5 | a551c0a74e06 | 0 | root | dreambox | 2019-09-27 23:16:01 |
当然上面只是举了一些简单的例子,更多高级玩法还等着你去探索哟!
其它
目前开源的蜜罐系统有很多,除了 Cowrie 以外,还有 Kippo 、 T-Pot 、 MHN 、 SSH-Honeypot 等等。如果你对蜜罐系统很感兴趣,可以参考 GitHub 上以下两个开源项目。 https://github.com/jwxa2015/honeypotcollection https://github.com/paralax/awesome-honeypots
至此,使用 Cowrie 快速构建一个蜜罐系统的基本方法就介绍完了。如果你对 Cowrie 非常的感兴趣,还可以去官网探索更多高级功能哟!
对于快速构建一个蜜罐系统,你还有哪些更好用高效的方法呢?欢迎大家在留言讨论哟!
参考文档 https://www.google.com https://cowrie.readthedocs.io/en/latest/ https://www.cnblogs.com/bmjoker/p/10156220.html https://www.cnblogs.com/HacTF/p/8094516.html https://klionsec.github.io/2017/10/19/cowrie/ https://www.twblogs.net/a/5cb0b56bbd9eee48d788646c https://ama2in9.top/2019/03/12/cowrie/
系统运维
2019-12-16 09:36:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
方法1(选取于网络,针对自己的服务器没起作用)
修改my.cnf参数: performance_schema_max_table_instances=400 table_definition_cache=400 table_open_cache=256
重启mysql服务。我这里遇到的没解决,不知道其他人能够解决问题,物理 内存300M以及虚拟内存1G依旧,没改善。
方法2:(解决了当前自己遇到的问题)
要关闭 Performance Schema ,5.6默认开启的,该参数主要用于收集服务器性能参数;
5.6版本以后默认开启,占用内存过高可以关闭。在 MySQL 配置文件的 [mysqld] 字段添加一句 performance_schema = off
重启mysql,内存占用大约是40M。 本文地址: https://www.linuxprobe.com/mysql-virtual-memory.html
系统运维
2019-12-12 09:07:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
编译安装php mysqli扩展 phpize ./configure && make && make install
遇到如下报错信息。 /bin/sh /usr/local/src/php-7.2.11/ext/mysqli/libtool --mode=compile cc -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 -I. -I/usr/local/src/php-7.2.11/ext/mysqli -DPHP_ATOM_INC -I/usr/local/src/php-7.2.11/ext/mysqli/include -I/usr/local/src/php-7.2.11/ext/mysqli/main -I/usr/local/src/php-7.2.11/ext/mysqli -I/usr/local/server/php/include/php -I/usr/local/server/php/include/php/main -I/usr/local/server/php/include/php/TSRM -I/usr/local/server/php/include/php/Zend -I/usr/local/server/php/include/php/ext -I/usr/local/server/php/include/php/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /usr/local/src/php-7.2.11/ext/mysqli/mysqli.c -o mysqli.lo mkdir .libs cc -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 -I. -I/usr/local/src/php-7.2.11/ext/mysqli -DPHP_ATOM_INC -I/usr/local/src/php-7.2.11/ext/mysqli/include -I/usr/local/src/php-7.2.11/ext/mysqli/main -I/usr/local/src/php-7.2.11/ext/mysqli -I/usr/local/server/php/include/php -I/usr/local/server/php/include/php/main -I/usr/local/server/php/include/php/TSRM -I/usr/local/server/php/include/php/Zend -I/usr/local/server/php/include/php/ext -I/usr/local/server/php/include/php/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /usr/local/src/php-7.2.11/ext/mysqli/mysqli.c -fPIC -DPIC -o .libs/mysqli.o In file included from /usr/local/src/php-7.2.11/ext/mysqli/mysqli.c:34:0: /usr/local/src/php-7.2.11/ext/mysqli/php_mysqli_structs.h:42:33: **fatal error: ext/mysqlnd/mysqlnd.h: No such file or directory** #include "ext/mysqlnd/mysqlnd.h" ^ compilation terminated. make: *** [mysqli.lo] Error 1
重点是看这句。 fatal error: ext/mysqlnd/mysqlnd.h: No such file or directory ,在php扩展包里,找不到mysqlnd.h 库文件。
但是查看了mysqlnd目录后,发现文件都在。
这个时候在看报错信息里。/usr/local/src/php-7.2.11/ext/mysqli/php_mysqli_structs.h:42:33 ,进入这个文件,查看42行。
#include "ext/mysqlnd/mysqlnd.h
这个是用C语言写的。从相对路径ext 加载库文件mysqlnd.h ,但是mysqli目录里没有ext,这块我们通过创建软链接的方式来解决:
我主机里的php安装包放在/usr/local/src/目录里 ln -s /usr/local/src/php-7.2.11/ext/ /usr/local/src/php-7.2.11/ext/mysqli
软链接创建后,当在/usr/local/src/php-7.2.11/ext/mysqli 需要加载ext 目录的文件时,就会直接进入/usr/local/src/php-7.2.11/ext/ 去加载了。
现在重新编译安装 make clean //先清除一下 ./configure && make && make install
出现下面的提示信息,代表安装完成。
然后进入php.ini 添加扩展指令
最后重启php服务,安装完成。
系统运维
2019-12-09 11:28:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
1、初识Redis
官网: https://redis.io
Redis(Remote Dictionary Server):即远程字典服务。
一个开源的使用ANSI C语言 编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库 ,并提供多种语言的API。
简单来说:Redis 是一个基于内存的高性能key-value数据库。通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
ANSI :是一种字符代码
2、为什么要使用Redis
Redis完全开源免费,遵守BSD协议,是高性能的key-value数据库。
性能高执行速度快 ,对于一些耗时久且结果不会频繁变动的SQL,我们就可以将运行结果放入缓存。这样后面的请求就去缓存中读取,使得请求能够迅速响应。
用于解决高并发的问题 ,当所有请求直接访问数据库,数据库极容易出现连接异常。这个时候就需要使用Redis做一个缓存,让请求先访问到redis,而不是直接访问数据库。在分布式系统中有着极其广泛的应用。
redis 的应用场景: 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用) 聊天室的在线好友列表。 任务队列。(秒杀、抢购、12306等等) 应用排行榜。 网站访问统计。 数据过期处理(可以精确到毫秒) 分布式集群架构中的session分离。
BSD协议,想要了解点击前往
2.1、Redis优点 速度快,性能高 --- Redis每秒可以处理超过10万次读写操作。 Redis能读的速度是110000次/s,写的速度是81000次/s 。 支持丰富的数据类型 --- 支持String、 List、 Hash、 Set、Sorted Set 数据类型操作。 支持事务 --- Redis操作都是原子性的,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。 丰富的特性 -- -可用于缓存,消息,按key设置过期时间,过期后将会自动删除
什么是原子性,什么是原子性操作(扩展)
A想要从自己的帐户中转1000块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。在这个事务里,要做如下操作: 从A的帐户中减去1000块钱。如果A的帐户原来有3000块钱,现在就变成2000块钱了。 在B的帐户里加1000块钱。如果B的帐户如果原来有2000块钱,现在则变成3000块钱了。
如果在A的帐户已经减去了1000块钱的时候,忽然发生了意外,比如停电什么的,导致转帐事务意外终止了,而此时B的帐户里还没有增加1000块钱。那么,我们称这个操作失败了,要进行回滚。回滚就是回到事务开始之前的状态,也就是回到A的帐户还没减1000块的状态,B的帐户的原来的状态。此时A的帐户仍然有3000块,B的帐户仍然有2000块。
我们把这种要么一起成功(A帐户成功减少1000,同时B帐户成功增加1000),要么一起失败(A帐户回到原来状态,B帐户也回到原来状态)的操作叫原子性操作。
如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。这种特性就叫原子性。
2.2、Redis特性 数据的持久化 --- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 数据的备份 --- Redis支持数据的备份,即master-slave模式的数据备份。
2.3、Redis缺点 1、 缓存和数据库双写一致性问题 2、 缓存雪崩问题 3、 缓存击穿问题 4、缓存的并发竞争问题
3、Redis每种数据类型的使用场景
3.1 String
最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能缓存
3.2 Hash
这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。在做单点登录的时候就是用这种数据结构储存用户信息,以cookied作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果
3.3 List
使用List的数据结构,可以做简单的消息队列功能。另外:可以利用lrange命令,做基于redis的分页功能,性能高,用户体验好。再列举一个很适合的场景:去行情信息。就是个生产者和消费者的场景。List可以很好的完成排队,先进先出的原则。
lrange :Redis Lrange 返回列表中指定区间内的元素
3.4 Set
因为Set存放的是一堆不重复值的集合。所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重?因为我们的系统一般都是集群部署,使用JVM自带的Set,比较麻烦,难道为了一个做一个全局去重,再起一个公共服务,太麻烦了。
3.5 Sorted set
sorted set多了一个权重参数score,集合中的元素能够按照score进行排列。可以做排行榜应用,取TOP N 操作
4、redis的过期策略以及内存淘汰机制
分析: 这个问题其实相当重要,到底redis有没用到家,这个问题就可以看出来。比如你redis只能存5G数据,可是你写了10G,那会删5G的数据。怎么删的,这个问题思考过么?还有,你的数据已经设置了过期时间,但是时间到了,内存占用率还是比较高,有思考过原因么?
回答: redis采用的是定期删除+惰性删除策略
为什么不用定时删除策略? 定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求, 而不是删除key,因此没有采用这一策略.
定期删除+惰性删除是如何工作的呢? 定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次, 而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。 于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了? 如果过期了此时就会删除。
采用定期删除就没其他问题了么? 不是的,如果定期删除没删除key。然后你也没及时去请求key,也就是说惰性删除也没生效。 这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。
在redis.conf中有一行配置 # 该配置就是配内存淘汰策略的 # maxmemory-policy volatile-lru 1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧。 2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。推荐使用,目前项目在用这种。 3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。应该也没人用吧,你不删最少使用Key,去随机删。 4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。 这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐 5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。依然不推荐 6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。不推荐 ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。
5、redis和数据库双写一致性问题
分析: 一致性问题是分布式常见问题,还可以再分为最终一致性和强一致性。数据库和缓存双写,就必然会存在不一致的问题。回答之前,先要明白一个前提:如果对数据有强一致性要求,不能放缓存。我们所做的一切,只能保证最终一致性。另外,我们所做的方案其实从根本上来说,只能说降低不一致发生的概率,无法完全避免。因此,有强一致性要求的数据,不能放缓存。
回答 : 首先,采取正确更新策略,先更新数据库,再删缓存。其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列。
6、如何应对缓存穿透和缓存雪崩问题
分析: 这两个问题,说句实在话,一般中小型传统软件企业,很难碰到这个问题。如果有大并发的项目,流量有几百万左右。这两个问题一定要深刻考虑。
缓存穿透 ,即黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从而数据库连接异常。
解决方案: 1、利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试 public static String getData(String key) throws InterruptedException { //从Redis查询数据 String result = getDataByKV(key); //参数校验 if (StringUtils.isBlank(result)) { try { //获得锁 if (reenLock.tryLock()) { //去数据库查询 result = getDataByDB(key); //校验 if (StringUtils.isNotBlank(result)) { //插进缓存 setDataToKV(key, result); } } else { //睡一会再拿 Thread.sleep(100L); result = getData(key); } } finally { //释放锁 reenLock.unlock(); } } return result; } 2、采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。 3、提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。 布隆过滤器原理:就是利用高效的数据结构和算法快速判断出你这个 Key 是否在数据库中存在,不存在你 return 就好了,存在你就去查 DB 刷新 KV 再 return。
缓存雪崩 ,即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。
解决方案: 1、给缓存的失效时间,加上一个随机值,避免集体失效。 2、使用互斥锁,但是该方案吞吐量明显下降了。 3、双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点: I 从缓存A读数据库,有则直接返回 II A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。 III 更新线程同时更新缓存A和缓存B。
7、如何解决redis的并发竞争key问题
分析: 这个问题大致就是,同时有多个子系统去set一个key。这个时候要注意什么?百度上的答案基本上都是推荐用redis事务机制。但是不推荐使用redis的事务机制。因为我们的生产环境,基本都是redis集群环境,做了数据分片操作。你一个事务中有涉及到多个key操作的时候,这多个key不一定都存储在同一个redis-server上。因此,redis的事务机制,十分鸡肋。
回答: 1、如果对这个key操作,不要求顺序
这种情况下,准备一个分布式锁,大家去抢锁,抢到锁就做set操作即可,比较简单。 2、如果对这个key操作,要求顺序
假设有一个key1,系统A需要将key1设置为valueA,系统B需要将key1设置为valueB,系统C需要将key1设置为valueC.
期望按照key1的value值按照 valueA–>valueB–>valueC的顺序变化。这种时候我们在数据写入数据库的时候,需要保存一个时间戳。假设时间戳如下 系统A key 1 {valueA 3:00} 系统B key 1 {valueB 3:05} 系统C key 1 {valueC 3:10}
那么,假设这会系统B先抢到锁,将key1设置为{valueB 3:05}。接下来系统A抢到锁,发现自己的valueA的时间戳早于缓存中的时间戳,那就不做set操作了。以此类推。 其他方法,比如利用队列,将set方法变成串行访问也可以。总之,灵活变通。
8、Redis 的 RDB 和AOF 持久化策略 RDB: 将redis在内存中的数据库记录定时保存到一个 dump 的文件中,写到磁盘上的持久化。(reids 默认持久化方式) AOF: 将redis的操作日志以追加的方式写入文件。
当 Redis 重启的时候,它会优先使用AOF文件来还原数据集,因为 AOF 文件保存的数据集通常比 RDB 文件保存的数据集更完整。
9、为什么Redis比Mysql快
Redis将所有数据放在内存中,非数据同步正常工作中,是不需要从磁盘读取数据的,0次IO。内存响应时间大约为100纳秒,这是Redis速度快的重要基础。mysql是持久化储存,存放到磁盘里面,检索的话,会涉及到一定的IO。
系统运维
2020-03-22 19:26:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> #docker exec :在运行的容器中执行命令 #需要交互,一直执行的命令加上-it docker exec -it php php /www/easyswoole/easyswoole #不需要返回只执行一下的命令不用加-it docker exec nginx certbot renew #bash/sh命令 docker exec -it php sh -c "cd /www/easyswoole && php easyswoole start"
系统运维
2020-03-20 15:53:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
1。检查服务器远程桌面服务是否启动,3389端口是否正常开放。
可以使用命令:netstat -antp | findstr 3389
2。检查服务器防火墙是否开放远程桌面端口。
打开CMD,输入Firewall.cpl 打开防火墙,检查入栈规则是否包含远程桌面端口。
3。配置好远程操作账号密码及权限,如果是系统管理员不用特别设置,否则需要账号加入Remote Desktop Users组以便具有远程控制权限。
打开用户管理检查远程控制账号权限。
4。确保服务器和控制机在同一网络或者网络互通,可以通过Telnet 服务器的远程桌面端口测试。
打开CMD,输入 Telnet X.X.X.X 3389 查看结果
5。确保控制机远程桌面控制软件版本符合服务端限制。
使用 iis7远程桌面登录服务器 的方法图解:
iis7 远程桌面连接工具,又叫做iis7 远程桌面管理软件,是一款绿色小巧,功能实用的远程桌面管理工具,其界面简洁,操作便捷,能够同时远程操作多台服务器,并且多台服务器间可以自由切换,适用于网站管理人员使用。
查看地址: iis7 远程桌面管理工具下载
那么这个软件如何使用呢?
首先下载解压软件,因为本软件是绿色软件,免安装,所以解压后直接双击“IIS7 远程桌面管理.exe ”就可以看到程序的主界面了:


然后在界面的中间偏右的部分会看到“添加机器”,单击打开之后会看到:


在这里添加服务器的详细信息,
在这里一定要填写的是【服务器IP 和端口】、【服务器账号】、【服务器密码】下图所标记的地方:

【注意】
1、 输入服务器端口后用冒号分隔再填写端口号(一般默认为3389 );
2、 服务器账号一般默认为administrator ;
3、 服务器密码就是在购买服务器时所给的密码或者自己设置的密码。
其他信息是为了方便大批量管理服务器信息的时候添加的分组信息,根据个人情况和喜好做分类。
添加完毕核对无误后就可以点击右下角的添加,就可以看到添加的服务器信息,双击就可以打开啦!


如果您要批量打开多台服务器,点击【全选】之后,再点击【打开远程】即可:

打开桌面的效果图:

以上就是iis7远程桌面的远程连接服务器方法啦,以后还会有更多功能,敬请期待吧!
系统运维
2020-03-19 10:37:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
在新兴互联网的时代, 软路由工控机行业里,出现了“2/8定率”。就是说软路由工控机这个产品,80%的软路由工控机,由20%的品牌所分得。如剩余的20%的软路由工控机,由其它80%的非品牌所分得。
在软路由工控机行业里,有些产品做得好,久而久之就进入大众的眼球,被大众所熟悉而追从。做软路由工控机的企业非常多,但做的好的却很少,选软路由工控机还是要选择品牌具有一定规模的企业。
现在国内做软路由工控机主要分为台湾品牌和国内品牌。台湾的品牌知名度要高一些,但价格也相应很高,在国内基本靠代理商销售。国内品牌沉淀时间稍微要短一些,但发展很快,质量和台湾已经相当,更主要的是性价比更高,售后和渠道方面要更健全。
在您选择前,最好对软路由工控机进行充分的了解和比较,具体可以上网咨询专业软路由工控机厂家 广州长帆智能科技有限公司的在线客服: http://www.cfitsi.cn 或电话(微信)咨询:15113863131,谢谢!
系统运维
2020-03-18 15:25:04
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
此文正在过时,请阅读
Fedora 32 - 启用BLS新规范管理GRUB2 - wffger开源笔记 - OSCHINA https://my.oschina.net/wffger/blog/4286746
——————————————————————————————————————————————————
Fedora 31升级内核后,GRUB2的引导界面会隐藏,需要手动修改/etc/default/grub文件。
例如: #GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="resume=/dev/mapper/VG01-swap rd.lvm.lv=VG01/root rd.lvm.lv=VG01/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=false

如果修改了LVM 虚拟卷的名称,也需要手动修改GRUB_CMDLINE_LINUX参数。 sudo sed -i 's/GRUB_ENABLE_BLSCFG=true/GRUB_ENABLE_BLSCFG=false/g' /etc/default/grub #BOOT by BIOS sudo grub2-mkconfig -o /boot/grub2/grub.cfg #BOOT by UEFI sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
系统运维
2020-03-15 01:09:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
今天学习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
系统运维
2020-03-14 23:56:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
vsftp





NFS



CIFS


系统运维
2020-03-15 15:04:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
在使用 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
系统运维
2020-03-14 19:45:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
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'
系统运维
2020-03-13 13:33:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
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核心知识整理和经典书籍
系统运维
2020-03-11 14:46:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
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
系统运维
2020-03-08 13:01:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
( 一) 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)。
系统运维
2020-03-08 12:29:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
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赏金页面 。
系统运维
2020-03-08 10:46:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
使用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桌面。
系统运维
2020-03-06 15:16:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
有一个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
系统运维
2020-03-02 23:03:02
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
大数据(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
系统运维
2020-03-02 21:34:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
一、当前工作目录
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的使用及命令
系统运维
2020-02-26 23:02:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
接续第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章
系统运维
2020-02-23 22:02:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
重定向 管道符 通配符 转义符 环境变量


重定向

重定向 (把命令和文件结合起来使用)
输入重定向 <
将文件重定向到命令里 ,让文件去匹配命令执行,与正常的名 命令对文件的执行方向相反 ,但结果一样 将数据流导入到命令中去跑! 给命令传参 ! 符号 作用
命令 < 文件 将文件作为命令的标准输入
命令 << 分界符
命令 < 文件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变量


系统运维
2020-02-22 17:52:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
简而言之,输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。
输出重定向可以分未标准输出重定向和错误输出重定向,以及清空写入(覆盖)和追加写入两种模式。 标准输入重定向(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中怎么办?请看下图

最后玩个小游戏
系统运维
2020-02-22 21:00:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
第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章
系统运维
2020-02-21 21:06:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
Kali Linux 2020.1乱码问题
Kali Linux 2020.1安装后,默认XFCE桌面字体显示为乱码。由于缺少中文字体包,所以需要安装中文字体。在终端执行如下命令:
apt-get install fonts-wqy-microhei fonts-wqy-zenhei
成功执行以上命令后,重新启动系统即可。
系统运维
2020-02-21 10:24:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
一、背景
在现今的社会中,每个公司都是软件公司,无论是通过台式机、云服务还是移动设备,软件都已成为世界各地、各个公司日常工作的工具。 例如, 汽车是带轮子的计算机,空调是数据终端,而银行在手机中提供服务,等等。
在这个新的世界中,软件更新可以满足客户的需求。每一个交付都是您更新,或破坏,与客户间信任的机会。如何才能保证您的每个更新都以最快的速度提供一流的服务?
这就是为什么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 获得课程通知
系统运维
2020-02-20 15:51:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
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
系统运维
2020-02-19 16:49:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
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
系统运维
2020-02-19 16:06:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
修改Kali Linux背景图片
在Kali Linux中,默认XFCE桌面背景图片保存在/usr/ share/backgrounds/xfce目录。大学霸IT达人默认Undercover桌面背景图片保存在/usr/ share/ kali-undercover/backgrounds目录。如果用户不希望使用默认桌面,则可以将修改的背景图片保存到对应的目录。然后,依次选择“应用程序”|“设置”|“桌面”命令,打开桌面设置界面。在背景选项卡中,选择希望更改的壁纸即可。另外,用户还可以手动选择查看其它目录保存的背景图片,样式、颜色等。
系统运维
2020-05-03 23:53:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
学习基本的命令,及举列子说明,开始掌握要点了。
系统运维
2020-05-03 23:13:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
xp休眠
设置完了。想休眠时就点开始菜单,关闭计算机,按住shift.左边就变成了休眠按钮。点休眠。xp就开始跑进度条。保存当前工作状态。然后就可以拔电脑的插头了。电脑已经关闭。下次开机,就会从休眠中恢复上次工作状态

经过一段时间的测试。发现偶尔小概率会出现系统恢复后网络异常的情况。必须拔掉usb网卡。再接上。我估计是usb网卡驱动的bug.以前用过的笔记本也有这个网卡驱动 休眠 bug.
系统运维
2020-05-01 17:17:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
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
系统运维
2020-04-24 17:38:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
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/
系统运维
2020-04-23 20:56:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
iis7远程桌面连接组件是从Windows 2000 Server开始由微软公司提供的,在WINDOWS 2000 SERVER中他不是默认安装的。
该组件一经推出受到了很多用户的拥护和喜好,所以在WINDOWSXP和2003中微软公司将该组件的启用方法进行了改革,我们通过简单的勾选就可以完成在XP和2003下远程桌面连接功能的开启。当然随着时代的进步,我们操作管理的模式也在不断的更新。为了更方便的我们管理我们的服务器,越来越多的人都会用到远程桌面管理连接服务器,让我们更方便跟简洁的用一台电脑来批量操作我们的VPS服务器,现在IIS7远程桌面管理这是我觉得比较好用的一款程序。
我们在使用远程桌面工具的时候难免会出现几个小问题,比如说服务器卡,,今天就为大家介绍并解决远程桌面服务器卡的问题
http://yczm.iis7.com/?dzhd
1.我们打开远程桌面添加
2.添加完进入服务器卡的话我们退出来选择设置
3.选择设置,速度设置,调整色深调到最低
系统运维
2020-04-23 16:16:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
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解决吧

搞定!

水平有限,大神请批评。
系统运维
2020-04-23 12:58:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
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
系统运维
2020-04-20 10:05:00