chrome批量/自动化安装扩展:External Extensions

如果需要在某网络中大面积部署一个扩展,除了通知所有chrome用户手动安装以外,Chrome提供了一个“External Extensions”的概念,可以方便的实现。

应用场景:

1. 跟桌面应用捆绑的扩展:例如Evernote有个Chrome扩展,可以实现安装Evernote时同时为Chrome安装这个扩展;

2. 网络管理员为内网中所有机器预装某个扩展。

Chrome官方文档中对External Extensions的描述:http://developer.chrome.com/extensions/external_extensions

大致原理:

在Chrome配置中填入对扩展的描述,在windows中是修改注册表,在Mac/Linux中是Chrome数据目录中的文件;

Mac/Linux下的描述文件类似这样的json:
{
  "external_update_url": "http://myhost.com/mytestextension/updates.xml",
  "supported_locales": [ "en", "fr", "de" ]
}
其中supported_locales用来指定为哪些locale(语言环境)的Chrome安装这个扩展。
Windows中的情况类似,只是把json的字段以注册表的形式记录。

扩展保存在哪

两个位置:
1. 本地磁盘上的.crx文件
2. 放在服务器上的url(并且对Windows只能使用WebStore里的url,官方有描述)

本文只简单介绍,没有深究细节,需要的去看文档吧,里面还有FAQ比较贴心。

让人欢喜让我忧的phantomjs

大名鼎鼎的phantomjs,目前开源社区里唯一一个无界面浏览器(headless browser),其他的还可以搜到的一些类似项目要么是他的各种绑定版,要么也是基于QtWebkit,在功能上没什么区别。

<占位:这里应该列出类似的项目>

说是让人欢喜,因为曾经听说过它的人,都以为找到了万能法宝,可以用程序控制,可以抓取页面,提取信息,截图……无所不能。甚至接到相关需求的时候,就因为知道phantomjs的存在 还会莫名其妙的小激动(“无所不能”!)

可是,真正到项目中应用……

让我痛苦了两个多月的phantomjs,我来总结一些经验:

正文:

首先说明我对它的期望

像普通浏览器一样访问任意网页;
可以方便的操作dom结构;
可以检查任意域下的js运行环境;
可以截图;
可以查看所有的网络请求;
可以完全控制行为(打开和关闭页面,调整窗口大小,滚动条,鼠标,甚至修改请求内容);
还有,最好能方便与Nodejs配合;

以上可能代表大多数人对phantomjs的第一印象,但是……

1. 基本实现,但 不支持flash,某些网页莫名其妙加载失败(目前没找到规律)
2. 只能通过page.evaluate()的方式在页面中执行一段js,然后返回结果<有坑>
3. 只能用switchToFrame()切换到指定frame中,用page.evalute()实现
4. 比较完美,二进制截图只能输出到本地文件,或者Base64字符串;只能整页输出,类似于打印,如果网页有浮窗,取不到分屏的效果;
5. 只能查看请求头信息,看不到response.body,也不能修改请求(受制于QtWebkit的Api)
6. 基本可用,但Api功能有限
7. 十分不方便

有力吐槽:

1. 运行不稳定,错误提示模糊:

碰到的第一个问题,莫名其妙的崩溃,错误提示像精神病一样不知道在说什么

2. webpage提供Api不够丰富,十分不方便:

因为他也只是QtWebkit的一个封装(半成品浏览器),我们为phantomjs写的程序,面对的是一堆page对象(类似于Chrome中标签的概念),page内部的BOM和DOM都无法直接在phantomjs程序中操作,只能page.evaluate()返回一个结果。

从page环境中返回信息只有两种途径:
page.evaluate():  只能同步返回数据,如果执行过程涉及异步操作,就无力了;
onCallback/onConsoleMessage: page环境中顶层window上有个callPhantom()可以触发这个onCallback,但是只有top上才有,iframe中没有

