迟思堂工作室 李迟的技术主页 Fri, 09 Jan 2015 04:59:27 +0000 zh-CN hourly 1 http://wordpress.org/?v=4.0.1 我的2014年个人总结 /the-life/my-2014.html /the-life/my-2014.html#comments Thu, 01 Jan 2015 08:07:45 +0000 /?p=1125 我的2014年个人总结

时间过得真快,2014年就要过去了,新的一年正在向我们走来。站在2015年起点上,回首2014,有些事是值得记录的。

工作

工作占了我生活的绝大部分时间,除周末外,早上7点准时起床,上班、下班,每天有8~10个小时花在工作上,——不是在上班,就是在上下班路中。一年来的工作,肯定有不得不提的事。

年初(过年前、过年后的时期),公司就已经开始构思组织架构的变动了,最后我得知我所在的部门合并到其它部门时,已经是板上钉钉的事情,就差择日宣布了。接下来,进行部门的交接,我尽自己所知和所得,写文档,写电子邮件交接,从后面的效果来看,做这些其实是多余的,因为人在公司,避免不了时时被问以前的人和现在的人做的东西。

接着,高层领导认为公司的开发人员对于嵌入式Linux了解不多——直接原因是最近的一个项目因为对于别人的SDK及Linux不了解而出现很多问题,我们一时解决不了。所以要求部门进行知识体系的建立,并组织培训。我被安排整理嵌入式Linux的东西,当然,有部分我也只列个大纲,由其他人负责。最后,我大概做了2次培训,在一次培训上,得到其他部门同事的一句话:内核代码都开源了,你们做什么工作?对于不接触内核驱动开发的同志来说,任何解释和辩白都是无力的。其实在之前,我们几个人已经向公司层面反应了内核和系统的重要性,但公司一直有意无意地忽略,只有出现问题时才发现我们的基础不牢固。在整理过程中,主要是基本知识的积累,也写了些文档——而一些高深的东西,还没来得及做又开始忙其它事情了。

这个时期,也是老员工流失和新员工入职的时期。由于有些部门是新建立的,急需人员,去年我招进来的新人被补充到其它部门了。但我们部门也招了几个人。我被安排指导几个新人,于是写任务指导,讲解公司的一些开发上的注意事项,当然,还负责解答技术上的问题。我教新员工会先了解其技能,然后再做安排。因为是应届生,第一次谈话我会先说明公司和学校的差异,再强调个人主动性和自学能力,从谈话中或多或少可以了解新员工的技术。第一个新员工,从谈话我了解到他的Linux水平不足以胜任他所应聘的岗位,但还是抱有希望继续安排事务,但经过试用期,最终还是遗憾地离开公司。第二个新员工,我继续用同样的招数,发现他的技能还可以,在试用期中,我也断断续续地跟他强调自学能力以及事务的应对(特别和其它部门沟通、交付),经过试用期后,他留了下来。上文提到的新人,最终还是转到现在我所在的部门,因为是我招进来的,又是新员工,在工作中也常常帮点小忙。

公司领导认为我们开发的东西没有涉及到流媒体,而竞争对手早已用上了流媒体,所以,安排未合并前我所在部门的所有人——实际上也就4个人,在今年上半年进行流媒体的研究。这个事情是在告知部门合并时安排的。因此我有一点集中的时间看了下H264等方面的东西,在网上找了个MFC工程,修改一下,变成自己的东西,也算是收获和技术的巩固。而onvif,主要是因为去年在项目中使用了,鉴于公司已有的onvif是直接拿网上编译好的工程,以至于没人懂onvif代码是怎么来,于是我就去了解了一下,也写了点文档。流媒体的东西,最终我并没有参与进去。

接着公司进行一个基于已有平台和代码架构的项目,我所负责的是对于某种镜头的图像及转动的控制——其实就是根据文档写命令接口,技术含量不高。在此期间,接触了某华的同类型机器,并感慨一番。学习并掌握了pelco协议和索尼的visca协议。由于自己做的都是前期的命令接口,项目进行时也做些打杂工作,如改内核的管脚复用,解答一些很常见和容易的问题,因此,有感于自己的付出不大,就借口推掉了项目验收结束后的聚餐。

——这时,一年已过一半时间。

按经验,年中时就要进行新平台的研究了——去年是这样,今年也是这样:公司准备明年推出新平台,一个很高端的平台,于是召集人员进行预研,我们部门预计派出4~5个人,基本上是部门合并前的那些人员,我也在内。按计划是同时预研3个新平台,最后选出一款CPU。CPU都是多核的,有ARM体系的,有X86体系的。预研的计划已经写好,也开会确定时间点和人员安排了。但后面得知,公司层面在某次会议上决定使用某CPU进行高端平台的开发,我们的预研进度何其快!而我还没摸热板子,又被安排做其它事了。

当我们正在进行新平台预研时,公司又着手进行一个基于某款intel X86构架CPU的项目,这个CPU,正是上文提到的预研的CPU之一。在没有X86技术积累的情况下,轰轰烈烈地进行了。不知是什么原因,我被领导列为“任务负责人”。项目实施前期,我主要负责构建根文件系统,移植内核和驱动,当中的flash驱动移植得很窝囊,很不痛快,为此还专门写了篇文章。到中后期,负责修改部分公司框架的代码,负责提交测试事务——按以前做法,我只用负责和驱动有关的即可,现在,移完驱动还要继续写代码,在公司看来,物要尽其用,人也是一样。除了写代码外,我还做了很多其它的事:制作纯dos系统以升级设备的bios(因为是别人厂家的板子,bios也在修改);帮忙烧写系统(实际上是拷贝系统);焊串口对接线;协调资源,等等。这个项目使用了台湾厂家的板子,技术资料十分少,连LED引脚的说明,也是很多次询问才给出。对于BIOS功能上的问题,因为部门机制上和地区上的问题,断断续续地与厂家联系达2个月之久(因为不是直接由开发人员对接厂家,技术上问题由其它部门转述了,经常出现“台湾厂商不懂我们在说什么,我们也不懂台湾厂家在说什么”的情况)。我很想专心地写代码,至少大部分时间做与代码有关的事情。

——至此,我这一年在公司的事情,就说完了。

韩退之说:太凡物不得其平则鸣。古人亦有不得志之时,东坡之于黄州,子厚之于柳州,皆有佳文留世。这里我也要发发牢骚了。

组织架构的不好之处,就是我们的部门所做的东西,不是直接面向最终的客户,而是提供到其它部门。一个项目做好后,是移交给某些部门,而一旦有些什么问题,最终也是归结到这边来。加上薪资制度上的原因,对于部门人员的积极性和热情打击很大。

公司领导不知出于什么考虑,要在今年进行个人技能的评估,然后分A、B、C等级,根据等级定薪资。后来同样不知出于什么考虑取消了。当听到这个事情时,我十分担心自己的等级,观察我在公司所做之事,基本上算是“打杂”的,MFC懂一点,Linux系统使用懂一点,posix函数懂一点,内核驱动懂一点,示波器也会用一点,开源库和开源工具也玩过一些,AWB和AGC也了解一点,公司的FPGA接口会写一点。说不懂,其实也懂,说懂,其实也不懂。凡此种种,我不知领导如何评估。像其它东西,如web界面之类的,风格和易用性,一看便知,十分直观。而一个操作系统自身的稳定,并没有好的量化的手段,何况,Linux系统是开源的。

