认识系统服务

时间:2022-08-24 16:06:15

认识系统服务(daemons)

服务是指常驻在记忆体中的程序,且可以提供一些系统或网络服务,那就是服务,而服务总是需要程序的运作,否则如何执行,所以这个service的程序我们就称呼为daemon

例如 例行性工作排程服务的程序为crond这个daemon啦,因此要达成某个是需要一支daemon在背景中运行的,没有这支daemon就不会有service,所以不需要分得太清楚.

一般来说,当我们以文本模式或图形模式完整开机进入LInux主机后,系统已经提供我们很多的服务了,包括打印服务,工作排成服务,邮件管理服务等等.

daemon的主要分类

如果依据daemon的启动与管理方式来区分,基本上,可以将daemon分为可独立启动的stand alone , 与透过一支super daemon来统一管理的服务.

stand_alone 此daemon可以自行单独启动服务

                        这种类型的daemon自行启动并加载到内存后就一直占用内存与系统资源,最大优点就是因为一直在内存内持续的提供服务,因此响应速度快,常见的有httpd,vsftp等

super daemon 一支特殊的daemon来统一管理

                        这种类型的daemon 由一个统一的daemon来负责唤起服务,这个特殊的daemon被称为super daemon ,也就是xinted这个服务,当没有客户端的要求时,各项服务都

                        是未启动的情况,等到有来自客户端的要求时,super daemon 才唤醒相对应的服务,当客户端要求结束,被唤醒的这个服务也会关闭并释放系统资源,这种机制好

                       处在于因为由super daemon 负责,因此super daemon可以具有安全空管的机制,就是类似网络防火墙的功能,由于客户端结束关闭,因此不会一直占用系统资源,

                       缺点是,由于只有当存在客户端链接时才会唤起服务,那么服务的响应时间会比较慢一些,常见的super daemon所管理的服务有telnet

stand alone 和 super daemon 的概况,以银行的窗口为例:

个别窗口负责单一服务(stand alone):

例如在银行里面,假设有一种单一服务的窗口,那就是存钱窗口,所以当你需要存钱,直接前往窗口,就有【专人】为你服务了

统一窗口负责各种业务(super daemon):

例如银行中的复合类型的统一窗口,同时提供转账,资金调度,提款等等的业务,当你需要其中一项业务的时候(转账),就需要前往该窗口,该窗口的营业员拿到

需求单后,往后面那个转账的的仁兄发送通知,那个转账的仁兄就开始工作了,而其他负责业务的仁兄,他们就还在休息,那么如果银行今天的人特别的多,

这时候是【一个完成再来下一个】还是【全部把你们的单据拿来,我全部处理掉】,这种super daemon的处理模式有两种:

多线程 :也就是说将全部客户的要求都拿来,一次给他交办下去,所以一个服务同时会负责好几个程序

单线程:也就是说还是一个一个的来,排队等,

stand和super服务的差别是stand alone可以自己启动,而其他的服务则使用xinted这个super daemon来管理

daemon工作形态的类型分为两大类

signal-control : 通过讯号来管理,只要有客户端需求进来,他就会立即启动去处理,例如打印机的服务(cupsd)

interval-control  : 每隔一段时间就主动的去执行某项工作,所以需要在配置文件中指定服务要进行的时间与工作,该服务在指定的时间才会去完成工作,例如 atd 与 crond就

                                  属于这种类型的daemon啦(每分钟侦测一次配置文件)

一般daemon的命名规则,通常在服务的名称之后加上一个d ,例如 atd crond 等,这个d代表daemon的意思

服务和端口的对应

端口就像是一幢大楼的第几层,这个IP与PORT就是因特网联机的最重要机制之一,就像是http://ftp.isu.edu.tw/和ftp://ftp.isu.edu.tw/访问的是同一个IP,但是端口是不同的

FTP指向的是21号端口,WWW指向的是80号,为了统一因特网的端口号对应的服务的功能,好让所有的主机能够使用相同的机制来提供服务与要求,就产生了【通信协议】

也就是有些约定俗成的服务放置在同一个端口号上,这个文件是/etc/services

daemon的启动脚本与启动方式

daemon的启动还是需要执行档,配置文件,执行环境等等,通常distribution都会记录每一支daemon启动后所取得程序的PID在/var/run/这个目录下,还有,在启动这些服务

