将Linux中systemd的单元配置实例化的方法
在运行的时候有可能需要将一个模版实例化好几个单元,@字符用于标识模版和单元文件的关系,实例化单元可以从另外一个单元文件(使用Requires或者Wants选项),或者使用systemctlstart命令。实例化服务单元可以按照下面的方式命名: template_name@instance_name.service 几个实例可以指向同一个模板文件配置选项常见的所有实例,举个例子,一个单元配置文件的Wants选项可以是: Wants=getty@ttyA.service,getty@ttyB.service 首先让systemd搜索给定服务单位,如果没有发现,systemd忽略@和点号之间的部分,直接搜索getty@.service服务文件,读取配置,并启动服务。 通配符字段,称为单元说明符,可以在任何单元配置文件使用。单位说明符替代某些单位在运行时参数和解释。常用的单元说明符说明如下: %n整个单元名字,包括类型的后缀,%N是相同的意义,但是ASCII取代为禁止字符。 %p前缀名字,在实例化的时候,%p代表@字符前面的部分。 %i实例名字,@字符和单元类型直接的部分。%I是相同的意义,但是ASCII取代为禁止字符。 %H主机名字,当配置文件被加载的时候的主机名。 %t运行时目录,当前的运行目录,对root用户就是/run目录,对于无特权用户就是XDG_RUNTIME_DIR变量指定的目录。 举个例子,getty@.service包含下面的结构: [Unit] Description=Gettyon%I ... [Service] ExecStart=-/sbin/agetty--noclear%I$TERM ... 当getty@ttyA.service和getty@ttyB.service实例化的时候,Description=被解释为“GettyonttyA”和"GettyonttyB"。 【将Linux中systemd的单元配置实例化的方法】相关文章: ★ Debian下如何配置Samba服务器的方法详解 ★ Linux系统下ssh的相关配置详细解析 ★ Linux下清除系统日志的方法 ★ Linux系统的安装和配置 ★ Linux下查看硬件信息的方法 ★ Linux DHCP 服务器配置方法介绍 ★ Linux上双网卡单网关设置方法步骤 ★ Linux 系统中确保访问三级域名畅通的方法 ★ 修改Linux主机名的方法 ★ linux下Samba服务和NFS服务配置的方法 (1)单元文件概述 单元文件包含单元的指令和行为信息。在后台systemctl命令和单元文件一起工作。为了出色而正确的完成工作,系统管理员必须能够手工编辑单元文件。一般系统管理员手工创建的单元文件建议存放在/etc/systemd/system/目录下面。 单元配置文件的格式是: unit_name.type_extension 这里的unit_name代表单元名称,type_extension代表单元类型。 单元文件可以作为附加的文件放置到一个目录下面,比如为了定制sshd.service服务,可以创建sshd.service.d/custom.conf文件,在文件中做一些自定义的配置。 同样的,可以创建sshd.service.wants/和sshd.service.requires/目录。这些目录包含sshd服务关联服务的软连接,在系统安装的时候,这些软连接或自动创建,也可以手工创建软连接。 许多单元配置文件可以使用单元说明符--通配的字符串,可以在单元文件被引导的时候动态的被变量替换。这使创建一些通用的单元配置模版成为可能。 (2)理解单元文件结构 典型的单元文件包含三节: [Unit]节,包含不依赖单元类型的一般选项,这些选型提供单元描述,知道单元行为,配置单元和其他单元的依赖性。 [unittype]节,如果单元有特定的类型指令,在unittype节这些指令被组织在一起。举个例子,服务单元文件包含[Service]节,里面有经常使用的服务配置。 [Install]节,包含systemctlenable或者disable的命令安装信息。 1)[Unit]节选项 Description单元描述信息,这些文字信息在systemclstatus命令是会输出。 Documentation单元文档信息的URLs。 After定义在那些单元之后启动,本单元只在制定的单元启动之后启动,不像Requires选项,After选项不明确激活特定的单元,Before选项则是有相反的功能。 Requires配置单元的依赖性,在Requires选项中的单元需要一起被激活,如果有一个单元启动失败,其他单元都不会被启动。 Wants比Requires选项依赖性要弱很多,如果列表之中的的单元启动失败,不会对其他单元造成影响,这是推荐的建立自定义单元依赖性的方式。 Conflicts定义单元冲突关系,和Requires相反。 2)[unittype]类型是[Service]时的选项 Type配置单元进程在启动时候的类型,影响执行和关联选项的功能,可选的关键字是: simple默认值,进程和服务的主进程一起启动; forking进程作为服务主进程的一个子进程启动,父进程在完全启动之后退出。 oneshot同simple相似,但是进程在启动单元之后随之退出。 dbus同simple相似,但是随着单元启动后只有主进程得到D-BUS名字。 notify同simple相似,但是随着单元启动之后,一个主要信息被sd_notify()函数送出。 idle同simple相似,实际执行进程的二进制程序会被延缓直到所有的单元的任务完成,主要是避免服务状态和shell混合输出。 ExecStart指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。 ExecStop指定单元停止时执行的命令或者脚本。 ExecReload指定单元重新加载是执行的命令或者脚本。 Restart这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。 RemainAfterExit如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。 3)[Install]节选项 Alias为单元提供一个空间分离的附加名字。 RequiredBy单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。 WantBy单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。 Also指出和单元一起安装或者被协助的单元。 DefaultInstance实例单元的限制,这个选项指定如果单元被允许运行默认的实例。 4)一个postfix服务的例子: 单元文件位于/usr/lib/systemd/system/postifix.service,内容如下: [Unit] Description=PostfixMailTransportAgent After=syslog.targetnetwork.target Conflicts=sendmail.serviceexim.service [Service] Type=forking PIDFile=/var/spool/postfix/pid/master.pid EnvironmentFile=-/etc/sysconfig/network ExecStartPre=-/usr/libexec/postfix/aliasesdb ExecStartPre=-/usr/libexec/postfix/chroot-update ExecStart=/usr/sbin/postfixstart ExecReload=/usr/sbin/postfixreload ExecStop=/usr/sbin/postfixstop [Install] WantedBy=multi-user.target (3)创建自定义的单元文件 以下几种场景需要自定义单元文件: 希望自己创建守护进程; 为现有的服务创建第二个实例; 引入SysV init脚本。 另外一方面,有时候需要修改已有的单元文件。 下面介绍创建单元文件的步骤: 1)准备自定义服务的执行文件。 可执行文件可以是脚本,也可以是软件提供者的的程序,如果需要,为自定义服务的主进程准备一个PID文件,一保证PID保持不变。另外还可能需要的配置环境变量的脚本,确保所以脚本都有可执行属性并且不需要交互。 2)在/etc/systemd/system/目录创建单元文件,并且保证只能被root用户编辑: touch/etc/systemd/system/name.servicechmod664/etc/systemd/system/name.service 文件不需要执行权限。 3)打开name.service文件,添加服务配置,各种变量如何配置视所添加的服务类型而定,下面是一个依赖网络服务的配置例子: [Unit] Description=service_description After=network.target [Service] ExecStart=path_to_executable Type=forking PIDFile=path_to_pidfile [Install] WantedBy=default.target 4)通知systemd有个新服务添加: systemctldaemon-reload systemctlstartname.service (4)创建emacs.service例子: 1)创建文件,并确保正确权限: ~]#touch/etc/systemd/system/emacs.service ~]#chmod664/etc/systemd/system/emacs.service 2)添加配置信息: [Unit] Description=Emacs:theextensible,self-documentingtexteditor [Service] Type=forking ExecStart=/usr/bin/emacs--daemon ExecStop=/usr/bin/emacsclient--eval"(kill-emacs)" Environment=SSH_AUTH_SOCK=%t/keyring/ssh Restart=always [Install] WantedBy=default.target 3)通知systemd并开启服务: ~]#systemctldaemon-reload ~]#systemctlstartemacs.service (5)创建第二个sshd服务的例子 1)拷贝sshd_config文件 ]#cp/etc/ssh/sshd{,-second}_config 2)编辑sshd-second_config文件,添加22220的端口,和PID文件: Port22220 PidFile/var/run/sshd-second.pid 如果还需要修改其他参数,请阅读帮助。 3)拷贝单元文件: ~]#cp/usr/lib/systemd/system/sshd{,-second}.service 4)编辑单元文件sshd-second.service 修改描述字段 Description=OpenSSHserversecondinstancedaemon 添加sshd.service服务在After关键字之后: After=syslog.targetnetwork.targetauditd.servicesshd.service 移除sshdkey创建: ExecStartPre=/usr/sbin/sshd-keygen 移除这一行 在执行脚本里,添加第二sshd服务的配置文件: ExecStart=/usr/sbin/sshd-D-f/etc/ssh/sshd-second_config$OPTIONS 修改后的sshd-second.service文件内容如下: [Unit] Description=OpenSSHserversecondinstancedaemon After=syslog.target network.targe tauditd.service sshd.service [Service] EnvironmentFile=/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config$OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target 5)如果使用SELinux,添加tcp端口,负责第二sshd服务的端口就会被拒绝绑定: ~]#semanage port -a -tssh_port_t -p tcp22220 6)设置开机启动并测试: ~]#systemctl enable sshd-second.service ~]$ssh -p 22220 user@server 确保防火墙端口也开放。 (6)修改已经存在的单元文件 systemd单元配置文件默认保存在/usr/lib/systemd/system/目录,系统管理员不建议直接修改这个目录下的文件,自定义的文件在/etc/systemd/system/目录下,如果有扩展的需求,可以使用以下方案: 创建一个目录/etc/systemd/system/unit.d/,这个是最推荐的一种方式,可以参考初始的单元文件,通过附件配置文件来扩展默认的配置,对默认单元文件的升级会被自动升级和应用。 从/usr/lib/systemd/system/拷贝一份原始配置文件到/etc/systemd/system/,然后修改。复制的版本会覆盖原始配置,这种方式不能增加附件的配置包unix系统设计,用于不需要附加功能的场景。 如果需要恢复到默认的配置文件,只需要删除/etc/systemd/system/下的配置文件就可以了,不需要重启机器,使用如下命令应用改变就可以: systemctl daemon-reload daemon-reload选项重新加载所以单元文件并重新创建依赖书,在需要立即应用单元文件改变的时候使用。另外,也可以使用下面的命令达到同样的目的: init q 还有,如果修改的是一个正在运行服务的单元文件,服务需要被重启下: systemct lrestart name.service (7)扩展默认单元配置文件配置 为了扩展默认的单元文件配置,需要先在/etc/systemd/system/下创建一个目录,用root执行类似下面的命令: mkdir/etc/systemd/system/name.service.d 在刚才创建的目录之下创建配置文件,必须以.conf文件结尾。 例如创建一个自定义的依赖文件,内容如下: [Unit] Requires=new_dependency After=new_dependency 另外一个例子,可以配置重启的时候,在主进程退出后30秒在重启,配置例子如下: [Service] Restart=always RestartSec=30 推荐每次只产生一个小文件,每个文件只聚焦完善一个功能,这样配置文件很容易被移除或者链接到其他服务对的配置目录中。 为了应用刚才的修改,使用root执行以下操作: systemctldaemon-reload systemctlrestartname.service 安装: yum install tigervnc-server 配置: (1) 复制配置文件: ~]# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@.service[/code] (2) 编辑配置文件: [code] ExecStart=/sbin/runuser -l USER -c "/usr/bin/vncserver %i -geometry 1280x1024" PIDFile=/home/USER/.vnc/%H%i.pid 将USER换成要使用的VNC服务的用户,比如root: ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i" 如果要修改分辨率可以修改geometry内容,其他不需要做修改。 然后保持配置。 (3)使用systemctl命令,强制重新读取配置文件: ~]# systemctl daemon-reload (4)配置vncserver密码 vncpasswd (5)如果有两个用户希望同时使用vnc,需要配置两份配置文件: vncserver-USER_1@.service 及 vncserver-USER_2@.service,文件内容同root用户的配置方法 然后为两个用户创建vnc密码: ~]$ su - USER_1 ~]$ vncpasswd Password: Verify: ~]$ su - USER_2 ~]$ vncpasswd Password: Verify: (6)启动vnc服务 systemctl start vncserver@:10 为了开机启动,使用如下命令: systemctl enable vncserver@:10 ln -s '/etc/systemd/system/vncserver@.service' '/etc/systemd/system/multi-user.target.wants/vncserver@:10.service' (7) 关闭进程 systemctl disable vncserver@:display_number.service systemctl stop vncserver@:display_number.service 【Linux系统下VNC SERVER的相关配置】相关文章: ★ 在Linux操作系统下修改IP、DNS和路由配置 ★ Linux下的代理服务器设置 ★ Linux下的软件安装 ★ 如何实现Linux操作系统的自动登录 ★ Linux操作系统中BSD套接口开发的基础介绍 ★ Linux下的硬件安装 ★ Linux系统中如何查看运行级别 ★ Linux系统找出大文件的方法 ★ Linux系统下破解SAM密码 ★ Linux系统中xorg.conf文件详细介绍 (编辑:成都站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |