kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

gdb 输出控制

1

1
set print repeats [on/off]

设置打印数组的长度上限值。如果数组中连续相同的成员的数量超过这个上限,GDB会打印字符串””,这里n是同样的重复次数,而不是重复打印这些相同的成员。将这个上限设置为0的话,打印所有的成员。默认上限时10。

1
show print repeats

显示打印重复相同成员的上限数量。

2

1
set print elements <number-of-elements>

这个选项主要是设置数组的,假如你的数组太大了,那么就可以指定一个来指定数据显示的最大长度,当到达这个长度时,GDB就不再往下显示了。假如设置为0,则表示不限制。

1
show print elements

查看print elements的选项信息。

3

运行GDB的时候 总是会出现type return to continue,or q to quit,
因为显示得太多,此时gdb的显示会有些像more命令
把这个消息屏蔽掉可以设置

1
set pagination off 

4

将GDB中需要的调试信息输出到文件

1
2
3
4
# (gdb) set logging file <文件名>
# (gdb) set logging on
# (gdb) bt
# (gdb) set logging off

gdb的脚本使用

1)启动gdb时候

1、gdb在启动的时候,会在当前目录下查找".gdbinit"这个文件,并把它的内容作为gdb命令进行解释,所以如果我把脚本命名为".gdbinit",这样在启动的时候就会处理这些命令。
2、启动gdb的时候自动执行脚本 gdb -x your_script

2)gdb运行期间

可以使用 source script-file 来解释gdb命令脚本script-file

linux内核模块签名

make binrpm-pkg 模块签名和debuginfo同时开启会出错

模块签名是在mod_install的时候,但后续在find-debuginfo.sh中debugedit又会修改文件,导致前面的签名无效。

可行改动方法为:

  1. 在Makefile中将 mod_sign_cmd = perl $(srctree)/scripts/sign-file $(CONFIG_MODULE_SIG_HASH) $(MODSECKEY) $(MODPUBKEY) 改为 mod_sign_cmd=true

  2. 在find-debuginfo_kk.sh中的debugedit后几行位置加上下面三行

1
2
3
  if [[ $f =~ .ko$ ]]; then
    $BUILDDIR/scripts/sign-file "sha256" "$BUILDDIR/signing_key.priv" "$BUILDDIR/signing_key.x509" "$f"
  fi

vault.centos.org/7.3.1611/os/Source/SPackages/rpm-4.11.3-21.el7.src.rpm


linux内核模块签名 Documentation/module_signing.txt

内核在模块模块加载时使用加密签名验证,校验签名是否与已编译的内核公钥匹配。目前只支持RSA X.509验证。
签名验证在通过CONFIG_MODULE_SIG使能。打开签名同时还会强制做模块ELF元数据检查,然后再做签名验证。

公钥生成

内核编译时可以指定一系列的公钥。x509.genkey文件用来生成X509密钥。如果没有该文件,系统会自动提供一个默认的配置。Makefile会根据x509.genkey规则在内核编译根目录生成默认配置,用户可以手动更改该文件。

由此在内核编译过程中分别生成私钥和公钥文件分别为./signing_key.priv和./signing_key.x509。

默认配置是使用/dev/random生成的。如果/dev/random没有足够数据,在后台运行以下命令可以生成更多的数据:rngd -r /dev/urandom。

模块签名

设置了CONFIG_MODULE_SIG_ALL,所有模块将会自动添加签名。如果没有设置,需要手动添加:
scripts/sign-file $(MODSECKEY) $(MODPUBKEY) modules.ko
哈希算法必须为sha1, sha224, sha256, sha384, sha512。对应的加密算法必须是使能的。CONFIG_MODULE_SIG_HASH设置sign-file使用的默认算法。

MODSECKEY=<secret-key-ring-path>
加密私钥文件,默认是./signing_key.priv

MODPUBKEY=<public-key-ring-path>
加密公钥文件,默认为./signing_key.x509

签名模块裁减

签名模块裁减就是去除签名部分,在重新签名之前需要先裁减之前的签名。在打包内核模块发布时,并没有自动裁减。

加载签名模块

模块是通过insmod来加载的,模块加载时通过检查模块的签名部分来验证。

不合法签名和没有签名的模块

如果设 置了CONFIG_MODULE_SIG_FORCE或者在内核启动命令行设置了module.sig_enforce,内核将只加载带有公钥的合法签名 模块。如果都没有设置则会加载没有签名的模块。如果内核有密钥,但模块没有提供合法的签名就会被拒绝加载。下表说明了各种情况:

1
2
3
4
5
6
7
8
模块状态     许可模式    强制检查
未签名         通过      EKEYREJECTED
签名,没有公钥     ENOKEY      ENOKEY
签名,公钥       通过      通过
非法签名,公钥     EKEYREJECTED    EKEYREJECTED
签名,过期密钥     EKEYEXPIRED EKEYEXPIRED
破坏的签名       EBADMSG     EBADMSG
破坏的ELF      ENOEXEC     ENOEXEC