Linux虚拟文件系统

  通过虚拟文件系统(VFS),程序可以利用标准的Unix系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作,如下图所示:使用cp(1)命令从ext3文件系统格式的硬盘拷贝数据到ext2文件系统格式的可移动磁盘上。两种不同的文件系统,两种不同的介质,连接到同一个VFS上。 1.文件系统抽象层   vfs可以使得用户可以直接使用open(),read(),write()这样的系统调用而无须考虑具体文件系统和实际物理介质。vfs把各种不同的文件系统抽象后采用统一的方式进行操作。而之所以可以使用这种通用接口对所有类型的文件系统进行操作,是因为内核在它的底层文件系统接口上建立了一个抽象层。该抽象层使Linux能够支持各种文件系统,即便是它们在功能和行为上存在很大差异。下图展示了一次用户控件的write()调用具体触发的流程。 2.Unix文件系统…

Read more

Linux内存管理

  在内核中分配内存空间不像在其他地方分配内存这么容易,主要原因是空间受限。内核与用户空间不同,不支持这种简单便捷的内存分配方式。 1.页   内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻址单位是字,但内存管理单元(MMU)通常以页为单位进行处理,大多数32位体系结构支持4KB的页,64位为8KB。内核用struct page结构体表示系统中的每个物理页。 struct page { unsigned long flags; //页状态,标识是否为脏页,是否锁定在内存等等。一共有32位标识 atomic_t _count; //该物理页的引用次数 atomic_t _mapcount; unsigned long private; struct address_space *mapping;…

Read more

Linux bridge学习

  Linux bridge是Linux内核中虚拟网桥的一个实现,它与OpenvSwitch都实现交换机功能,但比后者简单一些,只实现了最简单的二层功能,而没有ovs下诸如QoS,OpenFlow,netconf等等复杂的功能。本文主要参考《深入理解Linux网络技术内幕》,更像一个读书笔记性质的小结。   虚拟网桥是定义在真实设备之上的一个抽象设备,当该真实设备发生状态变化,则Linux bridge会受到影响。netdevice通知链向内核注册br_device_event回调函数,任何真实设备的变动会触发该回调函数。   下图是在有无网桥情况下收发包的示意图。在设备上传输数据是通过dev_queue_xmit执行的,它会调用设备驱动函数hard_start_xmit进行发包,中间有一些查找发包的过程。dev_queue_xm…

Read more

源码查看神器OpenGrok

  MAC/Linux下,vim+各种插件对于大规模代码还是不行,网上找了个神器OpenGrok可以查看。   2017_08_16 Update:文章末尾提到的insight.io是一款更加优秀的源码阅读工具。 1. 首先安装java环境:jre,jdk。 2. 安装tomacat brew install tomcat 3. 安装ctags brew install ctags 4. 下载OpenGrok wget -O - http://java.net/projects/opengrok/downloads/download/opengrok-0.12.1.tar.gz | tar xvz 5. 在tomcat上部署 OPENGROK_TOMCAT_BASE=/usr/local/Cellar/tomcat/8.0.17/…

Read more

第一跳冗余协议FHRP

  第一跳冗余协议用于将多台物理路由器配置成一台逻辑路由器,从而到达做热备以及负载均衡的目的。该协议向所有客户端提供一台虚拟路由器,其具有虚拟IP和MAC。在客户主机上将默认网关配制成这个虚拟IP,每当发送ARP请求,将会返回虚拟MAC,达到热备以及负载均衡的目的。而对主机来说,具体哪台物理路由器进行转发,以及某一台down掉之后进行切换热备,这些都是透明的。下面介绍FHRP下面主要的三种协议:热备用路由协议(HSRP),虚拟路由器冗余协议(VRRP),网关负载均衡协议(GLBP)。 1.热备用路由协议(HSRP)   这个是思科专用协议,主要向本地子网中得主机提供冗余网关,但并非一个最好的负载均衡解决方案。其缺点在于只有一台路由器处于活动状态,其他路由器都处于备用,只有发生故障才会进行切换,所以利用率低下。   备用组至少包括两…

Read more

codeforces round 324 div2解题报告

  好久没刷题了,前几天做google笔试生疏了很多,还是需要刷刷题,保持头脑灵活。不过codeforces题目一般都在晚上,真心没精力熬夜,只能改天起来再搞。这次是几天前的比赛。 A.Olesya and Rodion 简单题 B.Kolya and Tanya 简单题 C.Marina and Vasya   题意:给定两个字符串s1, s2,给定t,问是否存在一个相同长度的字符串与s1, s2各有t个字符不一致(位置不变)。   思路:判断s1和s2存在几个相同字符(相同位置),记为nr。记t=n-t,意味着找出n-t个一样的字符即可。则若不满足t - nr > (n - nr) / 2则不存在,反之存在。若t<=nr则这几个相同字符之内选t个即可,否则再把不一样的字符里面选t-nr个变为一样。  &e…

Read more

python 单元测试nose mock使用小结

  最近终于把手头的项目搞完了,完了QA要求写单元测试。这个差不多是我第2个python项目,各种不熟啊,花了2周多写完代码,花了1周多写测试,额,准确的说是学写测试。基本上用的就是nose+mock,真是个好用的东西,现小结一下吧。 nose   nose是开源的测试库,比unittest更为强大,其运行顺序按setUp->test_func_1->test_func_2->...->tearDown顺序执行。其中setUp是初始化定义各个参数的,tearDown是执行完各个测试函数再执行的,中间的test_func_*就是自己要测试的函数。比如我们写了一个add()函数,那么如果对其进行测试就需要定义一个test_add()函数。举个例子: def setUp(): """ @brief setUp -…

Read more

python异步通信之gevent.event.Event

  在Gevent Tutorial中所介绍的,我们可以用gevent.event.Event或者'gevent.event.AsyncResult'当作协程之间的事件,其中后者可以在唤醒别的协程时带上一个值。当然,我们还可以用gevent.event.Queue, gevent.event.Group,gevent.coros import BoundedSemaphore等等用作协程间通信的工具。今天我所说的是gevent.event.Event。   正如文档中所给出的最简单的例子: import gevent from gevent.event import Event ''' Illustrates the use of events ''' evt = Event() def setter(): '''After…

Read more

openflow buffer_id

  openflow里面有个buffer_id的概念,用于标记缓存在交换机中的报文的id,该报文会被发送packet-in到控制器,控制器决策后下发带buffer_id的命令冲洗处理该报文,通常的处理命令为重走pipeline。   openflow中有如下两种方式可以发送带有buffer_id的报文: 下发Packet-Out消息。消息中可以选择是否带有buffer_id,如果不带(即buffer_id=NO_BUFFER)则直接从OutPort指定的端口发包;如果带有该buffer_id,则Packet-Out消息中的OutPort将会被忽略,转为指向保留端口TABLE,则标识将缓存在该交换机中的该报文重走pipeline,送入到第一个table,往往是table 0。 下发Flow-Mod消息。同样,消息中可以选择是否带有buffer_id…

Read more

ospf协议

  最近系统的学习了下ospf路由协议,ospf较rip还是复杂很多,很多状态变迁,区域划分,不同的报文交互。每当拓扑发生变化,每台路由器都重新计算数据库,单个区域的ospf势必会导致拓扑过大,重计算消耗cpu的时间,以及存储完整地链路状态数据库消耗大量内存,所以在拓扑复杂情况下一般建议划分多个区域。   ospf下路由器有以下几种角色:主干路由器、内部路由器、区域边界路由器、自主系统边界路由器。链路状态通告(LSA)描述了路由器及其连接的网络。路由器彼此交换LSA以获悉完整地网络拓扑,这让所有路由器的拓扑数据库都相同。建立拓扑数据库后,OSPF使用Dijkstra算法找出前往每个远程网络的最佳路径,再将它们加入到路由选择表。 1.DR和BDR   DR和BDR:在OSPF网络中,各路由器之间不直接两两发链路状态信息,而是通过选举…

Read more

Quagga运行多个ospfd进程

  最近需要用Quagga连接SDN controller运行路由协议,代替TOR跑ospf,其实这个在一个TOR的状态下是一点问题都没有的,参考一下官网文档就能很快搞定。但问题的关键是我有两个TOR,然后问题就出现了,如何在Quagga上运行两个ospfd进程?方法如下: 找另外一台机器,无论是本地启动虚拟机也好,或者找一台物理机器也好,运行两个Quagga,然后做RPC通信。 做Namespace隔离,隔离出两个ospfd进程   方法一比较曲折,这对于两台TOR来说或许是个缓兵之计,但当我们以后TOR数量增加的时候这个缺陷就暴露了,明显我们不可能为每台TOR搞个物理机器或者虚拟机。然后想着想着想到了docker,搞个轻量级虚拟机;再然后我仔细一想,直接自己做隔离好了。想法不错,动手开搞,调查了好久发现这个方法也太困难了,关于linux na…

Read more

tun/tap运行机制

  最近需要连接Quagga和SDN Controller,由于Quagga原因,目前没办法直接在两者之间建立连接,所以只能曲线救国,采用tun/tap搞个虚拟网卡中转一下。本文主要介绍以下tun/tap的机制,关于具体连接部分将在以后进行介绍。   tun和tap的区别在于tun是三层设备,用于ip转发,无法与物理网卡做 bridge,但是可以通过三层交换(如 ip_forward)与物理网卡连通;tap是二层设备,用于mac转发。   以下几个图来自kghost的博客。   首先是正常网卡接收报文是从物理链路接收的:   而虚拟网卡(tun/tap)是从用户态接收数据,在用户态和协议栈之间进行中转数据。数据从用户态读进来,穿透/dev/net/tun字符设备抵达内核,然后交给虚拟网卡,虚…

Read more

vlan及vlan端口

  虽然知道这玩意都被大家写烂了,还是得总结总结,加深印象。   vlan用于划分二层网络,解决二层广播带来的广播风暴问题,不同的设备可以分属于不同vlan下。目前常用的标识vlan的协议为IEEE 802.1q,其在以太网头和ip头之间插入vlan的头。vlan id用12位表示,但是正常可用的vlan范围是1-1001,且vlan 1不能被使用,修改,vlan 1002-1005被预留。如果开启了vlan扩展,可以启用1006-4094的vlan id。   vlan端口的类型有Access, Trunk, Hybrid三种。 Access: 1) 收包:没有vlan tag,则打上默认的端口pvid;若有且不等于pvid则直接丢弃 2) 发包:pop vlan id后发包 Trunk: 1) 收包:没有vlan t…

Read more

三层交换机转发原理

1.三层交换机与路由器的区别 三层交换机可以同时工作在二三层,路由器只能工作在三层。 三层交换机端口都是以太网接口,路由器则不仅限于此。 三层交换机转发报文通过硬件实现,而传统路由器则通过软件实现,性能前者好。 2.三层交换机二层转发原理   源主机(src ip: 10.0.0.1/24)向目的主机(dst ip: 10.0.0.2/24)发送ping(同一vlan内): src检查dst ip为同一网段,则发送ARP请求,该ARP会在同一网段+同一vlan内广播。 dst收到ARP报文,发会arp reply。 src发送ping包 dst发回icmp reply 3.三层交换机三层转发原理   同样,源主机(src ip: 10.0.0.1/24)向目的主机(dst ip: 20.0.0.2/24)发送ping,假设经过中间…

Read more

OpenDaylight VTN源码及架构分析

  VTN是opendaylight中负责租户隔离的工程,最近对源码和架构研究了一段时间,现将总结如下,希望大家转载注明出处。   从VTN架构图我们可以看出,VTN共分为两个模块:VTN Manager和VTN Coordinator。VTN通过映射机制将虚拟网络资源(比如port,bridge,route)映射到物理资源上,包在租户内转发其实是在物理资源上进行转发,隔离机制是利用OpenFlow协议,转发时通过在支持OpenFlow的交换机上通过流表判断包的转发。 1.VTN Manager   VTN Manager位于controller内部,相当于控制器的一个plugin。它提供了REST接口对其进行增删改查。它还提供了对Openstack l2的网络api。以下是VTN Manager和VTN Coordinator的…

Read more

mininet与namespace

  前一阵发现一个问题,就是用mininet起的主机的namespace用ip netns查看不到,一直感觉很奇怪,因为根据mininet官网给出的描述,起创建的switch,host还有自带的controller都是位于namespace下的,其中switch和自带controller都是位于root namespace下,不同host是位于不同的host下面,但是为啥子用ip netns就看不到,明明ip netns就是查看namespace的。今天有时间,上网查了一下,终于知道以前了解的namespace只是冰山一角。本文只给出概括说明,具体不同namespace的详细用法查看文章底部的链接。   总得概括来说其实就是一句话:ip netns add创建的namespace是带name的,而mininet创建的namespace是nameles…

Read more

odl训练营及黑客马拉松比赛总结

  为期一周的odl训练营终于结束了,本来有很多话想要写下来的,等真正开始写的时候却又不知道写些啥了。大概先介绍一下这次训练营吧,这次活动主要是由思科负责,思科,BAT,运营商等牵头举办的,请来了odl的开发团队来给我们讲解odl。这次活动真心是太nice了,几个odl开发团队的老外特别nice,各种问题都耐心解答,思科的support team也非常nice,全程陪同,每天根据我们的反馈不断进行调整,连最后一天马拉松比赛我们通宵的时候他们也有人陪同,还有中饭,下午茶,晚饭,真心是贴心到家了。满分无商量。   这次培训主要讲解如何在odl中开发一个plugin,其实这些东西在社区都可以获取到,不过有人带着你step-by-step上手更快点。北向提供RESTful api,南向协议为netconf,大部分都和我们以前开发相同,不同之处在于南向协议不是…

Read more

OpenDaylight如何集成不同项目到controller中

  我下载了不同的项目,一个vtn,一个ovsdb,还一个controller,但是vtn项目和ovsdb项目又自带controller。我想同时使用vtn和ovsdb成问题。上网搜了好多,感觉odl的资料杂乱而不全,还是在社区上面提问,一个人帮助了我,现记录如下: 本人环境:Helium版本/stable/helium,3个项目都一样。 编译并运行controller $ cd ${CONTROLLER_DIR}/karaf/opendaylight-karaf $ mvn clean install $ cd target/assembly $ ./bin/karaf 编译vtn manager和coordinator(后者并非必须),其中coordinator由于使用C++编写,并非java,需要下载一些环境,具体参考这里。manager一般都能成功编译,参考官网…

Read more

OpenDaylight中一次ping触发的数据流

  下图给出了一次ping触发的大概数据流,由于模块较多,未能全部画出来,一些其他的模块比如UserManager,SwitchManager等都用到了,但是未被我画出来。注意,在Hydron版本中转发报文用的是SimpleForwarding,在Helium用的是l2switch。 host1 ping host4,首先发送一个arp报文,交换机收到arp报文,由于本身流表没有,上传到controller 由于是of 1.0的协议,走的of 1.0 模块,of1.0收到后上传到SAL层。 SAL层之上多个模块监听IListenDataPacket收包,每个监听IListenDataPacket的都会收到一份拷贝。Arp报文将会被ARPHandler模块接收。 ARPHandler通知HostTracker学习源主机地址。 HostTracker学习源主…

Read more

opendaylight ping模块开发中遇到的问题总结

  最近开始学习opendalight二次开发,从官网的给定的文档以及李呈的文档。不过配置时总有点问题,由于之前没怎么倒腾过java这一套东西,包括osgi, RESTful api, maven等这一套。现总结如下,如果有谁有错误的可以帮助到:   新手常问的问题就是:为什么我和xxx配置一模一样,我的就不行?好吧,其实我也一样。 定义yang文件,然后mvn install。此处不会有太大问题,要是mvn报错一般是因为网速不行,有些包download不下来,换个网速快点的就可以了。 创建bundle实现之前yang文件定义的接口。此处会有较大的问题,在配置pom.xml时,我按文档上给的配置,然后将mvn后生成的包拷到controller的plugin中(该文件存放所有运行的jar包),启动一直报错: BundleException: Th…

Read more