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

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

  以前研究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网络环境切换常用命令

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

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

一、设置IP与DNS

1、设置为DHCP:
cmd /c netsh interface ip set address name="Local Area Connection" source=dhcp gwmetric=0
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服务器:
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"="<local>"
"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身份运行,这样才能保证上述设置有权限执行。