默认教学计划
931人加入学习
(20人评价)
Linux运维基础
价格 ¥ 599.00
该课程属于 高校公益行 | 网络安全实践训练营 请加入后再学习
bind日志功能:
在默认情况下,BIND9 把日志消息写到 /var/log/messages文件中,主要就是启动,关闭的日志记录和一些严重错误的消息;而将调试日志信息写入 BIND 服务器工作目录中的 named.run 文件。
通过在options字段中添加“querylog    yes”,messages日志会记录查询的请求查询的记录,但是该方法繁杂,系统提供了logging的方法。
BIND 9 的日志是可以灵活配置的,要详细记录服务器的运行状况,要在配置文件 named.conf 中使用 logging 语句来定制自己所需要的日志记录。
 
BIND 日志的常用术语:在讲述 logging 语句的语法之前,先要熟悉一些常用术语
channel(通道) 日志输出方式,如:syslog(记录到/var/log/messages中)、文本文件、标准错误输出或 /dev/null
category(类别) 日志的消息类别,如:查询消息或动态更新消息等
module(模块) 产生消息的来源模块名称
facility(设备) syslog 设备名
severity(严重性) 消息的严重性等级
 
logging 语句的语法为:
logging {
    channel channel_name {                // 定义通道
        file log_file [versions number | unlimited] [size sizespec]; | syslog optional_facility; | null; | stderr;      // 定义输出方式
        severity log_severity;           // 定义消息严重性
        [print-time boolean;]            // 是否在消息中添加时间前缀,仅用于 file 日志
        [print-severity boolean;]        // 是否在消息中添加消息严重性前缀
        [print-category boolean;]        // 是否在消息中添加消息类别名前缀
        };
    category category_name {              // 定义类别
    channel_name;
    ……
    };
};
配置日志时,首先要定义通道,然后将不同的日志类别的数据指派到指定的通道上输出。
BIND 9 的默认配置是:
logging {
// 由于使用了默认通道,所以没有通道定义部分
category “default” { “default_syslog”; “default_debug”; };
};
 
 
BIND 9 中可用的类别名(category_name)有:
category 语句是指定哪一种类别的信息使用哪个或者哪几个已经定义了的通道输出。
  client 处理客户端请求。
  config 配置文件分析和处理。
  database 同BIND内部数据库相关的消息,用来存储区数据和缓存记录。
  default 匹配所有未明确指定通道的类别。
  dnssec 处理 DNSSEC 签名的响应。
  general 包括所有未明确分类的 BIND 消息。
  lame-servers 发现错误授权,即残缺服务器。
  network 网络操作。
  notify 区域更新通知消息。
  queries 查询日志
  resolver 名字解析,包括对来自解析器的递归查询信息。
  security 批准/非批准的请求。
  update 动态更新事件。
  xfer-in 从远程名字服务器到本地名字服务器的区传送。
  xfer-out 从本地名字服务器到远程名字服务器的区传送。
 
 
severity 语句用于指定消息的严重性等级,log_severity 的取值为(照严重性递减的顺序);
critical
error
warning
notice
info
debug [ level ]
dynamic 是一个特殊的值,它匹配服务器当前的调试级别
定义了某个严重性级别后,系统会记录包括该级别以及比该级别更严重的级别的所有消息。比如定义级别为 error,则会记录 critical 和error 两个级别的信息。
对于系统管理员来说,一般记录到 info 级别就可以了。
 
 
例如
要记录查询消息和区域传输,可以在 named.conf 中添加如下配置:
logging {
    channel query_log {
        file “/var/log/bind/query.log”size 20M;
        severity info;
        print-time yes;
        print-category yes;
    };
 
    channel xfer_in_log {
        file “/var/log/bind/xfer_in_log”size 20M;
        severity debug 3;
        print-time yes;
        print-severity yes;
        print-category yes;
    };
    
    channel xfer_out_log {
        file    "/var/log/bind/xfer_out_log" size 10M;
        severity debug 3;
        print-time yes;
        print-severity yes;
        print-category yes;
};
        category queries { query_log; };
        category xfer-out { xfer_out_log; };
        category xfer-in { xfer_in_log; }
    };
};
这样服务器会在工作目录(directory 语句所指定的目录,Ubuntu 为:/var/cache/bind)下创建 query.log 文件,并把运行过程产生的 queries 消息写如到此文件中。
 
 
 
BIND 9 预制了如下四个默认通道;
channel “default_syslog” {
  syslog daemon;     // 发送给 syslog 的 daemon 设备
  severity info;     // 只发送此 info 及其更高优先级的信息
  };
channel “default_debug” { // 只有当服务器的 debug 级别非 0 时,才产生输出。
  file “named.run”; // 写入工作目录下的 named.run 文件
  severity dynamic; // 按照服务器当前的debug 级别记录日志
  };
channel “default_stderr” {
  stderr;           // 写到stderr
  severity info;    // 只发送此 info 及其更高优先级的信息
  };
channel “null” {
  null;             // 丢弃所有发到此通道的信息
  };
 
 
 
rndc:remote name domain controller:远程域名服务器控制器
  /etc/rndc.conf:rndc配置文件
  /etc/rndc.key:rndc秘钥文件
 
例:
192.168.10.20远程控制192.168.10.10
192.168.10.10配置
  # rndc-confgen -a    //执行命令生成秘钥文件
  # rndc-confgen > /etc/rndc.conf  //执行命令生成rndc配置文件
 
客户端只需rndc.conf配置文件即可
 
rndc.conf解析:文件中有一部分需要拷贝到named.conf中
# Start of rndc.conf          //配置文件开始
        key "rndc-key" {     //定义key名称,如“rndc-key”
            algorithm hmac-md5;    //加密算法
            secret "8pycNW/k9tI+4EfR7JHs2g==";   //生成密文
        };
 
        options {
            default-key "rndc-key";     //使用的秘钥,秘钥名称要和key定义的名字相同
            default-server 127.0.0.1;  //监听哪个IP地址,如:服务器填“127.0.0.1”,客户端填“192.168.1.10”(服务器IP地址)
            default-port 953;   //rndc默认端口号,为tcp的953端口
        };
# End of rndc.conf   //配置文件结束
 
添加到named.conf文件中的内容解析:
    key "rndc-key" {    
        algorithm hmac-md5;
        secret "8pycNW/k9tI+4EfR7JHs2g==";
        };
 
    controls {
        inet 127.0.0.1 port 953    //定义监听的IP地址和远程控制的端口
                allow { 127.0.0.1; } keys { "rndc-key"; };  //定义允许远程控制的主机和key文件
        };
 
 
 
DNS服务器压力测试:
queryperfDNS性能测试工具
    建立测试文件格式:  www.gooann.net A
                                    ns1.gooann.net NS
                                    ftp.gooann.net A
    命令:queryperf -d /root/file -s DNS服务器IP
    -d:指定测试文件
    -s:指定测试DNS服务器地址
 
dnstop:监控dns
    -4:使用IPv4
    -R:请求的数据包
    -Q:回复的数据包
   # dnstop -4 网卡名称 -R -Q
 
[展开全文]
1、named.conf中acl的应用:
用于在named.conf定义符号
allow-recursion { list_ip;}   { 192.168.10.0/24; 1.0.0.0/8; .....}
allow-transfer { list_ip;}
allow-query { list_ip;}
    list_ip:IP地址
     none:禁止所有
     any:允许所有的
 
   acl acl_name {              //定义了acl_name这个符号替代列表中的IP
           192.168.10.0/24;
           172.168.0.0/18;
           10.0.0.0/8;
   };
 
options {
        directory "/var/named";
        allow-recursion    { acl_name; };
 
    };
 
 
2、泛域名解析:在区域数据库文件中添加A记录,使得没有的域名都对应该IP
  *    IN     A  ip       //不常用
 
 
3、智能DNS:BIND+VIEW
CDN:内容分发网络(根据解析地址的不同,为客户端分配相应的内容资源)
   split brain:脑裂
   web缓存对象:缓存静态内容(动态web对象可以通过技术映射成静态内容)
 
VIEW:视图
  所有的zone都必须放在VIEW中;根区域只需要定义在能够递归客户端的view中
 
BIND DLZ:dynamic load zone:动态加载区域,企业中当DNS区域信息过多时把DNS区域信息存放到数据库中再进行读取
 
[展开全文]
子域:
    即在主域名下的子域名  ,是为了方便管理,父域划分出来的子域,并且父域指定了子域中的权威服务器,子域DNS服务器有自己的区域数据库文件,子域的名称是继承的父域的名称
 
例如:
   申请域名:gooann.net
    申请子域名:market.gooann.net
    申请子域名:fin.gooann.net
   父子域名都拥有自己的主从DNS
 
 
修改完配置文件一定注意文件权限
 
步骤:
1、配置主DNS配置文件/etc/named.conf:
2、编写DNS记录文件:
    /var/named/gooann.net
    /var/named/gooann.net.arpa
3、修改文件权限:
    chown root.named gooann.net*
    chmod 640 gooann.net*
4、重启DNS服务:
    systemctl enable named.service
    systemctl start named.service
5、使用dig命令测试:
    dig -t A www.gooann.net @192.168.10.10
    dig -t NS gooann.net @192.168.10.10
 
接下来对从DNS服务器进行配置:
1、首先从主服务器拷贝文件修改:
    
2、从DNS服务器named.conf配置文件:
    
 
子域主DNS服务器:
1、DNS配置文件: 
图中 .40 为子域中的从服务器IP
2、修改DNS记录文件:/var/named/market.gooann.net
3、修改DNS反向记录文件:/var/named/market.gooann.net.arpa
4、但是,还需要父域的主DNS服务器给子域授权:对父域主DNS gooann.net进行修改
在父域的区域数据库文件中添加记录:
  子域名城    IN       NS     子域DNS服务器名称
  子域DNS服务器名称 IN  A IP
 
    
 
 
 
转发:
   在设置完父域与子域DNS服务器后,会发现子域无法解析父域中的域名,例如:
    子域market.gooann.net无法解析 www.gooann.net 
    因此就需要对子域DNS服务器进行设置 转发
    转发分为全局转发和区域转发,全局转发设置options字段,区域转发添加一个区域用于转发
1、全局转发:
  
2、转发一个区域:
    
 
forward {only|first}
     only:先转发给转发器,如果转发器解析不了,则放弃
     firest:先转发给转发器,如果转发器解析不了,则进行递归查询
 
最后结果可以看到,转发解析的域名不是权威答案
[展开全文]


一些概念

在系统中,一个进程只认为自己存在
父shell   子shell        父子shell之间设置环境互相独立
shell 也是一个程序
cat  /etc/shells  查看系统支持的shell  ,没有的可以安装,并不说明不支持
exit  退出当前 shell 程序

                   bash 的特性:
1. 命令历史
2. 管道  重定向
3. 命令别名
4. 命令行编辑
5. 命令行展开
6. 命令行通配
7. 变量
8. 编程


命令历史:
 history
