记得年轻的时候(初三?),我曾经在一台586上面安装过某个版本的Linux。当时确实曾经真心想学,因为那时候正迷各种C++。可是后来在上面跑XWin,发现慢得不可理喻,比Win95是慢多了,于是觉得业界有些东西真有吹嘘的成分。图形界面慢得不行,命令行又和DOS有那么些差别,再加上互联网不比今时今日之发达,很多东西真的很难查。尤其是中文资料,相对今天而言真是挺少的 这些困难对于我来说,那是一种痛苦,对于寻找有趣事情的我来说,学习Linux自然成了优先级很低的事情了。
后来,兴趣彻底转移到了编译原理,再往后还延伸到一些中间语言虚拟机的皮毛,结果就堕落到了MS的怀抱,尤其是.NET。直到某天,由于机缘巧合,一个大系统中需要用Linux系的不少东西来进行配合,比如HAProxy和Squid,于是稍有接触。后来,负责这两个系统搭建维护的同学离队,加之和Linux有关的一个小Team被另一个部门借走,这件事情自然就回到了我的视野附近。换句话说,不得不认真对待了。
本来呢,我也没有想认真对待的。但是当兄弟们对某些紧急的事情处理不过来的时候,就不得不加入到一线战斗中。比如说安装、配置HAProxy,写一些脚本分析其中报告的日志等。在这段时间里面,我开始从舒适安逸的MS风格开发,转移到千头万绪的细枝末节当中。感觉就像麻瓜因为某种错乱进入到霍格沃茨魔法学校里面一样,发现开个门都要念个Alohomora(阿拉霍洞开),不由得一头雾水、晕头转向。
好在,我的启蒙之路是从DOS开始的,命令行和批处理脚本也没有少接触,甚至汇编、内存驻留程序啥的也搞过,算不上是个麻瓜。再加上英语经过长期磨练,不算精通那也足够应付检索资料了,以及今时今日互联网之发达,寻找解决方案相对想当年已经容易很多了。
即便如此,我这个在微软这个麻瓜世界呆久了的人,一时半会儿在霍格沃茨魔法学校还不甚适应。常见的症状是不知道咒语怎么念,以及念着念着搞错了,还有就是各种迷路。比如说吧,配置HAProxy,其实就比较烦人。不像非常成熟的产品,直接yum install就能基本完事。而是需要wget / tar / make / make install 一步步下来,中间乱七八糟要注意的地方还不少。
首先说wget,对于麻瓜来说,下载通常都会进入到“我的文档\下载”这个目录(或者类似),但是wget不是的,你的命令行当时在哪个目录,就会保存在哪个目录。我第一次装mono的时候没有注意,就搞到了root目录里面去……
接着tar这边有一堆的参数“-zxvf”,每个是干什么的得要仔细看帮助才知道。其实照着网上的麻瓜和巫师写的各种安装命令行,只要是用到tar的命令,基本上参数都是“-zxvf”。换句话说你照着念基本上没错,可是对于不少麻瓜来讲,这真的就只是一种必须照念的鸟语。
如果说tar那堆参数通常错不了,接下来的make就头大了,TARGET是什么,CPU是什么,ARCH是什么,你都要照顾。通常这几个还算好,基本都差不多。但接下来就有一堆的隐藏参数USE_XXX,这个就真是不知道哪儿找去了。比如说有一个USE_POLL,代表什么目前我还没有找到一个很官方的文档说明,貌似是USE_POLL=1表示编译的时候包含POLL功能。但是,当我看到有文档说USE_POLL是代表禁用POLL,我就晕菜了。此外,如果要打开EPOLL,是否USE_EPOLL=1呢?貌似也找不到文档。在查找这些资料的过程当中,又发现一个叫做USE_LINUX_TPROXY=1的选项,作用是让backend端能够查看客户端真实的IP地址。而实用这个功能,要么你的内核是2.6.28以上,要么就要下载特定的代码,重新编译内核。这些各种隐藏的参数,很可能要仔细阅读每一分文档,乃至阅读Makefile来解读之。同时,这些选项要让如何才能生效,可能需要你对Linux系统本身有一定的了解,包括如何编译内核。也许编译内核啥的也是一个很简单的咒语如Diffindo (四分五裂),但不出问题还好,一旦出些非常莫名其妙的问题,你可能就要很深入的了解整个操作系统,乃至某一行内核代码大概如何发挥作用才好。(水好深啊……霍格沃茨魔法学校太危险,麻瓜们还是回伦敦去吧。)
--- 后记开始 ---
其实仔细研究Makefile,发现里面的脚本已经能够根据当前的系统状况,判断当前适合使用的参数了。可以说,网上大部分说应该添加TARGET=linux26 CPU=generic ARCH=x86_64 USE_EPOLL=1等的,都属于多此一举。只有你有很明确的不希望使用某种默认功能,或者你的系统被你自己定制得不是默认情况时,才需要进行调整。
哦,对了,我还看到网上有人说TARGET要设置成linux86的呢,真是欢乐。幸好我稍微grep了一下Makefile,觉得不对劲。麻瓜们,不要照着网上贴出来的咒语直接念,一不小心就会念成傻瓜的。
--- 后记结束 ---
后面make install的时候,一不小心没有指定PREFIX,结果就装到了/usr/local里面去了。很奇怪的是,网上的各种介绍说,在make的时候指定PREFIX就能在后续的安装中安装到指定的地方,但我的情况并非如此。至于为什么,反正现在正确了,我也不想再回过头来重复这一痛苦的排查问题过程。
在这之后,还有各种配置阶段,这个还好,基本上有文档。虽说有文档,但那选项之多,应该怎么样才是比较好的配置却完全不知道。估计大部分同学都是要在网上一顿乱搜,再经过实战的检验,然后试错试错试错……
配置还算顺利的了,如何让HAProxy变成自动启动的,居然也要自己动手丰衣足食。Linux的自启动通常就是在/etc/rc.d/rc.local里面添加一段启动脚本,而启动的脚本也是需要自己编写的,比如这篇,或者这篇。嗯,为啥这两篇里面的脚本几乎完全不一样呢?Linux世界就是这样的啦,你要习惯。好比如果有一百个哈利波特,那伏地魔就得有一百个死法。其中前者的脚本目前我这里还是不能完全正确运行,原因是我启动了多个进程,而该脚本stop的时候,使用了functions里面的相关功能来从pid文件获取当前正在运行进程的pid。但是奇怪的是,HAProxy输出的pid文件是每个进程一行的,而不是在一行内用空格分隔不同的pid。这就导致了该脚本永远只停止第一个HAProxy进程,而不包括其他进程。(麻瓜们,有没有看着像天书一样的感觉?)
--- 后记开始 ---
Linux有个最大的好处,就是几乎所有东西都能够看到、改得了。包括服务的启动脚本啥的,通常都是一段脚本。比如第一个链接中的脚本,只要在stop里面killproc $prog修改成这么几句话就可以了:
local tmpfile="/tmp/haproxy.pid"
if [ -f "$lockfile" ] ; then
cat "$lockfile" | tr "\\n" "$IFS" > "$tmpfile"
else
tmpfile="$lockfile"
fi
killproc -p "$tmpfile" $prog
--- 后记结束 ---
看到这里,你就会发现霍格沃茨魔法学校确实不太适合麻瓜。没错,Linux程序之间的协作和配合,比之Win系的确实容易不少,至少命令行如此。这也造就了Linux程序有很多默认的协定,比如说参数就有协定:如果是一个杠开头,后面的每一个字符都是一个参数(-zxvf就是这样),如果是两个杠开头,后面就是一个单词组成的参数(--help便是最常见的,几乎每一个程序都支持,几乎……)。这些基本的协定不仅限于命令行参数的规范,我就不一一表述了。
Linux世界之于Windows,开源这一点不同导致了程序设计思想有很大的不同。在Linux世界,似乎能够各种配置调整到每一个毛孔的东西,才便于大行其道。因为具体每个地方的应用场景肯定有不一样的地方,具体需求或多或少肯定有这么些个差异。在Linux世界里面更倾向于修改程序(包括配置),来适应需求,而不是苟且一下让自己的需求适应程序的能力。也正是因为这一点,就导致在霍格沃茨魔法学校这片地儿你需要学习大量的咒语。
换句话说,在Linux世界混,你需要知道的就比Windows上面多太多了,否则就算是安装个程序都这种运维的工作都很难做好。除此之外,你还需要有很强的解决未知问题的能力,或者说独立思考能力。
没有评论:
发表评论