Linux近两年高危漏洞修复过程记录

一、背景

在这里插入图片描述

2023年8月份,面对即将到来的“大运会”、“亚运会”,今年的例行安全护网阶段也将迎来新的挑战和时刻,为此相关部门发布了国家级实战攻防演练已进入紧急「备战」时刻!这里我们主要说一下Linux OS层面的漏洞处理,涉及到升级系统内核,特此记录,以备参考追溯。
在这里插入图片描述

Linux内核源码目录被默认放置在“/usr/src/linux”目录中。此目录通常被称为“Linux源代码树”。该目录包含了Linux内核源代码的所有文件,包括子目录和文件。此目录下的所有文件都是以文本格式存储,并以C语言的形式编写。其中内核源代码目录说明:1、arch目录,包含了此核心源代码所支持的硬件体系结构相关的核心代码;2、include目录,包括了核心的大多数include文件;3、init目录,包含核心启动代码;4、mm目录,包含所有的内存管理代码;5、drivers目录,包含系统中所有的设备驱动;6、Ipc目录,包含核心的进程间通讯代码。

在这里插入图片描述

自2.6.0版本发布后,Linux内核以A.B.C.D的方式命名。A和B的变化可以说无关紧要,C是内核的真实版本,每一个版本的变化都会带来新的特性。例如内部API的变化等等,改动的数量常常上万。D是安全补丁和bug修复。如果你是Linux的初学者或用户,只需了解stable即可,它代表稳定版的内核更新。mainline指当前的官方内核,由Linus Torvalds进行更新维护,由开发者们贡献的代码主要是合并到mainline当中。linux-next和snapshot都是代码提交周期结束之前生成的快照,用于给Linux代码贡献者们做测试使用。目前stable版本的更新周期为六到十周,下一个稳定版本的rc基本上每周都会更新。新版本的内核分两种,一种是Full Source版本,完整的内核版本。比较大,一般是tar.gz或者.bz2文件。另一种是patch文件,即补丁文件。patch文件一般只有及时K到几百K,但是对于特定的版本来说,你要找到自己对应的版本才能使用。

相关资源:Linux内核官网,内核Livepatch;build a trimmed Linux kernel;

二、相关高危漏洞

2.1、curl 身份认证绕过漏洞

漏洞编码:CVE-2023-27535
漏洞描述:curl在7.13.0-7.88.1版本中存在身份认证绕过漏洞。libcurl将重用之前所创建的FTP连接,即使一个或多个参数被更改,可能会使有效用户变得不一样,从而导致使用错误的凭据进行第二次传输。
漏洞影响范围:curl 7.13.0 - 7.88.1
翻翻措施:请使用此产品的用户尽快更新至安全版本:https://github.com/curl/curl/releases或者回退至小于 7.13.0 版本

2.2、Linux kernel 本地提权漏洞(CVE-2021-33909)

漏洞编码:CVE-2021-33909
漏洞描述:Linux kernel 存在输入验证错误漏洞,该漏洞源于一个越界写入缺陷。
漏洞影响范围:Linux kernel >=3.16 / <= 5.13.3
修复措施:目前厂商已发布升级补丁以修复漏洞,补丁获取链接:https://cdn.kernel.org/pub/linux/kernel/v5.x/ChangeLog-5.13.4

注意事项:漏洞补丁还是需要重新编译内核;如果是联网的情况下,直接使用yum update命令即可,这条命令会安装系统中已知的最新安全补丁,但不会安装新的软件包;另外,对于一个大规模的补丁安装,还可以使用脚本的方式,将所有的补丁文件集中到脚本中,这样可以实现大规模的补丁安装。如果没有联网或者有特殊的情况也可以使用diff 和patch命令来打补丁,具体参看下文。

2.3、Linux kernel缓冲区溢出漏洞(CNVD-2023-51380)

漏洞编码:CNVD-2023-51380
漏洞描述:Linux kernel存在缓冲区溢出漏洞,该漏洞源于帧缓冲区控制台(fbcon) 中存在一个缺陷,当向fbcon_set_font提供大于32的font->width和font->height时未能适当的检查,攻击者可利用该漏洞导致未定义的行为和拒绝服务。
漏洞影响范围:Linux Linux kernel <6.2
修复措施:厂商已发布了漏洞修复程序,请及时关注更新:
https://github.com/torvalds/linux/commit/2b09d5d364986f724f17001ccfe4126b9b43a0be

2.4、Linux Polkit本地权限提升漏洞(CVE-2021-4034)

漏洞编码:CVE-2021-4034
漏洞描述:polkit 的 pkexec 存在本地权限提升漏洞,已获得普通权限的攻击者可通过此漏洞获取root权限。
漏洞影响范围:由于 polkit 为系统预装工具,目前主流Linux版本均受影响。
修复措施:参考漏洞影响范围,及时升级至最新安全版本。

2.5、Linux内核权限提升漏洞(CVE-2020-14386)

漏洞编码:CVE-2020-14386
漏洞描述:Linux发行版存在一个权限提升漏洞(CVE-2020-14386), 该漏洞出现在 net/packet/af_packet.c中,在处理AF_PACKET时存在整数溢出,导致可以进行越界写来实现权限提升,本地攻击者通过向受影响的主机发送特制的请求内容,利用此漏洞 从非特权用户提升到root用户权限;只有启用了CAP_NET_RAW功能的本地用户才能触发此问题。

漏洞影响范围:Ubuntu 18.04及后续版本;Centos 8/RHEL 8;Debian 9/10;Red Hat Enterprise Linux 7及centos7不受影响;

修复措施:1)升级内核至安全版本或应用修复补丁;内核下载地址: https://github.com/torvalds/linux/releases
2)关闭CAP_NET_RAW功能进行防护;如果默认情况下禁用CAP_NET_RAW功能(对于Red Hat Enterprise Linux是如此),则只有特权用户才能触发此错误。缓解措施是为常规用户和可执行文件禁用CAP_NET_RAW功能。在Red Hat Enterprise Linux 8上,还可以通过利用非特权用户命名空间来获得CAP_NET_RAW功能。缓解措施是通过将user.max_user_namespace设置为0来禁用无特权用户命名空间:

echo "user.max_user_namespaces=0" > /etc/sysctl.d/userns.conf
sysctl -p /etc/sysctl.d/userns.conf

OpenShift Container Platform 4.5和4.4可以通过从提供给pod的默认cri-o功能中删除“CAP_NET_RAW”来缓解这种情况(注意:这可能会阻止“ping”在非特权pod中工作。此修复程序尚未针对OpenShift 4.3或更低版本进行验证):

apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:labels:machineconfiguration.openshift.io/role: workername: 50-reset-crio-capabilities
spec:config:ignition:version: 2.2.0storage:files:- contents:source: data:text/plain;charset=utf-8;base64,W2NyaW8ucnVudGltZV0KZGVmYXVsdF9jYXBhYmlsaXRpZXMgPSBbCiAgICAiQ0hPV04iLAogICAgIkRBQ19PVkVSUklERSIsCiAgICAiRlNFVElEIiwKICAgICJGT1dORVIiLAogICAgIlNFVEdJRCIsCiAgICAiU0VUVUlEIiwKICAgICJTRVRQQ0FQIiwKICAgICJORVRfQklORF9TRVJWSUNFIiwKICAgICJTWVNfQ0hST09UIiwKICAgICJLSUxMIiwKXQo=filesystem: rootmode: 0644path: /etc/crio/crio.conf.d/reset-crio-capabilities.conf

对于单个可执行程序,getcap 命令和 setcap 命令分别用来查看和设置程序文件的 capabilities 属性,执行如下关闭:

# 查看程序的 cap 权限
getcap /bin/ping	 //默认输出如下/bin/ping = cap_net_admin,cap_net_raw+p# 删除 cap_net_raw 权限setcap cap_net_raw-ep /bin/ping# 检查getcap /bin/ping  //输出应如下/bin/ping =#也可以检查执行文件是否设置了SUID,即-s权限,如果有,普通用户就可以执行这些命令了
chmod 755 /bin/ping   #在移除 SUID 权限后,普通用户在执行 ping 命令时碰到了 "ping: socket: Operation not permitted" 错误
#恢复
setcap cap_net_admin,cap_net_raw+ep /bin/ping
#移除,命令中的 ep 分别表示 Effective 和 Permitted 集合,+ 号表示把指定的 capabilities 添加到这些集合中,- 号表示从集合中移除(对于 Effective 来说是设置或者清除位)。
setcap cap_net_admin,cap_net_raw-ep /bin/ping

相关链接:redhat漏洞描述、Linux capabilities、Linux/容器的权限(Capabilities)控制模型

2.6、Linux Kernel 权限提升 漏洞(CVE-2023-1829)

漏洞编码:CVE-2023-1829
漏洞描述:Linux 内核流量控制索引过滤器 (tcindex) 中存在释放后使用漏洞,由于tcindex_delete 函数在某些情况下不能正确停用过滤器,同时删除底层结构,可能会导致双重释放结构,本地低权限用户可利用该漏洞将其权限提升为 root。
漏洞影响范围:2.6.12-rc2 <= Linux Kernel版本 < 6.3
修复措施:目前该漏洞已经修复,受影响用户可将Linux内核更新到以下版本:
Linux Kernel 4.14.308
Linux Kernel 4.19.276
Linux Kernel 5.4.235
Linux Kernel 5.10.173
Linux Kernel 5.15.100
Linux Kernel 6.1.18
Linux Kernel 6.2.5
Linux Kernel 6.3

2.7、Linux Kernel权限提升漏洞(CVE-2023-0386)

漏洞编码:CVE-2023-0386
漏洞描述:在 Linux 内核中发现了一个缺陷,在 Linux 内核的 OverlayFS 子系统中发现了未经授权访问具有功能的 setuid 文件的执行,即用户如何将一个有能力的文件从一个 nosuid 挂载复制到另一个挂载。这个 uid 映射错误允许本地用户提升他们在系统上的权限。
漏洞影响范围:linux kernel v2.6.12-rc2 to v6.2-rc6
修复措施:目前该漏洞已经修复,https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4f11ada10d0ad3fd53e2bd67806351de63a4f9c3
下载地址:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/refs/,打补丁fs/overlayfs/copy_up.c
在这里插入图片描述

2.8、Linux Kernel 权限提升漏洞(CVE-2023-32233)

漏洞编码:CVE-2023-32233
漏洞描述:Linux内核Netfilter nf_tables中存在一个UAF漏洞,成功利用该漏洞可实现本地提权。
漏洞影响范围:v5.1-rc1 <= Linux Kernel <= 6.3.1
修复措施:目前该漏洞已经修复,参考链接:https://github.com/torvalds/linux/commit/c1592a89942e9678f7d9c8030efa777c0d57edab;打补丁include/net/netfilter/nf_tables.h和net/netfilter/nf_tables_api.c
、net/netfilter/nft_dynset.c、net/netfilter/nft_lookup.c、net/netfilter/nft_objref.c合计5个补丁包:
在这里插入图片描述

现场验证对比补丁文件和Linux 6.4.7对应内核文件,相关漏洞内容已覆盖,即已修复;其中,内核中对应补丁文件内容如下:

#补丁中内容
void nf_tables_activate_set(const struct nft_ctx *ctx, struct nft_set *set) { if (nft_set_is_anonymous(set)) nft_clear(ctx->net, set);set->use++; } 
EXPORT_SYMBOL_GPL(nf_tables_activate_set); 
#内核转给你对应文件
nf_tables_activate_set(const struct nft_ctx *ctx, struct nft_set *set) { if (nft_set_is_anonymous(set)) { if (set->flags & (NFT_SET_MAP | NFT_SET_OBJECT)) nft_map_activate(ctx, set); nft_clear(ctx->net, set); } nft_use_inc_restore(&set->use); } EXPORT_SYMBOL_GPL(nf_tables_activate_set);

说明如下:

第一段段代码是一个C语言函数,名为nf_tables_activate_set,它接受两个参数:const struct nft_ctx *ctx和struct nft_set *set。
函数的作用是激活一个nft_set(nft_set是一个nftables的数据结构),并将其引用计数加1。代码逻辑如下:

首先,通过调用nft_set_is_anonymous(set)函数判断nft_set是否是匿名的。
如果nft_set是匿名的,则调用nft_clear(ctx->net, set)函数来清除nft_set的内容。
然后,将nft_set的引用计数加1,通过set->use++操作实现。
最后,通过EXPORT_SYMBOL_GPL(nf_tables_activate_set)将该函数导出为一个可供其他模块使用的符号。

第二段代码是一个C语言函数nf_tables_activate_set,它接受两个参数:const struct nft_ctx *ctx和struct nft_set *set。
函数的作用是激活一个nft_set(nft_set是nftables的数据结构),并增加其引用计数。代码逻辑如下:

首先,通过调用nft_set_is_anonymous(set)函数判断nft_set是否是匿名的。
如果nft_set是匿名的,则继续执行下面的代码块。
在代码块中,首先通过检查set->flags中的标志位来判断nft_set的类型是否为NFT_SET_MAP或NFT_SET_OBJECT。如果是,则调用nft_map_activate(ctx, set)函数来激活nft_set。
接着,调用nft_clear(ctx->net, set)函数来清除nft_set的内容。
最后,调用nft_use_inc_restore(&set->use)函数来增加nft_set的引用计数。
函数的最后一行通过EXPORT_SYMBOL_GPL(nf_tables_activate_set)将该函数导出为一个可供其他模块使用的符号。

#补丁文件
if (nft_set_is_anonymous(set)) nft_deactivate_next(ctx->net, set); 
……
#内核文件
if (nft_set_is_anonymous(set)) { if (set->flags & (NFT_SET_MAP | NFT_SET_OBJECT)) nft_map_activate(ctx, set);
……

说明如下:

第一段代码是一个条件语句,判断nft_set是否是匿名的。如果nft_set是匿名的,则调用nft_deactivate_next(ctx->net, set)函数来停用nft_set的下一个元素。具体的逻辑如下:

首先,通过调用nft_set_is_anonymous(set)函数判断nft_set是否是匿名的。
如果nft_set是匿名的,则执行下面的代码块。
在代码块中,调用nft_deactivate_next(ctx->net, set)函数来停用nft_set的下一个元素。

第二段代码是一个条件语句的嵌套。首先判断nft_set是否是匿名的,如果是,则继续执行内部的代码块。
在内部的代码块中,首先通过检查set->flags中的标志位来判断nft_set的类型是否为NFT_SET_MAP或NFT_SET_OBJECT。如果是,则调用nft_map_activate(ctx, set)函数来激活nft_set。具体的逻辑如下:

首先,通过调用nft_set_is_anonymous(set)函数判断nft_set是否是匿名的。如果nft_set是匿名的,则执行下面的代码块。
在代码块中,首先通过检查set->flags中的标志位来判断nft_set的类型是否为NFT_SET_MAP或NFT_SET_OBJECT。
如果nft_set的类型是NFT_SET_MAP或NFT_SET_OBJECT,则调用nft_map_activate(ctx, set)函数来激活nft_set。

综上,执行升级linux 6.8.7即可。

三、Linux OS打补丁

在这里插入图片描述

3.1、补丁修补过程

关于内核打补丁,因linux内核源码较多,在修改完内核并发布新内核的时候,一般同步采用补丁的方式进行发布,而不是整个内核打包发布。

1)生成补丁

Linux中,我们可以使用Patch命令给代码打补丁,用于修复BUG、漏洞等问题,帮助用户更新和修复Linux 内核中存在的一些安全漏洞;而补丁⽂件是使用diff命令⽣成的, diff命令它的功能就是逐⾏⽐较两个⽂件的不同,然后输出⽐较的结果输出到补丁文件。还可以使用Diffstat命令比较属性;⽣成补丁⽂件的命令使⽤格式如下:

语法格式:

diff 【选项】 源文件(夹) 目的文件(夹) #就是要给源文件(夹)打个补丁,使之变成目的文件(夹),术语所谓“升级”。

diff -uNr  oldfile   newfile > patch_file.patch

参数解析:

    -u:以统⼀格式创建补丁⽂件,这种格式⽐缺省格式更紧凑些-N:确保补丁⽂件将正确地处理已经创建和删除⽂件的情况-r:递归,会将两个不同版本源代码⽬录中的所有对应⽂件全部都进⾏⼀次⽐较,包括⼦⽬录⽂件oldfile:源⽂件(⽬录),未进⾏修改的newfile:以oldfile为基础,根据需求对⾥⾯的⽂件内容修改之后结果patch_file.patch:补丁文件⼀般以.patch为后缀。

注解:补丁命令的功能就是逐个⽐较源⽂件(夹)和⽬标⽂件(夹)的所有⽂件,将差异信息记录到patch_file.patch中。下面对补丁文件内容进行讲解:

※ 补丁头部分:

    1、--- test1.txt 表示源文件(被修改的文件)2、+++ test2.txt 表示目的文件

※ 块部分( @@ 表示一个块的开始):

    3、@@ -1,3 表示源文件从第1行开始,一共有3行有差异4、@@  1,3 表示目的文件从第1行开始,一共有3行有差异

※ 正文:

    5、-zzzzzxxccv 表示被修改的文件要删除这一行6、+bbbbbbbbgd表示被修改的文件要增加这一行

※ 比如如下补丁说明:

在这里插入图片描述
2)打补丁

往往补丁文件是通过官方发布的,我们直接通过patch命令将发布的Patch文件中的内容补丁到自己的代码中即可,即完成代码的升级。打补丁patch命令的使⽤格式如下(这⾥只介绍对源⽂件(夹)进⾏打补丁操作):

patch -pN < xxx.patch
#去除补丁,恢复旧版本
patch -RE -p0 < xxx.patch
#内核打补丁
gunzip ../setup-dir/ patch-2.4.21-rmk1.gz  #发布的补丁文件都是使用gzip压缩的
cd linux-2.4.21    #进入你的内核源代码目录
patch –p1 < ../../setup-dir/patch-2.4.21-rmk1   #打补丁