1.    -c   清空命令历史(仅限于内存缓冲区当中)
2.   -d  删除某一条命令历史
3.   -w   将命令历史保存到某个文件中,缺省值  .bash_history 文件     // 替换重定向,谨慎使用
4. -a    将命令历史保存到某个文件中,缺省值  .bash_history 文件     //  追加重定向
5.   !n  执行命令历史中的第n条命令
6. !-n  执行命令历史中倒数第n条命令
7. !word  执行命令历史中最近一次以 word 开始的命令    不一定是一个单词,一个字母也行,必须要能唯一标识该命令        不错
8. !! 执行上一次命令
9. !$   引用上一条命令的最后一个参数        比如上一次   ls  /etc   那么 ls  !$  就等价于  ls  /etc       ls + esc + .   也可以达到i相同效果           不错

命令行编辑:
1. ctrl+a  光标快速跳转到命令行行首
2. ctrl+e  光标快速跳转到命令行行尾
3. ctrl+u   快速删除光标位置到命令行行首的字符   不包括当前字符
4. ctrl+k   快速删除光标位置到命令行行尾的字符    包括当前字符
5. ctrl+l     清屏    等同  clear

命令行展开:
1. 命令补齐:在 PATH变量搜索命令并补齐(PATH变量必须正常,输入要补齐命令的字符数一定要能够唯一标识这条命令;tab键补齐)    按两次 tab键 ,会列出以某个或某些字符开始的所有命令
2. 路径和文件补齐:在系统路径中查找
3. 命令行补齐功能不能补齐选项,即参数
4. 命令替换    就是把命令中的子命令替换成子命令执行结果的过程
5. 接上,经常用到shell脚本编程中      $(command)  `command`
6. 接上,   ""(双引号):弱引用(可以实现变量的替换,把变量名替换为变量值)
7. 接上,  ``  (反引号): 命令引用
8. 接上, ''(单引号):强引用(不能完成变量替换)

命令别名:
1. alias  别名=command                 alias 定义的别名只在当前shell生效      直接输入  alias 会打印所有命令别名
2. 执行  alias命令时,command最好用'' (单引号) 含括起来,没有参数不用也行,有参数一定要用      双引号亲测也行
3. unalias 别名   取消 该别名

命令行通配:globbing
1. *:匹配任意长度的任意字符
2. ?:匹配任意单个字符
3. []:匹配指定范围内的任意单个字符
4. [^]:匹配指定范围外的任意单个字符
5. [:space:] : 表示空格
6. [:punct:]:表示所有标点符号
7. [:lower:]:表示所有小写字母
8. [:upper:]:表示所有大写字母
9. [:alpha:]: 表示所有字母(大小写)
10. [:digit:]:表示所有数字
11. [:alnum:]:表示所有数字和大小写字母
12. 并不能很准确的匹配,要追求精确,还是要用正则表达式

管道,IO重定向
  计算机体系结构:
       控制器:CPU,读取系统指令
       运算器:CPU,运算
       存储器:RAM(内部存储器:易失性存储器)
       输入设备:输入数据,如键盘,硬盘等
       输出设备:显示指令执行结果,如显示器,音响,硬盘等

   计算机总线:
       地址总线:负责内存寻址
       数据总线:负责传输数据
       控制总线:负责控制指令
    寄存器:CPU中临时存储空间

    I/O设备

    程序:指令+数据
        指令:由程序提供,负责加工数据
        数据:系统中数据可以有多种来源,比如来自变量,来自文件,来自输入设备等
    标准输入输出设备
            标准输入设备:文件描述符为  0
            标准输出设备:文件描述符 为 1
            标准错误输出设备:显示器(stderr)  文件描述符为 2
    三种数据流

    当在Linux中打开一个文件时,内核会反复调用,对于文件标识就很重要了,用文件描述符来标识文件,文件加载完成后用数字标识
    fd:file descriptor (文件描述符)

    IO重定向:把默认输入输出数据来源重新定向到其他的文件或设备
      输出重定向:  通过重定向到终端名可以实现不同终端之间的交流 (使用 tty  来查看当前终端的名字)
                    2>  错误覆盖输出重定向
                    touch   /dir_name/{a.txt,b.txt,c.txt}    在其他目录同时创建多个文本
                    &>  混合覆盖输出重定向      &>>  混合追加输出重定向
      输入重定向:

   管道:

   tr:实现字符转换,不修改源文件       cat   /etc/passwd  | tr  'a-z'  'A-Z'      把 /etc/passwd 的所有字母转换为大写字母
   tee:ls  /etc/  |  tee  cws.txt       同时输出到屏幕和保存到文件中

[展开全文]

六、DNS服务器的类型:

1、主DNS:可以完成数据的修改

2、辅助DNS:辅助DNS服务器向主DNS服务器请求数据更改

     serial number:请求序列号

     refresh:请求更新时间

     retry:请求重试时间(该时间一定小于更新时间)

     expire:过期时间

     minittl:否定答案的缓存时间

     如果在expire(过期时间)内,主DNS依然没有响应辅助DNS请求,辅助DNS也将停止工作

3、缓存DNS服务器:只做区域的高速DNS缓存查询

 

DNS转发器:不负责查询,只负责转发

时间单位: D(天) W(周) H(小时) 默认的时间单位是秒

 

六、DNS解析记录

  DNS主要资源记录类型(RRT:Resource Record Type)

 1、A记录:正向解析记录,把FQDN解析为IP地址

www.gooann.com. 600 IN A 192.168.1.1

    或简写为

    www  600 IN A 192.168.1.1

 2、PRT记录(Pointer):反正指针,把IP地址解析成FQDN

    192.168.1.1 600 IN PTR www.gooann.com.

    或简写为:

    1  600 IN PRT www.gooann.com.

  3、MX(Mail Exchanger):邮件交换记录    abc@gooann.com

    优先级:0-99,数字越小优先级越高

gooann.com.  600 IN MX 10 mail.gooann.com.

gooann.com.  600 IN MX 20 mail2.gooann.com.

mail.gooann.com.    600 IN A 192.168.1.2

mail2.gooann.com.    600 IN A 192.168.1.3

  4、NS记录(Name Server):名称服务器,指明该区域中哪台主机是DNS服务器(通常位于DNS服务器区域数据库中第二行)

gooann.com. 600 IN NS ns1.gooann.com.

gooann.com. 600 IN NS ns2.gooann.com.

gooann.com. 600 IN NS ns3.gooann.com.

ns1.gooann.com. 600 IN A 192.168.10.10

ns2.gooann.com. 600 IN A 192.168.10.20

ns3.gooann.com. 600 IN A 192.168.10.30

 5、SOA记录(start of authority):起始授权机构,指明该区域中哪台DNS是主DNS服务器,必须位于区域数据库文件中的第一行

gooann.com. 600 IN SOA ns1.gooann.com. admin.gooann.com. (

                                                1000 ; serial number

                                                300  ; refresh

                                                200  ; retry

                                                500  ; expire

                                                30   ; minittl

                                                    )

  6、CNAME记录:(Canonical Name):别名

www.gooann.com. 600 IN A 192.168.10.1

www2.gooann.com. 600 IN CNAME www.gooann.com.

 

七、区域文件格式:

名称(name) 缓存时间(TTL:可省略) IN(intenet) RRT(资源类型) 数据(value)

 

DNS正向区域数据库:

gooann.com. 600 IN SOA ns1.gooann.com. admin.gooann.com. (    //SOA记录

                                                1000 ; serial number

                                                300  ; refresh

                                                200  ; retry

                                                500  ; expire

                                                30   ; minittl

                                                    )

gooann.com. 600 IN NS ns1.gooann.com.    //NS记录

gooann.com. 600 IN NS ns2.gooann.com.

ns1.gooann.com. 600 IN A 192.168.10.3    //A记录

ns2.gooann.com. 600 IN A 192.168.10.4

www.gooann.com. 600 IN A 192.168.10.1    

ftp.gooann.com. 600 IN A 192.168.10.2

mail.gooann.com. 600 IN A 192.168.10.5

gooann.com.  600 IN MX 10 mail.gooann.com.    //MX记录

 

DNS反向区域数据库:(10.168.192.in-addr.apra)

gooann.com. 600 IN SOA ns1.gooann.com. admin.gooann.com. (

                                                1000 ; serial number

                                                1H  ; refresh

                                                200  ; retry

                                                500  ; expire

                                                30   ; minittl

                                                    )

gooann.com. 600 IN NS ns1.gooann.com.

gooann.com. 600 IN NS ns2.gooann.com.

    3.10.168.192.in-addr.arpa 600 IN PTR ns1.gooann.com.

    4.10.168.192.in-addr.arpa 600 IN PTR ns1.gooann.com.

    1.10.168.192.in-addr.arpa 600 IN PTR www.gooann.com.

    2.10.168.192.in-addr.arpa 600 IN PTR ftp.gooann.com.

    5.10.168.192.in-addr.arpa 600 IN PTR mail.gooann.com.

gooann.com. 600 IN MX 10 mail.gooann.com.

[展开全文]
一、DNS概念:Domain Name System(域名系统)
    是互联网上作为域名和IP地址相互映射的一个分布式数据库
 
二、DNS功能:
    完成IP地址和域名之间的一个映射
 
三、DNS分类:
    1、静态映射:
每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用
    2、动态映射:
建立一套域名解析系统(DNS),只在专门的DNS上配置主机到IP地址的映射,网络上需要使用主机名通信的设备,首先需要到DNS服务器查询主机所对应的IP地址
 
四、DNS数据库层次结构:
    上级只知道直接下属的存在 
 
五、DNS查询方式:
1)递归查询:不知道的服务器会代替帮你查询
在该模式下DNS 服务器接收到客户机(也可能是DNS服务器)请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器没有存储查询DNS 信息,那么该服务器会代替询问其他服务器,该过程反复,直到得到解析结果,再一步步返回给源客户机。
(2)迭代查询:服务器不知道,但是会告诉你你去询问谁
DNS 服务器会向客户机提供其他能够解析查询请求的DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果为止。这个查询过程可能会由你的本地DNS服务器帮你完成。
[展开全文]
一、OSI参考模型:适用于所有网络,现有模型,后有协议
1、应用层:应用程序、用户接口
2、表示层:编码转换、压缩、解压、加密等
3、会话层:建立、维护、拆除会话
4、传输层规定了应用程序的的接口
协议:TCP【9】、UDP【10】    PDU:数据段
5、网络层:为数据传输选择一条最优路径,采用尽力而为的发送方式
工作设备:路由器【4】    PDU:数据包    逻辑地址:IP地址    
协议:IP【5】、ARP【6】、RARP【7】、ICMP【8】
6、数据链路层:使用MAC地址(48位2进制,前24位厂商,后24位为设备地址)传输数据帧 
工作设备:交换机【1】    协议:ARP、RARP    数据帧格式:【2】
7、物理层:介质和信号(双绞线、光线、同轴电缆和模拟信号、数字信号),物理层关心的是电气特性、规程特性、功能特性、物理特性,从数据链路层接收数据转换为bit流,为数据传输提供安全的通信通道
 
 
【1】交换机功能:
自学习:学习源MAC以及进入的接口
广播:
转发:
过滤:
更新:
【2】数据帧格式:
 
        【3】集线器(hub)工作原理:
            收到一个bit时,将该bit向其他所有接口传输出去,是一个广播域网,且没有冲突检测
 
        【4】路由器:
            根据路由表转发数据,分为直连路由、非直连路由
            直连路由:为接口配置IP地址并保证UP状态
            非直连路由:通过静态指定或动态学习
 
        【5】IP协议:
 
