linux备忘录-系统服务daemon

服务(daemon)及其分类

Linux中的服务被称为daemon(daemon是守护神,恶鬼的意思哦)。这些daemon会常驻在内存当中,从而对我们的系统和任务等进行一些辅助性的工作。实际上,daemon实际上是指Linux服务的那个程序。例如例行性工作排程的服务程序crond,这个程序会常驻在内存中,每分钟侦查一下配置文件/etc/crontab,从而为我们执行一些循环性的、周期性的工作。

服务(daemon)的分类

对于服务daemon来说,可以将其分成两类

  1. stand_alone型

stand_alone型的daemon可以自行独立启动服务,并常驻在内存当中运行。

  1. 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的服务类型,可以分为以下两种处理模式

  1. multi-threaded (多线程)

super daemon会根据客户端的请求个数来触发多个daemon来响应客户端的请求。

  1. single-threaded

无论客户端的请求数量是多少,super daemon只会触发一个daemon进行处理。

根据daemon提供服务的工作状态,daemon又可以分为两种类型

  1. signal-control

这种daemon是根据信号来处理的,只要有请求,就立刻进行处理。例如打印机的服务cupsd

  1. interval-control

这种daemon每隔一段时间就会主动地去执行工作。例如工作排程中的服务atdcrond

通过man 3 daemon可以查阅开发服务的相关信息。

服务daemon的命名一般是后面有一个字母 d,例如atdcrondsyslogd等。

服务与端口号的对应

通过对档案/etc/services的配置,可以使得服务于端口号(port)对应起来。

/etc/services文件中每一行都是同样的格式。每一行都是服务和端口号的对应关系。其格式为

服务名称(daemon name)    端口号(port)/封包协议    该服务的说明
# 其中封包协议 一般为TCP或UDP协议

daemon 启动脚本与启动方式

damen启动后所取得的程序的PID都会记录在/var/run目录下。

