星期日, 三月 17, 2013

强制Windows XP硬盘IDE控制器运行DMA模式


前几天电脑速度突然变慢,找了许久不见原因,又不太想重装。无意发现硬盘运行时CPU占用50%(双核,一个核占满),去设备管理器检查确认硬盘运行于PIO模式,但是直接在设备管理器中修改不管用,Google知需要修改注册表,主要项目和其对应关系为:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}
000 - IDE控制器本身
001 - 主通道
002 - 从通道
需要修改的项目在001或者002下,根据主板上硬盘挂载口不同选择,主要项目是MasterDeviceTimingMode/MasterDeviceTimingModeAllowed/SecondaryDeviceTimingMode/SecondaryDeviceTimingModeAllowed这四项,其中Master和Slave各对应两项,内容含义为(十六进制):
UDMA 6 (Ultra ATA 133) = 10010
UDMA 5 (Ultra ATA 100) = 10010
UDMA 4 (Ultra ATA 66) = 8010
UDMA 3 = 6010
UDMA 2 = 2010
PIO Only = 10
Multi-word DMA Mode 2 = 410 (For most burners)
Multi-word DMA Mode 1 = 210
因为这台电脑的硬盘是支持DMA100的,而且连接在主通道Master接口上,所以将001下的MasterDeviceTimingMode/MasterDeviceTimingModeAllowed改为10010,重新启动电脑,检查设备管理器,硬盘传输模式重新变为DMA100,电脑速度也恢复正常。
根据MS官方的说法,Windows在硬盘传输过程中如果发生多次数据校验错误会自动把硬盘降一个档次使用,从DMA变为PIO方式。所以,如果发生这种情况,应该检查硬盘数据线是否正常,如果更换不能解决,应该考虑备份数据,可能需要换硬盘。

星期二, 三月 05, 2013

网络尖兵造成的网络不稳定情况解决


用铁通的网络一直感觉不怎么稳定,表现是有些网站有时能打开有时打不开,很多图片打不开,或者就是有些网站慢得很不正常。昨天突然变得更差,几乎一半网站都不能打开,traceroute时到222.41.131.230就会失败,在网上查了一下有人有同样的问题,但是都不知道原因。本来想打电话给客服,但是估计客服会先让把路由断开直接拨号试,于是先自己测试,断开路由直接拨号果然上网正常了,这样基本上确认铁通用了网络尖兵等技术手段劣化用路由上网用户的网络体验,强制每户用户买他多个账号(强烈谴责并鄙视这种流氓行径!)。
在网上搜了一下看到网络尖兵的原理就是通过判断ip包中ttl是否为标准值(64, 128, 255)确定用户是否用了路由,试了下从自己pc上和路由上分别ping某网站,果然ttl差一。这样解决思路就很清晰了,用iptables把出口ttl值强制设置成统一值(进来的包不用管),命令如下:
iptables -t mangle -A POSTROUTING -o ppp0 -j TTL --ttl-set 128
设置完成后再测试网络基本恢复正常。再次鄙视一下垄断运营商让人不齿的所作所为!

星期五, 十二月 28, 2012

TunnelBroker不稳定情况一则


一直通过路由使用HE的tunnelbroker访问IPv6网络,开始用的dd-wrt设置的tunnel,非常稳定,但是由于硬件兼容问题,改为用原厂固件,改过后就出现V6不稳定的情况,困扰很久。具体表现是Win7经常找不到V6连接,通过test-ipv6.com测试时经常找不到IPv6地址,在linux下用ping6 ipv6.google.com测试时偶尔会出现Invalid Argument,但大多时间会成功。Goolge看到ping6在测试link local地址时没指定设备号会出现Invalid Argument的错误提示。检查当前tunnel创建命令:
ip tunnel add he-ipv6 mode sit remote 10.0.0.1 local 10.10.0.1 ttl 255
man 8 ip可以看到ip命令创建tunnel时支持通过dev参数指定绑定的设备,所以将创建命令改为:
ip tunnel add he-ipv6 mode sit remote 10.0.0.1 local 10.10.0.1 dev ppp0 ttl 255
经过一天测试,感觉比V6比原来稳定很多。猜测路由原版固件linux内核版本较老,在创建tunnel时不会同时绑定设备,在打开socket时会尝试不同设备发送,网络情况变化较多,可能造成某些尝试失败,而误报Invalid Argument。

星期三, 十一月 07, 2012

Chyrp在Safe Mode的PHP服务器上安装问题


