Keep learning, keep living...

0%

在程序中, 时间一般有两种表示方法:

  • UNIX时间戳(UNIX timestamp): 表示的是从UTC时间1970年1月1日0时0分0秒起至现在的总秒数, 它也叫做epochUNIX时间,POSIX时间等等。在同一时刻,全球所有地方的UNIX时间戳都相同。

  • 本地时间: 是以人类可读的格式表示的时间,比如2022-9-24 00:00:00。由于时区概念的存在,在同一UNIX时间戳所表示的时间点,各时区的本地时间是不同的,如下图:

CST(China Standard Time)时区中时间为2022-09-24 00:00:00的时刻,UTC时间为2022-09-23 16:00:00

阅读全文 »

以虚拟机镜像或者自带操作系统形式交付的产品往往需要对系统进行各种各样的配置,如IP设置、DNS设置等等。为了提升用户体验,提供更简化的使用方式,往往会在console界面提供GUI/TUI的交互方式, 如XenServerconsole界面:

本文介绍在CentOS7系统上增加GUI界面的方法。

Linux系统的终端输入/输出设备一般称为TTY,是TeleTypewriter的缩写, 它的历史可以参考这两篇文章:

getty是管理物理或者虚拟终端(ttys)程序的通用名称,表示get tty,用于防止非授权访问系统。当getty检测到终端连接时,它获取用户输入用户名, 然后执行login程序获取用户输入密码来进行登录校验。

从终端登录的一般过程是:

  • 系统内核启动完成后,会启动init进程,它是一号进程。
  • init进程会在特定的tty启动getty进程获取用户名。
  • 调用exec执行login程序处理登录过程
  • login登录校验成功后,执行相应用户指定的shell程序
阅读全文 »

C/S架构中,Server端需要依赖ID来唯一标识Client,而客户端相关数据都由这个唯一标识来索引。

这个标识可以由服务端分配,也可以由客户端自行生成再注册到服务端。

服务端分配是一种中心化生成方式,可以保证唯一性。客户端自行生成方式可以采用UUID标准来生成,也可以保证唯一性。

尽管在生成方式可以保证唯一性,但是由于客户端某些特性的改变,服务端依然会出现ID冲突的场景。

阅读全文 »

流量控制Traffic Control简称TC,表示网络设备接收和发送数据包的排队机制。比如,数据包的接收速率、发送速率、多个数据包的发送顺序等。

Linux实现了流量控制子系统,它包括两部分:

  • 内核部分的traffic control框架
  • 用户态的规则配置工具:iproute2软件包中的tc程序

它们有些类似于内核态的netfilter框架和用户态的iptables程序。但相较于netfilter, 关于tc的资料非常少,并且也较为古老,彻底理解它的机制还是需要对照源码。

Traffic Control的作用包括以下几种:

  • 调整(Shaping): 通过推迟数据包发送来控制发送速率,只用于网络出方向(egress)
  • 时序(Scheduling):调度不同类型数据包发送顺序,比如在交互流量和批量下载类型数据包之间进行发送顺序的调整。只用于网络出方向(egress)
  • 监督(Policing): 根据到达速率决策接收还是丢弃数据包,用于网络入方向(ingress)
  • 丢弃(Dropping): 根据带宽丢弃数据包,可以用于出入两个方向
阅读全文 »

在一些业务环境的VMware Guest虚拟机上安装我们的内核模块后,偶尔虚拟机会变成无响应的状态。重启后登录系统查看,处于无响应状态的那段时间在/var/log/messages中却没有任何信息,完全没有分析问题原因的头绪。

经过调研,找到两种方法可以帮助排查定位这类系统失去响应的问题,分别是:

  • 发送NMI: Non-Maskable Interupt给虚拟机
  • VMware内存快照
阅读全文 »

最近CentOS7服务器上遇到一个系统崩溃:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[92957.332974] BUG: unable to handle kernel NULL pointer dereference at 0000000000000a30
[92957.332981] IP: [<ffffffffc086077d>] nf_ct_deliver_cached_events+0x2d/0x110 [nf_conntrack]

......

