Relative Content

K4NZDROID

category

「QoS」- 拥塞管理(Congestion Management)

解决方案
拥塞管理是指网络在发生拥塞时,针对不同类型的业务流量,如何进行管理和控制;
原理简述
拥塞管理的中心内容:当拥塞发生时如何制定一个策略,用于决定报文转发的处理次序和丢弃原则,一般采用队列技术;
管理的内容包括:报文离开队列的时间、顺序,以及各个队列之间报文离开的相互关系则由队列调度算法决定;
队列技术
将从一个接口发出的所有报文放入多个队列,按照各个队列的优先级进行处理,对报文的转发进行不同的调度处理;

调度算法
不同的队列调度算法用来解决不同的问题,并产生不同的效果;
特性特征
WIP
应用场景

在网络中,当共享同一网络的多种业务竞争相同的资源(带宽,缓冲区等)时可能会产生拥塞,高优先级业务无法得到保证。此时可以通过优先级映射的结果将报文送入不同的队列,如图所示,在设备出方向为不同的队列配置不同的调度方式,可以达到对不同业务进行差分服务的目的;
队列技术(Queue)
队列指的是在缓存中对报文进行排序的逻辑;
当流量的速率超过接口带宽(或超过为该流量设置的带宽)时,就以队列的形式,将报文暂存在缓存中;
下行队列
每个端口上都有 8 个下行队列,称为 CQ(Class Queue)队列,也叫端口队列(Port-queue); 分别为 BE、AF1、AF2、AF3、AF4、EF、CS6 和 CS7;
例如 NE20E 设备和 NE40E 设备,每个端口上都有 8 个下行队列;
注意事项、该队列技术是出现在接口(端口)上的。在 MQC 中,并没有这八个端口的概念。
调度算法
先进先出,FIFO(First In First Out)
单个队列的报文采用 FIFO 原则入队和出队;

FIFO 按报文到达接口的先后顺序让报文进入队列,在队列的出口让报文按进队的顺序出队,先进的报文将先出队,后进的报文将后出队;
优点:实现机制简单且处理速度快; 缺点:FIFO 不对报文进行分类,所以不能有差别地对待优先级不同的报文;
严格优先级,SP(Strict Priority)
SP(Strict Priority)调度就是严格按照队列优先级的高低顺序进行调度。只有高优先级队列中的报文全部调度完毕后,低优先级队列才有调度机会;

如图,假设端口有 3 个采用 SP 调度算法的队列,分别为高优先(High)队列、中优先(Medium)队列、和低优先(Low)队列,它们的优先级依次降低。其中报文编号表示报文到达顺序;
在报文出队的时候: 1)首先,让高优先队列中的报文出队并发送,直到高优先队列中的报文发送完, 2)然后,发送中优先队列中的报文,直到发送完,[……]

READ MORE

「QoS」- 拥塞管理:配置案例

TODO !!! [NETWORK] 拥塞管理配置实验;
配置基于队列的拥塞管理
WAN 接口支持 PQ,WFQ,PQ+WFQ 三种调度模式;
拥塞管理的配置思路如下:

System-view
// 创建 QoS 队列模板
qos queue-profile [queue-profile-name] // 创建队列模板;
schedule pq [queue-index] | wfq [queue-index] // 配置 WAN 接口下各队列的调度模式;
// 在接口下应用队列模板
interface [interface-type interface-num] // 进入接口视图;
qos queue-profile [queue-profile-name] // 在接口下应用队列模板;

// 检查基于队列的拥塞管理配置结果
System-view
interface [interface-type interface-num]
display this // 查看接口下绑定的队列模板;
display qos queue-profile [queue-profile-name] // 查看队列模板的配置信息;

配置 MQC 实现拥塞管理
在 MQC 中,Tfc-Clf 提供三种队列: 1)确保转发队列(AF):可以保证在网络发送的业务流量没有超过最小可确保带宽的情况下确保转发; 2)加速转发队列(EF/LLQ):匹配规则的报文进入 EF 或 LLQ 队列后,进行绝对优先级调度,仅当 EF 或 LLQ 队列中的报文调度完毕后,才会调度其他队列中的报文。当 AF 或 BE 队列有空闲带宽时,EF 队列可以对空闲带宽进行占用。LLQ 队列较 EF 队列而言,时延更低; 3)尽力而为队列(BE):未进入 AF 队列和 EF 队列的剩余报文进入 BE 队列。BE 队列使用 WFQ 算法调度;
AF 队列和 EF 队列带宽之和不得超过接口带宽的 100%; 各 AF 队列按照权重分享剩余带宽(可用带宽减去 EF 队列占用带宽后的剩余资源);
MQC 方式的拥塞管理配置思路如下:

// 配置 Traffic classifier 与 Traffic behavior
System-view
traffic classifier [classifier-name] // 创建流分类;
if-match [acl | vlan-id | …. ] // 基于流量特征匹配流量;

System-view
traffic behavio[……]

READ MORE

「QoS」- HQoS

问题描述
由于传统 QoS 只能将流分成 8 个队列进行调度控制,因此在多租户的场景下限制很大;
诸如,在家庭宽带场景下,不同的家庭可能会租用不同的网络带宽,不同的网络服务,QoS 无法精细化的管理这些家庭。传统 QoS 无租户概念,无法针对特定宽带进行管理;

传统的 QoS 基于接口进行流量调度,单个接口只能区分业务优先级,只要属于同一优先级的流量,就使用同一个端口队列,彼此之间竞争同一个队列资源。因此,传统的 QoS 无法对接口上多个用户的多个流量进行区分服务;
解决方案
HQoS 基于多级队列实现层次化调度,不仅区分了业务,也区分了用户,实现了精细化的 QoS 服务;
注意,不同设备的 HQoS 特性有一定区别,我们这里主要学习 CPE(AR 系列路由器)的 HQoS 特性;
原理简述
HQoS 基于队列实现层次化调度,CPE 上支持三级队列:
1)Level3 流队列(Flow Queue):在该队列中,针对用户特定流量进行调度; 每个用户的同类业务可以被认为是一个业务流,HQoS 能够针对每个用户的不同业务流进行队列调度; 流队列一般与业务类型相对应,包括 EF、AF、BE 等,用户可以配置流队列的调度方式;
2)Level2 用户队列(Subscriber Queue):在该队列中,针对用户就行流量调度; 来自同一用户的所有业务可以被认为是一个用户队列,HQoS 可以使该用户队列下的所有业务共享一个用户队列的带宽;
3)Level1 接口队列(Port Queue):在该队列上,将不再进行个体管理,而是全部流量就行管理; 每个接口(子接口、Tunnel)一个队列,接口队列之间进行 RR(轮询调度),仅能配置基于接口的流量整形,且其调度方式不可配置;

特性特征
HQoS 用于复杂场景下的 QoS 部署,颗粒度更细,
应用场景
假设一栋楼有 3 个家庭,家庭 A 购买了 10M 带宽并且开通了 VoIP,IPTV 和 HSI 业务,家庭 B 购买了 20M 带宽并开通了 IPTV 和 HSI 业务,家庭 C 购买了 30M 带宽只开通了 HSI 业务,通过 HQoS 可以方便的实现这些需求;

关于 HQoS 队列调度
流队列调度器和用户队列调度器都支持 PQ、WFQ、PQ+WFQ 调度。接口队列调度器使用轮询调度 RR(Round Robin)方式;

以企业用户的 HQoS 部署为例,企业用户主要有三种业务:语音通讯(VoIP)、视频会议(VC)和数据业务(DATA)
每个用户队列对应一个企业用户,每个流队列对应一种业务。通过部署 HQoS,可以实现: 1)控制单个企业用户三种业务之[……]

READ MORE

「HQoS」- 配置案例

HQoS 配置较为复杂,在配置时一般使用 MQC 方式;
TODO !!! [NETWORK] HQoS
配置 HQoS 时会使用策略嵌套的配置方式: 父策略区分用户,子策略区分流量; 父策略下可以有多个子策略; 父策略应用于接口;

HQoS 的子策略用于区分不同的业务,配置 HQoS 时可以基于业务配置多个子策略;
第一步、配置 HQoS 子策略
HQoS 的子策略配置与普通 MQC 的配置方式一致,基本思路如下:

// 配置 Traffic classifier,该 classifier 可以基于业务特征进行匹配;
System-view
traffic classifier [classifier-name] // 创建流分类
if-match [acl | vlan-id | …. ] // 基于业务特征匹配流量

// 配置 Traffic behavior,该 behavior 可以配置队列调度方式和队列带宽;
System-view
traffic behavior [behavior-name] // 创建流行为
queue [af | ef | llq] bandwidth [bandwidth | pct percentage] // 在流行为中配置 AF/EF/LLQ 队列参数
drop-profile [drop-profile-name] // 在流行为中绑定已创建的丢弃模板

// 使用 Traffic policy 工具将 Traffic classifier 与 Traffic behavior 进行绑定;
System-view
traffic policy [policy-name] // 创建流策略
classifier [classifier-name] behavior [behavior-name] // 绑定流分类与流行为

注意、MQC 并一定需要绑定接口;
第二步、配置 HQoS 父策略
HQoS 的父策略用于区分不同的用户,配置 HQoS 时可以将多个子策略绑定到一个父策略; HQoS 的父策略配置基本思路如下:

// 配置 Traffic classifier,该 classifier 可以基于用户的特征进行匹配
System-view
traffic classifier [classifier-name] // 创建父策略的流分类
if-match [acl | vlan-id | …. ] // 基于用户特征匹配流量

// 配置[……]

READ MORE

「IPSEC-VPN」- 流量处理

基于 IPSec 业务应用,不管是出站还是入站流量,防火墙均根据数据类型采取 3 个方面进行处理: 1)丢弃报文(入站); 3)绕过安全服务; 3)应用安全服务;
出站流量
防火墙首先查看出站数据报文流量是否属于定义的保护数据流,以判断将为这个报文提供哪些安全服务输出,可能有以下几类情况:
1)绕过安全服务:在这类情况下,报文不属于定义的保护数据流,将不应用 IPSec 策略,只进行传统的 IP 转发处理流程;
2)应用安全服务:在这类情况下,此报文将根据已建立的 SA,对报文应用 IPSec 策略后进行转发。对于尚未建立 SA 情况,将调用 IKE,以便完成 SA 建立;
入站流量
入站流量处理与出站流量有所区别,其将根据报文是否含有 IPSec 头对此报文进行以下动作处理:
1)丢弃报文:若报文不含 IPSec 头,且查看防火墙安全转发策略后,其策略输出为丢弃,那么数据报文就会被丢弃。若策略输出为应用 IPSec,但 SA 未建立数据报文同样也会被丢弃
2)绕过安全服务:若报文不含 IPSec 头,则根据防火墙安全转发策略将数据报文进行传统的 IP 转发处理流程;
3)应用安全服务:若报文含 IPSec 头,且已建立 SA,那么数据报文将会被递交给 IPSec 层进行处理;[……]

READ MORE

「VPN」- PPTP

PPTP 协议是一个 VPN 协议,它已有 20 多年的历史; 该协议依赖于加密、认证、点对点协议(PPP,Point-to-Point Protocol)进行协商;
原理简述

特性特征
实质上,它只需要用户名、密码和服务器地址就可创建连接; PPTP 速度很快,但是速度是以弱加密性为代价的。在所有 VPN 协议中,PPTP 加密级别最低, PPTP 必须基于 IP 网络;
应用场景
PPTP 由于需要 Windows 系统支持,且外网接入需要将内网的 Windows 服务器通过 NAT 映射出去,部署不便,使用很少;[……]

READ MORE

「VPLS」- 概念术语

PW, VSI, AC

PW(Pseudo-Wire,伪线):在 MPLS LDP Networking 中,该 PW 为一组 MPLS Label 组成的转发路径。各个 PW 为不同的标签组;
VSI(Virtual Switch Instance,虚拟机交换实例):VSI 是为每一个 VPLS 单独划分的一个虚拟交换处理单元。VSI 用于存放独立的 MAC 地址表和执行转发,并负责终结 PW;
AC(Attachment Circuit,接入电路):AC 指 CE 与 PE 之间的链路。在实际的网络设备的配置过程中,通常是将某个物理接口(或子接口)划分到 VSI 实例中。
已知问题
单活接入导致流量分担不均
VPLS 在 CE 双归接入 PE 存在环形拓扑的时候,同交换机的破环技术(STP)思路一样,采用阻塞一个端口方式形成无环的转发路径。因此 VPLS 接入形成了一种主备的模式。 由于 CE 和 PE 之间只有一条链路转发数据,且 PE 与 PE 之间的链路无法形成多路径,可能造成部分链路拥塞。

故障收敛速度慢
PE3 在感知到链路故障后会向对端 PE 发送 MAC-Withdraw 报文,通知删除 PE3 相关 MAC 地址。同时 PE4 将备份链路升级为 Active。 对端 PE1 接收到撤销报文后,PE1 将清除 MAC 地址,重新学习 MAC 地址。故障收敛时间与 MAC 地址数量强相关。[……]

READ MORE

「VPLS」- 基本工作原理

完整的实现 VPLS 需要完成如下工作:
控制平面
第一步、创建隧道和 PW
在 PE1 和 PE2 间,首先建立一个承载隧道,用于承载不同企业客户的业务;

在 VPLS 中,三种常见的创建 PW 的方式: 1)静态手工配置,配置量大; 2)Martini:通过 LDP 信令创建;其承载的报文将具有两层标签,最内层为隧道标签,外层为 MPLS Network 的标签; 3)Kompella:通过 BGP 信令创建;
第二步、创建 VSI、PW
创建 VSI,并为该 VSI 赋予 PW 实例。

