Hexcles Ma

关于Linux Shell的信号trap功能你必须知道的细节

信号处理(Signal Handling)在 Linux 编程中一直扮演者重要的角色,几乎每个系统工具都要用到它,最常见的功能莫过于用信号进行进程间通信(尤其是父子进程)以及捕捉SIGINT、SIGTERM之类的退出信号以做一些善后处理(cleanup)。C中自不必多说,可以使用 wait 族函数;而 shell 脚本中也有捕捉信号的 trap 功能——然而许多人在使用 trap 功能的时候却存在着这样那样的误解,这些看似无关紧要的小细节最后有可能使得你的脚本与你预想的行为完全不同。

Read More

浙江大学紫金港校区宿舍Linux上网详解

首先,这篇文章是一篇WHY-TO,面向所有Linux操作系统(或者说偏向gentoo、arch之类习惯自己折腾的系统),而不是HOW-TO。小白或者懒人想要快速解决问题的,请看cc98 Linux天地置顶贴:【HOWTO】ubuntu下如何上网(需要浙大内网访问)。

前言:

紫金港宿舍区上网主要有两种方式:一、连接内网后使用学校VPN访问外网(通过设置路由表可以实现内外网同时访问),而连接内网的方式又分为闪讯和201卡两种;二、使用闪讯或201卡直接连接外网(可以使用RVPN来实现内外网同时访问)。

闪讯这东西短期内在Linux下是没有能够正常使用的可能了。而201卡连接外网的资费又是一小时一元,实在承受不起。所以唯一可行的方案只剩下使用201连接内网后用VPN连接外网。其实VPN上外网性价比也是很高的,如果不追求网速的话,10元一月的教育网出口就够用了;就算有网速需求,50元一月的电信出口也并不算贵(闪讯4M包月也是48元)。

接下来我们就按照201卡、VPN、路由的顺序来详细介绍上网设置。

Read More

VPS选购记(下)

在上一篇中我概述了常见虚拟化技术、几大VPS商以及我的VPS选购准则。这一篇中,我将用我的亲身经历,来介绍这两个月来我使用YardVPS和BurstNet的感受,以供各位借鉴参考。提前声明一句——我不是任何一方的枪手(我也不会在文章里贴上任何邀请链接),我将尽量做到客观、准确。不过由于VPS的特殊性,受邻居、网络环境等等影响很大,我的经历也不一定具有普遍性,仅供参考。
Read More

VPS选购记(上)

之前我的博客一直是放在和别人一起合租的ixwebhosting旗舰计划上,虽然流量、空间都是无限量,但毕竟只是个虚拟主机,再加上又是合租,各种不方便(网页服务器用的居然是apache1,网速也实在一般)。而且最近我对翻墙的需求越来越大,GAE又不够稳定,最终决定买一个VPS建站、翻墙。于是就有了这两个月来的坎坷经历……
Read More

Linux系统时间杂谈

1. 时间准确重要么?

很多人都认为系统时间是个无关紧要的东西,大概准确就行了,就算差个半小时只要自己不误会也没问题。但是,这在当今与网络联系密切的现代操作系统上也许并不是那么一回事——尤其是Linux。

Linux最大的用途就是服务器了。作为一台服务器,时间准确是十分重要的,以防出现一些奇怪的情况——例如一台邮件服务器时间快了,别人收到的邮件也许就会是来自“未来”的了。相信运维们都很了解时间的重要性,我也不再赘述了。

不过也许很多人不知道的是,桌面系统时间不准确也会引发问题。我这几天在GNOME 3中就遇到了一个由时间引起的诡异问题:GNOME 3.2中引入了“在线账户”(GNOME Online Account),可以与在线账户同步文档、聊天、联系人等等,目前暂时仅支持Google。但几天前,我的在线账户突然间授权失效了,重新登陆也不行,总是获取token失败。查看Debug输出、日志等等,都没有发现什么有价值的线索。后来无意间我发现系统时间慢了半小时,调整之后再尝试登陆在线账户,竟然成功了。原来是由于系统时间偏差过大引起的。

其实类似的问题在很多“time-based”的token验证系统(简单说来就是根据当前时间产生token的系统)上都会发生,如果系统时间偏差过大将会导致验证失败。
Read More

禁用libata的acpi功能以解决Linux硬盘假死问题

这两天我把系统换成了Archlinux,在用livecd引导启动准备安装时就遇到了问题——启动过程极其漫长;而在安装软件包、高强度读写硬盘时,也出现了假死问题。

类似的问题在进行了系统升级后仍然存在,具体表现为:启动、编译软件、使用hdparm等高强度I/O时,系统假死,在/var/log/errors.log中可以看到以下记录:

1
2
3
4
5
Jan 20 15:41:01 localhost kernel: [   34.400019] ata1.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x6 frozen
Jan 20 15:41:01 localhost kernel: [   34.400044] ata1.00: failed command: READ FPDMA QUEUED
Jan 20 15:41:01 localhost kernel: [   34.400064] ata1.00: cmd 60/08:00:a0:5e:38/00:00:3a:00:00/40 tag 0 ncq 4096 in
Jan 20 15:41:01 localhost kernel: [   34.400066]          res 40/00:01:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
Jan 20 15:41:01 localhost kernel: [   34.400103] ata1.00: status: { DRDY }

