2013年度总结

原本打算写个2013年的总结,然后顺带再写一个2014年的展望的,但是回头看了看博客里写的2013年的展望,让自己不禁又开始鄙视自己,写的是挺好的,但是为什么技术上的东西基本上没有去实现,2013到底是怎么去虚度了呢,感觉时间是过的飞快,工作上是一只那么忙忙碌碌,但是计划想要去做的事情却一点眉目都没有,这也许就是一贯以来的拖延症吧。

以前很讨厌做计划,做规划,原因就是变化太多,变化太大,自己无法坚持在某一件事情上很长时间,遇到困难都有退缩的心理,真的缺少不积跬步无以致千里,不积小流无以成江海的气魄,也许这也是到现在工作了5年半依旧按部就班,感觉自己碌碌无为的原因吧。

虽然已经连2013年的大年都已经过去了,但是逼迫自己对过去的2013年再做一个总结,所谓的聊胜于无吧。

生活上

  1. 儿子度过了一岁的生日,一路走来奶奶吃了不少苦头,每天带着儿子和我们在杭州飘着,虽然吃喝不愁,但是也着实是有些无聊,偶尔我们放假才能让奶奶出去玩玩麻将过过瘾。儿子在这一年里也没有什么大病,拉肚子、发烧、感冒这之类的小毛病倒是不断,也着实让我们做爹妈的有些担忧,但是还好基本上儿子也都坚强的挺过来了。如今儿子也能简单的用短小的句子表达自己的想法了,偶尔还有一些很奇怪的搞笑的言论说出来,让大人捧腹。

  2. 还清了大约10.5万元的债务,当然这个算是超标完成了,日子没有过的太艰苦也没有过的太奢侈,用老婆的话来说就是,为了儿子她都把零食戒掉了,虽然说实际情况没那么夸张,但是的确是在这方面的开支缩减了不少,同时老婆买衣服鞋子等的支出也减少了一些。当然这个过程中,奶奶勤俭节约的生活习惯也帮我们节约了不少开支,奶奶一个人在家里吃饭菜都比较少去买,通常都是萝卜青菜,虽然多次劝说奶奶不要太过简朴,但是奶奶常常把欠债挂在嘴边,还是一如既往的勤俭。

  3. 老婆找到了一份她自己认为比较喜欢且适合自己的工作,SGS公司的外审员,经常在省内出差,老婆也不觉得累,经常很早起床去坐火车,然后比较晚才能从省内其他地方赶回家里,为的只是多和儿子玩几个小时,晚上回到家里和儿子玩过之后,儿子睡下,还要加班加点的完成公司工作,虽然安排写报告的日子可以在家里呆着,不用去公司也不用去外面出差,但是儿子在家通常都会带儿子玩,而不是写报告,然后晚上加班加点继续写报告,经常晚上不想写,第二题啊凌晨三四点起床写完报告然后又去出差。在我们看来多么累的一件事情,但是在和儿子一起玩耍和生活的过程中,这一切显得都不那么累。也同样是老婆的这份工作,使得原本计划的还债额度有了一些提升,至少是家里的开支基本上可以由老婆的收入来负担了,儿子的零食也基本上由老婆的收入包办了。

  4. 弟弟完婚了,弟弟也终于走上了婚姻的殿堂,虽然也同样是先上车后补票,但是值得庆幸的是,这样一来2014年就有一个侄儿/侄女出生了,儿子就有一个玩伴了。爸妈在经济上的压力也终于开始变小了,没有了我们两兄弟结婚这个事情的压力,爸妈开玩笑说只要能负担起自己的生活就没啥压力了。

  5. 老爸在工地上工作了又一个年头,买了一辆推土的工程车(东方红),这个东方红伴随了老爸一辈子,也推出了我们一家人的所有经济来源,在各自没有成家的年代里,全家的支出基本上指望老爸的东方红推土机。如今老爸也马上要60岁了,还要为了家里的开支常年在外奔忙,虽然一个月也有些收入,不是那么累,但是毕竟这么大年纪还在外面跑,而我们确自身难保,只能说是我们努力能给家里帮点就是一点吧。

工作上

