systemd

关于

systemd是一个用于管理Linux系统启动过程和系统服务的系统和服务管理器。它是现代Linux发行版中广泛采用的一种替代方案,取代了传统的SysV init系统。

systemd的设计目标是提供更快的启动速度、更有效的资源管理、更简化的配置和管理方式,以及更强大的功能和扩展性。它引入了一些新的概念和特性,如并行启动、按需启动、单元文件、依赖关系、日志记录等。

以下是一些systemd的主要特点:

  • 并行启动:systemd可以并行启动系统服务,从而加快系统启动过程。它通过定义服务之间的依赖关系,以及使用socket激活和按需启动等机制,实现了高效的并行启动。

  • 单元文件:systemd使用单元文件来描述和配置系统服务。每个服务都有一个对应的服务单元文件(.service),其中包含了服务的配置和行为信息。通过编辑这些单元文件,可以灵活地配置和管理系统服务。

  • 依赖关系:systemd允许通过定义依赖关系来控制服务的启动顺序。服务可以指定它们所依赖的其他服务,以确保在启动时按正确的顺序启动。

  • 日志记录:systemd引入了journal日志系统,用于记录系统和服务的日志信息。它提供了强大的日志过滤和查询功能,可以更方便地查看和分析系统日志。

  • 用户会话管理:除了系统服务管理外,systemd还提供了用户会话管理功能。它可以在用户登录时启动和管理用户会话,并在用户注销时清理会话相关的资源。

  • 轻量级容器管理:systemd还提供了一些功能来管理轻量级容器,如namespace隔离、cgroup资源控制等。这使得systemd成为一种在容器化环境中运行和管理服务的选择。

总体而言,systemd为Linux系统提供了一种现代化的、统一的系统和服务管理框架。它简化了系统配置和管理的过程,并提供了更好的性能和功能。然而,由于systemd的引入涉及到一些系统级的改变,它也引起了一些争议和讨论。不同的Linux发行版可以在使用systemd的程度和方式上有所差异。

systemd的编写

如果我想创建一个守护进程,或者让他开机自启,想使用systemd来管理一些软件,就需要编写一些service文件。

使用systemd来管理一个软件,可以按照以下步骤进行操作:

  1. 创建一个服务单元文件:在systemd中,每个要管理的软件都需要一个对应的服务单元文件。可以使用任何文本编辑器创建一个以.service为后缀的服务单元文件,例如mysoftware.service

  2. 编写服务单元文件:在服务单元文件中,你需要定义软件的各种配置和行为。以下是一个示例服务单元文件的基本结构:

[Unit]
Description=My Software
After=network.target

[Service]
ExecStart=/path/to/mysoftware
WorkingDirectory=/path/to/working/directory
User=myuser
Group=mygroup
Restart=always

[Install]
WantedBy=multi-user.target

在上述示例中,你需要根据实际情况进行以下调整:

  • Description:提供对软件的简短描述。
  • ExecStart:指定要运行的软件的可执行文件路径。
  • WorkingDirectory:指定软件的工作目录。
  • UserGroup:指定以哪个用户和组的身份运行软件。
  • Restart:指定软件在意外退出时是否自动重启。
  • WantedBy:指定在哪些目标(target)下启用该服务。
  1. 将服务单元文件移动到适当的位置:将服务单元文件移动到/etc/systemd/system/目录下,以便systemd可以找到它。可以使用以下命令将文件移动到目标位置:
sudo mv mysoftware.service /etc/systemd/system/
  1. 重新加载systemd配置:在将服务单元文件放置到正确的位置后,需要重新加载systemd配置,以使其意识到新添加的服务。可以使用以下命令重新加载systemd配置:
sudo systemctl daemon-reload
  1. 启动和管理服务:现在,你可以使用systemd来启动、停止、重启和管理你的软件了。以下是一些常用的systemd命令示例:
  • 启动服务:sudo systemctl start mysoftware
  • 停止服务:sudo systemctl stop mysoftware
  • 重启服务:sudo systemctl restart mysoftware
  • 查看服务状态:sudo systemctl status mysoftware
  • 设置服务开机自启动:sudo systemctl enable mysoftware
  • 禁用服务开机自启动:sudo systemctl disable mysoftware
  • 查看所有服务service文件 systemctl list-unit-files

Selinux

要关闭 SELinux,你可以按照以下步骤进行操作:

  1. 打开终端以获取 root 权限(或使用 sudo)。

  2. 编辑 SELinux 配置文件 /etc/selinux/config,可以使用任何文本编辑器打开该文件。

  3. 在配置文件中找到 SELINUX 的行,它指定了 SELinux 的模式。可能的取值包括 enforcing(强制模式)、permissive(宽容模式)和 disabled(禁用模式)。

  4. SELINUX 的值更改为 disabled,即将 SELinux 禁用。

  5. 保存并关闭配置文件。

  6. 重新启动系统,使更改生效。

请注意,禁用 SELinux 可能会降低系统的安全性。在禁用 SELinux 之前,请确保了解系统安全性方面的风险,并确保有其他适当的安全措施来保护系统。

如果你只是想临时禁用 SELinux,而不是永久禁用,你可以运行以下命令:

sudo setenforce 0

这将将 SELinux 设置为宽容模式,允许所有操作,但不会禁用 SELinux。

Friewall

关闭防火墙可能会导致系统的安全性降低,因此在关闭防火墙之前,请确保了解潜在的风险,并确保有其他适当的安全措施来保护系统。如果你仍然希望关闭防火墙,请按照以下步骤进行操作:

  1. 打开终端以获取 root 权限(或使用 sudo)。

  2. 检查你的系统上正在运行的防火墙服务。常见的防火墙服务包括 iptables、firewalld 等。你可以运行以下命令来检查当前正在运行的防火墙服务:

    对于 iptables:

    sudo service iptables status
    

    对于 firewalld:

    sudo systemctl status firewalld
    

    这将显示防火墙服务的状态信息。

  3. 停止防火墙服务。根据你的系统上正在运行的防火墙服务,运行适当的命令来停止它。例如:

    对于 iptables:

    sudo service iptables stop
    

    对于 firewalld:

    sudo systemctl stop firewalld
    

    这将停止防火墙服务。

  4. 禁用防火墙服务。运行适当的命令来禁用防火墙服务,以防止其在系统启动时自动启动。例如:

    对于 iptables:

    sudo chkconfig iptables off
    

    对于 firewalld:

    sudo systemctl disable firewalld
    

    这将禁用防火墙服务。

日志

/var/log/message:记录Linux操作系统常见的系统和服务错误信息
/var/log/boot.log:录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息
/var/log/lastlog :记录最后一次用户成功登陆的时间、登陆IP等信息(一般通过命令 lastlog 查看)
/var/log/secure :Linux系统安全日志,记录用户和工作组变坏情况、用户登陆认证情况
/var/log/btmp :记录Linux登陆失败的用户、时间以及远程IP地址(lastbm)
/var/log/wtmp:该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,使用last命令查看

auth pam 产生的日志

authpriv ssh,ftp 等登录信息的验证信息

cron 时间任务相关

kern 内核

lpr 打印

mail 邮件

mark(syslog)-rsyslog 服务内部的信息,时间标识

news 新闻组

user 用户程序产生的相关信息

日志级别分为:7种日志级别代号0-7

0 debug 有调试信息的,日志信息最多

1 info 一般信息的日志,最常用

2 notice 最具有重要性的普通条件的信息

3 warning 警告级别

4 err 错误级别,阻止某个功能或者模块不能正常工作的信息

5 crit 严重级别,阻止整个系统或者整个软件不能工作的信息

6 alert 需要立刻修改的信息

7 emerg 内核崩溃等严重信息

