delphij's Chaos
选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……
原則上,在 Internet 提供服務的機器,應提供對應的 whois 記錄,以便在出現問題時能夠與事主及時聯絡。北美地區的數字資源,例如 IP 地址、AS號等等,是由 ARIN 負責分配的。
對於比較小的地址塊, ARIN 通常並不直接分配(目前 ARIN 分配 IPv4 地址的最小單元是 /23)。往往這些小地址塊是從上游 ISP 獲得的,根據規定,上游 ISP 有責任為客戶註冊相應的信息備查。
在開始獲得 IP 地址之前,需要先到 ARIN 註冊 Web 賬戶和 POC Handle。POC Handle 隨後提交給 ISP 去做 SWIP 註冊。對應的表格是"ARIN-REASSIGN-DETAILED",填妥之後交給 ISP,由 ISP 去 ARIN 註冊。成功之後,在 ARIN 的 Web 賬戶裡就可以看到自己的 Org ID(未來在其他ISP也可以重複使用) 並進行管理了。
附帶說一句,ARIN在採用REST的Whois以後,whois信息的更新基本上是即時生效的了。在幾個月前,類似的操作需要多至一天才會反映到 whois 系統中。
以上。
Read more...今天去 中国驻旧金山总领事馆 换了护照,这里记下过程,希望对别人有用。
需要准备的材料:
具体过程如下:
工作日早上9点开车到达旧金山 Japan Town 的 停车场,然后从 Geary Blvd 上来(中国驻旧金山总领事馆的地址是在 1450 Laguna Street,但护照及签证处则是在 Geary Blvd 上,直接走过去即可)。停车的收费标准是 $2/hr。
进入签证大厅时需要通过安检。和美国驻华大使馆类似,这里原则上也不允许携带照相器材(不过这次专程从 Redmond, WA 飞过来换护照的老康同学还是带了手机),而且也没有地方可以存包,所以我把手机等物品都留在了车上。
进入签证大厅之后首先在右手边取号(护照换新和签证是两个不同的按钮)。由于之前没能准备小二寸照片,因此首先在左手边的拍照柜台拍照片,大约3分钟之后即可取得。由于现场拍照的人比较多,因此照片不会由照相柜台进行裁剪,而是由在护照窗口的工作人员将照片剪下。
换护照会把申请表、照片、原护照、复印件、现金支票、预付费的信封和排队的号收走。正常情况下,在办完之后申请人手里应该有下面这些东西:
由于来办理签证和护照的人都不少(美国西海岸多个州以及北加州都归旧金山总领事馆负责),因此要早去排队。从进门到办完全部手续所需的时间大约是60-90分钟。
Read more...VirtualBox可以在远程运行,并把界面通过 ssh 的 X11 转发放到管理员的桌面。
在 FreeBSD 上可以用 port 来安装 VirtualBox:
# portsnap fetch update
# cd /usr/ports/emulators/virtualbox-ose
# make install clean
接着配置 VirtualBox 所需要的内核模块:
echo 'vboxdrv_load="YES"' >> /boot/loader.conf
echo 'vboxnet_enable="YES"' >> /etc/rc.conf.local
将需要使用VirtualBox的用户添加到vboxusers组:
# pw groupmod vboxusers -m delphij
安装 xauth:
# cd /usr/ports/x11/xauth
# make install clean
重启系统,或手工加载模块之后,就可以从远程 ssh 进来运行 VirtualBox 了:
desktop% ssh -Y vsvc.example.com # 【注1】
vsvc% VirtualBox
VirtualBox的管理界面会出现在客户端系统上(当然,在列出文件时仍然是服务器端的文件)。
在安装、调试之后,就可以用VBoxHeadless来启动远程的虚拟机了。
【注1】这里使用的是"Trusted Forwarding",如果远程主机不可信,这样做会提高安全风险。
Read more...之前 @quakelee 提的一个问题(通道上登录第二台机器作为跳板登录第三台机器,但不把ssh私钥传到中间那台机器上)。如果shell是csh,在 ~/.cshrc 中加入:
source ~/auth.csh
[ -e ${SSH_AUTH_SOCK} ] || ssh-agent -t 15m -c > ~/auth.csh && source ~/auth.csh
然后所有的 csh 就可以使用同一个ssh agent了。
注意事项:
之前家里用的那个 Linksys WRT310N 路由器就有相当严重的问题(不排除是DD-WRT的问题),如果连续若干天不重启的话,无线网络的连接有时就会失败。部署新的路由器之后,设置了一个cron任务令其每天早上5:30重启:
30 5 * * * /usr/bin/ssh root@10.253.87.254 reboot > /dev/null 2>&1
当然,执行cron的那个用户需要使用ssh key来登录WRT310N,并事先将key传到WRT310N上面。
由于 FreeBSD 默认会对链路状态的变化进行记录,因此只要查看系统日志就可以知道cron是否真的执行了。
在之前的部分我们讨论过关于功耗的问题。在实际使用过程中,我发现 powerd(8) 对于 CPU 占用的计算是有问题的:它计算的是所有CPU的占用率之和,而比较合理的依据则是占用率最高的CPU的占用率。不过,对 Atom 来说 powerd 能够产生的影响有限,因此如果真在使用Atom系统的话不一定真的需要这个patch。下面这个patch可以让 powerd 更有效地 throttle CPU 的频率:
Index: usr.sbin/powerd/powerd.c
===================================================================
--- usr.sbin/powerd/powerd.c (revision 213306)
+++ usr.sbin/powerd/powerd.c (working copy)
@@ -127,6 +127,7 @@
{
static long *cp_times = NULL, *cp_times_old = NULL;
static int ncpus = 0;
+ int newload;
size_t cp_times_len;
int error, cpu, i, total;
@@ -151,7 +152,7 @@
return (error);
if (load) {
- *load = 0;
+ *load = newload = 0;
for (cpu = 0; cpu < ncpus; cpu++) {
total = 0;
for (i = 0; i < CPUSTATES; i++) {
@@ -160,8 +161,10 @@
}
if (total == 0)
continue;
- *load += 100 - (cp_times[cpu * CPUSTATES + CP_IDLE] -
+ newload = 100 - (cp_times[cpu * CPUSTATES + CP_IDLE] -
cp_times_old[cpu * CPUSTATES + CP_IDLE]) * 100 / total;
+ if (*load < newload)
+ *load = newload;
}
}
对路由器这样的设备来说,当有软件 bug 的时候,我们往往希望系统自己恢复并报告问题,而不是等待用户去用调试器现场调试。想要达到这个目的,可以使用 watchdog 机制。在这款主板上有两个 watchdog,其中系统没有自带的那个 Winbond watchdog 的驱动如下:
Read more...操作是否对齐是一个简单而容易忽略的性能(有时是可靠性)问题。对齐主要是指读写操作不产生不必要地跨越存储设备上原生存储单元的访问,这里的存储单元说的是在访问路径上的任何设备,它可以是外存,也可以是内存,甚至是CPU附近或内建的快取缓存,等等。
在C/C++中,对于内存的访问多数是在编译时可以预测的。一般来说编译器会在编译过程中自动对数据结构进行补足(除非由于某种需要而指定了__packed),并对可能产生这类问题的冒险行为,例如将一个较短的数据类型的指针cast成一个较长数据类型的指针进行警告。因此,在希望有较高性能的硬件平台上,不对齐的内存字操作往往会导致硬件异常(Alpha、IA64、SPARC64等)。但是对于便宜的PC硬件(x86和amd64)来说,为了保证和先前硬件的兼容性,它们往往会选择默默承受这样的问题,并在CPU的microcode中将这类操作转换成两次读操作。
通过仔细地编写C代码,可以在某些情况下减少非对齐或比字长短的操作,许多C的字符串处理函数都可采用这种方法。例如,在实现 strlen(3) 函数时,可以采取下面的策略:
上面只是关于 strlen(3) 采用的技巧的粗略介绍。当然,由于好的程序绝对不会将 strlen(3) 放在关键路径上,因此这个改进的现实意义并不太大。实际测试中,这个改进版本的 strlen(3) 平均比按字节比较的版本快5.2倍,而对非常短的字符串则只有最多16%左右的性能损失。
对于外围设备的操作对齐相对来说更复杂一些。例如,采用4k扇区的硬盘,或者采用RAID的磁盘阵列,其固件需要将写操作拆成和物理扇区或stripe同样的大小,将数据读出,然后再重写。这个过程比较耗时(实际测试显示,在 WD AV25 硬盘上,对齐的4k写操作和未对齐的4k写操作的IOPS可相差达60倍),对于RAID,如RAID5的情形,还可能进一步引发一致性问题。
要避免这类问题,唯一的办法是对存储格式进行合理的规划。例如,采用的记录尺寸应为块尺寸的整数倍(对于多数 Unix 文件系统来说这并不是问题),或采用日志的方式将写操作收集起来先行写入整个存储块,然后在提交阶段将写操作凑成整块来做。
不过需要注意的是,操作系统的存储驱动必须能够告诉文件系统如何对齐。FreeBSD中,这是通过g_provider对象的stripesize和stripeoffset属性来暴露给文件系统的。如果操作系统本身没有提供对齐支持,在分区时强制分区以整物理扇区,而不是整逻辑磁道(17个512 byte扇区)的位置开始,也可以在一定程度上缓解这个问题。
Read more...指望硬盘不挂掉是 很拼人品的事情(附带说一句,从某种意义上说,21世纪的硬盘质量并没有下降,只是单位容量出现故障的概率没有显著提高,而硬盘容量的扩大使得单块硬盘的故障率看起来提高了,但是如果我们从单位容量的故障率来看,坏损率并没有非常显著的增长)。所以想要长久地保存数据,就必须采用各式各样的冗余和备份手段。冗余和备份是不一样的,前者往往会采用同样的访问控制逻辑,提供在线或近线的数据存储,强调的是数据访问的及时性;而后者则强调的是数据的可恢复性。
关于访问控制
一般来说,不希望备份与原始数据采取相同的访问控制机制。例如,对网站来说,可以读写数据库的那个 Web 访客的数据库账户,很可能并不能直接读写网站的备份数据。有时,备份甚至是以一种"外科手术"的方式进行的:对文件系统做快照,然后将快照打包发到异地的另一套系统。
采取不同的访问控制机制有很多好处。备份的目的之一是保护先前版本的数据不受影响。举个现实生活中的例子,公司的账簿可能会影印之后放到档案寄存机构,而公司会计可能并不负责,甚至没有权限去调出账簿副本。在这个例子中,由于副本和正本由两个角色分别负责,为确保其不被其中任何一个人恶意篡改提供了一定的保障。
对于服务器或桌面系统,这种控制也同样重要。例如,用户可能有权限删除自己的文件,但不应有权限以同样的方式删除或修改备份。这种限制可以缓解由于误操作或入侵(例如木马、或特权提升)导致的损失。这一点是备份与冗余之间的重要区别。
推 or 拉?
两种方式各有利弊,但我个人比较倾向于使用拉(即备份机登录原始数据的机器)的方式而不是推的方式。原因是备份机往往可以设置更为严厉的安全策略,例如放在防火墙后面,等等,而攻击者在入侵成功之后,想要找到备份机在什么地方也需要一些时间,从而给检测入侵创造条件。推的方式的优点是可以比较方便地控制何时备份,以及备份的I/O占的比例,不过,通过合理地设计备份系统,并不是拉的方式并不是完全不能实现这类功能。
关于异地备份
将备份与原始数据放在同一个物理位置(例如同一个机房、同一棟建筑、同一座城市,甚至同一个省或同一个国家/大洲)很可能是有风险的。一般来说,副本与原始数据的距离越远,从备份的可靠性角度考虑便越有把握,同时,将备份设在电费和托管费用较低的二三线城市,也可以在一定程度上降低整个系统的运营成本。
离线备份
离线备份往往用于保存非常有价值并且不经常改变的数据。例如将数据刻录成光盘邮寄给不同大洲的人,等等。不过,离线备份的问题是其访问控制很可能不太容易,想要解决这个问题,可以采用门限加密的方法(例如,将数据分成三份,密钥也分成三份,给三个备份点分别发第其中的1,2;1,3;2,3,在这个方案中,攻击者必须掌握三份备份中的至少两份才能够恢复密文内容)对数据进行处理。
Read more...今天看到一则消息说,百度搜索支付宝会找到一个钓鱼网站(现在应该已经撤掉了)。去那个钓鱼网站看了一眼,发现居然是装的正版支付宝插件。
相信插件能保护客户的安全的人可以洗洗睡了,你们根本__不配__说"安全"两个字,除了供一两个三流技术人员拿大量客户计算机的安全开玩乐和练手之外,这些控件没有价值。
Read more...续前。
除了硬件上直接采用的降噪措施之外,一些软件方面的配置也可以提高其效果。
首先是BIOS中的配置。风扇转速最低可调整为"Energy Saving"(即使用30%的频率)。启用Active Power State之后,可节省大约2W左右的耗电(这个选项的默认值是Disabled)。
然后是FreeBSD本身的配置。我个人采用的配置包括:
上述设置,除了ahci部分之外,可将系统闲置时的功耗降低到17W左右。
以下是实现中采用的loader.conf相关的部分:
hint.apic.0.clock=0
hint.atrtc.0.clock=0
hw.pci.do_power_nodriver=3
hint.ahcich.0.pm_level=5
hint.ahcich.1.pm_level=5
hint.ahcich.2.pm_level=5
hint.ahcich.3.pm_level=5
hint.ahcich.4.pm_level=5
hint.ahcich.5.pm_level=5
最近遇到一些奇怪的bug,因为是对恢复时间有比较高要求的系统,所以顺便研究了一下用FreeBSD的textdump来代替更早前出现的minidump的方法。
minidump是2004年初提出的,FreeBSD 6.2-RELEASE开始加入了这个功能,并且在7.x开始默认启用。具体原理是在panic时做dump的时候只存储那些映射为内核内存的物理内存页。这种做法实际上是赌VM的页表在崩溃的时候没有被写坏(绝大多数情况下这是成立的,除非在调试VM本身)。
UPDATE: 杨总 说,Solaris上有一个叫 Fast Crash Dump 的功能。看了一下介绍,是在dump的时候用指定的压缩算法去压缩再转存。先记一笔。
textdump是Robert N. M. Watson在2008年提出的一个新概念,从7.0-RELEASE开始引入:
在编译内核时,需要加入内核调试器。
指定的 ddb 脚本可以挂在某个特定的事件上,比如 panic 进入 kdb 时自动执行
系统提供一个默认的ddb脚本,保存下面这些信息:
启用textdump是需要内核调试器的,因此有一定的安全风险,例如可以从控制台进入ddb。使用时的内核编译配置是options KDB、 DDB和SC_DISABLE_KDBKEY(禁止在控制台热键呼出调试器),然后在 /etc/rc.conf 中加入 ddb_enable=“YES” 令系统在引导过程中将ddb脚本汇入内核,并指定dumpdev。
需要注意的是目前textdump与KDB_UNATTENDED不兼容,因为后者会令内核不调用调试器而直接重启。
textdump保存的内容非常少,因此可以大大减少dump所需的时间。
Read more...