zoukankan      html  css  js  c++  java
  • Linux服务

    LInux入门之 服务

    服务介绍

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

    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服务逐步被淘汰,大多数服务都是独立的服务。

    • 独立服务

      从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 的注销。

    • 非独立服务

      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 查看启动情况
    


  • 相关阅读:
    Maven pom.xml文件获取当前时间戳
    maven依赖jdk的tools.jar包坐标怎么依赖
    解决Git问题:git登录账号密码错误remote: Incorrect username or password、如何快速关联/修改Git远程仓库地址、git修改用户名邮箱密码
    浅析Java里的内存分析及常量池加强对Java里字符串的理解
    浅析Java数据结构:稀疏数组的介绍和使用场景
    UmiJS简单介绍及使用UmiJS开发结构浅析
    React基础知识笔记:如何渲染html代码、条件渲染与循环渲染、如何获取动态路由传参、动态设置背景图、umi+dva中全局使用dispatch
    git commit提交时报错husky > pre-commit (node v10.16.3)
    浅析npm报错ENOTFOUND npm ERR! network request to https://npm.***.com/*** failed 及 .npmrc 文件的作用、npm --verbose命令
    浅析为什么说Java中只有值传递
  • 原文地址:https://www.cnblogs.com/aqiao/p/11679757.html
Copyright © 2011-2022 走看看