[编译] 10、kconfig 入门指导教程

技术杂谈59

前言

Kconfig 的作用就是为了让用户配置内核,在 Kconfig 中定义了一些变量,用户通过设置变量的值来选择如何个性化自己的系统内核。其和 makefile 往往需要配合使用,来组织编译大型工程。这里我们从一个 DEMO 讲起,然后介绍 Kconfig 具体语法。

1. 安装 kconfig

yaourt -S kconfig-frontends

2. 克隆一个 demo

➜  git clone https://github.com/skif-web/demo-kbuild.git
➜  demo-kbuild git:(master) ls
getLast.sh  KConfig  README.md

3. 运行 kconfig

运行 kconfig-mconf KConfig 会弹出交互页面,用户可以做一些选择,然后会在同级目录下自动生成一个 .config 文件,表示用户的选择

[编译] 10、kconfig 入门指导教程

4. 源码解析

4.1 选择题目设计模板

下面是选择类型的题目模板:

choice SELECT_DESTINATION                           # 选择
    prompt "Select data destination"                # 选项的题干
    default DESTINATION_TTY                         # 默认选项

config SELECT_DESTINATION_TTY                       # 选项 SELECT_DESTINATION_TTY
    bool "show data in console"
config SELECT_DESTINATION_FILE                      # 选项 SELECT_DESTINATION_FILE
    bool "save data to file"
endchoice

对应的 GUI 为:

[编译] 10、kconfig 入门指导教程

[编译] 10、kconfig 入门指导教程

4.2 填空题目设计模板

下面是填空类型的题目模板:

config SELECT_DESTINATION_FILE_FILENAME             # 填空
    string "destination file"                       # 填空的题干
    depends on SELECT_DESTINATION_FILE              # 这个填空题是否会出现,取决于上面的选择是否选择了 SELECT_DESTINATION_FILE
    default "last.log"                              # 默认填空答案
    help
      Write destination file with relative or full path

对应的 GUI 为:

[编译] 10、kconfig 入门指导教程

4.3 判断题目设计模板

下面是判断类型的题目模板:

config SHOW_ONLY_CURRENT_USER
    bool "show data only for current user"          # bool 是否选择
    default y                                       # 默认选项 yes
    help                                            # 帮助内容
      script will get data only for currewnt user

对应的 GUI 为:

[编译] 10、kconfig 入门指导教程

5. 产物解析

生成的 .config 为:

➜  demo-kbuild git:(master) ✗ cat .config
#
# Automatically generated file; DO NOT EDIT.

# Configuration
#
# CONFIG_SELECT_DESTINATION_TTY is not set
CONFIG_SELECT_DESTINATION_FILE=y
CONFIG_SELECT_DESTINATION_FILE_FILENAME="last.log"
CONFIG_SHOW_ONLY_CURRENT_USER=y

OR

➜  demo-kbuild git:(master) ✗ cat .config
#
# Automatically generated file; DO NOT EDIT.

# Configuration
#
CONFIG_SELECT_DESTINATION_TTY=y
# CONFIG_SELECT_DESTINATION_FILE is not set
# CONFIG_SHOW_ONLY_CURRENT_USER is not set          # bool 类型不选会这样显示,而不是 N !!!

6. 产物使用

克隆下来的仓库文件夹下有个 getLast.sh 小脚本,该脚本展示了如何使用 .config

➜  demo-kbuild git:(master) ✗ cat getLast.sh
#!/bin/bash

# script running script
workDir=`dirname "$(readlink -f "$0")"`

# future command to run
cmdline="last "

# read config
source $workDir/.config || { echo "ERROR! Unable to read config"; exit 1; }

# if select
if [ "x$CONFIG_SHOW_ONLY_CURRENT_USER" == "xy" ]; then
    currentUser=`whoami`
    cmdline="$cmdline $currentUser"
fi

# now run command. If destination is file - ise redirect
if [ "x$CONFIG_SELECT_DESTINATION_FILE" == "xy" ]; then
    $cmdline > $CONFIG_SELECT_DESTINATION_FILE_FILENAME
else
    $cmdline
fi

这个例子非常经典,用 source 加载 .config,然后用 if [ "x$CONFIG_SHOW_ONLY_CURRENT_USER" == "xy" ] 进行优雅的判断。

7.Kconfig语法简介

!!! 这里直接用园友黄超树的总结《Kconfig语法简介

*[En]*

**

7.1 单一选项 config

原则:每一个config就是一个选项,最上面跟着控制句柄,下面则是对这个选项的配置,如选项名是什么,依赖什么,选中这个后同时会选择什么。

一个配置选项定义可以是下面的形式:

config MODVERSIONS
   bool "Set version information on all module symbols"
   depends MODULES
   help
      Usually, modules have to be recompiled whenever you switch to a new
      kernel. ...

  • "config" ,配置选项。 而它下面的几行定义了该配置选项的属性。 属性可以是该配置选项的类型,输入提示(input prompt),依赖关系,帮助信息和默认值。 配置选项可以用相同的名字定义多次,但每个定义只能有一个输入提示并且类型还不能冲突。
  • "bool" ,类型定义 :"bool"/"tristate"/"string"/"hex"/"int" 每个配置选项都必须指定类型。有两个基本类型:tristate 和 string,其他类型都是基于这两个基本类型。
类型定义可以用输入提示,所以下面的两个例子是等价的:

   bool "Networking support"
和
   bool
   prompt "Networking support"
  • "depends on", 依赖关系:"depends on"/"requires" 为菜单选项定义依赖关系。如果定义了复杂的逻辑依赖关系系,它们之间用 '&&','||','('与')' 间隔。 依赖关系也可以应用到该菜单中所有的其它选项(同样接受一if表达式),所以下面的两个例子是等价的:
   bool "foo" if BAR
   default y if BAR
和
   depends on BAR
   bool "foo"
   default y
  • "select", 反向依赖关系,语法为:**"select" ["if" ] 反向依赖只能用在 boolean 或 tristate 选项上。 当前选项选中后则select后指定的选项自动被选择。 尽管普通的依赖关系可以降低一选项的上限,反向依赖能将这一限制降的更低。 当前菜单选项的值是symbol的最小值。如果symbol被选择了多次,上限就是其中的最大值。
  • "default", 默认值:"default" ["if" ] 一个配置选项可以有任意多个默认值。如果有多个默认值,那么只有第一个被定义的值是可用的。 默认值并不是只限于应用在定义他们的菜单选项。这就意味着默认值可以定义在任何地方或被更早的定义覆盖。 如果用户没有设置(通过上面的输入提示),配置选项的值就是默认值。如果可以显示输入提示的话,就会把默认值显示给用户,并可以让用户进行修改。 默认值的依赖关系可以用 "if" 添加。(可选项)

menu条目用于生成菜单,格式如下:

menu "Floating poing emulation"
        config FPE_NWFPE
        ..............

        config FPE_NWFPE_XP
        .............

endmenu

menu之后的字符串是菜单名,menu和endmenu之间有很多config条目(待会说介绍config条目),在配置界面上会出现如下字样的菜单,移动光标选中它之后按回车进入,就会看到config条目定义的配置选项。

Floating point emulation  --->
           [] FPE_NWFPE
           [] FPE_NWFPE_XP

7.3 选择框 choice

choice条目将多个类似的配置选项组合在一起,供用户单选或者多选。

choice
    prompt "arm system type"
    default arch_versatile
config arch_aarc200
    ...

config arch_integrator
    ...

endchoice

prompt后面跟的是提示信息,光标选中它后按回车键进入,就可以看到多个config条目定义的配置选项。
条目中定义的变量类型只能有两种:bool和tristate,不能同时有这两种类型的变量。

对于bool类型的choice条目,只能在多个选项中选择一个;

对于tristate类型的choice条目,要么就把多个选项都设为m;要么就像bool类型的choice条目一样,只能选择一个。

comment条目定义了一些帮助信息,它在配置过程中出现在界面的第一行;并且这些帮助信息会出现在配置文件中,格式如下:

comment <prompt>
<comment options>
</comment></prompt>

例如:

menu "floating point emulation"
comment "At least one emultaion must be selected"
...

7.5 引入配置 source

source条目用于读入另一个Kconfig文件,格式如下:

source <promt>
</promt>

例如:

source "net/Kconfig"

链接

: 在本博客的编译系列中,有很多关于自动化构建编译的博文:https://www.cnblogs.com/zjutlitao/category/759821.html

[编译] 10、kconfig 入门指导教程

Original: https://www.cnblogs.com/zjutlitao/p/15253933.html
Author: beautifulzzzz
Title: [编译] 10、kconfig 入门指导教程



相关阅读

Title: Prometheus 监控进程

Process-exporter

process-exporter可以用来检测所选进程的存活状态

下载process-exporter

下载地址:https://github.com/ncabatoff/process-exporter/releases/tag/v0.4.0

安装部署process-exporter

1

tar&#xA0; - zxvf process - exporter - 0.4 . 0.linux - amd64.tar.gz&#xA0; - C&#xA0; / usr / local / process - exporter

编写配置文件

```bash;gutter:true;
cat process-exporter.yaml
process_names:

  • name: "{{.Matches}}"
    cmdline:

    • 'dbbakup'
  • name: "{{.Matches}}"
    cmdline:

    • 'mysql'
  • name: "{{.Matches}}"
    cmdline:

    • 'pushgateway'

注 cmdline: 所选进程的唯一标识,ps -ef 可以查询到。如果改进程不存在,则不会有该进程的数据采集到。

编写启动脚本

```bash;gutter:false;
cat /usr/lib/systemd/system/process_exporter.service
[Unit]
Description=Prometheus exporter for processors metrics, written in Go with pluggable metric collectors.

Documentation=https://github.com/ncabatoff/process-exporter
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/usr/local/process-exporter
ExecStart=/usr/local/process-exporter/process-exporter -config.path=/usr/local/process-exporter/process-exporter.yaml
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动process-exporter

1

2

3

systemctl daemon - reload

systemctl start process_exporter

systemctl enable process_exporter

验证

1

curl localhost: 9256 / metrics

修改Prometheus配置文件

1

2

3

4

5

&#x589E;&#x52A0;
- job_name:&#xA0; 'process'
static_configs:
- targets: [ '172.16.8.187:9256' ]

重启Prometheus

[编译] 10、kconfig 入门指导教程

添加告警规则

```bash;gutter:false;
cat process.yml
groups:
- name: process
rules:
- alert: backup-mysql-Down
expr: absent(namedprocess_namegroup_states{groupname="map[:mysql]"})
for: 1m
labels:
severity: critical
annotations:
summary: backup slave mysql docker process Down (instance {{ $labels.instance }})
description: "backup slave mysql process is down\n LABELS = {{ $labels }}"

  • alert: pushgateway-Down
    expr: absent(namedprocess_namegroup_states{groupname="map[:pushgateway]"})
    for: 1m
    labels:
    severity: critical
    annotations:
    summary: pushgateway process Down (instance {{ $labels.instance }})
    description: "pushgateway process is down\n LABELS = {{ $labels }}"

  • alert: dbback-process-Down
    expr: absent(namedprocess_namegroup_states{groupname="map[:dbbakup]"})
    for: 1m
    labels:
    severity: critical
    annotations:
    summary: dbbackup docker process Down (instance {{ $labels.instance }})
    description: "dbbackup docker process is down\n LABELS = {{ $labels }}"
    ```

Original: https://www.cnblogs.com/weifeng1463/p/16229204.html
Author: Oops!#
Title: Prometheus 监控进程