选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……
祸不单行。继 老婆 笔记本坏掉之后,我的也在周一突然坏掉了。因为已经过保,找来 Dell 的维修手册做了初步诊断之后认为是主板问题,简单尝试了下没有修好,所以找老板商量,暂时买了一台 Asus G75VW 来用。
这是一款游戏用移动式PC。不兼容的状况包括:
我首先在预装的 Windows 系统中制作了一份恢复 DVD(共4张)。当然,如果不打算恢复 Windows 系统的话是可以跳过这一步的,升级 BIOS 可以通过 U 盘来完成。
用 LiveFS 安装 FreeBSD。由于 FreeBSD 目前还没有提供基于 EFI 的引导加载器(2012年的 Google SoC 项目有一个是关于 EFI 引导加载器 的),因此只能先破坏掉硬盘上现有的 GPT 分区。
gpart destroy -F ada0
dd if=/dev/zero of=/dev/ada0 bs=512 count=34
dd if=/dev/zero of=/dev/ada0 bs=512 oseek=/* LBA - 35 */ count=34
接下来的安装就和普通的 MBR 安装一样了。
目前知道的一些其他事项。
由于采用的是 Ivy Bridge 的 Core i7,因此可以用 AES-NI 来加速。向 GELI 卷写 1MB 的随机数块的速度可以稳定在 33MB/s;写 0 数据块的速度可以稳定在大约 60 MB/s。对于全加密的卷来说,第一次使用之前应该覆写一遍加密的随机数,而不是 0。(当然,这个架不住有人拿 $5 的扳手揍你到说出密码为止)(当然,其实根本没人 care 你的硬盘上存的是啥)。
Read more...时间过得真是太快了。最近这段时间, 乔帮主 2005 年 Stanford 毕业典礼演讲 里说的那段话一直让我觉得有如芒刺在背:
Your time is limited, so don't waste it living someone else's life.
Don't be trapped by dogma - which is living with the results of other
people's thinking. Don't let the noise of other's opinions drown out
your own inner voice. And most important, have the courage to follow
your heart and intuition. They somehow already know what you truly
want to become. Everything else is secondary.
来美帝快 6 年了, FreeBSDChina.org 也已经 10 周年了。我想,接下来的十年,我需要做一些新的事情,认识一些新的人,去一些新的地方,等等等等。所谓 Keep looking, don’t settle,这话说起来容易,做起来没那么容易,可是趁着年纪不算太大,还是要尽量去做。
Read more...计时攻击是一种通过观测由于某些操作时泄露出来的时间信息来获取更多信息的攻击。由于设计和实现的不同,攻击者能够通过计时得到的信息也会不一样。简而言之,作为安全系统的设计者,必须对可能泄露信息的各种渠道有充分的了解,并针对它们采取因应措施。
今天在和人讨论的时候想到一个例子,这里记下来。
为了阻止采用 GPU 穷举,我们可能会使用一些增加轮数的散列算法。一个设计不完善的登录系统的登录流程大致如下:
假定我们采用了一种够慢的算法来计算散列值,上述流程的问题便是,假如用户不存在,尽管攻击者观察到的提示是一样的"用户名或密码错误",但这个提示出现的时间可能会比用户存在时慢一些。这样,这个登录系统便透露了"用户不存在"这样的信息。
补救的办法是在用户不存在时,也根据同样的算法计算一下散列串,然后再提示"用户名或密码错误";还有一种办法是增加一个随机的延时。具体采用什么样的做法,要看具体的应用场景。
Read more...sh(1) 脚本中,` 和 $() 的作用类似。比如:
rm
find /foo/bar -ctime +3d -type f`` 【注1】
表示将 find 的输出结果作为rm的命令行输入。
常写 sh(1) 脚本的人可能会用另一个写法:
rm $(find /foo/bar -ctime +3d -type f)
这个写法和第一种是等价的。不过,$()的好处是可以嵌套。
个人比较倾向于使用 ` 而不是 $(),主要有三个原因:
【注1】FreeBSD系统中,此处实际可以用 find /foo/bar -ctime +3d -type f -delete
来代替。
常见的场景是由于某种原因 ls 无法使用(内存不足、动态连接库丢失等等)。
因为 shell 通常可以做 * 扩展,所以我们可以用:
echo *
来列出当前目录中的文件。
Read more...FreeBSD 开始用 10 以上的版本号有一段时间了。这个变动立刻导致了大量 ports 无法编译,多数情况下是因为开发者采用了较早版本的 libtool 导致的,具体来说,是类似下面的代码:
case $host_os in
freebsd[123]*) objformat=aout ;;
*) objformat=elf ;;
esac
解法是在星号前面加个小数点。
前段时间的半夜 make 总是在 OpenOffice 上通不过,结果发现是同样的原因。囧死了……当初匹配的时候打个.会死吗?
(这个问题已经在 libtool 2.4.2 以上版本中修正)。教训是,即使是代码生成器,重复的代码导致维护成本的增加。
Read more...目前多数软件产品的安全更新都是在周二或者周三公布了。这种做法 据说 是微软开始采用的,不过具体是谁先开始这么做,目前我还没有找到非常可靠的资料。
一般来说,软件开发者在发布安全更新之前,需要做下面这些事情:
而在用户这边,通常也需要进行少量的测试才可以大面积部署。由于时差的原因,周一或周五发表安全更新有可能会导致有些人必须在周末工作,因此不合适;周三发表安全公告会给 IT 人员留下充足的测试和部署时间,同时又避开了周末。
Read more...之前只有一篇关于较早版本的 strlen(3) 实现的笔记,这里补上我在 2010 年做的新增改进。
与 Pascal 等语言不同,C 的字符串并不保存串的长度,而是在字符串末尾以 nul 字符(’\0’)来表示字符串结束。这个设计决策是上世纪 60 年代作出的,有都市传说是为了省几个字节的空间,不过我个人认为也可能是因为汇编里面到处都是判断是否碰到了 0 的操作。不管怎么说,这个设计令 strlen 变成了一个 O(n) 的操作。
早期的 BSD Unix 采用的 strlen 是非常简单的循环比较每一个字符是不是 nul。1993年,J.T. Conklin 为 i386 系统撰写了一个汇编的版本,这个版本的核心用的是 REP SCASB,实际上和 C 版本的算法是一样的(不知道为什么 C 编译器不能写出同样的代码)。
为了配合 x86_64 平台,后来又有了一个新的汇编版本,这个版本的核心算法是按字匹配,找到包含 nul 字符的字之后,再在其中用原始的算法找到 nul 字符。
我在 2009 年根据这个 x86_64 版本的汇编的思路重写了一个 C 的版本,并在 2010 年做了一次最终的变动,形成了目前的版本。这个版本的大致流程如下:
实现细节
整个算法中,比较难理解的是判断字中是否带 nul 字符。具体的方法是计算两个中间变量:
a = (x - 0x01010101)
b = (~x & 0x80808080)
这里的 0x01010101 和 0x80808080 可以进一步扩展。第一步,如果每个字节都 <= 0x7f,只要那个字节不是 0,做差必然得到一个 < 0x80 的结果(换言之,最高位是0);如果有字节 >= 0x81,做差必然得到一个 > 0x80 的结果。对于等于 0x80 的情况,我们会得到 0x7f,但这并不重要。
Read more...最近两次失败记录的教训。
首先是联编 world 和 kernel (make buildworld buildkernel),这个没啥可说的。假定 / 是 UFS(即,可使用 nextboot),且配置了 watchdog,则操作步骤为:
shutdown -r now
mergemaster -Ui
当然,更简单的方法是先接好IPMI。
Read more...可以在 这里 下载。
和过去一样,风险自担 USE AT YOUR OWN RISK!
这个版本 (20120402) 和上一个版本 (20120114) 相比的改动:
全部改动来自 -CURRENT 或 -STABLE,并已经做过至少两周的疲劳测试。
Read more...