这一年一直在做虚拟化的项目,代码写的少了,东西做的更杂了,从Linux到Windows平台,从C、Python到JAVA、FLEX基本上都有所涉及。

  1. 完成了虚拟机内应用高可靠的方案设计和部分功能实现,这个功能点是在讨论其他不相关的问题时候大家冒出来的新奇的想法,在虚拟化这个范畴之内这样玩,估计只有我们自己一家,目前的状态是没有彻底稳定,对于一些大型的应用,例如Oracle,暂时没法很完美的支撑,但是对于网站等小型的应用已经验证没有大碍。我主要负责前期方案讨论,以及实现了在windows下的磁盘缓存强制写入、磁盘卸载和挂载自动化、服务状态轮询以及服务启动停止,期间逆向了一个做类似的高可靠性方案的厂商的产品,当然最后基本上是自己按照自己的思路,借鉴人家的技术点,完成了这个功能。不过还是有一点小尾巴,就是稳定行还需要加强。
  2. 完成了桌面虚拟化的方案设计以及承担部分和虚拟机模板准备相关的工作,主要利用sysprep完成模板的准备,当然期间也通过逆向的方式分析了一下行业里做得比较好的厂商是如何实现的,最后发现过于复杂,没能真的了解实现机制和原理,不过桌面虚拟化功能的基本模型基本上有了,唯一缺的只是易用性的优化了。
  3. 完成了注册表重定向技术的技术预研,通过逆向、资料查找等方式,基本上找到了一些思路提供给其他组的同事去参考,当然最后的确也是起到了一定的作用,这个过程中自己按照逆向的结果,编写了一个简单的windows驱动,并且将驱动成功的在虚拟机中运行起来,加载了其他厂商的注册表重定向文件。
  4. 参与讨论了PVLAN功能的实现,和组内主要技术人员一起给出了一个PVLAN实现的原型,当然这个过程中对PVLAN的整个一个转发流程以及具体的细节性的内容有了比较深入的理解,给出了一个比较关键的分析结论,后续的实现机理是同事基于该基本原型来进行改进之后得出的最终实现机制,也算是一个比较有成就感的东西吧。
  5. 去了趟哈尔滨出差,交流虚拟化的相关技术问题,深刻的感受到自己在一些背景知识方面还需要加强,对虚拟化本身的技术了解是基本上够了,但是一些实施或者方案前期需要准备的东西等的了解还是非常欠缺,以至于自己公司的市场部同时都不能有效的给他们打消疑虑,当然最后这个项目估计也是由于各方面原因搁置起来了。

SCSI-3 Persist Reservation命令

SCSI-3 PR,SCSI-3 Persist Reservation是微软的Windows 2008 Failover Cluster验证中的一个重要环节,最近在工作中遇到了这个问题,通过物理主机将LUN直接透传到虚拟机中进行集群的尝试,但是发现怎么验证通不过,查了很多资料,最后说可能是SCSI-3 PR命令不支持。

下面就利用sg3_utils简单的做一些相关的操作尝试吧
注意: 需要先行在Linux安装sg3_utils,有相关的windows版本,地址自行搜索吧

获取设备所有的registrant keys
#sg_persist -i -k -d /dev/sdd

查询设备所有的reservations信息
#sg_persist -i -r -d /dev/sdd

注册
#sg_persist -o -G -S 123abc /dev/sdd

清除所有的已注册
#sg_persist -C -K 123abc -o -d /dev/sdd

reserve
#sg_persist -o -R -K 123abc -T 5 -d /dev/sdd

release
#sg_persist -o -L -K 123abc -T 5 -d /dev/sdd

常用reservation类型:
5 – Write Exclusive, registrants only
6 – Exclusive Access, registrants only

2013年的技术、生活展望

2012年过去了,2012年写的展望中除了Android这个东东我去实现了,其他的貌似基本上都没实现哦 2012年技术上的四个目标 ,Android的确做了一个项目,算是一个好的地方吧,给自己小赚了一笔,但是的确把自己也折腾的够呛的,Node.JS版本的Scanner,基本上没怎么编辑过这个项目,虽然一直躺在github上。

Linux方面基本上除了给大家做了一两节课的培训,读了那本电子书的一些章节,然后和大家一起分享了读这些章节的内容学到的,也算是完成了一部分,最终的结果是的确了解了线程、进程的初步的知识,但是不得不说,这本书的确还是没有啃透啊。

Hadoop嘛,没有折腾过吧,算是一个遗憾吧,也不太想去看他了,毕竟不一定能用,用得着的时候再说吧,从目前的迹象上来看基本上不会有涉及到这方面的知识。

无论如何,还是要写一下2013年的一些期望吧,虽然项目有点多,但是希望能坚持完成50%左右的内容项吧,不要虚度就好。

管理方向

  • 项目管理

    阅读项目管理方面的书籍,目前只是有想法,具体看哪些方面的资料或者书籍,有待继续思考。

  • 时间管理

    按照以前读过的《把时间当作朋友》中提到的一些内容进行一些实际的操作,将自己的时间管理起来,提升工作效率

