see also jlevy/the-art-of-command-line (multi-language)

Organised 2017 March.
Notes from 2012 April.
多年前(2012)写的“鸟哥的Linux 私房菜”学习笔记。- Chapters 18~26 -ing
原网站: 繁体 linux.vbird.org or 简体 cn.linux.vbird.org

第十八章、认识系统服务 (daemon, service)

什么是 daemon 与服务 (service)

分类 & 命名:

stand-alone vs. super-daemon 
    Stand Alone Daemon 
        响应速度快。
        常见的有httpd、FTP的vsftpd等。
    Super Daemon
        (1)由于 super daemon 负责唤醒各项服务,因此 super daemon 可以具有安全控管的机制. 
        (2)不会一直占用系统资源。
        例如 telnet, xinetd.
signal-control vs. interval-control (工作形态)
    signal-control
        透过讯号来管理,有客户端的需求进来,就会去处理!
        例如打印机的服务 (cupsd)。 
    interval-control
        『每隔一段时间就主动的去运行某项工作』,在指定的时间才会去工作。
        例如在第十六章提到的 atd 与 crond (每分钟侦测一次配置文件)
命名守则
    {xxx}d
eg: man [3] daemon

服务与端口的对应: /etc/services

ssh             22/tcp                          # SSH Remote Login Protocol
ssh             22/udp                          # SSH Remote Login Protocol
....(中间省略)....
http            80/tcp          www www-http    # WorldWideWeb HTTP
http            80/udp          www www-http    # HyperText Transfer Protocol
....(底下省略)....

daemon的启动与配置, stand alone, service, super daemon