3. 在phantomjs中,没有一个root超级权限,跨越所有的的域限制。只能switchToChild/MainFrame()的方式切换到对应的iframe环境下再执行evaluate()。最让人无奈的是这几个方法接收的参数都是QtWebkit内部对frame的编号(可能是按照构建frame实例的顺序编号)跟Dom中的顺序不一致,所以需要费一点力气找到dom元素跟frame的对应关系;

需求是这样的:如果在某个frame中找到了我想要的dom节点,我想要知道这个节点在页面上的坐标……只能offsetTop/Left沿Dom树向上计算。

4. 虽然截图功能稳定,速度也不错……主要有两个问题:

除了可以选择输出格式和图片质量外,再没有其他控制选项。他是整页的(类似打印的)排版,如果有浮层,我们无法获得某一屏的截图状况(比如我想知道浮层广告在第一屏时是否遮住了主要内容)。
page.render(“test.jpg”, { format: “jpg”, quality: 50 });

有时,某些区块死活渲染不出来,不管setTimeout等多长时间,那一块都是空白的,至今没找到规律。

5. 请求,貌似只是简单的封装了QtWebkit接口,格式不标准,需要手动处理成har。网上有外国人搞过获取请求内容的功能,用的是cache文件,不仅复杂,而且可靠性让人担心。

6. 总结起来,phantomjs提供了哪些控制(除这以外的不要报太大希望):

新建一个页面;
访问任意url,刷新,甚至是直接setContent()输入一段html;
Base64截图,或直接输出到本地磁盘文件;
在任意frame环境下执行一段js;
注入一个js文件,page.includeJs/injectJs (没尝试不知道有没有坑)
可以动态改变窗口尺寸;

7. 与Nodejs配合(输入输出)只有两种方案:标准输入输出、Websocket

phantomjs的输入输出全都是同步的(不像Nodejs那样事件驱动),如果想要通过stdin接受Nodejs发来的指令,只能setTimeout轮询。然后在输出上做个简单的消息分隔协议(我用的是一个蹩脚的multipart解析器)

继续

8. page.onLoadFinish 这个callback是碰到第一个抓狂的问题,基本没规律,有时候有,有时候没有,有时候还来两次, 像女生那啥一样……无语

所以,我们必须有:去重逻辑、超时逻辑;而且这个回调传回来的参数只有两个值 ‘success’ ‘fail’,更奇葩的是:只有程序内部错误导致无法加载页面的时候才会返回 fail ,不管网页是404、502、只要加载完了一律success!

另外一个问题,这个“事件”触发只是html文件加载完成,不是真正的onload,如果我想要一个整页的截图,必须等到所有资源“看似”加载完成,这需要我们自己实现。我的做法是,在onLoadFinish触发之后开始关注网络请求,200ms之内不在产生新的请求就认为加载完成。(因为一般的交互动画的间隔时间都比这个时间要长)实验之后效果还不错。

无力吐槽:

(至今没找到解决办法)

9. 有些网页就是加载不出来,甚至等上一分钟

暂时找到这些网站无法加载
sports.xinmin.cn
www.jisutiyu.com
www.du00.com
www.ahzb.cn
www.bandog.cn
pic.daqi.com
www.smartshe.com
www.diezhanmi.com
bbs.tiexue.net
tom.ent.ynet.com
tom.life.ynet.com
bbs.ld0766.com
www.7060.com
www.gaoxiaobar.com
gaoxiaobar.com
adk.funshion.com
www.zhaoxiaoshuo.com
www.kkkmh.com
www.ymt360.com
tom.ent.ilive.cn
bbs.voc.com.cn
www.zhijinwang.com
www.qnvod.net
www.d5yuansu.com
help.3g.163.com

影子模型

前言: 

js语言学起来简单,前端开发难在交互。

开发交互应用程序,本质就是维护一个模型,响应用户操作,在不同的状态之间转换。

用程序模拟传统的座机电话,主要有三种状态:挂断(等待),提机拨号,通话

在状态1的时候,数字键被按下是不会播出电话的;