版本:4位,标识IP地址的版本,常用的是IPv4和IPv6
首部长度:4位,可变长度,根据可选项变化
优先级与服务类型:8位,提供第三层的服务质量
总长度:16位,IP包头总长度
标识符:16位,为分段数据打上标记,方便到目标地址重新组装
标志:3位,第一位没有设置,第二位是DF,决定是否分片,0代表部分片,1代表分片;第三位是MF:代表更多的片,只有数据的最后一片值为0
段偏移量:13位,代表数据片在整个数据中的位置
TTL:8位,生命周期,数据包经过路由器个数,数据包每经过一个路由器,TTL值减一,当TTL值为0时,数据还没有到达目标地址,该数据将被丢弃,一般设置为32或64
协议号:8位,标识上层协议号
首部校验和:16位,验证发送端和接收端数据的完整性
源地址:32的IP地址
目标地址:32的IP地址
可选项:松散路由 严格路由 路由标记 时间戳
           填充:把IP包头每行都填充为32位
        
        【6】ARP协议:
      
硬件类型
协议类型
硬件地址长度
协议长度
Opcode
发送方MAC地址
发送方IP地址
目的MAC地址
目的IP地址
        【7】RARP协议: 逆地址解析协议 RARP 使只知道自己硬件地址的主机能够知道其IP地址
 
        【8】ICMP协议:ICMP报文作为IP层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去
        
ICMP报文的前4个字节是统一的格式,共有三个字段:即类型,代码和检验和.接着的4个字节的内容与ICMP的类型有关,https://www.cnblogs.com/kzloser/articles/2582349.html#a3
 
        【9】TCP协议:
      
源端口
目的端口
序列号
指定ack号
包头头长度
Flags(标志位):
URG:紧急指针有效位,标记紧急数据
ACK:确认序列号有效位
PSH:通知接收端把数据交给进程,不要在缓冲区中停留
RST:请求重新建立三次握手
SYN:请求建立三次握手
FIN:请求断开连接
窗口大小:
适当的窗口大小
TCP窗口大小比例系数
校验和
 
TCP流量控制机制:
以消除发送方使接收方缓存溢出的可能性,是一个速度匹配服务,即发送发速率与接收方应用程序的读取速率相匹配。
发送方维护一个接收窗口,该接收窗口给发送方指示了接收方还有多少缓存空间剩余
发送方:LastSent-LastAcked≤rwnd(接收窗口)
接收方:LastRcvd-LastRead≤RcvBuffer
 
TCP拥塞控制:
 在发送方新增一个额外变量 cwnd(拥塞窗口),LastSent-LastAcked≤min{ cwnd, rwnd}
TCP拥塞控制算法:
    慢启动
    拥塞避免
    快速恢复
总结:线性增,乘性减
TCP差错控制:
三个简单工具:
    检验和
    确认
    超时
TCP时间计时器:
重传计时器
坚持计时器: 解决零窗口大小通知可能导致的死锁问题,发送端建立该计时器
保活计时器: 为了防止两个TCP连接出现长时间的空闲。当客户端与服务器端建立TCP连接后,很长时间内客户端都没有向服务器端发送数据,服务端建立保活计时器。
时间等待计时器: 连接终止期间使用,先断开连接的一方建立
 
 
        【10】UDP协议:
        
 
 
 
二、TCP/IP网络协议模型:只适用于TCP/IP网络,先有协议,后又模型
    1、应用层
    2、传输层
    3、网络层
    4、数据链路层
    5、物理层
[展开全文]

systemd特性

1.平行处理所有服务,加速开机流程:旧的init启动脚本是一项一项任务依序启动的模式,因此不相依的服务也是得要一个一个的等待.systemd可以让所有的服务同时启动,因此系统启动的速度变快了

 

2.一经要求就回应的on-demand启动方式:systemd全部就是仅有一只systemd服务搭配systemctl指令来处理,无须其他额外的指令来支援.不像systemV还要init,chkconfig,service...等等指令.此外,systemd由于常驻存储器,因此任何要求(on-demand)都可以立即处理后续的daemon启动的任务.

 

3.服务依赖性的自我检查:由于systemd可以自订服务相依性的检查,因此如果B服务是架构在A服务上面启动的,那当你在没有启动A服务的情况下仅手动启动B服务时,systemd会自动帮你启动A服务!

 

4.按照daemon功能分类:systemd管理的服务非常多,首先systemd先定义所有的服务为一个服务单位(unit),并将该unit归类到不同的服务类型(type)去.systemd将服务单位(unit)区分为service,socket,target,path,snapshot,timer等多种不同的类型(type),方便管理员的分类与记忆.

 

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

 

6.向下兼容旧有的init服务脚本:基本上,systemd是可以兼容于init的启动脚本的,因此,旧的init启动脚本也能够通过systemd来管理,只是更进阶的systemd功能就没有办法支援了.

 

7.systemd有些地方无法完全取代init!包括:在runlevel的对应上,大概仅有runlevel1,3,5有对应到systemd的某些target类型而已,没有全部对应;

 

8.全部的systemd都用systemctl这个管理程序管理,而systemctl支援的语法有限制,不像/etc/init.d/daemon就是纯脚本可以自订参数,systemctl不可自订参数.;

 

几个重要概念:

    Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器.

 

    Systemd是一个系统管理守护进程、工具和库的集合,用于取代SystemV初始进程.Systemd的功能是用于集中管理和配置类UNIX系统.

 

在Linux生态系统中,Systemd被部署到了大多数的标准Linux发行版中,只有为数不多的几个发行版尚未部署.Systemd通常是所有其它守护进程的父进程,但并非总是如此.

 

CentOS7启动流程:

 

# lsinitrd /boot/initramfs-3.10.0-514.el7.x86_64.img //查看虚根文件系统

其中init链接到 /usr/lib/systemd/systemd 程序

 

在内核载入完毕、进行完硬件侦测与驱动程序载入后,内核会启动第一个进程systemd, systemd 最主要的功能就是准备软件执行的环境,包括系统的主机名称、网络设定、语言设置、文件系统及其他服务的启动。 而所有的动作都会通过 systemd 的预设启动服务集合/etc/systemd/system/default.target设定。 另外, systemd 已经舍弃沿用多年的 system V 的 runlevel!

常见的操作环境 target 与兼容于 runlevel 的等级可以作为预设的操作环境 (default.target) 的主要项目有: multi-user.target 以及 graphical.target 这两个。当然还有rescue.target, emergency.target, shutdown.target 等等,以及 initrd.target!但是过去的 systemV 使用的是一个称为 runlevel (执行等级) 的概念来启动系统的,systemd 为了兼容于旧式的 systemV 操作行为, 所以也将 runlevel 与操作环境做个结合!你可以使用底下的方式来查询两者间的对应关系

 

# ll -d /usr/lib/systemd/system/runlevel*.target

# yum -y install bash-completion  //补齐参数或选项

 

# systemctl list-dependencies graphical.target  //查看启动依赖关系

# systemctl list-dependencies mutli-user.target  //查看字符界面启动依赖关系

 

sysinit.target完成的功能:

1.特殊文件系统装置的挂载:包括 dev-hugepages.mount dev-mqueue.mount 等挂载服务,主要在挂载跟巨量存储器分页使用与讯息队列的功能。 挂载成功后,会在 /dev 底下建立 /dev/hugepages/, /dev/mqueue/ 等目录;

2.特殊文件系统的启用:包括磁碟阵列、网络磁碟 (iscsi)、LVM 档案系统、档案系统对照服务 (multipath) 等等,也会在这里被侦测与使用到!

3.开机过程的讯息传递与动画执行:使用 plymouthd 服务搭配 plymouth 指令来传递动画与讯息

4.日志式登录档的使用:就是 systemd-journald 这个服务的启用啊!