部门合并后,我的薪资提升并不多,但任务多了,这点从前文也可以看出,不但要做以前负责的事,其它的事也要做。按以前的约定,我们只负责底层的东西,业务程序和框架的代码不用管,现在也要维护了——维护别人写的框架是件痛苦的事。在年初薪资谈话时,新领导说:你们原来部门的人工资普遍都低。这话或多或少影响了我。从招聘信息上看,新来的同学的工资水平也逐步提高了。打工多年,终于到了考虑生活和钱的时候了。钱的问题成了后来我心态转变的直接原因。我无权决定我的薪资,但可以改变自己的心态。

对于上文提到的预研的事,我认为,单凭几个PPT就做结论,靠不完整的datasheet及demo,没有有力的技术支持,不可能深入了解和挖掘芯片,一旦准备不足,就会掉进去年做的几个平台的那种坑里。这次,又是领导开会决定所用的CPU。公司层面十分重视高端平台的开发,但人员配备不足,而且资料也不到位,这就陷入矛盾中了。我虽然暂时没有参与,但年底所做的项目中有很多体会。公司一直强调有问题向公司层面提出(最经典的话是:你解决不了不代表部门解决不了,部门解决不了不代表公司解决不了),在年底参与的项目中,开始的时候,由于很多问题无法确认,也没有头绪,我将疑问和技术难点写出来,发电子邮件给领导和有关人员,请求支援,却没有回音。在部门例会上,主管专门谈了这个事,从那些话中,我的理解就是,我不能只发问题,还要把解决方法写出来。这个事情导致后来我不敢冒冒然地提到问题,而是先自行找方法。

公司今年大力推行项目制度,一个员工,可能既隶属于部门管理,又归成立的项目组管理,像请假这类事,也是优先向项目经理申请。 上面提到的事,主管说了,项目经理事情太多,不能一一兼顾,所以要自己找方法,不能太依赖项目经理。公司有很多项目是并排进行,项目经理是专人负责,但战线太长了,不能全面顾及。成立项目时,也有项目助理一职,但助理多数是催促写工作日志和询问进度。

总结这两个事情,就是:公司重视,资源不足,只投人力,员工受苦。

生活

今年最重要的事情就是结婚。本来我不打算这么早成家,但综合各方面因素,终于在年底结婚了,其实,父母在去年就已经催此事了。如今实现了老爸经常唠叨的“成家立业”的前半部分。在结婚花费中,个人的花费约30K,家里能计算的,大约1万多,与收到的礼金大约持平。

第二大的事应该算是出国旅游了。细算了一下,去日本共花费约9.5K,参加旅游团花了近6K,个人购物用了将近3K,剩下的包含了国内打的、机场大巴,国外的吃喝。其中,公司报销了4K。对比花费及所得所闻,我觉得还是一次十分值得的旅游体验,日后吹水时可以说,哥也是去过东京,泡过温泉的人。正如去年爬过黄山一样。

自从去年买了个表后,觉得那块表不太正式,一直打算再买一块,而当下流行的海淘也吸引着我——这也是办理双币信用卡的初衷之一。在各大购物网站上调查并关注一段时间后,自己亲自实践了一把,学习转运和关税知识,注册账号,经过漫长的2个月,考验了耐性,终于无税到手,在邮局拆开包装拿到手表那一刻,十分高兴,而且这次竟没有让我再做一次光荣的纳税人。可惜的是,我的ebay账号已经被封了,不过以后在这上面购物的机会少,也就不理会了。

信用卡方面,今年陆续地申请,至年底,已有4张信用卡了。在必要的消费场合下,能刷卡即刷卡。不过,有卡后的开支还是开始慢慢扩大,不知是消费本身的必要性还是个人的盲目性造成。

交际方面,不时被同学相邀,有事无事吃个饭,按个摩,联络感情。而自己回请他们,同学当中,有各大行长和技术高管。

人身安全方面还可以,没什么大病,上下班一直坐公交车,也遇到到什么意外——除了我的手机被偷。那天加班坐车回家,手机不小心被人偷了。价值2K多的某米手机被人偷了,所幸立刻改了网银、QQ、电子邮件等密码,也告知父母、亲戚、朋友。金钱没有损失,而利用我的手机进行诈骗,应该还没有发生。由于有云服务,照片和其它信息,并没有丢失,这也是不幸中的大幸。去年被人入室盗窃,丢了2台电脑和数码相机,金额达8K,加上今年被偷的手机,作为外来工作者,我对首府作了上万元的经济贡献。

损失归损失,我还是买了些个人消费品,如借口学英语而买的300大洋的收音机,受旅游影响而决定入手的单反,等等。不知是不是因为在城市的原因,收音机收不到如BBC这类的频道,我依稀记得高中买了50多块钱的同牌子收音机,在老家是可以收到BBC的。那“This is BBC in xxx”依然十分值得回忆。而买的单反,的确发挥些作用,如五一期间,老妈和小妹及外甥女来玩,也拍了很多照片。此外还经常去周边拍拍风景,也借着提高摄影技术去图书馆借了些书来看。

年中时,由于受不了上下班路途,终于进行一次搬家,但搬来这边住,发现环境不如先前的好。这也难怪,只是看看房子就决定,并不能知道实际的情况。这里也不算太繁华,但每天晚上,音乐声、吵闹声,醉酒声,声声传入耳中。白天光线亦不好。好处是离上班地点距离短了,还可以去附近的大学操场上跑步锻炼身体。

财务

总体而言,本年度的财政收支平衡,但稍有节余。由于年终奖还没有着落,加上结婚花了一大笔钱,记账软件的报表中,年度收支差是负数。观察逐月报表,发现4月份(旅游)和11月份(结婚)收支差为负数,数额较大,将整年的总收支差变成负数。换言之,一旦出现重大情况,都会使得家庭资产十分危险,因此提高收入成为当务之急。

薪水收入占总收入将近70%,去年个人年终奖也比前年略有提高,占总收入20%。但在这个消费越来越高的城市中,生活还是觉得不是很惬意。

投资方面,依然继续去年的风格,以货币基金为主,少量金额定存于银行,其它就是A股市场。而贵金属、外汇这类,还没资格接触。

大部分的钱都在货基中,今年的收益,占总收入的2%左右。由于本金少,收益无法和其他人相比,但比起存银行,收益还是很多的。

而P2P方面,已有初步了解,鉴于风险考虑,一直未实际操作,直到近年底时,终于开始试水一把,但投入数额不大。总体而言,比起未了解信用卡及货币基金之前,个人理财已有一定进步。此方面还要继续努力。

不过,在A股市场上的亏损依然严重。自己的操作依然频繁,失误依然很多。往往买在最高点,抛在最低点,一买就跌,一卖就涨。在年底的各路人马大呼的“牛市”中,竟然出现亏损!很多时候,还是心态不够稳重造成的操作失利。总结起来,心理素质不够,技术上也有不足。还要继续努力。

总之,辛苦一年,但却没有存下多少钱。

个人

