systemd替代xinetd
背景
systemd已經(jīng)逐步取代了init览闰,現(xiàn)在又在蠶食xinetd這種init的衍生品治专,感覺(jué)cron也難逃魔爪。systemd在各大新的發(fā)行版上也是無(wú)往不利关筒,感覺(jué)今后的服務(wù)器必將成為一大重器愧薛。但國(guó)內(nèi)這方面資料還是比較少,大多都是官方手冊(cè)的簡(jiǎn)單變換垦梆,少有見(jiàn)到一個(gè)真的實(shí)際使用匹颤。剛好手上有一個(gè)老的用xinetd的socket服務(wù)程序,手賤把服務(wù)器搞掛了托猩,直接升了最新的fedora-server印蓖。系統(tǒng)默認(rèn)不安裝crond,遠(yuǎn)程服務(wù)器包里甚至完全沒(méi)有xinetd程序京腥。無(wú)賴(lài)只能自己編譯安裝xinetd或者使用systemd代替赦肃。編譯安裝是安裝上了,但問(wèn)題是編譯安裝好后不給提供service管理界面公浪,頭疼他宛!用yum包安裝的daemon程序都會(huì)有service文件,可以直接使用systemctl啟動(dòng)欠气,關(guān)閉什么的厅各。自己編譯的xinetd簡(jiǎn)直不是親兒子,啥都沒(méi)有预柒。還要自己考慮service文件队塘。于是沒(méi)辦法反正都繞不開(kāi)systemd就學(xué)習(xí)學(xué)習(xí)唄。
本文內(nèi)容
systemd 簡(jiǎn)單認(rèn)識(shí)
systemd.socket認(rèn)識(shí)
systemd socket和service文件編寫(xiě)
firewalld 配置
systemd 簡(jiǎn)單認(rèn)識(shí)
systemd是為取代initd這樣的程序而產(chǎn)生的宜鸯,對(duì)于比較早的linux系統(tǒng)開(kāi)機(jī)有runlevel概念憔古,現(xiàn)在都還一大堆教你怎么改runlevel的文章,對(duì)于比較新的發(fā)行版一般都沒(méi)啥用了淋袖『枋校基本上新一點(diǎn)的系統(tǒng)都用systemd取代了initd。為什么會(huì)用systemd而不繼續(xù)使用initd啦即碗?原因比較多焰情,我一個(gè)菜鳥(niǎo)就不妄斷了。大概就知道systemd管的比initd寬剥懒,啟動(dòng)上可以欺騙系統(tǒng)從而更快點(diǎn)烙样。
對(duì)于用戶(hù)而言最重要的就是怎么用的問(wèn)題,systemd是后臺(tái)服務(wù)程序不用如何在意蕊肥,systemctl才是用戶(hù)界面。平時(shí)打交道也都是這個(gè)程序,這個(gè)命令就比較麻煩了壁却。功能太多所以交互也復(fù)雜批狱,這里羅列一點(diǎn)平時(shí)經(jīng)常使用的部分,對(duì)于更詳細(xì)的介紹可以移步Systemctl詳解
開(kāi)啟一個(gè)服務(wù)
systemctl start xxx.service
關(guān)閉一個(gè)服務(wù)
systemctl stop xxx.service
重啟一個(gè)服務(wù)
systemctl restart xxx.service
查看服務(wù)狀態(tài)
systemctl status xxx.service
設(shè)置開(kāi)機(jī)啟動(dòng)target, 相當(dāng)于老系統(tǒng)runlevel展东,常用target有multi-user.target(多用戶(hù)帶網(wǎng)絡(luò))
systemctl set-default xxx.target
設(shè)置service/socket/timer開(kāi)機(jī)啟動(dòng)
systemctl enable xxx.service
關(guān)閉service/socket/timer開(kāi)機(jī)啟動(dòng)
systemctl disable xxx.service
daemon程序重載
systemctl daemon-reload
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
systemd.socket 認(rèn)識(shí)
systemd有以下幾種文件后綴結(jié)尾的文件:
target: 可以包含多種服務(wù)赔硫、程序的集合,打開(kāi)這個(gè)target就會(huì)打開(kāi)這個(gè)target關(guān)聯(lián)的所有程序
socket: 定義一個(gè)套接字用盐肃,可以在socket文件里面關(guān)聯(lián)端口和依賴(lài)等信息
timer: 定義一個(gè)時(shí)鐘啟動(dòng)任務(wù)爪膊,可以理解為功能類(lèi)似crond,只是配置方法不一樣
service: 定義一個(gè)啟動(dòng)程序由systemctl管理砸王。service文件有兩種推盛,一種包含@字符,一種不包含@字符谦铃。具體啥區(qū)別我也說(shuō)不清楚耘成,可以自行man systemd.service
mount/device/path/swap: 目前還沒(méi)有使用過(guò),有興趣可以自行使用man命令查看
針對(duì)systemd替代xinetd主要就使用socket和service兩種驹闰,而socket是要加入到target文件中才能實(shí)現(xiàn)開(kāi)機(jī)啟動(dòng)
每一種文件都分為幾個(gè)段落瘪菌,每個(gè)段落有不同功能,具體可以使用man命令自行查看嘹朗。這里只是簡(jiǎn)單說(shuō)一下
service文件包含Unit,Service,Install三個(gè)段落师妙。Unit主要定義本服務(wù)描述,依賴(lài)屹培,啟動(dòng)先后等內(nèi)容默穴。Service包含啟動(dòng)相關(guān)信息,如啟動(dòng)命令惫谤,配置文件壁顶,啟動(dòng)時(shí)間,啟動(dòng)模式溜歪,工作目錄等若专。其中的工作模式要說(shuō)一下,主要使用的一般就simple,forking,oneshot蝴猪,simple就相當(dāng)于命令行啟動(dòng)调衰;forking是后臺(tái)運(yùn)行相當(dāng)于使用xinetd打開(kāi)自阱,oneshot只運(yùn)行一次。Install字段定義這個(gè)服務(wù)包含于那一個(gè)target
socket文件包含Unit,Install,Socket三個(gè)字段沛豌。Unit和Service中的一樣功能也類(lèi)似赃额,Socket字段包含了使用的端口信息和ip信息等相關(guān)內(nèi)容
以上文件存放位置可以通過(guò)man systemd.unit查看有詳細(xì)羅列。本人是將自己編寫(xiě)的文件存放在/etc/systemd/system/中跳芳,如果是單獨(dú)的用戶(hù)文件可以存放在~/.config/systemd/user/下,沒(méi)有這個(gè)目錄可以自行創(chuàng)建飞盆。管理user目錄下的服務(wù)要在systemctl命令上加上–user選項(xiàng),否則是管理的系統(tǒng)服務(wù)
以上信息都可以通過(guò)man命令自行查看手冊(cè)完整內(nèi)容
systemd socket和service文件編寫(xiě)
開(kāi)始編寫(xiě)前說(shuō)一下服務(wù)程序相關(guān)信息:
服務(wù)名 服務(wù)開(kāi)啟命令 服務(wù)使用端口號(hào)
xxserver xxserver 9888
file /etc/systemd/system/xxserver.socket
[Unit]
套接字描述
Description=XXX server
[Socket]
端口號(hào)
ListenStream=9888
IP類(lèi)型ipv4 + ipv6
BindIPv6Only=both
使用socket功能就要開(kāi)這個(gè)Accept
Accept=true
[Install]
包含在那個(gè)target中
WantedBy=sockets.target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
file /etc/systemd/system/xxserver@.service
[Unit]
Description=xxserver
依賴(lài)上一個(gè)文件
Requires=xxserver.socket
在下面兩個(gè)target后開(kāi)啟吓歇,因?yàn)槲页绦蛴昧藬?shù)據(jù)庫(kù),所以有mysqld.target
After=multi-user.target mysqld.target
[Service]
后臺(tái)運(yùn)行方式
Type=forking
有用到一個(gè)配置文件
EnvironmentFile=-/etc/xxxx
開(kāi)啟服務(wù)命令行
ExecStart=/usr/local/bin/pwserver
只能由socket調(diào)用開(kāi)啟
StandardInput=socket
Restart=on-failure
[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
以上兩個(gè)文件編好后就可以使用systemctl命令管理這個(gè)socket了
systemctl enable xxserver.socket // 把xxserver.socket加入到multi-user.target.wants城看,這個(gè)目錄下全是一些service,timier,socket文件的鏈接
systemctl start xxserver.socket // 開(kāi)啟服務(wù)
systemctl stop xxserver.socket // 關(guān)閉服務(wù)
systemctl status xxserver.socket // 如果看到綠色的 Active: active (listening)就表示開(kāi)啟并監(jiān)聽(tīng)成功,但很可能會(huì)開(kāi)啟出錯(cuò)可以使用鍵盤(pán)右方向鍵看下那里有錯(cuò)誤丧慈。也可以使用journalctl命令查看析命,兩個(gè)顯示信息大部份也是相同的,只是journalctl要相對(duì)更詳細(xì)一點(diǎn)
systemctl daemon-reload // 開(kāi)啟有錯(cuò)誤逃默,更改文件后使用它重載配置
1
2
3
4
5
firewalld 配置
上面一步完成其實(shí)就已經(jīng)完成了使用systemd代替xinetd鹃愤,后面的內(nèi)容只是因?yàn)閒edora34使用firewalld防火墻導(dǎo)致服務(wù)不能正常訪(fǎng)問(wèn),寫(xiě)一起記錄下完域。
firewalld是一個(gè)防火墻后臺(tái)服務(wù)程序软吐,前臺(tái)界面是firewall-cmd。firewall-cmd使用有比較全的firewall-cmd的使用方法吟税。
這里我只說(shuō)下我的認(rèn)識(shí)和注意項(xiàng):
防火墻通過(guò)服務(wù)凹耙、端口、網(wǎng)卡三個(gè)項(xiàng)目管理電腦服務(wù)肠仪,所以要打開(kāi)一個(gè)服務(wù)的訪(fǎng)問(wèn)就要分別開(kāi)啟這3個(gè)開(kāi)關(guān)肖抱,廢話(huà)不多說(shuō)上命令
firewall-cmd --zone=public --list-ports // 當(dāng)前打開(kāi)的端口
firewall-cmd --zone=public --add-port=9888/tcp --permanent // 開(kāi)機(jī)依然有效的打開(kāi)9888的tcp端口
firewall-cmd --zone=public --add-interface=eth0 --permanent // 永久開(kāi)啟網(wǎng)卡對(duì)外權(quán)限,eth0是你的網(wǎng)卡名字,可以使用ifconfig查看
firewall-cmd --add-service=xxx --permanent
/* 以上命令是最麻煩的一個(gè)异旧,因?yàn)槿绻阋远x一個(gè)服務(wù)意述,那就要改文件。xinetd時(shí)代是通過(guò)更改/etc/service文件實(shí)現(xiàn)吮蛹,
*在里面加入一行新內(nèi)容就可以了荤崇。而firewalld明明有/etc/service文件它不用非要使用什么反人類(lèi).xml文件配置服務(wù),也是不得不吐槽下潮针。
- /etc/firewalld/services/目錄下復(fù)制一個(gè)/lib/firewalld/services/下的任意xxx.xml文件术荤。更改里面的<short>xxx</short>和<port protocol="tcp" port="9888"/>
- 有了上面的文件firewall-cmd才能識(shí)別你的服務(wù)項(xiàng)不然就會(huì)顯示下面這個(gè)錯(cuò)誤*/
Authorization failed.
Make sure polkit agent is running or run the application as superuser.
還有一個(gè)注意項(xiàng)就是開(kāi)服務(wù)時(shí)不能加上--zone=public,也不知道為什么每篷“昶荩可以使用firewall-cmd --query-service=xxxx
查看一個(gè)服務(wù)是否開(kāi)啟端圈,開(kāi)啟是yes,未開(kāi)啟是no
不確定是不是防火墻問(wèn)題可以使用systemctl stop firewalld.service關(guān)閉防火墻先
除了防火墻linux還有一個(gè)selinux也會(huì)限制你通過(guò)網(wǎng)絡(luò)使用服務(wù)程序带兜,所以在這方面可以逐步排查枫笛,這里給一個(gè)臨時(shí)關(guān)閉selinux命令setenforce 0
。具體可以自行搜索或man