5.载入额外的核心模块:透过 /etc/modules-load.d/*.conf 档案的设定,让核心额外载入管理员所需要的核心模块!

6.载入额外的核心参数设定:包括 /etc/sysctl.conf 以及 /etc/sysctl.d/*.conf 内部设定!

7.启动系统的随机数产生器:随机数产生器可以帮助系统进行一些密码加密演算的功能

8.设定终端机 (console) 字形

9.启动动态装置管理员:就是udev

 

 

basic.target完整的功能:

1.载入 alsa 音效驱动程序;

2.载入 firewalld 防火墙:CentOS 7.x 以后使用 firewalld 取代 iptables 的防火墙设定,虽然最终都是使用 iptables 的架构, 不过在设定上面差很多。

3.载入 CPU 的微指令功能;

4.启动与设定 SELinux 的安全上下文

5.将目前的开机过程所产生的开机信息写入到 /var/log/dmesg 当中

6.由 /etc/sysconfig/modules/*.modules 及 /etc/rc.modules 载入管理员指定的模块!

7.载入 systemd 的 timer 功能;

 

systemd 启动 multi-user.target 下的服务:

启动服务设定的脚本目录:

/usr/lib/systemd/system (系统预设的服务启动脚本设定)

/etc/systemd/system (管理员自己开发与设定的脚本设定)

而使用者针对主机的本机服务与服务器网络服务的各项 unit 若要 enable 的话,就是将它放到 /etc/systemd/system/multi-user.target.wants/ 这个目录底下做个链接,这样就可以在开机的时候去启动他。

 

与sys V兼容的rc.local操作:

 

# chmod +x /etc/rc.d/rc.local

# systemctl start rc-local

# systemctl enable rc-local

 

unit分类:

.service:一般服务类型(serviceunit):主要是系统服务,包括服务器本身所需要的本机服务以及网络服务

.socket:套接字(socketunit):主要是IPC(Inter-processcommunication)的传输讯息(socketfile)功能.这种类型的服务通常在监控讯息传递的套接字,当有透过此套接字传递讯息来说要连结服务时,就依据当时的状态将该用户的要求传送到对应的daemon,若daemon尚未启动,则启动该daemon后再传送用户的要求.

.target:执行环境类型(targetunit)

.mount:文件系统挂载相关的服务(automountunit/mountunit):例如来自网络的自动挂载、NFS档案系统挂载等与档案系统相关性较高的程序管理.

.path:侦测特定档案或目录类型(pathunit):某些服务需要侦测某些特定的目录来提供队列服务,例如最常见的打印服务,就是透过侦测打印队列目录来启动打印功能!

.timer:循环执行的服务(timerunit):这个东西有点类似anacrontab!不过是由systemd主动提供的,比anacrontab更加有弹性!

 

与systemd的daemon运作过程相关的目录简介:

1;/usr/lib/systemd/system/:使用CentOS官方提供的软件安装后,预设的启动脚本设定档都放在这里

2./run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比/usr/lib/systemd/system/高!

3./etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx之类的功能!执行优先序又比/run/systemd/system/高!

4./etc/sysconfig/*:几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,mandb所要更新的manpage索引中,需要加入的参数就写入到此目录下的man-db当中!而网络的设定则写在/etc/sysconfig/network-scripts/这个目录内.

5./var/lib/:一些会产生资料的服务都会将他的资料写入到/var/lib/目录中.举例来说,数据库管理系统Mariadb的数据库预设就是写入/var/lib/mysql/这个目录下!

6./run/:放置了好多daemon的暂存档,包括lockfile以及PIDfile等等.

 

systemctl项目简介:

#cat /usr/lib/systemd/system/sshd.service

.service大概能够将整个设定分为三个部份,就是:

[Unit]:unit本身的说明,以及与其他相依赖daemon的设定,包括在什么服务之后才启动此unit之类的设定值;

[Service],[Socket],[Timer],[Mount],[Path]..:不同的unittype就得要使用相对应的设定项目.我们拿的是sshd.service来当模板,所以这边就使用Service来设定.这个项目内主要在规范服务启动的脚本、环境设定档档名、重新启动的方式等等.

[Install]:这个项目就是将此unit安装到哪个target里面去的意思!

至于设定档内有些设定规则还是得要说明一下:

设定项目通常是可以重复的,例如我可以重复设定两个After在设定档中,不过,后面的设定会取代前面的!因此,如果你想要将设定值归零,可以使用类似『After=』的设定,亦即该项目的等号后面什么都没有,就将该设定归零了(reset).

如果设定参数需要有『是/否』的项目(布尔值,boolean),你可以使用1,yes,true,on代表启动,用0,no,false,off代表关闭!

空白行、开头为#或;的那一行,都代表注解!

 

Unit部分说明:

Description:服务的描述信息

Documentation:提供给管理员的一些帮助文档!提供的文件可以是如下的格式:Documentation=http://www....Documentation=man:sshd(8)Documentation=file:/etc/ssh/sshd_config

After:说明此unit是在哪个daemon启动之后才启动的意思!基本上仅是说明服务启动的顺序而已,并没有强制要求里头的服务一定要启动后此unit才能启动.以sshd.service的内容为例,该服务提到After后面有network.target以及sshd-keygen.service,但是若这两个unit没有启动而强制启动sshd.service的话,那么sshd.service应该还是能够启动的!这与Requires的设定是有差异的!

Before:与After的意义相反,是在什么服务启动前最好启动这个服务的意思.不过这仅是规范服务启动的顺序,并非强制要求的意思.

Requires:明确的定义此unit需要在哪个daemon启动后才能够启动!就是设定依赖服务啦!如果在此项设定的前面服务没有启动,那么此unit就不会被启动!

Wants:与Requires刚好相反,规定的是这个unit之后最好还要启动什么服务比较好的意思!不过,并没有明确的规定就是了!主要的目的是希望建立让使用者比较好操作的环境.因此,这个Wants后面接的服务如果没有启动,其实不会影响到这个unit本身!

Conflicts:代表冲突的服务!也就是这个项目后面接的服务如果有启动,那么我们这个unit本身就不能启动!我们unit有启动,则此项目后的服务就不能启动!

 

[Service]部分说明:

Type:说明这个daemon启动的方式,会影响到ExecStart!一般来说,有底下几种类型

simple:预设值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于存储器中.

forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务.原生的父程序在启动结束后就会终止运作.传统的unit服务大多属于这种项目,例如httpd这个WWW服务,当httpd的程序因为运作过久因此即将终结了,则systemd会再重新生出另一个子程序持续运作后,再将父程序删除.

oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在存储器中.

dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作!         因此设定这个项目时,通常也要设定BusName=才行!

idle:与simple类似,意思是,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执   行.这类的daemon通常是开机到最后才执行即可的服务!

比较重要的项目大概是 simple, forking 与 oneshot 了!毕竟很多服务需要子程序 (forking),而有更多的动作只需要在开机的时候执行一次(oneshot),例如文件系统的检查与挂载啊等等的。

 

EnvironmentFile:可以指定启动脚本的shell环境!例如 sshd.service 的设定档写入到 /etc/sysconfig/sshd 当中!你也可以使用 Environment= 后面接多个不同的 Shell 变量来给予设定!

 

ExecStart:就是实际执行此 daemon 的指令或脚本程序。你也可以使用 ExecStartPre (之前) 以及 ExecStartPost (之后) 两个设定项目来在实际启动服务前,进行额外的指令行为。 但需要特别注意的是,指令串仅接受『指令 参数 参数...』的格式,不能接受 <, >, >>, |, & 等特殊字符,很多的 bash 语法也不支援喔! 所以,要使用这些特殊的字符时,最好直接写入到指令脚本里面去!不过,上述的语法也不是完全不能用,亦即,若要支援比较完整的 bash 语法,那你得要使用 Type=oneshot 才行喔! 其他的 Type 才不支持这些字符。

 

ExecStop:与 systemctl stop 的执行有关,关闭此服务时所进行的指令。

 

Restart:当设定 Restart=1 时,则当此 daemon 服务终止后,会再次的启动此服务。举例来说,如果你在 tty2 使用文字界面登入,操作完毕后登出,基本上,这个时候 tty2 就已经结束服务了。 但是你会看到荧幕又立刻产生一个新的 tty2 的登入画面等待你的登入!那就是 Restart 的功能!除非使用 systemctl 强制将此服务关闭,否则这个服务会源源不绝的一直重复产生!

 

RemainAfterExit:当设定为 RemainAfterExit=1 时,则当这个 daemon 所属的所有程序都终止之后,此服务会再尝试启动。这对于 Type=oneshot 的服务很有帮助!

 

TimeoutSec:若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利『正常启动或正常结束』的情况下,则我们要等多久才进入『强制结束』的状态!

 

KillMode:可以是 process, control-group, none 的其中一种,如果是 process 则 daemon 终止时,只会终止主要的程序 (ExecStart 接的后面那串指令),如果是 control-group 时, 则由此 daemon 所产生的其他 control-group 的程序,也都会被关闭。如果是 none 的话,则没有程序会被关闭喔!

 

RestartSec:与 Restart 有点相关性,如果这个服务被关闭,然后需要重新启动时,大概要 sleep 多少时间再重新启动的意思。预设是 100ms (毫秒)。

 

 

Install部分说明:

WantedBy:这个设定后面接的大部分是 *.target unit !意思是,这个 unit 本身是附挂在哪一个 target unit 底下的!一般来说,大多的服务性质的 unit 都是附挂在 multi-user.target 底下!

 

Also:当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable 的意思!也就是具有相依性的服务可以写在这里呢!

 

Alias:进行一个连结的别名的意思!当 systemctl enable 相关的服务时,则此服务会进行连结档的建立!以 multi-user.target 为例,这个家伙是用来作为预设操作环境 default.target 的规划, 因此当你设定用成 default.target 时,这个 /etc/systemd/system/default.target 就会链接到 /usr/lib/systemd/system/multi-user.target !

 

 

systemctl命令详细使用说明:

 

1.首先检查你的系统中是否安装有systemd并确定当前安装的版本

 

#systemd--version

 

2.检查systemd和systemctl的二进制文件和库文件的安装位置

 

# whereis systemd

# whereis systemctl

 

3.检查systemd是否运行

 

# ps-eaf | grepsystemd

注意:systemd是作为父进程(PID=1)运行的.在上面带(-e)参数的ps命令输出中,选择所有进程,(-a)选择除会话前导外的所有进程,并使用(-f)参数输出完整格式列表(即-eaf).

 

4.分析systemd启动进程

 

# systemd-analyze

 

5.分析启动时各个进程花费的时间

 

# systemd-analyze blame

 

6.分析启动时的关键链

 

# systemd-analyze critical-chain

 

7.列出所有可用单元

 

# systemctl list-unit-files

 

8.列出所有运行中单元

 

# systemctl list-units

 

9.列出所有失败单元

 

# systemctl --failed

 

10.检查某个单元(如cron.service)是否开机自启

 

#systemctl is-enabled crond.service

 

11.检查某个单元或服务是否运行

 

# systemctl status firewalld.service

 

 

使用Systemctl控制并管理服务

 

 

12.列出所有服务(包括启用的和禁用的)

 

#systemctl list-unit-files --type=service

 

13.Linux中如何启动、重启、停止、重载服务以及检查服务(如httpd.service)状态

 

#systemctl start httpd.service

#systemctl restart httpd.service

#systemctl stop httpd.service

#systemctl reload httpd.service

#systemctl status httpd.service

 

注意:当我们使用systemctl的start,restart,stop和reload命令时,我们不会从终端获取到任何输出内容,只有status命令可以打印输出.

 

 

14.如何激活服务并在启动时启用或禁用服务(即系统启动时自动启动服务)

 

# systemctl is-active httpd.service

# systemctl enable httpd.service

# systemctl disable httpd.service

 

 

15.如何屏蔽(让它不能启动)或显示服务(如httpd.service)

 

#systemctl mask httpd.service

 

#systemctl unmask httpd.service

 

 

16.使用systemctl命令杀死服务

 

# systemctl kill httpd

# systemctl statu shttpd

 

使用Systemctl控制并管理挂载点

 

 

 

17.列出所有系统挂载点

 

#systemctl list-unit-files --type=mount

 

18.挂载、卸载、重新挂载、重载系统挂载点并检查系统中挂载点状态

 

#systemctl start tmp.mount

#systemctl stop tmp.mount

#systemctl restart tmp.mount

#systemctl reload tmp.mount

#systemctl status tmp.mount

 

19.在启动时激活、启用或禁用挂载点(系统启动时自动挂载)

 

#systemctl is-active tmp.mount

#systemctl enable tmp.mount

#systemctl disable tmp.mount

 

 

20.在Linux中屏蔽(让它不能启用)或可见挂载点

 

# systemctl mask tmp.mount

#s ystemctl unmask tmp.mount

 

使用Systemctl控制并管理套接口

 

21.列出所有可用系统套接口

 

#systemctl list-unit-files --type=socket

 

22.在Linux中启动、重启、停止、重载套接口并检查其状态

 

#systemctl start cups.socket

#systemctl restart cups.socket

#systemctl stop cups.socket

#systemctl reload cups.socket

#systemctl status cups.socket

 

23.在启动时激活套接口,并启用或禁用它(系统启动时自启动)

 

#systemctl is-active cups.socket

#systemctl enable cups.socket

#systemctl disable cups.socket

 

 

24.屏蔽(使它不能启动)或显示套接口

 

#systemctl mask cups.socket

#systemctl unmask cups.socket

 

 

 

服务的CPU利用率(分配额)

 

 

25.获取当前某个服务的CPU分配额(如httpd)

 

# systemctl show -p CPUShares httpd.service

 

注意:各个服务的默认CPU分配份额=1024,你可以增加/减少某个进程的CPU分配份额.

 

 

 

26.将某个服务(httpd.service)的CPU分配份额限制为2000CPUShares/

 

#systemctl set-property httpd.service CPUShares=2000

#systemctl show -p CPUShares httpd.service

CPUShares=2000

注意:当你为某个服务设置CPUShares,会自动创建一个以服务名命名的目录(如httpd.service),里面包含了一个名为90-CPUShares.conf的文件,该文件含有CPUShare限制信息,你可以通过以下方式查看该文件:

 

# vim /etc/systemd/system/httpd.service.d/50-CPUShares.conf

[Service]

CPUShares=2000

 

 

27.检查某个服务的所有配置细节

 

#systemctl show httpd

 

 

28.分析某个服务(httpd)的关键链

 

#systemd-analyze critical-chain httpd.service

 

29.获取某个服务(httpd)的依赖性列表

 

#systemctl list-dependencies httpd.service

 

 

30.按等级列出控制组

 

# systemd-cgls

 

31.按CPU、内存、输入和输出列出控制组

 

# systemd-cgtop

 

控制系统运行等级

 

32.启动系统救援模式

 

#systemctl rescue

 

 

33.进入紧急模式

 

# systemctl emergency

 

 

34.列出当前使用的运行等级

 

# systemctl get-default

 

 

35.启动运行等级5,即图形模式

 

#systemctl isolate runlevel5.target

#systemctl isolate graphical.target

 

 

36.启动运行等级3,即多用户模式(命令行)

 

#systemctl isolate runlevel3.target

#systemctl isolate multiuser.target

 

 

36.设置多用户模式或图形模式为默认运行等级

 

#systemctl set-default runlevel3.target

#systemctl set-default runlevel5.target

 

 

37.重启、停止、挂起、休眠系统或使系统进入混合睡眠

 

#systemctl reboot

#systemctl halt

[展开全文]
Linux内核与内核模块:
内核:/boot/vmlinuz-version
initramfs:/boot/initramfs-kernel_version
内核模块:/lib/modules/kernel_version/kernel
内核源码:/usr/src/kernels/kernel_version
内核版本:/proc/version
系统内核功能:/proc/sys/kernel
 
Linux关于内核的命令:
# lsmod:查看系统中加载的内核模块
结果解释:
第一列:module:模块的名称
第二列:size:模块的大小
第三列:userd by:此模块是否被其他模式使用(依赖关系)
 
# depmod:更新模块的依赖关系并创建依赖关系文件
  /lib/modules/kernel_version/modules.dep:解决linux模块依赖关系的文件
      -A:查找比/lib/modules/kernel_version/modules.dep新的模块,如果有,才会更新,并写入改文件
      -n:不写入依赖关系文件,直接输出到屏幕上
      -e:显示当前已经加载的但不可执行的模块名称
 
# modinfo:查看模块的信息
   modinfo modules_name
 
# insmod:加载模块
   insmod 模块绝对路径
   如:# insmod /lib/modules/2.6.32-642.el6.x86_64/kernel/fs/cifs/cifs.ko
 
# rmmod:删除模块
   rmmod 模块名称
 
# modprobe:加载删除模块(不需要模块的完整路径)
   -c:列出目前系统中的所有的模块
   -l:列出/lib/modules/2.6.32-642.el6.x86_64/kernel当中所有模块的完整文件名
   -f:强制加载
   -r:删除某个模块,类似于rmmod
 
        Linux内核模块额外的参数设置目录:/etc/modprobe.d/
        Linux启动时所用的重要的目录:/etc/sysconfig
 
 
 
 
 
init:
init:系统中第一个进程,PID是1,配置文件/etc/inittab
   Sys V:init CentOS5:把所有的功能都集成到一个文件中/etc/inittab,启动速度非常慢
   Upstart:CentOS6:采用事件驱动(event driven),把功能并行执行
 
Upstart 相关概念和术语:
Upstart 的基本概念和设计清晰明确。
UpStart 主要的概念是 job 和 event。
 
工作 Job 就是一个工作单元,用来完成一件工作,比如启动一个后台服务,或者运行一个配置命令。每个 Job 都等待一个或多个事件,一旦事件发生,upstart 就触发该 job 完成相应的工作。
Job 就是一个工作的单元,一个任务或者一个服务。可以理解为 sysvinit 中的一个服务脚本。有三种类型的工作:
task job:代表在一定时间内会执行完毕的任务,比如删除一个文件
service job:代表后台服务进程,比如 apache httpd。这里进程一般不会退出,一旦开始运行就成为一个后台精灵进程,由 init 进程管理,如果这类进程退出,由 init 进程重新启动,它们只能由 init 进程发送信号停止。它们的停止一般也是由于所依赖的停止事件而触发的,不过 upstart 也提供命令行工具,让管理人员手动停止某个服务;
Abstract job:仅由 upstart 内部使用,仅对理解 upstart 内部机理有所帮助。我们不用关心它。
 
除了以上的分类之外,还有另一种工作(Job)分类方法。Upstart 不仅可以用来为整个系统的初始化服务,也可以为每个用户会话(session)的初始化服务。系统的初始化任务就叫做 system job,比如挂载文件系统的任务就是一个 system job;用户会话的初始化服务就叫做 session job。
 
Job 生命周期:Upstart 为每个工作都维护一个生命周期。一般来说,工作有开始、运行和结束这几种状态。为了更精细地描述工作的变化,Upstart 还引入了一些其它的状态。比如开始就有开始之前(pre-start),即将开始(starting)和已经开始了(started)种不同的状态,这样可以更加精确地描述工作的当前状态。
工作从某种初始状态开始,逐渐变化,或许要经历其它几种不同的状态,最终进入另外一种状态,形成一个状态机。在这个过程中,当工作的状态即将发生变化的时候,init 进程会发出相应的事件(event)。
 
Upstart 中 Job 的可能状态
Waiting:初始状态
Starting:Job 即将开始
pre-start:执行 pre-start 段,即任务开始前应该完成的工作
Spawned:准备执行 script 或者 exec 段
post-start:执行 post-start 动作
Running:interim state set after post-start section processed denoting job is running (But it may have no associated PID!)
pre-stop:执行 pre-stop 段
Stopping:interim state set after pre-stop section processed
Killed:任务即将被停止
post-stop:执行 post-stop 段
 
 
事件 Event
顾名思义,Event 就是一个事件。事件在 upstart 中以通知消息的形式具体存在。一旦某个事件发生了,Upstart 就向整个系统发送一个消息。没有任何手段阻止事件消息被 upstart 的其它部分知晓,也就是说,事件一旦发生,整个 upstart 系统中所有工作和其它的事件都会得到通知。
 
Event 可以分为三类: signal,methods 或者 hooks。
Signal 事件是非阻塞的,异步的。发送一个信号之后控制权立即返回。
Methods 事件是阻塞的,同步的。
Hooks 事件是阻塞的,同步的。它介于 Signals 和 Methods 之间,调用发出 Hooks 事件的进程必须等待事件完成才可以得到控制权,但不检查事件是否成功。
事件是个非常抽象的概念,下面我罗列出一些常见的事件,希望可以帮助您进一步了解事件的含义:
系统上电启动,init 进程会发送"start"事件
根文件系统可写时,相应 job 会发送文件系统就绪的事件
一个块设备被发现并初始化完成,发送相应的事件
某个文件系统被挂载,发送相应的事件
类似 atd 和 cron,可以在某个时间点,或者周期的时间点发送事件
另外一个 job 开始或结束时,发送相应的事件
一个磁盘文件被修改时,可以发出相应的事件
一个网络设备被发现时,可以发出相应的事件
缺省路由被添加或删除时,可以发出相应的事件
 
 
CentOS6上Upstart大致的一个启动过程:
1.内核启动init,读取配置文件/etc/inittab,在CentOS6只定义了运行级别
2.系统初始化:(/etc/init/rcS.conf exec /etc/rc.d/rc.sysinit)
3.init找到/etc/inittab文件,确定默认的运行级别(X) (/etc/init/rcS.conf exec telinit $runlevel)
4.触发相应的runlevel事件(/etc/init/rc.conf exec /etc/rc.d/rc $RUNLEVEL)
5.开始运行/etc/rc.d/rc,传入参数X
6./etc/rc.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本
7./etc/rcX.d/中的脚本按事先设定的优先级依次启动
8.最后执行/etc/rc.d/rc.local
9.加载终端或X-Window接口
 
 
/etc/init:目录定义了系统初始化的配置文件
/proc/cmdline:系统内核设置的参数
/etc/rc.d/rc.sysinit:系统初始化主要配置文件
 
/etc/rc.d/rc.sysinit 这个文件做了哪些工作:
1、获得网络环境
2、挂载设备
3、开机启动画面Plymouth(取替了过往的 RHGB)
4、判断是否启用SELinux
5、显示于开机过程中的欢迎画面
6、初始化硬件
7、用户自定义模块的加载
8、配置内核的参数
9、设置主机名
10、同步存储器
11、设备映射器及相关的初始化
12、初始化软件磁盘阵列(RAID)
13、初始化 LVM 的文件系统功能
14、检验磁盘文件系统(fsck)
15、磁盘配额(quota)
16、重新以可读写模式挂载系统磁盘
17、更新quota(非必要)
18、启动系统虚拟随机数生成器
19、配置机器(非必要)
20、清除开机过程当中的临时文件
21、创建ICE目录
22、启动交换分区(swap)
23、将开机信息写入/var/log/dmesg文件中   
 
 
/etc/init/rc.conf:sysv运行级别
/etc/rc.d/存放每个运行级别所需要的服务,比如/etc/rc.d/rc3.d/目录定义的运行级别3所学药的服务   
   命名:  K+数字+服务名
          S+数字+服务器
          K:kill结束服务
          S:start开启服务
          数字:代表启动结束的优先级,数字越小优先级越高  
/etc/rc.d/rc.local:系统启动加载的最后一个脚本(用户的脚本)
 
 
sysv init:chkconfig:定义系统服务在每个级别的运行状态
     --list:查看系统中所有服务的状态
     chkconfig --level 2345 httpd on
     chkconfig --level 2345 httpd off    
 
服务分类:
    独立服务:应用程序自己控制
    超级服务:依赖于xinetd进程来管理
控制服务:
  service service_name  start|stop|restart|reload|status
  start:启动服务
  stop:停止服务
  restart:重新启动
  reload:重新加载服务
  status:查看服务状态
 
upstart:
  initctl start|stop|restart|reload|status service_name
[展开全文]

GRUB分阶段启动:

  stage1:第一个阶段,位于BootLoader,为了引导第二阶段

  stage1_5:识别文件系统

  stage2:加载启动设置等等,读取配置文件/boot/grub/grub.conf

 

GRUB修复:

    有两种模式:1、重启后自动进入GRUP命令模式,可以输入grub.conf的文件内容来修复;2、光盘启动,进入救援模式

        1、重启后自动进入GRUP命令模式,可以输入grub.conf的文件内容来修复:

        2、光盘启动,进入救援模式,输入以下命令:

          # chroot /mnt/sysimage

          # grub-install --root-directory=/ /dev/sda    (/:grub目录的父目录;/dev/sda:指定的第一块磁盘)

          # grub  命令

          grub> root (hd0,0)

          grub> setup (hd0)

          grub> quit

          # 在grub目录下建立新的conf文件

          # exit

          # reboot

 

 

为GRUB启动菜单添加密码:

  # grub-crypt --sha-512    //生成加密密码

  # vim /boot/grub/grub.conf,在hiddenmenu添加一行

   password --encryped 生成的密文

为系统添加启动密码:

  # grub-crypt --sha-512    //生成加密密码

  # vim /boot/grub/grub.conf,在title中添加一行

    password --encryped 生成的密文(encryped 改为相应的加密算法名称)

[展开全文]

进程管理:kernel+process  

 

CPU:ring0:内核空间  ring1-2:库文件等 ring3:用户空间

CPU读取的数据都来自内存

内存:内核空间和用户空间

RAM:易失性存储器

ROM:只读存储器,存储硬件信息等

 

启动过程:

--POST(加电自检:PowerOnSelfTest)

--BIOS(基本输入输出系统:Basic Input Output System:硬件信息;Boot sequence:启动顺序)

--MBR(主引导记录;446字节bootloader)

--启动菜单(Linux启动菜单:GRUB)

--kernel

--initramfs(虚拟根文件系统,CentOS6),相当于加载到7C00的那一段代码,把/proc /sys /dev目录复制到根文件系统

initrd:CentOS5

--/sbin/init

 

 

kernel作用:驱动和检测系统外围硬件或程序

文件系统

安全管理

网络管理

进程管理

驱动程序

 

内核设计:

      单内核:把所有的功能都集成到内核中去

            Linux使用单内核,但是采用模块化设计(/lib   /lib64)

             /lib/modules/'内核版本号为名称的目录'/kernel,其中modules.dep解决系统中依赖关系

               arch:平台架构相关

               crypto:安全加密

               drivers:驱动程序

               fs:文件系统

               kernel:内核

               lib:内核库 .ko.xz(kernel object)

               mm:内存管理 

               net:系统中的TCP/IP协议栈

               sound:声卡

      微内核:把每个功能都做成小模块(Windows solaris)

 

 

Linux运行级别:0-6

    0:halt关机 

    1:单用户模式(root, 无须登录), single, 维护模式;

    2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;

    3:多用户模式,正常模式;文本界面; CLI:command line interface

    4:预留级别;

    5:多用户模式,正常模式;图形界面; GUI:graphical user interface

    6:重启

 

 

chroot:改变根目录

ldd:查看二进制文件所依赖的库文件

[展开全文]

文件查找命令: which locate find

  which:查找命令字所在的位置

  locate:模糊匹配(只要包含关键字的文件都查找出来)

             不是实时的,基于数据库查找, updatedb升级locate数据库

             查找速度特别快

 

  find:查看文件或目录的工具

          特点:  实时查找

                      精确查找

                      遍历整个指定目录中的文件,速度很慢

                      支持多种查找条件(属主,属组,权限,文件名等)

    

        语法: find [find_path] [条件] [处理动作]

                   find_path:如果不写,默认在当前工作目录查找

                   条件:如果不写,会查找出该路径下所有的文件

                   处理动作:默认打印到屏幕上 print

 

        条件:(匹配标准)

           -name file_name:根据文件名进行查找,区分大小写

                    查找条件通配符:

                       *:通配任意个数的任意字符   # find /etc/ -name "pass*"  # find /etc/ -name "*pass"

                        ?:通配单个的任意字符       # find /etc/ -name "passw*"

           -iname file_name:根据文件名进行查找,不区分大小写

           -regex PATTERN:根据正则表达式的模式进行查找

           -user:通过属主进行查找

           -group:通过属组进程查找

           -uid UID:通过UID号进行查找

           -gid GID:通过GID号进行查找

           -nouser:查找没有属主的文件

           -nogroup:查找没有属组的文件

           -type:根据文件类型进行查找

                 -b:块设备

                 -c:字符设备

                 -d:目录

                 -f:文件

                 -p:命名管道

                 -s:套接字文件

                 -l:链接文件

           -size [+ | -] num [k|m|g]

                 -size 5k:精确匹配

                 +:大于

                 -:小于

 

        根据时间戳进行查找: # stat file_name  //查看文件的时间戳

            [+ | -] 也起作用

            -atime:时间单位为天,access时间

            -mtime:时间单位为天,modify时间

            -ctime:时间单位为天,change时间

            -mmin:时间单位为分钟,modify时间

            -amin:时间单位为分钟,access时间

            -cmin:时间单位为分钟,change时间

 

        根据权限查找:

         -perm MODE:

               MODE:num(如644),精确匹配

               /MODE:/num任意一位匹配

               -MODE:-num文件权限能够完全包含此MODE时才能匹配

 

       条件组合:

             -a:同时满足多个条件,比如查找属主是tom并且权限为644的文件

             -o:满足一个条件即可,比如查找属主是tom或者权限为644的文件

             -not:不满足条件的被查找出来

 

       出来动作:

         -print:默认动作,默认查找结果打印到屏幕

         -ls:默认以类似于ls -l的形式显示结果的信息

         -ok COMMAND {} \;执行动作时提示用户是否执行,必须以\;结尾,{}代表文件名占位符

         -exec COMMAND {} \;执行动作时不提示用户直接执行,必须以\;结尾,{}代表文件名占位符

 

 

  

 

 

 

 

1、查找/var目录下属主为root并且属组为mail的所有文件;

find /var -user root -a -group mail

 

2、查找/usr目录下不属于root,bin,或student的文件;

find /usr -not -user root -a -not -user bin -a -not -user student

find /usr -not \( -user root -o -user bin -o -user student \)

 

3、查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;

find /etc -mtime -7 -not \ ( -user root -o -user student \)

find /etc -mtime -7 -not -user root -a -not -user student

 

4、查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;

find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;

 

5、查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;

find /etc -size +1M >> /tmp/etc.largefiles

 

6、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;

find /etc -not -perm /222 -ls    

 

 

[展开全文]

任务计划:调度性的任务

        分为:

                一次性任务计划:at、batch

                周期性任务计划:cron、anacron

 

一次性任务计划:

          一、at命令

          1、at:设置系统在某一个时间点执行的任务,执行结果以邮件的方式发送给任务发起者

              依赖atd服务,所以需要:

              # systemctl start atd

              # systemctl enable atd

              # systemctl status atd

 

          2、语法:

                  # at data_time

                  at>at_command1   //输入需要执行的命令

                  at>at_command2

                  at>ctrl+d 保存退出

 

                  data_time:时间日期写法

                            绝对时间:

                                  HH:MM:具体时间点

                                  DD.MM.YY:天.月.年

                                  YY-MM-DD:年-月-日

                                  MM/DD/YY:月/日/年

                                  HH:MM YY-MM-DD:

                            相对时间:

                                  at now+3minutes:从任务计划创建开始计时,3分钟以后执行

  

         3、与at命令相关的文件:

                 Linux中设置at任务后,会在/var/spool/at/目录生成at任务计划的文件,按照文件名的排序顺序执行

                权限:

                /etc/at.allow:at任务计划的白名单,仅允许此文件中的用户执行at

                /etc/at.deny:at任务计划的黑名单,仅拒绝次文件中的用户执行at

                系统先查找/etc/at.allow,再去查找/etc/at.deny,如果两个文件都没有,可以执行

 

         4、at命令:设置at任务计划

              -l:查看系统中at任务列表,相当于atq

              -r:删除系统中的at任务列表,相当于atrm

              -d:删除系统中的at任务列表,相当于atrm

              -c:列出后续at任务的具体指令内容

 

 

        二、batch

         1、batch:用法和at相同,不过batch任务计划是在CPU空闲时执行(当CPU的平均负载小于0.8时,uptime:查看CPU的平均负载)

                依赖batchd服务,所以需要:

              # systemctl start batchd

              # systemctl enable batchd

              # systemctl status batchd

 

          2、语法:

            # batch data_time

             batch>batch_command1

             batch>batch_command2

             batch>ctrl+d 保存退出

  

              data_time:时间日期写法:

                绝对时间:

                      HH:MM:具体时间点

                      DD.MM.YY:天.月.年

                      YY-MM-DD:年-月-日

                      MM/DD/YY:月/日/年

                      HH:MM YY-MM-DD:

                相对时间:

                      at now+3minutes:从任务计划创建开始计时,3分钟以后执行

 

 

 

周期性任务计划:

  系统周期性任务:

        日志轮换:logrotate

        登录文件分析:logwatch任务

        创建locate数据库:updatedb

        创建man帮助信息数据库:CentOS6:makewathis  CentOS7:mandb

        RPM软件登录文件的创建

        与网络相关的分析行为:

  

  用户周期性任务:

      cron:设置周期任务计划

      anacron:当cron周期性任务由于某种原因没有执行,anacron重新执行cron任务

 

    一、cron

    1、cron:

             依赖crond服务,所以需要:

              # systemctl startcrond

              # systemctl enablecrond

              # systemctl statuscrond

 

    2、相关文件:

            权限控制文件:

                /etc/cron.allow和/etc/cron.deny

                /etc/cron.allow:白名单

                /etc/cron.deny:黑名单,默认情况下系统只保留/etc/cron.deny

 

           cron相关的配置文件:

              /etc/crontab:cron配置文件

              /etc/cron.d/:cron辅助配置文件目录

              /var/spool/cron/:cron任务计划的配置文件目录,用户设置完cron任务后,会生成以用户名名称的cron文件

 

            /etc/crontab文件解析:

                   SHELL=/bin/bash:cron任务计划执行使用的shell程序

                   PATH=/sbin:/bin:/usr/sbin:/usr/bin:cron任务计划命令搜索地址

                   MAILTO=root:cron任务计划执行结果发送给哪个用户

 

            /etc/daily/   /etc/hourly/   /etc/monthly/   /etc/weekly/,这些目录下存放了固定的周期性任务

            cron.hourly:cron工具去执行

            cron.daily,cron.weekly cron.monthly是由anacron工具去执行

 

    3、操作:

        crontab:设置/查看/删除等cron任务计划,执行结果以邮件方式发送给任务发起者

              -e:会通过文本格式建立,在文本中编辑cron任务内容,语法见下文

              -u:为指定用户设置cron任务计划(只有root用户能够使用)

              -l:查看cron任务列表

              -r:删除所有的cron列表

 

        设置任务语法:

          系统设置:

              分 时 日 月 周 用户 命令

          用户设置:

              分 时 日 月 周 命令

 

        时间取值范围:

              分钟:0-59

              小时:0-23

              日期:1-31

              月份:1-12或jan,feb,mar,apr ...

              周:0-7或sun,mon,tue,wed,thu,fri,sat,其中0和7都代表周日

        时间的特殊写法:

              通配:*代表任意时间  10 17 * * * cat /etc/fstab

              离散时间段:,(逗号)  5,15,30,45,56 17 * * * cat /etc/fstab

              连续时间段:-(中横线) 00 23 * * 1-5 cat /etc/fstab

              间隔时间段:*/n    */5 * * * * cat /etc/fstab    00 10 */5 * * cat /etc/fstab(分不能通配)

 

 

    4、cron设置任务计划时注意事项:

         CPU和内存资源集中使用时的问题:  

            # vim /etc/crontab

                  1,6,11,16,21,26,31,36,41,46,51,56 * * * * root COMMAND1

            取消一些不必要的输出:设置命令时可以重定向输出

            时间的检验:设置时间时,周与日月不可并存

            安全的检验:通过/var/log/cron的内容查看cron任务计划中是否有非法任务

            环境变量:系统命令查找和cron任务命令位置由$PATH变量决定,设置cron任务时,使用命令的绝对路径

 

 

    二、anacron

    1、anacron:当cron周期性任务由于某种原因(如关机)没有执行,anacron重新执行cron任务

 

    2、语法:

          anacron [options] [job]

               -s:依据时间记录文件去判断是否执行

               -f:强制执行

               -n:立刻运行未执行的任务,不需要延时

 

    3、anacron执行流程:

        1:由/etc/anacrontab分析到cron.daily天数为1天

        2:由/var/spool/anacron/cron.daily取出最近一次执行anacron时间戳

        3:由2步骤分析出的时间戳和cron任务进行比较,查看哪些cron任务超过1天时间没有执行

        4:准备执行指令,根据/etc/anacrontab的设置,将延时执行

        5:延时时间过后,执行指令

