操作系统虚拟化与Linux命名空间

2015-11-22 • 技术文章

虚拟化的本质需求来源于任务的隔离,也就是资源的隔离。所以,很多时候我们不是要在OS上虚拟出一个独立的OS,而是希望让虚拟机共享操作系统内核而又保持隔离性。

chroot

诞生于1979年的chroot是资源隔离的一种方案,chroot使一个进程把某个特定目录作为根目录,所有文件系统操作都被限定在该目录里进行。

但是chroot仅仅做到了文件系统层面的隔离是远远不够的,我们希望对进程、网络等各种资源进行更深层次的隔离而且希望能够实现对这些资源的审计。

Linux命名空间

Linux的命名空间机制为实现基于容器的虚拟化技术提供了很好的基础。

命名空间建立了系统的不同视图,只使用一个内核在一台物理机上运作,将全局资源都通过命名空间抽象起来,每个命名空间中的资源对其它命名空间是透明的。LXC就是利用这一特性实现了资源的隔离,由于没有多余的一层操作系统内核,容器比虚拟机更加轻量,启动更快,内存开销、调度开销也更小,更重要的是访问磁盘等IO设备不需要经过虚拟化层,没有性能损失。

当我们用fork或clone系统调用创建新进程时,有特定的标志位可以控制是与父进程共享命名空间,还是建立新的命名空间。命名空间的实现需要两个部分:每个子系统的命名空间结构,将此前所有的全局组件包装到命名空间中;将给定进程关联到所属各个命名空间的机制。子系统此前的全局属性现在封装到命名空间中,每个进程关联到一个选定的命名空间。每个可以感知命名空间的内核子系统都必须提供一个数据结构,将所有通过命名空间形式提供的对象集中起来。nsproxy结构体用于汇集指向特定于子系统的命名空间包装器的指针。

1
2
3
4
5
6
7
8
9
10
struct nsproxy {
    // 注释仅为匹配该行对应命名空间的标志位注解,不是本处引用代码的说明
    atomic_t count; 
    struct uts_namespace *uts_ns;   // 标志位CLONE_NEWUTS
    struct ipc_namespace *ipc_ns;   // 标志位CLONE_NEWIPC
    struct mnt_namespace *mnt_ns;   // 标志位CLONE_NEWNS
    struct pid_namespace *pid_ns;   // 标志位CLONE_NEWPID
    struct user_namespace *user_ns;
    struct net *net_ns; 
};

uts_namespace包含了运行内核的名称、版本、底层体系结构类型等信息(UTS即UNIX Timesharing System);ipc_namespace包含所有与进程间通信(IPC)有关的信息;mnt_namespace包含了文件系统的视图信息;pid_namespace报行了进程ID相关的信息;user_namespace包含了用于限制每个用户资源使用的信息;net_ns包含所有网络相关的命名空间参数;count是引用计数。

clone(child_exec, child_stack + STACKSIZE, clone_flags, &args)其中的clone_flags即为设置不同命名空间的标志位的或运算结果。如同时设定CLONE_NEWPID和CLONE_NEWIPC,那么不同命名空间的进程彼此不可见,也不能互相通信,这样就实现了进程间的隔离;CLONE_NEWUTS和CLONE_NEWNET一起使用,可以虚拟出一个有独立主机名和网络空间的环境,就跟网络上一台独立的主机一样。

以上所有标志位都可以一起使用,为进程提供了一个独立的运行环境。LXC就是通过clone时设定这些flag,为进程创建一个有独立PID、IPC、FS、Network、UTS空间的容器。一个容器就是一个虚拟的运行环境,对容器内的进程是透明的,它会以为自己是直接在一个系统上运行的。

几种其它虚拟化方案

OpenVZ也是Linux内核里实现操作系统级虚拟化的解决方案之一,但相对LXC,可以分辨子系统中内存和磁盘的配额分配情况,可进行独立审计,且支持检查点、热迁移等更多特性,缺点是基于非常老的Linux内核设计,对新特性支持差。

Docker如今大红大紫,它将基础运行环境和依赖都打包在镜像中,且镜像是层次化的,基于增量修改(基于AUFS实现,基础目录A和增量目录B合并为目录C,冲突时以B为准,修改C写回B),低开销实现了版本控制和分发,软件运行在独立容器中避免冲突。Docker很好地解决了依赖与资源冲突的问题,大大降低了运维成本。

Chromium插件内容脚本与背景脚本消息传递实现

2015-06-01 • 技术文章

在Chromium浏览器插件的开发过程中,内容脚本(content script)和背景脚本(background script)的信息交互是非常常用的。然而由于Chromium的安全隔离机制,这种交互变得成本很高。笔者最近为了省去很多重复无意义的工作步骤,计划开发一款浏览器插件,经过对WebsiteIP插件源代码的研究以及数个小时的试错,终于在自己的插件中实现了这种交互。

