1. 前言

 UBOOT版本:uboot2018.03,开发板myimx8mmek240。

2. 概述

本节主要接上一节解析 :include/config.h、 include/autoconf.mk、include/autoconf.mk.dep、spl/include/autoconf.mk、u-boot.cfg、spl/u-boot.cfg。

3 语句 $ (Q) $(MAKE) -f $(srctree)/scripts/Makefile.autoconf

由于未指定目标,采用默认目标__all

#note:scripts/Makefile.autoconf
__all: include/autoconf.mk include/autoconf.mk.dep ifeq ($(shell grep -q '^CONFIG_SPL=y' include/config/auto.conf 2>/dev/null && echo y),y) //本人单板该条件成立
__all: spl/include/autoconf.mk endif include/autoconf.mk.dep: include/config.h FORCE
$(call cmd,autoconf_dep) spl/include/autoconf.mk: spl/u-boot.cfg
$(Q)mkdir -p $(dir $@)
$(call cmd,autoconf) u-boot.cfg: include/config.h FORCE
$(call cmd,u_boot_cfg) spl/u-boot.cfg: include/config.h FORCE
$(Q)mkdir -p $(dir $@)
$(call cmd,u_boot_cfg,-DCONFIG_SPL_BUILD) include/config.h: scripts/Makefile.autoconf create_symlink FORCE
$(call filechk,config_h)

3.1 依赖include/autoconf.mk

include/autoconf.mk: u-boot.cfg
$(call cmd,autoconf)
u-boot.cfg: include/config.h FORCE
$(call cmd,u_boot_cfg)

3.1.1 include/config.h的规则

include/config.h: scripts/Makefile.autoconf create_symlink FORCE
$(call filechk,config_h)
3.1.1.1 FORCE

参见UBOOT编译--- make xxx_deconfig过程详解(一)4.3小节。

3.1.1.2 create_symlink

为mach相关的头文件在arch/arm/include/asm/arch创建软连接。

#note:scripts/Makefile.autoconf
# symbolic links
# If arch/$(ARCH)/mach-$(SOC)/include/mach exists,
# make a symbolic link to that directory.
# Otherwise, create a symbolic link to arch/$(ARCH)/include/asm/arch-$(SOC).
PHONY += create_symlink
create_symlink:
ifdef CONFIG_CREATE_ARCH_SYMLINK
ifneq ($(KBUILD_SRC),)
$(Q)mkdir -p include/asm
$(Q)if [ -d $(KBUILD_SRC)/arch/$(ARCH)/mach-$(SOC)/include/mach ]; then \
dest=arch/$(ARCH)/mach-$(SOC)/include/mach; \
else \
dest=arch/$(ARCH)/include/asm/arch-$(if $(SOC),$(SOC),$(CPU)); \
fi; \
ln -fsn $(KBUILD_SRC)/$$dest include/asm/arch
else
$(Q)if [ -d arch/$(ARCH)/mach-$(SOC)/include/mach ]; then \
dest=../../mach-$(SOC)/include/mach; \
else \
dest=arch-$(if $(SOC),$(SOC),$(CPU)); \
fi; \
ln -fsn $$dest arch/$(ARCH)/include/asm/arch
endif
endif

如果采用直接在源目录编译的方式时KBUILD_SRC为空,走else分支。对于我调试的单板ARCH=arm,SOC=imx8m,因此执行else语句展开为:

if [ -d arch/arm/mach-imx8m/include/mach ]; then        \
dest=../../mach-imx8m/include/mach; \
else \
dest=arch-imx8m; \
fi; \
ln -fsn $dest arch/arm/include/asm/arch

由于我使用的单板设备商提供的源码中没有arch/arm/mach-imx8m/include/mach 和arch-imx8m目录(而是直接在arch/arm/include/asm/arch目录下提供必要的头文件,当然一般不建议这么做)。执行该句相当于未执行。

3.1.1.3 scripts/Makefile.autoconf

指定的依赖文件。

3.1.1.4 规则 $(call filechk,config_h)
#note:scripts/Kbuild.include
###
# filechk is used to check if the content of a generated file is updated.
# Sample usage:
# define filechk_sample
# echo $KERNELRELEASE
# endef
# version.h : Makefile
# $(call filechk,sample)
# The rule defined shall write to stdout the content of the new file.
# The existing file will be compared with the new one.
# - If no file exist it is created
# - If the content differ the new file is used
# - If they are equal no change, and no timestamp update
# - stdin is piped in from the first prerequisite ($<) so one has
# to specify a valid file as first prerequisite (often the kbuild file)
define filechk
$(Q)set -e; \
$(kecho) ' CHK $@'; \
mkdir -p $(dir $@); \
$(filechk_$(1)) < $< > $@.tmp; \
if [ -r $@ ] && cmp -s $@ $@.tmp; then \
rm -f $@.tmp; \
else \
$(kecho) ' UPD $@'; \
mv -f $@.tmp $@; \
fi
endef

上述代码中$@为3.2.1小节的目标:‘include/config.h’,‘ $ (1)’为第一个参数config_h,‘$<’ 为第一个依赖scripts/Makefile.autoconf展开为:

	$(Q)set -e;				\
$(kecho) ' CHK include/config.h'; \
mkdir -p $(dir $@); \
$(filechk_config_h) < scripts/Makefile.autoconf > include/config.h.tmp; \
if [ -r include/config.h ] && cmp -s include/config.h include/config.h.tmp; then \
rm -f include/config.h.tmp; \
else \
$(kecho) ' UPD include/config.h'; \
mv -f include/config.h.tmp include/config.h; \
fi

filechk_config_h定义在scripts/Makefile.autoconf中

#note:scripts/Makefile.autoconf
# Prior to Kconfig, it was generated by mkconfig. Now it is created here.
define filechk_config_h
(echo "/* Automatically generated - do not edit */"; \
for i in $$(echo $(CONFIG_SYS_EXTRA_OPTIONS) | sed 's/,/ /g'); do \
echo \#define CONFIG_$$i \
| sed '/=/ {s/=/ /;q; } ; { s/$$/ 1/; }'; \
done; \
echo \#define CONFIG_BOARDDIR board/$(if $(VENDOR),$(VENDOR)/)$(BOARD);\
echo \#include \<config_defaults.h\>; \
echo \#include \<config_uncmd_spl.h\>; \
echo \#include \<configs/$(CONFIG_SYS_CONFIG_NAME).h\>; \
echo \#include \<asm/config.h\>; \
echo \#include \<linux/kconfig.h\>; \
echo \#include \<config_fallbacks.h\>;)
endef

其中CONFIG_SYS_EXTRA_OPTIONS为xxx_deconfig中定义:CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg,SPL_TEXT_BASE=0x7E1000"。具体编译命令如下:

set -e; : '  CHK     include/config.h'; mkdir -p include/;      (echo "/* Automatically generated - do not edit */"; for i in $(echo "IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg,SPL_TEXT_BASE=0x7E1000" | sed 's/,/ /g'); do echo \#define CONFIG_$i | sed '/=/ {s/=/   /;q; } ; { s/$/ 1/; }'; done; echo \#define CONFIG_BOARDDIR board/myzr/myimx8mm; echo \#include \<config_defaults.h\>; echo \#include \<config_uncmd_spl.h\>; echo \#include \<configs/"myimx8mmek240".h\>; echo \#include \<asm/config.h\>; echo \#include \<linux/kconfig.h\>; echo \#include \<config_fallbacks.h\>;) < scripts/Makefile.autoconf > include/config.h.tmp; if [ -r include/config.h ] && cmp -s include/config.h include/config.h.tmp; then rm -f include/config.h.tmp; else : '  UPD     include/config.h'; mv -f include/config.h.tmp include/config.h; fi

include/config.h内容如下:

3.1.2 u-boot.cfg的规则 $(call cmd,u_boot_cfg)

#note:scripts/Makefile.autoconf
# echo command.
# Short version is used, if $(quiet) equals `quiet_', otherwise full one.
echo-cmd = $(if $($(quiet)cmd_$(1)),\
echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';) # printing commands
cmd = @$(echo-cmd) $(cmd_$(1))

quiet定义在顶层Makefile,默认值(空),escsq的作用是转义在回显语句中使用的单引号。为了方便理解,这里把静默编译功能关掉,即quiet=quiet_。

quiet_cmd_u_boot_cfg = CFG     $@     //编译时经常看的就是这句打印
cmd_u_boot_cfg = \
$(CPP) $(c_flags) $2 -DDO_DEPS_ONLY -dM $(srctree)/include/common.h > $@.tmp && { \
grep 'define CONFIG_' $@.tmp > $@; \
rm $@.tmp; \
} || { \
rm $@.tmp; false; \
}

上诉命展开如下:

  /home/h/my-work/03_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc -E -Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -fshort-wchar -O2 -fno-stack-protector -fno-delete-null-pointer-checks -g -fstack-usage -Wno-format-nonliteral -Werror=date-time  -D__KERNEL__ -D__UBOOT__   -D__ARM__           -fno-pic  -mstrict-align  -ffunction-sections -fdata-sections -fno-common -ffixed-r9    -fno-common -ffixed-x18 -pipe -Iinclude  -I./arch/arm/include -include ./include/linux/kconfig.h  -nostdinc -isystem /home/h/my-work/03_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.3.1/include  -DDO_DEPS_ONLY -dM ./include/common.h > u-boot.cfg.tmp && { grep 'define CONFIG_' u-boot.cfg.tmp > u-boot.cfg; rm u-boot.cfg.tmp; } || { rm u-boot.cfg.tmp; false; }

$2为空,编译选项“-dM”的作用是输出include/common.h中定义的所有宏。根据上面的规则,编译器提取include/common.h中(include/common.h文件包含了include/config.h文件,而include/config.h文件又包含了其它头文件,这里面的内容都会得到解析。 )定义的宏,然后输出给u-boot.cfg.tmp,然后查找和处理以“CONFIG_”开头的宏定义的功能并输出给u-boot.cfg。

3.1.3 include/autoconf.mk的规则 $(call cmd,autoconf)

# We are migrating from board headers to Kconfig little by little.
# In the interim, we use both of
# - include/config/auto.conf (generated by Kconfig)
# - include/autoconf.mk (used in the U-Boot conventional configuration)
# The following rule creates autoconf.mk
# include/config/auto.conf is grepped in order to avoid duplication of the
# same CONFIG macros
quiet_cmd_autoconf = GEN $@ //编译时经常看的就是这句打印
cmd_autoconf = \
sed -n -f $(srctree)/tools/scripts/define2mk.sed $< | \
while read line; do \
if [ -n "${KCONFIG_IGNORE_DUPLICATES}" ] || \
! grep -q "$${line%=*}=" include/config/auto.conf; then \
echo "$$line"; \
fi \
done > $@

上诉命展开如下:

sed -n -f ./tools/scripts/define2mk.sed u-boot.cfg | while read line; do if [ -n "" ] || ! grep -q "${line%=*}=" include/config/auto.conf; then echo "$line"; fi done > include/autoconf.mk

上面语句就是寻找u-boot.cfg 中有但是include/config/auto.conf没有的行,并把摘到的内容输出到include/autoconf.mk中

3.2 include/autoconf.mk.dep

include/autoconf.mk.dep: include/config.h FORCE
$(call cmd,autoconf_dep)
#note:scripts/Makefile.autoconf
# echo command.
# Short version is used, if $(quiet) equals `quiet_', otherwise full one.
echo-cmd = $(if $($(quiet)cmd_$(1)),\
echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';) # printing commands
cmd = @$(echo-cmd) $(cmd_$(1))

quiet定义在顶层Makefile,默认值(空),escsq的作用是转义在回显语句中使用的单引号。为了方便理解,这里把静默编译功能关掉,即quiet=quiet_。

quiet_cmd_autoconf_dep = GEN     $@
cmd_autoconf_dep = $(CC) -x c -DDO_DEPS_ONLY -M -MP $(c_flags) \
-MQ include/config/auto.conf $(srctree)/include/common.h > $@ || { \
rm $@; false; \
}

上诉命展开如下:

   /home/h/my-work/03_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc -x c -DDO_DEPS_ONLY -M -MP -Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -fshort-wchar -O2 -fno-stack-protector -fno-delete-null-pointer-checks -g -fstack-usage -Wno-format-nonliteral -Werror=date-time  -D__KERNEL__ -D__UBOOT__   -D__ARM__           -fno-pic  -mstrict-align  -ffunction-sections -fdata-sections -fno-common -ffixed-r9    -fno-common -ffixed-x18 -pipe -Iinclude  -I./arch/arm/include -include ./include/linux/kconfig.h  -nostdinc -isystem /home/h/my-work/03_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.3.1/include -MQ include/config/auto.conf ./include/common.h > include/autoconf.mk.dep || { rm include/autoconf.mk.dep; false; }

分析:include/autoconf.mk.dep依赖 include/config.h,其中include/config.h为动态创建。

(1)-M 生成目标依赖关系,其中目标的格式为源文件去路径文件名+.o后缀。生成文件的依赖关系,同时也把一些标准库的头文件包含了进来。本质是告诉预处理器输出一个适合 make 的规则,用于描述各目标文件的依赖关系。对于每个源文件,预处理器输出 一个 make 规则,该规则的目标项 (target) 是源文件对应的目标文件名,依赖项 (dependency) 是源文件中 “#include” 引用的所有文件,生成的规则可以是单行,但如果太长,就用’'换行符续成多行。规则显示在标准输出,不产生预处理过的 C 程序。

-M 处理后的格式如下:



(2)-MP生成的依赖文件里面,依赖规则中的所有 .h 依赖项都会在该文件中生成一个伪目标,其不依赖任何其他依赖项。该伪规则将避免删除了对应的头文件而没有更新 “Makefile” 去匹配新的依赖关系而导致 make 出错的情况出现。

-MP 处理后的格式如下:



(3)-MQ相当于-MT,覆盖默认的源文件去路径文件名+.o后缀的目标生成格式,采用指定的字符串,这里对应include/config/auto.conf;

-MQ 处理后的格式如下:



(4)$@为自动变量,代表依赖关系中的目标,这里对应include/autoconf.mk.dep;

(5)-x c,指定源文件使用C语言语法;

总体来说:该依赖关系用来生成include/autoconf.mk.dep,生成的方法是生成 include/common.h的依赖关系

3.3 spl/u-boot.cfg

spl/u-boot.cfg: include/config.h FORCE
$(Q)mkdir -p $(dir $@)
$(call cmd,u_boot_cfg,-DCONFIG_SPL_BUILD)

cmd的定义在本篇前面已经讲过,这里略过,直接展开$(call cmd,u_boot_cfg,-DCONFIG_SPL_BUILD):

```c
quiet_cmd_u_boot_cfg = CFG $@ //编译时经常看的就是这句打印
cmd_u_boot_cfg = \
$(CPP) $(c_flags) $2 -DDO_DEPS_ONLY -dM $(srctree)/include/common.h > $@.tmp && { \
grep 'define CONFIG_' $@.tmp > $@; \
rm $@.tmp; \
} || { \
rm $@.tmp; false; \
}

上诉命展开如下:

 /home/h/my-work/03_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc -E -Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -fshort-wchar -O2 -fno-stack-protector -fno-delete-null-pointer-checks -g -fstack-usage -Wno-format-nonliteral -Werror=date-time  -D__KERNEL__ -D__UBOOT__   -D__ARM__           -fno-pic  -mstrict-align  -ffunction-sections -fdata-sections -fno-common -ffixed-r9    -fno-common -ffixed-x18 -pipe -Iinclude  -I./arch/arm/include -include ./include/linux/kconfig.h  -nostdinc -isystem /home/h/my-work/03_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.3.1/include -DCONFIG_SPL_BUILD -DDO_DEPS_ONLY -dM ./include/common.h > spl/u-boot.cfg.tmp && { grep 'define CONFIG_' spl/u-boot.cfg.tmp > spl/u-boot.cfg; rm spl/u-boot.cfg.tmp; } || { rm spl/u-boot.cfg.tmp; false; }

$2为-DCONFIG_SPL_BUILD(新增宏定义CONFIG_SPL_BUILD ),编译选项“-dM”的作用是输出include/common.h中定义的所有宏。根据上面的规则,编译器提取include/common.h中(include/common.h文件包含了include/config.h文件,而include/config.h文件又包含了其它头文件,这里面的内容都会得到解析。 )定义的宏,然后输出给spl/u-boot.cfg.tmp,然后查找和处理以“CONFIG_”开头的宏定义的功能并输出给spl/u-boot.cfg。

spl/u-boot.cfg和u-boot.cfg的区别主要是根据是否定义CONFIG_SPL_BUILD宏,代码会有不同的分支

3.4 spl/include/autoconf.mk

spl/include/autoconf.mk: spl/u-boot.cfg
$(Q)mkdir -p $(dir $@)
$(call cmd,autoconf)
# We are migrating from board headers to Kconfig little by little.
# In the interim, we use both of
# - include/config/auto.conf (generated by Kconfig)
# - include/autoconf.mk (used in the U-Boot conventional configuration)
# The following rule creates autoconf.mk
# include/config/auto.conf is grepped in order to avoid duplication of the
# same CONFIG macros
quiet_cmd_autoconf = GEN $@ //编译时经常看的就是这句打印
cmd_autoconf = \
sed -n -f $(srctree)/tools/scripts/define2mk.sed $< | \
while read line; do \
if [ -n "${KCONFIG_IGNORE_DUPLICATES}" ] || \
! grep -q "$${line%=*}=" include/config/auto.conf; then \
echo "$$line"; \
fi \
done > $@

上诉命展开如下:

sed -n -f ./tools/scripts/define2mk.sed spl/u-boot.cfg | while read line; do if [ -n "" ] || ! grep -q "${line%=*}=" include/config/auto.conf; then echo "$line"; fi done > spl/include/autoconf.mk

上面语句就是寻找spl/u-boot.cfg中有但是include/config/auto.conf没有的行,并把摘到的内容输出到spl/include/autoconf.mk中

4. 总结(包含上一篇文章)

#顶层Makefile
|--- include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd //KCONFIG_CONFIG = .config
|
|--- $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
| |--- #顶层Makefile
| |--- %config: scripts_basic outputmakefile FORCE
| |--- $(Q)$(MAKE) $(build)=scripts/kconfig $@
| | |--- #scripts/kconfig/Makefile
| | |--- silentoldconfig: $(obj)/conf
| |--- $(Q)mkdir -p include/config include/generated
| |--- $(Q)test -e include/generated/autoksyms.h || touch include/generated/autoksyms.h
| |--- $< $(silent) --$@ $(Kconfig) //等价于 scripts/kconfig/conf -s --myimx8mmek240-8mm-2g_defconfig .config
|
|--- $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.autoconf //未指定目标,采用默认目标__all
| |--- #scripts/Makefile.autoconf
| |--- __all: include/autoconf.mk include/autoconf.mk.dep
| | |--- include/autoconf.mk: u-boot.cfg
| | | |--- $(call cmd,autoconf_dep)//通过编译选项"-M"、"-MP"、"-MQ"生成 include/common.h的依赖关系
| |
| |---__all: spl/include/autoconf.mk
| |--- spl/include/autoconf.mk: spl/u-boot.cfg
| | | |--- $(Q)mkdir -p $(dir $@)
| | | |--- $(call cmd,autoconf)//寻找spl/u-boot.cfg中有但是include/config/auto.conf没有的行,并把摘到的内容输出到spl/include/autoconf.mk中 include/config.h: scripts/Makefile.autoconf create_symlink FORCE
$(call filechk,config_h) //生成include/config.h文件 u-boot.cfg: include/config.h FORCE
$(call cmd,u_boot_cfg) //通过编译选项"-dM"输出include/common.h中定义的所有宏 spl/u-boot.cfg: include/config.h FORCE
$(Q)mkdir -p $(dir $@)
$(call cmd,u_boot_cfg,-DCONFIG_SPL_BUILD)//通过宏 CONFIG_SPL_BUILD 和编译选项"-dM"输出include/common.h中定义的所有宏_SPL_BUILD)//通过宏 CONFIG_SPL_BUILD 和编译选项"-dM"输出include/common.h中定义的所有宏

5. 参考

(1)Linux Makefile 生成 *.d 依赖文件以及 gcc -M -MF -MP 等相关选项说明

(2)gcc -M -MM -MQ -MF -MT -MD(示例代码)

(3)gcc 选项 -M -MQ

UBOOT编译--- include/config.h、 include/autoconf.mk、include/autoconf.mk.dep、u-boot.cfg(三)的更多相关文章

  1. mac 安装 报错 "/usr/local/include/stdint.h:2:10: error: #include nested too deeply"

    报错详细信息 构建错误 - “#include嵌套太深” /usr/local/include/stdint.h:2:10: error: #include nested too deeply #in ...

  2. U-Boot编译过程完全分析

    2.1       U-Boot Makefile分析 2.1.1             U-Boot编译命令 对于mini2440开发板,编译U-Boot需要执行如下的命令: $  make  m ...

  3. u-boot 2011.09 使用自己的board 以及config.h

    一个新的方案,用的UBOOT 可能和上一个方案是同一个,但是配置有可能不一样,今天记录一下通过修改配置文件使用新的 board 文件以及 config.h 进入 u-boot 2011.09 // 打 ...

  4. #include <ntifs.h>出现PEPROCESS redefinition问题处理

    转载:http://blog.csdn.net/ytfrdfiw/article/details/23334297 如果在自己的程序中,即包含ntddk.h和ntifs.h的时候,编译的时候会出现如下 ...

  5. #include<unistd.h>存在linux中,含有系统服务的函数

    #include<unistd.h> linux标准库#include <unistd.h>与windows的#include <windows.h>(C语言开发) ...

  6. 嵌入式Linux驱动学习之路(四)u-boot编译分析

    u-boot编译分析 在配置完成后,执行make开始编译.这里打开Makefile. 首先在目标all前有一句话首先检查是否有include/config.mk文件来判断是否成功配置过. ifeq ( ...

  7. uboot编译: uboot编译配置和编译过程

    jz2440: 韦东山Linux视频第1期_裸板_UBoot_文件系统_驱动初步\第09课第2节 u-boot分析之Makefile结构分析.WMV <嵌入式linux完全开发手册> 15 ...

  8. fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”? 解决方法

    错误描述: fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#include "StdAfx.h"”? 错误分析:     此错误发 ...

  9. 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”?

    在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#include "StdAfx.h"”? 右键选择该文件.cpp格式的->属性->预编译头,→ 不使用预编译 ...

  10. VS2010编译错误:是否忘记了向源中添加“#include "stdafx.h

    VS2010编译错误:是否忘记了向源中添加“#include "stdafx.h 编译提示:fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“# ...

随机推荐

  1. .NET 实现启动时重定向程序运行路径及 Windows 服务运行模式部署

    日常工作中有时候会遇到需要将程序直接在服务器上运行,而不依赖于 IIS 托管的情况,直接运行有两种方式,一种是部署为 服务模式,另一种则是 直接启动 .NET 发布之后的 exe 文件以 控制台模式运 ...

  2. 四、frp内网穿透服务端frps.ini各配置参数详解

    [必须]标识头[common]是不可或缺的部分 [必须]服务器IPbind_addr = 0.0.0.00.0.0.0为服务器全局所有IP可用,假如你的服务器有多个IP则可以这样做,或者填写为指定其中 ...

  3. 分布式文件存储 CephFS的应用场景

    块存储 (适合单客户端使用) 典型设备:磁盘阵列,硬盘. 使用场景: a. docker容器.虚拟机远程挂载磁盘存储分配. b. 日志存储. 文件存储 (适合多客户端有目录结构) 典型设备:FTP.N ...

  4. Systemd 进程管理教程

    systemd 介绍 systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能对服务本 ...

  5. Beats processors

    文章转载自:https://elasticstack.blog.csdn.net/article/details/111321105 我们通常的做法是使用 Elasticsearch 的 ingest ...

  6. 关于MongoDB副本集和分片集群有关用户和权限的说明分析

    1.MongoDB副本集 可以先创建超管用户,然后再关闭服务,创建密钥文件,修改配置文件,启动服务,使用超管用户登录验证,然后创建普通用户 2.MongoDB分片集群 先关闭服务,创建密钥文件,修改配 ...

  7. secureCRT登录ubuntu 报错:`No compatible key-exchange method. The server supports these methods: diffie-hellman`

    在VMware虚拟机中安装好ubuntu 20.04,已安装并启动sshd,但是使用secureCRT远程登录时则报错: Key exchange failed. No compatible key- ...

  8. 【前端必会】Prettier,有了ESlint,还要Prettier

    介绍 已经安装了ESLint为什么还要Prettier,主要是让ESLint专注于语法相关的验证,检查潜在问题.而代码格式化则有Prettier来接管 对比参考: https://baijiahao. ...

  9. MQ系列6:消息的消费

    MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 在之前 ...

  10. 部署 LNMP(源码安装版本)shell脚本

    #!/bin/bash # 一键部署 LNMP(源码安装版本) menu() { clear echo " ##############‐‐‐‐Menu‐‐‐‐##############& ...