计算机加电后,首先会执行刷在ROM/NVRAM
中的系统固件代码。系统固件(BIOS/UEFI
)完成自身的一系列工作(如硬件自检(POST: Power-On Self-Test
)后,需要引导操作系统启动。固件可以从NVRAM
中读取启动设备列表,按设备顺序尝试进行引导。
CentOS7配置Console界面运行openbox
之前的文章<<CentOS7配置Console GUI/TUI程序>>介绍了在CentOS7
的Console
界面上配置GUI/TUI
可视化程序的几种方法。尽管这些GUI
程序可以简化系统的配置难度,但对于界面要求复杂的专用场景较不是很适用,比如需要支持鼠标操作等。但安装完整的一套桌面环境,对服务器的资源占用又较大,这种场景下,可以只安装X Window
和openbox
来支撑运行完整图形界面程序。
X Window
被设计为Client/Server
架构。Server
负责图形设备和外部设备的处理来显示画图和处理外设操作,而图形界面程序作为Client
只是通知Server
进行相应的操作,如画线,显示字符等等。Client
和Server
之间不要求位于同一台计算机,它们之间可以通过网络进行协议传输。Client
和Server
的角色和我们日常网络访问所说的Client
和Server
相比。一般我们日常通过SSH
登录服务器,我们所看到界面和操作外设的一端做为客户端,我们所使用的应用位于服务端。而在X Window
体系下。我们看到界面和操作外设的一端是X Server
, 而图形界面程序运行的一端是X Client
。
对于任一X Client
来说,它并不知晓其他X Client
的存在,对于他们在同一X Server
上如何排放,需要另一个组件来完成,这就是窗口管理器
, 它也是一个X Client
,只是它负责的是其他X Client
的管理, 示意图如下:

关于应用程序的locale设置
近期开发的C++
程序遇到一个关于locale
的问题。程序在通过SSH
直接登录到root
用户后,运行程序会崩溃,而通过其他用户SSH
登录后,再切换到root
用户后,程序则运行正常。
1 | terminate called after throwing an instance of 'std::runtime_error' |
根据locale文档中的描述:
1 | std::locale::locale(const char * __s) [explicit] |
可以得知,指定的locale
不存在。
Google
上查到一般解决方案是设置环境变量LC_ALL=C
可以解决。
从外部访问Docker桥接网络容器路径分析
Docker
默认的网络模式是bridge
模式, 在宿主机上创建一个Linux bridge
:docker0
,并分配一个网段给该网桥使用。该模式下启动的容器,会分配一个该网段的IP
, 并通过veth-pair
接入网桥。为了能够从宿主机外部访问容器,需要在创建容器时指定-p
参数,在宿主机上将某个宿主机的端口映射到容器的端口。
如:
1 | docker run --rm -itd -p 80:80 nginx |
本文来简要分析一下从宿主机外访问bridge
网络模式下docker
容器的数据包路径。
整体的网络架构如图所示:

netfilter中相同优先级的HOOK函数的执行顺序
之前的两篇文章<<nf_ct_deliver_cached_events崩溃分析>>和<<nf_ct_deliver_cached_events崩溃修复或规避方案>>介绍了nf_conntrack
模块中的一个BUG的原因和规避方案。触发BUG的原因在于NFQUEUE
操作位于ipv4_conntrack_in
和ipv4_confirm
两个函数之间,于是本可以无中断执行完成的两个函数之间出现了CPU
调度,导致大量conntrack entry
冲突。各HOOK
函数执行顺序如图:

__pv_queued_spin_lock_slowpath崩溃分析
最近遇到一个CentOS8
环境上的内核崩溃问题,内核版本号为4.18.0-305.3.1.el8.x86_64
,崩溃堆栈为:
1 | crash> bt |
nf_ct_deliver_cached_events崩溃修复或规避方案
之前的文章<<nf_ct_deliver_cached_events崩溃分析>>分析了nf_conntrack
内核模块中存在的一个BUG。由于CentOS7
一直没有修复该问题,甚至到当前最新的CentOS8 stream
的kernel-4.18.0-383.el8
版本,这个问题依旧没有修复,这样就无法通过升级官方内核的方法来解决该问题了,只能我们自己来想办法进行修复或规避。
最直观的思路是修改代码后重新编译相关的内核模块进行替换。但在我们无法直接控制的环境中替换模块不是太理想,理想的方案还是能在我们的内核模块中进行修复或者规避。
类似于LivePatch
的思路,可以直接HOOK
存在BUG的函数:nf_conntrack_confirm
, 重新实现正确的逻辑。但该函数是inline
函数, 在内核中没有符号:
1 | [root@k8smaster ~]# cat /proc/kallsyms |grep nf_conntrack_confirm |
udev机制简介
udev
机制是Linux kernel
的设备管理机制. 当内核检测到设备插拔后, 会发送事件给用户态的udevd
进程. 用户态udevd
进程根据事件信息匹配不同规则从而进行不同的处理逻辑.
在CentOS7
中使用的是systemd
中实现的udevd
进程. udev
规则文件的扩展名为.rules
, 主要位于两个目录:
/etc/udev/rules.d/
: 自定义规则/usr/lib/udev/rules.d/
: 系统自带规则
udev
规则是以规则文件名按字母顺序进行匹配处理的, 一般文件名中会带有数字前缀, 如:50-udev-default.rules
. 处理顺序与规则放在哪个目录下无关, 但如果不同目录下规则文件同名, /etc/udev/rules.d
下的文件会覆盖/usr/lib/udev/rules.d/
下的文件.
NSX-T东西向路由
之前的文章<<NSX-T路由逻辑介绍>>主介绍了NSX-T
的路由逻辑, 举例介绍的是南北向网络路径, 介绍从逻辑交换机/分段
到Tire1逻辑路由器
, 再到Tire0逻辑路由器
的过程.
本文来简要介绍一下两个逻辑交换机
之间通过Tire1逻辑路由器
通信的东西向路径.
实验拓扑如图:

Linux动态链接库符号冲突解决
最近遇到一个so
库符号冲突的问题, 可以总结为:
- 动态库
so1
中静态编译了某基础库 - 动态库
so2
中动态链接了该基础库的另一版本 - 可执行程序动态链接了这两个
so
- 程序执行到
so2
中函数时, 调用了so1
中的基础库的符号, 而恰好该基础库两个版本的同名函数不兼容, 因而出现了崩溃.
下面通过demo
代码来说明如何解决这个问题.