参数解析:

pN:打补丁时要忽略掉第N层⽬录。
-R:说明在补丁文件中的“新”文件和“旧”文件要调换过来了(实际上相当于给新版本打补丁,让它变成老版本)
-E:表如果发现了空文件,就删除它

例子: 如果补丁文件包含路径名称/net/packet/af_packet.c,那么:

-p 0 使用完整路径名;因此一般建议使用diff命令制作patch时一定不要使用绝对路径,否则在打patch时就需要从根目录开始数当前处于哪一级了
-p 1 除去前导斜杠,留下 net/packet/af_packet.c。
-p 3 除去前导斜杠和前l两个目录,留下 af_packet.c。

示例:在用上图中的说明,,通过执行:diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c 输出如下:

--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -2170,7 +2170,8 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,int skb_len = skb->len;unsigned int snaplen, res;unsigned long status = TP_STATUS_USER;
-	unsigned short macoff, netoff, hdrlen;
+	unsigned short macoff, hdrlen;
+	unsigned int netoff;struct sk_buff *copy_skb = NULL;struct timespec64 ts;__u32 ts_status;
@@ -2239,6 +2240,10 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,}macoff = netoff - maclen;}
+	if (netoff > USHRT_MAX) {
+		atomic_inc(&po->tp_drops);
+		goto drop_n_restore;
+	}if (po->tp_version <= TPACKET_V2) {if (macoff + snaplen > po->rx_ring.frame_size) {if (po->copy_thresh &&

说明:补丁头是分别由---/+++开头的两行,用来表示要打补丁的文件。---开头表示旧文件,+++开头表示新文件。一个补丁文件中可能包含以—/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。

如果使用参数-p0,那就表示从当前目录找一个叫做a的文件夹,在它下面寻找net/packet/下的af_packet.c文件来执行patch操作。

如果使用参数-p1,那就表示忽略第一层目录(即不管a),从当前目录寻找net/packet/的文件夹,在它下面找af_packet.c。这样的前提是当前目录必须为a所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。当然,可以用相对路径,也可 以用绝对路径。

3)linux内核安装与编译、打补丁
在这里插入图片描述

#下载内核
wget https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/snapshot/linux-6.5-rc3.tar.gz
#不用最新的也可以去如下网站下载内核
https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/
https://mirrors.aliyun.com/linux-kernel/
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.4.6.tar.gz
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/patch-6.4.6.xz
#全部补丁
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/patch-6.4.xz
#内核3.10.x补丁,30-Jun-2013 22:51发布的,可修复之前暴漏的漏洞
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/patch-3.10.gz
#国内镜像网站最新版内核,2023-07-27 15:08
wget https://mirrors.aliyun.com/linux-kernel/v6.x/linux-6.4.7.tar.gz
wget https://mirrors.aliyun.com/linux-kernel/v6.x/patch-6.4.7.xz
//或
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.4.6.tar.gz
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/patch-6.4.6.xz
#将新内核和补丁包放到如下目录
mv linux-6.4.7.tar.gz patch-6.4.7.xz /usr/src/kernels/
#检查漏洞对应的补丁包文件,本次主要涉及如下:
对比https://github.com/torvalds/linux/commit/c1592a89942e9678f7d9c8030efa777c0d57edab下的nf_tables.h、nf_tables_api.c、nft_dynset.c、nft_lookup.c、nft_objref.c这5个补丁包(v6.5-rc3 中更新的),如果6.4.6或6.4.7对应文件的内容没有更新相关内容,或补丁报里对应文件没有相关内容,就进行替换,尝试编译
还有一个文件:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=acf69c946233259ab4d64f8869d4037a198c7f06中的af_packet.c#进到目录
cd /usr/src/kernels
yum install epel-release -y
yum install xz -y #一般cenos7已安装
#解压
tar -zxvf linux-6.5-rc3.tar.gz
tar -xvf linux-6.4.6.tar.gz -C /usr/src/kernels/
xz -d patch-6.4.6.xz
cp patch-6.4.6.patch /usr/src/kernels/linux-6.4.6//配置内核,同make olddefconfig
cp -v /boot/config-$(uname -r) /usr/src/kernels/linux-6.4.6/.config  #现场centos7.5显示/boot/config-3.10.0-862.el7.x86_64;类似如下:#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 3.10.0-862.el7.x86_64 Kernel Configuration
#
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
……
//打补丁的话直接跳转到打补丁那一步//内核6.5.3 配置linux内核特性和模块,未使用可跳过,看内核打补丁
cd linux-6.5-rc3
#安装配置编译工具
yum install build-essential libncurses-dev bison flex libssl-dev libelf-dev
make mrproper   #每次配置并重新编译内核前需要先执行“make mrproper”命令清理源代码树,包括过去曾经配置的内核配置文件“.config”都将被清除。即进行新的编译工作时将原来老的配置文件给删除到,以免影响新的内核编译。相当于Remove all generated files + config + various backup filesmake menuconfig   //用它生成的内核配置文件,决定将内核的各个功能系统编译进内核还是编译为模块还是不编译#编译
make dep   #生成内核功能间的依赖关系,为编译内核做好准备。如果内核从未编译过,此步可跳过
make clean   #remove most generated files but keep the config and enough build support to build external modules;如果内核从未编译过,此步可跳过
make -j24     #make -j $(nproc --all) ,生成内核模块、bzImage、System.map等文件;如果-j后不跟任何数字,则不限制处理器并行编译的任务数
make bzImage  #可选项,bzImage命令会生成一个启动映像文件bzImage
make modules -j24
make modules_install -j24   #编译成功后,系统会在/lib/modules目录下生成一个新内核版本的子目录,里面存放着新内核的所有可加载模块(即将编译好的modules,也就是所生成的驱动文件放到/lib/modules/目录中去);
make install -j24    #将所生成的驱动文件放到/boot/目录中去,增加:
#cp .config /boot/config-6.4.0
#cp System.map /boot/System.map-6.4.0
#cp /arch/i386/boot/bzImage /boot/vmlinuz-6.4.0#升级
update-initramfs -c -k 6.5-rc3  #或
mkinitramfs   #敲入命令生成内核版本相对应的img 文件:
#mkinitramfs 6.4.0 –o /boot/initrd.img-6.4.0   #至此,升级内核所需的所有文件config、System.map、vmlinuz、initrd.img 都已全部完成
update-grub			#更新启动文件grub.cfg,将6.4.0添加至系统启动选项中
#完成后重启
reboot//打补丁
cd /usr/src/kernels/linux-6.4.6
patch -p1 < ../xx.patch   #据现场实际来#配置内核,安装依赖
yum install ncurses-devel
make mrproper   #相当于Remove all generated files + config + various backup files,会检查有无不正确的.o文件和依赖关系,如果是下载的完整的源程序包即第一次进行编译,那么本步可以省略
make olddefconfig  #将当前系统存在的.config 文件拷贝至新内核源码目录,采用已有的.config文件的参数作为默认参数,同时升级依赖属性,新属性设置为默认值不再提醒。说明见下文
make menuconfig   //先 load(加载本地的 .config)
General setup
Preemption Model (Voluntary Kernel Preemption (Desktop)) ---> //内核抢占模式
(X) Preemptible Kernel (Low-Latency Desktop) //抢占式低延时,或者:
(*)Fully Preemptible Kernel (Real-Time)   //完全抢占内核
#保存退出。
//打完后重新编译安装内核
nproc  #确定内核核数,比如是24个
make -j24
make modules -j24
make modules_install -j24
make install -j24
#验证
ls -lh /boot   //查看是否有新增的内核版本#确认当前启动的内核配置
cat /boot/grub2/grub.cfg |grep "menuentry "  //查看所有可用内核
grub2-mkconfig -o /boot/grub2/grub.cfg    //重新生成 gurb 配置
grub2-set-default 'CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)'  //设置默认启动的内核
grub2-editenv list    //查看内核修改结果,类似如下
saved_entry=CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)
tuned-adm profile latency-performance  //系统设置为低延迟的性能模式//其他方式更新grub配置,有的系统没有如下这个命令,可跳过
update-initramfs -c -k 5.4.87  
update grub##重启生效
reboot   

Linux内核升级及编译按照部分更多参看:Linux系统升级及内核版本升级;

四、附录

4.1、内核编译文件说明

1).config文件

被用来使用make menuconfig 生成的内核配置文件,决定将内核的各个功能系统编译进内核还是编译为模块还是不编译。

2)vmlinuz 和 vmlinux

vmlinuz是可引导的、压缩的内核,“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制,Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行的Linux内核,vmlinuz的建立有两种方式:一是编译内核时通过“make zImage”创建,zImage适用于小内核的情况,它的存在是为了向后的兼容性;二是内核编译时通过命令make bzImage创建,bzImage是压缩的内核映像,注意的是:bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”,bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码,所以你不能用gunzip 或 gzip –dc解包vmlinuz。 内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage 或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。 vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。

3)initrd.img
initrd是“initial ramdisk”的简写。initrd一般被用来临时引导硬件到实际内核vmlinuz能够接管并继续引导的状态。比如initrd- 2.4.7-10.img主要是用于加载ext3等文件系统及scsi设备的驱动。如果你使用的是scsi硬盘,而内核vmlinuz中并没有这个 scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题,initrd-2.4.7-10.img是用gzip压缩的文件。initrd映象文件是使用mkinitrd创建的,mkinitrd实用程序能够创建initrd映象文件,这个命令是RedHat专有的,其它Linux发行版或许有相应的命令。更多请看帮助:man mkinitrd

4)System.map
System.map是一个特定内核的内核符号表,由“nm vmlinux”产生并且不相关的符号被滤出。下面几行来自/usr/src/linux-2.4/Makefile:

nm vmlinux | grep -v '(compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI)' | sort > System.map

在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核是一个很复杂的代码块,有许许多多的全局符号, Linux内核不使用符号名,而是通过变量或函数的地址来识别变量或函数名,比如不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。 对于使用计算机的人来说,更喜欢使用那些像size_t BytesRead这样的名字,而不喜欢像c0343f20这样的名字。内核主要是用c写的,所以编译器/连接器允许我们编码时使用符号名,而内核运行时使用地址。 然而,在有的情况下,我们需要知道符号的地址,或者需要知道地址对应的符号,这由符号表来完成,符号表是所有符号连同它们的地址的列表。

Linux 符号表使用到2个文件: /proc/ksyms 、System.map 。/proc/ksyms是一个“proc file”,在内核引导时创建。实际上,它并不真正的是一个文件,它只不过是内核数据的表示,却给人们是一个磁盘文件的假象,这从它的文件大小是0可以看 出来。然而,System.map是存在于你的文件系统上的实际文件。当你编译一个新内核时,各个符号名的地址要发生变化,你的老的System.map 具有的是错误的符号信息,每次内核编译时产生一个新的System.map,你应当用新的System.map来取代老的System.map。

虽然内核本身并不真正使用System.map,但其它程序比如klogd, lsof和ps等软件需要一个正确的System.map。如果你使用错误的或没有System.map,klogd的输出将是不可靠的,这对于排除程序故障会带来困难。没有System.map,你可能会面临一些令人烦恼的提示信息。 另外少数驱动需要System.map来解析符号,没有为你当前运行的特定内核创建的System.map它们就不能正常工作。

Linux的内核日志守护进程klogd为了执行名称-地址解析,klogd需要使用System.map。System.map应当放在使用它的软件能够找到它的地方。执行:man klogd可知,如果没有将System.map作为一个变量的位置给klogd,那么它将按照下面的顺序,在三个地方查System.map:/boot/System.map、/System.map、/usr/src/linux/System.map
System.map也有版本信息,klogd能够智能地查找正确的映象(map)文件。

4.2、make menuconfig过程

当我们在执行make menuconfig这个命令时,系统到底帮我们做了哪些工作呢?这里面一共涉及到了以下几个文件:

1.Linux内核根目录下的scripts文件夹;scripts文件夹存放的是跟make menuconfig配置界面的图形绘制相关的文件,我们作为使用者无需关心这个文件夹的内容

2.arch/$ARCH/Kconfig文件、各层目录下的Kconfig文件

3.Linux内核根目录下的makefile文件、各层目录下的makefile文件

4.Linux内核根目录下的的.config文件、arch/$ARCH/configs/下的文件

5.Linux内核根目录下的 include/generated/autoconf.h文件

在这里插入图片描述
当我们执行make menuconfig命令出现如下配置界面以前,系统帮我们做了以下工作:

首先系统会读取arch/$ARCH/目录下的Kconfig文件生成整个配置界面选项(Kconfig是整个linux配置机制的核心),那么ARCH环境变量的值等于多少呢?它是由linux内核根目录下的makefile文件决定的,在makefile下有此环境变量的定义:

SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \-e s/arm.*/arm/ -e s/sa110/arm/ \-e s/s390x/s390/ -e s/parisc64/parisc/ \-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \-e s/sh[234].*/sh/ )..........export KBUILD_BUILDHOST := $(SUBARCH)ARCH        ?= $(SUBARCH)CROSS_COMPILE   ?=

比如是通过 make ARCH=arm menuconfig命令来生成的配置界面,系统就会读取arm/arm/kconfig文件生成配置选项。

其次,它的一些默认配置选项,存放在arch/$ARCH/configs/目录下,对于arm来说就是arch/arm/configs文件夹,此文件夹中有许多选项,系统会读取哪个呢?内核默认会读取linux内核根目录下.config文件作为内核的默认选项。我们可以选择直接修改.config文件然后执行make menuconfig命令读取新的选项。但是一般并不这样做,在menuconfig配置界面中,我们可通过空格、esc、回车选择某些选项选中或者不选中,最后保存退出的时候,Linux内核会把新的选项更新到.config中,此时我们可以把.config重命名为其它文件保存起来(当执行make distclean时系统会把.config文件删除),以后我们再配置内核时就不需要再去arch/arm/configs下考取相应的文件了,省去了重新配置的麻烦,直接将保存的.config文件复制为.config文件load即可。

通过过以上两步,我们就可以正确的读取、配置我们需要的界面了,那么他们如何跟makefile文件建立编译关系呢?当你保存make menuconfig选项时,系统会除了会自动更新.config外,还会将所有的选项以宏的形式保存在Linux内核根目录下的 include/generated/autoconf.h文件下。内核中的源代码就都会这些.h文件,根据宏的定义情况进行条件编译。当我们需要对一个文件整体选择是否编译时,还需要修改对应的makefile文件,例如:
在这里插入图片描述
我们选择是否要编译s3c2410_ts.c这个文件时,makefile会根据CONFIG_TOUCHSCREEN_S3C2410来决定是编译此文件,此宏是在Kconfig文件中定义,当我们配置完成后,会出现在.config及autconf中,至此,我们就完成了整个linux内核的编译过程。最后我们会发现,整个linux内核配置过程中,留给用户的接口其实只有各层Kconfig、makefile文件以及对应的源文件

比如我们如果想要给内核增加一个功能,并且通过make menuconfig控制其声称过程首先需要做的工作是:修改对应目录下的Kconfig文件,按照Kconfig语法增加对应的选项;其次执行make menuconfig选择编译进内核或者不编译进内核,或者编译为模块,.config文件和autoconf.h文件会自动生成;最后修改对应目录下的makefile文件完成编译选项的添加;最后的最后执行make命令进行编译。

4.3、config和Makefile文件

Linux内核源码树的每个目录下都有两个文档Kconfig和Makefile。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单。在执行内核配置make menuconfig时,从Kconfig中读出菜单,用户选择后保存到**.config的内核配置文档**中。在内核编译时,由Makefile调用这 个.config,就知道了用户的选择。这个内容说明Kconfig就是对应着内核的每级配置菜单。

假如要想添加新的驱动到内核的源码中,要修改Kconfig,这样就能够选择这个驱动,假如想使这个驱动被编译,则要修改Makefile。添加新的驱动时需要修改的文档有两种(如果添加的只是文件,则只需修改当前层Kconfig和Makefile文件;如果添加的是目录,则需修改当前层和目录下 的共一对Kconfig和Makefile)Kconfig和Makefile。要想知道怎么修改这两种文档,就要知道两种文档的语法结构,Kconfig的语法参见参考文献《【linux-2.6.31】kbuild》。
Makefile 文件包含 5 部分:

内核文件说明
Makefile顶层的 Makefile
.config内核配置文件
arch/$(ARCH)/Makefile体系结构 Makefile
scripts/Makefile.*适用于所有 kbuild Makefile 的通用规则等
kbuild Makefiles大约有 500 个这样的文件

顶层 Makefile 读取内核配置,产生的.config 文件,顶层 Makefile 构建两个主要的目标:vmlinux(内核映像)和 modules(所有模块文件)。它通过递归访问内核源码树下的子目录来构建这些目标。访问哪些子目录取决于内核配置。顶层 Makefile 包含一个体系结构 Makefile,由 arch/$(ARCH)/Makefile 指定。体系结构 Makefile 文件为顶层 Makefile 提供了特定体系结构的信息。每个子目录各有一个 kbuild文件和Makefile 文件来执行从上层传递下来的命令。kbuild和Makefile文件利用.config 文件中的信息来构造由 kbuild 构建内建或者模块对象使用的各种文件列表。scripts/Makefile.*包含所有的定义/规则,等等。这些信息用于使用 kbuild和 Makefile 文件来构建内核。

注:不分摘自http://blog.chinaunix.net/uid-26497520-id-3593098.html#0

4.3、linux内核打补丁场景参考

1)使 2.6.23.11 升级到 2.6.23.12. 我应该先把 2.6.23.11 回退成 2.6.23 然后再打 2.6.23.12 的补丁:

bzcat …/patch-2.6.23.11.bz2|patch -p1 -R #回退到 2.6.23
bzcat …/patch-2.6.23.12.bz2|patch -p1 #打到 2.6.23.12

2)2.6.22.9 先要降级到 2.6.22 然后升级到 2.6.23. 再升级到 2.6.23.9

bzcat …/patch-2.6.22.9.bz2|patch -p1 -R #使用 R 命令意思是取消补丁。这样我们就把 22.9 降到 22
zcat …/patch-2.6.23.gz|patch -p1 #这样就升级到了 2.6.23
zcat …/patch-2.6.23.11.bz2|patch -p1 # 这样就升级到了 2.6.23.11 这是现在 stable 的最新版

4.4、make defconfig、 make menuconfig、 make savedefconfig、 make olddefconfig 、make localmodconfig 区别

1) make defconfig

  首先通过make xxx_defconfig,生成最开始的.config,相当于把 XXX_defconfig 文件复制为 .config 文件,其中 defconfig 是最小的 config 项,kernel编译会根据 .config 文件去编译驱动情况,加载过该指令后,后面的 make menuconfig 就会基于现在的 .config 去配置 config ;

2)make menuconfig

  make menuconfig (图像界面,基于ncurses库)的作用类似于 make config (后者是文本类型的对话),就是基于界面去配置 config 文件,make config 的作用是加载 “ .config ” 作为默认的配置,配置它就是相当于用图形化界面配置 .config 文件;

3)make savedefconfig

  执行 make saveconfig 作用是通过执行.config 生成最小的 defconfig 文件;

4)make olddefconfig

  通过make oldconfig将刚增加的config项的.config做依赖检查重新生成新的.config文件,且新生成的.config和以前的不同是,将旧的.config重命名为.config.old文件。可通过执行diffconfig .config.old .config ,对比一下新老内核配置的区别
5)make localmodconfig

  通make localmodconfig 会执行 lsmod 命令查看当前系统中加载了哪些模块 (Modules), 并最后将原来的 .config 中不需要的模块去掉,仅保留前面 lsmod 出来的这些模块,从而简化了内核的配置过程,多用于快速测试场景中 。缺点:该方法仅能使编译出的内核支持当前内核已经加载的模块,当前一直未使用的模块就不会被编译到后续的内核中;优点:编译内核小,编译快。

"make config"      Plain text interface.
"make menuconfig"  Text based color menus, radiolists & dialogs.
"make nconfig"     Enhanced text based color menus.
"make xconfig"     Qt based configuration tool.
"make gconfig"     GTK+ based configuration tool.
"make oldconfig"   Default all questions based on the contents ofyour existing ./.config file and asking aboutnew config symbols.
"make olddefconfig"Like above, but sets new symbols to their defaultvalues without prompting.
"make defconfig"   Create a ./.config file by using the defaultsymbol values from either arch/$ARCH/defconfigor arch/$ARCH/configs/${PLATFORM}_defconfig,depending on the architecture.
"make ${PLATFORM}_defconfig"Create a ./.config file by using the defaultsymbol values fromarch/$ARCH/configs/${PLATFORM}_defconfig.Use "make help" to get a list of all availableplatforms of your architecture.
"make allyesconfig"Create a ./.config file by setting symbolvalues to 'y' as much as possible.
"make allmodconfig"Create a ./.config file by setting symbolvalues to 'm' as much as possible.
"make allnoconfig" Create a ./.config file by setting symbolvalues to 'n' as much as possible.
"make randconfig"  Create a ./.config file by setting symbolvalues to random values.
"make localmodconfig" Create a config based on current config andloaded modules (lsmod). Disables any moduleoption that is not needed for the loaded modules.To create a localmodconfig for another machine,store the lsmod of that machine into a fileand pass it in as a LSMOD parameter.Also, you can preserve modules in certain foldersor kconfig files by specifying their paths inparameter LMC_KEEP.target$ lsmod > /tmp/mylsmodtarget$ scp /tmp/mylsmod host:/tmphost$ make LSMOD=/tmp/mylsmod \LMC_KEEP="drivers/usb:drivers/gpu:fs" \localmodconfigThe above also works when cross compiling."make localyesconfig" Similar to localmodconfig, except it will convertall module options to built in (=y) options. You canalso preserve modules by LMC_KEEP.
"make kvmconfig"   Enable additional options for kvm guest kernel support.
"make xenconfig"   Enable additional options for xen dom0 guest kernelsupport.
"make tinyconfig"  Configure the tiniest possible kernel.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring5源码篇(12)——spring-mvc请求流程

spring-framework 版本&#xff1a;v5.3.19 文章目录 一、请求流程1、处理器映射器1.1、 RequestMappingHandlerMapping1.2、获取对应的映射方法1.3、添加拦截器 2、获取合适的处理器适配器3、通过处理器适配器执行处理器方法3.1、拦截器的前置后置3.2、处理器的执行3.2.1 参数…

React哲学——官方示例

在本篇技术博客中&#xff0c;我们将介绍React官方示例&#xff1a;React哲学。我们将深入探讨这个示例中使用的组件化、状态管理和数据流等核心概念。让我们一起开始吧&#xff01; 项目概览 React是一个流行的JavaScript库&#xff0c;用于构建用户界面。React的设计理念是…

QuantMania!《快乐机器学习》和《Python 从入门到入迷》作者,FRM,CAIA

王的机器主理人 王圣元 (FRM, CAIA) 某加密货币公司 Head of Quant 冬海集团 SeaMoney 建模负责人 八方咨询 量化总监 新加坡国立大学金融数学硕士 新加坡国立大学量化金融学士 《快乐机器学习》的作者 《Python 从入门到入迷》的作者 第一本书 《快乐机器学习》 第二本书《Pyt…

【图论】BFS中的最短路模型

算法提高课笔记 目录 单源最短路迷宫问题题意思路代码 武士风度的牛题意思路代码 抓住那头牛题意思路代码 多源最短路矩阵距离题意思路代码 双端队列BFS电路维修题意思路代码&#xff08;加了注释&#xff09; BFS可以解决边权为1的最短路问题&#xff0c;下面是相关例题 单源…

解决ComposerStaticInit类重复加载问题

Tp5中composer安装phpoffice后报错 Cannot declare class Composer\Autoload\ComposerStaticInit6c9266e89aa536667bf36f59ad8e6e6b, because the name is already in use 错误原因: 使用ThinkPHP5框架的项目&#xff0c;在引用某些包的时候&#xff0c;可能会通过其它包&…

位图和 DC 有什么特别之处?

相信设备上下文 (DC, Device Context) 对你来说&#xff0c;应该很熟悉。 基本工作方式是&#xff0c;你可以通过调用 SelectObject 来将画笔(Pen)&#xff0c;画刷(Brush)&#xff0c;字体(Font)和位图(Bitmap)等这些对象选入设备上下文中&#xff0c;但是&#xff0c;这里的位…

初学HTML:采用CSS绘制一幅夏天的图

下面代码使用了HTML和CSS来绘制一幅炎炎夏日吃西瓜的画面。其中&#xff0c;使用了伪元素和阴影等技巧来实现部分效果。 <!DOCTYPE html> <html> <head><title>炎炎夏日吃西瓜</title><style>body {background-color: #add8e6; /* 背景颜…

小程序原生实现左右锚点联动

效果 wxml <view classbox><scroll-view scroll-y scroll-with-animation style"width:25%"><view classnav><view wx:for"{{navList}}" wx:keyindex class"title {{index active ?select:}}"data-index{{index}} bin…

Windows下安装Hive(包安装成功)

Windows下安装Hive Hive与Hadoop的版本选择很关键&#xff0c;千万不能选错&#xff0c;否则各种报错。一、Hive下载1.1、官网下载Hive1.2、网盘下载Hive 二、解压安装包&#xff0c;配置Hive环境变量2.1、环境变量新增&#xff1a;HIVE_HOME2.2、修改Path环境变量&#xff0c;…

JVM、Redis、反射

JVM JVM是Java virtual machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是一种用于计算机的规范&#xff0c;是通过在实际计算机上仿真模拟各种计算机功能来实现的。 主要组件构成&#xff1a; 1.类加载器 子系统负责从文件系统或者网络中加载Class文件&…

深度学习实战 | 开发一个围棋智能体

01、数据模型 神经网络的训练过程需要将HD5文件中的样本数据解析出来。数据集中的棋盘局面可以提取后直接输入卷积网络进行特征提取。从属性中取出样本标签用于神经网络的损失计算和反向传播。如图1所示&#xff0c;落子方信息从属性中提取后不用参与棋盘局面的特征提取&#…

Spire.Office for.NET Crack

Spire.Office for.NET Crack Spire.Office for.NET是E-iceblue提供的企业级Office.NET API的组合。它包括Spire.Doc、Spire.XLS、Spire.Seadsheet、Spire.Presentation、Spire_PDF、Spire.DataExport、SpireOfficeViewer、Spire-PDFViewer、Spire.DocViewer、Spire.Barcode和Sp…

在linux中怎样同时运行三个微服务保证退出时不会终止

前言 1.maven中打jar包 使用插件打包,必须在pom.xml中添加插件,否则不能在linux中编译运行 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version&g…

AMEYA详解松下Panasonic HF SSOP 1 Form A AQY PhotoMOS继电器

Panasonic HF SSOP 1 Form A AQY PhotoMOS继电器采用微型SSOP封装&#xff0c;具有600V的负载电压和1500Vrms 的I/O隔离电压 这些继电器具有8Ω的低导通电阻和高速运行的特点&#xff0c;SSOP封装旨在实现高密度安装。Panasonic HF SSOP AQY PhotoMOS继电器适用于从测试和测量设…

postman和jmeter的区别何在?

小伙伴们大家好呀&#xff0c;前段时间笔者做了一个小调查&#xff0c;发现软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xf…

柴洪峰院士:大模型赋能金融科技思考与展望

本文整理自7月7日世界人工智能大会“AI生成与垂直大语言模型的无限魅力”论坛上中国工程院院士、复旦大学金融科技研究院院长柴洪峰《大模型赋能金融科技思考与展望》的主题分享&#xff0c;从金融垂直模型构建、金融知识图谱与大模型融合以及金融大模型的监管三个方面进行介绍…

Mycat-Balance使用指南

MyCAT Balance是一个Java NIO的高性能负载均衡器&#xff0c;可以替代普通的硬件的交换机或其LVS类似的复杂机制&#xff0c;实现MyCAT集群的负载均衡。 MyCAT Balance的配置文件在conf目录下&#xff0c;frontend-conf.为前端配置&#xff0c;包括绑定的端口等&#xff0c;js…

uniapp 小程序实时且持续获取定位信息(全局设置一次)(单页面监听定位改变)(不采用定时器)

本篇文章实现了uniapp 微信小程序实时获取定位信息,小程序打开即可持续获取定位信息, 位置更新也会触发相关自定义事件 优点 只设置一次不采用定时器的方式无需多个页面调用单独页面若想获取当前位置是否变化 可单独设置监听,并调用不同逻辑事件 原理: 采用uniapp推出的: un…

数学建模学习(7):Matlab绘图

一、二维图像绘制 1.绘制曲线图 最基础的二维图形绘制方法&#xff1a;plot -plot命令自动打开一个图形窗口Figure&#xff1b; 用直线连接相邻两数据点来绘制图形 -根据图形坐标大小自动缩扩坐标轴&#xff0c;将数据标尺及单位标注自动加到两个坐标轴上&#xff0c;可自定…

亚马逊云科技HPC解决方案,帮助浙江大学实现成本和科研任务的双丰收

浙江大学土壤学科是朱祖祥院士等几代土壤科学家共同创建的A国家重点学科&#xff0c;整体实力雄厚&#xff0c;优势特色明显&#xff0c;总体水平居国内前列。在亚马逊云科技科研创新支持计划&#xff08;Amazon Web Services Cloud Credits for Research&#xff09;的多次支持…