[展开全文]

进程管理命令:ps top pstree pgrep pidof kill killall bg fg jobs

    ps:process status:进程状态查看,运行ps那个时刻系统进程状态;BSD风格(不使用连字符),sys V风格(使用连字符),GNU长选项(使用两个连字符)

          a:显示和终端有关的进程

          u:显示进程用户的信息

          x:显示和终端无关的进程

          -e:显示所有进程信息

          -l:显示进程长格式

          -F:显示进程的完整信息

 

    ps aux:结果解析

              USER:该进程是有哪个用户发起的

              PPID:父进程号

              PID:进程号 /proc目录存放着进程相关的信息 在CentOS7:PID为1的进程是systemd 在CentOS6                 中PID为1的进程是init进程,PID为1的进程是系统中所有进程的父进程

              %CPU:该进程占用的CPU百分比

              %MEM:该进程占用内存的百分比

              VSZ:虚拟内存集(计算进程所占物理内存时,物理内存包括共享库的空间)

              RSS:常驻内存集(进程中不能被交换出去的数据)

              TTY:运行在哪个终端

              STAT:进程状态

                      D:不可中断睡眠状态

                      S:可中断睡眠状态

                      R:运行状态

                      T:停止状态

                      Z:僵尸状态

                      s:session leader:会话的领导者

                      <:优先级较高的进程(用户不可控)

                      N:优先级较低的进程(用户可控进程)

                      l:多线程进程

                      L:在内存中锁定分页

                      +:前台进程组中的进程

              START:进程启动时间

              TIME:该进程在CPU中实际运行的时长

              COMMAND:该进程命令名称

 

    ps -elF:结果解析

              PRI:系统分配的优先级(用户不可更改)

              NI:nice值,nice值的修改会影响pri的值,他们的总和不变

 

   调整进程的nice值:调整正在运行进程的nice

            renice [nice_num] PID

  指定进程运行的nice值(让某个命令以指定nice运行)

            nice -n [nice_num] COMMAND

 

 

    top:动态查看进程状态,每隔3秒刷新一次进程状态信息

           top结果解析:

                   第一行:当前系统时间 系统运行时长 登录系统的用户个数 过去1分钟,5分钟,15分钟平均负载

                   第二行:进程总数 正在运行的进程数 睡眠的进程数 停止状态进程数 僵尸状态进程数

                   第三行(按1键可以查看每个CPU的信息):CPU相关信息: us:用户进程所占CPU百分比 sy:系统进程所占CPU百分比 ni:nice所占CPU百分比 id:空闲进程所占CPU百分比 hi:硬件中断所占CPU百分比 si:软件中断所占CPU百分比 st:被hypervisor偷走的CPU的百分比

                   第四行:物理内存相关信息

                   第五行:交换分区相关信息

 

            top交互式命令:

                   M:按所占内存百分比进行排序

                   P:按所占CPU备份比进行排序

                   T:按进程运行时长进行排序

                   c:是否显示COMMAND列完整路径

                   l:是否显示top第一行

                   t:是否显示top中第二行和第三行

                   m:是否显示内存的相关信息

                   k:杀死某个进程

                   q:退出top进程

 