之前,你可能也要自行处理一下daemon能够顺利执行的环境是否正确.

为了解决上面谈到的问题,因此通常会给我们一个简单的shell script来进行启动的功能,该script可以进行环境的侦测,配置文件的分析,PID档案的配置,以及相关重要交换

文件案的锁住动作,只要执行该script,上述的动作就一口气连续的进行,最终能够顺利的启动这个daemon

/etc/init.d/* :启动脚本放置处,系统上所有的启动脚本都放置在这里,

/etc/sysconfig/* 各服务的初始化环境配置文件: 几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,例如 登录档syslog 的初始化配置文件就写入在

                            /etc/sysconfig/syslog这里,而网络的设定则写在/etc/sysconfig/network这个档案中

/etc/xinetd.conf, /etc/xinetd.d/* super daemon配置文件,super daemon的主要配置键为/etc/xinetd.conf ,这只是一个统一管理的配置文件,他所管理的其他daemon的设定

                            则写入在/etc/xinetd.d/*里头

/etc/ 存放各服务各自的配置文件,大家的配置文件都是放置在/etc/底下的

/var/lib 各服务产生的数据库 : 一些会产生数据的服务都会将他的数据写入到/var/lib/目录中,举例,数据库管理系统Mysql的数据库默认写入/var/lib/mysql这个目录下

/var/run/* 各服务的程序之PID记录处: 我们可以使用讯号来管理程序,既然 是daemon的程序,所以当然也可以利用kill 或 killall来管理啦,不过为了担心管理时影响

                           到其他的程序,因此daemon通常会将自己的PID记录一份到/etc/init.d/syslog.pid这个档案中,如此一来,/etc/init.d/syslog就能够简单的管理自己的程序

Stand alone的/etc/init.d/*启动: 启动脚本会去侦测环境,搜索配置文件,加载distribution提供的函数功能,判断环境是否可以运行此daemon等等,等到一切都侦测完毕

                          且确定可以运作后,再以shell script 语法来启动,关闭,观察此daemon,我们可以简单的以/etc/init.d/syslog这个档案档来启动脚本

由于系统的环境都已经帮你制作妥当,所以可以利用/etc/init.d来启动,关闭与观察,service这支程序也可以启动stand alone服务,service是一支script(/sbin/service)啦,可以

分析你下达 的service后面的参数,然后根据你的参数再到/etc/init.d去取得正确的服务来start或stop

选项与参数

service name: 亦即是需要启动的服务名称, 需与/etc/init.d/对应

-- status -all 将系统所有的stand alone 的服务状态通通列出来

service 【service name】(start|stop|restart|...)

service --status -all

Super daemon的启动方式

其实Super daemon 本身也是一支stand alone的服务,因为super daemon要管理后续的其他服务,他当然要常驻于内存中,所以Super daemon自己的启动方式与stand alone

是相同的,但是他所管理的其他daemon就不是这样子,必须要在配置文件中设定为启动该daemon才行,配置文件就是/etc/xinetd.d/*的所有档案,那如何得知super daemon

所管理的服务是否有启动 可以执行 grep -i 'disable' /etc/xinetd.d/*,因为disable是【取消】的意思,因此yes代表取消启动,而no代表启动该服务,假设想要启动rsync这个服务

将disable 那一行的yes改成no,接着重新启动xinted这个服务

grep 'rsync' /etc/services 先查看端口号

接着netstat -tunlp | grep 873 注意看,启动的服务并非rsync,而是xinted 因为他要控制rsync

解析super daemon的配置文件

我们知道xinted可以进行安全性或者其他管理机制的控管,xinted也能够控制联机的行为,这些控制的手段都可以让我们的某些服务更安全,资源管理更为合理,而由于super

daemon可以作这样的管理,因此某一些对客户端开放较多权限的服务(telnet) 或者本身不具有管理机制或防火墙机制的服务,就可以通过xinetd来管理

接着来看一下/etc/xinetd.conf 这个预设的配置文件,以及各个设定项目的意义

默认的配置文件xinetd.conf,内容是:

log_type = SYSLOG daemon info <==登录文件的记录服务类型

log_on_failure = HOST <==发生错误时需要记录的信息为主机 (HOST)

log_on_success = PID HOST DURATION EXIT <==成功启动或登入时的记录信息

cps = 50 10 <==同一秒内的最大联机数为 50 个,若超过则暂停 10 秒

instances = 50 <==同一服务的最大同时联机数

per_source = 10 <==同一来源的客户端的最大联机数

v6only = no <==是否仅允许 IPv6 ?可以先暂时不启动 IPv6 支持!

groups = yes   umask = 002  环境参数的设定

更多的设定值在 /etc/xinetd.d 那个目录内

/etc/xinted.conf是默认值的配置文件,因此如果有启动某个super daemon管理的服务,但是该服务的设定值并没有指定上述的那些项目,那么该服务的设定值就以上述的默认

值为主.

有预设参数档,那么自然有更多的服务参数档案,而所有的服务参数档都在/etc/xinetd.d里面,这是因为上表当中的最后一行 includedir /etc/xinetd.d

每个档案的内容:

第一行一定有个service 那个service_name 里面的内容,则与/etc/services有关,因为他可以对照者/etc/servics内的服务名称与端口号来决定所要启用的port是那个

其他的内容有 disable(是否启动), id(服务识别)虽然服务在配置文件开头【service 服务名称】已经制定,不过有时会有重复的设定值,此时可以用id来取代服务名称

可以参考/etc/xinetd.d/time-stream,server【程序文件名】这个设定值【server = /usr/bin/rsync】,server_args 这里输入的是你的server那里需要输入的一些参数,例如

rsync需要加入daemon 所以设定 【server_args = --daemon】,user 服务所属 UID, sorket_type stream为联机机制较为可靠的TCP封包,UDP封包则使用dgram机制,

raw代表server需要与IP直接对话,举例来说rsync 使用TCP ,故设定为【socket_type = stream】,protocol 使用的网络协议,需参考 /etc/protocols 内的通讯协议,wait

就是刚刚提到的Multi-threaded 与 single-threaded , 一般udp设定为yes,而tcp设定为no ,  instances(最大联机数),per_source(单一用户来源的最大链接数), 

cps(新联机限制),log_type (登录档类型), log_on_success log_on_failure (登录状态), env(额外变量设定),port(非正规端口号),这里的端口和服务名称必须与/etc/services

内记载的相同才行,不过,若服务名称是你自定义的,那么这个port就可以随你指定, redirect(服务转址)可以将client端对我们server的要求,转到另一部主机上去,例如当

有人要使用你的ftp时,你可以将他转到另一部主机上去,那个IP_Address就是代表另一部远程主机的IP includedir(呼叫外部设定) 将别的目录下的档案给塞进来

bind (服务接口锁定),这个含义是你的Linux主机上面有两个IP, 你只想让IP1可以使用此服务,但是IP2不能使用此服务,这里就是可以将IP1写入即可,那么IP2就不可以使用

interface与 bind 相同,only_from(防火墙机制),no_access(防火墙机制),  access_times(时间控管)这个项目在设定该服务server启动的时间

使用24小时的设定,例如你的ftp要在8点到16点开放的话,那就是 08:00-16:00, umask 可以设定用户建立目录或者是档案时候的属性

一个简单的rsync范例设定

通过 super daemon 控管的服务可以多一层管理的手续来达成类似防火墙的机制,rsync可以将两部主机上面的某个目录一模一样,在远程备援系统上面是挺好用的一个机制,

disable = no <==预设是关闭的!刚刚被我们打开了

socket_type = stream <==使用 TCP 的联机机制之故

wait = no <==可以同时进行大量联机功能

user = root <==启动服务为 root 这个身份

server = /usr/bin/rsync <==就是这支程序启动 rsync 的服务啰

server_args = --daemon <==这是必要的选项啊!

log_on_failure += USERID <==登入错误时,额外记录用户 ID

查看/etc/services当中规定rsync使用的端口号码是873 ,这个端口小于 1024 ,所以理论上启动这个端口的身份一定是root才行,由于测试主机在安装时已经捉到两个接口

一个是192.168.2.100,一个是127.0.0.1 ,假设我将192.168.1.100设计为对外网域,127.0.0.1为内部网域

对内部 127.0.0.1 网域开放较多权限的部分:

对 127.0.0.0/8 开放登入权限;

不进行任何联机的限制,包括总联机数量不时间;

这里的讴定值需绑在 127.0.0.1 这个接口上;

但是 127.0.0.100 及 127.0.0.200 不允讲登入 rsync 服务。

对外部 192.168.1.100 网域较多限制的设定:

o 对外设定绑住 192.168.1.100 这个接口;

o 这个接口仅开放 140.116.0.0/16 这个 B 等级的网域及 .edu.tw 网域可以登入;

o 开放的时间为早上 1-9 点以及晚上 20-24 点两个时段;

o 最多允讲 10 条同时联机的限制。

我们可以将刚刚上头的 /etc/xinetd.d/rsync 这个档案修改成为两个service rsync 一个配置内网的参数,一个配置外网的参数

接着重新启动后/etc/init.dxinetd restart 执行netstat -tunlp | grep 873就出现了两个接口,PID会是同一个,因此我们将某个服务针对不同的客户端来源指定不同的权限,这样子

系统服务可以安全多了.

服务的防火墙管理 xinetd, TCP Wrappers

我们的系统防火墙分析主要可以透过封包过滤或者是透过软件分析,我们的Linux默认有提供一个软件分析的工具,那就是/etc/hosts.deny,/etc//hosts.allow这两个配置文件,

另外如果有安装tcp wrappers套件时,我们甚至可以加上一些额外的追踪功能

at使用etc/at.{allow|deny} 来管理,crontab则是使用/etc/cron.{allow|deny} 来管理,那么/etc/hosts.{allow|deny}能够管理某些程序的网络使用,就有点像管理某些程序

是否能够接受或者是拒绝来自因特网的联机的意思,任何以xinetd管理的服务,都可以使用/etc/hosts.allow, /etc/hosts.deny 来设定防火墙,防火墙简单的说就是针对来源

IP或者网域进行允许或拒绝的设定,以决定该联机是否能够达成链接的一种方式,其实 /etc/xinetd.d/rsync 里头的 no_access, only_from 也可以进行这方面的防火墙设定

不过,使用/etc/hosts.allow, /etc/hosts.deny 则更容易集中控管.

其实/etc/hosts.allow与/etc/hosts.deny 也是 /usr/sbin/tcpd 的配置文件,而这个/usr/sbin/tcpd 则是用来分析进入系统的 TCP 网络封包的一个软件,TCP是一种面向连接的

网络联机封包,包括www,email,ftp等等都是使用TCP封包来达成联机的,这个套件本身的功能就是分析TCP网络数据封包,而TCP封包的文件主要记录来源主机的IP与PORT

因此籍由分析TCP封包并搭配/etc/hosts.{allow,deny} 的规则比对,就可以决定该联机是否能够进入我们的主机,TCP Wrappers来控管的就是:

1. 来源 IP 或/与 整个网域的 IP 网段;

2. port (就是服务啦,前面有谈到启动某个端口是 daemon 的责任啊)

基本上只要一个服务受到 xinetd 管理,或者是该服务的程序支持 TCP Wrappers 函式的功能时,那么该服务的防火墙方面的设定就能够以 /etc/hosts.{allow,deny} 来处理,可以

使用 ldd $(which sshd httpd) 来测试软件有没有支持libwrap.so那个函数库,ldd这个指令可以查询某个程序的动态函数库支持状态,因为透过这个ldd我们可以轻松的就查询

到sshd,httpd有无支持tcp wrappers所提供的libwrap.so这个函数库到哪干,sshd有支持,httpd则没有支持,因为我们知道sshd 可以使用/etc/hosts.{allow,deny} 进行类似防

火墙的抵挡,但是 httpd 则没有此项功能

配置文件语法(两个配置文件语法大致是一样的)

<service(program_name)> : <IP, domain, hostname> : <action>

<服务 (亦即程序名称)> : <IP 或领域 或主机名> : < 动作 >

第一个找出你想要管理的那个程序的文件名,第二个才是写下你想要放行或者抵挡IP或网域,那么程序的文件名要如何写,其实就是写下档名,例如rsync配置文件内

 /usr/bin/rsync 为其参数值,那么在我们这里就要写成rsync即可,依据rsync的配置文件资料,我们将抵挡的 127.0.0.100, 127.0.0.200, 及放行的 140.116.0.0/16 写在这

rsync : 127.0.0.100 127.0.0.200 : deny

或者

rsync : 127.0.0.100 : deny

rsync : 127.0.0.200 : deny 写成两行

这样一来,对方就无法以 rsync 进入你的主机啦!

写在 hosts.allow 当中的 IP 与网段,为预设『可通行』的意思,亦即最后一个字段 allow 可以不用写;

而写在 hosts.deny 当中的 IP 与网段则预设为 deny ,第三栏的 deny 亦可省略;

这两个档案的判断依据是: (1) 以 /etc/hosts.allow 为优先,而 (2) 若分析到的 IP 戒网段并没有记录在

/etc/hosts.allow ,则以 /etc/hosts.deny 来判断。

也就是说/etc/hosts.allow 的设定优先亍 /etc/hosts.deny

1. 允许进入的写在 /etc/hosts.allow 当中;

2. 不允许进入的则写在 /etc/hosts.deny 当中

此外,我们还可以使用一些特殊参数在第一及第二个字段喔!内容有:

ALL:代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: allow

LOCAL:代表来自本机的意思,例如: ALL: LOCAL: allow

UNKNOWN:代表不知道的 IP或者是 domain 或者是服务时;

KNOWN:代表为可解析的 IP, domain 等等信息时;

那个service_name其实是启动该服务的程序,例如ssh服务的是sshd这个程序,你的service_name自然就是sshd,而/etc/xinetd/telnet内有个server的设定项目,那个项目

指到in.telnetd这个程序来启动的,

TCP Wrappers 特殊功能

当有其他人扫描我的rsync port时,我将他的ip记住,以作为未来的查询与认证之用,那就需要有额外的动作参数加在第三栏了,而且你还需要安装TCP Wrappers软件才行,

要确定有没有安装TCP Wrappers可以使用【rpm -q tcp_wrappers】来查询,至于更细部的主要动作有

spawn (action) , 可以利用后续接的shell来进行额外的工作,且具有变量功能,主要的变量内容有: %h (hostname), %a (address), %d (daemon)等等

twist (action) , 立刻以后续的指令进行,且执行完后终止该次联机的要求(DENY)

为了达成追踪来源目标的相关信息的目的,我们需要safe_finger 这个指令的辅助才行,而且我们还希望客户端的这个恶意者能够被警告,整个流程可以是这样的

1. 利用 safe_finger 去追踪出对方主机的信息 (包括主机名、用户相关信息等);

2. 将该追踪到的结果以 email 的方式寄给我们本机的 root ;

3. 在对方屏幕上面显示不可登入与警告他已经被记录的讯息

由于是抵挡的机制,因此我们这个 spawn 不 twist 的动作大多是写在 /etc/hosts.deny 档案中的。我们将上述的动作写

成类似如下的东东

[root@www ~]# vim /etc/hosts.deny

rsync : ALL: spawn (echo "security notice 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" )

上面其实是针对一个rsync所写的信息,上面的内容共有三个冒号来隔开四个咚咚,这四个内容的含义是

1. rsync: 指的就是 rsync 这个服务的程序

2. ALL: 指的是来源,这个范围指的当然是全部的所有来源,因为是 ALL 嘛!

3. spawn (echo "security notice from host $(/bin/hostname)" ; echo ; /usr/sbin/safe_finger @%h ) | /bin/mail

-s "%d-%h security" root &: 由于要将一些侦测的数据送给 root 的邮件信箱,因此需要使用数据流汇整的括号

( ),括号内的重点在于 safe_finger 的项目,他会侦测到客户端主机的相关信息,然后使用管线命令将这些数据送

给 mail 处理, mail 会将该信息以标头为 security 的字样寄给 root 啦!由亍 spawn 只是中间的过程,所以还能

够有后续的动作哩!

4. twist  ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" ): 这个动作会将Warning的字样传送给客户端主机的屏幕上,然后将该联机中断

第三内容中root那个帐号,可以写成你的个人帐号或者其他email ,这样就能够寄到你常用的email信箱了


系统开机的服务

使用netstat 这个网络状态观察指令来检查我们的port,甚至他也可以帮我们找到该port的程序(PID).

我们最长用netstat来观察,基本上ps来观察系统上面的服务是比较妥当的,因为他可以将全部的process

都找出来,不过,我们比较关心的还是在于启动网络监听的服务,这时使用netstat来查阅

除了已经存在系统当中的daemon之外,如何在开机就完整的启动我们所想要的服务,那就和chkconfig和ntsysv这两个东西有关了

设定开机后立即启动服务的方法

我们使用netstat仅能观察目前已经启动的daemon,使用service这个指令或者是【/etc/init.d/* start】的方法则仅能在目前的环境下立即启动某个服务而已

重新启动后,刚才的设置就失效了

Linux主机是怎么开机的

1,打开计算机电源,开始读取BIOS并进行主机的自我测试

2, 透过BIOS取得第一个可开机装置,读取主要开机区(MBR)取得开机管理程序

3,透过开机管理程序,取得kernel并加载内存且侦测系统硬件

4,核心主动呼叫init程序

5,init程序开始执行系统初始化(/etc/rc.d/rc.sysinit)

6,依据init的设定进行daemon start(/etc/rc.d/rc[0-6].d/*)

7,加载本机设定(/etc/rc.d/rc.local)

第六步,按照不同的开机等级呼叫不同的服务,例如开机等级3为纯文本界面,而开机等级5为图形化界面

chkconfig: 管理系统服务默认开机启动与否

chkconfig --list [服务名称]

chkconfig [--level [0123456]] [服务名称] [on|off]

--list :仅将目前的各项服务状态栏出来

--level:设定某个服务在该 level 下启动 (on) 或关闭 (off)

chkconfig --list |more 列出系统上面所有被chkconfig管理的服务

xinetd based services 底下为super daemon所管理的服务

主要分为两个区块,一个是自己管理的服务stand alone,一个是xinetd管理的服务super daemon

chkconfig --list | grep '3:on'  显示出目前在 run level 3 为启动的服务

chkconfig --level 345 atd on   让 atd 这个服务在 run level 为 3, 4, 5 时启动

在设定好chkconfig httpd on后需要重新启动后才能看到此服务是否会被加载或取消载入的情况,那么既然chkconfig

可以设定开机是否启动,那么能不能管理super daemon的启动与关闭

不能以stand alone(/etc/init.d/rsync status)的启动方法来观察

执行chkconfig --list rsync查看是否启动

chkconfig rsync off; chkconfig --list rsync 设置关闭并且查看状态

/etc/init.d/xinetd restart; netstat -tlup | grep rsync  此时不需要重启,只要重启xinetd服务,再次查看就会看到rsync不见了

ntsysv: 类图形接口管理模式

选项不参数: --level :后面可以接不同的 run level ,例如 ntsysv --level 35

chkconfig: 设定自己的系统服务

--add :增加一个服务名称给 chkconfig 来管理,该服务名称必须在 /etc/init.d/ 内

--del :删除一个给 chkconfig 管理的服务

自己写一个程序让该程序成为系统服务好让chkconfig来管理时,可以将该服务加入init可以管理的script当中,亦即/etc/init.d/

当中即可,例如在/etc/init.d/里面建一个myvbird档案,设定开档案在运行级别为3和5的时候启动,也就是在/etc/rc.d/rc[35].d当中启动时,以80顺位启动,以70顺位结束

myvbird文件中随便输出一句话

[root@www ~]# vim /etc/init.d/myvbird 

#!/bin/bash 

# chkconfig: 35 80 70 

# description: 没啥!只是用来作为练习之用的一个范例 

echo "Nothing"

第二行的语法为chkconfig:[runlevels] [启动顺位] [停止顺位] 』

启动顺位与结束顺位则是在/etc/rc.d/rc[35].d 内建立以 S80myvbird 及 K70myvbird 为档名的设定方式

chkconfig --list myvbird 报错,尚未加入chkconfig的管理机制中,需要执行

chkconfig --add myvbird; chkconfig --list myvbird 加入chkconfig的管理当中

删除的话执行 chkconfig --del myvbird       rm /etc/init.d/myvbird

chkconfig 真的是个不错的工具吧!尤其是当你想要自己建立自己的服务时

Linux预设启动的服务

认识系统服务


认识系统服务
认识系统服务

认识系统服务

上面的是开机预设启动的服务

下面的是相关网络方面的其他服务

认识系统服务