试用Windows的UNIX/POSIX子系统(SUA)

2009/05/04 | 20:07 | 分类:Windows应用 | 标签: | 2,424次阅读

  以前研究Windows的基本概念时,我就知道它有一个POSIX子系统,可以在Windows下编译运行使用了POSIX库的程序。但这一直停留在书本概念层面,直到昨天看到Jeep同学的Windows系统上安装了一个Subsystem for UNIX-based Applications时,我便决定也安装试用一下。
  有关Windows的POSIX子系统是什么、怎么用的问题,可以参考Wikipedia或Microsoft TechNet [英文][中文]上的介绍。它历经了NT时代的Microsoft POSIX subsystem、XP/2000时代的Microsoft Windows Services for UNIX (SFU)以及2003 R2/Vista/2008时代的Subsystem for UNIX-based Applications (SUA)等版本,对POSIX标准的支持日臻完善。我的系统是来自MSDNAA/IEEE的Windows Server 2008,自然要使用最新版的SUA。至于SUA和cygwin在实现机理和功能性能上有什么区别,我还没有仔细研究。但从直观感觉上,Windows原生支持的SUA是比cygwin快一点儿;按照Wikipedia上的这个说法,cygwin是对POSIX是“partial”兼容,而SFU/SUA则是“full”兼容。
  很多人安装SUA的目的并不是要向Windows移植什么重要的UNIX/Linux应用,有时候我们仅仅是为了在Windows中使用一个类UNIX的Shell以及丰富的GNU utilities,毕竟这类久经考验的命令行工具比Windows Command Prompt的那些命令好使很多。对于工作环境要求在Windows和Linux间来来回回切换的人们,也省得敲错命令。安装SUA之后,预装的Shell是C Shell和Korn Shell,还安装了包括vi、gcc在内的300多个命令行工具。同时,Windows的Path环境变量中自动添加了SUA相关目录,这样在Windows Command Prompt和Power Shell中也可以使用很多GNU utilities了。当然,UNIX Shell的内部命令是不可以在这里使用的。此外,在Power Shell中,Power Shell命令别名(如ls、cp)会优先于同名的GNU utilities调用。总之,使用SUA或cygwin这类UNIX Shell+GNU utilities的模拟环境,相比手工添加的“容错”命令或者GnuWin32这类独立命令级的移植要“真实”和顺手得多,但缺点就是体积庞大。
  为了检验SUA的能力,我拿我相对熟悉的GNU bash做了实验。从官方下载bash-4.0版源代码,在SUA的C Shell环境中解压,运行./configure通过。但在make时报错:

  1. execute_cmd.c: In function `time_command':
  2. execute_cmd.c:1145: error: storage size of `dtz' isn't known

  查看execute_cmd.c源代码,发现这句代码有注释:

  1. struct timezone dtz; /* posix doesn't define this */

  看来这个struct timezone不是POSIX标准的东西。通过上下文,我发现这里是处理time(计时)关键字的函数。于是查看configure的帮助,得知只要加一个“--disable-command-timing”参数即可禁用time关键字(这时输入time将改用/bin/time程序做计时)。再次make,execute_cmd.c通过,但又出现以下错误:

  1. getcwd.c: In function `_path_checkino':
  2. getcwd.c:80: error: `MP_RMDOT' undeclared (first use in this function)
  3. getcwd.c:80: error: (Each undeclared identifier is reported only once
  4. getcwd.c:80: error: for each function it appears in.)

  查看./lib/sh/getcwd.c的源代码,果然没有找到MP_RMDOT宏的定义。在全部源代码中搜索,发现这一定义在externs.h中,在./lib/sh/makepath.c中也有使用,唯独在./lib/sh/getcwd.c中使用了却没有引用其定义。也许这是bash-4.0的一个bug?使用Linux下的gcc编译连接是通过的,但SUA下的gcc版本也许有更严格的名字连接策略,导致无法编译通过。于是我将“#define MP_RMDOT 0x04”的定义手工加入./lib/sh/getcwd.c,再次make,全部通过。实验运行无误!
  需要注意的是,SUA提供的是编译和运行使用了POSIX库的程序的环境,并不提供UNIX二进制文件的运行支持。它编译生成和支持运行的可执行文件仍然是Windows的PE格式,而不是ELF之类。SUA支持的只是仅使用了标准库和POSIX库的程序的源代码级移植,对于使用了Linux等环境特有的系统调用的程序,也不可能不加修改地编译运行。
  有空再研究一下SUA在我们的工程中能有什么实际点的应用。