pstree:查看进程树(查看父子进程关系)

 

pgrep:查看某个进程PID号 pgrep process_name

 

pidof:查看某个进程PID号 pidof process_name

 

kill:杀死某个进程(向进程传递某个信号)

   -l:查看信号列表:

           1:SIGHUP:不停止服务的情况下,重新读取配置文件,并且应用配置文件中的设置

           2:SIGINT:Ctrl+c 中断某个进程

           9:SIGKILL:强制杀死某个进程

           15:SIGTERM:终止某个进程(默认信号),相当于会有预警

    kill语法:

            kill -sig_num PID

            kill -sig_name PID

            kill %num:杀死后台的某个作业,%不能省略,num为使用jobs命令查看时的序号

 

    信号:进程间的通信(IPC)

            内存共享等

 

killall:杀死整个进程树,用法同kill

 

 

bg:把进程调入后台继续运行

fg:把后台的进程调入前台运行

    fg num:将后台序号为num的进程调入前台

jobs:查看后台运行的作业

   +:下一次将要运行的后台作业

 

前台-->后台:

   ctrl+z:把正在运行的进程调入后台,并停止运行

   &:启动时直接调入后台运行,末尾加上该符号

[展开全文]

进程的概念: 

    可以定义为:可并发执行的程序在一个数据集合上的运行过程。进程可以申请和拥有系统资源。传统操作系统中,进程是一个可以独立调度的基本单位(现代操作系统中为线程)。进程是一个动态的概念,它是“活的”,它有产生、运行、消亡的过程。进程与程序不是等同概念,程序是一个静态的概念,是指令和数据的集合,作为一种文件可长期存放在存储介质中。

 