Chyrp是个轻量级的CMS/Blog平台,可以用来在小项目和低配置机器上替代Wordpress。但是在设置了Safe Mode的平台上安装时,会遇到一些问题,需要手动调整。
Warning: glob() has been disabled for security reasons in /root_dir/chyrp_dir/includes/class/Theme.php on line 200
这是最严重的问题,系统设置禁用了glob函数,Chyrp无法获取当前目录下文件列表,会造成sytesheets路径出问题,页面显示不正常。解决方法是在chyrp_dir/include中创建文件sec_glob.php,内容为
<?php
/**#@+
 * Extra GLOB constant for safe_glob()
 */
define('GLOB_NODIR',256);
define('GLOB_PATH',512);
define('GLOB_NODOTS',1024);
define('GLOB_RECURSE',2048);
/**#@-*/

/**
 * A safe empowered glob().
 *
 * Function glob() is prohibited on some server (probably in safe mode)
 * (Message "Warning: glob() has been disabled for security reasons in
 * (script) on line (line)") for security reasons as stated on:
 * http://seclists.org/fulldisclosure/2005/Sep/0001.html
 *
 * safe_glob() intends to replace glob() using readdir() & fnmatch() instead.
 * Supported flags: GLOB_MARK, GLOB_NOSORT, GLOB_ONLYDIR
 * Additional flags: GLOB_NODIR, GLOB_PATH, GLOB_NODOTS, GLOB_RECURSE
 * (not original glob() flags)
 * @author BigueNique AT yahoo DOT ca
 * @updates
 * - 080324 Added support for additional flags: GLOB_NODIR, GLOB_PATH,
 *   GLOB_NODOTS, GLOB_RECURSE
 */
function safe_glob($pattern, $flags=GLOB_PATH) {
    $split=explode('/',str_replace('\\','/',$pattern));
    $mask=array_pop($split);
    $path=implode('/',$split);
    if (($dir=@opendir($path))!==false) {
        $glob=array();
        while(($file=readdir($dir))!==false) {
            // Recurse subdirectories (GLOB_RECURSE)
            if( ($flags&GLOB_RECURSE) && is_dir($file) && (!in_array($file,array('.','..'))) )
                $glob = array_merge($glob, array_prepend(safe_glob($path.'/'.$file.'/'.$mask, $flags),
                    ($flags&GLOB_PATH?'':$file.'/')));
            // Match file mask
            if (fnmatch($mask,$file)) {
                if ( ( (!($flags&GLOB_ONLYDIR)) || is_dir("$path/$file") )
                  && ( (!($flags&GLOB_NODIR)) || (!is_dir($path.'/'.$file)) )
                  && ( (!($flags&GLOB_NODOTS)) || (!in_array($file,array('.','..'))) ) )
                    $glob[] = ($flags&GLOB_PATH?$path.'/':'') . $file . ($flags&GLOB_MARK?'/':'');
            }
        }
        closedir($dir);
        if (!($flags&GLOB_NOSORT)) sort($glob);
        return $glob;
    } else {
        return false;
    }    
}

/**
 * A better "fnmatch" alternative for windows that converts a fnmatch
 * pattern into a preg one. It should work on PHP >= 4.0.0.
 * @author soywiz at php dot net
 * @since 17-Jul-2006 10:12
 */
if (!function_exists('fnmatch')) {
    function fnmatch($pattern, $string) {
        return @preg_match('/^' . strtr(addcslashes($pattern, '\\.+^$(){}=!<>|'), array('*' => '.*', '?' => '.?')) . '$/i', $string);
    }
}
?>
编辑chyrp_dir/include/Theme.php,在代码最前面加入
require_once("sec_glob.php");
查找并替换所有glob为safe_glob。对于其它不重要的函数调用可以通过给函数名前加@关闭警告信息,如替换opendir为@opendir即可。

星期一, 十月 29, 2012

安装MathType 5.2c到Office 2007


安装MathType 5.2c到Office 2007时安装程序会提示不支持的Office版本,让升级到新版本,安装完成后打开Word不出现MathType工具栏。事实上,可能通过手动安装实现MathType 5.2在Word 2007中运行。
Word安装是:找到MathType的Word支持文件MathType Commands 5 For Word.dot和MathPage.wll,手动放入Word启动加载文件夹中即可。两个文件所在路径分别是(根据安装路径调整)
C:\Program Files\MathType\Office Support\MathType Commands 5 For Word.dot
C:\Program Files\MathType\MathPage\MathPage.wll
找到后,复制并粘贴到(给所有用户安装)
C:\Program Files\Microsoft Office\Office12\STARTUP
如果是给单个用户安装,那么目标路径为
#Windows Vista & 7
C:\Users\[用户名]\AppData\Roaming\Microsoft\Word\STARTUP
#Windows XP
C:\Documents and Settings\[User Account Name]\Application
Data\Microsoft\Word\Startup
注意两个路径根据需要任选其一即可。
PowerPoint安装过程:打开PowerPoint 2007,单击左上角的Office图标打开菜单,在菜单最下面找到并打开PowerPoint选项对话框,对话框左侧选择加载项,在右侧下方找到管理,下拉列表中选择PowerPoint加载项,点旁边的转到按钮,在弹出的对话框中点添加按钮,找到并添加下面的文件即可(根据MathType安装路径调整)
C:\Program Files\MathType\Office Support\MathType AddIn (PowerPoint 2003).ppa
安装完成后如果菜单栏没有加载项的话,重启PowerPoint应该就可以了。

