linux备忘录-系统服务daemon
服务(daemon)及其分类
Linux中的服务被称为daemon(daemon是守护神,恶鬼的意思哦)。这些daemon会常驻在内存当中,从而对我们的系统和任务等进行一些辅助性的工作。实际上,daemon实际上是指Linux服务的那个程序。例如例行性工作排程的服务程序crond,这个程序会常驻在内存中,每分钟侦查一下配置文件/etc/crontab,从而为我们执行一些循环性的、周期性的工作。
服务(daemon)的分类
对于服务daemon来说,可以将其分成两类
- stand_alone型
stand_alone型的daemon可以自行独立启动服务,并常驻在内存当中运行。
- super daemon型
super daemon型的服务需要通过一个统一的daemon进行唤醒启动。而这个唤醒其他daemon的daemen被称为super daemon。以前super daemon是程序inetd,现在被xinetd取代。
这种类型的daemon并不是一直处于运行状态,只有收到客户端的要求时,super daemon才会唤醒这种类型的daemon,对客户端的请求做出详情。当服务结束后,该daemon也会结束并释放资源。
其中的super daemon是常驻在内存中的。
例如 telnet 就是super daemon管理的服务。
对于super daemon的服务类型,可以分为以下两种处理模式
- multi-threaded (多线程)
super daemon会根据客户端的请求个数来触发多个daemon来响应客户端的请求。
- single-threaded
无论客户端的请求数量是多少,super daemon只会触发一个daemon进行处理。
根据daemon提供服务的工作状态,daemon又可以分为两种类型
- signal-control
这种daemon是根据信号来处理的,只要有请求,就立刻进行处理。例如打印机的服务cupsd。
- interval-control
这种daemon每隔一段时间就会主动地去执行工作。例如工作排程中的服务atd和crond。
通过man 3 daemon可以查阅开发服务的相关信息。
服务daemon的命名一般是后面有一个字母 d,例如atd、crond、syslogd等。
服务与端口号的对应
通过对档案/etc/services的配置,可以使得服务于端口号(port)对应起来。
/etc/services文件中每一行都是同样的格式。每一行都是服务和端口号的对应关系。其格式为
服务名称(daemon name) 端口号(port)/封包协议 该服务的说明
# 其中封包协议 一般为TCP或UDP协议
daemon 启动脚本与启动方式
damen启动后所取得的程序的PID都会记录在/var/run目录下。
damen启动脚本和相关档案的存放处为
- /etc/init.d/* :启动脚本存放处
/etc/init.d/* 是公认的存放daemon脚本的目录,有些发行版本会存放在/etc/rc.d/init.d/*,但同时也会在/etc/init.d中设置相应的连结档。
- /etc/sysconfig/* :服务的初始化环境配置文件存放处
几乎所有服务的初始化配置档案都会存放在/etc/sysconfig/* 目录下。例如syslog服务的初始化配置文件存放在/etc/sysconfig/syslog,网络的初始化配置文件存放在/etc/sysconfig/network
- /etc/xinetd.conf和/etc/xinetd.d/* :super daemon相关的配置文件
super daemon的配置文件为/etc/xinetd.conf,而super daemon管理的daemon的配置文件存放在/etc/xinetd.d/*目录下。
- /etc/* :各服务的配置文件
- /var/lib/* :各服务产生的数据库
一些会产生数据的服务会将其数据存放在目录/var/lib/*中。如MySql的数据库默认写入目录/var/lib/mysql/中。
- /var/run/* :各服务程序的PID记录处。
例如syslog的PID记录在/var/run/syslogd.pid。
stand alone型daemon的/etc/init.d/*启动
# 例如
# 不加参数会列出参数用法
/etc/init.d/syslog
# 观察syslog目前状态
/etc/init.d/syslog status
# 重新读取一次配置文件
/etc/init.d/syslog restart
/etc/init.d/syslog status
通过命令service也可以对服务进行操作
service [service name] [start|stop|restart|...]
service --status-all
# 选项和参数
# --status-all 将所有的stand alone的daemon的状态列出
# 例子
# 重新启动crond这个daemon
service crond restart
# 或者
/etc/init.d/crond restart
# 将所有的stand alone的daemon的状态列出
service --status-all
打开或关闭某个端口号
在Linux中,要打开或关闭某个端口号,实际上就是打开或关闭某个服务
super daemon的启动方式
super daemon也是一直stand alone型的daemon,因此其启动方式和普通的stand alone型daemon相同。但是super daemon要管理其他服务,通过grep -i 'disable' /etc/xinetd.d/*查看super daemon管理的服务是否启动。
如果要启动super daemon管理的某个服务,需要如下步骤
- 在相对应的/etc/xinetd.d/*配置文件中将disable = true改成diable = no。
# 例如
vim /etc/xinetd.d/rsync
# ...
# disable = no
# ...
- 重新启动xinetd这个服务
/etc/init.d/xinetd restart
# 或者
service xinetd restart
- 观察启动的端口
grep 'rsync' /etc/services
# 若找到为873端口
netstat -tnlp | grep '873'
- super daemon类型的服务(非stand alone类型的),重新配置后,需要重启xinetd服务,而非自身。
(super daemon) xinetd 的配置文件
xinetdd的配置文件为/etc/xinetd.config。/etc/xinetd.config记录着xinetd所管理服务启动时的默认值。
/etc/xinetd.config档案中包含了目录/etc/xinetd.d/*。档案中又这么一句
includedir /etc/xinetd.d
对于/etc/xinetd.d目录下的参数档案,其格式为
service <service_name>
{
<attribute> <assign_op> <vaue> <value> ...
}
# attribute :xinetd的管理参数
# assign_op :参数的设定操作
# = :设定参数
# += :添加参数
# -= :减少参数
# value :attribute对应的取值
# attribute与value的取值
# diable 服务是否要启动
# [yes|no]
# id 设定服务的id
# 服务的id名称
# server 服务启动程序的完整档名
# 完整档名,如/usr/bin/rsync
# server_args 启动程序命令行参数
# user 使用者账号
# group 使用组
# socket_type
# [stream|dgram|raw] tcp为stream udp为dgram
# protocol 网络协议 需参考 /etc/protocols
# [tcp|udp]
# wait 是否是single-threaded,否则是multi-threaded
# [yes|no]
# instances 服务支持的最大联机数量
# [数字或UNLIMITED]
# per_source 每个IP的最大联机数量
# [数字或UNLIMITED]
# cps 短时间联机限制
# 两个数字 1.一秒内能接受的最大联机数 2.超过则停止服务的秒数
# log_type 数据记录档案和等级
# 档案项目 等级
# log_on_success 和 log_on_failure 成功登入或失败登入时需要记录的项目
# [PID,HOST,USERID,EXIT,DURATION]
# PID 为服务启动时的PID
# HOST 为远程主机的IP
# USERID 为登陆者的账号
# EXIT 离开的时候记录的项目
# DURATION 用户使用此服务多久
# env 设定额外环境变量
# 变量名称=变量内容
# port 设定不同的服务与对应的端口
# [一组数字(小于65534)]
# redirect 将请求转发到另一台主机
# [IP port]
# includedir 包含整个目录档案的设定
# [目录名称]
# bind 将服务绑定某个IP
# [IP]
# interface 与bind相同
# only_from 只有规定的IP或主机名可以登入
# [0.0.0.0,192.168.1.0/24,hostname,domainname]
# 0.0.0.0表示所有PC都可以登入
# 192.168.0.1/24表示C类IP,即192.168.1.1 ~ 192.168.1.255
# no_access 与 only_from查不到
# access_times 服务启动的时间
# [00:00-12:00,HH:MM-HH-MM]
# umask 用户建立目录或档案时踢除的权限
# [000,777,022]
rsync服务设定例子
rsync是一个能够进行远程镜像的服务,能够让两个主机的目录一模一样。
vim /etc/xinetd.d/rsync
# 配置档案中的内容
service rsync # 服务名称
{
diable = no # 服务是开启的
socket_type = stream # 通过tcp联机
wait = no # multi-threaded
user = root # 启动服务为root这个身份
server = /usr/bin/rsync # 该程序启动rsync服务
server_args = --daemon # 必要的选项
log_on_failure += USERID # 登入错误时,额外记录用户ID
# 因为/etc/services中rsync的端口号为873,小于1024,所以user必须为root
}
规划例子:目前有两个接口,一个是192.168.1.100,设计为对外网域。一个为127.0.0.1,设计为对内网域。服务规划为(这里的服务规划仅作测试使用)
- 对内部的127.0.0.1,对外开放较多权限
服务绑定在127.0.0.1接口
对127.0.0.1/0 开放登入权限
不进行任何联机限制,包括联机总量和时间
但是127.0.0.100及127.0.0.200不允许登入rsync服务
- 对外部的192.168.1.100,进行较多的限制
服务绑定在192.168.1.100接口
该接口仅开放给140.116.0.0/16这个B级网域以及.edu.tw网域
开放时间为早上1-9点及晚上20-24点
最多允许10个同时联机
对应地,/etc/xinetd.d/rsync档案内容修改为
vim /etc/xinetd.d/rsync
# 档案内容
service rsync
{
disable = no
bind = 127.0.0.1
only_from = 127.0.0.0/8
no_access = 127.0.0.{100,200}
instances = UNLIMITED
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
service rsync
{
disable = no
bind = 192.168.1.100
only_from = 140.116.0.0/16
only_from += .edu.tw
access_times = 01:00-9:00 20:00-23:59
instances = 10
socket_type = 10
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
# 配置完毕后,重新启动xinetd
/etc/init.d/xinetd restart
# 重新启动后,查看状态(873为端口号)
netstat -tnlp grep 873
xinetd服务的防火墙管理
任何以xinetd管理的服务,都可以使用/etc/hosts.allow和/etc/hosts.deny进行设定防火墙。所谓防火墙,就是来源的IP或者网域来进行拒绝和接受的设定。
实际上,/etc/hosts.allow和/etc/hosts.deny是服务程序/usr/sbin/tcpd的配置文件。只要支持tcp wrapper的程序都可以通过/etc/hosts.allow和/etc/hosts.deny这两个档案进行防火墙设定。
通过指令ldd(library dependency discovery)可以查看程序的动态函数库依赖,只要依赖libwrap.so这个函数库的程序,就说明可以通过/etc/hosts.allow和/etc/hosts.deny这两个档案进行防火墙设定。
# 查看程序sshd和httpd对动态函数库的依赖
ldd $(which sshd httpd)
# 结果显示 sshd依赖函数库libwrap.so,而httpd不依赖函数库libwrap.so
/etc/hosts.allow和/etc/hosts.deny配置文件的根则
<service(program_name)> : <IP,domain,hostname> : <action>
# service(program_name) 想要管理的程序名 如 rsync
# service name 是启动程序的程序,需要通过vi进入启动脚本查看。
# 特殊参数
# ALL 代表所有service 或 IP
# LOCAL 代表来自本机
# UNKNOWN 代表不知道的service 或 IP
# KNOWN 代表可解析的IP domain等。
# 配置例子
rsync:127.0.0.100 127.0.0.200:deny
# 也可以写成
rsync:127.0.0.100:deny
rsync:127.0.0.200:deny
# 例子
# 只允许140.116.0.0/255.255.0.0和203.71.39.0/255.255.255.0这两个网域以及203.71.38.123这个主机可以进入rsync服务器。
# 其他IP全部都档掉
vim /etc/hosts.allow
# 配置内容
rsync:140.116.0.0/255.255.0.0
rsync:203.71.39.0/255.255.255.0
rsync:203.71.38.123
rsync:LOCAL
vim /etc/hosts.deny
# 配置内容
rsync:ALL
需要注意的是
- 写在hosts.allow中的配置,默认为allow,因此后面的allow可以不用写
- 写在hosts.deny中的配置,默认为deny,因此后面的deny可以不用写
- IP或网域的判断以hosts.allow为先,如果hosts.allow没有改IP或网域,则以hosts.deny为准。
- 一般将allow的配置写在hosts.allow中,deny的配置写在deny中。
tcp_wrappers其他配置
如果要查询有没有安装tcp_wrappers,可以通过命令rpm -q tcp_wrappers进行查询
/etc/hosts.allow和/etc/hosts.deny配置文件的action字段还可以进行别的配置
<service(program_name)> : <IP,domain,hostname> : <action>
# <action>
# spawn
# 可以利用后接的shell进行额外的工作
# 而且具有变量功能 %h (hostname) %a (address) %d (daemon)
# twist
# 立刻执行后面的指令,执行后拒绝本次请求(deny)
# 例子
vim /etc/hosts.deny
# 配置内容
rsync:ALL:spawn (echo "security notices from host $(/bin/hostname)";\
echo;/usr/sbin/safe_finger @%h) |\
/bin/mail -s "%d-%h security" root &\
:twist (/bin/echo -e "\n\nWARNING connection not allowed.\n\n")
# /usr/sbin/safe_finger @%h 可以侦测到客户端主机的相关信息
# twist会将stdout转换到客户端主机的屏幕上
查看系统启动的服务
通过命令netstat可以查看有启动网络监听的服务。
netstat -tulp
# 可以加上 -n 查看port号码
# 服务名和port的对应记录在档案/etc/services中
# 找出所有有监听网络的服务
netstat -lnp
# 观察所有的服务状态
service --status-all
设定开机立即启动服务
Linux的开机过程
- 打开计算机电源,读取BIOS并进行自我测试POST(power on self test)
- 通过BIOS找到第一个可开机装置,读取MBR和开机管理程序
- 通过开机管理程序,找到kernel加载进内存,并侦测系统硬件
- kernel呼叫第一个程序init
- init程序开始执行系统初始化(/etc/rc.d/rc.sysinit)
- 根据init的设定进行daemon启动(/etc/rc.d/rc[0-6].d/*)
- 记载本机设定(/etc/rc.d/rc.local)
管理系统服务及设置自启动(chkconfig)
通过命令chkconfig可以查看系统服务,并可以设置为自动开启
chkconfig --list [服务名称]
chkconfig [--level [0123456]] [服务名称] [on|off]
# 选项和参数
# --list 显示服务的状态
# --level 设定服务在某个run level下的启动或关闭
# 例子
# 列出目前系统上面所有被 chkconfig 管理的服务
chkconfig --list | less
# 显示出目前在 run level 3 为启动的服务
chkconfig --list | grep '3:on'
# 让 atd 这个服务在 run level 为 3, 4, 5 时启动
chkconfig --level 345 atd on
# 查看httpd的状态
/etc/init.d/httpd status
# 显示httped是否自启动
chkconfig --list httpd
# 这只httpd为自启动
chkconfig httpd on
chkconfig --list httpd
/etc/init.d/httpstatus
# 如果是xinetd管理的程序,需要重启它
/etc/init.d/xinetd restart
red hat 提供了一个类图形接口的程序 ntsysv 来管理系统服务
设定自己的系统服务
通过命令chkconfig可以设定自己的系统服务
chkconfig [--add|--del] 服务名称
# 选项和参数
# --add 增加一个服务名称给chkconfig管理,该服务名称必须在/etc/init.d/*中
# --del 删除一个给chkconfig管理的服务
一些系统服务的简单说明
- acpid (高级电源管理接口)
配置文件在/etc/acpi/events/power.conf
- anacron (可唤醒的工作排程,可关闭)
配置文件在/etc/anacrontab
- apmd (电源管理模块,可关闭)
配置文件在/etc/sysconfig/apmd
- atd (执行一次的工作排程)
配置文件/etc/at.
- auditd (SELinux的信息记录服务)
配置文件/var/log/audit/audit.log
- autofs (可挂载来自网络的驱动器机,可关闭)
- avahi-daemon (可通过Zeroconf管理网络,可关闭)
- bluetooth (蓝牙装置的受训,可关闭)
- cpuspeed (管理CPU的频率)
- crond (循环工作排程)
配置文件/etc/crontab
- cups (管理打印机的服务,可关闭)
可打开http://localhost:631管理打印机
- firstboot (第一次进入图形接口的设定,可关闭)
- gpm (在tty环境进行鼠标复制粘贴)
- haldaemon (桌面环境侦测类似USB设备,可关闭)
- hidd (蓝牙服务,可关闭)
- hplip (HP设备的服务,可关闭)
- ip6tables (针对本机IPv6版本的防火墙功能,可关闭)
- iptables (本机防火墙功能)
- irqbalance (自动分配系统终端等硬件资源)
- isdn (ISDN宽带设备服务,可关闭)
- kudzu (增加新的硬件时,开机自动硬件检测,可关闭)
- lm_sensors (侦测主板的相关侦测芯片,可关闭)
- lvm2-monitor (LVM服务)
- mcstrans (SELinux服务有关)
- mdmonitor (侦测所有软件的状态,可关闭)
- messagebus (沟通各个软件乀间的信息,可关闭)
- microcode_ctl (Intel 的 CPU 会提供一个外挂的微挃令集提供系统运作,可关闭)
- netfs (网络驱动器的挂载和卸除,可关闭)
- network (网络设定的功能)
- nfslock (网络驱动器的锁服务,可关闭)
- pcscd (智能卡侦测服务,可关闭)
- portmap (RPC服务,远程调用服务相关)
- readahead_early readahead_later (系统启动程序预加载,可关闭)
- restorecond (SELinux类型还原服务)
- rpcgssd rpcidmapd (NFS有关的客户端功能,可关闭)
- sendmail (本机电子邮件服务)
- setroubleshoot (SELinux信息记录)
记录在/var/log/messages
- smartd (自动硬盘侦测)
- sshd (ssh服务)
- syslog (信息记录服务)
包括记录在/var/log/messages
- xfs (图形接口的字型服务,非图形接口可关闭)
- xinetd (super daemon)
- yum-updatesd (yum软件升级服务)
默认未开启但有用的服务说明
- dovecot (可设定POP3/IMAP等收信件服务)
- httpd (WWW Server服务)
- named (DNS服务)
- nfs (网络文件系统服务)
- ntpd (网络时间协议服务)
- smb (Linux 仿真成为 Windows网络邻居的服务)
- squid (代理服务器服务)
- vsftpd (FTP服务)
参考
鸟哥的Linux私房菜