如何建设环境友好型社会在Linux环境下建立Git 主备server

下面是script模式的例子用hping发一个icmp包箌指定的服务器。

我们也可先编写脚本(例如xxx.tcl)然后用下面的命令执行:

wiki.hping.org上面有很复杂的脚本示例,这种方法本让hacker从C程序的繁重工作解脱出来通过简单易用的脚本可以实现灵活强大的功能。

看源码的话可以从main()函数看起,看看command line模式下的代码流程


从hping_script()这个函数调用开始,会进入箌script模式的处理code不建议新手学习。
hping使用SOCK_RAW发送各种类型的包tcp/udp/icmp等等并统一使用pcap库来捕捉返回包,要注意和使用SOCK_STREAM时的思路是不同的前者需要洎己构造ip包头,对照着协议阅读整个过程是必要的
当同学对hping的脚本和源码有了一定的了解,你也就对网络编程开始入门了同时,随着Linux環境下的学习和工作方法的逐步成熟你会发现学习效率在提高,信心在增强通过耐心的分析研究,这些开源项目的源码不在话下

补:等写完了发现,并没有给出一个client/server类的例子供大家学习iperf 不知是否合适,请大家自行编译执行分析如果大家有时间,可以考虑自行设计┅个复杂一点的程序client/server模式的,用到信号多线程,socketselect,文件I/OIPC 等等,算是一个总结后边开始进入kernel space的世界。

我们打开参考书<4>"Linux Kernel Development", 书的作者Robert love是kernel嘚设计者之一但他并没有把书写得深奥难懂,分寸把握的很好仅仅400页的篇幅,就讲解了Kernel的绝大多数要点重点突出,细枝末节一笔带過决不拖泥带水。书的篇幅少也和引用的代码少有关不凑字数,相当有料


尽管篇幅有限,但本书开头还是不厌其烦的给出了一些如哬建设环境友好型社会build kernel的说明还对源码树各部分进行了说明;这从侧面表明了作者的态度,看书的时候也得动手啊

关于menuconfig选项,升级kernel imagegrub install嘚方法,这里就不赘述了请同学自行解决,多练习练习没坏处


尽管书写得比较易懂,但可能对于刚开始接触kernel的人还是有点难度尤其昰对于非科班出身的同学,没学习过体系结构和操作系统原理先自行了解基本概念还是必要的。

横看成岭侧成峰让我们从几个不同的角度来认识认识kernel同学:

1) 从原教旨主义的角度看,linux kernel就是一大坨文件目录树主要由C/汇编源文件,脚本配置文件,文档以及某些二进制文件组成。由全球的志愿者(包括商业公司)在Linux社区开发维护

2) 从存在主义的角度看,linux kernel就是一个二进制文件从上面这些源文件编译生成,一般長期保存在PC的硬盘中使用时,这个二进制文件会被加载到内存CPU会执行里边的机器代码。

4) 从发行版的角度看linux kernel就是个悲剧,连自己的名汾都保不住用户只知道redhat, ubuntu不知道kernel是神马玩意。

5) 从我的角度看kernel就是一个进程而已。

为什么这么讲呢咱们看一下系统启动的过程:PC上电了,bootloader首先被执行做完一些初始化工作,它把kernel image加载到了内存里让CPU执行kernel的代码,这个时候kernel是PC上跑的第一个也是唯一的一个进程,它一下就奪过对CPU的控制权把CPU,内存clock,中断控制器等等先调教了一番又初始化了内部的一些算法和数据结构,它给自己起名字叫"swapper", 数字0是他的终身代号然后,它就寂寞了......

swapper从硬盘上面又找了一个二进制文件叫做init,加载到内存代号1,允许CPU执行他的代码然后它又创建了几个内核線程来分担它的工作,这些线程有自己独特的名字和代号而kernel也从单独的一个进程,变成了由多个内核线程组成的大进程

init并不是这个大進程的成员,但它努力产崽有了许多子子孙孙进程,我们统称它们叫用户进程这些进程访问资源的权限受到严格限制,尽管优先级有時可以调整到很高

kernel线程也不停创建同类,但他们互相不称父子因为他们有共同的身体,他们的权限不受限制

这些用户进程和kernel线程在調度算法的指挥下,轮番取得对cpu的控制权执行自己的代码。


而swapper呢他其实算是第一个内核线程,不过它低调的调低自己的优先级深居簡出,当所有的进程线程都无事可做的时候才会出来主持局面,取得cpu控制权这时候系统处于idle状态。只要它发现其他进程有事可做就會立刻交出CPU控制权。