我选择Windows平台软件的原则

2009/04/11 | 15:52 | 分类:IT杂谈 | 标签: | 1,267次阅读

  我认为,目前阶段我选择计算机软件或服务的一个重要原则是:在不直接或间接侵犯他人合法权益的的前提下,尽可能满足自己对计算机系统的知情权和控制力。基于这个原则,使用GNU/Linux+开源软件当然是最好的选择。不过这不是今天要说的重点,我想说说我在Windows平台下的选择软件的一些准则。也许这个话题的受众面更广一些。
  “不直接侵犯他人合法权益”是比较容易理解的,在计算机软件领域,主要指的就是不使用盗版、破解软件。我的这一原则并不是出于什么高尚的道德或法律因素,仅仅是出于对同行的尊重。我承认,在其它一些方面,如电子书、音乐、影视,我自觉或不自觉地使用着一些侵权的复本。但在软件方面,自己作为一个计算机专业的学生,一个不断制造代码的劳动者,我十分理解同行的工作价值。虽然自己是开源和自由软件的爱好者,但尊重他人选择自己软件发行和营利方式的权利。当然,很多人会以经济原因拒绝使用正版。但这个问题还用我说吗?网上介绍常用盗版软件的替代免费软件的文章还少吗?(123)除了Windows本身和一些领域专用软件外,日常应用中没有哪个领域缺乏优秀的免费软件。在免费软件中,我的首选是开源、自由的工具,这一方面是对自由软件精神的支持,另一方面,作为一个开发者,学习他人源代码、按照自己的需求修改软件功能也是满足我知情权与控制欲的途径。当然,很多Windows下的自由软件也沿袭了UNIX的KISS精神,相比Windows下传统软件那种大而全的风格,这些软件的确不迎合一些用户的习惯。我有时也会犯这个懒,比如在Windows下虽然有自由的ISO制作和CD刻录工具,但我还是想使用如同UltraISO那样集成了这两类功能GUI的工具,这时候免费但是专有的ImgBurn则成了我的选择。同样,一些开源、自由的媒体播放器出于专利原因,默认不集成Real、QuickTime等格式的插件,在懒得自己配置的情况下,选择那些专有的免费软件也是不错的。
  至于免费软件覆盖不到的Windows本身(注意是“Windows”而不是“操作系统”),我承认我有点站着说话不腰疼——我的Windows及微软的一系列软件都是本科时通过参加微软的竞赛等活动免费得到的。但这对于一个有经济能力使用电脑和网络的大学生来说并不是遥不可及的:微软的DreamSpark计划为大学生免费提供Windows Server 2003在内的操作系统。如果想要XP、Vista或Server 2008,则可以通过加入IEEE学生会员等方式得到MSDNAA的授权,下载和使用百余种微软产品。IEEE对中国学生只需要25美元的会费,连Vista Business版价格的十分之一都不到。计算机专业的学生,有兴趣可以还参加ImagineCup竞赛,只要第一轮晋级就可以免费得到MSDNAA授权。另外听说ACM-ICPC也开始和MSDNAA合作了。这些途径得到的微软产品在技术上和零售版没有区别,但licence限制在学术、科研等非商业领域使用(全凭自觉)。当然,微软出此策略也是老谋深算的,想方设法把学生吸引到它的平台下,学习和使用它专有的技术,从而沦为它的奴隶,在将来的工作中不得不使用它的产品,进而谋取潜在的利益。知道了微软的陷阱,不往下跳就是了。我通过免费或廉价的途径合法地得到了你的软件,你通过竞赛活动或商业合作轻松地宣传了你的产品,双方已经各取所需了。而对于非学生用户,我想说的是,你既然有钱买电脑、上网,就不可能真的因为经济因素用不起正版Windows。用不用正版,绝对是一个意识问题。
  所谓“不间接侵犯他人合法权益”的原则往往被很多用户忽略。举几个例子:我拒绝使用迅雷一类P2SP的下载工具,因为它未经授权地盗链他人服务器上的文件,尽管加快了用户的下载速度,但在减少被盗链网站点击量的同时反而耗费了它们带宽与流量,给这部分运营者带来了损失。我不使用stardict这个开源的词典软件,因为尽管软件本身合法且优秀,但它所使用的词典很多都是侵权的,作者通过把软件和词典(包括软件和词典的网站)分离的办法来规避GPL授权应有的责任,这种擦边球不值得我们支持。我也不在网络浏览器中安装广告拦截插件,因为你既然要从这个网站有所收获,就应该允许网站的建设者得到回报。一个负责任的网站,它所选择的广告也应该是负责任的,即使对消费者没有帮助,也不会产生不良影响;至于有些人说网络上充斥着大量低俗、欺诈、病毒等性质的广告需要拦截,那我只能说,你对网站的选择有问题!总体而言,这个原则有“己所不欲,勿施于人”的意味。开发者、运营者和使用者应该尽量构成一种和谐的循环。这话说起来空,但要做起来,对于用户来说有不少点点滴滴是可行的。这一原则与其它社会道德是一样的:如果只有你一个人做,也许你就是吃亏者;但如果大家形成了一种良好的氛围,那么整个环境就会向着积极的方向发展。
  所谓“知情权”和“控制力”,这是Windows天生的弱势,提到这个问题的时候,我也只能强调Windows的用户只有相对的知情权和控制力。微软要把用户变成傻瓜,但用户有必要明白,在操作模式上傻瓜一些无妨,但在对系统的知情和控制方面,务必要保持清醒的头脑。普通用户并不需要像系统级程序员那样了解Windows内核中每个接口的功能和设计原理,但至少要对自己使用的实用工具(Utilities)和应用软件(Applications)的逻辑有表象上的了解。Windows 9X及其工具的表象相对容易把握,我曾熟知多数系统文件和进程的功能;然而XP以后,一系列本不应该由操作系统负责的机制被Windows接管,微软打着“安全”的旗号把一系列机制黑盒化了(然而对用户来说最重要的默认用户权限问题却有所放松),一度使我感到控制力的丧失。当然,我一方面因为微软及第三方应用强大的推力而妥协,另一方面自己也会与时俱进地学习的。我所抵制的,是那些表面上以给用户更多的知情权为诱饵,事实上接管了用户的控制力的软件,这包括不少国产安全软件(以360安全卫士为代表)以及一些系统优化、设置工具。这类工具针对的目标是大众用户,但开发者缺乏社会责任感,没有想着如何引导用户理解软件机制或表象、培养良好的计算机与网络使用习惯,反而以自己利益为导向,在软件的界面设计和提示语中存在着大量充满主观色彩内容。这类软件误导着用户,让他们对Windows产生误解、对注册表产生恐惧、对病毒和攻击产生敬畏。在这类软件的影响下,用户自身的技能难以提升,只能做这些工具的奴隶。因此,我所期望的软件应该在客观层面增强用户知情权和控制力,而不应该从主观上妨害用户自身判断和决策。借用“己所欲,勿强施于人”的说法,这一原则可以表述为“己所欲,勿强施愚(动词)人”。
  最后,我想附带说一下我对绿色软件的态度。“绿色软件”是一个已经被用歪了的概念。起初,人们把那些不需要安装、不需要建立或更改任何在该程序所在目录以外的文件、不修改Windows注册表及系统设置的软件称为绿色软件。一些开发者看到了这个需求,纷纷将自己的软件以这样的方式设计和发行,这是一个很好的趋势,我喜欢这样的程序。然而一些盗版、破解者也瞄准了这块绿地,把一些商业软件加以破解、修改,制作了所谓的“绿色版”。从技术角度说,这些通过反向工程制造出来的软件往往不是真正的绿色软件,它们一般只做到了免安装、免序列号等正版验证过程,而对于软件原有的修改注册表等特性,破解者们往往不在意。从本质上说,这类软件的绿色版,只不过是给破解版、盗版加上了一个好听的名字罢了,绿色软件的名声早已被这些不法者弄臭。不过有一类“绿化软件”是合法的,那就是对开源软件做源代码级的修改,使之具备免安装、无垃圾的特性,然后在原作者所使用的licence的许可范围内重装发布的软件,它们也被称为“便携版”(Portable edition)。国外有一些“绿化”组织专门从事此行,如PortableApps.com。如果没有特殊的需求,我仍然会优先选择原版(需要安装、非绿色)软件。因为我相信,在大多数情况下最懂某个软件的人应该是它的开发者。软件开发中往往存在一些hack和trick,这是第三方开发人员常常注意不到的。即使是这种合法的、基于源代码级的修改版软件,也可能存在第三方人员无意中造成的隐患。故减少一个中间环节,有助于提升我对这个软件的信任。
  个人见解,仅供参考,欢迎批判。