none 什么都不记录

rsyslog
rsyslog 是一个功能强大的日志服务,广泛用于许多Linux发行版中。它可以接收来自各种来源的日志消息,并将它们写入适当的日志文件。以下是一些关于 rsyslog 的重要信息:

  1. 配置文件:rsyslog 的主要配置文件是 /etc/rsyslog.conf。在该文件中,您可以定义日志消息的接收方式、过滤规则、目标文件以及其他行为。此外,您还可以使用 /etc/rsyslog.d/ 目录下的额外配置文件来进一步定制 rsyslog。

  2. 日志文件:rsyslog 可以将日志消息写入不同的日志文件。常见的日志文件包括 /var/log/messages/var/log/syslog/var/log/auth.log 等。您可以根据需要在配置文件中指定不同的目标文件。

  3. 过滤规则:rsyslog 允许您使用过滤规则来选择性地处理日志消息。您可以根据消息的优先级、来源IP、设备名称等条件进行过滤。过滤规则可以帮助您将日志消息分类、转发到不同的文件或远程服务器。

  4. 远程日志记录:rsyslog 支持将日志消息转发到远程服务器。您可以配置 rsyslog 以将特定类型的日志消息发送到远程服务器以进行集中管理和分析。

  5. 模块和插件:rsyslog 提供了各种模块和插件,可以扩展其功能。例如,您可以使用 omfile 模块将日志消息写入到其他类型的文件(如数据库),使用 ommail 模块将日志消息发送到电子邮件,使用 omstdout 模块将日志消息输出到标准输出等。

  6. 工具和命令:rsyslog 提供了一些工具和命令来管理和查询日志消息。例如,您可以使用 rsyslogd 命令启动和停止 rsyslog 服务,使用 logger 命令手动发送日志消息,使用 rsyslog.conf 命令检查配置文件的语法等。

vim /etc/rsyslog.conf
日志对象(设备):你要对什么东东做日志
日志级别:级别越低,信息越多
日志文件:存储日志的文件

日志对象.日志级别	日志文件
.  大于或者等于后面指定的日志级别
.= 等于后面指定的日志级别
.! 非

例:
*.* 				    		/var/log/mylog
kern.err 						/var/log/kernel.log
*.info;mail.none    /var/log/big.log
mail.info						/var/log/mail.log
cron.info;cron.!err /var/log/newcron
cron.info   				/var/log/newcron

4.1、日志轮转

vim /etc/logrotate.conf
	//全局配置
	weekly     轮转周期    默认一周轮转一次
	rotate 4    轮转次数    默认轮转4次
	create		创建新文件
	dateext	以轮转时刻的时间作为轮转文件的结尾
	//局部配置
	include /etc/logrotate.d
	missingok   在文件不存在的时候也不报错
	create 0644 root utmp

强制轮转

logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

测试日志轮转,轮转文件/var/log/yum.log
vim /etc/logrotate.d/yum
/var/log/yum.log {
missingok
notifempty
size 30k
yearly
daily
rotate 3
create 0777 root root
}


测试:
logrotate /etc/logrotate.conf //手动轮转
ls /var/log/yum*
/var/log/yum.log /var/log/yum.log-20170331
grep 'yum' /var/lib/logrotate/logrotate.status //记录所有日志文件最近轮转的时间
"/var/log/yum.log" 2017-3-31-10:0:23

date 09011000
logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
2. 日志安全,操作日志的隐藏权限

/etc/logrotate.d/messages
建议测试时先把/etc/logrotate.d/syslog中messages删除
/var/log/messages {
    prerotate
       chattr -a /var/log/messages
    endscript

    #notifempty
    daily
	create 0600 root root
    missingok
   	rotate 5

    postrotate
        chattr +a /var/log/messages
    endscript
}
  1. 为多个日志文件配置日志轮转
vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/secure
/var/log/spooler
{
    missingok
    sharedscripts   
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}