我为什么不喜欢systemd

如果事事都追求客观,那么不是虚伪就是愚蠢,且没有主见。by 我

作为第一个被内核启动的进程,PID 1 有着无与伦比的特殊地位和重任。

在内核准备就绪后,PID 1进程被内核启动,这个init system负责启动其他的守护进程,后台进程和用户所需的服务。在如此重要的场合,却在很长一段时间里用着古老的解决方案:SysVinit。这一用就是近20年。

SysVinit由一堆shell脚本组成,在启动的时候,一个一个脚本按一定的顺序串行的执行。整个过程简单易于理解却显得很笨拙。其一,每个服务都必须等待排在它之前的服务启动完毕后才能启动,而这些等待有时是非必需的。其二,脚本由shell写成,用shell写是简单了,但却带来解析执行时的耗时增加。其三,这种启动方式会在开机时就启动所有的服务,而不管它是不是会被用到。

没有人反对应当对SysVinit进行改进或寻找替代品,Upstart就是由Ubuntu推动的一次尝试,因其现代的设计理念而被寄予了厚望。但是,Upstart的表现却不尽如人意,以至于当systemd开始席卷各大发行版的时候,Ubuntu也最终选择了采用systemd。事实上,Upstart采用的事件驱动模型启动方式是一种有点别扭的解决方案,因为不是所有的程序或者服务都能和事件的概念对应上的,大部分的服务只是需要启动,停止,重启,重载,仅此而已。

到了2010年,systemd横空出世,自此一发不可收拾。systemd首先带来的变化,就是系统启动速度的大大改观。

它做到了两点:1)尽可能的启动少的服务。2)尽可能的并发启动。

systemd只会保证启动一开始就必须的服务,如log服务,D-Bus system等等,而像蓝牙,打印机这些,因为不是一开机就会马上用到的,systemd都会推迟去启动它们,甚至如果你的其他软件都没有用到打印机,打印机这个服务进程就不会被启动。而动态的启动服务是现代计算机的需要,尤其对于笔记本而言,如果能支持各种硬件的热插拔,将是对用户体验的一大提升。这两者事实上是一个概念:只启动必须的服务,而其他的服务等到可用或要用的时候才启动。

systemd对并发启动的支持,概念则是源自于Mac OS的launchd。之所以SysVinit需要串行启动,是由于各种程序各种服务之间是有依赖关系的,GNOME依赖于D-Bus,则GNOME需要等D-Bus完全启动后才能启动,而D-Bus和GNOME均依赖于syslog,则它们都需要等待syslog启动完成后才能启动,又如网络连接服务和nginx服务,也是这种先后关系。SysVinit简单的对这些服务进行先后排序(事实上这个排序任务需要用户自己完成),然后依次进行启动,再次强调这两个词:简单,笨拙。要对此进行改进,就要理解各种服务间具体是如何相互依赖的。

we need to understand what exactly the daemons require from each other, and why their start-up is delayed.

服务/守护进程需要等待它所需要的其他服务/守护进程所提供的socket准备就绪后,才能正常的启动。

既然如此,我们完全可以在一开始就创建好所有的socket,然后并发的启动所有的服务。这样做,将会出现两个场景:
1)A服务通过socket向B服务发送异步请求,若此时B服务还没有准备好,这些请求将被存入对应的socket buffer,等到B服务启动完成后,将消费这些请求,而这个过程对于A服务来说,是透明的。
2)A服务通过socket向B服务发送同步请求,若此时B服务还没有准备好,这个请求将被阻塞,直到B服务启动完成为止。而结果也仅是这个进程/线程被阻塞,并不会影响其他的启动任务。

socket可以这么做,D-Bus更加可以这么做,systemd也正是借(cao)鉴(xi)了launchd的这个设计,将原始的串行启动变为并发启动。

以上两点将linux系统的启动速度提高了一个等级,两个词形容:精巧,高效。

如果故事只到这里,那么一切都会很美好,可systemd却不想这么简单。

systemd借鉴Mac OS(在开源社区里这被视为罪恶的闭源软件的代表)的设计,采用C而不是系统管理员熟练的shell,记录日志采用二进制文件。这几个“缺点”常被反对者挂在嘴边用于口水战。然而,我认为这几个都无关紧要,最要命的其实是:it is not the unix way.

