nslookup(name server lookup)域名记录查询器,用来查询域名相关信息,包括linux版本及windows自带版本。
dig
dig(Domain Information Groper)域名记录搜索器,用来查询域名相关信息,属于域名服务器软件套件BIND的组成部分。
redis
redis (REmote DIctionary Server),是用c语言开发的,分布式,key-value内存数据库,并支持持久化。
mysql
mysql用于操作mysql数据库的命令行工具。
etcd
etcd 是一个高可用强一致性的键值对存储系统,用于共享配置和服务发现。
ns
history
history命令用于显示历史上执行过的shell命令,原理是:当执行完shell命令后,系统会将命令报存在内存中,当shell退出时会将内存中的命令存入文件中,比如~/.bash_history,存储的文件及存储的个数都可以用配置项配置。
es
ElasticSearch是用java开发的基于Lucene的提供RestfulAPI的开源搜索引擎,本文主要讲解索引及其模板的相关操作,如果使用默认模板,可能会导致grafna显示问题(比如时间字段格式不兼容)。
dpdk适配mellanox网卡
以网卡Mellanox Technologies MT27710 Family [ConnectX-4 Lx]为例。
golang安装及vscode配置
golang是google推出的一种新型编程语言,拥有语法简单(类c,上手快),静态强类型(不易引入bug),编译型(执行速度快),并发型(充分利用多核),垃圾回收(减少对内存维护的代价)等优秀特性。本文主要说明安装及vscode配置相关内容。
python scapy
scapy主要优势在于丰富的协议数据包构造。原理为基于libpcap(windows上是winpcap/npcap)提供的一个python接口。本文主要以dns协议为例,说明scapy的使用。
DPDK分片与重组
DPDK版本:16.11.2,默认支持对大报文的分片和组装,但编码过程中仍需要关注几个地方,否则会陷入单步调试的泥沼不能自拔。
注意点:
- mbuf中的packet_type有可能并未被网卡填充,不能直接使用;
- reassemble接口中frag_tbl和death_row,不是线程安全的,不支持并发访问;
- mbuf库中只有read链表的操作,没有write链表的操作,所以需要自己实现;
- fragment接口参数中必须保证分片大小为8的整数倍;
- fragment前udp校验和的计算可参考dpdk checksum;
- fragment后ipv4校验和如果自己计算的话,需要重置掉offload标志;
- fragment后要free掉原始的mbuf,否则send后会出现mbuf泄漏;
protobuf for c
protobuf是google提供的一种数据序列化、反序列化工具,支持变长编码(数据压缩)、向后兼容(方便升级)、平台无关(方便移植)、语言无关(前后台解耦)等优秀特性。可用于数据存储、网络数据交互等场景。本文主要介绍protobuf在c语言编程中的安装步骤。
protobuf安装包主要包括两部分:代码生成器(处理.proto) + 运行时库。
c: 由于官方主代码库不提供c库,需要安装第三方库(插件形式)。
c++/java/go/c#/python/js/object-c/ruby/php/dart: 均可使用官方库安装。
交换机bgp配置
BGP(Border Gateway Protocol),即边际网关协议,主要用于AS(autonomous system)之间的路由信息交换(EBGP),也可用于大型的AS内部(IBGP)。提供BGP服务的实体叫做BGP router,而与BGP router连接的对端叫做BGP peer。推荐阅读BGP漫谈。本文主要讲解基于华为三层交换机[H3C S5830V2]的配置方法。
交换机端口聚合配置
端口聚合,又称为链路聚合,就是将物理上的多个端口配置到一起,形成逻辑上的一个端口,使之具有:增大带宽、负载均衡、冗余链路的优点。下面以华为三层交换机[H3C S5830V2]为例,说明端口聚合的配置过程。
dpdk checksum
版本:16.11.2,当解析或组装ip/icmp/icmpv6/igmp/udp/tcp/sctp报文时,会发现都存在两个字节(16位)的checksum字段,其生成及校验算法相同。实现方式有两种:1,软件方式计算;2,offload到网卡计算。本文主要介绍软件计算方法及dpdk中的实现。
注意:当代码中设置了offload标志后,就不能使用软件方法计算,否则校验和重复计算会导致错误,因为硬件计算时校验和字段不为0。
kvm
kvm是linux内核提供的基于硬件辅助的虚拟化实现方案,主要组件包括:内核态(kvm.ko/kvm_inter.ko/kvm_amd.ko)及用户态(qemu)。关于kvm原理,推荐阅读KVM 虚拟化详解。本文主要提供kvm+centos7.2的安装过程。
Docker
docker是一种轻量级的虚拟化技术,用go语言实现,充分利用了linux的cgroups/namespaces/UnionFS三大技术,解决了开发环境和生产环境环境不一致和资源共享的问题。
Windows VirtualBox
VirtualBox是一款开源的虚拟机软件,支持windows/linux/mac等多个系统。
ip
ip命令是用于显示和配置网络设备、路由、策略路由及隧道。
语法:ip [ OPTIONS ] OBJECT { COMMAND | help }
与ifconfig区别:
1.安装方式不同
ifconfig:yum install net-tools
ip:yum install iproute
2.实现原理不同
ifconfig:通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置;
ip:通过netlink套接字接口与内核通讯,完成增删改查;
3.使用方式不同
net-tools:通过ifconfig/arp/route/netstat等多个命令操作地址、路由等信息;
iproute2:通过单个ip命令及统一的格式即可完成ip、路由等的操作;
tshark
tshark是wireshark的命令行工具,同tcpdump一样,可通过libpcap抓取/过滤/保存网卡报文,处理速度低于tcpdump,但支持的协议更加丰富。
重点参数:
-f : 抓包过滤(capture filter) https://tshark.dev/capture/capture_filters/
-Y/-R : 显示过滤(display filter) https://tshark.dev/analyze/packet_hunting/packet_hunting/
journalctl
journalctl用于读取systemd-journalctld.service服务抓取的系统及应用的日志,默认日志只存储于内存中/run/log/journal中,服务器重启后丢失;如果需要持久化到硬盘,需要手工创建/var/log/journal文件夹。
journald及syslogd都是用于收集系统日志的后台进程,linux系统都会默认安装,syslogd起源于init.d,而journald是随systemd的流行开始的。
主要区别如下:
1.journald的日志文件格式为二进制,不能直接读取(使用journalctl),而syslogd是纯文本的,方便阅读;
2.journald的日志文件存在索引、结构化、访问控制等特点,访问速度更快;
3.journald默认日志路径/run/log/journal(内存),而syslogd默认/var/log/(硬盘);
相同点如下:
1.都能用于收集系统及应用日志;
2.都能将日志传输到远端的独立日志服务器方便处理;
两者的关系如下:
1.journald提供了一个syslog api可以将日志发送给syslogd;
2.syslogd同样也提供了插件可以读取和写入journald;
推荐阅读:Tutorial: Logging with journald
vscode gdb
当使用gdb调试应用时,如果需要执行vscode不支持的一些gdb命令,需要用到-exec命令,如查看内存。先决条件:代码编译时增加-g或-ggdb选项,如果要包含宏定义,需要-g3/-ggdb3级别。
-g: 该选项可以利用操作系统的“原生格式(native format)”生成调试信息。GDB 可以直接利用这个信息,其它调试器也可以使用这个调试信息。
-ggdb: 使 GCC为GDB 生成专用的更为丰富的调试信息,但是,此时就不能用其他的调试器来进行调试了 (如 ddx)。
vscode远程调试
当开发linux应用时,一般的开发环境配置为:windows上完成编码,linux上完成编译加调试。但此种配置时,需要频繁的windows<=====>linux之间切换,对工作效率影响极大。vscode的debug特性完美的解决了这个问题,同时支持launch(启动调试)和attach(挂载调试)。
dpdk大页内存
DPDK使用大页内存技术来提高系统性能,因为大页内存有以下两个特点:
- hugepage 这种页面不受虚拟内存管理影响,不会被替换出内存。
- 同样的内存大小,hugepage产生的页表项数目远少于4kpage,这样就有效的增加了TLB的命中率。
awk
awk是一个基于行的解释型的编程语言,主要用于文本分析及格式化输出。建议阅读文档AWK工作原理,AWK官方手册。
基本语法如下:
1 | |
其中:
单引号(‘’):避免shell对命令行转义,建议阅读shell引号问题;
BEGIN{commands} : 读输入文件之前执行的代码段,可选;
END{ commands }:读输入文件之后的代码段,可选;
pattern{ commands }:针对每一行的匹配pattern(支持正则),成功则执行commands;可以配置多组pattern{commands};
Joplin
Joplin是一款开源的笔记类软件,支持Windows, macOS, Linux, Android and iOS等多种客户端。本文提供一套自有且完全开源的笔记系统的搭建过程,基于wsgidav作为服务端,提供同步功能;joplin作为客户端,提供编辑及浏览功能。
git 基础命令
git是2005年linus花了2周时间,用c语言开发的一款分布式版本控制系统,推荐参考https://www.liaoxuefeng.com/wiki/896043488029600。
git lfs
git rebase
当一个功能分支开发完毕后,一般会有若干次的编译问题,优化问题及代码调整问题的提交,而这些提交没有必要体现在主干分支的log里面,为了保持主干分支log的简洁性,有必要提前合并一下,然后再merge到主干。