为微软鸣不平

2009/03/10 | 22:50 | 分类:IT杂谈 | 标签: | 1,053次阅读

  看看我以前的文章就知道,我对微软的态度可谓爱恨交加。
  我不只一次给朋友解释Windows Vista的UAC机制设计的用心良苦了。微软当年为了让9X用户平滑地转向NT内核的系统,对2000、XP系统的默认用户权限有所放松,从此造就了一批“administrator敢死队”(尽管XP默认用户可以自己命名,权限却还是administrator)。这不能不说是微软的错,它至少成为了病毒木马恶意软件蔓延的必要条件。UAC本来可谓微软下定决心痛改前非之举——它既不需要像XP或2003那样显式地使用“Run as...”,也不需要像Linux下的gksudo一样显式地输入密码,确实是在安全与方便之间作出了平衡。但那些被惯坏的“administrator敢死队”们可不领情:一路畅通无阻的习惯被打破了,UAC时不时跳出来,烦不烦呀?微软真是出力不讨好,为的是那些人的安全,反倒要挨他们的骂。不过对于原来在XP或2003下就保持着良好的使用习惯、平时不滥用有管理权限账号的用户来说,UAC的使用模式可比以前的“Run as...”方便多了:需要提升权限时系统可以自动提示,省去了自己判断、实验之烦。特别是Windows 7 beta中对UAC又有了改进,给了用户给多人性化的选项。可不得这样吗?眼看着某些软件已经从中谋到渔翁之利,微软不得不下功夫用技术手段弥补这些非技术范畴的问题。所以,奉劝“administrator敢死队”相信微软一次,相信UAC吧。
  WGA和OGA那事,的确也是微软有错在先。它纵容盗版来拓展市场,确实不够道德。但微软现在要通过技术手段来警告盗版用户也是合情合理的。它通过可选的Windows Update项来发布WGA和OGA,只是把桌面变黑并弹出提示,和国内某些软件的“主动逻辑锁”相比,这已经很手软了。可在一些“专家”和媒体的渲染下,桌面变黑被描述成了“黑屏”,事先通知、可选安装的Windows Update项也被描述成了“黑客行为”,微软就被活生生地妖魔化了。甚至一些主流网络媒体也开始向不a明真b相的群c众宣传“盗版无罪,破解有理”的思想了。退一步说,即便法律认定微软前前后后的做法不合法,但仅凭用户使用盗版一条,就已经是不争的违法事实。骂微软之前先管好自己吧。
  Windows 7 beta推出以后,很多人又在抱怨Windows 7和Vista一样,都是在表面上做文章——把界面做花哨了,按钮图标换了换位置,顶多再把任务栏变个样子,还是模仿苹果的——于是认为微软没下功夫改进Windows的本质。还有用户觉得Windows的那些附件,多少年没有更新了,于是觉得那些小工具就是鸡肋。更多的用户常常喜欢指责Windows的很多功能的设计为什么那么愚蠢、那么霸道?要是有这些想法,我建议你看看《Windows编程启示录(The Old New Thing: Practical Development Throughout the Evolution of Windows)》这本书,里面的很多小故事是非计算机专业人员也可以理解的。当然,你可以把它看作是微软开发人员的诉苦——他们告诉你,Windows从内核到实用程序的改进是持续的,就拿计算器这样的外壳小程序来说,从95到Vista,界面几乎没变,但内部从调用精度有限的标准库到自行实现了无限精确度的数据结构,算法效率也在不断提高。也许只有像Windows 7那样,把每个附件的界面都修改一下才能让用户感受到程序员为其付出的汗水?还有每个看似弱智的设计事实上都是在权衡用户、系统、硬件提供商、软件开发商多方的利益,总体上都是以限制软硬件开发人员对系统功能滥用、维护用户对计算机的知情权和控制权为目标的。不分析清楚其中的道理就说三道四,恐怕不是负责任的态度。
  我是微软的老用户了,我深知自己有很多先入为主的习惯。但也正是因为经历Windows版本多了、变化见惯了,才不会像那些只接触过XP的用户那样,形成思维定势和偏见。微软有时候的确是地主老财、是披着羊皮的狼,但作为用户(尤其指盗版用户),你不要得了便宜还卖乖!

微软也是怀旧的

2009/02/20 | 11:16 | 分类:Windows应用 | 标签: | 705次阅读

  用一些工具提取 Windows 系统文件中的资源,你会发现一个有意思的现象。新版的 Windows 中常常保留了一些旧版 Windows 的位图等资源。有些可能是为了保持兼容性,有些则估计是程序员的疏忽,还有的可能是一些历史原因造成的。

微软也是怀旧的
发件人 blog

  ● Windows 98 的 explorer.exe 中,有个位图资源是 Windows 95 的开始菜单左边栏;在 98 的“新建快捷方式”对话框左侧的图示中,显示的也是 95 的开始菜单。
  ● Windows XP 的 explorer.exe 中,有几个位图资源是不同版本的 Codename Whistler Server 的开始菜单左边栏。
  ● Windows XP 的 browseui.dll 中保留了 Windows 98 SE(IE5) 风格的 Windows 飘浮徽标(IE5 右上角);而Windows Vista 的 shellbrd.dll 中保留了 Windows XP(IE6) 风格的 Windows 飘浮徽标(IE6 右上角)。
  ● Windows Vista 的 browseui.dll 有一系列 Windows 98 SE(IE5) 风格的工具按钮;在 shell32.dll 中,又有一系列 Windows XP (IE6) 风格的工具按钮。ieframe.dll 则是集大成者,包含了 IE5-IE7 风格的工具按钮。
  ● Windows Vista 的 shellbrd.dll 中,有一个 Windows XP 的开始按钮,但 Vista 是无法设置成 XP 风格的任务栏和开始按钮的。
  ● Windows Vista 的 shell32.dll 中,有一个 Windows XP 的通知区域(经典界面),但 Vista 同样是无法设置成这种风格的通知区域的。