综观全年,发现工作并没有对个人的技术产生比较大的提高,从前文可以看到,接触了很多东西:H264视频,pelco协议,X86的驱动以及根文件系统,但这些都不算个人具有竞争力的技能。除了这些工作中用到的,其它方面倒没进行什么研究,这从我发表的文章分类可以看出一二。对于其它行业书籍,也是囫囵吞枣,不求甚解。

另外,个人主页由于技术上的问题要大改,于是趁机把整个网站彻底整顿,重新备案。作为个人的精神家园,时不时写文章,总结技术,还是有必要的。

在经历一些事后,发现个人脾气有不少缺点,主要是性子急,易怒。工作上,有不少人经常问一些很显见的问题,有时候烦了会说几句。有时候遇到技术难题时,往往一筹莫展,求助无果。比如,明明可以在代码仓库上查到日志,还是要去问人。明明百度一下就能找到答案,也要问人。一些事情在信息传递时发生变化,最后落到自己头上,不归自己的也归自己。有些问题自己不回答,同事以为自己牛了,不爱搭理人。现在后悔在某些场合上逞能,显摆自己。公司搞内斗时,被其它部门坑了几次,急躁的情绪容易被无意间触发。静下心来想想,大家同事一场,没必要如此,但是当时,却已忘记。

这种缺点,还延伸到日常中,在结婚时,就某些事情和老婆达不成一致,急性子也上来了。对老婆十分抱歉,毕竟夫妻间,只要静下心来,万事都好说。

抑怒、养气方面要注意,要慢慢向好的方面发展。

牢骚归牢骚,抱怨归抱怨,无论如何,还是要提高自身技术水平,提升生活质量。最后,借着同事说的话结束本文:

我的2015年愿望:做一名合格的工程师(包括待遇)。

李迟,2015年1月1日

]]>
/the-life/my-2014.html/feed 2
李迟大婚,网站暂停更新。 /the-life/my-wedding.html /the-life/my-wedding.html#comments Sat, 22 Nov 2014 08:14:35 +0000 /?p=1117 李迟大婚,网站暂停更新(全文完)。

]]>
/the-life/my-wedding.html/feed 1
一个x86平台的spi flash驱动移植笔记 /embedded-linux/x86-spi-flash-porting-note.html /embedded-linux/x86-spi-flash-porting-note.html#comments Fri, 21 Nov 2014 05:01:55 +0000 /?p=1112 说回这个flash驱动,厂家给的资料只有一个SPI接口的原理图,然后就是flash的手册以及Soc(前面文章多少也提过,这个Soc是Intel的一款芯片)的手册,——就没有然后了。我一开始还对厂家抱有幻想,以为会给demo,谁知后面催的时候却给了人家flash自家写的简单操作demo。关键一点,这个flash同时也存储着BIOS的代码。连我们自己可用的地址范围也是问了好几次才告知。经过自己好几天(其实前后加起来,有2周了)的折腾,加上厂家的支持,最终还是解决了问题,把驱动移植完了。个中滋味,着实难受。

那个flash芯片的操作,其实Linux也支持了。我天真地以为,只要把flash的id填写在那个文件里面就可以了,编译后启动,发现毫无反应。一查才知道,原来没有SPI主机控制器。以前移植某仪器公司的芯片,人家已经实现了主机控制器,所以很容易整合到内核中。现在却不同了。但找遍了内核的配置,没发现有那个Soc类似的控制器代码。于是慌了,问厂家,结果没信息。

于是又在网络上找,经过无序的google搜索,找到一个叫The Chromium Projects的东西,里面有那个SOC的代码。原来这个东西是来自另一个叫coreboot的项目,而coreboot里面有些代码又来自flashroom。无论如何,终于找到一个可以参考的工程了。于是就将里面的spi有关的代码移植到内核中。

为了方便调用,直接用KO的方式在系统运行时加载卸载。在初始化SPI时,发现里面是使用PCI来查询设备的,但coreboot的PCI的代码又不能用于内核,于是又上网了解PCI的知识。对于PCI,一直只闻其名,并没有真正接触过,所以看到直接写一个地址到0xCF8就能拿从0xCFC读取到数据时,从而判断出PCI信息的时候,还是很惊讶的。

解决PCI配置空间的问题后,可以正常找到PCI设备了,接着,加载后内核崩溃,查了好久,才发现是writel的问题,原来内核和coreboot的writel参数是相反的。改正后,可以读取flash的ID的,尝试读取flash的数据,看到有部分不是0xff,初步认为正常——不过,写到flash中的BIOS代码,完全不知道是怎么回事。后来测试写操作,这时又忘记了要先擦除才能写,又耗了一些时间。但写却不成功。擦除倒是正常,有一次测试中,把地址改为0,但忘记注释掉擦除函数,结果把flash的第1个扇区擦除了——这块板子就这样被我搞废了。

我想过可能是写保护的原因,周末利用点时间看看手册,再看看coreboot的代码,发现SPI控制器里面有几个寄存器是可以设置的,于是把代码整理出来,自以为找到了解决方法了。周一来测试,发现情况依旧:还是不能写,写保护还是没法去掉。于是继续查手册,发现几个寄存器的描述中有提到某些位一旦置1后,就不能再写了——而这些位就是锁就是锁住了另外的寄存器。于是猜测是BIOS做了什么事情锁住了寄存器。与此同时,知道了x86中的SMM、SMI这些名词,去网上了解一下资料。得出的结论是:现在这种情况,无法进入SMM,无法改寄存器,无法写flash。然后将测试及疑问发邮件问厂家,我们的最终目的是如何在Linux中使用flash,而不管什么模式什么保护。厂家回复说没在Linux下搞过,只搞过BIOS,然后给出参考步骤,第一步就是禁止写保护功能——而这,正是我们无法做到的一点。

此时,直接进坑了,无法解决。

第二天,厂家给出一个新的BIOS固件,叫我们升级试试。然后我试了,结果成功了!可以正常写了!我直接在flash中写上了惯用的“F”开头的语句。那一刻,很是激动。

最终的解决方法是直接参考coreboot的代码,然后自己封装一个platform设备,调用ioctl来实现读、写、擦除。而不管内核提供的SPI构架。

——一个人奋斗好几天,结果人家一更新bios,就解决了。再次用耗时的教训证明:合作,支持力度十分重要。

后记:

其实这次算是侥幸的了,感谢强大的开源社区!实然也为自己的能力感到羞耻。

想起大学的毕业设计,也是搞了很久,实然找到一个开源的不知是德国人还是法国人写的库(里面的注释还是靠着google翻译才有点看懂),然后就直接拿来用了,然后就解决问题了。

刚来公司时,也是因为一个问题搞了很久,那是一个周末,租房断网,自己拿着公司的本本,去一个同学那里上网继续解决。实然也找到一个类似的模块,又解决了问题。——那天,顶着大太阳走了好远的路。

同时,发现在公司干活或多或少都有坑,或是大坑,或是小坑。

有一次,因为一个接口小板的问题导致一个模块出错,看了半天程序也没找出问题,后来不要接口小板就OK了。又有一次一个IIC驱动问题,查了半天,原来是某仪器他家芯片的BUG,后来也是找技术支持才解决问题。

仅以此文记念那些日子!

