赞
踩
systemd已经逐步取代了init,现在又在蚕食xinetd这种init的衍生品,感觉cron也难逃魔爪。systemd在各大新的发行版上也是无往不利,感觉今后的服务器必将成为一大重器。但国内这方面资料还是比较少,大多都是官方手册的简单变换,少有见到一个真的实际使用。刚好手上有一个老的用xinetd的socket服务程序,手贱把服务器搞挂了,直接升了最新的fedora-server。系统默认不安装crond,远程服务器包里甚至完全没有xinetd程序。无赖只能自己编译安装xinetd或者使用systemd代替。编译安装是安装上了,但问题是编译安装好后不给提供service管理界面,头疼!用yum包安装的daemon程序都会有service文件,可以直接使用systemctl启动,关闭什么的。自己编译的xinetd简直不是亲儿子,啥都没有。还要自己考虑service文件。于是没办法反正都绕不开systemd就学习学习呗。
systemd是为取代initd这样的程序而产生的,对于比较早的linux系统开机有runlevel概念,现在都还一大堆教你怎么改runlevel的文章,对于比较新的发行版一般都没啥用了。基本上新一点的系统都用systemd取代了initd。为什么会用systemd而不继续使用initd啦?原因比较多,我一个菜鸟就不妄断了。大概就知道systemd管的比initd宽,启动上可以欺骗系统从而更快点。
对于用户而言最重要的就是怎么用的问题,systemd是后台服务程序不用如何在意,systemctl才是用户界面。平时打交道也都是这个程序,这个命令就比较麻烦了。功能太多所以交互也复杂,这里罗列一点平时经常使用的部分,对于更详细的介绍可以移步Systemctl详解
# 开启一个服务 systemctl start xxx.service # 关闭一个服务 systemctl stop xxx.service # 重启一个服务 systemctl restart xxx.service # 查看服务状态 systemctl status xxx.service # 设置开机启动target, 相当于老系统runlevel,常用target有multi-user.target(多用户带网络) systemctl set-default xxx.target # 设置service/socket/timer开机启动 systemctl enable xxx.service # 关闭service/socket/timer开机启动 systemctl disable xxx.service # daemon程序重载 systemctl daemon-reload
systemd有以下几种文件后缀结尾的文件:
man systemd.service
针对systemd替代xinetd主要就使用socket和service两种,而socket是要加入到target文件中才能实现开机启动
每一种文件都分为几个段落,每个段落有不同功能,具体可以使用man命令自行查看。这里只是简单说一下
service文件包含Unit,Service,Install三个段落。Unit主要定义本服务描述,依赖,启动先后等内容。Service包含启动相关信息,如启动命令,配置文件,启动时间,启动模式,工作目录等。其中的工作模式要说一下,主要使用的一般就simple,forking,oneshot,simple就相当于命令行启动;forking是后台运行相当于使用xinetd打开,oneshot只运行一次。Install字段定义这个服务包含于那一个target
socket文件包含Unit,Install,Socket三个字段。Unit和Service中的一样功能也类似,Socket字段包含了使用的端口信息和ip信息等相关内容
以上文件存放位置可以通过man systemd.unit
查看有详细罗列。本人是将自己编写的文件存放在/etc/systemd/system/中,如果是单独的用户文件可以存放在~/.config/systemd/user/下,没有这个目录可以自行创建。管理user目录下的服务要在systemctl命令上加上–user选项,否则是管理的系统服务
以上信息都可以通过man命令自行查看手册完整内容
开始编写前说一下服务程序相关信息:
服务名 | 服务开启命令 | 服务使用端口号 |
---|---|---|
xxserver | xxserver | 9888 |
# file /etc/systemd/system/xxserver.socket [Unit] # 套接字描述 Description=XXX server [Socket] # 端口号 ListenStream=9888 # IP类型ipv4 + ipv6 BindIPv6Only=both # 使用socket功能就要开这个Accept Accept=true [Install] # 包含在那个target中 WantedBy=sockets.target
#file /etc/systemd/system/xxserver@.service [Unit] Description=xxserver # 依赖上一个文件 Requires=xxserver.socket # 在下面两个target后开启,因为我程序用了数据库,所以有mysqld.target After=multi-user.target mysqld.target [Service] # 后台运行方式 Type=forking # 有用到一个配置文件 EnvironmentFile=-/etc/xxxx # 开启服务命令行 ExecStart=/usr/local/bin/pwserver # 只能由socket调用开启 StandardInput=socket Restart=on-failure [Install] WantedBy=multi-user.target
以上两个文件编好后就可以使用systemctl命令管理这个socket了
systemctl enable xxserver.socket // 把xxserver.socket加入到multi-user.target.wants,这个目录下全是一些service,timier,socket文件的链接
systemctl start xxserver.socket // 开启服务
systemctl stop xxserver.socket // 关闭服务
systemctl status xxserver.socket // 如果看到绿色的 Active: active (listening)就表示开启并监听成功,但很可能会开启出错可以使用键盘右方向键看下那里有错误。也可以使用journalctl命令查看,两个显示信息大部份也是相同的,只是journalctl要相对更详细一点
systemctl daemon-reload // 开启有错误,更改文件后使用它重载配置
上面一步完成其实就已经完成了使用systemd代替xinetd,后面的内容只是因为fedora34使用firewalld防火墙导致服务不能正常访问,写一起记录下。
firewalld是一个防火墙后台服务程序,前台界面是firewall-cmd。firewall-cmd使用有比较全的firewall-cmd的使用方法。
这里我只说下我的认识和注意项:
防火墙通过服务、端口、网卡三个项目管理电脑服务,所以要打开一个服务的访问就要分别开启这3个开关,废话不多说上命令
firewall-cmd --zone=public --list-ports // 当前打开的端口
firewall-cmd --zone=public --add-port=9888/tcp --permanent // 开机依然有效的打开9888的tcp端口
firewall-cmd --zone=public --add-interface=eth0 --permanent // 永久开启网卡对外权限,eth0是你的网卡名字,可以使用ifconfig查看
firewall-cmd --add-service=xxx --permanent
/* 以上命令是最麻烦的一个,因为如果你要自定义一个服务,那就要改文件。xinetd时代是通过更改/etc/service文件实现,
*在里面加入一行新内容就可以了。而firewalld明明有/etc/service文件它不用非要使用什么反人类.xml文件配置服务,也是不得不吐槽下。
* /etc/firewalld/services/目录下复制一个/lib/firewalld/services/下的任意xxx.xml文件。更改里面的<short>xxx</short>和<port protocol="tcp" port="9888"/>
* 有了上面的文件firewall-cmd才能识别你的服务项不然就会显示下面这个错误*/
Authorization failed.
Make sure polkit agent is running or run the application as superuser.
还有一个注意项就是开服务时不能加上--zone=public,也不知道为什么。可以使用`firewall-cmd --query-service=xxxx`查看一个服务是否开启,开启是yes,未开启是no
不确定是不是防火墙问题可以使用systemctl stop firewalld.service关闭防火墙先
除了防火墙linux还有一个selinux也会限制你通过网络使用服务程序,所以在这方面可以逐步排查,这里给一个临时关闭selinux命令`setenforce 0`。具体可以自行搜索或man
firewall-cmd --reload // 重新装载刚刚的配置项
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。