进程的相关概念:父子关系 进程状态 优先级

    1、进程状态:

                task_uninterruptible:不可中断睡眠 mkdir:系统调用,硬件:I/O 1ms

                task_interruptible:可中断睡眠

                stopped:停止状态(不能被调入CPU运行)

                zombie:僵尸状态(结束父进程才能够退出当前进程的僵尸状态):进程运行完成后没有释放CPU和内存资源

    2、进程优先级:

                0-139数字,共140个优先级,数字越小,优先级越高

                0-99:系统分配优先级(用户不可控优先级)

                100-139:nice值 (用户可控优先级);-20到19;root用户可以任意调整nice值;普通用户只能调整0-19


高优先级进程:获取更多的CPU运行时长,更优先的让CPU执行

 

进程的特性:

    动态性

    并发性

    独立性

    异步性

 

CPU分环运行:

    0环:特权环,运行内核

    1-2环:库文件

    3环:进程环

 

task struct:进程的数据结构(存放在内存的内核空间中),相当于进程控制块

task struct结构:状态 进程信息和内核栈 运行列表(指令等) MM(内存管理):memory mangement PID:进程ID号 群组信息 用户信息 文件系统 文件描述符等,同时也维护页表寄存器

 

进程内存结构:

    forbidden:内核空间

    program text:指令

    data+bss:全局变量

    heap:堆空间,进程运行时调用的数据等

    shared library:共享库

    stack:栈空间,局部变量

 

 

 

线程的概念:

    现代操作系统中,将传统的进程分离,即将资源申请和调度分开,进程作为资源的申请和拥有的单位,而进程作为调度的基本单位。thread:线程,轻量级进程

 

线程与进程的比较:

    调度

    并发性

    拥有资源

    系统开销

 

lock:死锁 自旋锁等

    由于临界区的存在导致了该概念的产生,临界区使用原则:忙则等待、有限等待、空闲让进、让权等待

 

[展开全文]

编译安装: RPM YUM

 

RPM,一键安装,方便,二进制程序,但存在一下问题:

    1:功能不齐全,功能冗余

    2:版本滞后

因此我们需要自己定制软件包:源代码编译为安装应用程序

 

编译环境:

    gcc:GNU C Complier

    gcc-c++:

    安装编译环境: # yum -y groupinstall "Development Tools"

    

    automake:生成Makefile.in(半成品)文件

    

    autoconf:生成脚本文件configure,在源代码目录中

    

    make:最终使用make进行编译,但其本身并不是编译器,是项目管理工具,按照Makefile文件中的定义的顺序去编译。

 

 

执行编译安装步骤:

    1:获取源代码并解压:

      # tar xf xxx.tar.gz

      # tar xf xxx.tar.bz2

 

    2:执行configure脚本(在源码目录中运行),及错误处理

      功能:1:检查应用程序所需要的编译环境 2:生成Makefile 3:定制应用程序功能

      选项:--help:查看该脚本帮助信息

      --prefix=PATH:定义应用程序安装路径

      --sbin-path=PATH:定义应用程序的二进制程序路径

      --conf-path=PATH:定义应用程序配置文件路径

      --enable--XXXX:开启某项功能(如应用程序支持该功能,但默认不安装)

      --disable--XXX:关闭某项功能(如应用程序支持该功能,默认安装,但是用户不需要)

      --with--XXX:开启某项功能(如应用程序支持该功能,但默认不安装)

      --without--XXX:关闭某项功能(如应用程序支持该功能,默认安装,但是用户不需要)

      --user=USER:指定应用程序执行的用户

      --group=GROUP:执行应用程序执行的组

 

        解决configure错误信息

          1:用without关闭这项功能

          2:安装所需的环境,安装所需环境的devel包

 

    3:make:按照Makefile文件定义的顺序去编译源程序

          -j N:多个线程一起编译

 

    4:make install:安装应用程序

 

 

编译安装完成后工作:

       1、添加应用程序的二进制程序到系统路径: 系统查找 $PATH

  1.1:为二进制程序做链接文件,如:  缺点:占用inode值

     # ln -s /usr/local/tengine/sbin/* /usr/sbin(文件数量较少时采用)

     # ln -s /usr/local/tengine/sbin /usr/sbin/tengine(文件数量较多时采用)

  1.2:修改/etc/profile文件,如添加如下内容:

        PATH=$PATH:/usr/local/tengine/sbin

        然后使其生效:source /etc/profile

  1.3:在/etc/profile.d/目录中建立name.sh的文件,添加如下类似内容:

        PATH=$PATH:/usr/local/tengine/sbin

        重新登录生效

 

        2、添加应用程序的库文件到系统库/usr/lib /usr/lib64:

  2.1:为库文件做链接文件

     # ln -s /usr/local/APP_NAME/lib/* /usr/lib

     # ln -s /usr/local/APP_NAME/lib /usr/lib/APP_NAME

  2.2:在/etc/ld.so.conf.d/目录下建立APP_NAME.conf,把应用程序的库文件位置添加进去:

     /usr/local/app_name/lib

     执行如下命令生效:

     ldconfig

       -v:显示加载库文件过程

 

        3、添加用用程序的头文件到系统头文件 /usr/include:

  3.1:为头文件做链接文件

     # ln -s /usr/local/APP_NAME/include/* /usr/include

     # ln -s /usr/local/APP_NAME/include /usr/include/APP_NAME

 

        4、添加应用程序的帮助信息:

  4.1:man -M PATH bin_name,只是查询,并没有添加

        -M:指定帮助信息的位置

  4.2:man配置文件:系统默认帮助/usr/share/man

      CentOS6:/etc/man.conf添加:

            MANPATH [help_path]

      CentOS7:/etc/man_db.conf添加:

            MANPATH_MAP [help_path]

[展开全文]
由于RPM为软件包管理后台工具,不能解决软件包之间的依赖关系,所以有了前端工具YUM
 
YUM(Yellowdog Updater Modified): 基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。采用C/S架构,依靠yum仓库(包括:ftp\web\file)
    yum配置文件:/etc/yum.conf
 
    yum仓库:/etc/yum.repos.d

YUM安装软件的过程:
1、寻找Server端
2、寻找是否存在该软件包
3、依赖关系检查
4、所需软件包缓存
 