李迟,2014年11月21日

]]>
/embedded-linux/x86-spi-flash-porting-note.html/feed 0
让ubuntu开机快一点:记开机出现Waiting for network configuration… /using-gnu-linux/ubuntu-more-fast-network-configuration.html /using-gnu-linux/ubuntu-more-fast-network-configuration.html#comments Mon, 10 Nov 2014 13:42:17 +0000 /?p=1108 新制作出来的系统,可以正常在设备上跑,不过有个小问题,就是启动时,如果不接网线的话,会卡在一个地方,卡很久。信息如下:
Waiting for network configuration…
Waiting up to 60 more seconds for network configuration…
……
在网上查了些资料,做了些笔记。
1、

修改/etc/network/interfaces文件
只保留以下:
auto lo
iface lo inet loopback
说明:设置静态IP不在此文范围

这样做的后果是网络设备并没有启用,用ifconfig查看是没有eth0信息的。

2、修改延时
编辑/etc/init/failsafe.conf文件

将第一个sleep从20秒改成5秒
# The point here is to wait for 2 minutes before forcibly booting
# the system. Anything that is in an “or” condition with ‘started
# failsafe’ in rc-sysinit deserves consideration for mentioning in
# these messages. currently only static-network-up counts for that.

sleep 5

把下面的语句都注释掉
#$PLYMOUTH message –text=”Waiting for network configuration…” || :
#sleep 40

#$PLYMOUTH message –text=”Waiting up to 60 more seconds for network con
figuration…” || :
#sleep 59
最大的延时就是上面的59秒。

上面第一点应该可以添加dhcp或static的配置,延时应该是第二点造成的,但我在设备上没有全面测试过。有一台服务器是使用dhcp的,但它一直连接网络,所以也不有这个问题。有一次换另外一个板子,发现进行上面的修改后,系统启动时还是会有Waiting for network configuration,而且卡死了,非重启不是恢复。暂时不知道是什么原因。特此说明一下。

参考:

李迟,2014年11月10日,周一晚

 

]]>
/using-gnu-linux/ubuntu-more-fast-network-configuration.html/feed 0
ubuntu系统debootstrap的使用之二:启动 /using-gnu-linux/ubuntu-debootstrap-ii.html /using-gnu-linux/ubuntu-debootstrap-ii.html#comments Mon, 10 Nov 2014 13:37:37 +0000 /?p=1106 上一篇文章:《ubuntu系统debootstrap的使用》只是介绍了如何从网络上制作(下载)一个新的、简单的根文件系统到本地中,但它只具外形而未能实际运用价值。因为只下载了一个最基本的系统,换言之,deboostrap并没有帮你做内核、引导的事情。所以要自己来做。本文就将这个基本的系统放到设备上跑一跑。为了方便测试,将上面的系统放到另外一块硬盘中。

一、下载完后要做的事情

添加用户(不添加不行,否则启动新系统,无法登陆):

添加latelee用户,密码也是latelee:

# adduser latelee
# addgroup –system admin
# adduser latelee admin
# passwd latelee

Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

虽然很多人不建议,但我还是添加了root用户密码

# passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

查看/etc/shadow看看root密码是否设置了。如果没有设置,是没有一堆乱码的。下面是加了密码的文件:

# cat /etc/shadow
root:$6$0apsPMDz$rG8PKojxmE/F/nh0WBA25eDsBL31H5sWQllF2OKp2/xy/xS47q37diFQXVQY/wl3FYEVvDooLTZZOFrUbJlCi.:16351:0:99999:7:::

——————————

安装常用编译工具:
apt-get install build-essential

如果要编译内核,则要安装ncurses库:
apt-get install libncurses5-dev libncurses5

安装其它杂七杂八的:
apt-get install vim tree

(其它的,自行安装)

二、添加硬盘

在VMware添加外设十分简单,在VM->Settings…->Add…中已经有很多外设可添加。这里选Hard Disk,大小选100GB或200GB都可以(按实际情况占物理盘空间,不是一开始就占了100GB空间的)。此时系统还不能识别出第二块硬盘,要重启虚拟机系统,才能识别到,一般是sdb。下面格式化之。

# fdisk /dev/sdb

这里我分了2个区,sdb1是交换区,大小为4GB,剩下的是sdb2分区。

其实分区的操作很简单的,输入上面命令后,只需要输入以下内容即可(感谢强大的“默认”功能)。

n 回车 回车 回车 +4GB  (第一个分区OK)
n 回车 回车 回车 回车   (第二个分区OK)
p (查看分了几个区)
w (写入分区表并退出)

格式化:

mkswap /dev/sdb1

mkfs.ext4 /dev/sdb2

将上面的新系统拷贝到sdb2中。

cd /mnt

mkdir /tmp/tmp

mount /dev/sdb2 /tmp/tmp

cp -a * /tmp/tmp

(不局限于命令,明白意思即可自行改)

三、内核

内核可以自己编译,也可以直接拿已有系统的。

本来想编译一个比较小一点的内核,但没时间研究那么多的模块选项。如果使用默认配置编译,大概有4000多个模块。占用空间约1.8GB,是比较庞大的。为了省事,可以直接用ubuntu14.04自带的内核。

四、引导

(此节内容部分未完全经测试测试,略具参考意义)

grub-install /dev/sdb (不加分区,好像不行)

使用sdb2挂载到/mnt中,运行update-grub

在第一块硬盘的grub.cfg上添加sdb

# update-grub
Generating grub configuration file …
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Found linux image: /boot/vmlinuz-3.13.0-32-generic
Found initrd image: /boot/initrd.img-3.13.0-32-generic
Found linux image: /boot/vmlinuz-3.13.0
Found initrd image: /boot/initrd.img-3.13.0
Found linux image: /boot/vmlinuz-3.13.0.old
Found initrd image: /boot/initrd.img-3.13.0
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
Found Ubuntu 14.04 LTS (14.04) on /dev/sdb2
done

查看分区uuid

# blkid
/dev/sdb1: UUID=”6b367f92-b39c-4ba9-8f93-5ff31769d6c8″ TYPE=”swap”
/dev/sdb2: UUID=”e2aad928-67bc-4c63-8a76-d49cafe95bdb” TYPE=”ext4″
/dev/sda1: UUID=”f6e3980f-c507-4c57-99cb-6bf13d62f8be” TYPE=”ext4″
/dev/sda5: UUID=”ed578acd-5ff6-4c98-9f63-6b3ab532f057″ TYPE=”swap”

按上结果,编辑挂载分区脚本/etc/fstab,示例如下:

#根分区“/”

UUID=e2aad928-67bc-4c63-8a76-d49cafe95bd /               ext4    errors=remount-ro 0       1

# 其它分区,如有,则要一一添加。本例是没有的
#/boot
# UUID=49f71055-4a5b-4ef1-a5ae-d40c507a30e1 /boot           ext4    defaults      0       2

#交换分区
# swap
UUID=6b367f92-b39c-4ba9-8f93-5ff31769d6c2 none            swap    sw              0       0

原来的grub.cfg文件:

menuentry ‘Ubuntu 14.04 LTS (14.04) (on /dev/sdb2)’ –class gnu-linux –class gnu –class os $menuentry_id_option ‘osprober-gnulinux-simple-e2aad928-67bc-4c63-8a76-d49cafe95bdb’ {
insmod part_msdos
insmod ext2
set root=’hd1,msdos2′
if [ x$feature_platform_search_hint = xy ]; then
search –no-floppy –fs-uuid –set=root –hint-bios=hd1,msdos2 –hint-efi=hd1,msdos2 –hint-baremetal=ahci1,msdos2  e2aad928-67bc-4c63-8a76-d49cafe95bdb
else
search –no-floppy –fs-uuid –set=root e2aad928-67bc-4c63-8a76-d49cafe95bdb
fi
linux /boot/vmlinuz-3.13.0 root=UUID=f6e3980f-c507-4c57-99cb-6bf13d62f8be ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet splash $vt_handoff
initrd /boot/initrd.img-3.13.0
}
改后的:

menuentry ‘Ubuntu 14.04 LTS (14.04) (on /dev/sdb2)’ –class gnu-linux –class gnu –class os $menuentry_id_option ‘osprober-gnulinux-simple-e2aad928-67bc-4c63-8a76-d49cafe95bdb’ {
insmod part_msdos
insmod ext2
set root=’hd1,msdos2′
if [ x$feature_platform_search_hint = xy ]; then
search –no-floppy –fs-uuid –set=root –hint-bios=hd1,msdos2 –hint-efi=hd1,msdos2 –hint-baremetal=ahci1,msdos2  e2aad928-67bc-4c63-8a76-d49cafe95bdb
else
search –no-floppy –fs-uuid –set=root e2aad928-67bc-4c63-8a76-d49cafe95bdb
fi
linux /boot/vmlinuz-3.13.0 root=UUID=e2aad928-67bc-4c63-8a76-d49cafe95bdb ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet splash $vt_handoff

initrd /boot/initrd.img-3.13.0
}
menuentry ‘Ubuntu, with Linux 3.13.0′ –class ubuntu –class gnu-linux –class gnu –class os $menuentry_id_option ‘gnulinux-3.13.0-advanced-f6e3980f-c507-4c57-99cb-6bf13d62f8be’ {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root=’hd0,msdos1′
if [ x$feature_platform_search_hint = xy ]; then
search –no-floppy –fs-uuid –set=root –hint-bios=hd0,msdos1 –hint-efi=hd0,msdos1 –hint-baremetal=ahci0,msdos1  f6e3980f-c507-4c57-99cb-6bf13d62f8be
else
search –no-floppy –fs-uuid –set=root f6e3980f-c507-4c57-99cb-6bf13d62f8be
fi
echo     ‘Loading Linux 3.13.0 …’
linux     /boot/vmlinuz-3.13.0 root=UUID=f6e3980f-c507-4c57-99cb-6bf13d62f8be ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet splash $vt_handoff
echo     ‘Loading initial ramdisk …’
initrd     /boot/initrd.img-3.13.0
}
说明:

root=’hd1,msdos2’,第二块硬盘的启动区,变成hd1,msdos2。第一块硬盘分区,是root=’hd0,msdos1′

uname -a
Linux ubuntu 3.13.0 #3 SMP Wed Oct 8 09:38:48 CST 2014 i686 i686 i686 GNU/Linux

五、设备上的测试

上面第四点写得比较乱,因为当时不得其法,边学边搞,最后莫名其妙地搞定了。这里再在一个设备上进行实验,并按操作的步骤进行描述。其中根文件系统源文件已经修改好,内核也移植好。

我所用的设备上有2个SATA口,所以可以使用一个硬盘启动,再挂一个硬盘,如果不具备此条件,也可以使用SATA转USB,使用PC来操作。另外,还可以用Live CD来做,如果空间不足够,挂载NFS来解决。

1、将硬盘分区。并用mkfs.ext4、mkswap来格式化。

示例:

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux
/dev/sdb2         4196352    14682111     5242880   83  Linux
/dev/sdb3        14682112    15684095      500992   83  Linux

格式化后,挂载分区。这里我指定sdb1为根分区,sdb2为程序分区,sdb3为交换分区。

2、查看分区的UUID(下面挂载时要用到)。
# blkid
/dev/sdb1: UUID=”5726537f-778d-408a-827e-dc76b1a316ba” TYPE=”ext4″
/dev/sdb2: UUID=”f9e6893a-5181-4e1a-91e5-31873259a1c9″ TYPE=”ext4″

/dev/sdb3: UUID=”22f27499-7be5-4b06-8a21-67b145c98fa3″ TYPE=”swap”

3、编辑自动挂载脚本/etc/fstab。
# new 2014.11.20
# / was on /dev/sda1
UUID=5726537f-778d-408a-827e-dc76b1a316ba /               ext4    errors=remount-ro 0       1
#/opt /dev/sda3
UUID=f9e6893a-5181-4e1a-91e5-31873259a1c9 /opt            ext4    defaults      0       2
# swap
UUID=22f27499-7be5-4b06-8a21-67b145c98fa3 none            swap    sw              0       0

4、编辑grub.cfg

在grub.cfg中,内核路径不能错。如果/boot单独一个分区,则直接写成/vmlinuz-3.17.1,如果不是,则要写成/boot/vmlinuz-3.17.1。之前就因为这个原因耽误了一段时间。另外root指定的分区名称也要与实际的一致。

下面是一个十分简单但可启动的grub.cfg文件:

set default=0 #默认第一项,按下面的格式可以写很多项
set timeout=3 # 超时时间
menuentry ‘Late Lee Ubuntu’ {
set root=’hd0,msdos1′
echo “vmlinuz….”
linux   /boot/vmlinuz-3.17.1 root=/dev/sda1 ro console=tty0 console=ttyS0,115200n8
}

5、安装grub

这里要安装的硬盘为sdb,上面所说的根分区我挂载到/tmp/latelee目录。

# grub-install /dev/sdb –root-directory=/tmp/latelee
Installing for i386-pc platform.
Installation finished. No error reported.

完成上面的步骤后,就OK了。

李迟,2014年11月10日,周一晚,2014年11月20日补充

 

]]>
/using-gnu-linux/ubuntu-debootstrap-ii.html/feed 0
Linux查看CPU型号及内存频率及其它信息的命令 /using-gnu-linux/linux-cpu-mem-info.html /using-gnu-linux/linux-cpu-mem-info.html#comments Tue, 04 Nov 2014 12:13:17 +0000 /?p=1103 这篇文章写一下以前整理的查看系统资源、性能的一些命令。本来那时就想系统地整理的,但事多人懒没去做,现在就简单写写。

查看CPU:
# cat /proc/cpuinfo
该命令可以查看系统CPU有多少个核,频率,特性等等。
查看cpu内核频率
# cat /proc/cpuinfo |grep MHz|uniq
cpu MHz : 27518.499

查看内存:
#cat /proc/meminfo
这个命令只能看当前内存大小,已用空间等等。

要查看内存型号、频率,使用命令(使用root才行):
# dmidecode -t memory
输出示例:
Memory Device
Array Handle: 0x0012
Error Information Handle: No Error
Total Width: 64 bits
Data Width: 64 bits
Size: 4096 MB
Form Factor: SODIMM
Set: None
Locator: DIMM0
Bank Locator: BANK 0
Type: DDR3
Type Detail: Synchronous
Speed: 1333 MHz
Manufacturer: 00
Serial Number: 00000000
Asset Tag: Unknown
Part Number:
Rank: Unknown
Configured Clock Speed: 1333 MHz

