通过SMART查看磁盘健康状况

晚饭时与fruitcc聊天,提到服务器的维护,然后说到硬盘的保护。看起来硬盘是一个非常易损的消耗品,尤其是我们拿一个普通硬盘放在服务器中24小时来运行。然后他说我们可以使用工具来查看硬盘的SMART数据,其中就记录了硬盘的读写错误情况,从中可以发现硬盘的潜在危险。
回去后我上网搜了一下,发现在Ubuntu下可以使用一个叫smartmontools的软件包,其中有两个工具:smartctl和smartd比较好用。前者是命令行工具,后者是一个监控报警daemon程序。
简单的来说,运行 sudo smartctl -H /dev/xxx 可以得到一个硬盘状态报告,这个报告只有一个返回,即PASS或FAIL。后者表示在24小时内硬盘挂掉的可能性极高,基本就是需要立刻备份数据和更换硬盘。
运行sudo smartctl -a /dev/xxx 可以得到完整的报告,包括硬盘参数、SMART参数、各种SMART属性值、SMART错误日志和自测试日志等。
然后就是smartd,这个程序将作为一个服务运行,实时监控硬盘的健康状况,并记录警告信息甚至发送邮件。该程序使用/etc/smartd.conf 文件作为配置文件。配置文件中每行可写一个硬盘的配置(监控哪些属性、何时做自测试、发送邮件等),若所有硬盘都使用相同配置,则使用DEVICESCAN指令即可。文件中已经有一些示例配置了,基本够用,比如:
/dev/sda -a -s (S/../.././03) -I 194 -W 5,40,50 -m xx@yy.zz -M test
是对/dev/sda进行监控,-a表示监控所有属性,-I 194表示忽略194号属性的变化(194是温度,因为不关心温度的小变化,细致的温度监控使用-W参数),-s表示自测试设置,(S/../.././03)表示做short测试,时间是每天凌晨3点到4点之间,-W表示监控温度变化,5、40、50分别表示温度变化幅度、报告和发送邮件通知的阈值,-m后跟要发送邮件通知的地址,可写多个,用逗号分隔,-M test表示在deamon启动时发送一封测试邮件,可用来测试邮件是否能正确发送,我觉得还可以用来监测系统重启:)
这里发送邮件的话是使用系统的 mail 程序,因此要先安装mailutils包,然后使用命令sudo kpkg-reconfigure exim4-config来重新配置邮件程序,将其配制成第一项internet site即可正常发送邮件了。
最后是smartd的启动。比较奇怪的是Ubuntu源里面的smartmontools包并没有man说的/etc/init.d/smartd这个脚本,而是有一个/etc/init.d/smartmontools脚本,如果直接运行 /etc/init.d/smartmontools start是没有任何反应的。研究一下发现要先修改/etc/default/smartmontools文件,将其中#start_smartd=yes一行注释去掉即可。

Apache配置笔记之用户认证

有的时候我们需要访问某个页面的时候浏览器弹出一个用户名/密码的框来认证,这个功能是通过配置apache来实现的,而不需要在相应webapp来做。
一种简单的配置方法如下:
首先需要创建一个密码文件,记录所有允许访问的用户名和密码,比如我们要在/etc/apache2/pass中记录密码,则使用如下命令创建该文件并添加初始用户jeremy:
sudo htpasswd -c /etc/apache2/pass jeremy
此时程序会询问密码,设置完之后文件就创建好了。
以后要修改或添加用户时,只要把-c参数去掉就行了。-D为删除用户。
接下来就是使用了,在某个Directory的权限配置中加入如下几行:

AuthType basic
AuthName “name”
AuthUserFile /etc/apache2/pass
Require valid-user

其中name将出现在认证对话框中。

Linux下用户磁盘配额设置

磁盘配额看起来是一个很实用的功能,尤其是要为别人开相关服务的时候。基本需求是,限制某个用户的磁盘使用,包括限制其允许创建的文件数量和文件总大小。
经过一段时间的研究,现总结一下ubuntu下磁盘限额的配置方法,以便日后参考。
首先,安装相关软件:
sudo apt-get install quota
然后,为分区启用配额管理。也就是说,磁盘配额设置除了针对用户,还针对分区,即启用了配额的分区才能限制用户的存储。具体方法是,修改 /etc/fstab,在需要启用的分区的选项中增加一个 usrquota。如
UUID=7cd4722e-a8ad-4ee5-9d83-917867f25c91    /    ext3 usrquota, relatime, errors=remount-ro 0 1
重新加载该分区,如
sudo mount -o remount /
然后启动配额服务:
sudo /etc/init.d/quota start
这一步可能比较慢,尤其是该分区已经有大量文件的时候。
然后就可以设置用户的配额啦,使用命令 sudo edquota username
此时会打开一个vi界面 如

Disk quotas for user jeremy (uid 1000):
   Filesystem                                     blocks             soft             hard         inodes         soft         hard
   /dev/sda1                                                24                    0                    0                    7                0                0

blocks和inodes表示用户已使用的文件大小(x1k)和文件数,soft和hard表示相应的限制。hard表示该用户使用的存储无法超过该数量,而当用户使用的存储超过soft限制时,系统不立即作出相应,而是超过一定的时间之后用户若还没有将其使用量降低到soft限制之下的话,系统将自动将soft转为hard,即用户无法再使用更多的空间。这里的超时时间是针对分区的,而不是用户,可使用 sudo edquota -t 来修改。

Thinkpad电源问题两例(拔鼠标唤醒以及待机耗电)

最近发现新买的本本是有两个和电源相关的问题,一是当我插着USB鼠标待机后,只要一拔鼠标,机器就自动唤醒了;二是每次睡眠(待机)似乎都很耗电,一晚上能用掉1x%的电。我在CMOS里面找不到相关的设置,于是开始怀疑是不是硬件有问题。
后来在网上查了一下,这些原来都是vista的设置问题。即默认情况下,vista会让USB鼠标唤醒计算机,关闭的方法是在设备管理器里面找到鼠标,在其属性的“电源管理”标签下把“允许此设备唤醒计算机”禁用即可。
至于耗电,也是与唤醒设备有关。使用powercfg -querydevice wake_armed可以查看当前可唤醒计算机的设备。可以发现有一个High Definition Audio的设备在列表中,将其唤醒功能禁用即可。

Firefox重复提交请求问题

最近发现一个很奇怪的问题,就是Firefox访问页面的时候经常会提交两次请求,而且并非所有页面都是这样。但是在IE下就是没问题的。
明明就是一个普通的link,为什么ff会重复请求呢?去google了一把,发现原来问题不是出在link上,而是在返回的页面中。
原因就是在页面中存在src为空的img(其他资源估计也会引起这个问题),在Firefox下,浏览器会将该src自动替换成当前页面url,所以就重复请求了。
解决方案很简单,就是将src写一个初始值,比如blank.gif,这样ff下表现就正常了。

IE6的iframe cookie问题

今天发现了一个很隐蔽的IE问题,就是在IE6中iframe内的页面无法设置cookie。这样导致了无法在session中保存变量(使用session的话需要浏览器记录一个session_id的cookie)。
去Google上搜了一下,通过某论坛的一个链接最终到达了msdn的帮助页面,上面列出了对此问题的解释以及解决方案。
引起这个问题的主要原因是安全性设置。IE6由于默认的安全设置不允许在iframe中设置cookie。解决问题的方法也很容易:在response头部增加一个属性:
P3P: CP=”CAO PSA OUR”
即类似于: response.addHeader(“P3P”, “CP=\”CAO PSA OUR\””);

官方页面
Session variables are lost if you use FRAMESET in Internet Explorer 6

Hibernate笔记之关联查询(别名)

自从使用了Criteria来进行数据库查询之后,越来越觉得直接写query语句很麻烦。由于本人对hibernate及数据库一直没有进行深入研究,所以原来在使用criteria的时候始终会遇到一个问题,就是关联多层的查询无法完成。比如:
criteria.add(Restrictions.eq(“owner.name”, xxx));
这里面引用了owner对象(表)的name字段,查询时便会失败。
今天再次研究了一下,发现原来使用别名(alias)就可以解决这个问题。即先使用createAlias创建别名,然后使用别名来引用。方法如下:
criteria.createAlias(“owner”, “o”).add(Restrictions.eq(“o.name”, xxx));
还可以多层关联,比如:
criteria.createAlias(“owner”, “o”).createAlias(“o.company”, “comp”).add(Restrictions.eq(“comp.name”, xxx));
这样就类似于判断 owner.company.name == xxx

详细的机制等以后再慢慢研究啦

突破封锁访问sourceforge

今天在hibernate的网站上欲下载hibernate-tools的时候,发现下载地址是链接到sf.net的,于是很自然的,在伟大的Great Firewall的关怀下,页面超时了。
于是首先想到了turboprivacy,这是一个可以用来突破限制访问任何网站的页面代理。其基本原理是将要访问的url加密,这样就无法拦截了。地址如下:
http://turboprivacy.com

但是后来发现这样下载太慢,又去网上找了找,找到一个sf的镜像,如下:
http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/

速度还挺快,就是东西不是太新。不过在现在的条件下只能用上面的两个网站凑合了。

ubuntu中启用IPv6转发

启用转发首先想到的是修改/etc/sysctl.conf文件,把其中的net.ipv6.ip_forward=1一行的注释去掉。可惜我猜对了文件,但是没有猜到设置。
文件中的确有一行是#net.ipv6.ip_forward=1,可是当我把#去掉之后,重启发现ipv6依然无法被转发,于是我手动执行了一下 sudo sysctl -p,发现系统竟然不认net.ipv6.ip_forward这个key。
上网搜了一下,正确的写法是
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1

Java获取URL文件超时问题及本站更新

       若想在Java程序中访问某个http或ftp等url指向的文件,最方便的方法莫过于使用URL类了。直接使用URL对象的openStream方法即可。本blog系统的左侧好友blog列表更新其实就是通过这个方法来实现的,但是直接使用openStream有一个问题,就是它的默认超时时间是0,也就是永远不会超时。这样,对于一些较慢的网站可能会阻塞很长时间,甚至出现死锁。因此我的好友列表文章也经常会出现更新不了的情况(我估计是这个原因)。
       今天搜了一下有没有可行解决方案(btw,这种技术性问题还得是google),发现其实要解决也很容易,只要先使用url的openConnection方法获得一个HttpUrlConnection对象,然后该对象有setConnectTimeout和setReadTimeout两个方法,分别设置两种超时,设置完之后再调用该connection的getInputStream获得流即可。其实url的openStream就是把openConnection和getInputStream连起来调用了。
       希望这样修改后能解决好友博客列表的更新问题。