Ubuntu 16.04把systemd作為Linux啟動(dòng)系統(tǒng),所以,我意識(shí)到是時(shí)候?qū)W習(xí)一下systemd了(雖然有點(diǎn)晚)。systemd出現(xiàn)于大約6年前,并且在幾年前就被眾多Linux發(fā)行版所使用。除了Gentoo,Ubuntu是最后一個(gè)默認(rèn)使用systemd的大的發(fā)行版。甚至Ubuntu 15在去年時(shí)就轉(zhuǎn)為使用systemd。 Linux社區(qū)中關(guān)于systemd的討論已經(jīng)持續(xù)了很長時(shí)間了,如果我還年輕,我可能會(huì)熱衷甚至?xí)⑴c討論,但是現(xiàn)在我并不關(guān)心那些討論,我只是想使用大家已達(dá)成共識(shí)的技術(shù)。令人失望的是論戰(zhàn)主導(dǎo)著對話,反而想學(xué)習(xí)systemd是什么變得困難,下面是我為理解systemd所作出的努力。 免責(zé)聲明:我并非專家,在一些地方難免犯錯(cuò)。我重申,寫這篇博客僅僅是為了作為自己的筆記,歡迎評論,但請不要浪費(fèi)我的時(shí)間討論一些偏激的意見。
由于我自己沒有使用裝有systemd的系統(tǒng),關(guān)于在實(shí)踐中使用systemd的鏈接只搜集了上面那些,所以說,我也有點(diǎn)out了。unit file看起來是非常有用的,它對systemd如何啟動(dòng)服務(wù)進(jìn)行配置。systemd也可以使用舊的SysVInit風(fēng)格的腳本來啟動(dòng)服務(wù),包括解析LSB頭部。 systemd是初始化系統(tǒng)(https://en./wiki/Init),是Linux系統(tǒng)的第一個(gè)用戶進(jìn)程,其進(jìn)程號(hào)為1。內(nèi)核準(zhǔn)備就緒后就會(huì)運(yùn)行systemd,systemd的任務(wù)是運(yùn)行其他用戶進(jìn)程從而組成Unix系統(tǒng),掛載文件系統(tǒng),配置網(wǎng)絡(luò),啟動(dòng)守護(hù)進(jìn)程等。 我們所熟知的init系統(tǒng)是SysVInit, systemd是init系統(tǒng)思想的重寫版本,其主要的設(shè)計(jì)目標(biāo)是提高性能。過去Unix系統(tǒng)啟動(dòng)時(shí)間高達(dá)90s,使用systemd(或者M(jìn)acOS下的Launchd)基本可以達(dá)到10s,甚至小于1s也是有可能的。systemd可以運(yùn)行的更快,是因?yàn)樗梢圆l(fā)執(zhí)行任務(wù)。此外,它避免了解釋shell腳本的所有開銷。據(jù)測,之于之前的系統(tǒng),systemd是現(xiàn)代化的、全新的、更好的,雖然我無法評估這一點(diǎn),但我相信應(yīng)該如此。 systemd是僅支持Linux的,它采用了一堆非POSIX API來執(zhí)行任務(wù)比如與設(shè)備協(xié)作,配置安全功能等。 我還沒有上手systemd,所以還沒接觸到其他方面。但是我的理解是,整個(gè)Unix配置都合并到unit file中,用來引導(dǎo)systemd配置和啟動(dòng)用戶空間程序。 我還有所顧忌,要不要升級Ubuntu 14 到Ubuntu 16,因?yàn)楸仨氁壦信f東西。升級后會(huì)正常工作嗎?特別提醒,我將Ubuntu 12升級到Ubuntu 14,然后手動(dòng)安裝了一些東西,導(dǎo)致以太網(wǎng)設(shè)備的名稱發(fā)生了改變,使得機(jī)器無法在網(wǎng)絡(luò)下重啟。 我真的不關(guān)心關(guān)于爭論的歷史。systemd是既成事實(shí),但是去關(guān)注一下這些爭論,對于更好地理解systemd也是有幫助的。 對于systemd,大家普遍在抱怨的是其復(fù)雜性。在一個(gè)聚集了60多個(gè)相互關(guān)聯(lián)的二進(jìn)制文件里,systemd做了很多事情,而不僅僅是復(fù)制子進(jìn)程。systemd將udev置于內(nèi)部來管理設(shè)備,它有自己的日志系統(tǒng)(以二進(jìn)制格式存放),等同于一個(gè)定時(shí)任務(wù)、inetd、atd、虛擬終端、一個(gè)登陸進(jìn)程、監(jiān)控系統(tǒng)等,當(dāng)你看到所有被取代的過時(shí)的Unix軟件時(shí),你會(huì)感到驚訝,我也理解了為什么信奉“眾多小工具”哲學(xué)的人為什么不喜歡systemd了。 另外,在sysvinit中,舊的組件組合在一起非常糟糕。shell需要掛載設(shè)備、文件系統(tǒng),然后啟動(dòng)網(wǎng)絡(luò),以便你能夠訪問其他文件系統(tǒng),以正確的順序啟動(dòng)其他守護(hù)進(jìn)程等等。當(dāng)然udev和掛載可能是單獨(dú)的軟件,但是它們只能以一個(gè)特定的關(guān)系運(yùn)行。這么一套包含眾多相互依賴組件的復(fù)雜系統(tǒng)成本很高,有點(diǎn)像說了一個(gè)“眾多小工具”的謊話。也有必須要說一下統(tǒng)一init、 cron、inet、登錄以及類似的模塊,這些都是響應(yīng)事件的啟動(dòng)程序,為什么不共享代碼呢? 作為一個(gè)龐大的項(xiàng)目,雖然systemd只有一種思想,仍然會(huì)有文化關(guān)懷。有些選擇讓我覺得很奇怪,比如二進(jìn)制日志格式。無論出于何種原因,大多數(shù)Linux發(fā)行版都同意使用systemd,我相信他們都會(huì)根據(jù)自己的需要去塑造systemd,這看起來是一種打造軟件的合理方法。 |
|