第三步、通过 VSI 来绑定 PW 和 AC
绑定 PW 和 AC 到 VSI 后,VSI 就像一个交换机一样工作,记录不同接口学习的 MAC 地址,并生成 MAC 地址表项;

转发平面
VPLS 模拟交换机,MAC 地址学习依靠数据平面泛洪,没有控制平面参与; 转发行为由查询 MAC 地址表决定,如果 MAC 地址表有记录则查表转发,没有记录则泛洪转发;[……]

READ MORE

「VPLS」- Z.PROBLEM-SOLVING-HOW-TO

Martini

在 eNSP 中,需要使用 Router 设备进行实验,而 AR 设备不支持 VPLS 配置;
STEP 01. Tunnel: LDP Remote Peer
域内:MPLS LDP, IGP OSPF
mpls ldp remote-peer <name> — remote-ip <peer-ip-address>
display mpls ldp session … Operational …
mpls l2vpn
STEP 02. VSI and PW
vsi <name> static — pwsignal ldp — vsi-id 1 — peer <addr>
STEP 03. binding AC to VSI
<sub-interface> — vlan-type dot1q 10 (dot1q termination) — l2 binding vsi <name>
<interface> — l2 binding vsi <name>
display vsi name <name> verbose
ping test
[R4] ping R5
Kompella

STEP 01. Tunnel: BGP
域内:MPLS LDP, IGP OSPF
bgp — peer — vpls-family
mpls l2vpn
STEP 02. VSI and PW
vsi <name> auto — pwsignal bgp —— r-distinguisher —— vpn-target —— site 1 range 5 default-offset 0 (site-id 不能相同, site-id > peer default-offset, site-id < range + default-offset)
STEP 03. binding AC to VSI
<interface> —- l2 binding vsi <name>
ping test
[R4] ping R5[……]

READ MORE

「VPN」- Ethernet VPN

问题描述
随着新技术和新场景对网络需求,VPLS 被暴露出更多的问题(诸如 无法实现负载分担、网络部署困难 等等),无法满足 L2VPN 灵活部署和 CE 多归属场景下提升链路利用率等需求;
解决方案
业界重新审视对 Ethernet VPN 的需求(RFC 7209),提出新的解决方案 EVPN(Ethernet Virtual Private Network,以太网虚拟私有网络),以解决以上问题;
EVPN 最初在 RFC 7432 中被定义;
原理简述

控制平面
在 EVPN 中,引入控制平面,采用 MP-BGP 协议,负责进行信息传递,用于更好的控制 MAC-ADDR 学习过程; PE 间交互 BGP EVPN 报文,传递 MAC 和 IP 地址。MAC 地址无需再进行广播,而是通过 EVPN 发送给对端; MP-BGP 能够传递 MAC Route、ARP Route 等等;
数据平面
由 IP 隧道或 MPLS 标签转发路径组成数据转发路径。只负责数据转发,无需广播泛洪学习 MAC 地址; 数据平面,支持多种类型的隧道,例如 MPLS、IP/GRE tunneling、SRv6 等等。
所示如图,是以 MPLS 作为外层隧道转发技术(EVPN for MPLS):
协议标准
如下图,Control Plane 与 Data Plane 能够使用各种不同的协议进行组合,以实现 EVPN 多种应用场景:
特性特征
EVPN 颠覆传统 L2VPN 数据面学习的方式(即传统二层网络广播行为),引入控制面学习 MAC 和 IP 指导数据转发,实现转控分离;
它引入控制平面用于控制 MAC 地址的学习。随着 EVPN 的不断扩展,EVPN 不仅支持 L2VPN,同时支持 L3VPN;
EVPN 解决传统 L2VPN 的典型问题,带来双活,快速收敛,简化运维等更多的价值;
EVPN 其他优势: 1)支持 CE 多活接入 PE 2)支持 PE 成员自动发现 3)环路避免 4)广播流量优化 5)支持 ECMP
应用场景
随着 SDN 的发展和商用,在各解决方案中,EVPN 占据重要角色,应用覆盖全场景包括园区网络、数据中心网络、广域 IP 承载网络、SD-WAN 等等;
在广域 IP 承载网的应用
EVPN 控制面统一所有业务,标准逐渐成熟和完善

E-LINE、E-TREE、E-LAN 是 EVC(Ethernet Virtual Connection,以太网虚拟连接)定义的三种类型,具体请参考城域以太网标准。https://wiki.mef.net/display/CESG/E-Line
在[……]

READ MORE

「VRF」- 概念术语

原理简述
VRF 是对物理设备的进行逻辑划分,每个逻辑单元都被称为 VRF-Instance(VRF 实例,VRF-INST),VRF-INST 间在路由层面是隔离的。