技术方向

  • 关注大数据研究方向

    这个方向也算是一个可以去了解,可以去研究的东西吧,但是毕竟没有环境去做一些实验和研究,所以也许没啥大的进展。先写在这里好了。

  • 基础数据结构知识(数据结构、算法导论)

    可以说自从毕业以来一直逃避这个方面的东西,自己对数据结构一直觉得自己在这方面不是很擅长,如果一直这样,那永远也不会熟悉,所以补习补习吧,结合两本书呗:《数据结构(C语言版)》以及《算法导论 4》。 具体要求就是能利用C语言写一些常见数据结构的实现,如果可以最好更新到博客中。

  • Android

    继续关注Android方面的开发知识的积累吧,将大体的框架有一个基本的了解,多关注界面方面的使用和设计

  • Node.JS

    本来打算完成一个Node.JS版本的Scanner的,但是发现写了不到两次,遇到不少问题,2013年如果不想做Scanner就算了,至少把会议室管理系统做完吧,也算是给自己的一个交代,了解Node.JS常见的一些使用方法,异步编程到底如何改变

  • NoSql MonogoDB

    NoSql也算是了解过一点吧,用过MonogoDB,但是很粗浅,最好是结合Node.JS进行一个深入的了解和熟悉,将Node.JS和MonogoDB结合起来做一些在公司内部可以玩起来的小东西吧。

MakeMoney

  • 存钱还钱

    还清借款,2013年至少还清8W吧,虽然有点难度

  • 开源节流

    思路开阔,多看看别人做了哪些事情吧


写在最后,微博: @TimonWang, Twitter:@TimonWang

2012年终总结

2012年终总结

2012,传说中的世界末日,趁着还没到世界末日那天,再对我这一年以来的生活和工作做一个简单的总结吧。
生活上

  1. 儿子出生了
  2. 小豆豆的出生可以说是2012年对我来说最重要的一件事情,感触也是最深的,因为怀孕的时候就查出来可能有一定的溶血的概率,所以一直到出生之前老婆一直坚持在服用中药,控制ABO溶血。豆豆快要出生的前两周老婆回家去待产了,我是提前了一周左右回家陪老婆待产,那段时间也算是我工作以来最最放松的一小段时间,每天在家里陪老婆,玩玩ipad游戏,吃完饭陪老婆出门散散步,晚上看看电视早早的就休息了。豆豆出生前以前,陪老婆去三姐家里吃饭,回家的路上,原本20分钟不用的路程足足走了接近一个小时,老婆走走停停,肚子疼得要命,我在一边上干着急看着老婆疼,走到家里之后老婆休息了一会才缓过来。晚上看电视看到10点左右,在床上玩了一会ipad上的游戏打豆豆,准备说要睡的时候,老婆突然说好像见红了,于是乎就赶紧叫老妈叫车送我们去岳阳的医院,晚上匆匆忙忙的叫了表哥的车子送我们到妇幼,才发现住院单没有给我们开,又折腾回家去拿住院单。好不容易办好了入院手续,老婆肚子一直疼,没法睡觉,老婆让我陪着一直在走廊上走动,走了半个晚上,早上才说是准备生,过程各种惊心动魄啊,宫口一直开的达不到要求,在产房里都开始吸氧,打生理盐水了,一直折腾到8点多,还是不行,羊水破了之后发现羊水有点偏黄绿色,属于羊水三度污染,说是可能小孩缺氧了,准备剖腹才可以,想想老婆都已经疼了8、9个小时了,这个时候再挨一刀多痛苦啊,于是乎和医生商量还继续尝试半个小时,如果半个小时之内还没有生出来就决定剖腹了,因为医院有熟人,我也被允许到产房陪同待产,老婆满头大汗,我心里已经完全乱了,老婆各种痛苦的叫喊,疼痛到蹲在地上,半个小时过去了还是没有任何动静,于是决定剖腹。很快被推进了手术室,10点半左右推进手术室,11点08分左右儿子抱出来了,被告知得送到新生儿科观察。一颗悬着的心才算落地了。豆豆在新生儿科待了5天,我和老婆在医院的前五天基本上在挤奶中度过,为了挤掉奶水,让儿子出院后有奶可吃,晚上通常两个人两点钟坐在床边挤奶挤一两个小时,然后白天基本上不停歇的挤奶,那一个周,累的人都快趴下了。儿子出院那一刻,高兴坏了,那种心情不亚于儿子被抱
    出手术室的那一刻。

  3. 老爸骑摩托车被的士撞了,住院一个多月
  4. 在豆豆出生前的10天左右时间里,老爸骑摩托车被的士撞了,头上缝了10针,腿上淤血充满了整个大腿,在医院里躺了一个月,因此错过了豆豆的出生,在豆豆两周多的时候爸爸赶回家参加了豆豆的满月庆典,也错过了姐夫动手术的时间。

  5. 二姐夫做了个换肾手术,恢复挺快的
  6. 二姐夫在这一年里终于联系到了肾源,换了一个肾,那是豆豆出生大概14天的时候,我恰好在家,看着姐夫从手术室里推出来的那一瞬间,真有点想感谢上帝的感觉,感觉姐夫获得了新生,应该说的确是新生,接下来就盼望着一切顺利,姐夫早日能扛住排斥反应。姐夫在后来的恢复过程中也出过一些小状况,感冒什么的,巨额的话费全部都压在姐夫老爸的身上,也把姐夫的老爸累的够呛的,每天晚上一两点出门,每日每夜的买猪,宰猪,总算把手术费和后续的保养费用扛住了。

  7. 两个哥们在这一年(2012.01.01-2012.12.30)结婚了,且都怀上了宝宝
  8. 涛哥和毛哥都结婚了,也都有了小宝宝,明年应该就出生了。实际上涛哥是年前结婚的,不过那也算是2012年了吧,毛哥十一结婚的,特地跑回家去参加了毛哥的婚礼,说实在的我是害怕孤单的人,我害怕没有这几个哥们,我一个人真的就是除了有几个亲人,没有几个铁的哥们了。

  9. 陪老爸游了杭州
  10. 老爸一直以来都在忙碌着为了我们兄弟姐妹五个的学费,生活费,我们毕业了又行情不好,赚钱赚不了那么多了,家里的生活开支还是挺大的,老爸56、7的人了还在工地上做监工,说来很是惭愧。自从豆豆接到杭州之后,老爸想念孙子的情绪就从来没有消退过,说等有时间一定过杭州来看看孙子,工地的活验收过了之后,好不容易有时间能到杭州看看孙子,结果有有变故,本来十一打算过杭州看看的,结果拖到了十月中下旬。到杭州之后,抱着孙子玩,特别的开心,也让我萌生了回长沙发展算了,钱虽然赚的不比杭州多,但是至少和亲人的距离近了,爸妈也可以经常看看孩子。爸爸不容易来一趟杭州,于是我特意请了两天假,陪老爸老妈带着儿子老婆在西湖景区和灵隐寺景区玩了一圈,老爸当然也很开心。回去之后在QQ空间里写了游玩杭州的一首小诗,当然后来还有一首表达自己想念孙子的情绪的小诗。

  11. 妈妈到杭州和老婆一起带儿子
  12. 原本打算老婆产假休完之后就带着儿子到杭州继续上班,妈妈帮我们带儿子的,结果老婆公司让老婆从调岗(一个比较吃力,比较累的岗位)和协商离职里选一条路,老婆本来就像做生意的,于是就商量了一下决定直接协商离职了,准备做生意。当然最后生意是没做起来,于是老婆和妈妈就全心全意的在家里带儿子了。