Windows网络环境切换常用命令

2008/07/29 | 17:46 | 分类:Windows应用 | 标签: | 1,000次阅读

  简单总结一下用Windows命令行设置常用网络配置的命令。将它们保存为批处理文件(.bat),方便笔记本电脑用户在不同网络环境下快速切换配置。

一、设置IP与DNS

1、设置为DHCP:
a) 对于Windows XP
cmd /c netsh interface ip set address name="Local Area Connection" source=dhcp
cmd /c netsh interface ip set dns name="Local Area Connection" source=dhcp
b) 对于Windows Vista、Windows 7
cmd /c netsh interface ip set address name="Local Area Connection" source=dhcp
cmd /c netsh interface ip set dnsserver name="Local Area Connection" source=dhcp
(中文系统下“Local Area Connection”应替换为“本地连接”一类的名称,下同)

2、设置为固定IP:
cmd /c netsh interface ip set address name="Local Area Connection" source=static addr=10.2.54.123 mask=255.255.255.0 gateway=10.2.54.1 gwmetric=1

3、设置多个DNS服务器:
a) 对于Windows XP
cmd /c netsh interface ip set dns name="Local Area Connection" source=static addr=10.87.130.1
cmd /c netsh interface ip add dns name="Local Area Connection" 10.87.130.2
b) 对于Windows Vista、Windows 7
cmd /c netsh interface ip set dnsserver name="Local Area Connection" source=static addr=10.87.130.1
cmd /c netsh interface ip add dnsserver name="Local Area Connection" 10.87.130.2

二、设置主机名解析文件

有时候可能需要针对不同的环境使用不同的主机名解析文件,以便在不修改其它软件配置的情况下使用统一的域名访问不同的服务。
copy E:\Program\Batches\netenv\hosts.1 C:\Windows\System32\drivers\etc\hosts 或
copy E:\Program\Batches\netenv\hosts.2 C:\Windows\System32\drivers\etc\hosts

“hosts.1”文件内容:
127.0.0.1 localhost
10.87.1.1 mail_host.linjian.org

“hosts.2”文件内容:
127.0.0.1 localhost
202.204.80.1 mail_host.linjian.org

三、设置路由表

在局域网内同时使用两种外网登录工具(如“亿邮”+“教育网直通车”)时可能有用。
添加:
route -p add 10.0.0.0 mask 255.0.0.0 10.2.54.1
删除:
route delete 10.0.0.0

四、设置代理服务器

可以将不同网络环境下的代理服务器配置存储在不同的注册表文件中,需要改变的时候导入注册表。
reg import E:\Program\Batches\netenv\proxy.reg 或
reg import E:\Program\Batches\netenv\noproxy.reg

“proxy.reg”文件内容:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyEnable"=dword:00000001
"ProxyHttp1.1"=dword:00000001
"ProxyOverride"=""
"ProxyServer"="60.28.31.194:80"

“noproxy.reg”文件内容:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyEnable"=dword:00000000

五、ADSL或VPN接入

连接:
rasdial Entryname Username Password
断开:
rasdial Entryname /DISCONNECT

  组合调用上述命令,建立适用于不同环境下的网络配置批处理文件。最后,别忘了修改批处理文件(或其快捷方式)的属性,让它默认以Administrator身份运行,这样才能保证上述设置有权限执行。

页面存档: 上页 1 2 3 下页