当“提机”动作发生时,转换到状态2,这时按下数字键则代表拨号;

电话线那头传来信号“接通”,转换到状态3,这时才可以互相说话。

此文介绍的模型,是解决多页面间交互状态同步的,是通过业务实践中总结出来的。

问题描述:

产品需求要在所有页面上都启用WebChat,为了优化交互的体验,同时开启多个页面的情况下,所有页面上的WebChat要保持同步:收到的消息,展开某个窗口,新开了窗口,关闭了窗口;……总之这个WebChat就像浏览器的一部分。

多页面间通信

这个话题已经有很多成熟的方案,我们也是在几年前就引入了LocalStorage + storage事件的方式。

功能:任意一个key的内容被更改(或者从无到有的创建),会在所有(同域)页面上发布一个storage事件,携带的参数包含被修改的key列表。

基于这个特性,实现多页面通信,只需要所有页面上的程序约定监听同一个key的改变。

还有另外一种方式,我们也曾用过:cookie轮询。在cookie的同一个key中,用约定的格式存储“状态”,所有页面都做同一件事情——每隔一段时间取这个值与自己的当前状态做对比。

最早一版的“窗口状态同步”用的就是这个方案,它最大的缺点是:cookie占用网络流量,不够灵活。

基于storage的信道

接下来遇到的问题是:需要同步的量越来越多,代码繁琐容易出错(一遍一遍的重造车轮)

这时想到引入“管道+消息”概念,把监听storage事件的逻辑封装起来以“信道”的概念提供服务。我把他命名为Cluster(多个实体之间相互协作,实体间没有绝对的主次,虽然这个名字听起来有点别扭)

任何一个业务功能都可以使用Cluster实现“多页面通信”,只需要新建一个“信道”,就可以通过它发消息给所有加入这个信道的实体。(加入信道没有身份验证,只需要指定信道的名字)

用例:所有页面的程序都会加入一个叫做“message”的信道,当用户在一个页面上发一条消息的时候,当前页面向信道中“广播”这条消息,所有页面都会收到。

基于信道的方案:

有了通信的工具,直接的想法是在每个业务逻辑中,按照需要创建自己的信道,页面间彼此互发消息。

按照这个思路,以“展开某个窗口”的过程为例,为窗口添加“同步”的逻辑。

引入同步者

为了保持窗口对象原有的逻辑清晰容易维护,新逻辑不侵入窗口对象,以观察者的形式存在,称这个观察者为“同步者”。同步者默默的注释着窗口的每一个改变,把消息发给其他页面。

以“事件驱动”的编程方式(观察者模式),同步者监听窗口的一些事件,事件发生时通知其他页面执行某个动作。

默默的

通过监听窗口的“unfold”事件,在页面A展开了窗口w,同步者立即在信道中广播一条消息。此时B页面上的同步者下命令(调用window.unfold())展开了窗口w。按照窗口原有的逻辑,这个B页面的窗口w也会发布unfold事件,然后(循环开始了)……

这是个Bug,解决方式就是要区分这个“动作”是不是其他页面同步过来的,如果是,则禁止触发同步(不发unfold事件)。为此我将“展开”的动作添加了一个silent参数(默默的),如果指定silent,就不发unfold事件。另外,如果有其他功能也在监听unfold事件,而且跟同步无关,这样鲁莽的指定silent就可能使这部分功能失效(比如窗口的互斥功能,展开一个要自动收起其他所有的),所以我又添加了另外一个与同步无关的事件“focus”……如果将来增加交互,窗口边栏的收起与展开也要同步,就需要窗口增加另外一个事件(sidebar_expend),修改同步者增加这个事件的监听(但其实同步者根本不需要关心窗口到底都有哪些功能)……

总之,琐碎问题一大堆,将来交互逻辑越来越复杂,功能直接相互冲突的事情就更频繁了,像一堆毛线团一样。

影子模型:

我试图总结一个模型,解决所有人在这里可能遇到的问题。

模型描述:

一个小人儿站在阳光下,他怎样动,影子就跟着做一模一样的动作。影子模型就是从这里来的。

所有的窗口即是小人儿,也是影子。当用户正在一个页面上点击了窗口,这个窗口就是此时的小人儿。影子只是默默的重复小人儿的动作(不要发消息支配小人儿)。如果用户换到另外一个页面上继续操作,先前的小人儿就成了这时的影子了。

 

窗口:

  1. 所有需要同步的动作都要发布sync事件(事件名字随意取);
  2. 窗口中用于执行动作的方法必须提供silent参数支持,如果指定silent就不要发布sync事件;
  3. 窗口必须提供一个apply方法,用于接收小人儿发来的消息并翻译成具体的动作。

同步者:

  1. 消息的格式只需要小人儿和影子间互相理解,同步者不需要关心;
  2. 同步者只负责原样传递消息,将消息从小人儿传递给所有影子;

为现有功能添加同步功能,只需要对现有的交互程序稍作改动,再为他分配一个“同步者”。

运行过程:

  1. 用户操作了窗口,用影子们约定的格式描述这个动作,并触发sync事件;
  2. 同步者拿到sync内容广播给所有影子;
  3. 影子端的同步者收到消息在影子上执行apply(sync);
  4. apply()能够理解sync的格式,并重复窗口的动作(用slient参数执行动作);
  5. 完成了动作的同步。
这个过程可以简化的理解为:窗口触发sync事件,相当于直接调用了影子窗口的apply(sync)。

在webChat中的应用:

聊天窗口的管理,分为两部分实现

1. roomKeeper负责聊天室的创建和管理

2. layout负责所有与展现相关的处理

layout中实现了窗口排列布局的记录和同步,还有页面刷新后窗口的重建。他持有一个winSlider组件,所有的窗口都要winSlider.appendWindow()才会显示到界面上。为了避免处理繁杂的交互逻辑,我的同步功能直接添加在winSlider上,监听change事件,把改动广播给影子们。影子们通过winSlider.applyChange()重复小人儿的动作。

前端开发用得着的nginx配置

前端的工作过程里,本地开发、提供测试环境,总得有个用着顺手的服务器软件,这个场景里nginx很流行。

介绍两个好用的配置项:rewrite  try_files  @xxxx

rewrite

比较常见,主要用于将带版本号的静态文件路径替换成本地文件路径

例如人人网发布文件路径里面包含一个a0000的版本号,通过下面这句配置就能将http://xnimg.cn/a0001/js/base.js换成http://xnimg.cn/js/base.js直接影射到本地目录结构中。

rewrite "^/a?([0-9]+)/(.*)" /$2 last;

try_files

尝试在本地的多个路径中查找需要的文件,如果依然没找到才会返回404。下面配合@xxx配置实现一个更方便的功能。

location @xxx

这样定义了一个可以供其他配置调用的“请求处理方法”(handler),结合try_files如果本地没找到自动去线上取回指定文件。


if ( $document_uri ~*"^/[ab]?([0-9]+)/(.*)"){
    set $no_version_path /$2;
}

location / {
    try_files $document_uri $no_version_path =404;
    error_page 404 = @online;
    log_not_found off;
}

location @online{
    proxy_pass http://$host:80/$request_uri
}

第一个if语句是一个匹配,把$2第二个分组值(去掉版本号的路径)保存到变量$no_version_path;

try_files的顺序:有版本号的路径、没有版本号的路径、如果404 调用@online;

@online中用$host,$request_uri这两个nginx变量拼出请求的文件路径直接代理请求到线上。

这样配置的服务器,只需要在本地存放你所关心的几个静态文件,其他不需要调试的文件全部代理到线上,省得每次花时间更新自己不关心的工程代码。

Dproxy发布一个可用版本

Dproxy是用nodejs编写的一个web调试代理。
项目托管在Github上: http://github.com/deemstone/dproxy

缘起

主要有两个原因促使我决定开发Dproxy:

1. Mac平台下没有像Fiddler一样好用的调试代理;

Fiddler在前端开发方面的作用主要有两个:比绑host更方便管理;可以提供更灵活的开发环境.

多个人协作开发的情况,这种便利就很明显了.(用代理,将不同的文件请求转发到不同的服务器上).

2. 基于一个灵活的”代理软件”,定制的开发一些扩展功能,可以用来解决工程管理方面碰到的一些问题.

比如,接口模拟器.前后端独立开发的情况下,可以使用它提供一个临时的开发环境,方便直观.

功能设计原则:

  • 专注提供一个灵活配置的代理软件;
  • 让开发环境变得简单(丢弃nginx);
  • 方便分享代理配置;
  • 提供扩展机制;
  • 跨平台,支持第三方GUI外壳;

现状:

已经是v0.2版了,之前有过一个Demo版本,0.2版是完全重写的一个新版本,各项基本功能可用(难免有些小bug).可以替代nginx做一个本地的静态服务器,没有图形界面,手动修改.rule配置文件,修改保存即时生效.还提供了一个简单的命令行控制台,具体用法可以看github项目首页的介绍.

欢迎试用,并提供您宝贵的建议.

十月30日将发布GoogleTV2.0更新

自从去年大概这个时候谷歌发布了GoogleTV,但是没有受到持续的关注(尤其是国内媒体).可能是当前提供的功能比较鸡肋,操作很不人性化,交互的设计根本没法适应客厅这个环境.

马上,GoogleTV就要升级到2.0版本啦!

谷歌一直持续给力这个产品,不断提升产品的可用性,调整产品的概念,让他真正能够摆得进客厅.

这次更新的主要变化:

运行在Android Honeycomb(3.0)系统只上,并且将来会升级到Ice Cream Sandwich(4.0).之所以没有一步到位4.0,是出于稳定性考虑,3.0系统经过这么长时间的应用,已经被充分测试了.而且功能上没有很大差别.

带来了AppMarket(电子市场),虽然目前为GTV开发的App只有20几款,但是理论上任何Android应用都可以顺利的运行在GTV上(只是难看点).

谷歌说,将会为GTV应用在Market上单独开辟一个列表.

这次升级,Google比较强调的是对搜索功能的优化,意思大概是”将搜索范围扩大到更多流媒体服务商,只要他们愿意提供自己的内容数据库”. 将来GTV上的搜索不仅仅是搜索互联网和电视频道,还能直接搜索到这些流媒体服务商提供的信息,以统一的体验享受多服务商提供的视频服务.

关于Youtube, 他们在努力改善Youtube在电视上的操作体验,使其适合在客厅里使用,所谓的10-foot-experience.

相关链接:

http://www.google.com/tv/

http://gizmodo.com/Google-TV/