YUM命令:
   install:安装软件包
   update:升级软件包
   check-update:检查软件包的升级信息
   upgrade:更新软件包
   remove:卸载软件包
   list:显示所有已经安装和未安装的软件包
        yum list installed \ uninstalled
   info:查看软件包信息
        yum info name
   clean:清除软件包一些信息
   search:查看指定软件包相关的软件包
   deplist:查询软件包依赖关系列表
   repolist:查看可用的yum源
            repolist [all|enabled|disabled]
   repoinfo:查看可用yum源的信息
            repoinfo [all|enabled|disabled]
   groupinstall:安装软件包组
   groupremove:卸载指定软件包组
   groupinfo:查看软件包组的信息
   grouplist:显示所有已经安装和未安装的软件包组
   
 
yum源:
   [name]
   name=:   //引用变量
   baseurl:  //yum仓库,    $releasever:发行版本    $basearch:cpu架构集   $arch:cpu架构
   enabled:   //是否启用该yum仓库
   gpgcheck: //是否进行完整性和校验和检测
   gpgkey:   //用于完整性检验和的检测文件

 
yum元数据目录:repodata(其中一种为ISO中的目录)
     primary.xml.gz:所有RPM文件列表;依赖关系;软件包安装列表
     filelists.xml.gz:包含所有RPM包的所有列表
     other.xml.gz:包含软件包其他信息,比如更改记录
     repomd.xml:包含primary/filelist/other时间戳和检验和
     comps.xml:包含软件包组的列表
 
 
 
在本地不同计算机部署YUM:
 
192.168.10.10:yum源
ftp: # mount /dev/cdrom /media
     # yum -y install vsftpd
     # systemctl start vsftpd
     # systemctl enable vsftpd
     # cp -rf /media/ /var/ftp
    
httpd:
     # mount /dev/cdrom /media
     # yum -y install httpd
     # systemctl start httpd
     # systemctl enable httpd
     # cp -rf /media/ /var/www/html/
 
 
192.168.10.20:yum客户端
ftp:
   vim ftp.repo
   [ftp]
   name=ftp_repo
   baseurl=ftp://192.168.10.10/media
   enabled=1
   gpgcheck=1
   gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
 
httpd:
   # vim httpd.repo
   [httpd]
   name=httpd_repo
   baseurl=http://192.168.10.10/media
   enabled=1
   gpgcheck=1
   gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
 
file:
   # mount /dev/cdrom /media
   # vim file.repo
   [file]
   name=file_repo
   baseurl=file:///media
   enabled=1
   gpgcheck=1
   gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
 
 
 
创建YUM元数据目录repodata:
    原因:在某些非网站、关盘中的YUM是没有repodata这个目录,我们就必须自己创建,即从某处得到YUM包,用于建立YUM仓库
        # yum -y install createrepo
        # createrepo /opt/repo
 
EPEL:扩展yum源,但是该YUM源的安装需要连接到网络YUM
   # yum -y install epel-release
[展开全文]
应用程序:程序=数据+指令  应用程序运行时称为进程,运行过程申请CPU和内存资源
源代码--编译--链接--运行
 
    编译:生成二进制文件(可执行文件),匹配底层架构
 
    链接:
         库:静态库和动态库  .so(shared object)
         静态链接过程:把库文件集成到应用程序中,把程序要使用的模块链接到程序
         动态链接过程:库文件和应用程序分开的,做链接
 
 
程序装入内存时内存地址空间分布:
text:存放指令
data+BSS : data存放数据,  BSS(block system of symbol)存放初始化为0的变量
栈:stack存放应用程序的变量和函数等
堆:heap存放运行中临时文件
 
 
应用程序中包含的文件:
    二进制文件(可执行程序):通常在/bin  /sbin  /usr/bin  /usr/sbin目录下存放 
        
    库:modules   .so文件
    配置文件:.conf文件
    帮助文件:一般放在/usr/share中
         
 
    注:由于应用程序中的二进制文件、库存放在/bin  /sbin  /etc这些目录下,因此这几个目录不能单独分区 ;而/usr/bin   /usr/sbin存放的是第三方的应用程序文件;而/ust/local 这个目录又是独立的
 
 
 
 
 
 
 
 
软件包管理器的核心功能:
    1、制作软件包;
    2、安装、卸载、升级、查询、校验;
    RPM功能:安装、查询、卸载、升级、校验、数据库的重建、验正数据包等工作;
 
 
软件包中存在依赖关系:
    A--->B--->C:安装软件先安装被依赖软件包,卸载软件包时,先卸载依赖的软件
 
    解决依赖关系:
        前端工具:yum, apt-get,自行解决依赖关系
        后端工具:RPM, DPT
 
    RPM包:经过源代码编译后的软件包
    .tar.gz:源码包,没有经过编译
 
 
RPM与DPT:
    Redhat、SUSE使用 RPM
        Redhat Package Manager
        PRM is Package Manager
    Debian使用 DPT
 
    RPM: RPM是以一种数据库记录的方式将所需要的软件安装到Linux主机的一套管理程序,最大的特点是将要安装的软件先编译并打包,通过包装好的软件中默认的数据库记录,记录这个软件在安装的时候需要的依赖属性模块,在用户的Linux主机安装时,RPM会先根据软件里的记录数据,查询Linux主机的依赖属性软件是否满足,若满足则予以安装,不满足则不安装。安装的时候将该软件的信息全部写入RPM的数据库中以便将来的查询、验证与卸载。
 
RPM包命名格式:

    name-version-arch.rpm

    name-version-arch.src.rpm

    说明
  • name:软件包名称。
  • version:带有主、次和修订的软件包版本。
  • arch:硬件平台。硬件平台包括了:i386、i486、i586、i686、x86_64、ppc、sparc、alpha
  • src.rpm:源代码包。
    主版本号:功能重大改进修改主版本号
    次版本号:某个子功能发生重大变化
    发行号:修正了部分bug,调整了一点功能
 
RPM优点:
    1:RPM软件包中包含了编译过的程序与配置文件,用户不用重新编译
    2:RPM在安装之前,首先会检查硬盘容量,操作系统版本等,避免错误安装
    3:RPM使用RPM数据库管理,数据中记录应用程序的参数,便于升级,卸载,查询等,RPM数据库(/var/lib/rpm)
    4:RPM本身会提供应用程序版本信息,相关属性,软件名称,用途等,便于用户了解软件
 
 
RPM工具的使用:
    1:安装:rpm [options] name.rpm
        -i:安装软件包
        -h:以#显示进度;每个#表示2%;
        -v:显示详细过程
        -vv:更详细的信息
        --nodeps:忽略依赖关系,可能导致软件包安装不完整
        --replacepkgs:重新安装,替换原有安装;
        --force:强行安装,可以实现重装或降级;
    
    2、查询
        rpm [options] [PACKAGE_NAME]
            -q:查询指定的包是否已经安装
            -qa:查询已经安装的所有包
            -qi:查询指定包的说明信息;
            -ql:查询指定包安装后生成的文件列表;
            -qc:查询指定包安装的配置文件;
            -qd:查询指定包安装的帮助文件;
            -qf file_path:查询指定的文件是由哪个rpm包安装生成的;
            -q --scripts:查询指定包中包含的脚本
      脚本:包含软件包安装前(preinstall)、安装后(postinstall)、卸载前(preuninstall)、卸载后(postuninstall)执行的脚本
    
 
    
如果某rpm包尚未安装,我们需查询其说明信息、安装以后会生成的文件;
rpm -qpi /PATH/TO/PACKAGE_FILE:查看未安装软件包信息
rpm -qpl :查看未安装软件包列表
 
    3、升级
        rpm -Uvh RPM_path : 如果装有老版本的,则升级;否则,则安装;
        rpm -Fvh 用于更新或降级的包:如果装有老版本的,则升级;否则,退出;
            --oldpackage: 降级
        
    4、卸载(erase)
        rpm -e Programe_name(如:httpd、vsftpd)
            --nodeps:卸载时忽略依赖关系
    
    5、校验软件的完整性
        rpm -V Programe_name
        应用程序配置文件完整性破坏以后的代码:
            S file Size differs
            M Mode differs (includes permissions and file type)
            5 digest (formerly MD5 sum) differs
            D Device major/minor number mismatch
            L readLink(2) path mismatch
            U User ownership differs
            G Group ownership differs
            T mTime differs
            P caPabilities differ
    
    6、重建数据库
            rpm
                --rebuilddb: 重建数据库,一定会重新建立;
                --initdb:初始化数据库,没有才建立,有就不用建立;
 
 
    7、检验来源合法性,及软件包完整性;
 
        # ls /etc/pki/rpm-gpg/
            RPM-GPG-KEY-redhat-release
    
        rpm -K rpm_path
           rsa, gpg: 验正来源合法性,也即验正签名;可以使用--nosignature,略过此项
           sha1, md5: 验正软件包完整性;可以使用--nodigest,略过此项
    
        不合法解决办法:
        rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release: 导入密钥文件
 
[展开全文]

设备文件:  /dev/

      b:块设备

      c:字符设备

 

      主设备号(MAJOR):标识某一类设备,第5列

      次设备号(MINOR):标识一类设备下不同设备,第6列

    mknod:创建设备:mknod [OPTION]... NAME TYPE [MAJOR MINOR]

    -m:设置权限

 

磁盘:

    IDE ATA:hd  主板:2IDE接口(慢,被淘汰)

    SATA:sd(现在常用)

    SCSI:sd(服务器常用)

    USB:sd

 

    Linux以字母标识磁盘的个数 a:第一块 b:第二块(顺序是根据系统根据当前主机接入的硬盘识别顺序来    定,先识别出来的就是第一块,然后就是第二块)

 

    Linux用数字标识分区:1-4标识主分区或扩展分区  逻辑分区从5开始

 

格式化分类:

    低级格式化:划分磁道

    高级格式化:为分区装载文件系统

    文件系统:内核功能,FAT32 NTFS EXT2 EXT3 EXT4 XFS等

 

    mkfs : make file system创建文件系统命令

        -t:指定文件系统

        如: mkfs -t ext3 dev_name

 

    vfs:虚拟文件系统,相当于一个内核接口,mkfs调用VFS来实现创建文件系统

 

 

分区工具:

fdisk:针对MBR分区类型的工具

gdisk:针对GPT分区类型的工具

 

 

fdisk:交互式工具常用命令

    语法:fdisk [options] <disk>    change partition table

              fdisk [options] -l <disk> list partition table(s)

              fdisk -s <partition>      give partition size(s) in blocks

    n:创建一个新分区

         p:创建主分区

         e:创建扩展分区

    d:删除一个分区

    l:显示linux支持的分区类型

    m:显示帮助信息

    p:显示当前分区列表

    q:不保存退出

    w:保存更改并退出

    t:更改分区的系统ID-

 

    磁盘ID: 在fdisk工具下 l(L)命令即可显示所有分区及ID

        5:扩展分区

        82:交换分区

        83:linux系统分区

        8e:LVM(逻辑卷管理)

 

 

 

/proc/partitions:查看系统分区情况

 

分区后进行挂载:

    mount:挂载工具

    mount src des   如:mount /dev/sdb1 /sdb1

 

    实现开机自动挂载 :  blkid:查看设备UUID

        /etc/fstab添加内容:

        UUID=id号 挂载点 文件系统 默认选项 是否开机检查 是否备份

        UUID=8567c02b-fac2-46d3-984e-b9fd8c9a2072 /sdb1     xfs      defaults      0 0

 

       

[展开全文]

授课教师

课程特色

视频(102)
下载资料(1)