Linux下的systemd以及Selinux和日志
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来管理一个软件,可以按照以下步骤进行操作:
-
创建一个服务单元文件:在systemd中,每个要管理的软件都需要一个对应的服务单元文件。可以使用任何文本编辑器创建一个以
.service
为后缀的服务单元文件,例如mysoftware.service
。 -
编写服务单元文件:在服务单元文件中,你需要定义软件的各种配置和行为。以下是一个示例服务单元文件的基本结构:
[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
:指定软件的工作目录。User
和Group
:指定以哪个用户和组的身份运行软件。Restart
:指定软件在意外退出时是否自动重启。WantedBy
:指定在哪些目标(target)下启用该服务。
- 将服务单元文件移动到适当的位置:将服务单元文件移动到
/etc/systemd/system/
目录下,以便systemd可以找到它。可以使用以下命令将文件移动到目标位置:
sudo mv mysoftware.service /etc/systemd/system/
- 重新加载systemd配置:在将服务单元文件放置到正确的位置后,需要重新加载systemd配置,以使其意识到新添加的服务。可以使用以下命令重新加载systemd配置:
sudo systemctl daemon-reload
- 启动和管理服务:现在,你可以使用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,你可以按照以下步骤进行操作:
-
打开终端以获取 root 权限(或使用 sudo)。
-
编辑 SELinux 配置文件
/etc/selinux/config
,可以使用任何文本编辑器打开该文件。 -
在配置文件中找到
SELINUX
的行,它指定了 SELinux 的模式。可能的取值包括enforcing
(强制模式)、permissive
(宽容模式)和disabled
(禁用模式)。 -
将
SELINUX
的值更改为disabled
,即将 SELinux 禁用。 -
保存并关闭配置文件。
-
重新启动系统,使更改生效。
请注意,禁用 SELinux 可能会降低系统的安全性。在禁用 SELinux 之前,请确保了解系统安全性方面的风险,并确保有其他适当的安全措施来保护系统。
如果你只是想临时禁用 SELinux,而不是永久禁用,你可以运行以下命令:
sudo setenforce 0
这将将 SELinux 设置为宽容模式,允许所有操作,但不会禁用 SELinux。
Friewall
关闭防火墙可能会导致系统的安全性降低,因此在关闭防火墙之前,请确保了解潜在的风险,并确保有其他适当的安全措施来保护系统。如果你仍然希望关闭防火墙,请按照以下步骤进行操作:
-
打开终端以获取 root 权限(或使用 sudo)。
-
检查你的系统上正在运行的防火墙服务。常见的防火墙服务包括 iptables、firewalld 等。你可以运行以下命令来检查当前正在运行的防火墙服务:
对于 iptables:
sudo service iptables status
对于 firewalld:
sudo systemctl status firewalld
这将显示防火墙服务的状态信息。
-
停止防火墙服务。根据你的系统上正在运行的防火墙服务,运行适当的命令来停止它。例如:
对于 iptables:
sudo service iptables stop
对于 firewalld:
sudo systemctl stop firewalld
这将停止防火墙服务。
-
禁用防火墙服务。运行适当的命令来禁用防火墙服务,以防止其在系统启动时自动启动。例如:
对于 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 的重要信息:
-
配置文件:rsyslog 的主要配置文件是
/etc/rsyslog.conf
。在该文件中,您可以定义日志消息的接收方式、过滤规则、目标文件以及其他行为。此外,您还可以使用/etc/rsyslog.d/
目录下的额外配置文件来进一步定制 rsyslog。 -
日志文件:rsyslog 可以将日志消息写入不同的日志文件。常见的日志文件包括
/var/log/messages
、/var/log/syslog
、/var/log/auth.log
等。您可以根据需要在配置文件中指定不同的目标文件。 -
过滤规则:rsyslog 允许您使用过滤规则来选择性地处理日志消息。您可以根据消息的优先级、来源IP、设备名称等条件进行过滤。过滤规则可以帮助您将日志消息分类、转发到不同的文件或远程服务器。
-
远程日志记录:rsyslog 支持将日志消息转发到远程服务器。您可以配置 rsyslog 以将特定类型的日志消息发送到远程服务器以进行集中管理和分析。
-
模块和插件:rsyslog 提供了各种模块和插件,可以扩展其功能。例如,您可以使用 omfile 模块将日志消息写入到其他类型的文件(如数据库),使用 ommail 模块将日志消息发送到电子邮件,使用 omstdout 模块将日志消息输出到标准输出等。
-
工具和命令: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
}
- 为多个日志文件配置日志轮转
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
}