关于vagrant
使用vagrant启动的虚拟机总是有一块特殊的网卡,ip地址为10.0.2.15, 这是个什么东东?
为了便于和虚拟机通信以及虚拟机自动上网等原因,vagrant自动为虚拟机创建了一个nat类型的网卡,所有虚拟机上该网卡的ip地址是一样的,所以只存在这一块儿网卡的时候,虚拟机之间没法通信。
vagrant 宿主机和虚拟机之间通信一般采用ssh或winrm,当将本机的2205端口nat到某虚拟机的22端口时,2205端口实际上是有虚拟机进程virtualbox来listen的,即使将上述的网卡down掉,也是能正常建立tcp连接的,这大概和virtualbox虚拟网络的实现方式有关
需要打包的虚拟机只需要保留一个网卡,nat方式的,并且网络连接上设置“自动获取ip地址”
WS-Management Protocol (Windows)
winrm
winrm 协议报文:
1 2 3 4 5 6 7 8 9 |
POST /wsman HTTP/1.1 Content-Type: application/soap+xml;charset=UTF-8 User-Agent: Ruby WinRM Client (2.6.0.1, ruby 2.0.0 (2014-11-13)) Accept: */* Date: Wed, 08 Feb 2017 09:41:16 GMT Content-Length: 1658 Host: 127.0.0.1:55985 <?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:b="http://schemas.dmtf.org/wbem/wsman/1/cimbinding.xsd" xmlns:n="http://schemas.xmlsoap.org/ws/2004/09/enumeration" xmlns:x="http://schemas.xmlsoap.org/ws/2004/09/transfer" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" xmlns:p="http://schemas.microsoft.com/wbem/wsman/1/wsman.xsd" xmlns:rsp="http://schemas.microsoft.com/wbem/wsman/1/windows/shell" xmlns:cfg="http://schemas.microsoft.com/wbem/wsman/1/config"><env:Header><a:To>http://127.0.0.1:55985/wsman</a:To><a:ReplyTo><a:Address mustUnderstand="true">http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:MaxEnvelopeSize mustUnderstand="true">153600</w:MaxEnvelopeSize><a:MessageID>uuid:AC14F680-D388-4B9D-B41E-4A0D6C51865B</a:MessageID><w:Locale xml:lang="en-US" mustUnderstand="false"/><p:DataLocale xml:lang="en-US" mustUnderstand="false"/><w:OperationTimeout>PT30M0S</w:OperationTimeout><w:ResourceURI mustUnderstand="true">http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd</w:ResourceURI><a:Action mustUnderstand="true">http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><w:OptionSet><w:Option Name="WINRS_NOPROFILE">FALSE</w:Option><w:Option Name="WINRS_CODEPAGE">437</w:Option></w:OptionSet></env:Header><env:Body><rsp:Shell><rsp:InputStreams>stdin</rsp:InputStreams><rsp:OutputStreams>stdout stderr</rsp:OutputStreams></rsp:Shell></env:Body></env:Envelope> |
当windows上存在了一个“未识别的网络”时(该网络被设置为了“公用”),于是winrm就不能使用,错误如下:
表现为: winrm请求虽然已经连接上了,但是不响应client发送的请求报文
理论上来讲,应该可以设置winrm listen的端口,不去listen那个“公用”的网络连接就可以了
参考资料:
vnc 学习
vncserve命令示例:
启动vnc:
1 2 3 4 5 6 |
# vncserver :1 New 'VM-2:1 (root)' desktop is VM-2:1 Starting applications specified in /root/.vnc/xstartup Log file is /root/.vnc/VM-2:1.log |
查看有哪些session:
1 2 3 4 5 6 |
# vncserver -list TigerVNC server sessions: X DISPLAY # PROCESS ID :1 17468 |
再启动一个:
1 2 3 4 5 6 |
# vncserver :2 New 'VM-2:2 (root)' desktop is VM-2:2 Starting applications specified in /root/.vnc/xstartup Log file is /root/.vnc/VM-2:2.log |
查看:
1 2 3 4 5 6 7 |
# vncserver -list TigerVNC server sessions: X DISPLAY # PROCESS ID :2 17636 :1 17468 |
删除指定session:
vncserve listen哪个端口?
每个session占用一个单独的端口,每个session同时只能有一个用户使用; 通过 :number 启动的session,其listen的端口号为 5900 + number
对于client来讲,使用vnc不同于其他服务,不需要指定端口号,而是指定number,如:
172.16.10.10:1
那么client就按照约定的规则,连接 172.16.10.10:5901 端口
linux 之多网卡问题
现象:
centos 6或7上配置两块(或者多块)网卡,如果默认网关配置在eth1(ip1)上,则通过另外一块网卡(如eth2(ip2))访问该主机就是访问不了的;但是,如果在eth2上做一个桥br2(ip2),该主机上面的虚拟机桥接该网卡,并且虚拟机的ip地址为ip3,则从其它主机上虽然访问不了ip2,但是可以访问ip3,就是说,访问虚拟机是正常的
调试:
- ping ip2 的时候,在eth2上是可以用tcpdump抓到数据包的,显示,服务器收到了数据包,但是出于某种原因,服务器没有回包
- 在服务器上使用ping -I eth2 ipx(这里假定其它主机的ip地址为ipx),eth2上没有数据包出现,显然,出于某种原因,服务器根本没有发包出去
- 两块网卡配置没有太多差异,唯一的差异就是默认网关在谁身上,默认网关很大程度上(不完全)表现在默认路由上,好吧,把默认路由删掉,给ipx单独添加一条路由,结果对上述测试没有任何影响
分析:
- 应该和服务器本身有关系,和其他外部的设备都没有关系
- 应该和内核有关系吧(晕,不好猜吧)
查资料:
- 发现和一个叫做 rp_filter的内核参数似乎有关系,修改如下:
12sysctl -w net.ipv4.conf.all.rp_filter=0sysctl -w net.ipv4.conf.eth2.rp_filter=0
结果: 好了
参考资料: http://blog.csdn.net/cybertan/article/details/9087829说明:
- 两个配置都需要,如果其中一个为1,则内核就参考谁
- 如果是br2桥接到eth2上的情况,访问br2是否正常则和eth2的该配置没关系,需要设置br2的该参数
关于rp_filter:
rp_filter : BOOLEAN
默认值为False
- 1 – 通过反向路径回溯进行源地址验证(在RFC1812中定义)。对于单网卡主机和stub网络路由器推荐使用该选项。
- 0 – 不通过反向路径回溯进行源地址验证。
- 默认值为0,但某些发布在启动时自动将其打开。 (router默认会路由所有东西﹐就算该封包’显然’不属於我们的网路的。常见的例子﹐莫过於将私有 IP 泄漏到 internet 上去。假如某个网卡﹐其上设定的网络地址段為
195.96.96.0/24﹐那么理论上不会有212.64.94.1 这样的地址段封包会到达这个网卡上。许多人都不想转发非本网段的数据包﹐因此核心设计者也打开了方便之门。在 /proc 裡面有些档案﹐透过它们您可以让核心為您做到这点。此方法被称為 “逆向路径过滤(Reverse Path Filtering)”。基本上﹐假如对此封包作出的回应﹐不是循其进入的网卡送出去﹐那它就被置之不理。)
golang IDE之 gogland
golang 可以用于windows编程吗
golang 可以用于windows编程吗?
理论上可以,但是又有哪个IDE去支持golang进行windows编程并且能和visual studio相媲美呢?
每种语言都有他自己的用武之地,没有哪个语言可以独步天下,称霸武林的。
深入学习linux
docker mount on fly(容器动态挂卷)
理论上来讲,mount操作一定是发生在容器启动之后的(包括宿主机也如此);但是,docker只是在create好run的时候提供了挂载卷的方法,一旦容器被创建,我们将再没有机会给容器挂载新的卷了;如果非要这么做的话,只能销毁、重新创建容器,好生繁琐。
既然理论上可以在容器启动之后挂载新的卷,docker没有提供相应的API,那么又该如何做呢?
- 办法一: hack一下docker,提供这方面的功能; 缺点: 随着docker版本的升级,代码维护起来比较麻烦
- 办法二: 从系统层面来实现,参考: https://jpetazzo.github.io/2015/01/13/docker-mount-dynamic-volumes/
办法二还是比较科学的,这里测试了一下,确实好用,脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/bin/sh set -e CONTAINER=$1 HOSTPATH=$2 CONTPATH=$3 REALPATH=$(readlink --canonicalize $HOSTPATH) FILESYS=$(df -P $REALPATH | tail -n 1 | awk '{print $6}') DEVICE=$(df -P $REALPATH | tail -n 1 | awk '{print $1}') while read DEV MOUNT JUNK do [ $DEV = $DEVICE ] && [ $MOUNT = $FILESYS ] && break done </proc/mounts [ $DEV = $DEVICE ] && [ $MOUNT = $FILESYS ] # Sanity check! while read A B C SUBROOT MOUNT JUNK do [ $MOUNT = $FILESYS ] && break done < /proc/self/mountinfo [ $MOUNT = $FILESYS ] # Moar sanity check! SUBPATH=$(echo $REALPATH | sed s,^$FILESYS,,) DEVDEC=$(printf "%d %d" $(stat --format "0x%t 0x%T" $DEV)) docker-enter $CONTAINER sh -c \ "[ -b $DEV ] || mknod --mode 0600 $DEV b $DEVDEC" docker-enter $CONTAINER sh -c "[ -d /tmpmnt ] || mkdir /tmpmnt" docker-enter $CONTAINER mount $DEV /tmpmnt docker-enter $CONTAINER sh -c "[ -d $CONTPATH ] || mkdir -p $CONTPATH" docker-enter $CONTAINER mount -o bind /tmpmnt/$SUBROOT/$SUBPATH $CONTPATH docker-enter $CONTAINER umount /tmpmnt docker-enter $CONTAINER rmdir /tmpmnt |
docker-enter 下载地址: https://github.com/jpetazzo/nsenter
注意:
- 这里用到了一个importenv的程序,可以参考容器环境变量来设置执行命令的环境变量,是个不错的办法,只是引入了一个其他的程序
- 这个要求容器中安装mount命令,该命令的依赖比较多,而且很少使用,所以,容器中一般都没有,需要手动安装,如果去掉那些依赖,单独安装一个mount命令会好一些
- 这个方法不适用于不基于块设备的文件系统,只有在
/proc/mounts
能正确得到块设备节点(上面谈到,并不总是能正确得到)的时候才能起作用。(比如: cephfs挂在的目录就不行)