关闭Windows 7自动跃点功能实现指定多条默认路由选路顺序


在Win7下搭了个隧道,手动添加路由并设置了一个比较低的跃点数,开始使用的时候发现流量走隧道,但是过一会自动变成本地网卡。同样的设置在XP中从来没出现过。查资料后发现确实为Windows 7的(新)特性。
1. Windows 7下路由跃点值由两部分之和构成(设备跃点数和路由本身跃点数),所以当你用
netsh int ip add route 0.0.0.0/0 "Internet" 10.0.0.1 metric=10 public=yes store=active
这样的命令(或者route)添加路由时,再用route print看到的路由metric值并不是自己在命令中指定的值(比如上面的命令增加的路由metric可能为20)。这就是因为Win7给你指定的metric值上增加了设备本身metric。
2. 设备本身metric默认为自动生成,与此设备连接速度和带宽有关,而且使用过程中可能发生变化。这应该就是隧道时灵时不灵的原因了吧。
修改很简单,依次打开控制面板,网络和Internet,网络和共享中心,左侧找到更改适配器设置,找到本地网卡,右键点之,属性,选择IPv4,点属性,弹出对话框中点高级按钮,将自动跃点项前的对勾去掉,填入一个合适的值(如1000)。再用同样的方法修改隧道对应的适配器的跃点值(如100)。回来连接隧道上网,再不出现上网过程中路由自动改变的问题了。
这个方法同样适用于多网卡情况,有时需要用到多个网卡同时接入,但各有不同用途,就需要手动设置跃点(metric)值,可以参考官方论坛的文章。最后抱怨一下Win7这个功能,可能带来很大的问题,有时用户本来指望使用加密的VPN连接保护通信,结果因为其连接速度不如原生的本地网卡,在使用过程中由于Win7自动跃点,不知不觉所有流量改为通过本地网卡路由,结果数据在用户不知情的情况下变为明文传输。

星期二, 十月 23, 2012

证书和CA两则


再记录两则关于证书和CA的问题。
1. nginx中配置证书路径。自签名证书有个问题就是根证书本来没有在客户端中存储,所以需要在http服务器中配置证书路径(certificate chain)一次将证书和根证书发送给客户端。在Apache服务器中有专门的CA证书配置语法,但nginx则需要一个证书本身包含路径中的所有证书,生成命令为
cat servercert.pem > chaincert.pem
cat rootcert.pem >> chaincert.pem
#如果有intermediate certificate,则包含在rootcert之前,如下
cat servercert.pem > chaincert.pem
cat intercert.pem >> chaincert.pem
cat rootcert.pem >> chaincert.pem
2. windows xp和server 2003不支持证书散列算法sha-2(包含sha-256、sha-512等),所以,为了最大的兼容性,尽量服务器证书和根证书签名散列算法都sha1,否则查看证书时会提示invalid signature.

删除IE证书中其他人类别的证书


误导入一个证书到IE的其他人类别中,打开Internet选项发现竟然不能删除,就其他类别下的证书不能删除,不知道微软怎么想的。通过一翻折腾,终于找到方法。
首先用Win+R键打开运行对话框,输入mmc打开管理控制台,在菜单栏中选择文件->添加删除管理单元,打开对话框左侧找到证书,点添加按钮,弹出对话框中选择我的用户账户,点完成,确定回到程序主界面。
现在在左侧的证书中找到其他人的类别,找到要删除的证书,在右键菜单中即可删除。删除完成关闭程序时提示是否保存,可以选择不保存,不会影响操作结果。

使用openssl制作自签名的CA并签名自己的网站