[92957.333112] CPU: 1 PID: 5027 Comm: Verdict3 Kdump: loaded Tainted: G OE ------------ T 3.10.0-1160.el7.x86_64 #1
[92957.333114] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 12/12/2018
[92957.333116] task: ffff893cad135280 ti: ffff893c4f524000 task.ti: ffff893c4f524000
[92957.333118] RIP: 0010:[<ffffffffc086077d>] [<ffffffffc086077d>] nf_ct_deliver_cached_events+0x2d/0x110 [nf_conntrack]
[92957.333125] RSP: 0018:ffff893c4f527810 EFLAGS: 00010246
[92957.333127] RAX: 0000000000000000 RBX: ffff893ca41e5140 RCX: ffffffffa035de80
[92957.333128] RDX: ffff893c4f527fd8 RSI: 0000000000000200 RDI: ffff893ca41e5140
[92957.333130] RBP: ffff893c4f527850 R08: 0000000000000000 R09: ffff893ca41e5178
[92957.333131] R10: 0000000000000001 R11: ffff893ca41e5140 R12: ffff893ca41e5140
[92957.333132] R13: ffff893c9491a500 R14: ffffffffa0367e40 R15: 0000000000000000
[92957.333135] FS: 00007fbda1d78700(0000) GS:ffff893d3fd00000(0000) knlGS:0000000000000000
[92957.333137] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[92957.333138] CR2: 0000000000000a30 CR3: 000000007fda4000 CR4: 00000000001607e0
[92957.333202] Call Trace:
[92957.333221] [<ffffffffc08372ce>] ipv4_confirm+0x4e/0x100 [nf_conntrack_ipv4]
[92957.333227] [<ffffffff9fc94e38>] nf_iterate+0x98/0xe0
[92957.333231] [<ffffffff9fc96240>] nf_reinject+0x160/0x1b0
[92957.333239] [<ffffffffc0a48566>] nfqnl_recv_verdict+0x216/0x310 [nfnetlink_queue]
[92957.333244] [<ffffffff9f9b4716>] ? nla_parse+0xb6/0x120
[92957.333247] [<ffffffffc09b03a2>] nfnetlink_rcv_msg+0x162/0x270 [nfnetlink]
[92957.333251] [<ffffffffc09b0240>] ? nfnetlink_net_exit_batch+0x70/0x70 [nfnetlink]
[92957.333254] [<ffffffff9fc9249b>] netlink_rcv_skb+0xab/0xc0
[92957.333257] [<ffffffffc09b089f>] nfnetlink_rcv+0x28f/0x575 [nfnetlink]
[92957.333260] [<ffffffff9fc90773>] ? __netlink_lookup+0xd3/0x130
[92957.333263] [<ffffffff9fc91e20>] netlink_unicast+0x170/0x210
[92957.333267] [<ffffffff9f99ca72>] ? memcpy_fromiovec+0x62/0xb0
[92957.333269] [<ffffffff9fc921c8>] netlink_sendmsg+0x308/0x420
[92957.333272] [<ffffffff9fc343a6>] sock_sendmsg+0xb6/0xf0
[92957.333277] [<ffffffff9fd86c8f>] ? __schedule+0x3af/0x860
[92957.333279] [<ffffffff9fc35269>] ___sys_sendmsg+0x3e9/0x400
[92957.333284] [<ffffffff9f712040>] ? futex_wake+0x90/0x180
[92957.333287] [<ffffffff9f714d2a>] ? do_futex+0x12a/0x5a0
[92957.333289] [<ffffffff9fc36921>] __sys_sendmsg+0x51/0x90
[92957.333292] [<ffffffff9fc36972>] SyS_sendmsg+0x12/0x20
[92957.333296] [<ffffffff9fd93f92>] system_call_fastpath+0x25/0x2a
阅读全文 »

SSH不仅可以使用远程管理主机,还可以利用SSH客户端和SSH服务器之间的加密连接为其他服务实际中继服务,这一般称为SSH隧道(SSH Tunneling)或者SSH端口转发

SSH端口转发分为三种类型:

  • 动态端口转发
  • 本地端口转发
  • 远程端口转发

无论是哪种端口转发,整个过程都涉及四个角色:

  • 业务客户端
  • SSH客户端
  • SSH服务器
  • 业务服务端

这些角色进程并不要求都位于独立主机上,它们可以位于同一台主机上,使用localhost或者127.0.0.1进行网络访问。

本文基于这4种角色来简要说明这三种端口转发的过程。三种端口转发都依赖SSH客户端SSH服务器建立一个加密连接在二者之间转发数据。

阅读全文 »

近期我们的BASH脚本中遇到一个BUG,最终分析到是变量值为空时没有用""包裹导致的。

我们使用一个测试脚本来进行分析。测试脚本t.sh内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

kof=""

if [ ! -f $kof ]; then
echo "1"
fi

if [ ! -f "$kof" ]; then
echo "2"
fi

echo "END"

测试脚本的执行结果如下:

1
2
3
[root@default ~]# bash t.sh
2
END

可以看到当变量$kof为空时,第一个if语句块中的语句没有被执行,而第二个if语句块中的语句被执行了。这两个语句块的差别就在于第二个语句块中的$kof变量用""进行了包裹。

阅读全文 »

近期遇到一个服务器上内核模块无法卸载的问题。执行rmmod命令返回错误信息:

1
Device or resource busy

通过Google搜索,发现其他人也遇到过类似的问题,原因基本指向是编译内核模块的gcc版本和编译内核的gcc版本不一致。

于是开始检查我们的环境。

阅读全文 »

seccomp代表secure computing,是早在2.6.12版本就引入到内核的特性,用来限制进程可以使用的系统调用。它作用于进程里的线程(task)。

最初,seccomp只允许使用read, write, _exit, sigreturn4个系统调用,调用其他系统调用时,内核会发送SIGKILL信号终止进程。当时seccomp的提出主要是想用于出租空闲的CPU算力。这种模式叫做STRICT模式。它限制过于严格,在实际应用上并没有太多发展。Linus Torvald甚至建议把它从内核中砍掉。

阅读全文 »