http://www.googletvforum.org/forum/more-news-your-google-tv-news-team/3241-october-30th-google-tv-2-0-update.html

    Google code上一次不一样的SVN checkout体验

    gfwinterceptor

    忍了很久了,一直想抽点时间帮忙把这个软件增强一下. 最近这个项目终于被死死的墙在外面了.废了好大劲儿才弄明白怎么通过ssh使用svn签出.

    • 本来想法很简单,svn支持http代理,但是手头没有直接能用的http代理.
    • 本来还以为,设置了系统的代理,svn就能直接被代理了呢,结果不像我想的那样…

    通过SSH Tunnel使用SVN

    原理很简单,就是通过一个能正常访问google服务器的”ssh服务器”做跳板来间接的访问google code.

    ssh -L 9999:xxxx.googlecode.com:80 xxx@ssh.server.com

    解释:

    • -L  建立”本地端口映射” (把本地的一个端口映射到远程某个服务器上的另一个端口)
    • 9999  是要使用的本地端口(随便选一个,只要不跟你机器上其他服务冲突就行)
    • xxxx.googlecode.com   是最终要访问的那个服务器名或者地址
    • 80  是最终要访问的那个服务器端口
    • 后面就是正常的ssh连接的内容了

    通常这条命令需要用root权限执行(直接sudo就行了,  第一次提示输密码是sudo的密码, 第二次密码才是ssh服务器的密码)

    登录成功!  (即 端口映射成功)

    现在的网络状况: 所有发往本地9999端口的数据全都通过这个管道传送到xxxx.googlecode.com:80上去了.

    还没完

    由于googlecode的svn服务器需要域名来判断你访问的哪个库,所以直接用localhost不行.

    那就简单办法:绑个host  添加一条:   127.0.0.1   gfwinterceptor.googlecode.com  就OK了.

    参考:

    另外一个可以参考的工具:   http://www.abgba.com/article/technology/ssh-tunnel-svn_up-openwr.html

    总结常用的ssh_Tunnel软件(比较全):  http://ihipop.info/2011/07/2629.html

    SSH Port Forwarding (SSH Tunneling) : http://www.linuxhorizon.ro/ssh-tunnel.html

    Poor man’s VPN using PuTTY:  http://wiki.freaks-unidos.net/ssh-port-forwarding

    一起给力HTML5

    已经是第三次参加”给力HTML5″了,昨天到了现场才发现原来我落了一期(过去的那个月实在是太忙乱了,不堪回首…)

    这次来得大部分是新人,跟我一起来的几个同事也都是第一次参加,没有合作过(我们平常工作一个坑从来没有多过两个萝卜).

    新人比较多,再加上一般程序员都比较腼腆,这次活动的气氛不很活跃,大家都像中学生一样认真的听课,然后按照活动流程选题,做作业.

    创意

    我们组几个人都是做Web应用的,创意上很少会蹦出游戏的火花,从前几次参加的经验,我们根本没想要拿到什么结果,只是不放弃的参与,努力的做我们自己的Web应用.

    我们的创意是基于HTML5视频api做的实时评论服务,主要功能就是可以在播放的时间轴上加标记作评论.而且所有的信息都是实时更新的.这个应用可以用来跟朋友们一起在线看电影,或者在线课堂做笔记,这样的笔记能帮助我们更方便的复习(从我们记录的文字直接播放相关的那段视频).

    Coding

    我们只花了二十几分钟的时间确定了这个创意和主要功能,开始分工,一个人用Nodejs做简单的服务端程序,一个人做前端的数据接口,一个人做可以打Tag的播放器,一个人做实施更新的评论数柱状图. 分工很明确,下面开始做的就是查资料…虽然知道HTML5能做这些,但是没有真正使用过,所有的技术都是现学现卖,这也花掉了我们大部分的时间. 也弄得我们手忙脚乱.

    原定是5点开始组合联调,结果快6点了才开始共享代码,(共享代码的方式…竟然是QQ…)然后我们就悲剧了(脑袋上都挂着大汗珠),webSocket总掉线,基本上半分钟就掉,一直纠结这个问题浪费了太多时间,直到晚饭时间我们才决定去掉这个功能下次再完善. 这样,我们的产品就成了个样子货,只有单个页面,一个视频来回的播放.

    为了在演示的时候不会太尴尬,我们决定”说段相声”,首先把我们得想法完整的描述了一遍,然后看演示.演示的过程几乎是指着一堆破铜烂铁在描述我们的美好未来…

    意外的获得了大家评选的第一名作品,我想,还是因为我们的创意吸引了大家,所以我们决定回来后把这个产品完成.

    谢谢谷歌的朋友们,这奖品滋润了我们程序员的生活,太有爱了^_^.期待这下一次的Hackthon.

    关于HTML5

    另外描述一下我对HTML5的看法.本来这应该是个充满了激情和让人兴奋的名词,但是看活动现场大家对这个东西都很没有信心.我想,主要原因还是标准没有定下来,很少有人尝试,没有文档很难做开发…整体上给我们开发者的感觉是”还不能应用到产品中的技术”,所以即使有这么精彩的未来,也很难对他提起精神.

    我的想法是: 的确很困难,但是这就是我们一起创造未来的过程.希望我们都不要放弃,在未来的Web技术领域中为国内的开发者的高调做好铺垫.经鉴定,这是一件有意义的事儿.

     

    Nodejs分享资源列表

    Git

    《The Git Community Book》http://book.git-scm.com/

    《Git Community Book 中文版》http://gitbook.liuhui998.com/

    《Pro Git》http://progit.org/book/

    一个引导实验手册(中文):http://gitimmersion.googol.im

    github:http://github.com

    Nodejs

    安装:https://github.com/joyent/node/wiki/Installation

    npm: http://npmjs.org

    为什么Nodejs的并发性能高:http://cnodejs.org/blog/?p=780

    CommonJS:http://wiki.commonjs.org/wiki/CommonJS

    介绍CommonJS:http://www.grati.org/?p=165

    编写Nodejs原声扩展:https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/

    译文:http://www.grati.org/?p=413

    DB

    Redis http://redis.io

    MongoDB: http://www.mongodb.org/

    CouchDB:http://couchdb.apache.org/

    ECMA-262

    标准解读:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

    官方:http://www.ecma-international.org/publications/standards/Ecma-262.htm

    实时协作的任务列表:http://thingler.com/

    实时访客统计:http://nodelytics.strx.it/stat/www.strx.it

    实时流量统计:http://projects.nuttnet.net/hummingbird/

    随时聊天:http://chattrr.net/client.htm

    VMware中直接使用物理硬盘(Windows)

    急性子的朋友直接略过前两段 看操作过程吧,呵呵

    背景:

    因为想要提高虚拟机的运行速度,除了做一些简单的优化配置,发现很多时候性能瓶颈在硬盘上。guestOS静置了一段时间之后,有些内容会写道硬盘,这时候再回来操作他,那里面的窗口肯定会拖泥带水的。

    刚刚买了一块新硬盘,想要把这guestOS直接装到物理硬盘上。

    我的环境:

    • hostOS: Windows 7 (64bit)
    • guestOS: SnowLeopard
    • VMware Workstation 7
    • 内存:4G  给虚拟机分1G就够了

    问题:

    跟这个帖子描述的一样:Windows会不时的打断VMware的操作。然后,硬盘被Win锁起来不准其他软件直接操作。这个时候就出现那个悲剧的弹窗提示了。

    原理:

    其实在WindowsXP下是不会有这个问题的。但是由于Windows7开始采用了新的安全机制,不允许用户软件直接操作已挂载的硬盘上的文件系统。(看来这套系统还是不靠谱,我都把硬盘在虚拟机里分了区装完了系统,Win才发现这盘有问题……)

    其实只要想办法让Windows不理这块硬盘就行了,也不能完全抛弃,驱动还是得装的。

    (系统方面我也是菜鸟,经过一番搜索找到这个解决办法)

    搜索结果 主要有两种解决办法: 1.让硬盘脱机状态;  2.改动硬盘参数,骗windows“这啥都没有”

    主要参考这里:http://communities.vmware.com/docs/DOC-10455

    操作过程:

    注意:仅适用于Server 2008 和 Windows7,并且是给虚拟机分配整个硬盘!!

    首先打开cmd,使用windows自带的diskpart.exe

    list disk    (查看想要装虚拟机的硬盘编号)

    select disk 编号

    offline disk

    attribute disk clear readonly

    rescan

    完成。 现在这块硬盘对Windows来说是脱机状态,但是VMware里面可以正常使用,而且电脑重启也不会有问题。

    其他:

    这里描述的是其中最简单的一种解决方法,如果这个不适用你的情况,直接去看上面提到的那篇文章吧(英文的),里面还提供了一个作者写的小工具。

    关于DiskPart微软官方文档:http://technet.microsoft.com/en-us/library/cc766465(WS.10).aspx

     
    Powered by Wordpress. Design by Bingo - The Web Design Experts.