Https可以很大程序上提高网站安全性,防止网站和用户通信被第三方获得。但是要使用https就必需要有证书,证书由可信CA(Certificate Authority)颁发,但是这种证书价钱非常高,一般每年收费100美元以上,而且,对于某些针对性很强的网站(比如机构内部网站),并不需要全局可信的证书,所以很多情况下,可以用自签名的证书代替。制作自签名的证书可以用Windows Server版自带的CA工具,更多的情况下,用的是openssl证书工具。使用openssl签名证书相关的工作主要有CA生成、证书请求生成和证书签名。使用工具主要是openssl自带的CA.pl工具,路径为/usr/lib/ssl/misc/CA.pl.
1. CA生成。自签名证书可以直接制作,但是首先制作一个自签名CA,然后再给网站签署证书,更便于管理,而且安全性也更有保证。使用命令
/usr/lib/ssl/misc/CA.pl -newca
可以生成一个自签名的CA. 首先要输入私钥保护密码(必须),然后是其他信息,主要需要用户输入的信息为:
  • Country Name - 国家名(美国US,中国CN)
  • State or Province Name - 行政省或州名 (Hubei, California)
  • Locality Name - 城市名(Wuhan, Los Angeles)
  • Organization - 公司名(My Company)
  • Organizational Unit Name - 公司中的部门名称(Network Security Department)
  • Common Name - 通用名(注意:这是最重要的部分,它是区分你跟其他CA的标记名,如果你在做一个自签名网站的话,这里应该输入网址。对于CA,输入XXX CA, My CA类似的名字)
  • Email Address - 管理员信箱不解释
下面除询问私钥密码时必须输入外(共三次密码输入中的第二次),其它问题应该都可以忽略。使用默认的配置生成的CA有效期有3年,修改可以在CA.pl中查找CADAYS设置。默认的签名证书有效期只有1年,在CA.pl中DAYS变量设置。
默认情况下证书加密使用的是1024bit,建议修改为2048bit以上,在/etc/ssl/openssl.cnf中
default_bits            = 1024
默认hash算法是sha1,如果需要可以选择更强的sha256或者sha512. 不建议使用md5. 也在此配置文件中修改。
2. 生成证书请求,不管是用自签名还是让可信CA签名,都需要首先生成证书请求。使用命令
/usr/lib/ssl/misc/CA.pl -newreq
输入信息方式同生成CA时。生成newreq.pem提交到自签名CA或者可信CA进行签名。不过为了后面安装设置方便,需要把当前私钥的保护密码删除(除非你想在每次apache启动时手动输入密码),命令为
openssl rsa -in newkey.pem -out newkey.nopass.pem
证书签名完成以后配置apache时,密钥文件使用应该使用newkey.nopass.pem,不要用newkey.pem.
3. 用自签名CA给签署证书请求,确保当前目录下存在demoCA和newreq.pem文件,命令为
/usr/lib/ssl/misc/CA.pl -sign
签名完成的证书在newcert.pem文件中。配置apache使用cacert.pem(demoCA文件夹内)、newcert.pem和newkey.nopass.pem三个文件即可实现https访问。
当然也可以直接在第一步的Common Name中输入网站名称,生成自签名证书,但是这样会有两个问题:一是管理不方便,机构内有几个网站,就需要用户导入几次证书,而使用CA的方式用户只需导入CA证书即可;二是密钥和证书在同一服务器上,如果安全出现问题比较麻烦,相比之下CA方式只要CA私钥安全吊销证书即可。

星期四, 十月 18, 2012

解决SMP平台程序GUI卡死问题,VirtualBox完美运行Mac OS X


VirtualBox提供Mac OS X比较完美的支持,选择单核时Lion安装上直接就能完美运行,速度相对来说还是比较快的。但是Mountain Lion在单核平台下却不能安装,安装进行到还剩4分钟时死机,双核安装没有问题。但是双核平台下不管是Lion还是Mountain Lion运行都不正常,程序GUI经常卡死,屏幕刷新不完全等错误,但是系统本身没有死机,强行退出程序后还能继续运行。原本以为是MAC的SMP调度算法和VirtualBox不兼容,但是根据这个帖子的说法,应该是很多Intel多核平台都存在的问题,而安装VoodooTSCSync这个插件可以解决此问题。
VoodooTSCSync可以在其官方主页下载,Multibeast没有提供(希望以后版本能集成),安装可以使用KextDrop(下载连接)。安装完后修改VoodooTSCSync的Info.php,找到IOCPUNumber字段,根据给虚拟机分配的核心数修改,双核如下:
<key>IOCPUNumber</key>
<integer>2</integer>
进入系统后可以用kextstat查看已经加载的kext列表,使用kextload -v [name.kext]可以手动加载内核模块,使用kextcache -system-prelinked-kernel和kextcache -system-caches可以重新生成kext cache,使用system_profiler|grep -i core可以看到核心数,Lion在/var/log/kernel.log中搜索tsc可以看到VoodooTSCSync模块加载输出的字符串,Mountain Lion在/var/log/system.log中
补充一点: 装了VoodooTSCSync后虽然卡死情况少了,但是并没有完全消失,所以对比下来还是单核平台下运行原生Lion稳定性最好。而且VoodooTSCSync好像只有当机器类型是Mac Pro的情况下才管用,机器类型在/Extra/smbios.plist内设置,相关内容如下
<key>SMfamily</key>
<string>Mac Pro</string>
<key>SMproductname</key>
<string>MacPro3,1</string>>