(另外几次假死有的是WRITE FPDMA QUEUED。)

可以看到在假死的时候出现了ata frozen,ncq错误,无法完成读/写队列。上网查询,发现论坛、bug tracker、Q&A上有大量相关的信息,错误日志与此类似,可是大都没法彻底解决——归根究底是以上的日志信息太少,只说明了是ata错误,读取超时。通过其他多方面测试、尝试最终可以知道,这些大都是硬件软件配合问题造成的——对于某些控制器、驱动器,内核ata模块的acpi、ncq等功能无法正常工作,导致I/O错误。解决方法有的需要更换硬件,有的需要更新固件,还有的需要使用内核参数,禁用某些功能或是限制SATA速度。

其中数量比较多的一种就是libata的acpi节能功能有问题,导致硬盘供电不足。根据网络上的说法,在大容量硬盘上这个bug也更容易出现。我的这个硬盘就是新买的500GB 7200转,功率比较大,经过尝试,确实是这个bug导致的。

截止发文之时,没有找到相关补丁,只有一个简单直接的workaround:禁用libata的acpi功能。方法很简单,也没有太多副作用,只要添加内核参数(写入GRUB的启动参数即可):

1
libata.noacpi=1

PS1:不建议直接禁用全部的acpi功能(即使用 noacpi 参数),此将禁用所有的高级电源管理功能,可能导致休眠、挂起以及笔记本亮度调节失效等等副作用。

PS2:ACPI是Advanced Configuration and Power Interface(高级配置与电源接口)的缩写。而与之相似的APIC是Advanced Programmable Interrupt Controller(高级可编程中断控制器)的缩写,与扩充硬件中断有关,与引起Linux诸多问题的ACPI基本毫无关系,请不要混为一谈,随意禁用APIC。

Fedora中的kmod与akmod

Linux Kernel有一大特性就是模块化,通过kernel module(内核模块,Fedora中缩写作kmod)来扩展内核功能(cf. what is a kernel module?)。最常见的一类内核模块就是驱动程序(driver)。由于许可证或使用规模等原因,一些硬件的驱动无法进入kernel,只能通过内核模块的形式来加载使用。在Fedora中如果你启用了rpmfusion-nonfree源,你会看到大量kmod-打头的软件包,大多都是rpmfusion帮我们编译、打包好的各类私有驱动(比如nvidia、ati的显卡驱动,broadcom的网卡驱动等等)。但是,你也许会注意到,几乎每一个kmod-*软件包都有一个对应的akmod-*软件包,而很多“私有驱动安装教程”都是直接让你把两个都装上。那么,这两个到底有什么区别呢?
Read More

Fedora 15下Adobe Air无法安装程序

UPDATE: ADOBE已经正式宣布停止更新AIR FOR LINUX(难怪之前对BUG汇报视而不见),看来之后LINUX用户就要和AIR说再见了,什么用AIR实现跨平台最终还是成为了一场梦,还是拥抱WEB吧。

上周冲着GNOME3装了Fedora 15 Lovelock,放弃了从接触LINUX以来就一直在使用的Ubuntu(准确的说,是删掉了Ubuntu 11.04,实在受不了Unity了)。从安装到后来的配置确实都让我不大不小地折腾了一番,这些等到以后有空的时候再细细说吧。今天我就想说说发现的一个BUG——Adobe Air在Fedora 15下无法使用,准确说是无法安装Air程序包。
Read More

在博客里启用社会化分享按钮

最近突然想起来,我的博客居然一直都没有放置社会化分享按钮,很不合社交网络化和网络社交化的潮流。于是决定在博客文章下方放置分享链接。本以为是个容易的事儿,去各个社交网站找一下分享按钮的代码放上去就是了,就像上次做那个快捷订阅侧边栏一样。可实际做起来才发现不是那么容易——社交网站实在是太多了!一个个手工去找实在麻烦。就想去弄一个插件来解决。

Read More

小修博客主题 – 以及暂别

唔,其实本来是想换个主题的,但是最后懒得折腾,就作罢了。翻出在用的notepad主题的设计说明,看了一会以后决定弄一下header,加一个banner上去。

Windows已经被干掉了,自然也就没有了Photoshop。这次完全是用Gimp做出来的。图片素材来自很早以前蛋疼做的宣传画(摊手~鄙人设计水平也就这样了……)。

顺便也改了主题的CSS,一些小地方,大家应该注意不到……T.T只是为了看着更顺眼而已~

算上前两天整理的侧边栏,这次博客主题应该差不多折腾好了,会固定一阵子。

最后,明天就要去参加省选冬令营了,然后是省队选拔赛——决定我日后走向的比赛。因此这段时间肯定不会再更新博客了。至于比赛以后,如果成绩好就要更加努力准备二试,成绩不好估计就要和信息组say goodbye了——总之闲工夫是越来越少了。各位,后会有期吧!

P.S.其实这段时间挺颓废的,生病的时候尽在折腾东西了,本来也想写一些来记录的,现在也只好作罢。有机会再说吧~