VRF 实现过程如下: 1)创建 VRF-INST,并将三层接口(可以是路由器的物理接口或者子接口,也可以是 VLANIF 接口)绑定到 VRF-INST; 2)可选:配置与 VRF-INST 绑定的路由协议或静态路由; 3)基于与实例绑定的接口和路由协议等,来建立实例路由表并基于实例路由表转发数据,实现 VRF-INST 间隔离;
多张独立的路由表
Q:当前路由器上会有几张路由表呢? A:这里想强调的是除了虚拟路由表,还有全局路由表;在缺省时,一个网络设备的所有接口都属于同一个转发实例——设备的根实例。

通过 VRF 技术,在一台三层转发设备上创建多张隔离的路由表,实现数据或业务的隔离:

# VPNA 的路由表
目的网段/掩码 协议 出接口 下一跳
192.168.100.0/24 OSPF VLANIF100 192.168.100.1
192.168.1.0/24 OSPF VLANIF101 192.168.101.1

# VPNB 的路由表
目的网段/掩码 协议 出接口 下一跳
192.168.100.0/24 OSPF VLANIF200 192.168.100.1
172.16.1.0/24 Static VLANIF201 192.168.201.1[……]

READ MORE

「Layer 4」- Transport Layer

传输层:建立、维护、管理端到端连接;
数据单元:数据段,Segment;
我们工作中常见的协议是 TCP 协议,然后是 UDP 协议。当然还有其他协议,比如 DCCP、SCTP、RSVP 等等;
常见协议
QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于 UDP 的低时延的互联网传输层协议。在 2016 年 11 月国际互联网工程任务组(IETF)召开了第一次 QUIC 工作组会议,受到了业界的广泛关注。这也意味着 QUIC 开始了它的标准化过程,成为新一代传输层协议;
参考文献
Wikipedia/Transport layer[……]

READ MORE

「Laptop」- 我的笔记本电脑使用经验

写在最开始……
为什么要写这篇文章?写这篇文章的意义在哪里?(1)为了记录那些笔记本使用体验(2)以及使用过程过程中遇到的问题。主要还是为了记录使用问题,以便在下次选购笔记本时可以避开这些问题,进而选购趁手的“兵器”;
当然这些“问题”并不是笔记本自身缺陷,它们是指在日常使用中由于无法满足某些需求而产生的问题;
因此本文中所述的使用经验也与个人需求相关,并不是对笔记本产品自身的评价,因此这些经验并不具备广泛及通用的参考价值;
我用过的笔记
这里忽略 CPU、MEMORY、DISK 等信息,侧重与笔记本的屏幕尺寸、屏幕的分辨率等信息:

购买时间
品牌型号
显示器屏幕
更换原因

00/06/2012
ASUS k53sd
15 1366×768
配置低、年代久

03/16/2015
ThinkPad T540p
15 1366×768
分辨率不行

10/14/2016
Dell m6800
17 1960×1080
体积较大,携带不便

10/15/2017
MacBook Pro
13 2560×1600
满足不了日常需求,搭建环境问题较多

05/23/2018
ThinkPad T540p
15 1960×1080
除了不支持 RAID 外,其他方面能够满足需求

配置要求

属性
配置要求

# 硬盘 #
支持 RAID 5 阵列,或具有多盘位(数据冗余,马虎不得)

显示器及分辨率
尺寸:15、14;分辨率:在 1920×1080 以上;尽力非触屏;

外观
方方正正

处理器
支持虚拟化,无其他特殊要求

内存
最少:16GB;起步:32GB

显卡
无特殊要求

机身接口
需要有足有的机身接口来接入其他设备

产品已基本锁定 ThinkPad 系列了,其他的品牌不太可能考虑了(在外观方面,可以过滤掉大多数品牌);
经验总结
我是一位开发者,一位后端开发者,四年半[……]

READ MORE

「PostgreSQL」

问题描述
该笔记将记录:在 PostgreSQL 中,进行服务维护的方法以及相关问题的解决办法。
解决方案
该部分的主要内容均来自于官方文档,但是提取出在各章节中我们关注的内容,让我们形成对 PostgreSQL 的整体认识。
该部分内容主要来自官方文档的以下章节,偏向于 PostgreSQL 服务的维护及系统管理:
III)Server Administration — 16)Installation from Binaries => Installing and Upgrading — 17)Installation from Source Code => Installing and Upgrading — 18)Installation from Source Code on Windows => Installing and Upgrading — 19)Server Setup and Operation => Problems Solving and How-to — 20)Server Configuration => Maintenance, Administration — 21)Client Authentication => Client Authentication — 22)Database Roles — 23)Managing Databases — 24)Localization — 25)Routine Database Maintenance Tasks — 26)Backup and Restore — 27)High Availability, Load Balancing, and Replication — 28)Monitoring Database Activity — 29)Monitoring Disk Usage — 30)Reliability and the Write-Ahead Log — 31)Logical Replication — 32)Just-in-Time Compilation (JIT) — 33)Regression Tests
参考文献
PostgreSQL: The world’s most advanced open source database PostgreSQL: Documentation: 14: Part III. Server Administration[……]