/etc/init.d/* :启动脚本
    系统上几乎所有的服务启动脚本都放置在这里!事实上这是公认的目录,CentOS在/etc/rc.d/init.d/,连结到/etc/init.d/的!
/etc/sysconfig/* :初始化环境配置 //几乎所有的服务//ubuntu不存在此文件夹
    eg: syslog的初始化配置就在/etc/sysconfig/syslog这里呢!网络配置则在/etc/sysconfig/network这个文件中。
/etc/* :各服务的配置文件
    第六章就讲过了,大家的配置文件都是放置在 /etc/ 底下的喔!//可能在子文件夹下
/etc/xinetd.conf, /etc/xinetd.d/* :super daemon 配置文件//ubuntu不存在此文件夹
    super daemon配置文件(默认值)为/etc/xinetd.conf,不过super daemon只是一个统一管理的机制,所管理的daemons的配置在 /etc/xinetd.d/* 里头喔!
/var/lib/* :服务产生的数据库
    MySQL的数据库默认就是写入/var/lib/mysql/这个目录下啦!
/var/run/* :服务的PID记录处
    在第十七章谈到可以使用讯号(signal)管理程序,daemon是程序,也可以利用kill或killall来管理啦!
    因为担心管理时影响到其他的程序,因此daemon常会将自己的PID记录到/var/run/.
    例如syslog的PID就记录在/var/run/syslogd.pid这个文件中。如此一来,/etc/init.d/syslog就能够简单的管理自己的程序啰。

super daemon 所管理的服务的状态//很有意思,不过与ubuntu不同。

解析 super daemon 的配置文件

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

系统开启的服务

重点回顾、本章习题、参考数据与延伸阅读

第十九章、认识与分析登录log文件

什么是登录文件: 登录文件的重要性, 常见档名, 服务与程序

Linux 常见的登录文件档名

/var/log/cron: //kubuntu has no such a file
    还记得第十六章例行性工作排程吧?排程有没有实际被进行? 有没有发生错误?/etc/crontab是否撰写正确?
/var/log/dmesg://kubuntu has
    系统启动时,核心侦测过程所产生的各项资讯。CentOS默认将启动时核心的硬件侦测过程取消显示, 因此额外将数据记录一份在这个文件中;
/var/log/lastlog:
    所有帐号最近一次登陆的相关资讯。第十四章讲到的'lastlog'命令。
/var/log/maillog 或 /var/log/mail/*:
    记录sendmail(SMTP协议提供者)与dovecot(POP3 协议提供者)所产生的信息啦。 
    SMTP 是发信所使用的通讯协议, POP3 则是收信使用的通讯协议。 
    sendmail 与 dovecot 则分别是两套达成通讯协议的软件。 
/var/log/messages://kubuntu has no such a file
    相当重要,几乎系统发生的错误信息(或重要资讯)都会记录在这个文件;如果系统发生莫名的错误,这个文件是一定要查阅的登录文件之一。
/var/log/secure://kubuntu has no such a file
    基本上,只要牵涉到『需要输入帐号口令』的软件,那么当登陆时 (不管登陆正确或错误) 都会被记录在此文件中。 
    包括系统的 login 程序、图形介面登陆所使用的 gdm 程序、 su, sudo 等程序、还有网络连线的 ssh, telnet 等程序.
/var/log/wtmp, /var/log/faillog:
    正确登陆系统者的帐号资讯(wtmp)与错误登陆时所使用的帐号资讯(faillog).
    第十一章谈到的 'last' 就是读取 wtmp 来显示的, 这对於追踪一般帐号者的使用行为很有帮助!
/var/log/httpd/*, /var/log/news/*, /var/log/samba/*:
    不同的网络服务会使用它们自己的登录文件来记载它们自己产生的各项信息.

服务与程序

登录文件的产生:
    一是开发商自行定义文件path与格式,例如apache。
    另一种则是由 Linux distribution 提供的登录文件管理服务统一管理。
        只要将信息丢给这个服务,他就会自己分门别类的将各种信息放置到相关的登录文件去!
        例如CentOS 提供 syslogd 这个服务来统一管理登录文件喔!
总结,针对登录文件,我们需要的服务/程序有:
    syslogd: 系统与网络等服务的信息;
    klogd:   核心产生的各项资讯;
    logrotate:登录文件的轮替。只将旧的登录文件留下一阵子.

syslogd :记录登录文件的服务

登录文件的轮替 (logrotate)

分析登录文件

本章习题练习、针对本文的建议

第二十二章、软件安装:原始码与 Tarball

开源软件安装与升级简介

什么是开放源码、编译器与可运行档

[[email protected] ~]# file /bin/bash
/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
[[email protected] ~]# file /etc/init.d/syslog
/etc/init.d/syslog: Bourne-Again shell script text executable

什么是函式库

什么是 make 与 configure

什么是 Tarball 的软件

如何安装与升级软件

C语言编译的简例

单一程序:印出 Hello World

eg1: gcc hello.c; ./a.out  #默认:a.out OBS:executable file.
eg2: gcc -c hello.c (hello.o); gcc -o hello hello.o (./hello)
eg3: gcc -c thanks.c thanks_2.c (thanks_2.o and thanks_2.o); gcc -o thanks thanks.o thanks_2.o (./thanks)
    由於我们的原始码文件有时并非仅只有一个文件,所以我们无法直接进行编译。
    另外,如果有一天,你升级了 thanks_2.c 这个文件的内容,则你只要重新编译 thanks_2.c, 然后再连结
eg4: gcc -o sin -Wall -O sin.c -lm [-I/usr/include] [-L/lib -L/usr/lib] 
    -o: Output binary filename; vs. -c: Compile only, without link
    -Wall: Warnning leve: all.
    -O: Optimize.
    -I: Include-header path.
    -l: Library. 指的是 libm.so 或 libm.a 这个函式库文件; -L: Library path. #连接的时候需要库,编译时候不需要。
通常称 -Wall 或者 -O 这些非必要的参数为旗标 (FLAGS), 即env里关于C语言的CFLAGS. 尤其是在后头会介绍的 make 相关的用法时,更是重要的很呐! ^_^

主、副程序连结:副程序的编译

呼叫外部函式库:加入连结的函式库

gcc 的简易用法 (编译、参数与链结)

make:巨集编译

为什么要用 make

makefile 的基本语法与变量

命令列、且只有命令列以 tab 按键作为开头』
而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』
与 bash shell script 的语法有点不太相同,变量的基本语法为:
    变量与变量内容以『=』隔开,同时两边可以具有空格;
    变量左边不可以有 <tab> ,例如上面范例的第一行 LIBS 左边不可以是 <tab>;
    变量与变量内容在『=』两边不能具有『:』;
    在习惯上,变量最好是以『大写字母』为主;
    运用变量时,以 ${变量} 或 $(变量) 使用;
        在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
        在命令列模式也可以给予变量。
    gcc 在编译时,会主动读取CFLAGS环境变量,所以,可以在shell定义这个环境变量,也可以在makefile里定义,更可以在命令列当中给予!
env 优先级:
    make 命令列后面加上的环境变量为优先;
    makefile 里面指定的环境变量第二;
    shell 原本具有的环境变量第三。
eg:
    [[email protected] ~]# vi makefile
    LIBS = -lm
    OBJS = main.o haha.o sin_value.o cos_value.o
    CFLAGS = -Wall
    main: ${OBJS}
        gcc -o [email protected] ${OBJS} ${LIBS}   #<==那个 [email protected] 就是 "main". [email protected]:代表当前的标的(target)
    clean:
        rm -f main ${OBJS}

Tarball 的管理与建议

所需要的基础软件

gcc 或 cc 等 C 语言编译器 (compiler).
make 及 autoconfig.
Kernel 提供的 Library 以及相关的 Include 文件. 核心相关的功能通常都是被包含在 kernel-source 或 kernel-header 这些软件名称当中,所以记得要安装这些软件喔!
在 CentOS 当中,如果你已经有网络可以连上 Internet 的话,那么就可以使用下一章会谈到的 yum 罗! 透过 yum 的软件群组安装功能,你可以这样做:
    如果是要安装 gcc 等软件发展工具,请使用『 yum groupinstall "Development Tools" 』
    若待安装的软件需要图形介面支持,一般还需要『 yum groupinstall "X Software Development" 』
    若安装的软件较旧,可能需要『 yum groupinstall "Legacy Software Development" 』

Tarball 安装的基本步骤

解压缩tarball 到 /usr/local/src;
查阅 INSTALL 与 README 等; 安装依赖软件;
configure 或 config 侦测作业环境,并创建 Makefile 这个文件;
    # eg: ./configure --help ; ./configure --prefix=/usr/local/ntp (默认是/usr/local)
编译:make 使用该目录下的 Makefile 做为他的参数配置档;
安装:make 以 Makefile 这个参数配置档,依据 install 这个标的 (target) 的指定来安装到正确的路径!
此外,如果安装成功, 并且是安装在独立的一个目录中,例如 /usr/local/packages 这个目录中好了,那么你就必需手动的将这个软件的 man page 给他写入 /etc/man.config 里面去。
在默认的情况下, man 会去搜寻 /usr/local/man 里面的说明文件.

一般 Tarball 软件安装的建议事项 (如何移除?升级?)

由於Tarball反安装有比较高的难度 (如果你没有好好规划的话~),所以通常鸟哥会这样建议使用者:
    tarball解压缩到 /usr/local/src 当中;
    安装到 /usr/local;
    考虑反安装,可以将每个软件单独的安装在 /usr/local 底下;
    为安装到单独目录的软件之 man page 加入 man path;
        如果安装软件到 /usr/local/software/ ,那么在 /etc/man.config 的 40~50 行左右写入:
        MANPATH /usr/local/software/man

一个简单的范例、利用 ntp 来示范

利用 patch 升级原始码

*测试旧版程序的功能
*查阅 patch file 内容
    [[email protected] main-0.1]# vim ~/main_0.1_to_0.2.patch
    diff -Naur main-0.1/cos_value.c main-0.2/cos_value.c
    --- main-0.1/cos_value.c        2009-06-09 22:52:33.000000000 +0800
    +++ main-0.2/cos_value.c        2009-06-12 00:45:10.000000000 +0800
    @@ -6,5 +6,5 @@ ...
path 命令语法: #see =>> part3 ch12
    patch -p数字 < patch_file #升级
    『 -p数字』:假如 patch_file 第一行是这样:"/home/guest/example/expatch.txt"
        or: "diff --git a/home/guest/example/expatch.txt b/home/guest/example/expatch.txt"
    『patch -p0 < patch_file』,升级的文件是『/home/guest/example/expatch.txt』
    『patch -p1 < patch_file』,升级的文件是『home/guest/example/expatch.txt』
    『patch -p4 < patch_file』,升级的文件是『expatch.txt』
    也就是说, -pn 那个 n 代表『拿掉几个斜线(/)及其前面的目录』的意思!
    因为并没有 main-0.2 的目录存在, 我们是在当前的目录进行升级的!因此使用的是 -p1 才对喔!
*升级原始码,并且重新编译程序!
*如果 patch 错误呢?没关系的!我们的 patch 是可以还原的啊!『 patch -R < ../main_0.1_to_0.2.patch 』

函式库管理

动态与静态函式库

static: libxxx.a
dynamic:libxxx.so #动态函数连接库
绝大多数的函式库都放置在:/usr/lib, /lib 目录下.
Linux 系统里面很多的函式库其实 kernel 就提供了,kernel 的函式库在 /lib/modules 里面啦!

ldconfig 与 /etc/ld.so.conf (Linker Dynamic config)(Load Dynamic config)

将动态函式库加载高速缓存/RAM/cache 
    *在 /etc/ld.so.conf 里面写下『动态函式库所在目录』; #注意喔, 是目录而不是文件
        [[email protected] ~]# vi /etc/ld.so.conf
        include ld.so.conf.d/*.conf
        /usr/lib/mysql   <==这一行新增的啦!
    *运行 ldconfig 将 /etc/ld.so.conf 指明的lib读入缓存当中;
    *同时也将数据记录一份在 /etc/ld.so.cache 这个文件当中呐! #??? #not plain text
ldconfig [-f configFileName] [ -C cacheFileName]; ldconfig [-p].
    -f:默认值:/etc/ld.so.conf
    -C:使用cacheFileName作为缓存缓存的函式库数据,而不以 /etc/ld.so.cache 为默认值
    -p:disPlay Present 目前所有函式库数据内容 (在 /etc/ld.so.cache 内的数据!)

查看某程序所需的动态函式库: ldd (Linker Dynamic Dependencies)

ldd [-vdr] [filename]
    -v :verbose;
    -d :重新将数据有遗失的 link 点秀出来! #???
    -r :将 ELF 有关的错误内容秀出来! #???
eg: [email protected]:~$ ldd /usr/bin/passwd 
    linux-gate.so.1 =>  (0xb76e8000)
    libpam.so.0 => /lib/i386-linux-gnu/libpam.so.0 (0xb76c2000)            <==PAM 模块
    libpam_misc.so.0 => /lib/i386-linux-gnu/libpam_misc.so.0 (0xb76be000)
    libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0xb769f000)    <==SELinux
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7523000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb751e000)
    /lib/ld-linux.so.2 (0xb76e9000)

检验软件的正确性: md5sum/sha1sum [-tbc] fileName

-t: Text (default);
-b: Binary;
-c: Check.

你可以替以下文件创建指纹数据库,然后经常以 script 的方式自动检查指纹表是否不同!
/etc/passwd
/etc/shadow( 假如你不让使用者改口令了 )
/etc/group
/usr/bin/passwd
/sbin/portmap
/bin/login ( 这个也很容易被骇! )
/bin/ls
/bin/ps
/usr/bin/top

== 第二十二章 end ==