工作上

  1. 开始了一个叫做xWare的虚拟化项目,进入了虚拟化的这个新领域
  2. 以前学的Flex、java相关的知识终于又开始实践了,这个项目听起来很有挑战,至少有一部分东西我可以大展拳脚,做一些架构设计方面的事情了,当然后来证明也不是那么如愿,需要的背景知识太多太多,需要学习的东西也太多太多。

  3. 三个项目同时开始参与,漏扫和WebSheild项目组要做项目进度跟踪和任务安排
  4. 这个是一直以来的事情,这一年基本上每周三个周会,基本上周一都要开会开到 9:30 以后才能回家,当然也发现自己在表达方面的确是比以前要好很多了,我也会鼓舞鼓舞大家的士气,让大家能有一点气氛,也算是团队建设的一个小部分吧。

  5. 对于xWare虚拟化网络和接口相关的内容进行重构设计
  6. 这个重构设计是在儿子出生之前完成的,方案讨论到结构重构设计,到数据库表结构的确认,到回去陪老婆待产前一天刚好完成,实现就交给了另外两个同事来完成,当然后又进来了两个新同事,给力的一起做xWare。

  7. 在xWare项目中花了一个月时间对Libvirt的大体结构上的代码有了一个简单的掌握和理解
  8. 这个是所谓的工欲善其事必先利其器,对虚拟化里的这个东西的了解和理解如果没有,那么如何管理虚拟机,如何管理网络是比较难以成型的,于是整个项目组花了大概一个月的时间才完成对这个东西的代码阅读和交流,当然这让我们几个“java开发人员”对C也有了一定的了解,对Libvirt库也有了更深入的了解。

  9. 对JNA封装和调用底层的C Lib进行了一个了解
  10. 项目中使用JNA做了一个管理库的Binding操作,于是乎对这个JNA技术又进行了比较全面的掌握,虽然最后碰到了不少问题,但也都基本上有了解决方案。

  11. 对存储有了一个基本的概念
  12. 花了一两个月的时间对存储的基本概念,以及在数据中心中的常见部署结构和部署方式进行了了解和掌握,至少对存储有了一个入门级别的了解。

  13. 对Redhat和Citrix服务器虚拟化以及Citrix的桌面虚拟化的基本部署和简单的结构进行了了解
  14. 这个算是竞争对手分析吧,实际上不是竞争对手,我们目前做的还是了解服务器虚拟化和桌面虚拟化究竟有哪些具体的内容,我们的产品又需要完成那些功能,才算是基本功能完备。这个过程中大量的环境搭建,对Redhat和Cirtix的虚拟化的基本功能,以及大体的实现做了一个了解。当然为了某个原理和方案的讨论和主管经理还拌了两次嘴,也算是自己还不成熟的表现吧。