READ MORE

「DBMS」- SQLite

SQLite 轻量级的嵌入式数据库
特性特征
SQLite,并非独立的数据库服务,而是以类库的方式存在,通过类库直接管理数据库文件;
参考文献
SQLite Home Page SQLite – Wikipedia[……]

READ MORE

「etcd」- 分布式、可靠的、键值存储

问题描述
我们需要管理与运维 Kubernetes 集群,我们经常遇到与 etcd 相关的错误: 1)context canceled / context deadline exceeded 2)经常出现 etcd 服务重启; 3)在 Prometheus 中,监控经常发生 Leader 切换;
所以,我们准备进行 etcd 组件的学习,学会对 etcd 的使用、管理、问题排查;
解决方案
研究对象
etcd
研究工具
教育培训:极客时间/etcd 实战课(唐聪,腾讯云资深工程师,etcd 活跃贡献者) 书籍文献:《etcd 工作笔记:架构分析、优化与最佳实践》 官方文档:etcd/Documentation versions 博客文章:
研究目标
掌握 etcd 概念术语、工作原理、指标数据; 实现 etcd 常见问题进行排查,提高系统可用性;
参考文献
极客时间/etcd 实战课(唐聪,腾讯云资深工程师,etcd 活跃贡献者) 《etcd 工作笔记:架构分析、优化与最佳实践》 etcd/Documentation versions[……]

READ MORE

「Haskell」- 概念术语

GHC: The Glasgow Haskell Complier
GHC Homepage GHC Github Homepage
编译器
Stack(for Project Management)
Stack Doc Github Stack
Stack 是用于 Haskell 开发的跨平台构建工具,用于处理工具链的管理;
Installing the Glasgow Haskell Compiler (GHC) automatically, in an isolated location. Installing packages needed for your project. Building your project. Testing your project. Benchmarking your project.[……]

READ MORE

「RUST-PROGRAMMING-LANGUAGE」- 学习笔记

研究对象
Rust
研究结果
1)理论:掌握 Rust 语言的编程方法; 2)实践:能够阅读 Rust 代码;能够编写简单的 Rust 程序;
研究方法
教育培训:WIP
书籍文献: 1)《Rust 权威指南》 2)《Rust 编程之道》
官方文档: 1)What is rustdoc? – The rustdoc book
博客文章: 1)Rust 语言中文社区-首页[……]

READ MORE

「Rust」- 场景及方案

静态编译
“cannot produce proc-macro for `crate` as the target `x86_64-unknown-linux-gnu` does not support these crate types” with +crt-static rust – How to generate statically linked executables? – Stack Overflow

// 通过命令行专递参数构建

RUSTFLAGS=”-C target-feature=+crt-static” cargo install –jobs 2 –path . –target x86_64-unknown-linux-gnu

// 或者,通过 Cargo.toml 文件:

[target.x86_64-pc-windows-msvc]
rustflags = [“-C”, “target-feature=+crt-static”]
…[……]

READ MORE

「SHELL-SCRIPTING」- 学习指南

研究对象
Shell Scripting,脚本编程
研究结果
1)理论:掌握 Shell 脚本的编写方法,及与 Shell 编程有关的内容; 2)实践:能够进行 Shell 编写,并且编写出可移植性高的脚本是个非常重要的目标;
研究方法
信息采集
教育培训:WIP
书籍文章: 1)《Linux Shell 脚本攻略(第 2 版)》
官方文档: 1)https://www.gnu.org/software/bash/manual/bash.html
博客文章:WIP
制定路线
针对 Bash 的学习,我们将沿用 Bash Reference Manual 的结构,逐步深入学习;
补充说明
# 08/20/2019 起初这个分类是为 UNIX Shell 准备的,现在开始也准备加入部分 PowerShell 相关的技术;[……]

READ MORE

「SHELL-SCRIPTING」- 语法

关于 Shell 编程语言的学习。既然是编程语言的学习,自然也就逃不开编程语言的那一套:变量,数组,类型函数等等概念;[……]

READ MORE

「ANSI escape code」- 终端转义序列