查看系统运行时间:
# cat /proc/uptime
65923.93 65697.26

查看内核IO地址映射:
# cat /proc/iomem

查看上一次登陆:
# last /var/log/wtmp
(如不存在,直接touch生成。可用rm删除 )

内核版本:
# cat /proc/version

查看内核函数:
# cat /proc/kallsyms

查看系统启动参数:
# cat /proc/cmdline
磁盘信息(这个文件一般人看不懂,有工具就是分析这个文件得到磁盘性能信息的):
# cat /proc/diskstats

查看中断:
# cat /proc/interrupts
清空内存:
# echo 2 > /proc/sys/vm/overcommit_memory

李迟,2014年11月04日晚上

]]>
/using-gnu-linux/linux-cpu-mem-info.html/feed 0
ubuntu apache服务器和gitweb服务器搭建 /using-gnu-linux/ubuntu-apache-gitweb.html /using-gnu-linux/ubuntu-apache-gitweb.html#comments Tue, 04 Nov 2014 12:12:49 +0000 /?p=1100 ubuntu下安装软件十分简单。只需要apt-get install即可,不用自己下载源码,自己编译。这篇文章主要写一下web服务器的搭建,至于gitweb,其实很久以前已经搞了,那时为了更好地推广git而做的,不过至今效果甚少。但它与web服务器共同使用,因此在这里也一并写上。

apache

1、先查看80端口是否被占用
netstat -nap | grep 80
有则停止程序,否则与apache冲突,比如,我的虚拟机先前已经有了boa,则要停止boa。

2、安装apache
sudo apt-get install apache2
安装后,默认已经运行,并且开机自启动

重启命令:

/etc/init.d/apache2 restart

如果重启apache2有警告,如下:
Could not reliably determine the server’s fully qualified domain name, using ::1. Set the ‘ServerName’ directive globally to suppress this message
解决也简单,在/etc/apache2/apache2.conf文件最后添加
ServerName localhost
(注:localhost名称为机上的名称,和/etc/hostname 一致)

安装完成后,还有些小事情要完善一下。

1、 改默认目录

以前老版本的apache2默认的目录是www,但新版本变成了/var/www/html,apache邮件列表上有关于这个修改的说明,在新版本的ubuntu和Fedora,都已经使用了新的默认目录。如果想要修改也简单,在/etc/apache2/sites-available/000-default.conf文件中,把
DocumentRoot /var/www/html
改为
DocumentRoot /var/www

2、改默认主页
一般地,默认主页是index.html文件,但有的场合下不是这个,这时就要修改了。

进入/etc/apache2目录,用下面的命令查找(又学习了一个查找的):
grep -iR DirectoryIndex /etc/apache2
找到/etc/apache2/mods-enabled/dir.conf文件,在DirectoryIndex后面加上想要的默认主页名称即可,如下(最后一个是我自己加上的):
<IfModule mod_dir.c>
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm latelee_index.html
</IfModule>

至此,web服务器基本上可以说完成了。

apache2本身就记录有访问信息(我的网站不断受到垃圾消息干扰,和其斗争过程,分析过访问日志)。可以通过查看access.log来了解。

查看访问IP,并统计:
cat /var/log/apaches/access.log | awk ‘{print $1}’ | sort -n | uniq -c | sort -n

查看IP及访问的页面:
cat /var/log/apaches/access.log | awk ‘{print $1 $11}’

在工作中,我需要将自己做的事务共享出去,我就是用这些命令来看看有没有人来访问(万一哪天扯皮,我就有理由说:我都已经发出公告了,你们没看,怪谁呢?哈哈哈哈!)。

gitweb

1、安装gitweb
sudo apt-get install gitweb

如果提示:
E: Unable to fetch some archives, maybe run apt-get update or try with –fix-missing?
则要执行命令sudo apt-get update

2、设置gitweb属性

编辑/etc/gitweb.conf文件
项目路径(在开头处):
$projectroot = “/home/git”;

在最后加上
$site_name = “GitWeb @ LateLee-Server”;
$feature{‘search’}{‘default’} = [1];
$feature{‘blame’}{‘default’} = [1];
#$feature{‘snapshot’}{‘default’} = [‘tgz’,’tbz2′,’zip’];
#禁止Snapshot
$feature{‘snapshot’}{‘default’} = [undef];

5、页面布局改善:

默认的gitweb界面十分难看,需要改一下。在/var/www目录创建/usr/share/gitweb/static/的链接
ln -s  /usr/share/gitweb/static/ /var/www/static

直接输入IP,再添加gitweb即可访问gitweb。

http://192.168.18.168/gitweb/

这样,就可以在浏览器上查看log和代码了。

上面所述环境为最新版的ubuntu,14.04。网上有些文章提到的配置已经不适合新版本了,故写了本文。

李迟,发表于2014年11月04日晚上

]]>
/using-gnu-linux/ubuntu-apache-gitweb.html/feed 0
Ubuntu编译内核及grub的一些笔记 /using-gnu-linux/ubuntu-compiling-kernel-grub-notes.html /using-gnu-linux/ubuntu-compiling-kernel-grub-notes.html#comments Tue, 04 Nov 2014 12:05:33 +0000 /?p=1097 最近心态不稳定,不怎么想发表文章,但看了看之前写了的笔记,想想还是整理出来吧,其实我写文章,也有一部分原因是为了心里的慰藉——当年游戏打不过别人,关注点便转向其它方面。这里整理的是以前编译内核、引导启动过程的步骤及问题的解决。

内核编译

安装Ubuntu默认没有基本的开发环境,需要自己去安装。比如编译内核要安装gcc,还要装ncurses库:

apt-get install build-essential
apt-get install libncurses5-dev libncurses5

Ubuntu编译内核的步骤十分简单,只要下面几个命令:

make menuconfig(默认不需要也行)
make bzImage
make modules
sudo make modules_install
sudo make install

在最后一步,会自动去更新grub配置,不用再自己生成内核的img,再自己拷贝内核文件到/boot目录了。不过,默认的配置会编译很多很多的模块,编译时间久,无意间看了一下,竟然有4000个左右——懒人不动手,就得花时间等。

对于内核模块的编译,一般选择在源码树外的目录进行编译,这时,要自己写Makefile——而且这个Makefile还不是很简单,其实,如果将其放到内核树中编译,可能会变得简单一些。实际上,我就体会到这种做法的好处。最近做的东西是基于x86平台的,它不像ARM那样可以直接在uboot下载内核文件启动。我要将内核文件拷贝到系统的/boot目录,然后再重启设备,这过程很麻烦。为了方便调试,将驱动以ko形式在系统运行时加载、调试。通过后再将其编译进内核。这时,驱动的源码是放到内核树中的,所以不用再重新写Makefile。

比如,编写字符模块hello,把需要的代码放到driver/char/hello目录,再修改char目录的Kconfig和Makefile。

Kconfig为配置的文件,通过它,make menuconfig才能识别出来,。

config HELLO
tristate “Hello world”

default y
—help—
God help those whom help themself.

