网络建设、运维所有知识总结篇
作者:Danbo 2015-9-22
OSPF
OSPF的特点:
1.无环路:AS内防环机制是通过SPF算法计算路由,从算法本身保证了不会生成环路。AS间防环:通过区域划分,非骨干区域简直的通讯只能靠骨干区域通讯。
2.区域划分:优点减小了内存的消耗和CPU的负担。
3.支持等价路由。
4.路由等级:区域内、区域间、区域外(E1、E2)
自制系统(Autonomous System)
一组使用相同路由协议且处于同一技术掌控的连续的路由范围。
一台OSPF路由器对其他OSPF路由器的跟踪需要每台路由器都提供一个RID,路由器ID在OSPF区域内唯一标识一台路由器,1.手工route-id配置;2.最大loopback地址;3.最大IP地址。
使用loopback地址的好处:1.稳定,一旦路由器启动,这个环回接口就处于活动状态。2.最重要的是具有更好的控制路由ID的能力。
OSPF建立在协议号89的基础上,是传输层协议;EIGRP协议号88;RIP使用UDP520因此是应用层协议;BGP使用TCP179端口因此也是应用层协议;ARP/RARP是网络层协议,但是其工作的内容确实链路层。
并且注意对于ARP请求和相应包来说有帧类型字段,对于ARP请求和应答的话这个字段是0x0806。其帧头中具有协议字段,0x0800代表IP,因此工作在网络层。
Hello协议:
1.发现邻居;
2.在建立邻居关系时利用Hello包协商几个必要的参数;
3.确保双向通信;
4.充当keepalive。
5.用于在MA网络上进行DR/BDR的选举。
OSPF建立邻居的条件:(百度笔试考了)
1.Area ID必须一致;
2.Hello包中的HelloInterval和HelloDeadInterva的时间必须相同;
3.验证类型及验证密钥必须相等;
4.所处的区域标记必须相同;
5.必须物理直连(OSPF包的TTL值为1,虚链路除外);
6.同一区域内两台路由器的RID不能相同。
注意:路由器在发送Hello包时,会把包含所有邻居的RID。
OSPF网络类型:
1.点到点
T1链路:1.544Mbps,是链接单独一对路由器的。在这种类型的链路上总是可以形成邻居关系的。在这种网络上的OSPF使用组播地址进行通讯。
2.广播型网络
比如以太网,DR与BDR使用AllSPFRouters(224.0.0.5)与非DR/BDR进行通信,而非DR/BDR使用AllDRothers(224.0.0.6)与DR/BDR进行通信。
3.NBMA网络
比如帧中继网络,这样多路访问网络没有广播能力,需要选举DR和BDR,并且OSPF数据包是以单播进行通信的,必须要使用neighbor手工指定邻居。
4.点到多点网络
是NBMA网络的特殊配置,可以看做是一群点到点链路的集合。不需要选举DR/BDR,OSPF数据包以单播进行传输。
5.虚链路
OSPF数据包以单播方式发送。
除了以上5中网络类型,也可以将网络归纳为以下两种网络
传送网络:与两台及以上的路由器相连的网络。
末梢网络:仅仅和一台路由器相连。
如果没有DR/BDR的话,那么网络上将产生n²个:LSA通告,显得太乱了,于是就选举DR。
1.首先根据端口优先级(缺省为1,ip ospf priority),越大越优先。0表示没有资格选举为DR。
2.优先级相等,再根据RID,越大越优先。
注意DR/BDR具有稳定性,指的是:路由器的优先级可以影响一个选举过程,但是一旦选举完毕,即使更高的优先级加入后也不会替换DR/BDR。这点与RID类似。
DR是一个伪节点的概念,即任从伪节点到任何与之相连的路由器的代价都有0,通过这种方式,所有代价都不会受到伪节点的影响。并且DR是接口特性。
Process ID:这个是思科私有的,可以依赖这个属性让Cisco路由器运行多个OSPF进程。不同进程之间相当于不能类型的协议。
OSPF Hello Interval:在广播型网络上为10s(点到点或者广播),非广播上为30s(点到多点或NBMA)
OSPF RouterDeadInterval:广播型网络上为40s,非广播为120s。(注意是4倍关系)
Wait Timer(等待计时器)在开始选举DR和BDR之前,路由器等待邻居路由器通告自己为DR、BDR的时间,等待长度就是RouterDeadInterval的时间。
RxmtInterval(重传时间):路由器发送OSPF数据包后没得到回复之前将要等待多长时间重传。5s
Neighboring Router:只有建立起了邻接关系的路由器之间,才会在这个字段中显示出邻居路由器的RID。
以上信息可以通过:show ip ospf interface f0/0中查看到。
OSPF接口状态机:
1.Down
2.点到点:这个状态仅适用于点到点,点到多点,以及虚链路网络中,接口处于这个状态后,该接口就开始起作用了。此时每隔HelloInterval的时间发送一次Hello数据包,并尝试和接口链路另一端相连的邻居路由器建立邻接关系。
3.Waiting:这个是MA网络中会出现的,开始发送Hello包,并且试图去选举DR和BDR或者去发现网络中的DR或BDR。
4.DR:这样状态就代表该路由是DR
5.Backup:该路由器是 BDR。
6.DRother:既不是DR也不是BDR的路由器。
7.Loopback:环回口。
邻接关系的四个阶段:
1.邻居发现阶段;
2.双向通信阶段;
3.数据库同步阶段;
4.Full完全邻接阶段;
邻居状态机,邻居之间形成完全邻接关系的过程:
1.失效状态(Down):邻居会话的初始状态,指明在最近的RouterDeadInterval的时间内还没有收到来自邻居路由器的Hello数据包。除非在NMBA网络中,否则Hello包是不会发给哪些失效的邻居路由器的,并且在NBMA网络中,是以每个隔PollInterval(120s)的时间发送一次。
2.尝试状态(Attempt):仅适合NMBA中,哪些具有DR选举这个的路由器和其邻居路由器的相连的接口开始变得有效(Active),这台具有DR选举资格的路由器将邻居路由器的状态设为Attempt状态,并使用HelloInterval时间代替PollInterval的时间来向邻居发送Hello包。
3.初始状态(Init):在最近的RouterDeadInterval的时间内,收到的邻居的Hello包。
4.双向通信阶段(2-way):在来自邻居路由器的Hello包中看到了自己的RID。(只有在这个状态或者更高状态时才有资格被选作该网络上的DR或BDR,如果在Init收到一个DBD数据包,也可以引起邻居状态直接转换成2-way状态)。
5.信息交换初始状态(ExStart):开始建立主从关系和协商DBD的序列号。并且具有最高RID的路由器成为”主“路由器。注意:主从关系的协商也是靠DBD包的,只是此时交换的DBD包中的I位(初始位)置1.
6.信息交换状态(Exchange):在这个状态先双方开始交换DBD,并且根据DBD形成LSR,并向对方发送链路状态请求数据包。
7.信息加载状态(Loading):这个状态下,收到邻居发送的LSR,并且返回LSU进行交换链路状态通告信息(LSA)。
8.完全邻接状态(Full):邻居路由器之间具有相同的链路状态数据库,达到完全邻接关系。
在交换LSA之后必须对其进行确认,LSA的确认有两种:
1.显示确认:直接返回含有LSA头部的LSAck消息;以前已经收到过了。
2.隐式确认:返回收到LSA的相同实例的LSU;第一次收到。
注意OSPF对LSA的确认可以使用单个链路状态确认多个LSA通告。这个链路状态确认数据包不需要携带完整的LSA信息,而只是需要携带LSA的头部就可以了。没收到确认的LSA会被放进链路状态重传列表中,并且每个RxmtInterval(5s)时间就会重新传输一次,知道该LSA得到确认为止。其中LSAck可以被延时发送,但是延时时间必须小于RxmtInterval时间。
OSPF采用直接确认的两种情况:
1.从邻居不断的收到重复的LSA,可能表明邻居还没有收到这个LSA的一链路状态数据库里已经没有这个LSA的实例。
可靠泛洪:序列号,校验和,老化时间
当路由器收到相同的LSA的多个实例,路由器如何确定哪个是最新的:
1.比较序列号,拥有最大的序列号的LSA就是最新的LSA;
2.假如相等,比较谁拥有最大的无符号校验和。
3.校验和也相等的话,就比较老化时间谁的大谁是最新的LSA。
4.如果这些LSA的老化时间之差多余15min(MaxAgeDiff),那么拥有较小的老化时间的LSA将是最新的LSA。
5.如果还比较不出来那么就无法区分谁是最新的LSA,那么这两个LSA就被认为是相同的。
OSPF定义了以下3种
域内通信(Intra-Area Traffic)
域间通信(Inter-Area Traffic )
外部通信(External Traffic)
被分割的区域(或称为分段区域,Partitioned Area):由于链路失效而使一个区域的一部分和其他部分隔离开来的情形。非骨干区域变成分段区域,此时并不会中断通信,他们之间的通信会被认为是区域间的通信。但是如果骨干区域分段了,那么会把骨干区域隔离成两部分区域,并在两部分区域上创建两个单独的OSPF域。
我们解决的办法就是利用虚链路(Virtual Links)
1.通过非骨干区域连接一个区域到骨干区域。
2.通过 一个非骨干区域连接一个分段的骨干区域两边部分区域。
配置虚链路注意事项:虚链路不能是一个末梢区域,必须是传送区域(即必须拥有全部的路由信息),并且必须配置在两台ABR之间。
OSPF采用 LSA组步调(group pacing)的机制:每一个LSA通告都有属于自己的重新刷新计时器,但是当它们独自使用的重刷新计时器超时(30min)的时候,会引入一个时延来延迟这些LSA通告的泛洪扩散。通过时延可以让更多的LSA通告共同编成一组,从而可以让跟新数据包携带大量的LSA通告,默认情况下足步调时间为4min。
OSPF数据包类型:
1.Hello包:周期性发送,用来发现和维持OSPF邻居关系的 。这个是依赖于计时器的,比如在 高速链路上Hello Interval:10s,死亡时间是40s;低速链路30s,死亡时间120s。(这个高速与低速是本很被评级而不是实际的带宽。)
1.Hello包:周期性发送,用来发现和维持OSPF邻居关系的 。这个是依赖于计时器的,比如在 高速链路上Hello Interval:10s,死亡时间是40s;低速链路30s,死亡时间120s。(这个高速与低速是本很被评级而不是实际的带宽。)
2.DBD包:描述本地LSDB中每条LSA的摘要信息,和DR与BDR的选举(2-way状态)包含一些字段:I初始为、M后继位、MS主从,发生在ExStart状态、DC(用于按需链路上的do not age位)
3.LSR包:向邻居请求特定的LSA。
4.LSU包:包含LSA。
5.LSAck:确认收到的LSA。(确认DBD和LSU两种数据包。)
OSPF邻接的条件:
1.区域ID
2.hello/dead time
3.认证类型
4.末节区域标记
5.物理直连(否则怎么可能是邻接的呢!!!)
OSPF数据库同步
OSPF无论网络类型都是使用组播地址发送更新的,只有在发送确认包的时候使用单播地址。(224.0.0.5allspfrouter,224.0.0.6alldrouter),不过有时候在非广播网络中我们使用neighber命令则使用的是单播,我们这里讲的是默认方式。
同步数据库过程:
1.Down(失效状态):邻居会话的初始状态,在一个RouterDeadInterval的时间内没有收到来自邻居的Hello包。
2.Init(初始状态):当一台路由器发送Hello包后其状态变成Init状态。注意这里使用的是组播(224.0.0.5)发送Hello包,这是因为在刚开始其邻居表是空的,不可能以单播发送Hello包。当其邻居路由器收到这个组播包后,就知道对方的IP地址了,然后以单播反馈hello包,然后就达到下一种过程w-way。
3.Two-Way(双向通讯):收到邻居发送的Hello包中看到自己的RID。(DR/BDR的选举在这个阶段,前提是需要选,在广播 和NBMA网路中需要选。注意DR的概念是限于端口的,是一个多路访问环境一个DR,DR是用过路由器的优先级选择的(0~255,默认是1,0表示没有资格被选举为DR,可在接口下通过:ip ospf priority修改,优先级相等再根据RID,都是越大越优先。))
4.ExStart(信息交换的初始状态):路由器和其邻居路由器建立主从关系(确定谁先发送DBD包)并确定DBD包的序列号。
5.Exchange(信息交换状态):双方交换DBD信息,并根据收到的DBD与本地链路状态数据库作比较然后形成LSR包。
6.Loading(信息加载状态):向邻居发送LSR请求最新的LSA链路状态通告信息,此状态双方正在同步链路状态数据库。
7.Full(完全邻接状态):当邻居路由器之间具有相同的LSDB时,就达到了完全邻接状态。
通过:debug ip ospf adj可以观察到邻接关系建立的过程。
邻居是关系达到two-way的状态,邻接是关系达到full的状态,邻居关系只互发hello包,邻接关系则发DBD,LSU,LSA这些
当路由器检测到本地链路发生改变的时候的过程:
1.当R1检测到链路发生变化的时候会发送LSU给DR,在MA网络中洪泛任务交给DR来完成(BDR也记录这些路由信息的变化,只是接下来不会再从自己的接口泛洪出去)。
1.当R1检测到链路发生变化的时候会发送LSU给DR,在MA网络中洪泛任务交给DR来完成(BDR也记录这些路由信息的变化,只是接下来不会再从自己的接口泛洪出去)。
2.然后同步完LSDB后再根据算法计算最短路径树形成路由。
以上R1与DR之间,DR与DRothers路由器之间是通过单播泛洪的。
OSPF常见的网络类型:
1.point-to-point(点到点网络):连接单独的一对路由器到的。在点到点网络上的有效邻居总是可以形成邻接关系,通过组播更新数据。
2.broadcast(广播型网络):比如在我们的以太网上,连接多台路由器,选举DR和BDR,通过两种组播地址通信。
3.NBMA(非广播多路访问):比如帧中继网络中,可以连接多台路由器,但是没有广播数据包的能力,一个NMBA网络上路由器发送的数据包将不能被其他路由器收到,我们需要通过手工配置邻居的方式解决。需要选举DR和BDR。并且使用单播通信。
4.point-to-multipoint(点到多点):可以看做是一群点到点链路的集合,不需要选举DR和BDR,以单播方式通信。
5.virtual links(虚链路):通过单播传送。
注意:点到点和广播型网络都被认为是一种高速网络(即通过组播更新的都是高速链路)。
传送网络:在传送网络中数据包仅仅是通过这个区域,,始发和目的网络都不是这个区域。
末梢网络:数据包的始发或目的地址属于这个网络。注意:loopback接口可以认为是一种末梢网络,并当做32位主机路由来通告。
OSPF RID:用于表示OSPF的路由器,通过show ip ospf来查看。
1.router-id手工配置。(不包含0.0.0.0和255.255.255.255)
2.最大的逻辑接口环回口IP。(如果在配置新的环回口之前已经起了OSPF进程,我们必须要clear ip ospf process,清一下进程,这个是为了增加其稳定性,也就是DR是没有抢占模式的,即你在网络中新增加一台路由器,这台路由器是不会抢占DR的,我们知道DR,BDR的选举发生在2-way状态,不可能当加入一台新的路由器的时候就重新再经过四个状态,这样即不稳定又消耗带宽,没必要。而在二层STP根桥是有抢占模式的,因此我们配置了root-guard来防护跟被抢占。)
OSPF的两个稳定性:一个是RID不会抢占,一个是DR选举完之后不会抢占。
3.最大的物理接口的IP地址。
注意:如果在不同区域内RID相同此时不影响邻居关系的建立。
在同一区域内时,两边配置相同RID的路由器都能与中中间的路由器建立起邻居关系,但相互之间建立不起来,并且相互学习不到对方的路由,并且中间的路由器不能同时存在两边路由器上的路由,会在两者之间来回跳。
LSA Types
Type1-Router LSA:由每台路由器产生,包含路由器的 直连链路的接口IP前缀和开销,描述到达每台路由的可达性,在其始发的区域内传播。
Type2-Network LSA:由DR产生,描述 直连路由器RID和 直连网段的掩码,表述到达DR或BDR的可达性,在其始发的区域内传播。
Type3-Network Summary LSA:由ABR产生,用来通告本区域外的路由信息(包括前缀、掩码、开销),描述到达ABR的可达性,整个OSPF区域内。
Type4-ASBR Summary LSA:由ABR产生, 通告这台ASBR的可达性(ASBR的RID),在整个OSPF区域内传播。
Type5-AS External LSA:由ASBR产生,描述 到达自治系统外部的路由信息,在整个AS内泛洪(除了Stub,NSSA区域)。
Type7-NSSA External LSA:由NSSA区域内的ASBR产生,描述到达AS外部的路由,在NSSA区域内泛洪。
注意:NSSA External LSA其头部有一个P-bit标志,其置1的时候,会在NSSA区域的ABR路由器上将Type-7的LSA转换为Type-5的LSA然后扩散到其他区域。
而Stub区域内的路由器所发送的Hello包中会有一个E-bit,其置0,表示不接收外部任何置1的Hello包,也就无法与非Stub区域的路由器构成邻接关系了。
了解的LSA:
Type6-MOSPF,用在组播OSPF中。
Type8-External Attribute LSA:外部属性LSA,用在将BGP路由信息重发布到OSPF中携带AS-PATH属性。
Type9-10-11-Opaque LSA:非透明LSA,用于OSPF扩展属性的。
LSA的类型:
O, O IA, E1, E2;E2外部路由的Cost值都相同,E1会加上区域内的的COST。
我们一定要弄懂,COST值是以出接口计算的。无论RIP、EIGRP、OSPF都是这样的。
OSPF链路状态数据库过载保护:在进程下设置:max-lsa 12000(允许接收lsa的最大条目)
如果超过最大数量则会报警: Maximum number of non self-generated LSA has been exceeded "ospf 1" - 2 LSAs,并且过一会儿会down掉邻居关系。
OSPF的被动接口是:禁止发送或接收链路状态更新。
有两种方式:1.先passive-interface default所有端口,再反向开启不被动的接口:no passive-interface s0/0
2.直接passive-interface掉所有要被动的接口。
这个passive接口的作用:比如路由器上的某个端口接的是交换机,我们为了不让OSPF向这个端口发送LSU的包,我们可以将其接口设置为被动接口。有人说为什么之前不发布这个接口不就好了。呵呵,如果我们不通告这个接口那么OSPF的其他路由器就无法学习到这个网段,那么根本就不会通了。注意我们不要再传输网上使用被动接口,否则OSPF的邻居关系就会down掉,只能用在末节网络。
OSPF防环机制:
AS内防环机制是通过SPF算法计算路由,从算法本身保证了不会生成环路。
AS内防环机制是通过SPF算法计算路由,从算法本身保证了不会生成环路。
AS间防环:通过区域划分,非骨干区域简直的通讯只能靠骨干区域通讯,区域之间的传输是矢量的,因此就会有区域间的水平分割。
虚链路:
如果非骨干区域没有与骨干区域相连,或者区域0被隔开了或者不来连续,那么就要用到虚链路把各区域的ABR连接起来。并且在虚链路上不会有hello包的产生,因为其实一个虚拟隧道。
我们倾向使用RID建立虚链路,这样更稳定:area n vitual-link router-id
通过:show ip ospf vitual-links查看其状态。看到:Adjacency State FULL(hello suppressed )
路由汇总:
1.隐藏网络的不稳定性。
2.节约路由表体积,节约CPU资源,减少LSA在网络上的洪泛。
区域间汇总:针对类型3LSA汇总(O IA);在ABR上汇总。
域间汇总:针对类型5LSA汇总(O E1、O E2);在ASBR上汇总。
执行了路由汇总的路由器会自动生成一条通往Null0接口的空路由,防止环路。这个 防环主要是在执行汇总路由的路由器上收到上游路由器发送给他的默认路由,那么当某条明细路由down掉后就会匹配这条默认路由,至此就会形成路由环路。
区域间汇总:area n range 192.168.1.0 255.255.255.0 n指的明细路由所在的区域。
默认情况下使用area range命令施行路由汇总后,会自动产生一条指向空接口的null0路由,不过可以通过no discard-route不在它的路由表中加载这条路由。不过如果没有自动创建,可以使用discard-route命令创建。
汇总路由会继承所有明细路由中开销最小值,如果最小开销的路由down掉后,SPF算法会重新计算。OSPF在链路状态变化(比如接口优先级、up/down、cost值)时会重新进行SPF计算。
环回口默认的开销值为1。
对于域外汇总其实在ASBR路由器上使用命令:summary-address 192.168.1.0 255.255.255.0
area range命令的缺省行为是通告指定的范围。它也可以用来抑制一个地址范围的通告,使用关键字:not-advertise的命令area range将使指定范围的前缀被抑制。
OSPF区域间路由过滤:
使用前缀列表挑选路由:
ip prefix-list LIST1 seq 10 deny 192.168.1.0/24
ip prefix-list LIST1 seq 20 permit 0.0.0.0/24 非允许即禁止。
router os 1
area n filter-list prefix LIST out|in
OSPF的默认路由
对于OSPF域内去往AS外时,此时我们可以让ASBR路由器向区域内宣告一条类型为:O*E2的默认路由。当有多台ASBR时,我们最好修改其通告默认路由的开销,让其他的条目做备份。
命令:default-information originate,不过前提是ASBR上必须有一条默认路由,如果没有的话我们可以创建一条指向null0的默认路由:ip route 0.0.0.0 0.0.0.0 null0。不过我们可以通过命令 default-information originate always忽略这个规则。
OSPF特殊区域
Stub(末节)区域:拒绝接受类型5的LSA,同时也拒绝类似4的LSA,ABR路由器上会自动产生一条基于类型3的默认路由,用于引导Stub区域内的路由通往AS外部。
配置命令:区域内每台路由器:area n stub,通过:area n default-cost 10用来改变所通告的默认路由的开销值,默认为1.这个当有多台ABR路由器时,可以更改通告的默认路由cost值,其中一个主,另一个作为备份ABR。
当末梢区域内存在多个ABR路由器时,但是因为缺省路由的原因,区域内部路由器将不能确定那一台路由器才是到达ASBR最优网关。
Totally Stub(完全末节)区域:由于Stub区域传输类型5的LSA是通过ABR,而我们知道通往其他区域也是走ABR,那么我们完全可以决绝类型3的区域间路由,此时会产生一条类型3的默认路由,这条默认路由引导区域内的路由访问AS外部和area间。
配置命令:只需要在ABR上加上:area n stub no-summary(删除类型3的LSA)
NSSA区域:假设一个区域内有ASBR,但是我们又想在区域内拒绝类型5的LSA,我们该如何做呢?此时引入类型7的LSA。即在NSSA区域内传输的是类型7的LSA(此时路由前缀标志为:O N2、1),并且类型7的LSA中有一个P-bit,当P-bit等于1的时候,在NSSA的ABR路由器上会将类型7的LSA转换为类型5的LSA,然后在AS内泛洪。注意:NSSA区域的ABR是不会向NSSA区域内的路由器产生默认路由的,不过在AS内只有一个ASBR的路由器时网络是没有问题的,当其他区域还有ASBR时,此时当类型5的LSA传输到NSSA区域的ABR时是无法将类型5的LSA转换成类型7的。因此就造成了路由不可达的情况。此时我们需要在NSSA区域的ABR路由器上手动配置一条默认路由:area n nssa default-information-originate
配置命令所有路由器:area n nssa
Totally NSSA:拒绝类型3-4-5,引入类型7。
配置命令:只需要在NSSA的ABR上配置:area n nssa no-summary
路由条目(router entries)是到达ABR和ASBR路由器的路由。
可以通过:show ip ospf border-routers来查看。(注意观察到的路由条目的目的地要么是ABR、要么是ASBR)
当一台OSPF路由器检查一个数据包的目的地址时,其最优选路的步骤:
1.选择可以和目的地址最精确匹配的路由(拥有最长的地址掩码的路由)。
2.然后根据区域内、区域间、E1、E2的有限顺序进行选路。
3.默认条件思科路由器最多支持16条等价的路径上实现负载均衡。可以通过maximum-paths来改变。
按需电路上的OSPF
我们知道OSPF每隔10s发送一次Hello数据包,并且每隔30min刷新一次LSA。这些功能用来维护邻接关系,以确保链路状态数据库的精确。不过在按需链路上:LSA的可选字段发生了变化,没有周期性的Hello数据包交换,并且设置了DoNotAge位,因此在所有的LSA中增加了一个新的标识Demand Circuit位(DC-bit),使用命令:ip ospf flood-reduction命令。
OSPF认证
0:不认证
1:明文认证
2.:MD5认证
基于邻居认证都是在接口上进行的:ip ospf authentication-key ***** 然后在接口上启用:ip ospf authentication。
基于md5的:ip ospf message-digest-key 1 md5 ***** 应用:ip ospf authentication message-digest。
基于区域明文:ip ospf authentication-key ***** 进程下应用:area n authentication。
基于区域md5:ip ospf message-digest-key 1 md5 **** 应用:area n authentication message-digest。
虚链路明文认证:area 1 virtual-link **** authentication-key uestc 应用:area 1 virtual-link **** authentication。
虚链路md5认证:area 1 virtual-link **** message-digest-key 1 md5 uestc 应用:area 1 virtual-link **** authentication message-digest。
在OSPF认证中有一个加密序列号:这是一个不会减小的数字,用来防止重现攻击(replay attacks)。
重放攻击:是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。这样就不难理解为什么要有一个不断变化的序列号,并且加密序列号,让攻击者无法准确查找到序列号增长的规律。
OSPF和辅助地址
在OSPF环境中,辅助地址的用法:
1.只有在主网络或子网也运行OSPF协议的时候,OSPF才会通告一个辅助的网络或子网。
2.OSPF将把辅助地址看作是末梢网络(这些网络上没有OSPF邻居),从而不会再这些网络上发送Hello数据包。在辅助地址上也就无法建立邻接关系。
在TCP/IP路由技术卷一上,DNS服务器所配置的默认网关为一台配置了辅助地址的路由器上,而辅助地址与路由器与其他路由器无法建立邻居关系,所有造成DNS回包失败,我们的做法是:在这台路由器上配置一条指向OSPF主网络的默认路由。
辅助地址:也就是ip address *.*.*.* secondary
作用:在同一端口中可以设置两个以上的不同网段的IP地址,这样可以实现连接在同一局域网上的不同网段之间的通信。一般来说一个网段对于用户来说不够用,可以采取这种办法。同时必须在端口下开启ip redirect。因为Cisco路由器不允许从同一端口进来的IP包又送回到源端口,ip redirect表示允许在同一端进入路由器的IP包再从源端口出去。
注意配置了辅助地址的OSPF路由器,与另一台仅配辅助地址的路由器相连,此时这台路由器不能称为ASBR,因为其并没有接收外部路由,我们在这台路由器上运行其他协议,比如rip,然后再将rip重分布到OSPF中,这样就能够接收外部路由成为一台ASBR路由器了。
总结:在概念上理解,不能只背,他妈的有什么用。
tunnel接口是一个虚拟接口,提供点对点的传输模式,因此每一个单独的线路都必须设置一个Tunnel口。
BGP
BGP分为三张表
邻居表:记录BGP对等体信息。
BGP表:记录到达目标网络的所有路径信息,以及到达目标的属性。
路由表:到达目标网络的最佳路由。
建立BGP对等体关系的步骤:
1.IDLE空闲状态。
1.IDLE空闲状态。
其中有个重试连接时间(ConnectRetry,初次为60s,以后每多一次IDLE状态就会翻倍,以指数增加。)
2.Connect
2.Connect
3.Active(激活状态):进行TCP三次握手
4.Open Sent
5.Open Confirm3和4主要进行BGP连接。
6.ESTABLISHED完成BGP对等体建立过程。
BGP消息类型:
Open:简历BGP连接
Keepalive:邻居关系的维持,主要是维持TCP的会话(60s发送一次,180s的死亡时间)
Update:包含路径、属性
Notification:BGP通知,即发生错误时会发送Notification,一旦发送Notification,BGP邻居关系就会立即切断。
Path Attributes
我们发现在BGP Update消息中的NLRI中,关于路由的信息只包含(前缀和长度),大部分都是路径属性。
Well-Known Mandatory
AS_PATH
描述路由所有经过的自制系统,倒序排列:以最近的AS开始,以发起者的AS结尾。BGP用AS-Sequence有序的AS_PATH序列进行选路,以AS_SET无序AS号进行自制系统间防环。
Next_Hop
如果宣告路由器与接受路由器在不同一AS内,那么下一跳就是宣告路由器的接口IP。
如果宣告路由器与接收路由器在同一AS内,且NLRI指明的地址也在同一AS内,那么下一跳就是宣告路由的邻居的IP地址。
如果宣告路由器与接收路由器在同一AS内,但NLRI指明的地址不在同一AS内,那么下一跳外部对等体的IP。
我们常常通过nei **** next-hop-self下一跳自身改变下一跳,来解决下一跳不可达的问题。
ORIGIN
知名路由更新消息的来源;IGP(从IGP中的Network命令学到0);EGP1;Incomplete3(路由来源的信息不完整,比如通过redistribute重发布进来的)
Well-Known Discretionary
Local_PREF
默认为100,不会传递给其他AS,但会iBGP关系之间进行传播,如果一台运行iBGP的路由器收到到一个目的多条路径,就会比较Local_PREF属性,选择Local_PREF值最高的。这个是影响离开AS的数据流量。
Atomic_Aggregate
用来警告下游路由器出现了路径信息丢失。发生在聚合路由器上。
Optional Transitive
Aggregator
当设置Atomic_Aggregate属性后,也可以附加Aggregator属性,用来附加聚合路由之前的AS号。
Community
Internet默认
NO_EXPORT该路由不能传递到eBGP对等体,如果配置了联盟,该路由不能再联盟外公布。
NO_EXPORT该路由不能传递到eBGP对等体,如果配置了联盟,该路由不能再联盟外公布。
NO_ADVERTISE接受者不能公布给任意的BGP对等体。
Local_AS不能传递到eBGP对等体,也不能传递给联盟内的其他联盟子AS。
Optional Nontransitive
MED
影响进入AS的流量,MED值被认为是一种度量,越低越优先。
注意:默认只有两条路径来自与同一AS时,才进行MED比较(即有多条路径时当第一个AS号相同采取比较MED值)。不过我们可以通过命令:bgp always-compire-med命令去比较多有路径。
Originator_ID
路由产生者的RID,它是由第一个RR创建,是一种防环机制。
Cluster List
路由反射器的簇ID,由路由反射器产生,每一个RR将会有一个簇ID。这个有点类似于AS-PATH属性,也是将新的Cluster ID加到Cluster List中。用于簇间防环。
Weight
思科特有的,用于本地路由器多出口选路,本地产生的默认为32768,从对等体学习到的其他为0。与本地优先级有点像。
BGP的防环机制
iBGP防环:通过iBGP对等体学到的BGP更新将不能传输给任意的iBGP邻居,即iBGP更新只传一条。
eBGP放缓:通过AS_PATH中的AS_SET属性进行防环,即当运行BGP的路由器在接收到来自外部对等体的一条路由中发现自己的AS号,此时就会忽略该路由。
iBGP的全互联
这个用于解决iBGP防环机制,也就是iBGP的水平分割的一种方法,一般采用逻辑的Full-Mesh。我们知道BGP是建立在TCP179端口上的,我们如何保证TCP正确建立呢,这里只要双方能够ping通即可,这点我们可以运行IGP协议即可。尤其是在发生路由聚合后,会加入AS-SET以防止路由环路。但是这个问题是降低了路由的稳定性。
路由抑制
路由摆动(Route Flap)是Internet不稳定的主要因素,当一条有效路由被宣告为无效,然后又被宣告为有效,此时我们会给变化的路由一个惩罚值,即路由摆动得越多,其惩罚值累加,然后惩罚值会自动降低,我们在此设置一个半衰期,如果惩罚值超过抑制门限,那么就不会对外宣告该路由,当惩罚值降低到重用门限后,才会解除该路由的抑制,不过抑制时间会有一个上限,叫做最大抑制时间--60分钟,这个时间一般设置为半衰期的4倍。我们可以通过:bgp dampening来更改。
BGP选路原则
1.Weight
2.Local_PREF
3.本地产生的(下一跳为0.0.0.0)
4.AS_PATH
5.ORIGIN
6.MED
7.AD(eBGP20优先于iBGP200)
8.iBGP的metric最小
9.以上原则都相等的话,如果开启了maxmimu-path (2-16),就进行负载均衡。
10.eBGP计时器最大
11.邻居RID最小
12.具有最短的Cluster_LIST
13.邻居IP最小
BGP同步
从iBGP对等体学到的eBGP更新不会去用也不会去宣告给eBGP对等体,除非自己在IGP中也学到相同的路由。
这个主要是防止路由黑洞的问题。不过我们一般都要关闭这个同步规则。
什么情况下BGP会把路由信息放入路由表中呢?那就是下一跳可达。这里面试的时候可以画一个拓扑解释,此时就要用到充分发:将BGP充分发到IGP,不过这个牵涉到BGP路由条目过大,并且会丢失BGP相应的属性,即使采用充分发也只是充分发直连路由。我们目前都将同步关掉,然后采用iBGP的逻辑Full-Mesh来解决这个问题。
![](https://images2015.cnblogs.com/blog/771929/201509/771929-20150922095205615-1038655861.png)
上面张图很重要,注意控制层面是以段建立的,其源目IP是不停变化的,而对于数据层面其数据包中的源目IP是不变化的,当到达没有运行BGP的路由器D时,就无法找到目标到IP的路由。只能在运行两个协议的B和E之间进行IGP域BGP的交换(在没有进行重发布情况下)。我们做法是:
1.物理Full-Mesh(所有路由器都运行BGP)
1.物理Full-Mesh(所有路由器都运行BGP)
2.逻辑Full-Mesh
3.重发布
管理大型BGP对等体关系
1.对等体组
用一个名字和一系列的路由策略来定义一个对等体组,同样的属性会设置在更新消息中传给几个对端。
把一些具有相同配置的路由器华为一个组,这样对这个组进行操作,就相当于对每个成员进行操作了。
命令:nei ccnp remots-as 20 ; nei **** peer-group ccnp
2.社团
四个属性:默认情况下定义的社团属性不会传递,我们可以通过:nei *.*.*.* send-community向邻居发送。
no_export:不会传到ebgp对等体,但是如果配置了联盟,那么会传输给联盟子AS。
no_advertise:配置了这个属性的路由不会传出任意的bgp对等体。
local_as:这个不会传给ebgp对等体,如果配置了联盟,也不会传给联盟内的子as。
internet:路由的默认属性,此属性表示此路由可以无限制的传输。
在描述BGP团体中,使用AA:NN的新格式,而思科默认使用久格式:NN:AA,我们可以在所有路由器上使用命令:ip bgp-community new-format来支持新格式,此时使用:set community 来打上社团名称。
3.路由反射器
先找到要作为路由反射器的路由器,然后在RR上分别对每个邻居做:nei **** route-reflector-client,将邻居路由器作为路由反射器的客户端。然后每个客户端与RR建立BGP邻居即可。
路由反射器的原则:除了非客户端不能够反射给客户端外,其他形式任意两种都可以互相传递。
路由反射器经对等体的数目从n(n-1)/2减少到n-1条,路由反射器和它的客户合称一个簇。
注意路由反射器反射的原则:1.从非客户端学到的iBGP对等体学习到的,只将它反射给客户。2.从客户学习到的可以传输给客户和所有的非客户。3.从ebgp对等体学到了,可以反射给所有的客户和非客户。
路由反射器内部的放缓靠的是,Originator_ID和Cluster_LIST
Originator_ID:这个是本AS内路由发起者的RID。路由反射器不会将一条路由公布给路由的发起者,TT不会将一条路由公布给路由的发起者。不过即使发起者收到一个带它自己的RID的更新消息,它也不理睬该消息。
而一个AS内的没一个簇必须用一个唯一的4字节簇ID来标识。如果簇内只有一个路由反射器,那么簇ID就是路由反射器的RID,如果簇内包含多个路由反射器,必须给每个RR配置一个簇ID.
4.联盟
可以将一个大AS划分陈成会员自治系统
联盟内的选路规则:到联盟的外部eBGP路由优先到自制系统成员的eBGP,然后又优先于ibgp,而Next_Hop、MED、Local_PREF属性也可以传递。
路由过滤
使用AS_PATH实现AS的过滤。
命令:ip as-path access-list n deny regexp
在进站或出站过滤:nei **** filter-list as-path-filter in|out
使用filter-list调用as-path acl,实现基于AS编号的过滤。
使用route-map实现流量的过滤
route-map name permit|deny sequence
match ip add ***
set ***
然后基于接口调用:nei **** route-map XX out|in
使用前缀列表代替acl来实现更为精确的匹配:
ip prefix-list ** seq 5 permit|deny 192.168.1.0/24
ip prefix-list ** seq 5 permit|deny 192.168.1.0/24
我们使用aggregate-address 192.168.1.0 255.255.255.0去发布聚合路由,然后使用关键字:suppress-map MAP 抑制发布聚合路路由后中再去发布该条明细路由条目。
这里具体做法是:使用suppress-map调用route-map,然后在route-map下去match一个acl或者去match一个prefix-list,然后在acl中写入要被抑制的明细路由。
而在默认情况下BGP发布聚合路由的时候也同时也会发布明细路由,此时我们可以通过添加关键字summary-only仅发布聚合路由。
还可以通过attribute-map来改变聚合路由的属性,比如从ospf重发布进BGP,其属性为Incmplete,我们可以通过Attribute-map将其属性更改为igp。命令:aggregate-map **** attribute-map ORIGIN
route-map ORIGIN
match ip address *
set origin igp
我们可以通过在aggregate-map后面的as-set关键字给聚合路由加上无需的as号,这样可以恢复聚合路由的环路检测功能。
advertise-map抑制聚合路由继承某条明细路由的属性。
bgp小知识:
通过:bgp bestpath as-path ignore选路不考虑as-path长度,这样是与其他厂商兼容。
通过:bgp bestpath as-path ignore选路不考虑as-path长度,这样是与其他厂商兼容。
通过:nei maximum-prefix来限制从邻居收到前缀的数量:nei **** maximum-prefix 300 90 warning-only(超过最大300条目的90%时发布警告信息,当超过300后则donw掉邻居关系。)
通过:neighbor shutdown中断对端连接,但是不删掉配置。
timer bgp设置计时器,默认60s的keepalive和180s的保持时间。
BGP后门路由
我们可以让AS50与AS75之间的某些关键业务走RIP这个后门链路,比如我们让AS50中的172.17.0.0和AS75的172.18.0.0之间的通信走RIP链路,然后让NAP链路充当备份链路。这里问题是AD的限制,会优先选择eBGP。可以通过network命令在BGP下宣告各自的学习到对方被设置为后门路由的BGP路由,于是就将eBGP路由转化为iBGP路由,这样RIP的AD就小于了iBGP,此时位于这两个网段的通信就会走后门路由。不过这里会有一个问题,AS75会eBGP发布该路由,这样的话在AS100和AS200的路由想要访问172.17.0.0网段的时候也会先发布到AS75然后走后门路由,因为在选路的时候会根据第5个ORIGIN属性选路,从AS50发过来的为Incomplete,从AS75发过来的为IGP。我们如何解决这个问题呢?这里我们引入了后门路由,分别在AS50和AS75内发布从对方学习到的后门路由:network 172.18.0.0 backdoor。network backdoor的作用于network效果一样,都是将eBGP路由看作iBGP,修改AD为200,只是backdoor路由不会向eBGP宣告这条后门路由罢了。
BGP的过滤路由,我们使用neighbor *.*.*.* distribute-list 1 out 调用acl。
我们再去配置acl:access-list 1 deny 具体路由,然后access-list 1 permit any 允许所有没deny的路由。
我们可以使用neighbor next-hop-self命令而不用考虑向一个iBGP对端公布一条eBGP路由,该路由的下一跳地址不能改变的原则。
BGP检测到故障的IBGP连接并且将它倒换到另一条链路上时间很可能超过180s,通过timer bgp来改变bgp的keepalive和保持时间。比如我们将keepalive时间设置为3s,然后保持时间设置为9s。就使用下列命令:
timer bgp 3 9
eBGP读条问题,我们知道eBGP的TTL值为1,我们建立eBGP邻居关系时是指接口IP,如果我们想以RID建立eBGP关系时,我们的做法是修改eBGP通过路由的TTL,即:neighbor *.*.*.* update-source loopback 0
然后修改跳数:neighbor *.*.*.* ebgp-multihop 2
使用聚合路由的方法是:aggregate-address命令:注意aggregate-address名列后面的选项。
有:summary-only:这个选项是聚合路由器只宣告聚合后的路由。默认情况下bgp聚合路由器会宣告聚合后的路由和明细路由。
还有社团属性我们是通过route-map(路由映射来完成的)
比如:
route-map COMMUNITY permit 10
match ip address perfix-list AGGREGATE
set community no-export | local-as | no-advertise
通过acl或者prefix-list去挑选出指定路由。
我们还可以抑制聚合路由的一个子网,我们可以通过suppress-map选项
比如:
aggresss-address *.*.*.* 255.255.255.0 suppress-map SUPPRESS调用route-map
route-map SUPPRESS permit 10
match ip address 1
acl或者是prefix-list
改变聚合的属性:attribute-map选项:
例如:
aggregate-address *.*.*.* 255.255.255.0 attribute-map ORIGIN调用route-map
route-map ORIGIN permit 10
match ip address 2
set origin incomplete 将起源属性改为重发布的incomplete。
我们知道聚合的AS-PATH只包含发起该聚合路由的AS号。在聚合路由中设置ATOMIC-Aggregate和Aggregator则是用于通告丢失的具体信息。但是如果来自聚合路由AS内的一条明细路由失效,那么就会去匹配这条聚合路由,然后传输先去,然后路由器在查找路由表,发现没有该条路由,然后才去丢失。到一个无效目的地的数据包在被丢失之前是,没有必要经过两个路由器转发。我们除了公布as-path属性中的as-Sequence之外,还可以在aggregate-address命令中加入as-set关键字,来解决这个问题,其唯一的作用是:恢复被聚合路由丢失掉的环路检测功能,AS-PATH的作用是:恢复被聚路由丢失掉的环路检测功能。
aggregate-address最后一个选项是:advertise-map。advertise-map选项指向一个名为ALLOW_Route的路由图,该路由图标识构成聚合路由基础的更具体路由。
我们也可以让BGP选路时忽略AS-PATH长度,命令为:bgp bestpath as-path ignore来通知Cisco路由器在路由选路的中忽略AS-PATH的长度。
我们也可以限制从邻居接收的最大前缀的数量:
neighbor *.*.*.* maximum-prefix 300 90 warning-only
这个作用是:当从邻居收到最大前缀数据的90%时就会产生一个日志消息。当超过最大限制300时就会在超时后down掉邻居关系。
我们可以通过clear ip bgp +路由。然后通过clear ip bgp *(shell正则)清理所有的BGP连接。
还可以不down掉邻居关系,直接触发到该邻居的更新信息:clear ip bgp * soft out(软清)
当改变的策略影响到入业务量时,我们可以使用入站软重新配置。:nei *.*.*.* soft-reconfiguration inbound命令,然后对业务量收到新策略影响的每一个邻居使用clear ip bgp soft in命令。
通过AS_PATH过滤路由
做法是:ip as-path access-list 命令定义了访问列表的一个变量,该变量用来定义AS号。
这里as-path使用的是正则表达式(regular expressions)
如下常用到的过滤as-path语句:
只公布到自己AS内部的路由:ip as-path access-list 1 permit ^$
拒绝任何在AS50包括AS50的更新消息:ip as-path access-list 1 deny _50_
结尾默认拒绝使用。允许所有:ip as-path access-list 1 permit .*
仅接收来来自AS50的路由:ip as-path access-list 1 permit ^50$
然后在bgp进程下去调用route-map:nei *.*.*.* route-map MAP out
然后写route-map:
route-map MAP permit 10
match as-path 1 调用as-path列表。
本地的优先级:local_pref。默认所有公布给ibgp对等体的路由都是100。可以通过ip default local-preference命令来更改缺省值。也可以通过set local-preference命令来改变独独立路由的Local_Pref
用法:
在路由进入方向打上这个属性:
nei *.*.*.* route-map PREF in
route-map PREF permit 10
match as-path 2
set local-preference 200
ip as-path access-list _50$ 表示起源于AS50的路由
MED值,影响相邻AS内的路由决定。这个是在路由出接口打上这个属性。
MED值,作为一种度量(metri),越低越优先。
同样在route-map下调用acl或者prefix-list,然后打上相应的属性:set metric 200
注意:默认情况下只比较到达同一AS内相同目的地的多条路径,我们也可以通过命令:bgp always-compare-med来比较来自不同AS的多条路径的MED值。
这里还有另外一个命令:set metric-type internal,这个可以将MED值设置为与到同一目的地的IGP路由相同的度量,这样可以避免次优化路由的问题。
附件as-path:
可以使用set as-path prepend命令修改它公布路由的as_path属性。
例如:
nei *.*.*.* route-map PATH out
route-map PATH permit 10
match ip address 10
set as-path prepend 30 30
注意:我们一般打prepending多选的as号都是通告路由器所在as的as号,一般不要随便写,有可能与以后所用到的冲突,那样的话冲突AS将不会接受该路由。
Cisco NAT
思科NAT有四种地址:
1.内部本地
2.内部全局
3.外部全局
4.外部本地
查看NAT映射表:show ip nat translations(翻译超时时间为86400s,1hour)
但是为了能从外部访问,比如:邮件、Web、FTP服务器,我们必须使用静态映射了。
将一个大地址多路复用到一个小型地址池的问题,即允许多个地址映射位一个地址,Cisco把这个功能称之为端口地址翻译(PAT),我们有时候也将其称之为端口重载。
NAT的问题:
1.经过NAT转化后,IP包头的校验和要进行重新计算。
2.分段。我们知道IP数据包超过MTU会进行分片,而端口号等四层信息仅在IP的第一个分片,如果分片后的某个片段在第一个分片之前到达NAT,那么NAT只有先暂时缓存这个片段然后等第一个分片到后才能处理后续分片。
3.加密,NAT能够改变IP地址信息,但是当数据经过加密后NAT就无法查看到这部分数据了,因此如果要执行NAT那么IP地址信息和任何基于IP地址信息(如TCP校验和,因为存在伪首部)获得的信息都不能被加密。例如IPSec穿越NAT设备时,这个必须将NAT放在安全一侧,而不能放在加密的路径上。
4.安全,虽然采用NAT技术隐藏了对外隐藏了内部网络的细节,但是NAT并不会采取任何措施去防范DOS攻击。
FTP基础
FTP服务主要用来传输文件,而与HTTP传输文件不同,FTP不具有多媒体浏览的功能。
FTP协议有两种工作方式:PORT方式(主动式)和PASV方式(被动式)。
PORT(主动):客户端(大于1024端口)向服务器的FTP控制端口(21)发送连接请求,服务器接收连接,建立一条命令链路。当需要传送数据时,服务器从数据端口(20)向客户端的空闲端口(大于1024端口)发送连接请求,建立一条数据链路来传送数据。
PASV(被动):客户端(大于1024的端口)向服务器的FTP端口(21)发送连接请求,服务器接收连接,建立一条数据链路。当需要传送数据时,客户端(大于1024端口)向服务器的空闲端口(大于1024端口)发送连接请求,建立一条数据链路来传输数据。
主动与被动优缺点:
主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉;被动FTP对FTP客户端的管理有利,但对于服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连接一个高位随机端口,而这个端口很可能被服务器端的防火墙阻塞掉。
IE浏览器默认是主动(PORT)模式,为了防火墙的兼容性(还有一个是为了DSL调制解调器的兼容),我们可以在高级中选择使用被动FTP模式。
SMTP,简单邮件管理协议,一般包含域名,而不是IP地址。不过,它请求邮件传送时,可以用IP地址而不用域名。因此Cisco NAT检查SMTP消息中相应的参数,当发现IP地址时就进行翻译。
SMTP协议用于上传邮件和在服务器间传送邮件,与之不同,邮局协议(POP)与Internet消息访问协议(IMAP)仅用于从邮件服务器上下载邮件到客户端。并且这两个协议在消息实体中都只用主机名,而不用IP地址,因此这些协议经过NAT时不需要进行特别的检查。
SNMP,简单网络管理协议,采用MIB(消息信息库)来对各式各样的网络设备进行管理。除了标准的MIB外,还有个厂商的设备创建自己专有的MIB。
交换知识点
VLAN
MAC地址表存放的内容:MAC、PORT、端口所处的VLAN。
当交换机收到 目标MAC为广播、 未知的单播帧时都会在所有接口广播该帧。
上面这个原因也是我们要划分广播的一个主要原因: 隔离广播域,限制广播、组播传播的范围;提高了安全性,一旦一台PC中毒可以限制在一个VLAN中;便于管理。
我们在划分VLAN的时候最好每个VLAN都划分到不同的子网当中。这个主要是方便跨VLAN访问。
VLAN的实施
端到端VLAN: 指在不同的交换机上配置相同的VLAN,VLAN的划分不依赖于物理位置。如果两各用户位于不同交换机上的相同VLAN,此时则需要打标记。这个主要是适合8/2的流量,即大部分流量都在内网,此时为了提高效率,内网流量可以不同经过核心层的帮忙,直接由底层负责转发。
本地VLAN:即指本台交换机上的VLAN,本台交换机上的VLAN之间的通讯不需要打标记,只需要三层交换或者单臂路由。
VLAN一种是基于端口的静态VLAN、另一种是基于MAC的动态VLAN(VLAN与MAC绑定)
配置vlan:int vlan 10 name sys
然后将相应的接口加入到VLAN中:switchport access vlan 10 ; switchport mode access
对于动态VLAN,则需要用到VMPS(VLAN Management Policy Server)管理策略服务器。这个是通过VLAN Query Protocol(VQP报文进行传输的)
查看MAC地址表或者CAM表:show mac-address aging-time
默认MAC地址表老化时间为 5min,不过当我们把网线拔掉后该条目则立即被删除。
可以通过命令修改:mac-address-table aging-time 100 (vlan n,也可针对VLAN该。)
VLAN总数为4096个,默认都在VLAN1,我们可以手工分配的2-1001,1002-1005保留用,1006-4095扩展。创建扩展VLAN的要求:1.型号必须支持。2.vtp模式为transparent。
对于access端口我们可以使用命令:switchport mode access将端口设置为access,同时开启PortFast特性,并且禁用EtherChannel特性。
Trunk
默认情况下交换机之间的链路仅能传输vlan1的信息,因此必须在交换机之间做trunk链路。
封装和模式
封装分为两种:1.802.1Q,2.ISL
我们知道在二层一台网帧中是没有标示VLAN信息的字段的,因此我们需要在以太网二层帧上做一些动作,ISL是封装一个新的二层头部,最多支持1024个VLAN;802.1Q是插入Tag,最多支持4096个VLAN
当采用这两种形式封装的话,接口MTU必须大于1500,我们称之为小巨帧。
Trunk模式
DTP帧:交换机的接口周期发送Dynamic Trunk Protocol,主要主动协商为trunk。
access:忽略DTP帧。
trunk:发送和响应DTP
desirable:主动发送和响应DTP(默认)
auto:不发送但相应DTP。
nonegotiate:不发送DTP帧,也不接收。一般和trunk合用,比如在交换机之间我们必须要其trunk,我们可以不让接口发送DTP消息以节省链路带宽,一般都是将这两个命令一起使用。
如果在没有启用802.1Q的设备或者access端口收到一个802.1Q帧,那么标记的数据会被忽略,而数据包则会作为以太网帧被交给二层。
一般我们在起trunk的交换机的接收上使用以下命令:
switchport trunk encapsulation dot1q
switchport trunk encapsulation dot1q
switchport mode trunk
switchport nonegotatie
switchport trunk allowed vlan 1,5,11,100-1000
switchport trunk native vlan 1
Native VLAN(本征vlan,802.1Q存在的,不打标签,默认VLAN1)
一条链路两边trunk接口的vlan必须一致,否则会有CDP-4-NATIVE-MISMATCH报错信息。
802.1Q Tunneling(双重Tag)
比如对于运行商提供的是一个二层网络,同一台交换服务与两个公司,但是这两个公司所处的VLAN有重叠。
我们的做法就是在运行商的交换机上将不同公司划分到不同的大VLAN中,这样公司内的数据帧在经过运行商提供的交换机传输的时候就被打上了二层标签。
外层tag与内存tag没有关系。
命令:首先在接公司的交换机的接口上划分大vlan:switchport access vlan 30
然后:switchport mode dot1q-tunnel即可。
VTP
Server
Clinet
Transparent
VTP的Server和Clinet同步vlan信息的时候都是根据Revision(修订号)学习的,无论是Server还是Client,只要谁的修订号大,就会学习对方的VLAN信息。注意Revision号指的是变动数,只要增加删除修改一项,这个修订号就会增加1。
VTP修剪技术会使用VLAN通告消息来判断Trunk连接何时正在扩散不必要的流量。VTP修剪可以将泛洪的流量限制在恰好的范围内,可以提高链路可用的带宽。这个可以通过vtp pruning来启用。
p-vlan(私用vlan):隔离同一VLAN中处于同一IP子网内终端设备间的通信,
EtherChannel
PAgp(端口聚集协议)和LACP(链路聚集协议)
PAgP模式:(端口之间发送PAgP数据包进行协商,这点类似于VLAN的DTP)
auto 我们建议使用on模式,来禁止发送PAgP的数据包,以此来减少链路上不必要的流量。
on
desirable
non-silent
LACP模式:
Passive
Active
on
EtherChannel负载分担选项:
使用port-channel load-balance ?来进行选择。
比如二层交换默认采用src-mac。而三层端口默认采用soc-dst-ip
VLAN间路由
能够提供VLAN间路由选择的功能:
1.三层交换;2.单臂路由;
单臂路由:
如果一台交换机支持多个VLAN,但是没有三层功能,那么其必须靠一台外部路由设备来实现这个功能。
某些交换机使用的是三层模块,有的则是使用技能路由功能。
做法是:通过一条802.1Q Trunk链路与台路由器相连,并且路由器接口被划分为多个逻辑子接口,每个子接口用于一个VLAN。
缺点:路由器存在单点故障;2.Trunk链路容易造成拥塞。3.过大的交换延迟(主要存在与路由器)
通过三层交换
在默认情况下,交换机会为默认VLAN(VLAN1)创建一个SVI接口,以放行远程交换机的管理连接。做法是:创建一个VLAN接口,为每个VLAN的SVI接口分配一个IP地址,然后将其作为VLAN内主机的默认网关,用来对这个VLAN的流量进行路由。
有点是速度远远快于单臂路由,并且不需要额外的路由器
我们给每个SVI接口都配置上IP地址,注意所有交换机上的VLAN配置必须相等,及时某台交换机上没有相应vlan也要配置SVI接口并配上IP地址,这个为了实施动态协议,然后其他vlan内的主机能够访问。然后运行动态协议:rip、ospf都可以,然后在交换机之间的链路上起trunk,这样不同vlan间的数据就会通过trunk链路达到另外一台交换机上。
STP(生成树)
STP提供二层冗余链路,消除了由于单点故障所引起的网络问题。
STP的种类:
CST(公共生成树):所有VLAN公用一个802.1D的生成树。
RSTP(快速生成树,802.1w),思科交换机默认模式。
MST(多生成树,802.1s)
PVST+(每VLAN一个生成树)
PVRST+(每VLAN一个快速生成树),思科交换机默认模式的增强版本。
STP计算步骤(越小越优先)
1.选举根桥: 比较BID(网桥优先级(默认32768)和网桥基MAC组成),这个我们可以通过命令手工指定根桥:spanning-tree vlan 1 primary,其实这个是就是将交换机优先级改为8192
2.选举跟端口:非根桥上到达根桥最近的端口即cost值最小的端口。
目前计算的标准是:10M的是100;100M是19;1000M是4;10000M是2。
如果有多个端口路径开销相同:就会比较上级交换机的端口ID(端口优先级(128)和MAC地址)
3.选举指定端口:根桥上的所有端口都是DP,一条链路有且只能有一个DP。
先根据所在网桥的跟端口到达根桥的cost值,越小越优先,然后再根据上级交换机的端口ID(优先级+MAC),上级指的是由该端口出发的上级交换机。
STP端口状态:
1.Blocking(阻塞):20s 此状态不会参数数据帧的转发,不会发送BPDU,但会接收BPDU来判断根桥的位置。如果在20s内没有收到BPDU,那么就会进入侦听状态。
2.Listening(侦听):15s 已通过接收BPDU判断出要参与数据帧转发,于是开始发送BPDU,这个状态是交换机启动后的默认端口状态,因为此时他认为网络中只有自己一个交换机。如果处于侦听状态的交换机发现本端口在新的生成树中不应该由此端口转发,会再次回到阻塞状态。
3.Learning(学习):15s 开始学习MAC地址表。
4.Forwarding(转发):收发数据帧和BPDU。
5.Disabled(禁用):不会参与生成树的计算。
交换机上一个原来被阻塞掉的端口由于在最大老化时间内没有收到BPDU,从阻塞状态转变为侦听状态,然后经过15s后变为学习,再经过15s进入转发状态。
当二层拓扑发生变化,新的配置消息要经过一定时延才能传播到整个网络,这个时延被称为转发延迟(Forward Delay),默认为15s。
RSTP端口角色:
Discarding(丢弃)
Learning(学习)
Forwarding(转发)
RSTP多了一下端口:
Alternate(替代端口):用来替代去往根桥的端口(跟端口),跟端口宕掉后将从替代端口到跟端口。
Backup(备份端口):用来对指定端口备份。这个是交换机的
注意:!!!
一个交换机开机状态下端口角色是 从侦听状态开始的,即通过15s的侦听和15s的学习, 总共30s状态到转发。前提是抛出开机自检,从端口启动过程开始计算。
STP拓扑变化泛洪过程:
1.拓扑发生变化的交换机向跟桥方向发生TC位置位的BPDU(TCN)。
2.上级交换机收到TCN后,返回TCA确认收到的TCN,直到根桥收到。
3.根桥产生新的BPDU向下传播泛洪。
STP的优化
PortFast
当我们在端口启用PortFast时,此时交换机会节约30s时间(15s侦听和15s学习时间),用在接PC或服务器的接口,因为接PC或者服务器这样的数据端口,没有必要参与到生成树的计算,通过PortFast接口禁用了STP,这样二层access端口会立即进入转发状态。这个主要是为了防止DHCP超时,主机为了获取IP地址。
UplinkFast(倒三角)
主要用在接入和汇聚这件的冗余链路,实现跟端口的备份,当一个交换机的跟端口down掉后,一般会经过30s时间实现跟端口的切换,实施uplinkfast后的端口可以快速实现这个过程。
BackboneFast(正三角)
主要用在汇聚层设备之间的链路,当跟端口down掉后,可以快速将之前block掉的端口转化为跟端口。这个会节约20s的blocking时间。
以上都是传统STP需要的技术,目前思科交换机默认的是PVRST+,
PVRST+
对于802.1w和802.1s来说,其网桥优先级都加上了12bits长的扩展ID字段,这样网桥优先级都是以4096为基准往上增加的。
对于802.1w来说只有三种端口状态:
1.discarding(丢弃): listening、blocking、disabled
2.learning
3.forwarding
快速生成树的端口:
替代端口(AP):这个是相当于UplinkFast,对跟端口的替代端口。从别的交换机收到更好的BPDU,当交换机上行链路down掉后,这台交换机重新发送BPDU宣告自己为根桥,然后被的交换机收到后就会向跟发送查询,看是否还在,此时收到回复还在,于是就向这台交换机发送消息称跟还在,你从我这走吧。
备份端口(BP):对指定端口的备份。 从同一台交换机收到更高的BPDU。这个交换机到根桥必须有一条冗余链路的才能有备份端口。
RSPT提议和认可机制
Proposal and Aggrement
![](https://images2015.cnblogs.com/blog/771929/201509/771929-20150922095322475-1820663586.png)
RSTP是分段收敛。当我们增加C到根那条链路时,其收敛过程如下:
1.根桥发出Proposal置位的BPDU;
2. 下级交换机收到后,然后将除根端口意外的所有端口处于sync状态(如果本身端口是阻塞的那就同步了,比如AP、BP、Edge Port。如果是转发端口那就直接Block掉。),然后向跟回应Aggrement消息之后本段链路收敛完成。
3.然后下级交换机也发送Proposal置位的BPDU,进行类似的收敛过程。收敛速度非常快,几秒就搞定。
注意:RSTP中当交换机检测到拓扑改变时是直接进行收敛的即都可以发BPDU ,而不是像STP一样,只有根桥发送BPDU。
RSTP定义的链路类型:
1.点到点(全双工)
2.共享(半双工,接了hub)
生成树增强
BPDU Guard(BPDU防护)
如果在启用了PortFast特性的端口上收到了BPDU的,那么BPDU Guard就会使其进入“err-disabled”状态。为了避免桥接环路,BPDU Gurad会禁用此端口。
BPDU Filter(BPDU过滤)
防止启用PortFast端口上发送BPDU,因为与主机或服务器相连的端口通常不需要参与STP计算。
Root Guard(跟防护)
跟防护能够强制让端口成为指定端口,进而防止新接入的交换机成为根交换机。即跟防护提供了一种强制部署根网桥的方法。启用根防护的端口上接收到更优的BPDU时,那么端口就会进入 root-inconsistent(不一致根)的状态(处于 监听状态),这样的话原有的网路拓扑会得到保护,当交换机从该端口不再收到更优的BPDU时,该端口会最终过渡到转发状态。
Loop Guard(环路保护)
当网络中的的阻塞端口错误的过渡到转发状态时,这就意味着网络中产生了环路,此时启用Loop Gurad的接口就会将该接口进入到 loop-inconsistent(不一致环路) 阻塞状态,一旦正常后则自动恢复。另一种反之环路的方式是:单向链路检测( UDLD)失败。
对于DHCP服务器来说,由于VLAN会隔离广播,这样的话我们必须为每个VLAN创建一个DHCP服务器,其实没有必要,我们可以在交换机上使用:ip helper-address +DHCP服务器的IP地址即可。这就是DCHP中继。注意:ip helper-address这条命令不过使三层设备传输DHCP UDP包,也会传输DNS,TFTP等数据包
CISCO交换技术
1.Process Switching(进程交换)
这个会严格按照每一步进行走,比如修改二层头部,CRC校验,查找路由表等。这是最占用系统资源的。速度最慢。
2.快速交换(Fast Switching)
第一个包进行进程交换后,路由器会创建交换缓存,修改数据帧后直接送到出站接口。
3.思科快速转发(CEF)
会实现根据路由表简历FIB(转发信息库),设备会利用FIB表执行基于硬件的转发。
Catalyst交换机中实施冗余的Supervisor引擎
HSA(High System Availability)
采用 完全冷启动的方式。
RPR(Route Processor Redundancy,路由处理器冗余性)
处于备份状态的引擎会同步部分配置, 当活跃引擎失效时,备用引擎开始重启所有板卡,加载配置。
RPR:2~4min;RPR+30s~60s
RPR+:这种模式下冗余引擎中的配置已经与活跃引擎中的配置保持同步, 不用重启板卡,减少了倒换时间。不过当活跃和备用引擎的镜像版本不同时,只能使用RPR。
SSO(状态化故障倒换,Stateful Switchover)
当发生引擎倒换时RPR和RPR+对于用户是不透明的,SSO模式的可以减少二层流量的中断时间。在SSO模式下,冗余的Supervisor引擎启动已经完全初始化,并且启动配置和运行配置和活跃引擎已经同步( 同步的内容比RPR模式更多),在倒换前后除了处于活动链路以外其他链路并不会出现断开。这种模式可以实现 0~3s即可转发二层流量。
HSRP(热备份冗余协议)
将虚拟IP和虚拟MAC,主机把虚拟IP配置为自己的默认网关,主机利用ARP来解析默认网关IP对应的MAC时,ARP返回虚拟MAC,主机发往虚拟MAC的数据会由虚拟路由器组中处于活跃的路由器承担。这些对于主机来说是透明的。
HSRP中的角色:
1.虚拟路由器:就是那对IP和MAC
2.活跃路由器:在HSRP组中,承担实际数据转发的路由器。
3.备份路由器:时刻监听活跃路由器发送的Hello(3s,10s监听不到就认为主down掉了)包,一旦活跃路由器down掉,备用路由器承担转发角色。
4.其他路由器:一个HSRP组中活跃路由器和备用路由器只有一个,其他路由器处于初始状态,当它们都发生故障时,其他路由器就会精选活跃和备份路由器。
HSRP状态:
1.初始(Inital)
2.监听(Listen)
3.宣告(Speak)
4.备用(Stanby)
5.活跃(Active)
这个可以配置抢占模式的(Preempt)
备用和活跃路由器是根据 优先级(0~255,默认0)选举的,优先级相同规则具有最高的IP地址的将成为活跃路由器。
注意:HSRP全部配置都在VLAN接口下配置的。
HSRP的接口追踪和路由追踪
standby 1 track interface f0/0 10(接口f0/0down掉后,会将该路由器的优先级降低10)
我们也可以创建多个HSRP组,对于不同的IP子网配置不同的活跃路由和备份路由器
管理员可以同时将某个设备设置为VLAN生成树的根桥和HSRP活跃路由器,这样可以保证二层转发路径直接到达三层的活跃路由器。需要为每一个VLAN配置一个组,一个IP地址。
VRRP(虚拟路由冗余协议)
IEEE标准,不同与HSRP是思科私有标准。
VRRP中有一台主用(Master)路由器,和一台或多台备用(Backup)路由器。
VRRP默认计时器时间小于HSRP,因此切换时间要好于HSRP,其对比图如下:
VRRP使用虚拟IP或者真实IP都可以,真实IP那么使用该地址的路由器称为主用路由器,虚拟IP则是最高优先级称为主用。
VRRP默认优先级为100,当优先级为0表示该路由器不具备选举为占用路由器的资格。这点同OSPF的DR与BDR的选举。
vrrp 1 ip ****
GLBP(网关负载分担协议)
GLBP是思科私有协议,客户发往单一默认网关地址的数据帧会由多台路由器共同承载。
AVG(Active Virtual Gateway):一个GLBP组中的成员会选举出一个网关,称为该组的AVG。其他组成员作为备份,ABG会为GLBP组中的每个成员分配一个虚拟MAC地址。
AVF(Active Virtual Forwarder):AVG会为网关分配虚拟MAC,每个网关负责转发到自己虚拟MAC地址的数据包。
各交换机最大mac条目
交换机:
2960 8000条
3560 12000条
3750 4k
3840 32000条
4945 32768条
6509 64k
7606 路由器,企业或运行商或数据中心。
路由器:
1921
2811
3825
路由器CISCO开头或者直接数字
交换机WS-C3560-48T
Linux基础
网易研究院,杭州
9月9号。2:25
查看superblock:dumpe2fs -h /dev/sda1
磁盘分区:fdisk
磁盘格式化:mkfs -t ext3 /dev/sda1
磁盘检查:fsck -C -t ext3 /dev/sda1 这个命令呼叫的是e2fsck这个软件。
检查磁盘坏轨:badblocks
设置系统标头:e2label
挂载:mount -a -l 我们要挂载光盘:mount -t iso9660 /dev/cdrom /media/cdrom
挂载的时候还可以使用-o指定挂载后的权限。
卸载装置:umount -f(强制)+装置或者目录
Linux下所有的装置都以档案来替代,反过来档案以major(主要装置代码)和minor(次要装置代码)的
数值来代表装置。
如果我们想开机挂载的话需要修改:/etc/fstab。
swap分区的功能是应付物理内存不足的情况。
free来查看内存的使用量:free | grep -n "Mem:" | awk '{print $4}' 同时也可以查看交换分区的使用情况
。
关掉swap文件:swapoff /tmp/swap
对硬盘的sda1的第一个分区进行备份:dd if=/dev/sda1 of=/uestc/mbr bs=512 count=1
superblock大小为1kb
ls -l第一行的total为该目录消耗的总block大小,这个我们可以通过ll -s来详细观察目录下每个文件及目录
的block节点的使用情况。
查看目录消耗的容量:du -sb /etc/ 以字节显示;du -sm /dev/以兆显示
linux常见压缩扩展名即命令:
*.Z compress uncompress 注意压缩源文件会被删除,保留用-c
例如:compress -c /etc/passwd > /uestc/passwd.backup.Z
*.gz gzip
目前gzip可以解压compress,zip,gzip等软件压缩的档案。
gzip -#用于指定压缩比,-9最大,-1压缩最快,默认为-6,注意压缩的时候会删除源文档,想要保留:
gzip -9 -c /etc/passwd > /etc/uestc/passwd.gz。这个可以利用-v选项查看压缩文件的压缩比。
解压缩用:gzip -d 。查看压缩后文件的内容:zcat。
*.bz2 bzip2
这个使用情况同gzip,查看压缩文档的内容用:bzcat
*.tar tar
*.tar.gz tar -zcvf打包压缩,解包解压缩:tar -zxvf
*.tar.bz2 tar-jcvf打包压缩,解包解压缩:tar -jxvf
打包的时候,将特殊的档案或目录移除在打包之列:--exclude="file"
比如:tar -jcvf /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc
/root
tarfile 仅仅打包。
tarball 打包+压缩
dump备份,dump 0是完全备份,dump 1是仅对dump 0数据变化的部分进行备份,一次类推。
dump -S /dev/sda1显示出dump备份需要多少容量
dump -W 显示出被dump备份过的文档。
比如对/boot施行dump 0备份:dump -0u -f /uestc/boot.dump.0 /boot
如果我们想对备份dump包施行压缩的话:dump -0u -j -f /uestc/boot.dump.0 /boot
对dump备份恢复:restore
restore -t用于观察备份文件的内容,类似于tar -t。例如:restore -t -f /uestc/boot.dump.0
类似的还有mkisofs建立光盘镜像,cdrecord:光盘刻录工具。
cpio可以备份任何东西,不过cpio不会主动去找档案来备份,我们可以用find命令去寻找。
备份:find /boot | cpio -ovcB > file(find默认 -print,即打印出找到的内容)
还原:cpio -ivcdu < file
查看:cpio -ivct < file
vim常用
aAoOiIrR
跳到指定行:nG或者:n
跳到第一行:gg
跳到最后一行:G
搜索关键字:/word
光标上面搜索第一个关键字:?word
继续搜索下一个关键字:n 配合/word
继续搜索上一个关键字:N 配合?word
搜索指定行替换所有:/1,ns/word1/word2/gc(c代表替换前需要确认)
向后删除n个字符:nx
删除或剪切光标所在行:dd
删除或剪切光标所在行向下n行:ndd
删除光标所在行到行末:dG
删除改行最前面的字符:d0 类似删除改行最后一个字符:d$
复制光标所在行:yy
复制光标所在行向下:n行
类似的还有yG、Y0、Y$
在光标所在行下一行粘贴:p
在光标所在行上一行粘贴:P
撤销:u
重复上一个动作[Ctrl]+r或者使用“.”(没错是小数点)
:wq、:q、:q!、:w、:w!
将编辑的数据另存为:w filename
在编辑的数据中,读入另一个档案,并将内容加到光标所在行的后面:r filename
暂时离开vim到指令模式执行命令::!commond
设置行号:set nu
取消行号:set nonu
ab mymail danbocn@gmail.com AB替换
利用映射定义快捷键:map T :q! 这样按下T就是强制退出vim的意思。
当系统宕机后,导致我们正在编辑的文本无法按正常流程关闭,此时我们需要重新编辑的时候系统提醒有
人已经在编辑,我们可以通过删除指定文本的.swp后缀文件,通过ls -al查看。
vim的配置文件在:/etc/vimrc,这个不建议修改,不过你可以修改处在家目录下的~/.vimrc
我们使用cat -A发现win下的行末为:^M$,而Linux行末为:$。我们可以使用dos2unix和unix2dos互相
转换。-k保留修订时间不变。
wget+网址:直接下载网址内的程序。
语系转换:iconv -f big5 -t utf8 passwd -o passwd.1(-f from, -t to, -o 保留源文件)
Shell,这个专门看一本书
当你使用login接口登入系统时,系统做了一下处理:
1.寻找/etc/passwd里面有没有你要输入的账号,有的话将对应的UID和GID(在/etc/group中)读出来,
并读出家目录与Shell设定。
2.然后核对密码,Linux会进入/etc/shadow里面对应的UID。
3.一切ok的话,进入Shell接管系统。
当root密码忘记的时候:通过Live CD开机后挂载根目录去修改/etc/shadow,将里面root密码字段清空。
重启后root将不用密码即可登录。
有效群组(当前用户所处的群组)和初始群组(这个群ID位于/etc/passwd中,而有效群组位
于/etc/group中群组后面)
观察当前用户所属的有效组:groups
切换用户群组:newgrp
将用户加入群组中:root管理员:usermod;组管理员:gpasswd
新增加用户:useradd,相关配置文件,passwd,usermod,userdel
useradd的默认参考文件:useradd -D(呼叫的源文件位于:/etc/default/useradd)
而UID和GID密码参数在:/etc/login.defs
总结:useradd建立账号时,会参考以下文件:
/etc/default/useradd
/etc/login.defs
/etc/skel/*(家目录参考的基准目录)
passwd +用户 进行修改密码
使用标准输入来修改密码:echo "abc123456" | passwd --stdin root
查看命令帮助文档:man 1 passwd 查看配置文件帮助文档:man 5 passwd
让某个用户失效:passwd -l danbo,解锁某个用户:passwd -S danbo
更加详细的密码设定:chage,比如:查看某个账号的详细密码参数:chage -l root。这个主要是修
改/etc/shadow文件。
修改/etc/passwd文件的:usermod
删除用户:userdel
查看用户相关信息:finger
增加用户账户的额外信息,比如姓名、办公室、电话等:chfn(change finger)
改变用户shell:chsh
无论是chfn和chsh都是修改/etc/passwd文件
与用户组相关的命令:
增加组:groupadd
改变组:groupmod
删除组:groupdel
创建群组管理员:gpasswd -A danbo groupname 这个是将danbo设为群组的管理员。
gpasswd -M user1 groupname 这个是将user1加入到groupname组中。
getfacl:取得某个档案/目录的ACL设定;
setfacl:设定某个档案/目录的ACL规范。
切换用户su -(“-”一定要加,否则不会改变用户环境变量)
sudo -u danbo touch /uestc/haah
以danbo用户创建文件。
用户能否执行sudo主要看/etc/sudoers的设定,使用visudo进行编辑。
sudo命令可以是非root用户在以root的身份去执行命令。
查看此时计算机的使用者:w who last lastlog(每个账户最近的登录时间)
使用者交谈:write mesg wall write+somebody(ctrl+d结束)
发送邮件:mail danbo -s “nice to meet you” < filename(也可通过重定向导入事先写好的文本)
接收邮件同样使用mail,然后进入邮件后输入?查看更多命令。
pwck:检查/etc/passwd配置是否正确。
pwconv:
crontabl 计划任务
linux工作安排种类:at和cron
at:处理仅执行一次就结束安排的指令,比如我们要指定某个任务在指定时间内运行一次,那么就会把任
务放到/var/spool/at目录内,到指定时间就运行一次。(at time)
比如我们要执行一个脚本:
at 3:00 tomorrow
at > /var/spool/at
at > Ctrl+D
at中的时间使用方法:
at now + 5 minutes任务在5分钟后运行
at now + 1 hour 任务在1小时后运行
at now + 3 days 任务在3天后运行
at now + 2 weeks 任务在两周后运行
at midnight 任务在午夜运行
at 10:30pm 任务在晚上10点30分
之前一定要确保atd服务处于启动状态:service atd start|status
编辑/var/spool/at目录内
另外还有一个batch命令,这个是在CPU工作负载小于0.8时进行指令的下达。
crontab
首先确认这个服务启动状态:
service crond start|stop|restart|reload|status
也可以在系统启动的时候就启动,编辑:/etc/rc.d/rc.local末尾加上:/sbin/service crond start
必须记住以下几个:
crontab -u username #指定编辑某个用户的crontab,只有root才能使用这个命令
crontab -e #编辑crontab的工作内容
crontab -r #移除所有的crontab内容
crontab -l #查阅crontab的内容
基本格式:
* * * * * command
分钟 小时(24) 天 月 星期 cmd #周日可以是0或7
辅助字符:
*:代表任意时刻都
,:代表分割时段
-:代表一段时间范围内
/n:每隔n单位间隔。
下面举一些实例:
注意后面的额command也可以包含多个指令(每个指令用;分割)
例如:每天造成3点20执行用户目录下的两个指令:
20 3 * * * * (/bin/rm -rf /tmp;/bin/uptime)
注意cron服务最低侦测间隔为分钟。
当我们配置完crontab之后,我们必须重启crond服务才能使其生效(针对unix,linux会自动执行):
service crond restart 或者 /etc/init.d/crond restart
cat /etc/crontab #这个是系统的crontab,注意与用户的crontab不相同,这里需要指定执行者。
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
SHELL=/bin/bash #使用哪个shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #执行文件搜索路径
MAILTO=root #执行例行工作发生错误将错误指令发给谁。我们也可以以邮件形式发给执行邮件:
MAILTO= danbo@gmail.com
HOME=/
01 * * * * root run-parts /etc/cron.hourly:
run-parts实际上是个脚本,后面接目录,也就是说,如果你想让系统每小时主动帮你执行某个指令,将
该指令写入脚本中,并将该脚本放入到/etc/corn.hourly/目录下的意思。
crontab优化:注意将不同计划任务执行时间尽量隔开;并不需要输出信息的结果导入到/dev/null中;周
和日月不能同时使用;
另外还有一个指令比较有用:anacron,当我们的机器没有24*7运行时,比如周末机器会停机一天,可能
在停机期间会有没有执行的crontab任务,那么利用anacron在机器开机后进行执行crontab,它会读取时
间记录(timestamps)了解到系统什么时候关机,然后分析现在与关机之前anacron之间的差异,就会发
现没有执行的crontab了,然后就会执行之前没有执lrontab。
操作系统总结:
程序与进程的区别:
程序只是一组指令的有序组合,是一个静态的实体。
进程是一个动态的实体,有自己的生命周期。
Linux的进程状态:
可运行态(Running 0,R):只有该状态才能在CPU上运行。
可中断的等待(Interruptible 1,S):处于这个状态的进程因为等待某个事件的发生而被挂起,通过ps命
令绝大多数进程都处于Interruptible状态。
不可中断的等待(Uninterruptible 2,D):与S态类似,只是此时的进程是不可中断的,包括利用kill -9
也无法杀死这个进程。
暂停态或者跟踪态(Stopped,Traced 4):工作在背景(暂停)或者处于排错(Traced)状态。
僵死状态(Zomble 3,Z):程序已经终止但却无法从内存中移除,子进程终止,父进程却不知道。
子程序与父程序
当我们登入系统后会取得一个Shell,然后我们利用这个Shell提供的接口去执行另外一个指令,另外执行
的指令也有一个PID,那么后来执行的那个指令的PID就是子程序了,而原本的Shell就是父程序了。
将程序置于背景下执行:cp file1 file2 &,此时bash会给予这个指令的工作号码(job number)+PID此
时要注意导出的信息,我们最好加上> /dev/null 2>&1
我们也可以将目前的工作目录丢到后台去执行:按下ctrl+z。注意:使用ctrl+z丢到背景都是暂停状态
观察背景工作状态:jobs -r(列出处于运行态的工作)-s(列出处于暂停的工作)-l(列出所有)
将后台工作拿到前台:fg %n
我们知道ctrl+z将目前工作丢到后台中并暂停,那么如果让其工作呢?使用:bg %n
关掉后台工作:kill
后台指的是:避免在终端下按下ctrl+c中断执行过程。
而前面讲到的at是将工作放到后台执行,这个与终端无关,也可以使用nohop,这个可以让你在脱机或注
销状态下仍可以运行。
nohup cmd (&)加上&带包在后台执行,如果你想让在后台的工作在你注销后还能够继续执行,就使用
nohup+&组合。
程序
观察系统所有的程序:ps(静态);top(动态);pstree(程序树之间的关系)
ps -l:只查看自己bash的程序;
ps aux:查看所有系统运作的程序。
当使用ps -l观察到一下:
F:程序的flag:4代表此程序的权限为root;1代表此程序仅进行复制(fork),而没有实际执行(exec)
。
PRI/NI:表示执行优先级,数字越小越优先。
PID和PPID:进程号和父进程号。
top -d 3 >/uestc/top.log 也可以将top输出的信息导出到top.log文档中
查看自己bash的PID:echo $$,然后通过top观察此PID:top -d 3 -p 13000
tty是本机登录。
pts/0默认是从ssh网络登录
使用pstree时,我们观察到所有程序都依附于init这个程序下,使用pstree -p观察到init的PID是1,因为
init是Linux内核启动的第一个程序,而重启init也就意味着重启系统了(reboot)。
终止某进程:killall -9 httpd,其中9表示sigkill:代表强制中断一个程序的进行。
而kill后面必须要跟PID或者job n服务区如:kill -9 %1)才行,跟服务名称就需要用到killall了。
pgrep +服务区例如:pgrep ssh这样就可以找到相应服务区的PID
执行优先级:
PRI(new)=PRI(old)
nice可调整的范围:-20~19,而一般用户调节的范围为0~19(防止一般用户抢占资源)
用法:
nice -n +nice值 cmd:以新的nice值执行命令cmd(例如:nice -n -9 ps)
renice n PID:调整一个已经存在的程序的优先级。
free:观察内存使用情况,包括物理内存和虚拟内存(Swap)
cache与buffer的区别:
cache:缓存区,是高速缓存,位于CPU与主内存之间的容量较小但是速度很快的存储器,Cache主要保
存CPU刚用过的数据,减少CPU等待时间。
buffer:缓冲区,用于存储速度不同步的设备或优先级不同的设备之间的数据传输,减少进程间通信的等
待时间。
查看系统内核相关信息:uname -a
查看系统启动时间与工作负载(即top的第一行):uptime
查看网络:netstat -tunlp(tcp,udp,以端口号显示而不是服务名,处于侦听,PID)
分析核心产生的信息:dmesg |more,比如查看网卡的信息:dmesg | grep -i eth
侦测系统资源变化:vmstat
内存中的所有数据都是写入到/proc这个目录当中,并且是以PID进行分目录存储的
fuser -k /dev/pts/0:强制清除掉某个用户,可以通过w来查看
或者使用:fuser -k /mnt/cdrom 或者使用umount
fuser还可以找到那个程序在利用该档案,比如当我们卸载的时候发现device is busy,我们可以通过fuser
查看那个程序在利用该档案,例如:找到使用/proc的程序:fuser -mvu /proc
我们知道fuser是知道装置或目录找到使用其的程序,而知道程序如何知道其使用了哪些文件或装置呢,这
个就需要:lsof,例如:lsof -u root
查看SELinux状态:getenforce
关闭SELinux:临时:setenforce 0;永久:修改/etc/selinux/config,将SELINUX=enforcing改为
SELINUX=disabled,重启即可。
开启SELinux:setenforce 1
守护进程deamon与服务service
系统为了某功能必须要提供一些服务service;但是service的提供总需要程序来支持吧,我成称这个程序
为daemon。
daemon可以分为两类:
1.stand alone:可以自行单独启动服务,个别窗口负责单一的服务。
2.super daemon:同一窗口负责各种业务(xinetd)
跟service相关的目录和文件:
/etc/rc.d/init.d包含所有service的控制脚本。
/etc/rc.d/rc*.d包含所有service自启动选项配置。
/etc/sysconfg/*各服务的初始化配置文件。
/etc/*各服务各自配置文件。
/var/lib/*各服务数据库。
例如:
重启某服务:service crond restart或者/etc/init.d/crond restart这个是/etc/rc.d/init.d/的软链接。
观察某服务:netstat
Linux启动过程:
1. 打开电源,加载BIOS开机自检。
2. 透过BIOS找到启动盘,读取MBR的bootloader。(Linux主流的为grub,包括两个stage,stage1为执
行bootloader的主程序;stage2:主程序加载位于/boot底下的配置文件。menu.lst提供选单)
3. 透过Bootloader取得内核并加载。
4. 内核启动init进程。
5. init 程序开始执行系统初始化 (/etc/rc.d/rc.sysinit)
6. 依据 init 的设定加载 (/etc/rc.d/rc[0-6].d/*)
7. 加载本机设定 (/etc/rc.d/rc.local,用户自定义开机启动程序,只要将脚本放到/etc/rc.d/rc.local/目
录内开机就会执行。)
管理系统服务开机启动:chkconfig
chkconfig --list +服务名
chkconfig --level(0123456) 服务名 on|off
比如关闭httpd自启动:chkconfig --234 httpd off
然后观察状态看是否关闭:/etc/init.d/httpd status或者service httpd status
图像话管理工具:ntsysv
init加载主要流程如下:
1.init处理系统初始化流程/etc/rc.d/rc.sysinit,主要目的是在开始加载系统各项服务前,做好整个系统环
境,主要就是利用rc.sysinit这个脚本。
2.系统根据/etc/inittab设定选择启动级别,启动位于相应目录内的启动服务/etc/rc.d/rc*.d/与启动配置
文件/etc/sysconfig。
3.然后启动用户自定义开机启动程序/etc/rc.d/rc.local。
第3步透过bootloader加载系统核心和核心模块,核心位于:/boot/vmlinuz,而核心是压缩的,解压缩需
要RAM Disk/boot/initrd,作用:在没有挂载/之前,系统需要先挂载磁盘驱动,于是就把initrd加载到内
存中,虚拟出“/”,然后完成vmlinuz核心模块的加载。
核心模块:/lib/modules/$(uname -r)/kernel,通过lsmod查看加载了哪些模块。
利用modinfo可以查看模块详细信息。
安装模块:insmod,移除模块:rmmod
修改模块的额外参数设定:/etc/modprobe.conf
当核心加载完成后那么就会在内存中记录:/proc/kernel
grub
安装在mbr的grub主程序,最重要的任务就是从磁盘加载核心文件,以便让核心能够顺利驱动整个硬件。
grub识别硬盘的如:(hd0,0),第一个0表示搜索第一个硬盘,第二个0表示搜索硬盘的第一个分区。
忘记root密码:
1.重启
2.进入grub(在选单界面按e,然后在要kernel那一行按e,在行尾输入single,回车后进入单用户模式)
3.此时系统会以root的权限给你一个shell,然后直接passwd修改密码即可,之后init 3进入字符模式。
在Red Hat系列Linux中都提供了系统设定工具:setup。我们可以利用这个综合管理系统。
提供密码验证的服务器有NIS、LDAP
网卡配置:1.透过setup。2.编辑/etc/sysconfig/network-script/ifcfg-eth0
编辑DNS服务器:vim /etc/resolv.conf
重启网卡配置:/etc/init.d/network restart
防火墙配置:1.透过setup。2.编辑/etc/sysconfig/iptables
硬件信息的收集:
/proc/cpuinfo;/proc/partitions;/proc/interrupts
vmstat:分析系统(CPU、RAM、IO)目前的状态,分析IO也可以用iostat
软件安装
Linux系统中可执行的文件都是二进制文件(binary program),而Shell Scripts其实也是利用shell这个程
序(例如bash)来执行的呢。
可执行问阿金的编写过程:
1.写程序,也就是源代码,其实就是纯文本文件。
2.编译,就是将源代码编译成系统能看懂的二进制代码咯,而此时需要专门的编译程序(例如gcc,利用
已存在的库函数编译C语言写出的源代码)来处理,经过编译与连结之后,就是可执行的二进制程序了。
事实上在编译的过程中还产生了目标文件(Object file),然后在引用外部子程序或者加入函数库,将程
序代码与函数库连结(Link)之后才能执行。
make过程:
当执行make时,make首先会在当前目录搜索Makefile这个文本文件,Makefile记录而来源代码该如何编
译的详细信息,而Makefile则是利用configure侦测程序去检测用户具体的系统环境(比如系统版本,内核
,是否安装了相应的编译器等)建立的。
我们在安装源码包要看说明文档:README或者INSTALL
源码包的安装过程:
1../configure
2.make clean(可以没有,作用:去除当前目录中不是本次编译过的额目标档案。)
3.make
4.make install
建议安装在:/usr/local目录下,而源码包建议存储在:/usr/local/src
不过都安装在/usr/local/目录下的话以后不好删除,建议单独在/usr/local/目录下建立一个以程序名命名
的文件夹,这样以后删除直接删除相应文件夹即可。不过这样环境变量就没有相应的记录了,我们在执行
时就必须要附加绝对路径,因此我们可以将相应目录加入到PATH里面。
软件包校验:
md5sum/sh1sum
用法:md5sum +安装包,然后与官网提供给的md5值比较。
Linux两大主流:RPM和DPKG
rpm使用指令rpm,在线安装yum。
dpkg使用指令dpkg,在先安装apt-get
rpm安装命令:
rpm -i 安装;-v(verbose)显示安装详细信息;-h(hash)以哈希显示安全过程。
rpm -ivh +安装包
rpm常用选项:
--nodeps:忽略安装包的依赖性强制安装。
--test:测试安装,是否有依赖问题。
--prefix:自定义目录,而非默认目录/bin,/etc等
--force:暴力安装,不管之前是否已经安装过了。重复安装(--replacepkgs),覆盖安装比如要安装
的软件包比已安装的旧(--replacefiles)
rpm -Uvh 安装包:升级安装,如果没有安装则执行安装过程。
rpm -Fuh 安装包:仅执行升级安装,如果没有安装,则不安装。
rpm -e 安装包:卸载rpm包。
rpm -qa:查询已安装的软件。
rpm -qf:查询已安装的文件属于哪个安装包。
rpm -qi:查询已安装软件包的信息,比如作用,版本什么的,未安装加上-p
rpm -ql:查询已安装软件包安装了哪些文件,未安装加上-p
rpm -V:校验软件包,如果正确没提示,可以根据返回值来确认哪些改变了,5:md5;S:大小改变
从rpm包中提取所需要的文件:
首先将rpm包转化为cpio:rpm2cipo
然后通过管道|提出文件: rpm2cipo bind.x86_64 | cpio -idv +指定文件到当前目录
还可以通过数字签名的方式来验证。
yum:自动解决rpm包的依赖关系
yum -y install 安装
yum -y update 升级
yum list 查询安装包
yum info 软件包信息
yum remove 卸载
修改yum源,一般直接复制163yum源到/etc/yum.repos.d/CentOS-Base.repo
Linux备份
备份工具:tar、cpio、dd、dump
推荐备份的目录:
/boot
/etc
/home
/root
/usr/local
/var
dd备份:dd读取的是扇区,并且读取速度慢。
dd if=/dev/sda1 of=/dev/sda2
cpio备份:find / -print | cpio -covB >/dev/sda2
还原:cpio -iduv < /dev/sda2
dump完整备份:dump -0u -f /backupdata/home.dump /home
第一次增量备份:dump -1u -f /backupdata/home.dump.1 /home
tar完整备份:tar --exclude /proc --exclude /mnt --exclude /tmp -jcvf
/backupdata/system.tar.bz2 /
cp -a也可以进行备份。
增量备份(差异备份):tar
tar -N '2015-09-04' -jcvf /backupdata/home.tar.bz2 /home只有比20150904更新的文档才备份
也可以透过rsync进行镜像备份:rsync -av 来源目录 目标目录。
第一次备份完毕后,在此进行备份时就是增量备份。
Shell脚本学习
/etc/profile:初始化系统全局Shell变量。
/etc/bashrc:定义Shell函数和别名的系统全局定义。
~/.bash_profile:用户个人环境。
~/.bashrc:用户个人的别名及变量设置文件
source或者. 将自定义变量导出到环境变量。
fork系统调用:
Linux系统通过fork系统调用创建进程。fork系统调用创建调用进程的副本即为子进程。子进程与父进程共
享一个CPU,并且子进程继承父进程的环境变量。
wait系统调用:
子进程执行阶段,父进程处于等待状态,此时wait一直保持待机状态,当1个子进程终止。执行wait终止
子进程,返回子进程的PID。若在子进程终止前父进程挂了,那么子进程就成了孤儿进程,所以wait进程
不仅让父进程处于等待状态,也可以终止进程。
exit系统调用:
执行exit终止子进程,并且返回sigchild信号,0为成功,非0失败。使用echo $?查看。
所有Shell都可以使用的变量称为全局变量或环境变量,使用env或者printenv查看。
局部变量只能用于当前Shell,利用set查看系统所有变量(全局和局部)
删除变量 unset VAR
显示变量:echo $VAR或者echo ${VAR}
局部变量转化为全局变量:exprot VAR="fuck"或者declare -x VAR="fuck"
注意:当export在shell脚本内使用时,一旦shell脚本执行结束,变量也会消失。
注意一下参数变量:
$*
$@
$?
$#
$!:最后运行后台进程的PID,而连续两个!!则是运行history最后执行的命令,等于!-1。
或者是!+关键字第一个字母,这个是运行最近的第一个字母是前面输入的那条命令。
$_:最后运行命令的最后一个参数
$0:shell脚本的全名,在脚本中echo $0等于basename $0
$$:当前Shell的PID。例如ps aux | grep bash 显示的PID等于此时echo $$的PID
读入变量read VAR1 VAR2,或者是read -p "Plead input an integer: " a
shift将参数左移。
替换命令``,例如:now=`date`;echo $now
整数的计算:expr 10 + 110 注意,运算符号两边必须有空格,两边可以为数字,也可以是变量。
Shell条件语句
if 命令
then **
elif
fi
case i in
模式1)
语句
;;
模式2)
语句
;;
esac
循环语句
for i in "@*"
do
echo $i
done
文件测试:test -f /etc/passwd ;或者[ -f /etc/passwd ],返回0为真,返回1为假。注意exit返回结果
0为真,非零为假。
-f:文件存在
-d:目录存在
-s:文件存在且为非空
-e:文件存在即为真
-r:可读
-w:可写
-x:可执行
-L:文件为软链接
函数
function() {
echo "***"
echo "***"
}
调用函数直接在要调用的位置协商函数名即可。
增加目录到PATH中:PATH=$PATH:***
通过kill -l可以查看所有的信号变量,最常用的就是-9SIGKILL
定义别名:alias mv='mv -i',删除用:unalias命令
如果我们想让别名永久生效可以将其写入到~/.bashrc文件当中,之后导出source ~/.bashrc
[]检索字符范围,例如:file[1-3]
{},当中使用,可以检索多个,例如:file{ile?,oo}
..上级目录
-上一个目录
declare命令
-a:声明变量为数组
-i:声明整数变量
-r:声明只读变量
-x:声明环境变量,declare -x等于export
type用于显示命令的类型:别名、内建等等
file用于识别文件的类型:b、c、d等等
变量扩展修饰:
${var:-word}:若变量var为空,则返回word。
${var:=word}:若变量var为空,则将变量设置为word并返回word
${var:?word}:若变量var为空,则将显示var:word
${var:+word}:若变量var存在,则返回word,否则返回null,常用语测试变量是否存在。
${var#pattern}:从前匹配最短删除。
${var##pattern}:从前匹配最长删除。
${var%pattern}:从后匹配最短删除。
${var%%pattern}:从后匹配最长删除。
${var:offset}:提取含有offset关键字的字符串。
${var:offset:length}:从offset开始之后提取长度为length的字符,例如:var="12345";echo
${var:2:2};34
${var/substring/newstring}:使用newstring代替var中的第一个substring。
${var//substring/newstring}:使用newstring代替var中的所有substring。
${#var}:返回变量var的长度。
${var}:返回变量的内容,推荐这样写。$var这样也可以。
$1、$2、...$(n),返回第n个位置的参数。$1-$9返回第1-9个参数。$0:当前shell脚本的名称。
$():括号内为命令组合。
``:``内命令执行完毕后返回。
'':单引号内命令原样输出。
数值计算:
$[]或者$(())
定义数组:
declare -a numbers=(11 22 33 44 55)
echo ${numbers[2]}
22
echo ${#numbers[@]}
sort
grep
awk
sed
uniq
grep详解
将匹配的行打印出来
常用选项
-c(count):值输出匹配行的数目
-i(ignore-case):不区分大小写
-n:输出匹配行和行号
-v:反选匹配文本的行
-An:after:除了列出该行外,后续的n行也列出来。
-Bn:before:除了列出改行外,前面n行业列出来。
使用扩展正则表达式:grep -E或者egrep
比如:去掉空行和注释行:
egrep -v '^$|^#' /etc/passwd
cut详解
-d:指定分割符。
-f:依据-d指定的分隔符分割的数段,利用-f去除第几段,当截取多个段的时候,中间用,号隔开。
-c:以字符单位去除固定字符区间。注意在linux中tab键默认是8个空格。
截取多段,1,3,4。
截取4-15段,cut -d ":" -f4-15,对于-c截取字符同样适用。
sort基础
-f(ignore-case):忽略大小写
-b(ignore-leading-blanks):忽略开头的空格
-n(numeric-sort):以纯数字进行排序(默认以文本排序,数字的话以第一个数字为准。)
-r(reverse):反向排序。
-u(uniq):相同的数据中,仅出现一行。
-t(field-separator):指定分隔符,默认是以tab键来分割。
-k(key):以哪个field进行排序。
uniq基础
-i:忽略大小写
-c:进行计数
wc基础
-w(word):字数
-m(character):字符数
-c(bytes):字节数
-l(lines):行数
wc默认输出行数、字数、字符数
tee基础
双向重导向
-a(append):以累加方式加入到数据file当中。
例如:last | tee -a file.log | more
tr基础
-d:删除匹配的字符
-s(squeeze-repeats):删掉重复的字符。
例如:小写转大写:tr '[a-z]' '[A-Z]' 注意只能用管道字符,这个后面不能直接跟文件。
删除字符:cat /etc/passwd | tr ':' -d
我们知道在dos下会在每行行尾加上"^M"这个断行符
col基础
-x:将tab键转换成对等的空格键盘。
sed基础
选项:
-n(silent):使用安静模式,仅输出sed处理的行。
-f(file):将sed动作写在后面的文本内。
-r(regexp-extended):支持扩展正则表达式。
-i:直接修改读取的文本,而不是输出。
范围:
n1,n2
动作:
a(apped):新增,a后面接字符串,这些字符串会出现在目前行的下一行。
c(replace):取代,c后面接字符串,这些字符串可以取代n1,n2之间的行。
d(delect):删除
i(incert):插入,i后面接字符串,这些字符串会出现在目前行的上一行。
p(print):打印,通常与-n一起使用。
s(replace):取代,例如:1,20s/old/new/g(g取代所有,p取代一次)
nl /etc/passwd | sed '2,5d'删除2-5行。
nl /etc/passwd | sed '2a fuck'在第2行后面增加内容为fuck的一行。
nl /etc/passwd | sed '2i fuck'在第2行前面增加内容为fuck的一行。
nl /etc/passwd | sed '2,5c No-2-5 lines'用后面内容取代2-5行。
nl /etc/passwd | sed -n -p '10-15p'打印20-15行。不加-n的话,2-5行会重复输出。
利用sed取出IP地址:
ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/ Bcast.*//g'
awk基础
以行为单位处理,倾向于一行中分成若干个字段处理,默认字段分割符为“tab”或“空格”。
比如取last登入的用户名和IP:
last -n 5 | awk '{print $1 " " $3}'
awk处理流程:
1.读入第一行,并将第一行的资料填入$0、$1、$2....等中。
2.依据条件的限制,判断是否进行后面的动作。
awk以字段为最小的处理单位。
awk内建变量:
NF:每一行($0)拥有的字段总数。
NR:目前awk所处理的是第几行数据。
FS:目前的分隔符,默认是空格。
注意:awk在print打印非变量数据时,要加上双引号。
比如:
[ root@localhost]# last -n 3 | awk '{print $1 " lines:"NR " columes:" NF}'
root lines:1 columes:10
root lines:2 columes:10
root lines:3 columes:10
awk的逻辑运算字符举例:
cat /etc/passwd | sort -n -t ":" -k3 | awk '{FS=":"} $3 > 50 {print $1 " " $3}'
不过我们发现第一行并没有经过awk处理就输出了。我们可以使用BEGIN这个关键词:
cat /etc/passwd | awk 'BEGIN{FS=":"} $3 > 50{print $1 " " $3}'
当大括号内使用printf时就必须按照C个数输出了%10s、%10d。并且结尾使用 进行分行。
另外一个例子:
cat a.log | awk 'NR >=2 {printf "%10s %10s %10s %10s ",$1,$2,$3,$4,totoal}'
diff档案对比:以行为单位对比
-b:忽略一行中多个空白的差异。
-i:忽略大小写。
-B:忽略空白行的差异。
9月9号。2:25
查看superblock:dumpe2fs -h /dev/sda1
磁盘分区:fdisk
磁盘格式化:mkfs -t ext3 /dev/sda1
磁盘检查:fsck -C -t ext3 /dev/sda1 这个命令呼叫的是e2fsck这个软件。
检查磁盘坏轨:badblocks
设置系统标头:e2label
挂载:mount -a -l 我们要挂载光盘:mount -t iso9660 /dev/cdrom /media/cdrom
挂载的时候还可以使用-o指定挂载后的权限。
卸载装置:umount -f(强制)+装置或者目录
Linux下所有的装置都以档案来替代,反过来档案以major(主要装置代码)和minor(次要装置代码)的
数值来代表装置。
如果我们想开机挂载的话需要修改:/etc/fstab。
swap分区的功能是应付物理内存不足的情况。
free来查看内存的使用量:free | grep -n "Mem:" | awk '{print $4}' 同时也可以查看交换分区的使用情况
。
关掉swap文件:swapoff /tmp/swap
对硬盘的sda1的第一个分区进行备份:dd if=/dev/sda1 of=/uestc/mbr bs=512 count=1
superblock大小为1kb
ls -l第一行的total为该目录消耗的总block大小,这个我们可以通过ll -s来详细观察目录下每个文件及目录
的block节点的使用情况。
查看目录消耗的容量:du -sb /etc/ 以字节显示;du -sm /dev/以兆显示
linux常见压缩扩展名即命令:
*.Z compress uncompress 注意压缩源文件会被删除,保留用-c
例如:compress -c /etc/passwd > /uestc/passwd.backup.Z
*.gz gzip
目前gzip可以解压compress,zip,gzip等软件压缩的档案。
gzip -#用于指定压缩比,-9最大,-1压缩最快,默认为-6,注意压缩的时候会删除源文档,想要保留:
gzip -9 -c /etc/passwd > /etc/uestc/passwd.gz。这个可以利用-v选项查看压缩文件的压缩比。
解压缩用:gzip -d 。查看压缩后文件的内容:zcat。
*.bz2 bzip2
这个使用情况同gzip,查看压缩文档的内容用:bzcat
*.tar tar
*.tar.gz tar -zcvf打包压缩,解包解压缩:tar -zxvf
*.tar.bz2 tar-jcvf打包压缩,解包解压缩:tar -jxvf
打包的时候,将特殊的档案或目录移除在打包之列:--exclude="file"
比如:tar -jcvf /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc
/root
tarfile 仅仅打包。
tarball 打包+压缩
dump备份,dump 0是完全备份,dump 1是仅对dump 0数据变化的部分进行备份,一次类推。
dump -S /dev/sda1显示出dump备份需要多少容量
dump -W 显示出被dump备份过的文档。
比如对/boot施行dump 0备份:dump -0u -f /uestc/boot.dump.0 /boot
如果我们想对备份dump包施行压缩的话:dump -0u -j -f /uestc/boot.dump.0 /boot
对dump备份恢复:restore
restore -t用于观察备份文件的内容,类似于tar -t。例如:restore -t -f /uestc/boot.dump.0
类似的还有mkisofs建立光盘镜像,cdrecord:光盘刻录工具。
cpio可以备份任何东西,不过cpio不会主动去找档案来备份,我们可以用find命令去寻找。
备份:find /boot | cpio -ovcB > file(find默认 -print,即打印出找到的内容)
还原:cpio -ivcdu < file
查看:cpio -ivct < file
vim常用
aAoOiIrR
跳到指定行:nG或者:n
跳到第一行:gg
跳到最后一行:G
搜索关键字:/word
光标上面搜索第一个关键字:?word
继续搜索下一个关键字:n 配合/word
继续搜索上一个关键字:N 配合?word
搜索指定行替换所有:/1,ns/word1/word2/gc(c代表替换前需要确认)
向后删除n个字符:nx
删除或剪切光标所在行:dd
删除或剪切光标所在行向下n行:ndd
删除光标所在行到行末:dG
删除改行最前面的字符:d0 类似删除改行最后一个字符:d$
复制光标所在行:yy
复制光标所在行向下:n行
类似的还有yG、Y0、Y$
在光标所在行下一行粘贴:p
在光标所在行上一行粘贴:P
撤销:u
重复上一个动作[Ctrl]+r或者使用“.”(没错是小数点)
:wq、:q、:q!、:w、:w!
将编辑的数据另存为:w filename
在编辑的数据中,读入另一个档案,并将内容加到光标所在行的后面:r filename
暂时离开vim到指令模式执行命令::!commond
设置行号:set nu
取消行号:set nonu
ab mymail danbocn@gmail.com AB替换
利用映射定义快捷键:map T :q! 这样按下T就是强制退出vim的意思。
当系统宕机后,导致我们正在编辑的文本无法按正常流程关闭,此时我们需要重新编辑的时候系统提醒有
人已经在编辑,我们可以通过删除指定文本的.swp后缀文件,通过ls -al查看。
vim的配置文件在:/etc/vimrc,这个不建议修改,不过你可以修改处在家目录下的~/.vimrc
我们使用cat -A发现win下的行末为:^M$,而Linux行末为:$。我们可以使用dos2unix和unix2dos互相
转换。-k保留修订时间不变。
wget+网址:直接下载网址内的程序。
语系转换:iconv -f big5 -t utf8 passwd -o passwd.1(-f from, -t to, -o 保留源文件)
Shell,这个专门看一本书
当你使用login接口登入系统时,系统做了一下处理:
1.寻找/etc/passwd里面有没有你要输入的账号,有的话将对应的UID和GID(在/etc/group中)读出来,
并读出家目录与Shell设定。
2.然后核对密码,Linux会进入/etc/shadow里面对应的UID。
3.一切ok的话,进入Shell接管系统。
当root密码忘记的时候:通过Live CD开机后挂载根目录去修改/etc/shadow,将里面root密码字段清空。
重启后root将不用密码即可登录。
有效群组(当前用户所处的群组)和初始群组(这个群ID位于/etc/passwd中,而有效群组位
于/etc/group中群组后面)
观察当前用户所属的有效组:groups
切换用户群组:newgrp
将用户加入群组中:root管理员:usermod;组管理员:gpasswd
新增加用户:useradd,相关配置文件,passwd,usermod,userdel
useradd的默认参考文件:useradd -D(呼叫的源文件位于:/etc/default/useradd)
而UID和GID密码参数在:/etc/login.defs
总结:useradd建立账号时,会参考以下文件:
/etc/default/useradd
/etc/login.defs
/etc/skel/*(家目录参考的基准目录)
passwd +用户 进行修改密码
使用标准输入来修改密码:echo "abc123456" | passwd --stdin root
查看命令帮助文档:man 1 passwd 查看配置文件帮助文档:man 5 passwd
让某个用户失效:passwd -l danbo,解锁某个用户:passwd -S danbo
更加详细的密码设定:chage,比如:查看某个账号的详细密码参数:chage -l root。这个主要是修
改/etc/shadow文件。
修改/etc/passwd文件的:usermod
删除用户:userdel
查看用户相关信息:finger
增加用户账户的额外信息,比如姓名、办公室、电话等:chfn(change finger)
改变用户shell:chsh
无论是chfn和chsh都是修改/etc/passwd文件
与用户组相关的命令:
增加组:groupadd
改变组:groupmod
删除组:groupdel
创建群组管理员:gpasswd -A danbo groupname 这个是将danbo设为群组的管理员。
gpasswd -M user1 groupname 这个是将user1加入到groupname组中。
getfacl:取得某个档案/目录的ACL设定;
setfacl:设定某个档案/目录的ACL规范。
切换用户su -(“-”一定要加,否则不会改变用户环境变量)
sudo -u danbo touch /uestc/haah
以danbo用户创建文件。
用户能否执行sudo主要看/etc/sudoers的设定,使用visudo进行编辑。
sudo命令可以是非root用户在以root的身份去执行命令。
查看此时计算机的使用者:w who last lastlog(每个账户最近的登录时间)
使用者交谈:write mesg wall write+somebody(ctrl+d结束)
发送邮件:mail danbo -s “nice to meet you” < filename(也可通过重定向导入事先写好的文本)
接收邮件同样使用mail,然后进入邮件后输入?查看更多命令。
pwck:检查/etc/passwd配置是否正确。
pwconv:
crontabl 计划任务
linux工作安排种类:at和cron
at:处理仅执行一次就结束安排的指令,比如我们要指定某个任务在指定时间内运行一次,那么就会把任
务放到/var/spool/at目录内,到指定时间就运行一次。(at time)
比如我们要执行一个脚本:
at 3:00 tomorrow
at > /var/spool/at
at > Ctrl+D
at中的时间使用方法:
at now + 5 minutes任务在5分钟后运行
at now + 1 hour 任务在1小时后运行
at now + 3 days 任务在3天后运行
at now + 2 weeks 任务在两周后运行
at midnight 任务在午夜运行
at 10:30pm 任务在晚上10点30分
之前一定要确保atd服务处于启动状态:service atd start|status
编辑/var/spool/at目录内
另外还有一个batch命令,这个是在CPU工作负载小于0.8时进行指令的下达。
crontab
首先确认这个服务启动状态:
service crond start|stop|restart|reload|status
也可以在系统启动的时候就启动,编辑:/etc/rc.d/rc.local末尾加上:/sbin/service crond start
必须记住以下几个:
crontab -u username #指定编辑某个用户的crontab,只有root才能使用这个命令
crontab -e #编辑crontab的工作内容
crontab -r #移除所有的crontab内容
crontab -l #查阅crontab的内容
基本格式:
* * * * * command
分钟 小时(24) 天 月 星期 cmd #周日可以是0或7
辅助字符:
*:代表任意时刻都
,:代表分割时段
-:代表一段时间范围内
/n:每隔n单位间隔。
下面举一些实例:
注意后面的额command也可以包含多个指令(每个指令用;分割)
例如:每天造成3点20执行用户目录下的两个指令:
20 3 * * * * (/bin/rm -rf /tmp;/bin/uptime)
注意cron服务最低侦测间隔为分钟。
当我们配置完crontab之后,我们必须重启crond服务才能使其生效(针对unix,linux会自动执行):
service crond restart 或者 /etc/init.d/crond restart
cat /etc/crontab #这个是系统的crontab,注意与用户的crontab不相同,这里需要指定执行者。
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
SHELL=/bin/bash #使用哪个shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #执行文件搜索路径
MAILTO=root #执行例行工作发生错误将错误指令发给谁。我们也可以以邮件形式发给执行邮件:
MAILTO= danbo@gmail.com
HOME=/
01 * * * * root run-parts /etc/cron.hourly:
run-parts实际上是个脚本,后面接目录,也就是说,如果你想让系统每小时主动帮你执行某个指令,将
该指令写入脚本中,并将该脚本放入到/etc/corn.hourly/目录下的意思。
crontab优化:注意将不同计划任务执行时间尽量隔开;并不需要输出信息的结果导入到/dev/null中;周
和日月不能同时使用;
另外还有一个指令比较有用:anacron,当我们的机器没有24*7运行时,比如周末机器会停机一天,可能
在停机期间会有没有执行的crontab任务,那么利用anacron在机器开机后进行执行crontab,它会读取时
间记录(timestamps)了解到系统什么时候关机,然后分析现在与关机之前anacron之间的差异,就会发
现没有执行的crontab了,然后就会执行之前没有执lrontab。
操作系统总结:
程序与进程的区别:
程序只是一组指令的有序组合,是一个静态的实体。
进程是一个动态的实体,有自己的生命周期。
Linux的进程状态:
可运行态(Running 0,R):只有该状态才能在CPU上运行。
可中断的等待(Interruptible 1,S):处于这个状态的进程因为等待某个事件的发生而被挂起,通过ps命
令绝大多数进程都处于Interruptible状态。
不可中断的等待(Uninterruptible 2,D):与S态类似,只是此时的进程是不可中断的,包括利用kill -9
也无法杀死这个进程。
暂停态或者跟踪态(Stopped,Traced 4):工作在背景(暂停)或者处于排错(Traced)状态。
僵死状态(Zomble 3,Z):程序已经终止但却无法从内存中移除,子进程终止,父进程却不知道。
子程序与父程序
当我们登入系统后会取得一个Shell,然后我们利用这个Shell提供的接口去执行另外一个指令,另外执行
的指令也有一个PID,那么后来执行的那个指令的PID就是子程序了,而原本的Shell就是父程序了。
将程序置于背景下执行:cp file1 file2 &,此时bash会给予这个指令的工作号码(job number)+PID此
时要注意导出的信息,我们最好加上> /dev/null 2>&1
我们也可以将目前的工作目录丢到后台去执行:按下ctrl+z。注意:使用ctrl+z丢到背景都是暂停状态
观察背景工作状态:jobs -r(列出处于运行态的工作)-s(列出处于暂停的工作)-l(列出所有)
将后台工作拿到前台:fg %n
我们知道ctrl+z将目前工作丢到后台中并暂停,那么如果让其工作呢?使用:bg %n
关掉后台工作:kill
后台指的是:避免在终端下按下ctrl+c中断执行过程。
而前面讲到的at是将工作放到后台执行,这个与终端无关,也可以使用nohop,这个可以让你在脱机或注
销状态下仍可以运行。
nohup cmd (&)加上&带包在后台执行,如果你想让在后台的工作在你注销后还能够继续执行,就使用
nohup+&组合。
程序
观察系统所有的程序:ps(静态);top(动态);pstree(程序树之间的关系)
ps -l:只查看自己bash的程序;
ps aux:查看所有系统运作的程序。
当使用ps -l观察到一下:
F:程序的flag:4代表此程序的权限为root;1代表此程序仅进行复制(fork),而没有实际执行(exec)
。
PRI/NI:表示执行优先级,数字越小越优先。
PID和PPID:进程号和父进程号。
top -d 3 >/uestc/top.log 也可以将top输出的信息导出到top.log文档中
查看自己bash的PID:echo $$,然后通过top观察此PID:top -d 3 -p 13000
tty是本机登录。
pts/0默认是从ssh网络登录
使用pstree时,我们观察到所有程序都依附于init这个程序下,使用pstree -p观察到init的PID是1,因为
init是Linux内核启动的第一个程序,而重启init也就意味着重启系统了(reboot)。
终止某进程:killall -9 httpd,其中9表示sigkill:代表强制中断一个程序的进行。
而kill后面必须要跟PID或者job n服务区如:kill -9 %1)才行,跟服务名称就需要用到killall了。
pgrep +服务区例如:pgrep ssh这样就可以找到相应服务区的PID
执行优先级:
PRI(new)=PRI(old)
nice可调整的范围:-20~19,而一般用户调节的范围为0~19(防止一般用户抢占资源)
用法:
nice -n +nice值 cmd:以新的nice值执行命令cmd(例如:nice -n -9 ps)
renice n PID:调整一个已经存在的程序的优先级。
free:观察内存使用情况,包括物理内存和虚拟内存(Swap)
cache与buffer的区别:
cache:缓存区,是高速缓存,位于CPU与主内存之间的容量较小但是速度很快的存储器,Cache主要保
存CPU刚用过的数据,减少CPU等待时间。
buffer:缓冲区,用于存储速度不同步的设备或优先级不同的设备之间的数据传输,减少进程间通信的等
待时间。
查看系统内核相关信息:uname -a
查看系统启动时间与工作负载(即top的第一行):uptime
查看网络:netstat -tunlp(tcp,udp,以端口号显示而不是服务名,处于侦听,PID)
分析核心产生的信息:dmesg |more,比如查看网卡的信息:dmesg | grep -i eth
侦测系统资源变化:vmstat
内存中的所有数据都是写入到/proc这个目录当中,并且是以PID进行分目录存储的
fuser -k /dev/pts/0:强制清除掉某个用户,可以通过w来查看
或者使用:fuser -k /mnt/cdrom 或者使用umount
fuser还可以找到那个程序在利用该档案,比如当我们卸载的时候发现device is busy,我们可以通过fuser
查看那个程序在利用该档案,例如:找到使用/proc的程序:fuser -mvu /proc
我们知道fuser是知道装置或目录找到使用其的程序,而知道程序如何知道其使用了哪些文件或装置呢,这
个就需要:lsof,例如:lsof -u root
查看SELinux状态:getenforce
关闭SELinux:临时:setenforce 0;永久:修改/etc/selinux/config,将SELINUX=enforcing改为
SELINUX=disabled,重启即可。
开启SELinux:setenforce 1
守护进程deamon与服务service
系统为了某功能必须要提供一些服务service;但是service的提供总需要程序来支持吧,我成称这个程序
为daemon。
daemon可以分为两类:
1.stand alone:可以自行单独启动服务,个别窗口负责单一的服务。
2.super daemon:同一窗口负责各种业务(xinetd)
跟service相关的目录和文件:
/etc/rc.d/init.d包含所有service的控制脚本。
/etc/rc.d/rc*.d包含所有service自启动选项配置。
/etc/sysconfg/*各服务的初始化配置文件。
/etc/*各服务各自配置文件。
/var/lib/*各服务数据库。
例如:
重启某服务:service crond restart或者/etc/init.d/crond restart这个是/etc/rc.d/init.d/的软链接。
观察某服务:netstat
Linux启动过程:
1. 打开电源,加载BIOS开机自检。
2. 透过BIOS找到启动盘,读取MBR的bootloader。(Linux主流的为grub,包括两个stage,stage1为执
行bootloader的主程序;stage2:主程序加载位于/boot底下的配置文件。menu.lst提供选单)
3. 透过Bootloader取得内核并加载。
4. 内核启动init进程。
5. init 程序开始执行系统初始化 (/etc/rc.d/rc.sysinit)
6. 依据 init 的设定加载 (/etc/rc.d/rc[0-6].d/*)
7. 加载本机设定 (/etc/rc.d/rc.local,用户自定义开机启动程序,只要将脚本放到/etc/rc.d/rc.local/目
录内开机就会执行。)
管理系统服务开机启动:chkconfig
chkconfig --list +服务名
chkconfig --level(0123456) 服务名 on|off
比如关闭httpd自启动:chkconfig --234 httpd off
然后观察状态看是否关闭:/etc/init.d/httpd status或者service httpd status
图像话管理工具:ntsysv
init加载主要流程如下:
1.init处理系统初始化流程/etc/rc.d/rc.sysinit,主要目的是在开始加载系统各项服务前,做好整个系统环
境,主要就是利用rc.sysinit这个脚本。
2.系统根据/etc/inittab设定选择启动级别,启动位于相应目录内的启动服务/etc/rc.d/rc*.d/与启动配置
文件/etc/sysconfig。
3.然后启动用户自定义开机启动程序/etc/rc.d/rc.local。
第3步透过bootloader加载系统核心和核心模块,核心位于:/boot/vmlinuz,而核心是压缩的,解压缩需
要RAM Disk/boot/initrd,作用:在没有挂载/之前,系统需要先挂载磁盘驱动,于是就把initrd加载到内
存中,虚拟出“/”,然后完成vmlinuz核心模块的加载。
核心模块:/lib/modules/$(uname -r)/kernel,通过lsmod查看加载了哪些模块。
利用modinfo可以查看模块详细信息。
安装模块:insmod,移除模块:rmmod
修改模块的额外参数设定:/etc/modprobe.conf
当核心加载完成后那么就会在内存中记录:/proc/kernel
grub
安装在mbr的grub主程序,最重要的任务就是从磁盘加载核心文件,以便让核心能够顺利驱动整个硬件。
grub识别硬盘的如:(hd0,0),第一个0表示搜索第一个硬盘,第二个0表示搜索硬盘的第一个分区。
忘记root密码:
1.重启
2.进入grub(在选单界面按e,然后在要kernel那一行按e,在行尾输入single,回车后进入单用户模式)
3.此时系统会以root的权限给你一个shell,然后直接passwd修改密码即可,之后init 3进入字符模式。
在Red Hat系列Linux中都提供了系统设定工具:setup。我们可以利用这个综合管理系统。
提供密码验证的服务器有NIS、LDAP
网卡配置:1.透过setup。2.编辑/etc/sysconfig/network-script/ifcfg-eth0
编辑DNS服务器:vim /etc/resolv.conf
重启网卡配置:/etc/init.d/network restart
防火墙配置:1.透过setup。2.编辑/etc/sysconfig/iptables
硬件信息的收集:
/proc/cpuinfo;/proc/partitions;/proc/interrupts
vmstat:分析系统(CPU、RAM、IO)目前的状态,分析IO也可以用iostat
软件安装
Linux系统中可执行的文件都是二进制文件(binary program),而Shell Scripts其实也是利用shell这个程
序(例如bash)来执行的呢。
可执行问阿金的编写过程:
1.写程序,也就是源代码,其实就是纯文本文件。
2.编译,就是将源代码编译成系统能看懂的二进制代码咯,而此时需要专门的编译程序(例如gcc,利用
已存在的库函数编译C语言写出的源代码)来处理,经过编译与连结之后,就是可执行的二进制程序了。
事实上在编译的过程中还产生了目标文件(Object file),然后在引用外部子程序或者加入函数库,将程
序代码与函数库连结(Link)之后才能执行。
make过程:
当执行make时,make首先会在当前目录搜索Makefile这个文本文件,Makefile记录而来源代码该如何编
译的详细信息,而Makefile则是利用configure侦测程序去检测用户具体的系统环境(比如系统版本,内核
,是否安装了相应的编译器等)建立的。
我们在安装源码包要看说明文档:README或者INSTALL
源码包的安装过程:
1../configure
2.make clean(可以没有,作用:去除当前目录中不是本次编译过的额目标档案。)
3.make
4.make install
建议安装在:/usr/local目录下,而源码包建议存储在:/usr/local/src
不过都安装在/usr/local/目录下的话以后不好删除,建议单独在/usr/local/目录下建立一个以程序名命名
的文件夹,这样以后删除直接删除相应文件夹即可。不过这样环境变量就没有相应的记录了,我们在执行
时就必须要附加绝对路径,因此我们可以将相应目录加入到PATH里面。
软件包校验:
md5sum/sh1sum
用法:md5sum +安装包,然后与官网提供给的md5值比较。
Linux两大主流:RPM和DPKG
rpm使用指令rpm,在线安装yum。
dpkg使用指令dpkg,在先安装apt-get
rpm安装命令:
rpm -i 安装;-v(verbose)显示安装详细信息;-h(hash)以哈希显示安全过程。
rpm -ivh +安装包
rpm常用选项:
--nodeps:忽略安装包的依赖性强制安装。
--test:测试安装,是否有依赖问题。
--prefix:自定义目录,而非默认目录/bin,/etc等
--force:暴力安装,不管之前是否已经安装过了。重复安装(--replacepkgs),覆盖安装比如要安装
的软件包比已安装的旧(--replacefiles)
rpm -Uvh 安装包:升级安装,如果没有安装则执行安装过程。
rpm -Fuh 安装包:仅执行升级安装,如果没有安装,则不安装。
rpm -e 安装包:卸载rpm包。
rpm -qa:查询已安装的软件。
rpm -qf:查询已安装的文件属于哪个安装包。
rpm -qi:查询已安装软件包的信息,比如作用,版本什么的,未安装加上-p
rpm -ql:查询已安装软件包安装了哪些文件,未安装加上-p
rpm -V:校验软件包,如果正确没提示,可以根据返回值来确认哪些改变了,5:md5;S:大小改变
从rpm包中提取所需要的文件:
首先将rpm包转化为cpio:rpm2cipo
然后通过管道|提出文件: rpm2cipo bind.x86_64 | cpio -idv +指定文件到当前目录
还可以通过数字签名的方式来验证。
yum:自动解决rpm包的依赖关系
yum -y install 安装
yum -y update 升级
yum list 查询安装包
yum info 软件包信息
yum remove 卸载
修改yum源,一般直接复制163yum源到/etc/yum.repos.d/CentOS-Base.repo
Linux备份
备份工具:tar、cpio、dd、dump
推荐备份的目录:
/boot
/etc
/home
/root
/usr/local
/var
dd备份:dd读取的是扇区,并且读取速度慢。
dd if=/dev/sda1 of=/dev/sda2
cpio备份:find / -print | cpio -covB >/dev/sda2
还原:cpio -iduv < /dev/sda2
dump完整备份:dump -0u -f /backupdata/home.dump /home
第一次增量备份:dump -1u -f /backupdata/home.dump.1 /home
tar完整备份:tar --exclude /proc --exclude /mnt --exclude /tmp -jcvf
/backupdata/system.tar.bz2 /
cp -a也可以进行备份。
增量备份(差异备份):tar
tar -N '2015-09-04' -jcvf /backupdata/home.tar.bz2 /home只有比20150904更新的文档才备份
也可以透过rsync进行镜像备份:rsync -av 来源目录 目标目录。
第一次备份完毕后,在此进行备份时就是增量备份。
Shell脚本学习
/etc/profile:初始化系统全局Shell变量。
/etc/bashrc:定义Shell函数和别名的系统全局定义。
~/.bash_profile:用户个人环境。
~/.bashrc:用户个人的别名及变量设置文件
source或者. 将自定义变量导出到环境变量。
fork系统调用:
Linux系统通过fork系统调用创建进程。fork系统调用创建调用进程的副本即为子进程。子进程与父进程共
享一个CPU,并且子进程继承父进程的环境变量。
wait系统调用:
子进程执行阶段,父进程处于等待状态,此时wait一直保持待机状态,当1个子进程终止。执行wait终止
子进程,返回子进程的PID。若在子进程终止前父进程挂了,那么子进程就成了孤儿进程,所以wait进程
不仅让父进程处于等待状态,也可以终止进程。
exit系统调用:
执行exit终止子进程,并且返回sigchild信号,0为成功,非0失败。使用echo $?查看。
所有Shell都可以使用的变量称为全局变量或环境变量,使用env或者printenv查看。
局部变量只能用于当前Shell,利用set查看系统所有变量(全局和局部)
删除变量 unset VAR
显示变量:echo $VAR或者echo ${VAR}
局部变量转化为全局变量:exprot VAR="fuck"或者declare -x VAR="fuck"
注意:当export在shell脚本内使用时,一旦shell脚本执行结束,变量也会消失。
注意一下参数变量:
$*
$@
$?
$#
$!:最后运行后台进程的PID,而连续两个!!则是运行history最后执行的命令,等于!-1。
或者是!+关键字第一个字母,这个是运行最近的第一个字母是前面输入的那条命令。
$_:最后运行命令的最后一个参数
$0:shell脚本的全名,在脚本中echo $0等于basename $0
$$:当前Shell的PID。例如ps aux | grep bash 显示的PID等于此时echo $$的PID
读入变量read VAR1 VAR2,或者是read -p "Plead input an integer: " a
shift将参数左移。
替换命令``,例如:now=`date`;echo $now
整数的计算:expr 10 + 110 注意,运算符号两边必须有空格,两边可以为数字,也可以是变量。
Shell条件语句
if 命令
then **
elif
fi
case i in
模式1)
语句
;;
模式2)
语句
;;
esac
循环语句
for i in "@*"
do
echo $i
done
文件测试:test -f /etc/passwd ;或者[ -f /etc/passwd ],返回0为真,返回1为假。注意exit返回结果
0为真,非零为假。
-f:文件存在
-d:目录存在
-s:文件存在且为非空
-e:文件存在即为真
-r:可读
-w:可写
-x:可执行
-L:文件为软链接
函数
function() {
echo "***"
echo "***"
}
调用函数直接在要调用的位置协商函数名即可。
增加目录到PATH中:PATH=$PATH:***
通过kill -l可以查看所有的信号变量,最常用的就是-9SIGKILL
定义别名:alias mv='mv -i',删除用:unalias命令
如果我们想让别名永久生效可以将其写入到~/.bashrc文件当中,之后导出source ~/.bashrc
[]检索字符范围,例如:file[1-3]
{},当中使用,可以检索多个,例如:file{ile?,oo}
..上级目录
-上一个目录
declare命令
-a:声明变量为数组
-i:声明整数变量
-r:声明只读变量
-x:声明环境变量,declare -x等于export
type用于显示命令的类型:别名、内建等等
file用于识别文件的类型:b、c、d等等
变量扩展修饰:
${var:-word}:若变量var为空,则返回word。
${var:=word}:若变量var为空,则将变量设置为word并返回word
${var:?word}:若变量var为空,则将显示var:word
${var:+word}:若变量var存在,则返回word,否则返回null,常用语测试变量是否存在。
${var#pattern}:从前匹配最短删除。
${var##pattern}:从前匹配最长删除。
${var%pattern}:从后匹配最短删除。
${var%%pattern}:从后匹配最长删除。
${var:offset}:提取含有offset关键字的字符串。
${var:offset:length}:从offset开始之后提取长度为length的字符,例如:var="12345";echo
${var:2:2};34
${var/substring/newstring}:使用newstring代替var中的第一个substring。
${var//substring/newstring}:使用newstring代替var中的所有substring。
${#var}:返回变量var的长度。
${var}:返回变量的内容,推荐这样写。$var这样也可以。
$1、$2、...$(n),返回第n个位置的参数。$1-$9返回第1-9个参数。$0:当前shell脚本的名称。
$():括号内为命令组合。
``:``内命令执行完毕后返回。
'':单引号内命令原样输出。
数值计算:
$[]或者$(())
定义数组:
declare -a numbers=(11 22 33 44 55)
echo ${numbers[2]}
22
echo ${#numbers[@]}
sort
grep
awk
sed
uniq
grep详解
将匹配的行打印出来
常用选项
-c(count):值输出匹配行的数目
-i(ignore-case):不区分大小写
-n:输出匹配行和行号
-v:反选匹配文本的行
-An:after:除了列出该行外,后续的n行也列出来。
-Bn:before:除了列出改行外,前面n行业列出来。
使用扩展正则表达式:grep -E或者egrep
比如:去掉空行和注释行:
egrep -v '^$|^#' /etc/passwd
cut详解
-d:指定分割符。
-f:依据-d指定的分隔符分割的数段,利用-f去除第几段,当截取多个段的时候,中间用,号隔开。
-c:以字符单位去除固定字符区间。注意在linux中tab键默认是8个空格。
截取多段,1,3,4。
截取4-15段,cut -d ":" -f4-15,对于-c截取字符同样适用。
sort基础
-f(ignore-case):忽略大小写
-b(ignore-leading-blanks):忽略开头的空格
-n(numeric-sort):以纯数字进行排序(默认以文本排序,数字的话以第一个数字为准。)
-r(reverse):反向排序。
-u(uniq):相同的数据中,仅出现一行。
-t(field-separator):指定分隔符,默认是以tab键来分割。
-k(key):以哪个field进行排序。
uniq基础
-i:忽略大小写
-c:进行计数
wc基础
-w(word):字数
-m(character):字符数
-c(bytes):字节数
-l(lines):行数
wc默认输出行数、字数、字符数
tee基础
双向重导向
-a(append):以累加方式加入到数据file当中。
例如:last | tee -a file.log | more
tr基础
-d:删除匹配的字符
-s(squeeze-repeats):删掉重复的字符。
例如:小写转大写:tr '[a-z]' '[A-Z]' 注意只能用管道字符,这个后面不能直接跟文件。
删除字符:cat /etc/passwd | tr ':' -d
我们知道在dos下会在每行行尾加上"^M"这个断行符
col基础
-x:将tab键转换成对等的空格键盘。
sed基础
选项:
-n(silent):使用安静模式,仅输出sed处理的行。
-f(file):将sed动作写在后面的文本内。
-r(regexp-extended):支持扩展正则表达式。
-i:直接修改读取的文本,而不是输出。
范围:
n1,n2
动作:
a(apped):新增,a后面接字符串,这些字符串会出现在目前行的下一行。
c(replace):取代,c后面接字符串,这些字符串可以取代n1,n2之间的行。
d(delect):删除
i(incert):插入,i后面接字符串,这些字符串会出现在目前行的上一行。
p(print):打印,通常与-n一起使用。
s(replace):取代,例如:1,20s/old/new/g(g取代所有,p取代一次)
nl /etc/passwd | sed '2,5d'删除2-5行。
nl /etc/passwd | sed '2a fuck'在第2行后面增加内容为fuck的一行。
nl /etc/passwd | sed '2i fuck'在第2行前面增加内容为fuck的一行。
nl /etc/passwd | sed '2,5c No-2-5 lines'用后面内容取代2-5行。
nl /etc/passwd | sed -n -p '10-15p'打印20-15行。不加-n的话,2-5行会重复输出。
利用sed取出IP地址:
ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/ Bcast.*//g'
awk基础
以行为单位处理,倾向于一行中分成若干个字段处理,默认字段分割符为“tab”或“空格”。
比如取last登入的用户名和IP:
last -n 5 | awk '{print $1 " " $3}'
awk处理流程:
1.读入第一行,并将第一行的资料填入$0、$1、$2....等中。
2.依据条件的限制,判断是否进行后面的动作。
awk以字段为最小的处理单位。
awk内建变量:
NF:每一行($0)拥有的字段总数。
NR:目前awk所处理的是第几行数据。
FS:目前的分隔符,默认是空格。
注意:awk在print打印非变量数据时,要加上双引号。
比如:
[ root@localhost]# last -n 3 | awk '{print $1 " lines:"NR " columes:" NF}'
root lines:1 columes:10
root lines:2 columes:10
root lines:3 columes:10
awk的逻辑运算字符举例:
cat /etc/passwd | sort -n -t ":" -k3 | awk '{FS=":"} $3 > 50 {print $1 " " $3}'
不过我们发现第一行并没有经过awk处理就输出了。我们可以使用BEGIN这个关键词:
cat /etc/passwd | awk 'BEGIN{FS=":"} $3 > 50{print $1 " " $3}'
当大括号内使用printf时就必须按照C个数输出了%10s、%10d。并且结尾使用 进行分行。
另外一个例子:
cat a.log | awk 'NR >=2 {printf "%10s %10s %10s %10s ",$1,$2,$3,$4,totoal}'
diff档案对比:以行为单位对比
-b:忽略一行中多个空白的差异。
-i:忽略大小写。
-B:忽略空白行的差异。
LVS三种模式简介
IP虚拟服务器软件IPVS
IPVS软件中的三种IP负载均衡技术。
1.Virtual Server via NAT
通过网络地址转换,调度器重写请求报文的目的地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的相应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
2.Virtual Server via IP Tunneling
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将相应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大得多,采用VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。
3.Virtual Server via Direct Routing(VS/DR)
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。这种方法没有IP隧道的开销,但是要求调度器与真实服务器处在同一物理网段上。
LVS算法
1.轮叫(Round Robin)
调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
2.加权轮叫(Weighted Round Robin)
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更过的访问流量。调度器可以自动问询真实服务器的负载请求,并动态调整其权值。
3.最少链接(Least Connections)
调度器通过“最少连接”调度算法动态地将网络请求调度到已建立连接数最少的服务器上。如果集群系统的真实服务器具有相似的系统性能,采用最小连接算法可以较好地均衡负载。系统默认。
4.加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动询问负载情况,并动态地调整其权值。
5.基于局部性的最少连接(Locality-Based Least Connections)
“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载,则用“最少链接”方式。
6.
7.目标地址散列(Destination Hashing)
根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
8.源地址散列(Source Hashing)
根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表中找出对应的服务器,若该服务器是可用的且为超载,将请求发送到该服务器,否则返回空。
LVS集群体系结构
负载调度器(Load Balancer),它是整个集群对外的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务器是来自一个IP地址(虚拟IP)上的。
服务器池(Server Pool),是一组真正执行客户请求的服务器,执行的服务器有WEB、MAIL、FTP、DNS
共享存储(Shared Storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。
常见的硬件负载均衡厂商:F5的BIGIP、Radware的AppDirector。国内的有深信服的AD
DNS基础精简版
DNS中记录类型有哪些:(网易互联网二面问了这一题)
1.A记录:就是主机名对应的IP地址的记录。
2.NS记录:指定本域的ns地址。
3.MX记录:Mail eXchanger,邮件交换器,用于记录邮件服务器对应的域名地址,并且这个记录是有优先级的(0-99,并且数字越小越优先)
4.CNAME记录:别名记录,记录类型为:x cname y
5.PTR记录:指针记录,将IP地址转化为域名
6.SOA记录:Start of Authority(起始授权记录),用于授权这个区域的主DNS服务器和管理邮件地址等。
区域(Zone)和域(Domain)
域是一个逻辑概念,区域是一个物理概念。
比如baidu.com我们可以理解为一个域(Domain);而其对应的NS服务器:ns.baidu.com上有两个区域,正向区域和反向区域,并且正向区域和反向区域对应着不同的数据文件,区域是人为定义一个域的子域,而子域是靠某个数据文件进行管理的。因此区域和域并没有谁包含谁的关系。
子域授权(Delegation):比如将baidu.com这个域划分成tech.baidu.com和mark.baidu.com这两个子域,并且每个子域都可以授权给其相应的组织去管理,甚至也可以将子域进一步划分子域,而父域保留了子域数据来源的指针。
主辅DNS,辅助DNS的RR(资源记录)仅能从主DNS服务区同步,他们之间靠TCP进行区域传送,区域传送分为:完全区域传送(all zone transfer,axfr)和增量传送(incremental zone tranfer)。
DNS的主配置文件:/etc/named.conf
首先是Options{
}
这个用来定义一些影响DNS全局的环境,比如区域数据库存放的目录或者端口号等,注意每行以";"结尾。
zone "." IN{
type hint; #注意type总共有三种:master(主NS)、slave(辅NS)、hint(根NS)
file "name.ca;" #用于指定在/var/named/目录下的文件名。
};
zone "baidu.com" IN{ #定义一个域名为baidu.com的正向区域
type master;
file "baidu.com.zone"
allow-update { none; }; #这个用在辅助DNS上,用于指定Master的地址。
};
zone "0.0.140.in-addr.arpa" IN{ #定义一个IP为127.0.0.*的反向区域,注意要把区域网段的地址反写
type master;
file "named.local";
}
对于DNS来说”根“,也就是位于文件/var/named/named.ca里面默认已经配置好了,如果没有配置好,我们直接使用命令导入即可:dig -t NS . >> /var/named/named.ca
对于所有子域的数据文件必须以SOA开头:
$TTL 600 #用于全局定义本数据文件记记录的超时时间。
$ORIGIN baidu.com. #用于全局定义域名,下面只需要使用@就可以引用这个域名了。
@ IN SOA ns.baidu.com. admin.baidu.com. {
2015091301 #定义序列号
24h #定义主从NS之间数据库更新的周期,refresh
1h #重试时间,主从之间更新失败,多久重试,retry
1w #超时时间,中从服务器连续更新失败,多久超时,并删除相应记录,expiry
1h #否定缓存。本地数据库没有,告诉对方多长时间不要再次请求了,negative caching
}
baidu.com. IN NS ns.baidu.com. #NS记录,定义域所在的ns服务器地址。
ns.baidu.com. IN A 180.76.76.76 #A记录,NS后面必须跟着一个A记录,定义ns的地址。
baidu.com. IN MX 10 mail.baidu.com. #MX记录,用于知名邮件服务器的地址,并且有优先级的
www IN CNAME web #别名记录,用于定义web主机的别名,即web.baidu.com=www.baidu.com
88 IN PTR baidu.com. #反向记录。
注意A记录可以有多个,DNS在相应查询的时候会进行负载均衡。
DNS查找过程:首先是主机到Local DNS的查找,这段是递归查找
Client -> 缓存 -> /etc/hosts -> /etc/resolv.conf -> DNS Server
然后是Local DNS到域名所在NS之间的迭代查找
1.如果是Local DNS所负责的区域的话,那么首先查找数据文件,其次才是缓存(这样做是为了体现权威性)
2.如果数据库文件和缓存都找不到的话,那么就去查找根。此时是根据named.ca(也就是dig -t NS . 返回的结果,其实这个步骤在安装bind的时候系统默认就已经执行完毕了)中的A记录查询第一个FQDN返回的IP。这样查找到com.这个记录对应的IP,然后返回为Local DNS这个IP地址。
3.Local DNS向返回的这个地址查询baidu.com.这个域名,进行同样的查询知道返回www.baidu.com.这个域名对应的IP,然后返回给主机。
区域类型:
除了hint、master、slave还有forward。
这个叫做转发服务器,即当DNS服务器收到一个请求后,本地数据库和缓存都找不到,那么默认情况下会向根查找,不过这样效率有点低了,比如像ns.tech.baidu.com查找mark.baidu.com那么其完全可以在主配置文件中定义一个传送区域:
zone "baidu.com." IN {
type forward;
forwarder { 180.76.76.76 };
};
转发类型有两种:
first:即先进行转发,如果转发目标NS查不到的话再向根查找。
only:仅进行转发,如果转发目标NS查不到的话就返回空。
允许递归就以为着允许缓存,而允许缓存就会面临缓存毒化的威胁。
缓存度化:修改DNS的A记录,指向一个钓鱼网站。
默认情况下安装bind的时候也会安装caching-nameserver这个包,就相当于与配置了一台缓存服务器。
bind的管理工具:rndc(Remote Name Daemon Controller)
bind stop|status|state|reload(重新载入所有配置文件和区域数据文件)|freeze(冻结某个区域,不让其更新)|reconfig(重新载入主配置文件)|retransfer zone(让某个区域数据库重新传输)
这是一个很强大的DNS远程控制工具。其配置脚本为:/etc/rndc.conf,rndc监听的端口是953。
这个工具在安装bind时已经安装了,不过默认我们不能直接使用这个命令,我们必须经过一下处理才行:
1.使用rndc-confgen生成rndc的主配置文件。
rndc=confgen | tee /etc/rndc.conf
此时发现还是不行,出现:rndc: connect failed: 127.0.0.1#953: connection refused,出现953端口拒绝连接,这个是SELinux搞的鬼,我们在此干脆关闭SELinux得了,不过生产环境不可以。
2.关闭SELinux:setenforce 0;永久关闭/etc/selinux/config中将SELINUX=enforcing改为disabled
然后我们可以观察其主配置文件:cat /etc/rndc.conf | egrep -v '^$|^#'
key "rndc-key" {
algorithm hmac-md5;
secret "GpZvEHkq/gnzsPg/GpWkkA==";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
3.然后将/etc/rndc.conf配置文件中指定密钥复制到/etc/named.conf文件中即可。