TODO ANSI Color Code True Colour (16 million colours) support in various terminal applications and terminals
\e[31m \033[31m \e[0m \033[0m
移动光标的转义序列
Cursor Movement

– Position the Cursor:
\033[<L>;<C>H
Or
\033[<L>;<C>f
puts the cursor at line L and column C.
– Move the cursor up N lines:
\033[<N>A
– Move the cursor down N lines:
\033[<N>B
– Move the cursor forward N columns:
\033[<N>C
– Move the cursor backward N columns:
\033[<N>D

– Clear the screen, move to (0,0):
\033[2J
– Erase to end of line:
\033[K

– Save cursor position:
\033[s
– Restore cursor position:
\033[u

实现进度条

#!/bin/bash

echo -n ‘——————————————‘
echo -n -e “\r” # 移动光标到行首

while true;
do
echo -n -e ‘\033[1C’ # 光标向后移动一位
echo -n -e ‘\b’ # 删簇一个字符
echo -n ‘#’ # 打印一个井号
sleep 0.5 # 休眠 500ms
done

参考文献
Wikipedia/ANSI escape code Bash tips: Colors and formatt[……]

READ MORE

「Linux」- 颜色化输出

问题描述
在终端中,我们经常查看日志输出(不管是自己的 Shell 脚本,还是运行其他程序),以了解程序执行情况。
但是,所有的终端日志颜色都是相同的(通常默认都是白色字体),
该笔记将记录:将终端输出变成彩色的方法
解决方案
方法一、ANSI escape code – 最古老的方法
使用 ANSI escape code 是最古老的方法:

# echo -e “\033[31;1;4mHello\033[0m”
Hello

该命令将输出带下划线的红色 Hello 字符串
方法二、grc

# grc tail -f /var/log/syslog

该命令将高亮 syslog 日志输出,通过配置文件可以进行更多控制
其他工具
colortail GitHub – joakim666/colortail: Like the tail command line utility but with colors
colorex GitHub – Scopart/colorex: A python script to display log files with colors.
colout GitHub – nojhan/colout: Color text streams with a polished command line interface
TxtStyle GitHub – armandino/TxtStyle: Command-line tool for colorizing console output and log files based on regular expressions
rainbow GitHub – nicoulaj/rainbow: Colorize commands output or STDIN using patterns.
highlight André Simon – Startseite
lolcat GitHub – busyloop/lolcat: Rainbows and unicorns!
参考文献
terminal – Output in color – Bash – Unix & Linux Stack Exchange GitHub – garabik/grc: generic colouriser[……]

READ MORE

「Shell」- 2.Environment Setup

常见 Shell 整理
Wikipedia/Comparison of command shells
sh – Borune shell
bash – Bourne Again Shell
dash – Debian Almquist Shell
以POSIX兼容性为目标。
Z shell(zsh)
Kornshell(ksh)
pdksh是ksh93的自由软件版本。
pdksh 现在是 mksh(http://mirbsd.de/mksh%EF%BC%89%E3%80%82
C shell(csh)
Tenex C shell(tcsh)
环境安装
在 Linux distro 中,已经携带 Shell 环境,通常不需要自行安装,除非想要使用其他类型的 Shell 环境。

# Bash
apt-get install -y bash[……]

READ MORE

「Shell」- 快速入门及简单示例

定义变量
变量转义
这是别人在群里问到的一个问题。看如下命令:

ssh localhost “/bin/cat > /tmp/tmp << eof
\\\$demo
eof”

上述命令生成的/tmp/tmp文件的内容是$demo,为什么?首先,传给SSH的命令在双引号中,所以Bash先解析一次,但是它解析了”\\“和”\$“两个组合。也就是说,SSH拿到手的时候,命令已经变成”\$name“。即:

/bin/cat > /tmp/tmp << eof
\$demo
eof

那么,写入文件的自然就是”$name“字符串。
换句话说,下面的写法是等效的:

ssh localhost ‘/bin/cat > /tmp/tmp << eof
\$dddd1
eof

变量引用
定义了一个SHELL函数:

ddPATH=”-cp /mnt/demo”
debug=com.k4nz.Enter

debug()
{
java $ddPATH “$USER_FLAGS” $debug
}

而USER_FLAGS使用用户自定义的,可能存在,也可能不存在。在执行这个函数的时候会产生如下错误:

Error: Could not find or load main class

我们尝试打印出要执行的命令,所以对函数作出如下修改,加了一个echo命令:

ddPATH=”-cp /mnt/demo”
debug=com.k4nz.Enter

debug()
{
echo java $ddPATH “$USER_FLAGS” $debug
}

该函数的输入如下:

java -cp /mnt/demo com.k4nz.Enter

在命令行里执行这个命令是没有错误,完全可以正常执行这个类,这就见鬼了。
其实,有的时候就是需要非常仔细的观察,问题的关键就在于那个”$USER_FLAGS”,修改成$USER_FLAGS就正常了。为什么?
由于USER_FLAGS未定义,函数里的java $ddPATH “$USER_FLAGS” $debug命令执行前,SHELL会先进行解析,而解析的结果是java -cp /mnt/demo “” com.k4nz.Enter,而echo的结果是java -cp /mnt/demo com.k4nz.Enter,这两个并不等价。而当我们把函数里的命令修改成java $ddPATH $USER_FLAGS $debug后,解析的结果就与echo等价了,这时候也不会出现那[……]

READ MORE

「Shell」- 模块及框架

PowerShell Gallery
Welcome to the PowerShell Gallery
The central repository for sharing and acquiring PowerShell code including PowerShell modules, scripts, and DSC resources.
框架及方法
Shellscript framework make quick bash scripts Bashinator: Bash Shell Script Framework

章节列表
「Shell」- 处理 YAML 文件 「Bash」- type(学习笔记) 「Bash」- 内建命令(学习笔记) 「Shell」- 进程替换(Process substitution) 「Shell」- 使用环境变量,替换在文件中的变量(envsubst) 「Bash」- shift(学习笔记) 「Bash」- 自动补全功能(Bash Completion)[……]

READ MORE

「Bash」- 自动补全功能(Bash Completion)

问题描述
Bash Completion,是个 Bash 特性(其他 Shell 也支持),只需轻点几下 TAB 即可实现复杂的命令行选项提示,而无需我们输出复杂、冗长的命令;
该笔记将记录:在 Bash 中,与自动补全(Bash Completion)有关的内容,以及相关问题处理;
解决方案
在终端下,命令自动补全提示功能(<TAB><TAB>)在 Bash Completion 软件包中;
以 Bash 为例
因为大多数的 Shell 都是差不多的,实现上有很多类似的地方。我们平时主要使用的 Shell 也是 Bash,所以就说说 Bash 吧;
必须指出的是TAB键通常发送 ASCII 的Control-I字符。因为控制字符Control-I和TAB键的 ASCII 值是对应的都是9,所以你在终端中按下TAB键的效果和Ctrl-I的效果是一样的;
而Control-I字符绑定在compete函数上。这一点可以通过bind -p | grep -F ‘\C-i’命令看到。bind和complete都是 Bash 中内建的函数,可以使用help bind和help complete命令查看手册。实际上complete是自动补全的关键,当你去看「GitHub/scop/bash-completion/completions/」中的自动补全脚本的时候,你会发现大量的compete -F调用,后面会介绍 Bash Completion 是什么;
所以,当你按下 TAB 键时,向 Bash 发送了 Control-I 字符,收到该字符后 Bash 执行 complete 函数;
如何扩展 Bash 自动补全
默认的自动补全功能有限,基本上只有命令、路径、目录的补全,但是可以扩展自动补全功能,使其支持命令行选项的扩展;
这个就不介绍如何扩展自动补全,有兴趣可以参考以下两篇文章: 1)An introduction to bash completion: part 1 2)An introduction to bash completion: part 2
一来没有遇到去完善自动补全的必要,二来我们有 Bash Completion 软件包;
关于 Bash Completion 软件
默认的自动补全仅能进行简单的自动补全,比如文件目录路径。该软件包扩展 Bash 的自动补全功能,它能满足我们的大多数需要;
项目地址:scop/bash-completion: Programmable completion functions for bash 安装方法:1)参考源码目录下的 README.md 文件;2)或者直接使用包管理器安装(各个[……]

READ MORE

「Bash」- 内建命令(学习笔记)

history 命令执行的历史记录操作、查看;
kill 用于向job或者进程发送信号。
trap [-lp] [[arg] sigspec …]

The command arg is to be read and executed when the shell receives
signal(s) sigspec. If arg is absent (and there is a single
sigspec) or -, each specified signal is reset to its original dis‐
position (the value it had upon entrance to the shell). If arg is
the null string the signal specified by each sigspec is ignored by
the shell and by the commands it invokes. If arg is not present
and -p has been supplied, then the trap commands associated with
each sigspec are displayed. If no arguments are supplied or if
only -p is given, trap prints the list of commands associated with
each signal. The -l option causes the shell to print a list of
signal names and their corresponding numbers. Each sigspec is
either a signal name defined in <signal.h>, or a signal number.
Signal names are case insensitive and the SIG prefix is optional.

If a sigspec is EXIT (0) the command arg is executed on exit from the shell.

如果sigspec为DEBUG,对于命令、case命令、select命令、命令的每个算术,会在每个简单的命令并且在shell函数中执行的第一个命令之前先执行命令arg(请参见SHELL GRAMMAR章节)。 有关shopt内[……]

READ MORE