Arch Linux在决定采用systemd的时候,在论坛里发过一条回复贴:

these things are not hugely important.
let’s ignore all of those old boring arguments

作为常年的Arch Linux使用者,我不喜欢这样的回应。因为systemd作为一个init system很不纯粹,它接管了太多的服务,破坏了我们一直坚持的原则。PID 1不应该管得这么宽:

systemd-journald:
接管了日志服务,而且日志存储用的是二进制文件。
.timer:
取代了cron。
systemd-consoled:
取代了内核提供的virtual terminal。
systemd-logind:
管理登陆会话。
systemd-networkd:
网络服务也由它管。
systemd-timedated:
PID 1想帮你打理时间和时区。
udevd:
被合并进了systemd
systemd-boot:
同样合并自其他项目,管理你的boot过程。
systemd-resolved:
DNS也由PID 1管了。
systemd-ask-password:
密码它帮你记。
。。。。。


systemd.png

至于Arch Linux,我选中它作为我学习用的的桌面系统,就是看中它够KISS (Keep it simple,stupid),一切都是可定制可替换的。可选择了systemd,意味着用户的选择权变少,整个系统几乎都被systemd接管了,systemd的开发者也说,他们想让构建基于systemd的linux发行版变得简单,可不是嘛,我看现在Arch,也就是linux kernel+systemd+pacman了,自己家的东西变少,和其他发行版开始趋同了。这样,使用Arch和使用其他发行版还有什么不同吗?(是的,我就是在说逼格)

对于服务器系统来说,启动速度的提升是一件无关紧要的事,稳定性才是王道,所以systemd进入服务器系统,首先要被考虑的是稳定性而不是启动速度。可systemd接管了这么多服务,集成到单一的binary中,万一出个什么事,直接整个系统就挂了,你可是一人之下万人之上的init system啊!systemd的代码质量一直被人诟病不说,不遵循do one thing and do it well原则,将导致的结果就是,一旦某一子程序出问题了,整个系统就挂了,而且还替换不了。

对于桌面系统来说(目前只有开发人员会用linux作为日常的桌面系统吧?),启动速度确实带来了很大的帮助,集成一大堆服务也自有其道理,但是,要不是看中linux的可玩性可定制性,谁会用linux发行版作为日常的桌面系统?使用Arch和使用Mac OS,前者让人觉得掌控了一切,后者让人感觉被掌控了一切。如果我追求的是启动速度这些东西,我直接用Mac OS不就完了吗干嘛折腾Arch呢?(事实上Arch Linux被我用于学习,Winodws和Mac OS被我用于生活娱乐,而工作用的是Ubuntu)。如果说使用Windows是无奈,Mac OS是因其颜值,那么使用Arch就是信仰:)。现在是,Arch Linux = linux kernel + systemd + pacman。手动再见。

我想,只有你赞成do one thing and do it well 和 KISS原则是一件需要坚持的事情,才会赞同我的观点,否则,你会觉得我是个傻叉。

我认为systemd做错的事情,就是在做好init system该做的事情之后,又做了很多不应该做的事情。甚至,只要systemd将它现在接管的这么多服务抽离出来,变成一个个独立的互不强制依赖的二进制包,反对的人会少很多,我也会开始喜欢它。也有人早已经这么做了,systemd的反对者们创建了一个分支:uselessd。这个项目将systemd的主服务抽离出来,去掉其他不相关的东西(如systemd-journald,udev等),将其改装成一个纯粹的init程序。这个思路是非常对的,可不幸的是,这个项目已经死了。so sad。

到今天,历史已经改变不了,自fedora率先采用systemd起,如今各大发行版包括Arch,debian,Ubuntu都已经切换到systemd或正在切换到systemd,只有Geetoo还没决定好。正如uselessd的发起者所说,发行版的维护者们变得懒惰了,systemd一统天下后维护工作将会变得异常简单。

The End: 我赞赏systemd的设计,当我使用的发行版决定采用它的时候,它却带来了个全家桶:(


原文自谢培阳的博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容