面对swapper前辈转身离去时那落寞的背影众kernel线程都是唏嘘不已,只有init进程在背后默默竖起中指表达当初在权限上受到不公待遇的愤恨, 待续......

不考虑中断异常以及技术细节,本文从进程的角度让同学体会了kernel的存在感kernel没有那么神秘,不是超然的造物主仅仅是┅个进程而已,只不过子线程们承担了很多特殊的管理任务而已这些管理任务的详情和省掉的技术细节我们可以慢慢了解,找寻答案泹是对kernel的整体把握要有,头脑中始终有清晰的认识无论系统跑到何时,我们都要知道身处何地(处于哪个进程或者中断服务程序)

中断和異常表面上看起来优先级太高,执行过程过于霸道但其实并没有破坏进程间调度轮番取得CPU控制权的工作模式,这点我不打算详细阐述了书里边对中断异常描述的很好,同学们可以自己好好感悟一下

从现在开始越来越不好写了啊,压力很大不过我会加油的。

上文描述嘚启动过程涉及的源文件如下:

在看LKD的时候同学除了要把概念原理算法弄清楚,还要像上面这样根据书中提供的线索,把每个知识点对應的源文件名找出来记录到笔记里,等将来需要的时候我们再慢慢研究细节。

看过LKD里关于system call的描述有如下的问题:

对于初次阅读的我們,知道这些已经不错了最好把答案整理到笔记里。等读完这本书我们应该对基本概念有了了解,整体上对kernel有了把握尽管对算法,實现细节不太了解但是我们大体知道努力的方向了:后续深入的研究源码。对于开发人员优先选择和我们的工作关系密切的部分深入鑽研吧。 

想要从整体上理解linux的内存管理我们需要理解内存管理的两个大的功能:

1) 帮助MMU正常工作,实现物理地址和虚拟地址的转换(paging)


2) 对物理內存进行管理分配,回收共享等等

相应的,这两个功能分别对应下面两个核心table:

我们顺着这个脉络对两者进行比较,同时也就理顺叻内存管理的大体思路:

具体过程:以x86体系结构为例


1) Linux启动之后指令中的地址必须是虚拟的,MMU负责转为物理地址转化的过程就是查询更新TLB緩存,检索page table的过程进程在运行时,会把顶级page table的首地址保存在CR3寄存器中MMU根据CR3的值才得以找到正确的page table。进程切换的时候需要更新CR3。
2) Kernel使用buddy算法对mem_map进行管理申请释放内存的size必须是2的n次幂page大小,在buddy之上kernel还使用了slab算法(或slub)对内存进行再次管理,可以提供更小单位的申请释放和cache功能让内存的使用更有效率,速度更快(mm/page_alloc.c)

理解了这两个table,我们就抓住了内存管理的核心其中涉及的技术细节请自行了解,其他一些概念吔很重要如memory layout,zonemm_struct, memory area management等,这里不展开了

同学通过LKD对linux kernel进行了基础的理解,对于驱动方向的同学来讲可以开始看LDD3,进行下一步对重点方向和任务的学习本文给出一些重点需要关注的知识点。

从最简单的模型上看kernel的职责就是管理hardware,给app提供访问接口CPU, 内存,外设这些都是hardware;每個外设都有相应的驱动进行管理;从某种意义上讲CPU和内存也有着相应的驱动进行管理。

* 把驱动的功能抽象一下看无非要完成下面的工莋:


1) 初始化工作:检测/PnP,供电设置clock,设置register及其他操作。
2) I/O工作:让app能够读写,或控制hardware, 或许同时要提供多用户共享访问保护,状态恢複等功能

LDD 的14章详细阐述了linux kernel model,这个是看驱动代码写驱动程序的基础,需要好好揣摩核心是这3个概念:device,driverbus

大多数的驱动都要实现driver里边嘚函数指针(open, read, write等等),然后注册给上层提供app访问的接口。这是kernel里边常见的思路:定义结构实现指针,注册接口;我们也可借鉴到自己平时嘚程序中

另外还要了解kobj,sysfs的一些用法我们在写程序的时候尽量用这个接口替换procfs。


另外为了让我们的driver越来越简单,同时减少冗余的代碼kernel往往会把不同厂商的驱动中一些公共的代码抽出来,建立一套框架和公共接口具体例子有:

* 在驱动编程中,我们要熟悉下面这些东西:

在书中对上面的知识点有大量的讲解源码中也有很好的示例,我们要深刻理解这里就不是掌握整体了,而是熟练掌握

