Systemd 是 Linux 系统的一中 Init 用户程序和基础组件的集合,由 Lennart Poettering 带头开发并在 LGPL 2.1 及后续版本许可证下开源发布,目前 Systemd 已纳入众多 Linux 发行版的软件源中。

Linux 引导原理

Linux 内核加载启动后,用户空间的第一个进程就是初始化进程,这个程序的物理文件约定位于 /sbin/init,当然也可以通过传递内核参数来让内核启动指定的程序。这个进程的特点是进程号为1,代表第一个运行的用户空间进程。不同发行版采用了不同的启动程序,主要有以下几种主流选择:

  1. 以 Ubuntu 为代表的 Linux 发行版采用 Upstart。
  2. 以7.0版本之前的 CentOS 为代表的 System V Init。
  3. CentOS7.0 版本的 Systemd。

阅读更多

systemd journal 之于 systemd 犹如 syslog 之于 init,其日志文件保存在 /var/log/journal 目录下。随着时间的流逝,该目录下会积累大量日志文件,占用不少的磁盘空间。如果硬盘容量较小或可用空间紧张,可以考虑清理过期日志释放占用的空间。

本文介绍清理systemd日志的方法。

阅读更多

eBPF 程序使用 C 语言的一个子集(restricted C)编写,然后通过 LLVM 编译成字节码注入到 内核执行。bcc是 eBPF 的一个外围工具集,使得 “编 写 BPF 代码-编译成字节码-注入内核-获取结果-展示” 整个过程更加便捷。

下面我们将搭建一个基础环境,通过几个例子展示如何编写 bcc/eBPF 程序,感受它们的强大功能。

准备工作

环境需要以下几方面满足要求:内核、docker、bcc。

内核版本

eBPF 需要较新的 Linux kernel 支持。 因此首先要确保你的内核版本足够新,至少要在 4.1 以上,最好在 4.10 以上:

1
2
$ uname -r
4.10.13-1.el7.elrepo.x86_64

阅读更多

前言

虽然 Linux 内核很早就已经支持了 eBPF,但很多新特性都是在 4.x 版本中逐步增加的。所以,想要稳定运行 eBPF 程序,内核至少需要 4.9 或者更新的版本。而在开发和学习 eBPF 时,为了体验和掌握最新的 eBPF 特性,我推荐使用更新的 5.x 内核。

作为 eBPF 最重大的改进之一,一次编译到处执行(简称 CO-RE)解决了内核数据结构在不同版本差异导致的兼容性问题。不过,在使用 CO-RE 之前,内核需要开启 CONFIG_DEBUG_INFO_BTF=yCONFIG_DEBUG_INFO=y 这两个编译选项。为了避免你在首次学习 eBPF 时就去重新编译内核,我推荐使用已经默认开启这些编译选项的发行版,作为你的开发环境,比如:

  • Ubuntu 20.10+
  • Fedora 31+
  • RHEL 8.2+
  • Debian 11+

阅读更多

主要介绍wireshark中的length计算方法,主要涉及MTU、MSS、常见协议头大小。

length含义

Wireshark is showing you the length of the Ethernet frame that is handed to it, which may or may not include the FCS.

wireshark显示的长度为以太网帧的长度,不包括FCS(Frame check sequence)[帧校验序列]

阅读更多

前言

网上关于 net.ipv4.ip_local_port_range 的值的效果众说纷纭(下面所说的连接都假定使用的是相同的协议(都是 TCP 或 UDP)):

  • 大部分文章都说这个值决定了客户端的一个 ip 可用的端口数量,即一个 ip 最多只能创建 60K 多一点的连接(1025-65535),如果要突破这个限制需要客户端机器绑定多个 ip。
  • 还有部分文章说的是这个值决定的是 socket 四元组中的本地端口数量,即一个 ip 对同一个目标 ip+port 最多可以创建 60K 多一点连接,只要目标 ip 或端口不一样就可以使用相同的本地端口,不一定需要多个客户端 ip 就可以突破端口数量限制。

阅读更多