Citrix XenDesktop License Server 卸载后无法再次安装的问题

最近测试Citrix XenDesktop的基本功能,在一台Windows2008 R2的机器上安装了XenDesktop的组件,包含了一个Citrix License组件,安装完成之后使用正常。结果在网站上申请了一个使用License,导入之后,License服务直接宕机了,启动都报错,各种尝试都没有效果,还尝试过删掉原有服务重新安装,结果呢还是搞不定。
仔细看了一下Licnese文件,原来使用浏览器下载的时候出现故障,页面中包含了大量HTML的代码,所以在导入的时候出错是必然的,可是为什么引起删掉重装服务还是出错呢?看了一下存放路劲,发现原来不管你是否重新安装,那个存放License的目录不会被删掉,所以那个错误的文件一直在里头,重装之后启动服务还是再次加载那个错误的文件,最终就会导致这个错误出现从而使License服务无法启动。
如何解决呢?很简单的,删除最后导入出错的那个License,重启一下License服务就搞定了。

附:
Citrix XenDesktop License组件的默认管理密码是 域名当前服务器与帐号 密码当然就是该服务器的域帐号的密码,例如我这里的域是zch.com,在登录的时候显示域名为ZCH,那么我的登录用户名和密码就是ZCHadmin password

QEMU/KVM查看虚拟机系统注册表

在QEMU/KVM的虚拟化环境中,如果想要操作Windows虚拟机的注册表,原来的理解是不可以的,最近查资料发现其实有工具可以做到的。

libguestfs-tools套件提供了一个基于QEMU的磁盘映像去查找这个磁盘映像中安装的Windows操作系统的具体注册表信息,甚至是进行改动(当然不安全,目前可能不成熟,可能损坏映像文件)。

这个套件目前我只在centos和redhat的虚拟化环境中找到了,具体安装方法很简单:

yum install libguestfs libguestfs-tools libguestfs-winsupport

安装完成之后,使用virt-win-reg既可以对已经安装操作系统的虚拟机映像文件进行注册表的读取操作,不过要注意的是目前只推荐在虚拟机停止状态下获取注册表的信息,如果在启动模式下获取注册表或者修改注册表信息都可能导致虚拟机映像文件损坏。

具体使用方法如下:

virt-win-reg win9-clone 'HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionUninstall'

其中win9-clone是虚拟机的名字,可以通过libvirt的virsh list –all命令查询得出,不过一定确保虚拟机已经是停止的状态,否则可能造成磁盘损坏

上面的命令最终执行的结果如下:

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall]

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallAddressBook]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallBranding]
"QuietUninstallString"=hex(1):52,00,75,00,6e,00,64,00,6c,00,6c,00,33,00,32,00,20,00,49,00,65,00,64,00,6b,00,43,00,53,00,33,00,32,00,2e,00,64,00,6c,00,6c,00,2c,00,42,00,72,00,61,00,6e,00,64,00,43,00,6c,00,65,00,61,00,6e,00,49,00,6e,00,73,00,74,00,61,00,6c,00,6c,00,53,00,74,00,75,00,62,00,73,00,00,00
"RequiresIESysFile"=hex(1):31,00,30,00,30,00,2e,00,30,00,00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallConnection Manager]
"SystemComponent"=dword:00000001

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallDXM_Runtime]

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallDirectAnimation]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallDirectDrawEx]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallFontcore]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallICW]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallIE40]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallIE4Data]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallIE5BAKEX]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallIEData]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallMPlayer2]

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallMobileOptionPack]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallNetMeeting]
"RequiresIESysFile"=hex(1):34,00,2e,00,37,00,31,00,00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallOutlookExpress]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallPCHealth]
"QuietUninstallString"=hex(1):72,00,75,00,6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,73,00,65,00,74,00,75,00,70,00,61,00,70,00,69,00,2e,00,64,00,6c,00,6c,00,2c,00,49,00,6e,00,73,00,74,00,61,00,6c,00,6c,00,48,00,69,00,6e,00,66,00,53,00,65,00,63,00,74,00,69,00,6f,00,6e,00,20,00,44,00,65,00,66,00,61,00,75,00,6c,00,74,00,55,00,6e,00,69,00,6e,00,73,00,74,00,61,00,6c,00,6c,00,20,00,31,00,33,00,32,00,20,00,43,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00,57,00,53,00,5c,00,49,00,4e,00,46,00,5c,00,50,00,43,00,48,00,65,00,61,00,6c,00,74,00,68,00,2e,00,69,00,6e,00,66,00,00,00
"UninstallString"=hex(1):72,00,75,00,6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,73,00,65,00,74,00,75,00,70,00,61,00,70,00,69,00,2e,00,64,00,6c,00,6c,00,2c,00,49,00,6e,00,73,00,74,00,61,00,6c,00,6c,00,48,00,69,00,6e,00,66,00,53,00,65,00,63,00,74,00,69,00,6f,00,6e,00,20,00,44,00,65,00,66,00,61,00,75,00,6c,00,74,00,55,00,6e,00,69,00,6e,00,73,00,74,00,61,00,6c,00,6c,00,20,00,31,00,33,00,32,00,20,00,43,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00,57,00,53,00,5c,00,49,00,4e,00,46,00,5c,00,50,00,43,00,48,00,65,00,61,00,6c,00,74,00,68,00,2e,00,69,00,6e,00,66,00,00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallSchedulingAgent]
@=hex(1):00,00

