微信号:upaiyun

介绍:UPYUN,全球首家支持多媒体云端处理的新一代 CDN 服务商,也是国内业界最具性价比的服务提供者.

邵海杨:嵌入式系统在又拍云运维中的应用——裁剪Linux

2013-09-09 20:01 CSDN陈馨影

为什么要裁剪Linux?

首先,要了解通用和专用的区别。我们在公司里有特定的业务模式,需要的操作系统其实是专用的(这里要理解为什么世界上会有公司这个概念,卖的就是特定的业务和服务),我们可以把它做得很美、很小、很快速,很安全(这就是我们做小系统的意图)。路由和防火墙都是内嵌的功能,不需要涉及到用户太多的功能,所以可以全部整合到内核中,包括一些硬件防火墙。一个Linux防火墙,如果配制好的话,不低于一台两万左右的防火墙。


第二,裁剪后可以很好地将速度、效率、安全进行组合,我们把Linux变得很小的时候,速度快,效率也很高。


第三,安全,我们在裁减的过程当中,操作在内网进行,工作在外面的小系统实际上没有编译环境和工具,根本就无法编译入侵可执行文件,它是非常安全的。


第四,通过裁剪细节了解linux的组成,可以烧录到任何小型的DOM/U盘,应用于工控领域及其它嵌入式设备如手机。最后有了小系统,你可以在不同介质中升级切换,实现运行中的快速更换引擎。


如何裁剪?

1. 前期工作

首先需要一个实验用的USB口的DOM盘(或者sata接口的DOM),直接插在主板里面的,在淘宝上不到100块钱。我们裁减的Linux差不多只有100兆左右,所以你随便找1GB的,4GB的,基本上都可以满足你的要求。

其次明确Linux的构成。第一是Kernel,可以把它理解成汽车上联系各个组件的CAN BUS总线系统,比如新硬件放上以后,Kernel就能够识别它驱动它,让操作系统能够与底层的硬件打交道,没有这个根本就无法驱动服务器。第二是LSB-如FHS,POSIX/SYSV标准,你要遵循这个标准,才能把这个Linux看成Linux,而不是说你变成另外一个系统(可以通过google LSB标准理解,linux世界为什么需要它,不然整个linux就是乌合之众)。还有一个叫Boot  Loader,利用它把引导记录写入MBR,才能实现kernel引导后,切换到真正的操作系统里,才能工作起来。它非常重要,如果没有Boot  Loader,我们就无法实现在运行中切换引擎。

Kernel是和硬件紧密结合打交道的东西,我们只要理解哪些是硬件,无外乎就是CPU、内存、硬盘三大件,还有其它的如显卡,网卡,usb, scsi等各种各样的硬件都需要kernel的驱动,还有系统级别的调用,包括如文件系统,进程管理,内存管理,也包括一些内核级应用程序的引进,如lvs,iptables等内核级应用。我们现在使用的3.8.13。

如何编装内核,我们在编内核的时候要注意一个地方,内核不是越小越小,我在Linux里面有两件事要小心做(这两个事情很容易让你束手无策),一个是编译Linux,一个是防火墙,所以建议在编译Kernel的时候,尽量做减法,不要为了精简而拆得很小(前提是保证可用性),慢慢做减法。首先拿一份让你机器运行起来的文件,接着要能够明确哪些东西可以去掉,然后你再编,比如说我们的机器都是英特尔的芯片、主板、网卡,在编译内核的时候就很明显,我可以把非英特尔的芯片、网卡、或者其他的东西都去掉,它的Kernel会变得很小。(文件系统模块是文件尺寸最大的,如果特定系统不需要其它特殊的文件系统,一般保留ext4/xfs差不式够用了,这是又拍云存储的配置,仅供参考)

FHS其实就是一个目录树结构,在Linux发展之初做层级设备的时候,那时候硬盘都比较小,所以说可能会挂载多个硬盘,早期的大牛们把这个分类出来,是为了方便在各个硬盘中存放。但是现在当然硬盘都很大,也不需要有这样的东西。但是我们发现这里有一个好处,很容易做应用程序的备份、打包。因为所有的层级都在这一组。

接下来是POSIX和SYSV,这是重点。里面会见到有一些库文件,还有头文件,这是C语言里特有的。当一个应用程序要跑起来,二进制文件是必不可少的。但是这个二进制文件有些是动态链结,有的是静态编译。头文件只存在于被别人依赖的时候,可以不需要。所以我们可以把Linux裁得很小,就是因为可以不要这些东西。还有配置软件,比如像login,passwd,sshd这些程序,是需要有配置文件来控制它,定制它。比如说WC,less,echo此类命令,它就是一个单词一个执行就可以了。有这些部分,再加上配制文件,变成一个程序。

2. 裁减Linux的实战思路

 第一步,我们要先创建目录,我这里用了USB设备,比如我把这个设备分区,我给这个分区打一个标志,打了标志以后,我们就不再纠结于这个U盘插上以后,会变成Sdb还是Sdc。我们会拷贝相关有用的命令(又拍云存储基本用到了120个左右的命令,原系统约为600个),通过LDD去寻找链接线索,然后再通过LS把它们的关联找到并且拷出来。当然也能通过bash脚本自动分析,就按照查找路径,分析链接,然后把它按照这个路径拷贝过去。最后我们要做的就是拷贝内核,前期大家要做实验的时候,只要把原先的Kernel拷过去就可以了,后续的慢慢再做Kernel裁减。你会发现越做越有趣。

 
又拍云 更多文章 让机器人写营销文案,小鸟推送转型第三年登陆“新三板” 运营1990法则:用1%核心用户带动9%关联用户,进而带动90%的用户 Tech Minds | 邵海杨:三大法宝,应对互联网运维三大挑战 什么,阿里、腾讯、京东、网易、又拍云等企业即将汇聚北京释放洪荒之力?!(有彩蛋) Tech Minds|王津银:DevOps,关于一致性(C)、可用性(A)和距离(D)的表达!
猜您喜欢 有缘千里来相会 使用C#给Linux写Shell脚本 RESTful 架构风格概述 swappiness 是否需要设置成0 首发:唯品会RPC服务框架与容器化演进