delphij's Chaos
选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……
最近找时间做了一个家用的路由器。用基于 Intel Atom 处理器的解决方案并不便宜(与传统的嵌入式解决方案相比),但因为软硬件都是 x86,因此开发起来会方便一些。另一方面,Atom的计算性能要远高于其他的传统嵌入式方案。
配置:
SMCI这款X7SPA-H主板采用的是ICH9R芯片组,有6个SATA接口,支持AHCI。采用4G内存的原因主要是希望使用ZFS,同时作为存储服务器使用。由于空间原因,这款CPU使用被动散热片。
PC-781机箱可以配置外接的直流电源(类似笔记本的电源)。采用这种配置的考虑是外接电源不需要使用风扇散热,整个机箱总共只有1个小风扇(题外话:因为功率不大,实际上这个风扇并不是必须的),从而减少噪声。
由于没有光驱,因此使用U盘以memstick映像来安装。在 sysinstall 中选 FixIt » USB 之后就可以手动安装了。
关于磁盘布局:WD AV-25使用的是WD的"Advanced Format",即4k扇区的格式。由于对系统而言扇区仍然是512字节,因此在分区时应以8扇区对齐。这块硬盘的GPT分区为:
34开始,94扇区:boot
128开始,16777216扇区:swap
16777344开始到结尾:zfs
(待续)
Read more...早期版本的 FreeBSD 有一个问题是,如果使用 ntpd 来校准系统时钟的话,如果长期开机,则在重启之后,时间会差很远,之前一直没仔细研究这个问题。最近突然发现 FreeBSD 8.1-RELEASE 里面没有这个问题了,于是翻看了一下代码和之前的一些邮件才明白是怎么回事,总结一下:
一般来说操作系统在引导以后会自行维护时钟,简单地说,就是操作系统根据某个时钟源,例如单CPU系统中的TSC,或多CPU系统中比较常用的高精度事件计时器HPET等等,计算出时间的流逝并修改系统时间。只有在系统刚刚引导的时候,才会直接取 RTC 时间(在关机时,主板上的电池仍可维持 RTC 电路的计时功能)。
我们知道,任何测量工具都是有误差的,普通的 PC 系统上配置的计时装置肯定不会做的非常精密,这也是我们为什么要运行 ntpd 的主要原因。在系统运行的过程中,这些误差不断地积累,使用 ntpd 时,系统可以计算出所采用的时钟源与实际的时间之间的误差,并逐步调整时间源的计数周期与实际时间的比例,从而维持系统时钟的精确性。
在重启时,在内存中维护的系统时刻数据便随之丢弃了,操作系统再次启动时读取的是先前未经修正过的、继续在积累误差的 RTC 时间数据(注意:RTC是不依赖于OS运行的;OS可以修改其时刻数据,但无论开机还是关机,只要维持其需要的电流即可确保 RTC 继续自行更新,而无需 OS 干预)。
FreeBSD先前的实现中,只有非常少的地方调用了 resettodr(9) 来修正 RTC 时间,这些地方主要是settimeofday()之类的直接设置内核时刻数据的点,而对于 ntp 的情况,则没有相应的处理。
新的实现 (以r207360为主体,包含r207359, r207362)则增加了一个callout,每半小时将系统时钟刷回RTC一次,从而解决了这个问题。
关于为什么不应该使用 ntpdate 来对时(ntpdate会使用settimeofday()),请参考 A core 的 这篇 介绍 NTP 的文章,以及我的 这篇 文章。
Read more...这几天改 FreeBSD 的 coretemp(4) 遇到了一个问题。直接使用 rdmsr 的话,如果那个 MSR 不存在,则会触发 #GP(0),不了解 CPU 型号的情况下直接去杵肯定是不行的。后来翻了一下 cpuctl(4) 的代码发现 FreeBSD 上也有 rdmsr_safe。它的实现并不复杂( sys/amd64/amd64/support.S):
movq PCPU(CURPCB),%r8 // %r8 = PCPU(CURPCB); 将当前CPU的编号保存到r8。
movq $msr_onfault,PCB_ONFAULT(%r8) // 设置发生异常时调用msr_onfault。
然后是翻译 AMD64 ABI:
movl %edi,%ecx // 参数1放到ecx
rdmsr // 实际执行rdmsr(将ecx指定的MSR的高、低32bit结果放到edx、eax中)
salq $32,%rdx // rdx <<= 32
movl %eax,%eax // 将rax最高32 bit清零
orq %rdx,%rax // rax |= rdx
movq %rax,(%rsi) // rax 存入 *rsi
xorq %rax,%rax // 返回值默认为0
最后恢复先前的异常处理状态。
Read more...SSH提供了很多种不同的身份验证,其中最常用的两种便是密码验证和基于公钥/私钥的身份验证。
基于公钥/私钥的身份验证有非常多的优点。
首先,公钥/私钥可以从根本上挫败监听来截取验证信息的企图。
公钥/私钥验证本质上是一种 零知识证明。即,在身份验证的过程中,服务器并不需要知道用户的私钥是什么。【注:公钥/私钥验证并不是零知识证明,感谢 snnn 指正。】
公钥/私钥验证在身份验证的过程中,服务器只需要知道用户的公钥,而用户则使用自己的私钥对一组数据签名,并在服务器端进行验证。服务器并不需要知道用户的私钥。目前为止,还没有有效的方法能从这些信息推导出私钥。
与密码相比,这种方法有显著的优点:在验证身份的那一方,没有任何办法可以拿到用户的私钥,即使获得了那台机器的root权限。验证信息只能使用一次—-这意味着,也没有办法把这个验证信息用于在其他地方再次验证身份。
其次,公钥/私钥要比密码长的多,因而可以挫败通过穷举的方式破解的可能性。
典型的密码是8位字符,假设可以使用大小写字母、数字和特殊符号,可选的范围无非是96^8而已,我们不妨算它128^8。典型的私钥有2048个bit,如果按7个来分组的话,有128^(2048/7)。当然,最高位和最低位一定是1,但向下取整,也有128^292种。
最后,除了吃点带宽之外,SSH口令穷举对于仅采用公钥/私钥验证的服务器安全不构成任何威胁。
通过适当的配置sshd,可以让其直接明确地告诉对方此处不支持口令验证,并且能够容易地将攻击者记录在案,并将数据反馈给防火墙来减少带宽的占用。
Read more...本文主要是笔记,不保证其正确性,也不保证其不导致死机、崩溃或任何其他问题。
CPU的Tj(max)值可以通过读 MSR IA32_TEMPERATURE_TARGET,即 0x1a2 来获得【1】。目前,Intel正式的开发文档中并没有明确对这一MSR进行说明。早期的CPU中,Tj(max)值需要加上40到50摄氏度,目前不清楚具体哪些CPU必须如此,但从公开文档来看,已知:
Xeon 7100系列需要加修正值。其中,150W TDP的CPU需要加50摄氏度;95W TDP的CPU需要加40摄氏度。【2】
Xeon 5200系列不需要加修正值。【3】从文字上推测,5200以后的系列都不需要加修正值。
Xeon 5400系列不需要加修正值。【4】
使用LGA771 SMT socket、L3 cache不超过8M的Xeon MP系列需要加修正值50摄氏度。【5】
双核 Xeon 2.8G 处理器(根据文档推测,Prescott、Nocona和Potomac系列)需要加修正值50摄氏度。【6】
系统总线800MHz的Xeon处理器需要加修正值50摄氏度。【7】
双核Xeon 5000系列需要加修正值60摄氏度(没错,是60摄氏度,不是50摄氏度)。【8】
Xeon 7400系列不需要加修正值。【9】
支持超线程的Mobile Pentium 4处理器需要加修正值50摄氏度,同时,这个值的范围是0-30摄氏度。【10】
姑且推断5200系列之后不需要修正值?(model 0x17之后)能够公开获得的文献中,提到这个寄存器最早的一份是2004年6月出的第一版。
FreeBSD目前不支持从这个MSR直接搞Tj(max)温度出来,我做了个patch,测试了Xeon L5630和Core i7 CPU,不过其他的暂时还没测过。
Linux驱动这部分逻辑很让人费解(drivers/hwmon/coretemp.c):如果读MSR得到了有效的值(80-120之间,而文档【1】上说的至少70度是存在的。如果读MSR失败,或驱动认为值无效,则用了一套相当奇怪的逻辑去猜测实际的数值,某些型号的Atom使用旧的逻辑去判断,等等。问题是(1)这段相当的混乱,而且与文档有很多不一致的地方;(2)为什么不先判断CPU型号再访问MSR呢?
参考文献
【1】CPU Monitoring With DTS/PECI。Intel 文档编号322683。
【2】Dual-Core Intel® Xeon® Processor 7100 Series Datasheet.Intel 文档编号314553。
【3】Dual-Core Intel® Xeon® Processor 5200 Series in Embedded Applications, Thermal/Mechanical Design Guidelines。Intel文档编号319012。
【4】Quad-Core Intel® Xeon® Processor 5400 Series, Thermal/Mechanical Design Guidelines。Intel文档编号318611。
Read more...“如果我当年去问顾客他们想要什么,他们肯定会告诉我:‘一匹更快的马。’” 这告诉我们:顾客的意见虽然重要,但是只问用户的意见是做不出突破性的新产品的。
Read more...FreeBSDChina 最近又出现了很多垃圾广告等信息。针对一些常见的灌水机实现了一些临时的workaround,并且删除了大约3万2千的用户。
越忙越有人添乱。
补充:为论坛的链接增加了 rel=“nofollow” 的标记。
Read more...nginx可以作为很多种不同的用途。对Web服务器来说,nginx可以直接用作https服务器,也可以用于为现有的http Web服务器作为前端代理和负载平衡的同时提供https之用。
nginx支持TLS协议的SNI扩展(Server Name Indication,简单地说这个扩展使得在同一个IP上可以以不同的证书serv不同的域名;较早前唯一的办法是签署一个通配证书,即 CNAME 中为 *.delphij.net 这样的证书)。不过,SNI扩展还必须有客户端的支持,另外本地的密码学函数库,例如OpenSSL也必须支持它。
如果启用了SSL支持,nginx便会自动识别OpenSSL并启用SNI。是否启用SNI支持,是在编译时由当时的 ssl.h 决定的(SSL_CTRL_SET_TLSEXT_HOSTNAME),如果编译时使用的OpenSSL库支持SNI,则目标系统的OpenSSL库只要支持它就可以正常使用SNI了。
FreeBSD 8.0起的所有版本附带的OpenSSL均启用了SNI支持。这一特性是OpenSSL 1.0才开始默认启用的新功能,如果系统不是 FreeBSD 并且采用的是较早版本的 OpenSSL, 可能需要自行重新编译,并在config的时候指定enable-tlsext。注意:OpenSSL在多数系统中都有重要的其他用途,重新安装OpenSSL时,最好不要与厂商采用的参数差别太大;另外还有一种解决办法是安装到不同的目录并在运行程序的时候指定搜索路径或静态联编;FreeBSD不需要做这些配置,故不再赘述。
检查nginx是否支持SNI的方法是使用 nginx -V
来查看。
nginx version: nginx/0.8.45
__TLS SNI support enabled__
configure arguments: --prefix=/usr/local/etc/nginx --with-cc-opt='-I /usr/local/include' --with-ld-opt='-L /usr/local/lib' --conf-path=/usr/local/etc/nginx/nginx.conf --sbin-path=/usr/local/sbin/nginx --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx-error.log --user=www --group=www --with-ipv6 --http-client-body-temp-path=/var/tmp/nginx/client_body_temp --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp --http-proxy-temp-path=/var/tmp/nginx/proxy_temp --http-scgi-temp-path=/var/tmp/nginx/scgi_temp --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi_temp --http-log-path=/var/log/nginx-access.log --with-http_gzip_static_module --with-http_ssl_module --with-http_stub_status_module --with-pcre
以上标红的一行表示以目前的方式运行nginx时可以使用SNI。
使用SNI并不需要额外的配置,对nginx来说只需和HTTP主机一样配置多个https主机的server配置段即可。
以下是nginx中用于TLS的配置。可将其保存为一个单独的文件,例如 tls_param:
listen 443; # 端口(IPv4)
listen [::]:443; # 端口(IPv6)
ssl on; # 启用SSL
ssl_session_timeout 5m; # SSL会话超时时间
ssl_protocols TLSv1; # 只启用TLSv1
ssl_ciphers TLSv1:+HIGH:-MEDIUM:-LOW:-EXPORT:-aNULL:-eNULL:@STRENGTH # 启用的加密算法,见下
ssl_prefer_server_ciphers on; # 协商时优先使用服务器指定的加密算法
采用的加密算法集具体请参见 OpenSSL 联机手册 ciphers(1)。这里只解释采用的选项:
Read more...2015-03-05更新:本文中部分干货已过时,本文本身也不再更新。请参阅 这张作弊条。
SSL/TLS协议中,服务器证书是用于向客户端证明服务器身份的凭据,同时它还向用户提供了服务器的公钥,而服务器公钥则可以用来建立客户端到服务器的安全通讯(具体的通讯流程要比这个复杂,纯从技术而言,服务器的公钥主要用于与客户端进行会话密钥的协商)。
服务器的公钥只能确保拥有私钥的服务器(或人)能够解密信息,但它本身并不能确认服务器的身份。在实践中有很多种不同的方法来确保公钥确实来自受信任的服务器,在通常的SSL/TLS协商过程中,采用的方法是根据证书链来逐层验证公钥是否是有效的及其身份。简单地说,就是以安全的方法(例如安装光盘,或互相认证的签名等)事先将证书链上的某一个或某几个证书发给客户端,以便其验证最终用于服务器的安全证书。关于这一流程的具体细节,已经有很多文章进行了介绍,在此不再赘述。
如此,我们在实现采用SSL/TLS的服务器的时候,需要为证书准备的事项包括:
有了这些信息,就可以制作证书申请(CSR)供发证机构去签名了。一般来说,发证机构需要首先验证申请人的身份信息,然后对CSR提交的信息进行核对和签名,并将签名之后的证书发给申请者,或供其下载。下面以 FreeBSD、OpenSSL 为例介绍从生成公钥/私钥对到签发、安装证书的全过程。
Read more...一两个星期里,各地的大学都有毕业的班次,都有得多的毕业生离开学校去开始他们的成人事业。
学生的生活是一种享有特殊优待的生活,不妨幼稚一点,不妨吵吵闹闹,社会都能纵容他们,不肯严格的要他们负行为的责任。现在他们要撑起自己的肩膀来挑他们自己的担子了。在这个国难最紧急的年头,他们的担子真不轻!我们祝他们的成功,同时也不忍不依据自己的经验,赠他们几句送行的赠言,—-虽未必是救命毫毛,也许做个防身的锦囊罢!
你们毕业之后,可走的路不出这几条:绝少数的人还可以在国内或国外的研究院继续做学术研究;少数的人可以寻着相当的职业;此外还有做官,办党,革命三条路;此外就是在家享福或者失业亲居了。
走其余几条路的人,都不能没有堕落的危险。堕落的方式很多,总括起来,约有这两大类:
第一是容易抛弃学生时代求知识的欲望。你们到了实际社会里,往往学非所用,往往所学全无用处,往往可认完全用不着学问,而一样可认胡乱混饭吃,混官吃。在这种环境里即使向来抱有求知识学问的人,也不免心灰意懒,把求知的欲望渐渐冷淡下去。况且学问是要有相当的设备的;书籍,实验室,师友的切磋指导,闲暇的工夫,都不是一个平常要糊口养家的人的能容易办到的。没有做学问的环境,又谁能怪我们抛弃学问呢?
第二是容易抛弃学生时代理想的人生的追求。少年人初次和冷酷的社会接触,容易感觉理想与事实相去太远,容易发生悲观和失望。多年怀抱的人生理想,改造的热诚,奋斗的勇气,到此时候,好像全不是那么一回事了。渺小的个人在那强烈的社会炉火里,往往经不起长时期的烤炼就熔化了,一点高尚的理想不久就幻灭了。抱着改造社会的梦想而来,往往是弃甲抛兵而走,或者做了恶势的俘虏。你在那牢狱里,回想那少年气壮时代的种种理想主义,好像都成了自误误人的迷梦!从此以后,你就甘心放弃理想人生的追求,甘心做现在社会的顺民了。要防御这两方面的堕落,一面要保持我们求知识的欲望,一面要保持我们对人生的追求。
有什么好方法子呢?依我个人的观察和经验,有三种防身的药方是值得一试的。
第一个方子只有一句话:“总得时时寻一两个值得研究的问题!“问题是知识学问的老祖宗;古往今来一切知识的产生与积聚,都是因为要解答问题,—要解答实用上的困难和理论上的疑难。所谓"为知识而求知识”,其实也只是一种好奇心追求某种问题的解答,不过因为那种问题的性质不必是直接应用的,人们就觉得这是无所谓的求知识了。
我们出学校之后,离开了做学问的环境,如果没有一二个值得解答的问题在脑子里盘旋,就很难保持求学问的热心。可是,如果你有了一个真有趣的问题逗你去想他,天天引诱你去解决他,天天对你挑衅你无可奈何他,—这时候,你就会同恋爱一个女子发了疯一样,坐也坐不下,睡也睡不安,没工夫也得偷出工夫去陪她,没钱也得缩衣节食去巴结她。没有书,你自会变卖家私去买书;没有仪器,你自会典押衣物去置办仪器;没有师友,你自会不远千里去寻师访友。你只要有疑难问题来逼你时时用脑子,你自然会保持发展你对学问的兴趣,即使在最贫乏的知识中,你也会慢慢的聚起一个小图书馆来,或者设置起一所小试验室来。所以我说,第一要寻问题。脑子里没有问题之日,就是你知识生活寿终正寝之时!古人说,“待文王而兴者,凡民也。若夫豪杰之士,虽无文王犹兴。“试想伽利略(GALIEO)和牛顿(NEWTON)有多少藏书?有多少仪器?他们不过是有问题而己。有了问题而后他们自会造出仪器来解决他们的问题。没有问题的人们,关在图书馆里也不会用书,锁在试验室里也不会有什么发现。
第二个方子也只有一句话:“总得多发展一点非职业的兴趣,“离开学校之后,大家总是寻个吃饭的职业。可是你寻得的职业未必就是你所学的,未必是你所心喜的,或者是你所学的而和你性情不相近的。在这种情况之下,工作往往成了苦工,就感觉兴趣了。为糊口而做那种非"性之所近而力之所能勉"的工作,就很难保持求知的兴趣的生活的理想主义。最好的救济方法只有多多发展职业以外的正当兴趣与活动。
一个人应该有他的职业,也应该有他非职业的玩艺儿,可以叫做业余活动。往往他的业余活动比他的职业还更重要,因为一个人成就怎样,往往**他怎样利用他的闲暇时间。他用他的闲暇来打麻将,他就成了个赌徒;你用你的闲暇来做社会服务,你也许成个社会改革者;或者你用你的闲暇去研究历史,你也许成个史学家。你的闲暇往往定你的终身。英国十九世纪的两个哲人,弥儿(J。S,MILL)终身做东印度公司的秘书,然而他的业余工作使他在哲学上,经济学上,政治思想史上都占一个很高的位置;斯宾塞(SPENCER)是一个测量工程师,然而他的业余工作使他成为前世纪晚期世界思想界的一个重镇。古来成大学问的人,几乎没有一个不善用他的闲暇时间的。特别在这个组织不健全的中国社会,职业不容易适合我们的性情,我们要想生活不苦痛不堕落,只有多方发展。
有了这种心爱的玩艺,你就做六个钟头抹桌子工作也不会感觉烦闷了,因为你知道,抹了六个钟的桌子之后,你可以回家做你的化学研究,或画完你的大幅山水,或写你的小说戏曲,或继续你的历史考据,或做你的社会改革事业。你有了这种称心如意的活动,生活就不枯寂了,精神也就不会烦闷了。
第三个方法也只有一句话:“你得有一点信心。“我们生当这个不幸的时代,眼中所见,耳中所闻,无非是叫我们悲观失望的。特别是在这个年头毕业的你们,眼见自己的国家民族沉沦到这步田地,眼看世界只是强权的世界,望极天边好像看不见一线的光明—-在这个年头不发狂自杀,已算是万幸了,怎么还能够保持一点内心的镇定和理想的信任呢?我要对你们说:这时候正是我们要培养我们的信心的时候!只要我们有信心,我们还有救。
古人说:“信心(FAITH)可以移山。” 又说:“只要工夫深,生铁磨成绣花针。“你不信吗?当拿破仑的军队征服普鲁士,占据柏林的时候,有一位教授叫做费希特(FICHTE)的,天天在讲堂劝他的国人要有信心,要信仰他们的民族是有世界的特殊使命的,是必定要复兴的。费希特死的时候,谁也不能预料德意志统一帝国何时可以实现。然而不满五十年,新的统一的德意志帝国居然实现了。
一个国家的强弱盛衰,都不是偶然的,都不能逃出因果的铁律的。我们今日所受的苦痛和耻辱,都只是过去种种恶因种下的恶果。我们要收获将来的善果,必须努力种现在新因。一粒一粒的种,必有满仓满屋的收,这是我们今日应有的信心。我们要深信:今日的失败,都由于过去的不努力。我们要深信:今日的努力,必定有将来的大收成。
佛典里有一句话:“福不唐捐。“唐捐就是白白的丢了。我们也应该说:“功不唐捐!“没有一点努力是会白白的丢了的。在我们看不见想不到的时候,在我们看不见的方向,你瞧!你下的种子早已生根发叶开花结果了!你不信吗?法国被普鲁士打败之后,割了两省地,赔了五十万万法朗的赔款。这时候有一位刻苦的科学家巴斯德(PASTEUR)终日埋头在他的化学试验室里做他的化学试验和微菌学研究。他是一个最爱国的人然而他深信只有科学可以救国。他用一生的精力证明了三个科学问题:(1)每一种发酵作用都是由于一种微菌的发展;(2)每一种传染病都是一种微菌在生物体内的发展;(3)传染病的微菌,在特殊的培养之下可以减轻毒力,使他们从病菌变成防病的药苗。
这三个问题在表面上似乎都和救国大事业没有多大关系。然而从第一个问题的证明,巴斯德定出做醋酿酒的新法,使全国的酒醋业每年减除极大的损失。从第二个问题的证明巴斯德教全国的蚕丝业怎样选种防病,教全国的畜牧农家怎样防止牛羊瘟疫,又教全世界怎样注重消毒以减少外科手术的死亡率。从第三个问题的证明,巴斯德发明了牲畜的脾热瘟的疗治药苗,每年替法国农家减除了二千万法朗的大损失;又发明了疯狗咬毒的治疗法,救济了无数的生命。所以英国的科学家赫胥黎(HUXLEY)在皇家学会里称颂巴斯德的功绩道:“法国给了德国五十万万法朗的赔款,巴斯德先生一个人研究 科学的成就足够还清这一笔赔款了。” 巴斯德对于科学有绝大的信心,所以他在国家蒙奇辱大难的时候,终不肯抛弃他的显微镜与试验室。他绝不想他有显微镜底下能偿还五十万万法朗的赔款,然而在他看不见想不到的时候,他已收获了科学救国的奇迹了。
朋友们,在你最悲观失望的时候,那正是你必须鼓起坚强的信心的时候。你要深信:天下没有白费的努力。成功不必在我,而功力必不唐捐。
原载1932年7月3日《独立评论》第7号
Read more...