保存配置文件后,其中的HELLO变成CONFIG_HELLO,再修改Makefile

obj-$(CONFIG_HELLO) += hello/

这样编译时就会找到hello目录。另外,还要在hello目录加上一个Makefile来指定编译哪些文件,编译后的模块名称:

如:

#
# Makefile for the hello drivers.
#
obj-$(CONFIG_HELLO) += Hello.o

Hello-objs := hello.o hello_drv.o

第一行指定了编译后模块名称(如果make menuconfig时选择“M”的话),编译得到的将是Hello.ko文件,第二行指定了要编译哪些文件。注意第一行的Hello必须与第二行的Hello-objs中的“Hello”一致,否则会编译不通过,会有如下提示:

make[3]: *** No rule to make target `drivers/char/hello/hello.o’, needed by `drivers/char/hello/built-in.o’.  Stop.

我因为这个问题而花费了好几分钟。

进行上面操作后,编译模块就十分简单了,不需要额外的Makefile(因为已经写有了),编译单个模块,以I801驱动模块为例:
make CONFIG_I2C_I801=m -C /home/latelee/kernel_source/linux-3.17.1 M=/home/latelee/kernel_source/linux-3.17.1/drivers/i2c/busses/ modules

如果进入kernel source目录,就可以简化成:

make CONFIG_I2C_I801=m -C . M=drivers/i2c/busses modules

对于上面所说的模块,则是:

make CONFIG_HELLO=m -C . M=drivers/char/ modules

Grub启动

Ubuntu默认是启动图形界面的,可以通过修改grub配置文件,改为text模式启动。修改/etc/default/grub,把splash改成text,再运行update-grub命令,即可完成。

如果直接改/boot/grub/grub.cfg的话,也是可以的,但下次重新安装内核又会再次使用/etc下的配置,因此,还是要改配置文件。

有一次,启动硬盘后,出现错误信息:
error: file ‘/grub/i386-pc/normal.mod’ not found.
grub rescue>
在网上找了解决方法,如下
1、使用live cd进入系统
2、挂载根分区硬盘(假设”/”分区是sda1)

mount /dev/sda1 /mnt
3、安装grub
sudo grub-install /dev/sda –root-directory=/mnt

如果系统进入了grub,但由于路径错误不能正常启动,可以在grub命令行用命令来启动。实际上,我就遇到过几次,因为连接着显示器,错误信息一闪而过,就变黑屏了,看不及看清楚。最终有同事提示下才发现问题所在。因为我的vmlinuz文件在/分区,会引用全路径/boot/vmlinuz,而我的grub配置文件是另一个硬盘的配置,是/boot分区,直接用/vmlinuz。——这也是同时多进程工作的弊端,有时会分不清到底自己在搞哪一块。我也同时因为同时在secureCRT中连接多个Linux(一同个窗口,一个连设备ssh,一个连虚拟机ssh,一个连服务器ssh)而无意间把服务器关机了,幸好影响不大。

下面是grub启动linux的命令示例:

grub>
grub>linux /vmlinuz-3.17.1 root=/dev/sda2
grub>initrd /initrd-3.17.1
grub>boot

最后,附上一个很简单但能正常启动的grub.cfg:

set default=0 # 第一个启动项

set timeout=10 # 超时时间

menuentry ‘My Ubuntu –first’ {
set root=’hd0,msdos1′
echo “vmlinuz….”
linux   /vmlinuz-3.17.1 root=/dev/sda2 ro  console=tty0 console=ttyS2,115200n8
}

menuentry ‘My Ubuntu –second’ {
set root=’hd0,msdos1′
echo “vmlinuz….”
linux   /vmlinuz-3.17.1_nof75111 root=/dev/sda2 ro  console=tty0 console=ttyS2,115200n8
}

发行版本的grub.cfg有很多内容,其实就包括上一篇文章说到的uuid,我一度担心因为在Grub中要配置,而每个硬盘的分区id不同,则要分别改配置文件,结果用dd命令拷贝后无须担心这个问题了。

李迟,发表于2014年11月04日晚上

]]>
/using-gnu-linux/ubuntu-compiling-kernel-grub-notes.html/feed 0
linux下用dd命令拷贝硬盘 /using-gnu-linux/copy-hard-disk-using-dd.html /using-gnu-linux/copy-hard-disk-using-dd.html#comments Tue, 04 Nov 2014 12:02:17 +0000 /?p=1095 最近所做的项目涉及到系统的“烧写”,在ARM中,一般用flash,容量也不大,直接用erase操作即可。但在x86上,硬盘动辄上G,安装一个发行版本的Linux,也得3GB~4GB,如果将这些数据“烧写”,的确不易,反正我是不知道用什么方法。

ghost方法我想过(但没试过),因此最终的设备没有鼠标、没有键盘,没有显示器,不能说给你个光盘,就可以安装系统。幸好,去网上搜索一番,得到一些有用的信息,原来,直接使用dd命令就可以完成。当拷贝完硬盘后,就可以拿这个硬盘放到其它设备上跑了。也就是完成了“烧写”了。

实际操作中,最好使用另一个系统启动,如另一个硬盘的系统,或者用live cd。当然,拷贝当前运行中的系统也是可以的,但不知当前的这个系统还有哪些不确定东西,所以还是不建议。

用fdisk -l查看当前所有分区信息(记得用root,否则执行了啥也看不到),如:

Device Boot      Start         End      Blocks   Id  System

/dev/sdb1            2048     1002047      500000   83  Linux

/dev/sdb2         1002048    12002047     5500000   83  Linux

/dev/sdb3        12002048    13002047      500000   83  Linux

/dev/sdb4        13002048    15002047     1000000   83  Linux

上面是我为了方便写文档而做的分区,可以看到Blocks十分工整,那是故意而为之的。

全盘拷贝的命令:

dd if=/dev/sdb  of=/dev/sdc

分区拷贝:

dd bs=512 count=[fdisk命令中最大的end数+1] if=/dev/sdb of=name.img

以上为例:

dd bs=512 count=15002048 if=/dev/sdb of=ghost_linux_latelee.img

由于ghost_linux_latelee.img会很大,可以在拷贝时将其压缩:

dd bs=512 count=15002048 if=/dev/sdb | gzip -9 > ghost_linux_latelee.img.gz

上面所做的,就是传说的系统“备份”,或叫“系统克隆”。

对应的,有系统恢复的操作。命令如下:

dd if=ghost_linux_latelee.img of=/dev/sda

如果是压缩包,则命令为:

gzip -c -d ghost_linux_latelee.img.gz | dd of=/dev/sda

 

在上面的拷贝过程中,并不知道拷贝了多少,只有最终结束时才显示出时间、拷贝速度。为了查看进度,可以在另一个终端输入(记得用root):

watch -n 5 killall -USR1 dd

(注:killall并不是传说中把进程kill掉,而是发送一个指定的信号到指定的进程)

之后,就能执行dd的终端看到进度了,如:

58299+0 records in

58298+0 records out

29848576 bytes (30 MB) copied, 4.67728 s, 6.4 MB/s

161403+0 records in

161402+0 records out

82637824 bytes (83 MB) copied, 9.69359 s, 8.5 MB/s

238651+0 records in

238650+0 records out