damen启动脚本和相关档案的存放处为

  1. /etc/init.d/* :启动脚本存放处

/etc/init.d/* 是公认的存放daemon脚本的目录,有些发行版本会存放在/etc/rc.d/init.d/*,但同时也会在/etc/init.d中设置相应的连结档。

  1. /etc/sysconfig/* :服务的初始化环境配置文件存放处

几乎所有服务的初始化配置档案都会存放在/etc/sysconfig/* 目录下。例如syslog服务的初始化配置文件存放在/etc/sysconfig/syslog,网络的初始化配置文件存放在/etc/sysconfig/network

  1. /etc/xinetd.conf/etc/xinetd.d/* :super daemon相关的配置文件

super daemon的配置文件为/etc/xinetd.conf,而super daemon管理的daemon的配置文件存放在/etc/xinetd.d/*目录下。

  1. /etc/* :各服务的配置文件
  2. /var/lib/* :各服务产生的数据库

一些会产生数据的服务会将其数据存放在目录/var/lib/*中。如MySql的数据库默认写入目录/var/lib/mysql/中。

  1. /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管理的某个服务,需要如下步骤

  1. 相对应的/etc/xinetd.d/*配置文件中将disable = true改成diable = no。
#  例如
vim /etc/xinetd.d/rsync
# ...
# disable = no
# ...
  1. 重新启动xinetd这个服务
/etc/init.d/xinetd restart
# 或者
service xinetd restart
  1. 观察启动的端口
grep 'rsync' /etc/services
# 若找到为873端口
netstat -tnlp | grep '873'
  1. 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,设计为对内网域。服务规划为(这里的服务规划仅作测试使用)

  1. 对内部的127.0.0.1,对外开放较多权限

服务绑定在127.0.0.1接口
对127.0.0.1/0 开放登入权限
不进行任何联机限制,包括联机总量和时间
但是127.0.0.100及127.0.0.200不允许登入rsync服务

  1. 对外部的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

需要注意的是

  1. 写在hosts.allow中的配置,默认为allow,因此后面的allow可以不用写
  2. 写在hosts.deny中的配置,默认为deny,因此后面的deny可以不用写
  3. IP或网域的判断以hosts.allow为先,如果hosts.allow没有改IP或网域,则以hosts.deny为准。
  4. 一般将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的开机过程

  1. 打开计算机电源,读取BIOS并进行自我测试POST(power on self test)
  2. 通过BIOS找到第一个可开机装置,读取MBR和开机管理程序
  3. 通过开机管理程序,找到kernel加载进内存,并侦测系统硬件
  4. kernel呼叫第一个程序init
  5. init程序开始执行系统初始化(/etc/rc.d/rc.sysinit)
  6. 根据init的设定进行daemon启动(/etc/rc.d/rc[0-6].d/*)
  7. 记载本机设定(/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管理的服务

一些系统服务的简单说明

  1. acpid (高级电源管理接口)

配置文件在/etc/acpi/events/power.conf

  1. anacron (可唤醒的工作排程,可关闭)

配置文件在/etc/anacrontab

  1. apmd (电源管理模块,可关闭)

配置文件在/etc/sysconfig/apmd

  1. atd (执行一次的工作排程)

配置文件/etc/at.

  1. auditd (SELinux的信息记录服务)

配置文件/var/log/audit/audit.log

  1. autofs (可挂载来自网络的驱动器机,可关闭)
  2. avahi-daemon (可通过Zeroconf管理网络,可关闭)
  3. bluetooth (蓝牙装置的受训,可关闭)
  4. cpuspeed (管理CPU的频率)
  5. crond (循环工作排程)

配置文件/etc/crontab

  1. cups (管理打印机的服务,可关闭)

可打开http://localhost:631管理打印机

  1. firstboot (第一次进入图形接口的设定,可关闭)
  2. gpm (在tty环境进行鼠标复制粘贴)
  3. haldaemon (桌面环境侦测类似USB设备,可关闭)
  4. hidd (蓝牙服务,可关闭)
  5. hplip (HP设备的服务,可关闭)
  6. ip6tables (针对本机IPv6版本的防火墙功能,可关闭)
  7. iptables (本机防火墙功能)
  8. irqbalance (自动分配系统终端等硬件资源)
  9. isdn (ISDN宽带设备服务,可关闭)
  10. kudzu (增加新的硬件时,开机自动硬件检测,可关闭)
  11. lm_sensors (侦测主板的相关侦测芯片,可关闭)
  12. lvm2-monitor (LVM服务)
  13. mcstrans (SELinux服务有关)
  14. mdmonitor (侦测所有软件的状态,可关闭)
  15. messagebus (沟通各个软件乀间的信息,可关闭)
  16. microcode_ctl (Intel 的 CPU 会提供一个外挂的微挃令集提供系统运作,可关闭)
  17. netfs (网络驱动器的挂载和卸除,可关闭)
  18. network (网络设定的功能)
  19. nfslock (网络驱动器的锁服务,可关闭)
  20. pcscd (智能卡侦测服务,可关闭)
  21. portmap (RPC服务,远程调用服务相关)
  22. readahead_early readahead_later (系统启动程序预加载,可关闭)
  23. restorecond (SELinux类型还原服务)
  24. rpcgssd rpcidmapd (NFS有关的客户端功能,可关闭)
  25. sendmail (本机电子邮件服务)
  26. setroubleshoot (SELinux信息记录)

记录在/var/log/messages

  1. smartd (自动硬盘侦测)
  2. sshd (ssh服务)
  3. syslog (信息记录服务)

包括记录在/var/log/messages

  1. xfs (图形接口的字型服务,非图形接口可关闭)
  2. xinetd (super daemon)
  3. yum-updatesd (yum软件升级服务)

默认未开启但有用的服务说明

  1. dovecot (可设定POP3/IMAP等收信件服务)
  2. httpd (WWW Server服务)
  3. named (DNS服务)
  4. nfs (网络文件系统服务)
  5. ntpd (网络时间协议服务)
  6. smb (Linux 仿真成为 Windows网络邻居的服务)
  7. squid (代理服务器服务)
  8. vsftpd (FTP服务)

参考

鸟哥的Linux私房菜

posted @ 2017-08-18 17:30  smallpi  阅读(414)  评论(0编辑  收藏  举报

页脚