1
2
3
4
5
6
7
8
9
10
11
// background: start listening
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
     sendResponse({key: request.action == "guessMyLocation" ? sender.tab.url : "Mars"});
});
 
// content script: send messages
docReady(function() {
    chrome.runtime.sendMessage({action: "guessMyLocation"}, function(response) {
        console.log("You're from " + response.key);
    }
});

其实实现并不困难,之所以耗费了大量的时间是因为一个小的语法错误在文本编辑中没有看出来,一个好的IDE对于代码繁冗的项目还是很必要的。想起之前做php开发的时候,一个bug一直没分析出来,后来试用了PhpStorm,打开项目后直接就自动分析出错误所在了。

说完了这个再说说WebsiteIP的实现机制,其实现中用到了LocalStorage来存放IP信息,而实际上是否使用LocalStorage关系不大,使用普通的对象存储也是可以的。关键就在于chrome.webRequest.onCompleted.addListener(function(details)),details包含了本次请求的各种信息,比如主机IP地址、状态码等等,对于诊断页面加载情况有一定帮助。

Aaron Swartz的理想世界

2015-04-22 • 业界评论

2013年1月11日,Aaron Swartz结束了自己年轻的生命。

你可能之前并没有听说过Aaron这个名字,但是我们耳熟能详的Reddit、web.py、RSS、Markdown、Creative Commons都和他有脱不开的联系。受其父亲影响,他很小的时候就接触了计算机和互联网,14岁时就加入了RSS工作组。他早年退学并成功创业,对多项互联网信息技术的贡献都让人称道不已。在此,我更想想谈谈我对于Aaron思想的一点认识。

首先是Aaron Swartz下载并在互联网上免费发布PACER(公共使用法院电子记录数据库)的部分美国联邦法院文件这个事件。PACER中的文件是政府应当对外公开的,但是PACER对其中的文件实行按页收费来支持数据库的技术投入并产生了资金上的盈余。Aaron Swartz受到FBI调查,但他在案件中并未受到起诉,案件也不了了之了。

另一件标志性事件便是反对SOPA(禁止网络盗版法案),SOPA对政府监控民众网络活动给予了一定的授权。大财团将在SOPA中受益,代表其利益的参议员们高度一致地赞同这个议案,但是民众对这项法案并不满意。在民众的反对压力下,部分支持SOPA的企业转而反对SOPA,白宫也表示并不支持SOPA,之后大批议员也改变了态度, 最终SOPA被阻止实施。

之后是他通过MIT的网络下载了数百万篇JSTOR的学术期刊文章,下载过程还导致了JSTOR的服务器奔溃,而JSTOR仅对学生和研究人员有限开放。检方控告其13项罪名,各方面压力下,Aaron以自杀结束了自己的生命。

以上几个值得注意的事件关键都在于Aaron看不惯阻止信息或者说是阻止知识自由流动与共享的行为。知识或信息的某一个点是由部分人制造的,经过传播原作者和其他人可以利用已有知识直接创造价值,或者在已有知识基础上进行扩展再创造新的价值。但是在目前的社会条件下,也就是货币没有在全世界范围内彻底消亡的社会中,知识真正的自由传播是不可能的。一些科技界的进展被发表出来,但是阅读这些内容还是收费的,而且收取的不仅仅是成本费那么简单。知识与信息的封锁隔绝,在很大程度上阻碍了科技与社会的进步。人生在这个社会上,却不能完全享用前辈所留下来的成果,细想想也是挺可悲的。

互联网的核心精神是共享与信息传播,但在当前的社会条件下,这种精神无法被完整地实现。我觉得,在一定程度上来说,互联网已经领先于目前的社会形态,造成了目前互联网与社会制度在一定程度上​存在冲突。​应该说,Aaron的思想有一定的先进性,但是更多基础性的社会形态改革还没有完成甚至还看不到变革的苗头就追求更先进的顶层设计是没太多意义的。另外,Aaron还试图自己参政来做点什么,但是恐怕当前美国的意识形态根本满足不了其要求,所以他的思想还是没能超越既有的思想框架,是具有一定的局限性的。

Aaron的理想世界是美好的,他的名字应该被我们所铭记,向着这个理想的世界进发注定要举步维艰,在有生之年大概也还看不到什么。我认为,在现阶段,Aaron的期望过高了,还是寄希望于每个人先能看清并认同先进的前进方向比较切实也比较有实际意义。

扩展阅读

http://www.aaronsw.com/

http://zh.wikipedia.org/wiki/亚伦·斯沃茨

The Internet's Own Boy: The Story of Aaron Swartz

SVN递归忽略文件或目录

2015-03-20 • 技术文章

在SVN中忽略某个文件可以使用svn ps svn:ignore [filename|filelist] [dir]来实现,但是如果要实现一个文件列表的忽略最直观的方法是通过svn pe svn:ignore [dir]。在使用该命令时会遇到SVN编辑器未设置的提示,这时可以export SVN_EDITOR=vi指定vi或者其它编辑器来解决,为免今后再export也可以直接把export写进profile。

不过,我个人觉得不错的一个方案是创建一个.svnignore文件,在.svnignore文件里指定一个忽略列表,然后通过svn ps svn:ignore -F .svnignore [dir]来忽略比较好。如果有所有层忽略的需要,svn -R ps svn:ignore -F .svnignore .层层忽略,列表文件的目录不用加/直接递归忽略掉即可。

其实对于从仓库拉下来的工程,只要不手动添加不必要的文件来跟踪就没什么问题。如果使用IDEA等IDE,在设置中设定忽略项目也很方便。

国内外Windows平台免费个人安全软件评略

2015-02-27 • 业界评论

自从远离了瑞星产品的测试,已经很久没有大规模地把各种杀毒软件拿过来比一比了。但是最近在挑选Windows平台下适合家用的杀毒软件时却犯了难,于是只能配置好虚拟机和常用软件,装上各款杀毒软件来做个比较。这些年来,病毒的技术并没有什么大的进步,也没给予太多关注,但个人杀毒软件市场却已经是发生了翻天覆地的变化。

昔日的国内霸主,瑞星杀毒软件和防火墙虽然没有多少市场份额,但是无论是安全防御还是查杀率都还是很不错的,国内唯一的坚持独立自主开发杀毒引擎的厂商,防火墙在国内独树一帜,唯一缺点是总是试图让你装点瑞星其它没什么价值的产品,而且偶有广告弹窗,而且有一个烦人的瑞星软件部署系统,太多余,瑞星现在的境况不适合做平台何必还一直操着这么大的心呢,只能讨人厌了。要是瑞星现在决定做安静的小狮子还是不错的,总之,技术上推荐,恶性推广上差评。

金山毒霸,在市场上还是有一定的份额的。查杀和敢赔模式都不错,但防卫过当,我想在系统盘驱动器下稍微动点无关紧要的东西它都有意见,而且也有推广其它产品之嫌,因为我发现我家里的电脑上满屏金山的东西。启发杀毒误报略高,不适合高级用户使用,尤其是IT研发人员。

360杀毒,现今的霸主。查杀不错,有些独创的技术做得很不错,毕竟高中时候就知道的很多Windows安全界的高手都加盟了360,实力不可小觑,但启发误报太多,而且和金山一样防卫过当,不适合IT研发类人员使用。一般人用用还是很不错的。

百度杀毒,引入了卡巴斯基引擎,查杀没问题。防御级别恰到好处,界面也简洁明了,再加点防火墙功能就更好了。百度适合普通用户和专业人士使用,兼容性再好点就值得大力推荐了。

AVG,略简陋,只会杀毒,查杀率还行,免费版在其它方面没什么可圈可点的。界面上一半的区域用来推广收费版,讨人厌。总之,不推荐。

Avria,大名鼎鼎的小红伞,各方面都不错,缺点是防御拦截上没有放行功能,要想完成某些想要的“危险”操作,要关掉相应防御模块。界面太丑,不适合普通用户使用。

Comodo,防火墙世界排名第一,界面扁平化做得很漂亮。在病毒查杀上不够强,但沙盒、HIPS、防火墙做得很出色,就是不太适合普通用户,只适合专业人士使用,建议只装防火墙,但是Comodo对新版Windows的兼容性尚有待改进,测试过程中发生了装完软件再也开不了机的情况。

微软Defender(MSE),我只能委婉地表示,提升空间很大。安全习惯比较好的Windows用户可以使用,记得及时更新就行,似乎默认情况下不怎么更新病毒库等信息。

更多软件,不再一一评点。

总的来看,目前真没有哪款免费杀毒软件让我完全满意。如果以上安全软件的非功能性的痛点上能够得到改进,比如不再弹窗不再有各种推广,兼容性再好一点,那么将会出现以下几种非常不错的组合:对于普通用户,瑞星杀毒软件、百度杀毒中的一款来配合瑞星防火墙;更专业玩家可以选择用Comodo防火墙替换前面的瑞星防火墙;对于防火墙没什么要求的可以只用系统防火墙或者用系统高级防火墙。至于金山、360,鉴于我个人并不认同它们的过度防卫的安全策略,实在无法推荐给专业人士,不过普通用户用用还可以。对于其它国外软件,虽然病毒查杀率还不错,但是整体上做得很平庸,只能说不太推荐。