122188800 bytes (122 MB) copied, 14.7105 s, 8.3 MB/s

 

备注:

用dd的方式,得到的镜像文件十分庞大——取决于所要做的系统的大小。比如,拷贝4GB的分区,真的就是拷贝4GB,即使是用gzip压缩,也压缩不了多少,文件依然很大。

另外dd的方式也消除了我之前的担心,因为现在的Linux发行版的分区使用硬盘uuid作为标识,而不是/dev/sda1这种格式,据说uuid更好。但用dd拷贝,竟然连硬盘的uuid也一一拷贝,毫无变化,这的确让我吃惊。不过,目前看没什么时间研究dd了。

李迟,发表于2014年11月04日晚上

]]>
/using-gnu-linux/copy-hard-disk-using-dd.html/feed 0
将x86平台的Linux控制台重定向到串口 /using-gnu-linux/linux-cosole-redirect-serialport.html /using-gnu-linux/linux-cosole-redirect-serialport.html#comments Wed, 22 Oct 2014 05:21:00 +0000 /?p=1092 一般地,安装在PC的Linux是使用鼠标、键盘作为输入源,显示器作为输出显示,但有些X86的设备,如工控机等,为了节省成本,会去掉认为无用的外设接口,以致熟悉了PC的人不习惯。一个设备,没有鼠标、键盘、显示器,但只要还有串口,还是可以控制的。本文将在一个具备串口的设备上配置Linux系统,以便将控制台重定向到串口。Linux使用ubuntu14.04发行版本。

需要改动的地方有2处,一是grub配置,二是登陆配置。当然,还有一个重要前提,就是串口能正常工作。

说来惭愧,由于板子不具备一般人所认为的SDK,——我们觉得板子自带有资料、SDK开发包是理所当然的,但实际上,有些却不然。为了测试哪个串口设备可用,我使用串口口调试助手逐一发送数据到指定的串口设备文件(命令如echo “latelee” > /dev/ttyS0),幸好只测试到第3个设备文件即能成功,否则,还有一直测试下去(在/dev/目录下有32个ttyS设备,启动信息看到共有6个设备)。因此找到正确、正常能用的串口设备是最关键的。实际中,可能ttyS0可用,也可能ttyS2可用。下面以ttyS0为例说明。

通常情况下,波特率等参数是115200n8,有些配置内核时好像看到过,但没什么印象。

使用root权限,先备份好已有文件。
/etc/default/grub:配置
update-grub:
/boot/grub/grub.cfg:

1、创建登陆配置文件

创建/etc/init/ttyS0.conf文件(如是其它串口,所有的ttyS0都改为ttySx,文件名也是ttSx.conf),下面是ttyS2.conf文件的内容如下:

# ttyS2 – getty
#
# This service maintains a getty on ttyS2

description     “Get a getty on ttyS2″

start on stopped rc RUNLEVEL=[2345] and (
not-container or
container CONTAINER=lxc or
container CONTAINER=lxc-libvirt)

stop on runlevel [!2345]

respawn

# no one will auto login(不自动登陆)
exec /sbin/getty -L 115200 ttyS2

# auto login as root or latelee
#exec /sbin/getty -a root -L 115200 ttyS2
#exec /sbin/getty -a latelee -L 115200 ttyS2

2、修改内核启动参数

ubuntu说不能直接修改/boot/grub/grub.cfg文件(实际上我改过,也没什么事情),而是改/etc/default/grub文件,然后执行命令update-grub,即会自动更新grub.cfg文件。修改的地方有几个。

启动参数:

GRUB_CMDLINE_LINUX_DEFAULT=”console=tty0 console=ttyS0,115200n8″

配置串口控制台:

# Uncomment to disable graphical terminal (grub-pc only)
GRUB_TERMINAL=console

# my add
GRUB_SERIAL_COMMAND=”serial –speed=115200 –unit=0 –word=8 –parity=no –stop=1″

完整的文件如下:

# If you change this file, run ‘update-grub’ afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n ‘Simple configuration’

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
#GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
# this is for vga text
#GRUB_CMDLINE_LINUX_DEFAULT=”quiet text”
#GRUB_CMDLINE_LINUX=””

# my serial console
GRUB_CMDLINE_LINUX_DEFAULT=”consol=tty0 console=ttyS2,115200n8″
GRUB_CMDLINE_LINUX=””
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD …)
#GRUB_BADRAM=”0x01234567,0xfefefefe,0x89abcdef,0xefefefef”

# Uncomment to disable graphical terminal (grub-pc only)
GRUB_TERMINAL=console

# my add
GRUB_SERIAL_COMMAND=”serial –speed=115200 –unit=0 –word=8 –parity=no –stop=1″

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo’
#GRUB_GFXMODE=640×480

# Uncomment if you don’t want GRUB to pass “root=UUID=xxx” parameter to Linux
GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY=”true”

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE=”480 440 1″

说明:

GRUB_DISABLE_LINUX_UUI是指在指定根分区时,不使用该分区的UUID,而是直接用如/dev/sda2的格式。

3、更新grub

直接执行命令update-grub即可
修改后的grub.cfg文件如下:
menuentry ‘Ubuntu’ –class ubuntu –class gnu-linux –class gnu –class os $menuentry_id_option ‘gnulinux-simple-e5b19d4d-199f-4426-bab9-0b0c02b54317′ {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root=’hd0,msdos1′
if [ x$feature_platform_search_hint = xy ]; then
search –no-floppy –fs-uuid –set=root –hint-bios=hd0,msdos1 –hint-efi=hd0,msdos1 –hint-baremetal=ahci0,msdos1  a5c5a770-5bae-453c-a888-f83781fcaa1f
else
search –no-floppy –fs-uuid –set=root a5c5a770-5bae-453c-a888-f83781fcaa1f
fi
linux   /vmlinuz-3.13.0-32-generic root=/dev/sda1 ro  console=tty0 console=ttyS2,115200n8
initrd  /initrd.img-3.13.0-32-generic

可以看到,内核启动参数已经配置成功。
另外,为了防止系统挂掉,可以运行update-grub后再手动改/boot/grub/grub.cfg文件,不要所有的启动项都是串口控制台,实际上有恢复模式可选,不改也行。我是把Advanced options for Ubuntu里面的配置改回原来的。

重新启动系统,查看启动参数

# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.13.0-32-generic root=/dev/sda1 ro console=tty0 console=ttyS2,115200n8

# who
latelee ttyS2

存疑:上面的grub配置,有2个console,分别是tty0和ttyS2,它们不匹配,但启动后也没什么问题,看到的终端还是ttyS2,不知道是什么原因。估计和启动参数的tty0关系不大,主要看ttyS2.conf配置。

说明:如果还是接有显示器,显示器依然有输出,Alt+Ctrl+1还是tty1,Alt+Ctrl+2还是tty2,原来是什么样子,还是什么样子。

遗留问题:串口控制台只能显示24×80(用secureCRT测试所得),有些命令太长则会回滚到一行的开始,虽然也是成功的,但影响了信息的提示,目前还不知道怎么改,在哪里改。

参考资料:

李迟,发表于2014年10月22日中午休息前

 

]]>
/using-gnu-linux/linux-cosole-redirect-serialport.html/feed 0