该命令的其他用法可以使用man virt-win-reg获取相关帮助信息,用法还是很多的哦

kvm可用存储类型简介

KVM的可选存储项中,包含三种:虚拟磁盘文件,基于文件系统的存储,以及基于设备的存储。

虚拟磁盘文件
可以使用LVM(Logical Volume Manager)创建存储池来管理KVM的存储,创建一个KVM的虚拟机的时候,默认使用虚拟磁盘文件作为后端存储。如果使用这种类型的配置,虚拟机可见到的是一块实际的硬盘,但实际上使用的是一个虚拟磁盘文件所表示的一个硬盘。这里包含了一层额外的文件系统层,而且这一层文件系统层也会导致系统变慢。

当然,虚拟磁盘文件也有它的好处,虚拟磁盘文件很容易就能被其他的KVM虚拟机使用,但是如果你想优化KVM的虚拟化性能,还是需要考虑其他的KVM存储。

基于文件系统的存储
部署KVM主机的时候,你可以选择文件系统目录(dir)或者格式化的块设备(fs)作为KVM的存储。默认是使用dir,KVM会在选择的本地文件系统目录中创建磁盘映像文件。

如果使用fs选项,需要提供存储磁盘映像文件的格式化文件系统的名字。此选项和目录类型的存储最大的区别在于,格式化磁盘映像没有挂载在一个指定的路径下。

使用上述的任意一个选项,都可以使用本地文件系统或者在物理上是基于SAN的文件系统。相比于SAN,本地存储期铜不会同时被多个主机并发的访问。

另外一种基于文件的磁盘存储方式是netfs,只需要你提供一个网络文件系统的名字即可,比如说挂载的Samba文件系统。使用这个方式作为KVM的存储是比较方便的,因为这中方式能比较方便的从另外一台服务器上去访问,同样也允许你在多台主机上去访问同一个磁盘文件。

上述的各种类型的基于文件系统的KVM存储方式都存在一些缺点:文件系统。由于KVM的虚拟机对于硬盘的操作都不是直接写入到KVM的存储介质,而是在宿主主机上的文件系统。这就意味这访问文件系统的时候都需要经过一个不必要经过的中间访问层,这通常会降低性能。

所以,如果想要追求KVM虚拟化的性能,基于设备的存储可能是更好的选择。

基于设备的存储
另一种方式是使用基于设备的存储。有四种方式可以提供此类型的物理存储设备访问:disk、iSCSI、SCSI以及logical。disk允许你直接对磁盘进行读写。iSCSI和SCSI方式提供了一种替代和原有方案具有可比性的方式对磁盘进行访问。这种类型的KVM存储方式的好处在于:你可以使用持久化的命名而不依赖于宿主主机发现设备的顺序。

这些访问磁盘的方式也存在缺点:不灵活,比较僵化。如果使用此种类型的存储,那么基本上没有办法修改虚拟磁盘的大小,或者针对虚拟机进行快照功能。

LVM(Logical Volume Manager)是KVM存储方式中,提升灵活性的最佳方式。一个好处是LVM允许你使用快照功能,另外一个好处是只能作为KVM虚拟化的一个部分,否则无法使用。

LVM允许将存储放置到一个存储卷组中,基于存储卷组,可以很容易的创建一个逻辑的卷。卷组是抽象的物理磁盘设备,所以当你的可用磁盘空间不足的时候,你可以新添加一个设备到卷组中,这个操作实际上增加了可用的直接存储空间到逻辑卷。使用LVM使得设备空间分配更灵活,同时也使得更容易的添加和删除存储。

最后LVM能比较好的工作在单机场景和多主机场景中。如果需要多主机同时访问,你只需要基于SAN创建逻辑的卷即可。如果你使用LVM集群,你可以很容易的配置所有的主机同时访问逻辑卷。

