zoukankan      html  css  js  c++  java
  • Linux上天之路(十二)之服务管理

    主要内容

    • 服务介绍

    • 独立服务

    • 非独立服务

    1. 服务介绍

    服务:常驻在内存中的程序,且可以提供一些系统或网络功能,那就是服务。

    计算机中的系统服务有很多,比如:
    apache提供web服务
    ftp提供文件下载上传服务
    ssh提供了远程连接服务
    防火墙提供了安全防护服务等等
    

    可以把计算机理解为一个地点 比如中关村大街 系统服务 理解为 中关村大街的理发店、饭店、商场等等,每一个都是一个系统服务,为客户提供不同内容的服务,计算机中的系统服务比如apache提供web服务、ftp提供文件下载上传服务、ssh提供了远程连接服务、防火墙提供了安全防护服务等等。

    Linux服务器的主要任务就是为本地或远程用户提供各种服务。通常Linux系统上提供服务的程序是由运行在后台的守护进程(Daemon)来执行。一个实际运行中的Linux系统一般会有多个这样的程序在运行。这些后台守护进程在系统开机后就运行了,并且在时刻地监听前台客户地服务请求,一旦客户发出了服务请求,守护进程便为它们提供服务。

    系统初始化进程是一个特殊的的守护进程,其PID为1,它是所有其他守护进程的父进程或者祖先进程。也就是说,系统上所有的守护进程都是由系统初始化进程进行管理的(如启动、停止等)。

    rhel7之前采用的是systemV,rhel7开始采用的是systemd来管理服务

    系统上所有的守护进程都是由系统初始化进程进行管理的(如启动、停止等)。

    systemV介绍

    启动系统服务的管理方式被称为 SysV 的 init, 同时init也是唯一一个由内核直接启动的进程 , 然后 init 去唤醒所有的系统所需要的服务,不论是本地服务还是网络服务。

    • 服务的启动、关闭与查看等方式:

    所有的服务启动脚本通通放置于 /etc/init.d/ 底下,基本上都是使用 bash shell script 所写成的脚本程序,需要启动、关闭、重新启动、观察状态时,可以通过如下的方式来处理:
    启动:/etc/init.d/daemon start
    关闭:/etc/init.d/daemon stop   
    重新启动:/etc/init.d/daemon restart
    状态查看:/etc/init.d/daemon status
    

    • 服务的依赖关系:

    服务是会有依赖关系的,例如,你想使用nfs服务,在使用之前你必须启动portmap/rpcbind服务,否则nfs无法正常使用.init是无法帮管理员实现协同启动的,管理员必须时刻记得这些依赖关系

    • 运行级别的分类:

    上面说到 init 是由内核启动的, 然后 init 可以根据用户自定义的运行级别 (runlevel) 来唤醒不同的服务,以进入不同的操作界面。基本上 Linux 提供 7 个运行级别,分别是 0, 1, 2…6 ,

    比较重要的是

    1 单人维护模式、

    3 纯文本模式、

    5 文字加图形界面。

    而各个运行级别的启动脚本是通过 /etc/rc.d/rc[0-6]/SXXdaemon 连结到 /etc/init.d/daemon , 连结名 (SXXdaemon) 的功能为: S为启动该服务,XX是数字,为启动的顺序。由于有 SXX 的设置,因此在开机时可以『依序执行』所有需要的服务, 同时也能解决相依服务的问题。

    • 制定运行级别默认要启动的服务:

    若要建立如上提到的 SXXdaemon 的话,不需要管理员手动建立连结, 通过如下的命令可以来处理默认启动、不启动以及查看启动状态 使用方法为:

    默认启动: chkconfig daemon on

    默认不启动: chkconfig daemon off

    查看启动状态: chkconfig —list daemon

    默认不启动: chkconfig daemon off

    查看启动状态: chkconfig —list daemon

    • 运行级别的切换行为:

    当你要从纯文本界面 (runlevel 3) 切换到图形界面 (runlevel 5), 不需要手动启动、关闭该运行级别的相关服务,只要(init 5 )即可切换

    systemd

    • 并行处理所有服务,加速开机流程:

    旧的 init 启动脚本是串行启动的模式,因此不相依的服务也是得要一个一个的等待。但目前我们的硬件主机系统与操作系统几乎都支持多核心架构了, systemd 就是可以让所有的服务同时启动,因此你会发现到,系统启动的速度变快了!

    • 立即响应的启动方式:

    systemd 全部就是仅有一个 systemd 服务搭配 systemctl 命令来处理,无须其他额外的命令来支持。不像 systemV 还要 init, chkconfig, service… 等等命令。 此外, systemd 由于常驻内存,因此任何要求都可以立即响应

    • 服务依赖性的自我检查:

    由于 systemd 可以自定义服务依赖性的检查,因此如果 B 服务是在 A 服务上面启动的,那当你在没有启动 A 服务的情况下仅手动启动 B 服务时, systemd 会自动帮你启动 A 服务

    • 依 daemon 功能分类:

    systemd管理的服务非常多,为了理清所有服务的功能,因此,首先 systemd 先定义所有的服务为一个服务单位 (unit),并将该 unit 归类到不同的服务类型 (type) 去。 旧的 init 仅分为 stand alone 与 super daemon,systemd 将服务单位 (unit) 区分为 service, socket, target, path, snapshot, timer 等多种不同的类型(type), 方便管理员的分类与记忆。

    • 将多个 daemons 集合成为一个群组:

    如同 systemV 的 init 里头有个 runlevel 的特色,systemd 亦将许多的功能集合成为一个所谓的 target 项目,这个项目主要在设计操作环境的建置, 所以是集合了许多的 daemons,亦即是执行某个 target 就是执行好多个 daemon 的意思!

    • 向下兼容旧有的 init 服务脚本:

    基本上, systemd 是可以兼容于 init 的启动脚本的,因此,旧的 init 启动脚本也能够通过 systemd 来管理,只是更高级的 systemd 功能就没有办法支持就是了。

    虽然如此,不过 systemd 也是有些地方无法完全取代 init 的!包括:

    1)在 runlevel 的对应上,大概仅有 runlevel 1, 3, 5 有对应到 systemd 的某些 target 类型而已,没有全部对应;

    2)全部的 systemd 都用 systemctl 这个管理程序管理,而 systemctl 支持的语法有限制,不像 /etc/init.d/daemon 就是纯脚本可以自定义参数,systemctl 不可自定义参数。

    3)如果某个服务启动是管理员自己手动执行启动,而不是使用 systemctl 去启动的 (例如你自己手动输入 crond 以启动 crond 服务),那么 systemd 将无法侦测到该服务,而无法进一步管理。

    4)systemd 启动过程中,无法与管理员互动!因此,自行编写 systemd 的启动设置时,务必要取消互动机制

    独立的服务和基于xinetd服务的区别:
    独立的服务:服务独立的运行在内存中,服务响应速度快,但占用更多内存。
    基于xinetd服务: xinetd服务是超级守护进程的一种。xinetd服务本身独立存在,管理一些服务。用户通过xinetd服务请求其管理的一些服务,然后xinetd返回请求服务的回复给用户,xinetd服务相当于proxy一样的角色。xinetd服务逐步被淘汰,大多数服务都是独立的服务。

    2. 独立服务

    从CentOS7 Linux开始,系统里的网络服务启动已经从传统的service改成了systemctl(一个systemd工具,主要负责控制systemd系统和服务管理器),管理开机自启动的命令也从chkconfig改为了systemctl,由systemctl一个命令代替了CentOS7以前系统中的service和chkconfig两个命令。

    独立服务原理图

    系统服务的脚本也从传统的路的/etc/init.d(/etc/rc.d/init.d/),改到了/usr/lib/systemd(除此之外还有/etc/systemd/system),需要自启动运行的程序,一般存在这个系统服务目录下,即:/usr/lib/systemd/system目录,每一个服务以“服务名.service”结尾,该文件的内容一般分为3部分:

    即[Unit]、[Service]和[Install]。

    Unit]: 服务的说明

    Description: 描述服务

    After: 描述服务类别

    服务启动程序文件

    [Service] 服务运行参数的设置

    Type=forking 是后台运行的形式

    ExecStart 为服务的具体运行命令

    ExecReload 为重启命令

    ExecStop 为停止命令

    PrivateTmp=True 表示给服务分配独立的临时空间

    注意:启动、重启、停止命令全部要求使用绝对路径

    [Install] 服务安装的相关设置,可设置为多用户

    WantedBy=multi-user.target

    服务管理方式

    systemctl [command] [unit]

    command 主要有:

    start:立刻启动后面接的 unit。

    stop:立刻关闭后面接的 unit。

    restart:立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思。

    reload:不关闭 unit 的情况下,重新载入配置文件,让设置生效。

    enabled:设置下次开机时,后面接的 unit 会被启动。

    disable:设置下次开机时,后面接的 unit 不会被启动。

    status:目前后面接的这个 unit 的状态,会列出有没有正在执行、开机时是否启动等信息。

    is-active:目前有没有正在运行中。

    is-enable:开机时有没有默认要启用这个 unit。

    kill :不要被 kill 这个名字吓着了,它其实是向运行 unit 的进程发送信号。

    show:列出 unit 的配置。

    mask:注销 unit,注销后你就无法启动这个 unit 了。

    unmask:取消对 unit 的注销。

    3. 非独立服务

    Xinetd 托管服务。又名:超级守护进程,可以把一些小服务放到xinetd里进行托管。拖管后的好处就是可以使用xinetd强大的参数来控制这些服务,并且增强安全性。(比如一个小服务没有一些控制功能,但支持xinetd拖管,你就可以拖管并使用xinetd的参数来控制它)。

    Xinetd提供类似于inetd + TCP Wrappers的功能,但是更加强大和安全。后面xinetd已经取代了inetd,并且提供了访问控制、加强的日志和资源管理功能。

    TCP Wrappers是一个应用层的访问控制程序,其原理是在服务器向外提供的TCP服务上包裹一层安全检测机制。外来的连接请求首先要通过这层安全检测,获得认证之后才能被系统服务接收。TCP Wrappers的功能有两种实现方式:一种是由tcpd守护进程实现的,常被用于inetd + TCP Wrappers的系统中(如FreeBSD等);另一种是通过每种服务程序调用libwrap.so链接库实现的,即libwrap.so库支持的网络服务程序都能使用TCP Wrappers来实现访问控制,常用于xinetd + TCP Wrappers的系统中(如CentOS等)。

    非独立服务原理图

    超级守护进程:银行里还有一种窗口,提供综合服务,像汇款,转账,提款等业务;这种窗口附近也始终坐着一个人(xinet),她可能不提供具体的服务,提供具体服务的人在里面闲着聊天啊,喝茶啊,但是当有人来汇款时他会大声喊一句,小王,有人汇款啦,然后里面管汇款的小王会立马跑过来帮忙办完汇款业务。其他的人继续聊天,喝茶。这些负责具体业务的人我们就称之为超级守护进程。当然可能汇款人会有一些规则,可能不能往北京汇款,他就会提早告诉xinet,所以如果有人来汇款想汇往北京的话,管理员就直接告诉他这个我们这里办不到的,于是就根本不会去喊汇款员了,相当于提供了一层管理机制。

    xinetd服务的主配置文件: /etc/xinetd.conf —保持默认即可

    用于存放被托管的服务的目录:/etc/xinetd.d/

    xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。它能提供以下特色:

    * 支持对tcp、udp、RPC服务(但是当前对RPC的支持不够稳定)

    * 基于时间段的访问控制

    * 功能完备的log功能,即可以记录连接成功也可以记录连接失败的行为

    * 能有效的防止DoS攻击(Denial of Services)

    * 能限制同时运行的同一类型的服务器数目

    * 能限制启动的所有服务器数目

    * 能限制log文件大小

    * 将某个服务绑定在特定的系统接口上,从而能实现只允许私有网络访问某项服务

    * 能实现作为其他系统的代理。如果和ip伪装结合可以实现对内部私有网络的访问

    它最大的缺点是对RPC支持的不稳定性,但是可以启动portmap,与xinetd共存来解决这个问题。

    原则上任何系统服务都可以使用xinetd,然 而最适合的应该是那些常用的网络服务,同时,这个服务的请求数目和频繁程度不会太高。像DNS和Apache就不适合采用这种方式,而像FTP、 Telnet、SSH等就适合使用xinetd模式,系统默认使用xinetd的服务可以分为如下几类。

    ① 标准Internet服务:telnet、ftp。

    ② 信息服务:finger、netstat、systat。

    ③ 邮件服务:imap、imaps、pop2、pop3、pops。

    ④ RPC服务:rquotad、rstatd、rusersd、sprayd、walld。

    ⑤ BSD服务:comsat、exec、login、ntalk、shell、talk。

    ⑥ 内部服务:chargen、daytime、echo、servers、services、time。

    ⑦ 安全服务:irc。

    ⑧ 其他服务:name、tftp、uucp。

    部署一个非独立服务 Telnet

    #yum -y install telnet-server telnet xinetd

    #cat /etc/xinetd.d/telnet

    service telnet         
    {  
      flags = REUSE  
      socket_type = stream  
      wait = no  
      user = root  
      server =/usr/sbin/in.telnetd  
      log_on_failure += USERID  
      disable = no   
    }
    ================
    #可以设置为yes或no, 设置为yes将禁用一个服务,详见flags的disable标 签
             disable = no
    #指定 失败时登记的信息。总是登记表明错误性质的消息,默认时不登记任何信息。该属性支持所有操作符。USERID: 通过RFC1413调用捕获客户机用户的UID。只可用于多 线程的流服务。
            log_on_failure += USERID
    #使用的TCP/IP socket类型,值可能为stream(TCP),dgram(UDP),raw和seqpacket(可 靠的有序数据包)    
            socket_type = stream
    #指定 传送给该进程的参数,但是不包括服务程序名
            server_args = --daemon
    #用来 设定连接速率。它需要两个参数,第一个参数表示每秒可以处理的连接数,如果超过了这个连接数时,之后进入的 连接将被暂时停止处理;第二个参数表示停止处理多少秒后,继续处理先前暂停处理的连接
            cps = 25 30
    #指定该服务使用的协议,其值必须是在/etc/protocols中 定义的。如果不指定,使用该项服务的默认协议
            protocol = tcp
    #这个属性 有两个可能的值。如果是yes,那么xinetd会启动对方 请求的进程,并停止处理该项服务的其他请求直到该进程终止,适合于单线程服务;如果是no,那xinetd会 为每个请求启动的一个进程,而不管先前启动的进程的状态,适合于多线程服务
            wait = no
    #设置服务进程的UID。 若xinetd的有效UID不是0, 该属性无效
            user = root
    #要激 活的进程,必须指定完整的路径
            server = /usr/sbin/sshd
    #指定 传送给该进程的参数,但是不包括服务程序名
            server_args = -i
    #用空 格分开的允许访问服务的客户机列表。如果不为该属性指定一个值,就拒绝任何人访问这项服务。该属性支持所有操作符。
            only_from = 192.168.1.0/24
            no_access = 192.168.1.20 192.168.1.200
    # 最大连接数为3
            instances = 3
    # 每个源IP只能有1个连接                                   
            per_source = 1
    # 只能9:00到18:00才能ssh连接                                  
            access_times = 9:00-18:00
    # 指定日志记录到/var/log/xinetd_ssh.log里                       
            log_type = file /var/log/xinetd_ssh.log         # 指定日志记录到/var/log/xinetd_ssh.log里
    #服务端口
        port = 7722
    

      

    #systemctl restart xinetd

    #netstat -ntpl 查看启动情况

    客户端连接测试




  • 相关阅读:
    hdu 3666 差分约束系统
    hdu 1198农田灌溉
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    高等微積分(高木貞治) 1.4節 例2
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    解析函數論 Page 29 命題(2) 函數模的有界性
    高等微積分(高木貞治) 1.4節 例2
    解析函數論 Page 29 命題(1) 有界閉集上的一致連續性
    解析函數論 Page 29 命題(3) 模的下界的可達性
    解析函數論 Page 29 命題(2) 函數模的有界性
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/11581541.html
Copyright © 2011-2022 走看看