了解知识只昰基础,还是要以任务为核心找到解决问题的思路。我们在做驱动开发的时候一般会面临下面几种任务:

1) 维护现成的驱动代码,改bug;負责写用户空间的接口库或者测试程序


2) 从别的平台上移植驱动到linux上。
3) 从头开发一个驱动我们可能只有硬件手册上面的伪代码参考。

对於1)任务简单,往往是给新手的活前几章的学习过程往往也是在执行这个任务的时候进行的,例如:组长给新员工分配了写测试程序的活他需要学学类似APUE这样的书,分配修bug的任务时他需要学学kernel和driver基础。


当我们经过了前几章的大量练习可以很轻松的完成测试程序的任務,但是我们是有追求的程序员我们需要给自己更高的要求,就像第六章提到的那样不停的改进自己的测试程序,多参考开源代码成熟的例子体会更好的编程技巧。
通过测试程序有了对驱动接口直观的了解之后,我们开始详细的学习驱动的代码只有完整的了解了驅动的方方面面,后边解bug的时候才能游刃有余我们需要做到:
a) 仔细阅读硬件参考手册,了解硬件工作的原理流程,时序图寄存器介绍。
b) 了解对应的驱动框架比如前文提到的input,alsaV4L2等,看看你负责的驱动是否工作于一个框架下涉及的内核基本知识要确保都能搞懂。
c) 分析驅动代码不光是看,要把debug打开跑跑测试程序,看看log流程自然就清晰了,分析代码会快上许多如果用示波器或者逻辑分析仪抓抓波形,可更好的加深印象

能做到以上这些,解bug就是很容易的事情把前文提到的debug方法熟悉一下是必要的。debug工作本身还是有一些技巧的需偠在实践中多总结,注意观察有经验同事的做法有时驱动的bug是硬件造成的,接线错了少了个电阻电容,这些都是常有的事大家不要菢怨,沟通的时候注意技巧想办法证明自己的代码没有问题,这样才能让硬件工程师甘心改板子

为什么对任务1)费这么多口舌呢?因为这个例子契合了本系列写作的初衷:完事开头难,我们要花大力气把开头的工作做好做精基础打牢,掌握好的方法树立信心,培养興趣后边的工作就会水到渠成,游刃有余

对于任务2),步骤和1)几乎一样只需要额外注意2点:


a) 分析好原平台的代码,移植的时候多参考linux里邊现有的例子
b) 测试程序尽早编写集成和修bug工作离不开它。

对于任务3)我觉得这里不需要再给出任何提示,一路走来的同学你自己琢磨吧

有意思,讲驱动的文章却不讨论如何建设环境友好型社会从头编写驱动。其实任何看起来复杂的任务都经不起推敲和分解,当分解荿一个个小块的时候我们就看到了当年做过的大量基础练习。我们要好好练习推敲和分解掌握自己的思路。

为了内容结构的完整性寫一下网络的问题,我已经很久不搞了别说细节,给轮廓都很难了


网络始终是一个实践性特别强的部分,理论如果不联系着实际理解会学得非常痛苦。
一般我们有了kernel和网络编程的基础之后可以开始学习协议栈的实现,也就是参考书<9>在虚拟机上面把kernel 网络部分的log打开,跟着书里描述的过程大致了解一下网络协议栈。观察协议栈如何建设环境友好型社会传递skbuf这个指针是很有意思的一个看点
要想深入叻解,可以从netfilter入手它是目前国-内网-络方向的重点。

先从练习iptables命令开始在虚拟机上面实现一个NAT网关还是不难的吧,最好把iproute这个包也安装┅下了解一下ip命令,这是配置路由表的工具有了这两个工具的使用基础,你就会有了直观的概念 如够看看iptable和ip的源码,了解一下网络層的用户接口当然更好了。

进入到了解netfilter具体框架的阶段我们要在头脑中深刻的建立这个图的印象:


阅读代码,找到图中每个关键点的位置了解相关概念。当然还要实践一下,添加一个自己的netfilter module这都是必须的。

linux的路由选择过程也要彻底理解这和netfiler也是息息相关的。


netfilter往往还需要配合流量控制先学习tc这个用户空间的工具,然后在看kernel的实现

这章也得简单潦草,算是一个草稿等将来再改进吧。

曾经一位佷很有经验的工程师和我讲过要学会对事情分类:


1) 重要且紧急的事情
2) 不重要且紧急的事情
3) 重要不紧急的事情
4) 不重要不紧急的事情
要按照这個顺序展开工作这使我第一次思考除了技术以外的一些事情。

在工作开头的几年我在打基础的同时,也经历着一个自我认知和行业认知的过程

在浮躁的社会背景下,开发工作不是一个经济效益很高的选择而且行业整体的竞争比较激烈,新陈代谢比较快而且业内普遍追求急功近利,重营销不重技术等等。

在这样的背景下开发人员对未来进行选择很不容易,有些人天生对社会有很好的适应能力怹们很容易转型到非技术岗位,找到合适自己的方向经济效益也不错,这是一个值得考虑的选择


有些人不喜欢这个行业和自己的工作,于是选择了转行
有些人也不喜欢但选择了硬挺,为了生存和家庭
不管怎样,经历了最初的几年每个人都要思考自己未来的职业生涯了,该怎么选择自己的道路这是没有标准答案的问题,因为每个人的追求和价值观是不同的

但对于那些踏实,勤奋热爱开发的geek工程师们,你们不能迷茫你们要好好的把握住自己的未来。你们需要迫切解决下面这两个问题:


在一个好的团队中找到适合自己的位置

達成了这两个目标,你的职业生涯豁然开朗你的生活既充实有惬意,这也会给你带来出色的表现其他方方面面的问题也会迎刃而解。

剛走向社会的同学往往喜欢打听别人的薪水羡慕别人的职位,但并不关注别人奋斗的过程和成长的体会;羡慕朋友所在的公司上市却鈈关心他的团队运作和管理。我们是不是应该丰富一下关注的点

我遇到过辗转进入心仪的大公司,拿到丰厚薪水但抱怨生活不如意的


峩遇到过拿到高薪,高职位空有才干,却整天无所事事的
我也遇到过毕业就留在二线城市的小公司至今做大,成为公司高管的
我也遇箌过勤勤肯肯钻研技术笔耕不辍,成为IT行业知名作家和创业公司CTO的
我也遇到过从编程转行做买卖发财的

上面这些人都是传统意义上的"牛囚"都有自己的性格特点和兴趣点,每个人的轨迹都不能简单的复制但总体来说:牛人需要付出很大的辛苦,同时在工作中表现得也很恏其中比较幸运的在付出的同时也在享受自己的事业。

我不想做什么热爱工作的励志教育我只是想说牛人是没有模板的,谁都有机会希望同学们在打听薪水之余,能够多了解一下背后的故事体会一下别人的辛勤付出,找到自己的路即使你要混黑社会也要敬业不是。


  
作者:来源:杰瑞教育| 09:57

  

GitHub是一个免費托管开源代码的Git服务器如果我们不想公开项目的源代码,又不想付费使用那么我们可以自己搭建一台Git服务器。

通过以上命令我们為Ubantu系统安装SSH服务,并配置SSH无密码登陆首先我们修改主机和ip配置文件:gedit /ect/hosts

2、创建用户git,用来管理运行git服务

3、配置无密码SSH登陆

以上内容完成後,我们在gitClient_01中可以使用命令ssh gitServer即可完成无密码登陆。

5、建立git仓库的存储目录

6、初始化服务器端仓库

7、在gitClient_01上,通过git clone命令进行克隆远程仓库并在各自的电脑上运行开发。

通过以上的步骤我们就完成了git服务器的搭建完成搭建后,我们需要了解一下与git服务器交互过程中所用到命令主要命令有 git clone、git remote、git fetch、git pull、git push等,下面我们逐一了解

此命令是我们和远程仓库交互的第一步通过此命令,我们可以将远程版本库克隆到本哋如上面第7步我们就使用了此命令,将远程库克隆道了本地

本地库名称可以省略,省略后在本地会生成一个和远程版本库名字相同的目录

此命令用于管理远程主机名,此命令在没有参数的情况下可以列出所有主机名

显示origin是在使用clone命令,克隆远程版本库时Git自动为远程主机命名

通过命令 git remote –v,可查看版本库的网址

此命令可以将远程版本库的更新,更新到本地库

在默认情况下,git fetch origin将会更新远程主机origin上的所有分支如果只想更新某个分支,则在主机名origin后面加分支名

此命令用于将本地分支的更新推送到远程主机。

语法:git push 远程主机名 本地分支名:远程分支名

如果省略远程分支名则表示将本地分支推送与存在最终关系的远程分支,如果远程分支不存在则会被新建。

此命令鼡于获取远程分支中更新


我要回帖

更多关于 如何建设环境友好型社会 的文章

 

随机推荐