KVM存储池的使用
为了方便KVM存储的管理,可以创建存储池。在主机层次创建存储池可以更容易的访问KVM存储设备。使用KVM存储池也可以将实现预备好的存储管理器来,以供访问。这种策略在大型环境中非常有用,因为存储管理员通常和虚拟机管理员不是同一个人,所以在创建虚拟机前创建一个KVM存储池是一个不错的选择。

当深入KVM虚拟化之后,在主机级别配置一个KVM存储池,并在池中提供LVM逻辑卷。

翻译自:http://searchservervirtualization.techtarget.com/tip/Keeping-up-with-the-KVM-storage-options
转载请注明出处:http://www.nohouse.net

解决Tomcat中应用调用Libvirt库进行控制时可能导致线程卡死问题

最近的项目中有用到libvirt的java包进行libvirt的远程命令调用,进行kvm的管理。我们的测试人员一个偶然的机会下测试出来,在控制连接状态的时候,可能存在一个严重的bug,由于界面上的flex应用在每次点击虚拟机节点的时候,会导致对后台的remote service进行大约3-4次的调用,而这些remote service中会利用libvirt的结构进行结果的获取,我们为了提高效率,将libvirt的链接进行了保持,而不是每次都进行重连,以减少性能的损耗。

存在这样的情况,当网络正常的时候,建立起来的connection,一直在内存中驻留,此时如果拔掉网线,这个链接也不会断开,由于内存中这个connection的值也不为空,无法判断链接是否断开,所以在此点击界面的时候,一点调用了libvirt的接口,就会一直卡住界面多点击几次后,tomcat的所有可服务线程就都卡住了,导致整个界面无法使用。

解决方法为:启动一个线程由于实时的检测主机的断开连接状态,当状态不正常的时候,在获取connection的方法中直接抛出异常,阻止后续的逻辑的执行。但是这样只能解决状态问题,不能解决在这个状态获取的间隙中的界面点击问题,查找到资料发现tomcat的线程池模型也许可以帮忙,于是将线程池用上了,测试过后,终于发现可以了。

据说tomcat7可以检测哪个线程被卡死了,但是由于条件显示没有将产品中的tomcat6环境升级为tomcat7,所以这个也就不可用了。

具体修改方法:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/&gt
取消掉这段的注释,然后可以修改maxThreads和minSpareThreads两个参数为你想要的值,maxThreads比较简单允许的最多线程数
通常150应该足够了,后面的这个参数呢,表示最小的驻留服务线程数,也就是说这些线程会一直等待服务。

<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
      connectionTimeout="20000" maxTreads="500" minSpareThreads="30" maxSpareThreads="50"
      URIEncoding="UTF-8" keepAliveTimeout="15000"
      redirectPort="8443" />

修改Connector节点,增加executor="tomcatThreadPool",maxThreads,minSpareThreads,maxSpareThreads,keepAliveTimeout等参数的配置
这样就基本上解决了问题,参数具体含义呢,其中两个和上面提到的意义是一样的,executor表示对上面的那个Executor节点的引用,所有这个配置的线程都会在那个池中。
keepAliveTimeout表示每个线程能被卡住的最长时间,也就是能存活的最长时间。

有了上述修改后,我们的tomcat就再也不会被libvirt线程卡住了,一旦卡住,也只是15秒的一个线程,除非能同时请求操过500个线程,否则tomcat都能正常的提供服务了,只是上述参数没经过调优,性能各方面都没有测试,只是临时解决,具体数值的大小,还是需要按照实际情况,经过多组数据的测试对比后然后确定一个值。

通过mysqladmin远程管理mysql

在一些特殊场景下,想要远程重启mysql,以便让某些修改能及时的生效,但是mysql并没有提供远程重启的功能,唯一能做的就是远程关闭mysql服务。

在本地安装mysql的服务端,打开cmd,cd到mysql安装目录下的bin目录,bin目录中可以看到多个可执行文件,其中mysqladmin就是可以用于远程关闭mysql服务的。

mysqladmin的参数如下:

mysqladmin Ver 8.42 Distrib 5.5.2-m2, for Win32 on ia32
Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Administration program for the mysqld daemon.
Usage: mysqladmin [OPTIONS] command command….
-c, –count=# Number of iterations to make. This works with -i
(–sleep) only.
–debug-check Check memory and open file usage at exit .
–debug-info Print some debug info at exit.
-f, –force Don’t ask for confirmation on drop database; with
multiple commands, continue even if an error occurs.
-C, –compress Use compression in server/client protocol.
–character-sets-dir=name
Directory where character sets are.
–default-character-set=name
Set the default character set.
-?, –help Display this help and exit.
-h, –host=name Connect to host.
-b, –no-beep Turn off beep on error.
-p, –password[=name]
Password to use when connecting to server. If password is
not given it’s asked from the tty.
-W, –pipe Use named pipes to connect to server.
-P, –port=# Port number to use for connection or 0 for default to, in
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/services, built-in default (3306).
–protocol=name The protocol of connection (tcp,socket,pipe,memory).
-r, –relative Show difference between current and previous values when
used with -i. Currently works only with extended-status.
-O, –set-variable=name
Change the value of a variable. Please note that this
option is deprecated; you can set variables directly with
–variable-name=value.
–shared-memory-base-name=name
Base name of shared memory.
-s, –silent Silently exit if one can’t connect to server.
-S, –socket=name Socket file to use for connection.
-i, –sleep=# Execute commands again and again with a sleep between.
–ssl Enable SSL for connection (automatically enabled with
other flags). Disable with –skip-ssl.
–ssl-ca=name CA file in PEM format (check OpenSSL docs, implies
–ssl).
–ssl-capath=name CA directory (check OpenSSL docs, implies –ssl).
–ssl-cert=name X509 cert in PEM format (implies –ssl).
–ssl-cipher=name SSL cipher to use (implies –ssl).
–ssl-key=name X509 key in PEM format (implies –ssl).
–ssl-verify-server-cert
Verify server’s “Common Name” in its cert against
hostname used when connecting. This option is disabled by
default.
-u, –user=name User for login if not current user.
-v, –verbose Write more information.
-V, –version Output version information and exit.
-E, –vertical Print output vertically. Is similar to –relative, but
prints output vertically.
-w, –wait[=#] Wait and retry if connection is down.
–connect_timeout=#
–shutdown_timeout=#

Variables (–variable-name=value)
and boolean options {FALSE|TRUE} Value (after reading options)
——————————— —————————–
count 0
debug-check FALSE
debug-info FALSE
force FALSE
compress FALSE
character-sets-dir (No default value)
default-character-set auto
host (No default value)
no-beep FALSE
port 3306
relative FALSE
shared-memory-base-name (No default value)
socket (No default value)
sleep 0
ssl FALSE
ssl-ca (No default value)
ssl-capath (No default value)
ssl-cert (No default value)
ssl-cipher (No default value)
ssl-key (No default value)
ssl-verify-server-cert FALSE
user (No default value)
verbose FALSE
vertical FALSE
connect_timeout 43200
shutdown_timeout 3600

Default options are read from the following files in the given order:
C:WINDOWSmy.ini C:WINDOWSmy.cnf C:my.ini C:my.cnf F:MySQLmy.ini F:MySQLmy.cnf
The following groups are read: mysqladmin client
The following options may be given as the first argument:
–print-defaults Print the program argument list and exit
–no-defaults Don’t read default options from any options file
–defaults-file=# Only read default options from the given file #
–defaults-extra-file=# Read this file after the global files are read

Where command is a one or more of: (Commands may be shortened)
create databasename Create a new database
debug Instruct server to write debug information to log
drop databasename Delete a database and all its tables
extended-status Gives an extended status message from the server
flush-hosts Flush all cached hosts
flush-logs Flush all logs
flush-status Clear status variables
flush-tables Flush all tables
flush-threads Flush the thread cache
flush-privileges Reload grant tables (same as reload)
kill id,id,… Kill mysql threads
password new-password Change old password to new-password, MySQL 4.1 hashing.
old-password new-password Change old password to new-password in old format.

ping Check if mysqld is alive
processlist Show list of active threads in server
reload Reload grant tables
refresh Flush all tables and close and open logfiles
shutdown Take server down
status Gives a short status message from the server
start-slave Start slave
stop-slave Stop slave
variables Prints variables available
version Get version info from server

这里我们只需要其中的-h 参数指定远端主机,-u指定远端登录用户,-p指定需要使用密码认证 最后的命令部分,使用shutdown即可
完整命令如下:
mysqladmin -h10.101.0.1 -uroot -p123456 shutdown

当然同理,可以远程执行ping processlist reload refresh shutdown status start-slave stop-slave variables version等命令

Table '%s' is marked as crashed and last (automatic) repair failed修复方案

Table ‘%s’ is marked as crashed and last (automatic) repair failed

错误编号:144
问题分析:
数据表损坏造成的。
解决方法:
1、通过论坛的 tool 工具进行修复
下载地址和使用说明见:http://www.discuz.net/thread-982699-1-1.html
2、myisamchk 修复
myisamchk 命令的格式如下:
1)myisamchk –recover tbl_name
2)myisamchk –recover /path/tbl_name
这种方法要指定数据表在磁盘上的位置。
3、使用 phpMyAdmin 修复数据的方法
进入论坛数据库,然后选择要修复的表,在页脚下拉框选择“修复”即可。
注意:如果需要修复数据库,修复前一定要做好备份。

转自:http://faq.comsenz.com/viewnews-152