银河麒麟桌面版包管理器(二)
APT包管理器
APT是Debian及其派生系统的包管理器,构建在dpkg之上,以其强大的依赖性处理能力和丰富的软件仓库而闻名。APT具有自动解决依赖关系、提供易于使用的命令行工具(如apt-get、apt-cache等),以及稳定的软件更新机制等优点。
尽管APT极大地简化了软件管理过程,但是它也面临着一些挑战和限制。例如,APT的软件仓库可能不包含某些特定的或最新的软件包,这时用户可能需要添加第三方仓库或下载.deb包手动安装。现在,APT已经经过改造,可以在支持rpm(另外一种流行的Linux安装包格式)的系统上用来管理rpm包。
APT配置文件
APT包管理器的配置和管理数据大多存储在/etc/apt/目录下,该目录包含了多个配置文件和子目录,它们控制了APT的行为,包括软件源的位置、优先级规则等。理解/etc/apt/目录的结构及其包含的文件对于高效使用APT有很大帮助。
图35是ARM64架构的银河麒麟桌面版/etc/apt目录结构(目录下的具体文件会因不同架构不同版本有所不同),在对该目录进行详细解析前,需要了解APT配置文件的语法格式。
1. APT配置文件基本语法
APT配置文件的基本语法规则如下所述。
- 注释:以 // 或 # 开头的行被视为注释。
- 指令:指令以关键字开始,后跟一系列参数。参数可以是布尔值(True/False)、整数、字符串(通常需要用双引号括起来)、列表(使用 { } 包围,并用逗号分隔)。
- 作用域:配置项可以具有作用域,使用点“.”来分隔不同的层级。
/etc/apt/目录及子目录下的配置文件按文件名的“字母数字”的升序依次被解析。
2. /etc/apt/apt.conf.d/目录解析
/etc/apt/apt.conf.d/目录中通常包含多个配置文件,每个文件可以包含一条或多条配置指令,用于修改APT的默认行为或添加新功能。这种分散的配置文件结构使得管理单个配置更加简单,同时避免了单一大文件可能带来的混乱。
在设置APT的代理服务器时,可以在该目录下创建配置文件,指定APT使用的代理信息,如创建一个名为01proxy的文件,并添加如下内容:
Acquire::http::Proxy "http://your-proxy-address:port";
Acquire::https::Proxy "http://your-proxy-address:port";
现在很多代理软件可以同时支持HTTP和HTTPS协议,一般HTTP和HTTPS填写同样的IP地址(域名)和端口即可。该目录下的其他文件一般无须修改。
3. /etc/apt/sources.list文件解析
/etc/apt/sources.list文件是APT配置的核心部分,它指定了APT获取的包信息和包的位置,即软件源。这些软件源可以是网络上的服务器,也可以是本地文件系统上的目录。sources.list文件内容有两种语法格式:一种是传统的单行语法格式,另一种是较新的Deb822语法格式。
(1)单行语法格式。
符合单行语法格式时,在以.list结尾的文件中,每个软件源占据一行。银河麒麟桌面版内置的/etc/apt/sources.list内容如下,以此为例进行阐述。
deb http://archive.***.cn/kylin/KYLIN-ALL 10.1 main restricted universe multiverse
deb http://archive.***.cn/kylin/KYLIN-ALL 10.1-2303-updates main universe multiverse restricted
deb http://archive2.***.cn/deb/kylin/production/PART-V10-SP1/custom/partner/V10-SP1 default all
单个条目不能连续到多行。.list文件中的空行被忽略,任何位置的“#”字符后面部分是注释。sources.list每行内容按照下面的语法格式组织。
类型 [选项] URI 分发版 [组件1] [组件2] [...]
- 类型:指定软件源的类型,通常为deb(二进制包)或deb-src(源代码包)。
- [选项]:(可选)用于指定软件源的选项,多个选项间使用逗号“,”分隔。常见的选项如下所述。
- arch=<architecture>:指定支持的架构,例如AMD64、i386、ARM64等。不支持同时指定多个CPU架构。每个软件源条目只能指定一个架构。要支持多个架构,需要为每个架构单独定义一个条目。
- trusted=yes:表示信任该源,不会进行GPG签名验证。
- allow-insecure=yes:允许使用不安全的HTTP源(非HTTPS)。
- default-release=<release>:指定默认的发布版本。
- URI:指定软件源的URI(统一资源标识符)。URI是一种字符串,可以是具体的资源(如网页、文件)或抽象的资源(如概念、服务)。一个完整的URI通常由以下几个部分组成。
- 方案(Scheme):指定资源的访问协议,如HTTP、HTTPS、FTP等。
- 权限(Authority):包括用户信息、主机名和端口号,通常以双斜杠//开头。
- 路径(Path):指定资源在服务器上的位置。
- 查询(Query):(可选)提供额外的参数,通常用于动态页面。
- 片段(Fragment):(可选)指定资源内的某个位置或部分。
例如在http://archive.***.cn/kylin/KYLIN-ALL这个URI中,http是方案,archive.***.cn是权限(包含了主机名archive.***.cn和省略的端口号80),/kylin/KYLIN-ALL是路径。
- 分发版:指定特定的分发版名,如10.1、10.1-2303-updates等。
- 组件:指软件库分类,如main、restricted、universe、multiverse。
- main:表示官方支持的,并且完全遵循自由软件准则的软件包。
- restricted:表示官方支持的,但不完全遵循自由软件准则的软件包。
- universe:表示由社区维护的开源软件,不保证安全更新和维护。
- multiverse:包含可能受到法律或版权问题限制的软件包。这些软件可能是非自由或专有的,包括一些受版权保护的软件、游戏、字体等。
上面将单行语法格式拆开了详细讲解,看似复杂,但无论是“http://archive.***.cn/kylin/ KYLIN-ALL 10.1 main restricted universe multiverse”,还是“http://archive.***.cn/kylin/KYLIN- ALL 10.1-2303-updates main universe multiverse restricted”最终总是要和服务器端的文件目录结构一一对应的。图36是软件仓库服务器端的文件目录结构,通过该图可以比较直观地理解单行语法格式中各个组成部分的相对关系。
单行语法格式的优点是,当前所有APT版本都支持,内容相对紧凑、容易人类解析。缺点是不便机器解析,因为其包括了多个部分,每个部分都有多个变种。为了解决单行语法格式机器解析不便的问题,推出了Deb822语法格式。
(2)Deb822语法格式。
对于Deb822语法格式,每个文件都需要.sources作为文件扩展名,每个软件源都在单个“配置节”中进行配置,每行明确描述源的功能。大多数选项还允许配置值列表,可以在单个软件源中定义多个镜像(Mirror)或多个套件。也就是说,Deb822格式表达能力更强,Deb822格式对APT软件的版本有要求,APT v1.1以后的版本才支持。有个别Linux发行版的最新版,例如Ubuntu 24.04的APT软件源已默认采用了Deb822格式。Deb822格式的软件源形式如下(包含了两个配置节):
Enabled: yes
Types: deb deb-src
URIs: http://***.com/ubuntu
Suites: disco disco-updates disco-security disco-backports
Components: main universe multiverse restricted
X-Repolib-Name: Pop!_OS PPA
Enabled: yes
Types: deb
URIs: http://ppa.***.net/system76/pop/ubuntu
Suites: disco
Components: main
4. /etc/apt/sources.list.d/目录解析
/etc/apt/sources.list.d/目录放置第三方额外的软件源,而不是添加到sources.list文件中。这使得管理额外软件源更加灵活。自定义源的添加方法如下:创建一个以.list为扩展名的文件,将其放置在sources.list.d/目录下,文件格式与sources.list条目格式相同。
5. /etc/apt/preferences.d/目录解析
与sources.list.d目录类似,preferences.d目录允许用户将软件包优先级配置分散到单独的文件中,以便更好地组织和管理。该目录下的preferences文件允许用户自定义包的优先级,这对于混合使用多个软件源、避免自动更新到不稳定版本或者解决依赖性问题非常有用。
文件内容语法如下所示。
Package: 包名
Pin: Pin规则
Pin-Priority: 优先级
- 包名:可以是具体的包名,也可以用通配符*表示所有包。
- Pin字段定义了包的来源或特征。常见的Pin规则如下所述。
- release:指定发布版本。
- origin:指定包来源的主机名。
- codename:指定发布代码名。
- archive:指定发布仓库(例如stable、testing)。
- version:指定包的版本。
- label:指定包的标签。
- 优先级:整数值,APT根据这个值来决定包的安装或升级优先级。已安装软件的默认优先级通常是1000。
- 大于1000:APT将会强制安装该版本,即使会导致系统损坏。
- 100~1000:APT将尝试安装指定版本,除非有特定版本已被安装。
- 0~100:APT不会自动安装该版本,但可以手动安装。
- 负值:APT将完全忽略该版本。
下面通过几个例子展示该目录下配置文件的用法。
(1)例1:优先使用特定版本的包。
Package: mypackage
Pin: version 1.2.3
Pin-Priority: 1001
这将强制安装版本1.2.3的mypackage,即使有其他更新版本。
(2)例2:优先使用来自特定来源的包。
Package: *
Pin: origin "archive.ubuntu.com"
Pin-Priority: 700
这将优先从archive.ubuntu.com安装所有包。
(3)降低testing版软件包的优先级。
Package: *
Pin: release a=testing
Pin-Priority: 50
这将降低testing仓库中所有包的优先级,除非没有其他候选项。
银河麒麟桌面版/etc/apt/preferences.d/目录下有archive1.pref ~ archive4.pref四个文件,使用命令cat /etc/apt/preferences.d/*可同时查看这几个文件的内容(如图37所示)。
6. /etc/apt/trusted.gpg.d目录解析
原先用于存储系统信任GPG密钥的文件/etc/apt/trusted.gpg已被废弃,现在建议将软件源的GPG密钥存储在/etc/apt/trusted.gpg.d目录下的单独文件中,以提高系统的安全性。GPG密钥用于APT验证从不同软件源下载的软件包的真实性。
APT使用/etc/apt/trusted.gpg.d目录中的GPG密钥来验证软件包的方式如下所述。
- 软件包签名验证:当APT下载软件包时,软件包会附带数字签名。APT会使用/etc/apt/trusted.gpg.d目录中的GPG密钥来验证这些签名的真实性。
- 密钥匹配:APT会检查软件包签名中使用的密钥是否存在于/etc/apt/trusted.gpg.d目录中,如果存在匹配的密钥,则软件包被视为受信任。
通过验证软件包的签名,APT可以确保软件包在传输过程中没有被篡改或损坏。如果软件包的签名无法通过GPG密钥验证,APT就会发出警告并拒绝安装该软件包。
APT主要命令和操作
APT包管理器主要由apt-get、apt-cache、apt-mark等几个命令行工具组成,如图38所示。APT可以智能地从安装来源下载最新版本的软件并且安装,而无须在安装后重启电脑(除更新系统内核外)。
图38 银河麒麟系统中以apt开头的命令行工具
APT中的软件包有三种关联性:依赖项、建议项和推荐项。
- 依赖项:这些是必须安装的软件包,以确保目标软件包能够正常运行。
- 建议项:这些是软件包维护者认为大多数用户在安装目标软件包时也应该安装的软件包,但不是必需的。
- 推荐项:这些是与目标软件包相关的软件包,可以增强其功能,也不是必需的。
(1)apt命令。
apt命令用法如表35所示。
表35 apt命令用法示例
命 令 | 解 释 |
apt list --installed apt list --upgradable apt list nginx* | 列出已安装的包 列出可升级的包 列出所有以nginx开头的包 |
apt search nginx apt search nginx --names-only apt search ^python apt search python$ | 搜索软件包名称或描述中包含nginx的所有包 仅搜索软件包名称中包含nginx的所有包 使用正则表达式搜索以“python”开头的软件包名称 使用正则表达式搜索以“python”结尾的软件包名称 |
apt show nginx | 显示一个包的详细信息,如版本、依赖关系等 |
apt install nginx apt install nginx --download-only apt install nginx --simulate apt install --reinstall nginx apt install --install-suggests nginx apt install git=1:2.45.2 | 正常安装软件包,自动解决依赖关系 仅下载指定包,不安装 模拟安装过程,不会实际安装包 重新安装指定的软件包 同时安装建议的软件包 安装指定版本的git |
apt reinstall nginx | 重新安装指定的软件包 |
apt satisfy nginx apt satisfy 'nginx>=1.14' | 检查并安装满足指定软件包依赖性的包 确保安装的nginx版本至少为1.14 |
apt remove nginx apt remove nginx --purge | 移除指定的软件包,但不删除配置文件 删除软件包及其相关的配置文件 |
apt autoremove apt autoremove --purge | 自动移除不再需要的包 --purge选项同时删除配置文件 |
apt update | 更新软件包列表,从而知道有哪些可用的更新 |
apt upgrade apt upgrade nginx | 升级所有可升级的包或指定包 仅升级nginx包 |
apt full-upgrade | 完全升级,可能会移除某些包以满足依赖关系 |
apt-mark hold nginx apt-mark unhold nginx | nginx无法被安装、升级或卸载 恢复nginx可供更新 |
(2)apt-get命令。
apt-get命令包含而apt命令不包含的子命令如表36所示。
表36 apt-get相比apt的差异部分
命 令 | 解 释 |
apt-get build-dep <package> | 安装构建软件包所需的构建依赖项 |
apt-get build-dep --no-install- | 安装构建依赖但跳过推荐包 |
apt-get check | 更新缓存并检查是否有损坏的依赖 |
apt-get dselect-upgrade | 使用dselect的结果进行升级操作 |
apt-get purge <package> | 删除包含配置文件的软件包 |
apt-get purge --auto-remove <package> | 删除包含配置文件的软件及其依赖 |
apt-get source <package> | 下载指定包的源代码 |
apt-get source --compile <package> | 下载源代码,编译并安装 |
apt-get download <package> | 仅下载指定包而非安装 |
apt-get changelog <package> | 下载指定软件包,并显示其变更日志 |
apt-get clean | 清空整个/var/cache/apt/archives/目录,删除所有缓存的.deb文件 |
apt-get autoclean | 只删除/var/cache/apt/archives/下软件包的旧版本。与clean命令相比,autoclean更加保守,它会保留可能仍然有用的包文件 |
(3)apt-cache命令。
apt-cache命令用法如表37所示。
表37 apt-cache命令用法
命 令 | 解 释 |
apt-cache madison <package> | 显示软件包<package>在各软件源上的版本 |
apt-cache show <package> | 显示软件包<package>所有可用版本的详细信息 |
apt-cache show --no-all-versions <package> | 显示<package>在当前系统上可安装的最新版本的详细信息,而非所有版本 |
apt-cache search keyword | 在包描述中搜索含有keyword的包 |
apt-cache search --names-only keyword | 仅在包名中搜索keyword,不搜索描述 |
apt-cache search --full keyword | 显示包含keyword的包的完整记录 |
apt-cache depends <package> | 显示软件包<package>的依赖关系 |
apt-cache depends --recurse <package> | 递归显示软件包<package>的依赖关系 |
apt-cache rdepends <package> | 显示哪些包依赖软件包<package> |
apt-cache rdepends --installed <package> | 仅显示已安装的包依赖软件包<package> |
apt-cache pkgnames | 列出APT数据库中所有包的名称 |
apt-cache pkgnames <prefix> | 列出APT数据库中以prefix为前缀的包名 |
apt-cache policy | 显示已安装软件包的版本和可用版本 |
apt-cache policy <package> | 显示特定软件包<package>的版本和来源优先权信息 |
apt-cache dump | 打印APT缓存中所有包的详细信息 |
apt-cache dumpavail | 打印可用的所有包列表信息,通常用于帮助调试 |
apt-cache unmet | 显示具有未满足依赖关系的包 |
apt-cache unmet --auto | 仅显示可能会被apt-get autoremove删除的包的未满足依赖信息 |
apt-cache stats | 显示APT缓存的统计信息 |
apt-cache showpkg <package> | 显示软件包<package>的所有可用版本及其依赖关系 |
APT离线使用
在离线环境下使用apt命令安装软件包,需要提前下载所需的软件包及其依赖项,并将它们传输到目标系统。要求下载软件包的计算机系统架构最好与离线环境下的目标计算机系统架构完全一致。
1. 方法1:使用apt-offline辅助工具
apt-offline是一个专门用于离线管理APT软件包的软件工具。它允许在离线系统上生成请求文件,然后在有网络连接的系统上下载所需的包,最后将下载的包回传到离线系统进行安装。
(1)在离线系统上生成请求文件。
安装apt-offline:
sudo apt-get install apt-offline
生成请求文件:
sudo apt-offline set ./apt-offline.sig
在当前路径下,生成一个名为apt-offline.sig的请求文件,包含了当前系统上所有需要更新或安装的软件包信息。
(2)在有网络连接的计算机上下载包。
将请求文件传输到有网络连接的计算机上,使用apt-offline下载所需的软件包:
sudo apt-offline get ./apt-offline.sig --bundle ./apt-offline.zip
这将下载所有需要的软件包,并将它们打包成为apt-offline.zip文件。
(3)在离线计算机上安装下载的软件包。
首先将下载的apt-offline.zip文件传回离线计算机,然后在离线计算机上,使用apt-offline安装下载的软件包:
sudo apt-offline install /path/to/apt-offline.zip
2. 方法2:手动下载和安装软件包
如果不使用apt-offline,也可以手动下载和安装所需的软件包及其依赖项。
(1)在有网络连接的计算机上下载软件包。
在有网络连接的系统上,使用apt-get download下载所需的软件包及其依赖项。例如,要下载vim这个软件包:
sudo apt-get download $(sudo apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances vim | grep "^\w" | sort -u)
这将下载vim及其依赖项的.deb文件,然后将所有下载的.deb文件打包成一个压缩文件或使用其他方式传输到离线计算机。
(2)在离线计算机上安装软件包。
将下载的.deb文件传回离线计算机,然后在离线计算机上,进入.deb文件所在目录,使用dpkg安装当前目录下的所有.deb文件。例如:
sudo dpkg -i ./*.deb
如果有依赖关系问题,可以使用apt-get -f install来修复依赖关系:
sudo apt-get -f install
3. 方法3:利用缓存的deb包搭建软件源
当使用APT安装或更新软件包时,APT会将下载的.deb软件包存放在/var/cache/apt/archives/目录下。如果需要重新安装软件包,APT就可以直接使用这个目录中的缓存文件,无须再次从网络下载,从而节省带宽,加快安装速度。
可以将这些缓存的软件包制作成APT可以使用的软件源,复制到离线环境后使用。具体步骤如下:
(1)在联网计算机上,将/var/cache/apt/archives/目录下的deb包复制到新的文件夹中,比如/home/<username>/repository/。
mkdir ~/repository/
cp /var/cache/apt/archives/*.deb ~/repository/
(2)生成压缩版的Packages.gz文件,Packages.gz文件包含了当前目录中的所有.deb软件包的元数据,包括软件包名称、版本、依赖关系等信息。这个文件是APT识别软件源所必需的。
cd ~/repository
sudo dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
(3)将联网计算机上的目录~/repository/复制到离线环境。
(4)在离线计算机上,编辑sources.list文件,将软件源添加到其中:
deb [trusted=yes] file:/home/<username>/repository/ / # 最后的“/”不可省略
请将上面file:后面的路径修改为repository实际存放路径。上面这一行内容的最后是“/”,表示该软件源不特定于任何发行版或组件,这样APT就会尝试从这个源中获取所有可用的软件包。
(5)重新加载软件包索引:
sudo apt update
通过以上步骤,就可以利用/var/cache/apt/archives/下的deb包构建自己的软件源了。
4. 方法4:使用系统安装光盘(或系统安装光盘文件)搭建本地源
通常Linux发行版是可以将安装光盘制作成本地软件源使用的,例如,Ubuntu、CentOS都可以将安装光盘制作成本地软件源。理论上,银河麒麟桌面版作为Ubuntu的衍生版,应该也可以这么做。但经测试银河麒麟桌面版安装盘中的Release文件被删除了(Release文件记录了文件的哈希值)。由于运行sudo apt update的时候会先校检Release文件的签名信息,如果不符合则认为是无效的仓库。银河麒麟桌面版安装光盘只内置了有限几种安装包,如图39所示。
图39 银河麒麟桌面版安装光盘可选deb包
这些deb包对应的就是在安装系统时可选的几款软件,如图310所示。
图310 银河麒麟桌面版安装时软件包选择界面
因此,银河麒麟桌面版不需要、也无法直接搭建光盘软件源。
APT的安全特性
APT使用GPG对软件包进行签名和验证,以确保包的完整性和来源的可信度,这一机制称为apt-secure。
1. apt-secure的工作机制
apt-secure是APT的一个安全特性,用于验证软件包的来源和完整性。它通过签名和验证机制,确保从仓库下载的包是可信的。
(1)包签名与验证过程。
- 包签名:开发者使用私钥对软件包进行签名。
- 发布:签名的包上传到软件仓库。
- 下载:用户使用APT下载软件包。
- 验证:APT使用仓库的公钥验证包的签名。
(2)Release文件和InRelease文件。
APT使用多个文件来管理软件包仓库和包的元数据,其中Release文件和InRelease文件是两个重要的文件。Release文件是包含仓库元数据的文件,描述了软件包仓库的各个部分包含的包以及这些包的元数据。它主要用于确保仓库的一致性和完整性。InRelease文件是Release文件的增强版本,它不仅包含Release文件中的所有内容,还包括一个内嵌的GPG签名。
2. 使用apt-key命令管理密钥
apt-key是一个用于管理APT的GPG密钥的命令行工具。它可以添加、删除和列出系统信任的密钥(如表38所示)。表3-8中的apt-key adv是apt-key的子命令,提供了与GPG交互的高级功能。
表38 apt-key命令使用示例
命 令 | 解 释 |
apt-key list | 列出系统中所有已添加的APT密钥 |
apt-key add /path/to/keyfile.asc wget -qO - https://example.com/repo-key.gpg | apt-key add - | 从本地文件中导入密钥 |
从URL获取并添加GPG公钥 | |
apt-key del <key-id> | 删除指定的密钥 |
apt-key fingerprint <key-id> | 显示指定密钥的指纹信息 |
apt-key update | 更新所有密钥(已弃用) |
apt-key adv --keyserver <keyserver> --recv-keys apt-key adv --export <key-id> > exported-key.asc | 从指定的密钥服务器下载并导入密钥 |
导出指定的密钥到文件 |
3. 密钥相关故障处置
(1)案例1。
在使用APT的过程中,特别是在添加PPA仓库(后文将详细讲解)时,经常会遇到如图311所示的错误。
图311 缺少公钥错误
该错误通常是由于PPA仓库的公钥未导入到系统中,导致APT无法验证软件包的签名而引起的。遇到此类故障,可以使用如下命令添加缺少的公钥:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 8094BB14F4E3FBBE
命令中的hkp://keyserver.ubuntu.com:80为存储公钥的服务器(称之为keyserver),可用的keyserver包括如下这些。
keyserver.ubuntu.com
pgp.mit.edu
subkeys.pgp.net
www.gpg-keyserver.de
(2)案例2。
图3-12展示了使用在线脚本安装某软件时的报错信息,这是另一种缺少公钥错误的示例。
图312 GPG缺少公钥错误
这类错误处置步骤如下所述。
按照图3-12中提示,执行下面的命令获取缺失的公钥:
gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
导出所有GPG公钥:
gpg --export --armor > all-gpg-keys.asc
将密钥文件复制到/etc/apt/trusted.gpg.d/:
sudo cp all-gpg-keys.asc /etc/apt/trusted.gpg.d/
通过这种方式,可以确保将GPG管理的所有密钥都导入APT的密钥环中。
相关文章:
银河麒麟桌面版包管理器(二)
APT包管理器 APT是Debian及其派生系统的包管理器,构建在dpkg之上,以其强大的依赖性处理能力和丰富的软件仓库而闻名。APT具有自动解决依赖关系、提供易于使用的命令行工具(如apt-get、apt-cache等),以及稳定的软件更新…...
Leetcode 3494. Find the Minimum Amount of Time to Brew Potions
Leetcode 3494. Find the Minimum Amount of Time to Brew Potions 1. 解题思路2. 代码实现 题目链接:3494. Find the Minimum Amount of Time to Brew Potions 1. 解题思路 这道题虽说算是搞定了,通过了全部的测试样例,不过还是很暴力的求…...
制作Oracle11g Docker 镜像
基于Linux系统,宿主主机要设置如下环境变量,oracle为64位版本 dockerfile中需要的数据库安装包可从csdn下载内找到 #!/bin/bash # 在宿主机上运行以设置Oracle所需的内核参数 # 这些命令需要root权限cat > /etc/sysctl.d/99-oracle.conf << EO…...
rocky linux下载软件
一、配置国内镜像源加速下载 Rocky Linux 默认使用国外软件源,国内用户可通过替换为阿里云镜像提升下载速度: 备份原配置文件: cp -r /etc/yum.repos.d /etc/yum.repos.d.backup 修改镜像源: sed -e s|^mirrorlist|#mirrorli…...
JVM的组成--运行时数据区
JVM的组成 1、类加载器(ClassLoader) 类加载器负责将字节码文件从文件系统中加载到JVM中,分为:加载、链接(验证、准备、解析)、和初始化三个阶段 2、运行时数据区 运行时数据区包括:程序计数…...
SpringBoot中安全的设置阿里云日志SLS的accessKey
众所周知,阿里云的服务都是基于accesskeyId和accesskeySecret来进行身份鉴权的,但唯独日志因为需要写入到.xml文件里对于accesskeyId和accesskeySecret需要进行一定程度的改进,尤其是使用了jasypt进行加密的参数传递进去logback.xml更是会遇到需要对参数进行解密的问题,而官网只…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例11,TableView15_11带分页的导出表格示例
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
C++多线程编程:从创建到管理的终极指南
在高性能计算时代,掌握多线程编程是提升程序效率的必修课!本文将手把手教你如何用C++11标准库轻松创建和管理线程,告别单线程的“龟速”,让代码跑出多核CPU的性能! 一、多线程为何重要? 充分利用多核CPU:现代计算机普遍支持多核并行,多线程可让程序性能指数级提升。提升…...
人工智能算法基础
基础算法 排序查找线性结构树散列图堆栈 机器学习算法 定义:数据算法 流程:数据收集与预处理、特征选择、训练和测试模型、模型的评估。 监督学习 定义:是从给定的训练数据集中学习出一个函数,当新的数据到来时,可…...
Normal distribution (正态分布)
Normal distribution {正态分布} 1. Normal distribution (正态分布) Gaussian distribution (高斯分布)1.1. Probability density function (概率密度函数)1.2. Standard normal distribution (标准正态分布)1.3. Cumulative distribution function (累积分布函数) 2. 正态分…...
企业级前端架构设计与实战
一、架构设计核心原则 1.1 模块化分层架构 典型目录结构: src/├── assets/ # 静态资源├── components/ # 通用组件├── pages/ # 页面模块├── services/ # API服务层├── store/ # 全局状态管理├── uti…...
数据模型,数据建模,组件,核心价值,使用,意义
数据模型 一组由符号,文本组成的集合, 用以准确表达信息景观, 达到有效交流,沟通的目的 数据建模 是发现,分析和确定数据需求的过程,是一种称为数据模型的精确形式表示和传递这些需求 数据模型的组件 实体, 关系, 属性和域 数据模型的核心价值 交流性 精确性 数据模型的…...
JavaScript 比较运算符
JavaScript 比较运算符 一、基础比较运算符类型 运算符名称示例核心特性==宽松相等"5" == 5 → true隐式类型转换===严格相等"5" === 5 → false类型+值双重校验!=宽松不等null != 0 → true等效于 !(a == b)!==严格不等5 !== "5" → true类型或…...
AI Agent战国时代:Manus挑战者的破局之道与技术博弈
随着Manus引爆通用型AI Agent的"手脑协同"革命,全球AI Agent赛道进入技术竞速期。Flowith、UI-TARS、LangManus等新势力通过差异化路径重构市场格局,背后折射出开源生态、本土化创新与跨模态交互的深层技术博弈。本文结合行业权威报告与公开技…...
linux--时区查看和修改
查看当前时间和时区: 打开终端,输入以下命令查看当前的日期和时间设置: timedatectl修改时区: 使用 timedatectl 命令来修改时区: sudo timedatectl set-timezone <时区>例如,设置时区为北京时间(中国标准时间&a…...
个人博客系统 --- 测试报告
一、项目功能介绍 该项目由:登录模块、博客首页模块、博客详情页模块、博客编辑页模块四个功能模块组成。 该系统实现了个人博客的保存以及记录了发布日期、时间、发布人等信息。 二、测试内容与测试用例 我们需要对该系统进行功能测试,界面测试&…...
ESP32S3基于FreeRTOS实时操作系统控制舵机
这段代码是一个基于ESP32的舵机控制示例,通过MCPWM模块配置定时器、操作符、比较器和发生器,生成特定脉冲宽度的PWM信号,控制舵机在 -60度到60度之间以2度为步长往复转动。 1. 源码部分 #include "freertos/FreeRTOS.h" #include…...
【vue的some和filter】
在 Vue 中,some 和 filter 是两种不同的数组方法,分别用于处理数据筛选和条件判断。以下是它们在 Vue 中的具体用法和区别: 一、filter 方法 作用:对数组进行过滤,返回符合条件的新数组。 使用场景:常用于…...
【LC插件开发】基于Java实现FSRS(自由间隔重复调度算法)
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文讲解【LC插件开发】基于Java实现FSRS(自由间隔重复调度算法),期待与你一同探索、学习、进步,一起卷起来叭! 目录…...
jupyter 操作相关内容
1、jupyter界面美化 pip3 install jupyterthemes查看可用主题 jt -l推荐两个 jt -t grade3 -f consolamono -fs 140 -tfs 13 -nfs 115 -ofs 14 -cellw 90% -Tjt -t chesterish -f consolamono -fs 140 -altp -tfs 13 -nfs 115 -ofs 14 -cellw 90% -T...
【数据结构】单链表
目录 一、什么是链表?1、 定义2、链表的分类 二、无头单向非循环链表1、结构2、单链表数据的打印3、创建结点并初始化4、尾插5、头插6、尾删7、头删8、查找9、在指定位置pos之前插入数据10、在指定位置pos之后插入数据11、删除pos结点12、删除pos之后的结点13、销毁…...
UnoCSS极速入门:下一代原子化CSS引擎实战指南
文章目录 一、什么是UnoCSS?二、环境配置(Vite示例)三、核心使用模式3.1 自定义规则3.2 原子化类应用3.3 使用RegExp匹配器 四、高级功能解析4.1 主题系统4.2 响应式与深色模式 五、实战案例:构建现代按钮组件六、性能优化技巧七、…...
Es6进阶
class里的get和set 在 ES6 中,class 里的 get 和 set 是用于定义访问器属性的关键字。get 方法可在访问对象属性时调用,set 方法则在设置对象属性时调用。下面通过一个简单示例来介绍它们的用法: javascript class Person {constructor(nam…...
可发1区的创新思路:基于K-means聚类的EMD-BiLSTM-CNN-Attention时间序列预测模型(功率预测、寿命预测、流量预测、故障诊断)
首先声明,该模型为原创!原创!原创! 一、应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、交通流量预测、电机故障检测等等。 二、模型整体介绍(本文以光伏功率预测为例) 核心架构 数据聚类:K-means对风电场机组分组,降低异质性干扰。…...
Android BLE 权限管理
前言 android 权限一直是比较活跃的 在蓝牙权限这一块又分新版和旧版 新版权限 android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_CONNECT旧版权限如9.0以下 Manifest.permission.A…...
vue3 ts 注册全局组件
vue3 ts 注册全局组件 register.tsmain.ts register.ts // 注册全局组件 import {App} from "vue" import headerPage from "/headerPage.vue" export default {install(app:App){app.component("headerPage",headerPage)} }main.ts import re…...
Apache Doris学习
https://doris.apache.org/zh-CN/docs/gettingStarted/what-is-apache-doris 介绍 Apache Doris 是一款基于 MPP 架构(大规模并行处理)的高性能、实时分析型数据库。它以高效、简单和统一的特性著称,能够在亚秒级的时间内返回海量数据的查询…...
llama源码学习·model.py[7]Transformer类
一、源码展示 class Transformer(nn.Module):def __init__(self, params: ModelArgs):super().__init__()self.params paramsself.vocab_size params.vocab_sizeself.n_layers params.n_layersself.tok_embeddings VocabParallelEmbedding(params.vocab_size, params.dim,…...
Windows server 2022域控制服务器的配置
Windows server 2022介绍 一、核心特性与改进 安全核心服务器(Secured-Core Server) 硬件级安全:支持基于硬件的安全功能(如TPM 2.0、Secure Boot、基于虚拟化的安全防护VBS),防止固件攻击。受信任的启动链…...
yolo目标检测算法在DJI上的研究分析(大纲)
yolo目标检测算法在DJI上的研究分析 面向边缘计算的实时目标检测系统设计与部署 第一章 绪论 1.1 研究背景与意义 目标检测技术需求: DJI设备(如无人机、摄像头)在安防、巡检、农业等场景中的广泛应用现有YOLO算法在高分辨率图像或资源受限…...
三、重学C++—C语言内存管理
上一章节: 二、重学C—C语言核心-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146191640?spm1001.2014.3001.5502 本章节代码: cPart2 CuiQingCheng/cppstudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/cppstudy/tree/…...
DAY37 动态归化Ⅰ基础题目
509. 斐波那契数 - 力扣(LeetCode) class Solution { public:int fib(int n) {if(n<1) return n;int dp[2];dp[0]0;dp[1]1;int sum0;for(int i2;i<n;i){sum dp[0]dp[1];dp[0]dp[1];dp[1]sum;}return sum;} }; 70. 爬楼梯 - 力扣(Lee…...
ABAP Core Data Services (SAP PRESS) (First Edition)
ABAP Core Data Services (SAP PRESS) (First Edition)...
ORM——对象关系映射
对象关系映射(ORM)深度解析:原理、优势与应用场景 一、什么是ORM? ORM(Object-Relational Mapping)即对象关系映射,是一种将面向对象编程中的对象与关系型数据库中的表进行映射的技术。简单来…...
【Docker系列五】Docker Compose 简介
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
大语言模型-2.2/3-主流模型架构与新型架构
简介 本博客内容是《大语言模型》一书的读书笔记,该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品,覆盖大语言模型训练与使用的全流程,从预训练到微调与对齐,从使用技术到评测应用,帮助学员全面掌握大语言模型的…...
JAVA组件的利用漏洞 Shlr搜索引擎 shiro身份 Log4j日志
solr组件 1、作用 : 基于http和apache lucene 进行全文搜索服务器 2、识别: 第一个就是图标类似于华为的那个 然后就是端口标识是 8983 3、CVE利用: 1、命令执行(CVE-2019-17558) Apache Solr 5.0.0版本至8…...
MongoDB未授权访问漏洞
1、连接MongoDB,添加账号密码 mongo 127.0.0.1 use admindb.createUser({user: admin,pwd: MongoDB123%.com,roles:[{role: root,db: admin}] })创建admin用户,密码为:MongoDB123%.com 2、设置完成,可以通过指令 show users 查看…...
CVPR2025 | 对抗样本智能安全方向论文汇总 | 持续更新中~
汇总结果来源:CVPR 2025 Accepted Papers 若文中出现的 论文链接 和 GitHub链接 点不开,则说明还未公布,在公布后笔者会及时添加. 若笔者未及时添加,欢迎读者告知. 文章根据题目关键词搜索,可能会有遗漏. 若笔者出现…...
MyBatis 动态 SQL 优化:标签的实战与技巧
目录 动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态SQL的常见用途 二、动态SQL的常见用法(XML方式)2.1 < if > 标签2.2 < trim> 标签2.3 <where>标签2.4<set>标签2.5 <foreach&g…...
自动化机器学习(TPOT优化临床试验数据)
目录 自动化机器学习(TPOT优化临床试验数据)1. 引言2. 项目背景与意义2.1 临床试验数据分析的重要性2.2 自动化机器学习的优势2.3 工业级数据处理与GPU加速需求3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法4. 自动化机器学习与TPOT4.1 自动化机器学习简介4.2 TPOT在临…...
spring boot3 验证码工具kaptcha使用
1、pom.xml文件,下载验证码工具kaptcha依赖 官网搭建的spring boot项目 <!--验证码工具kaptcha的依赖--> <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId> </dependency> 阿里云…...
Android 根据Url使用Retrofit框架进行文件下载
一、背景 根据后端返回的url下载地址,去执行文件下载,将文件保存到SD卡。这里使用Retrofit网络框架。 二、代码实现 2.1、定义一个DownloadFileService interface DownloadFileService {StreamingGETsuspend fun downloadFile(Url fileUrl: String):ResponseBody…...
可视化动态表单动态表单界的天花板--Formily(阿里开源)
文章目录 1、Formily表单介绍2、安装依赖2.1、安装内核库2.2、 安装 UI 桥接库2.3、Formily 支持多种 UI 组件生态: 3、表单设计器3.1、核心理念3.2、安装3.3、示例源码 4、场景案例-登录注册4.1、Markup Schema 案例4.2、JSON Schema 案例4.3、纯 JSX 案例 1、Form…...
Java常用类
常用类 1.包 2.String类 3.String注意事项 String是不可变字符串对象。只要是以“ …. ”方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份。但通过new方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。String s2 s1 "a"…...
多模态大模型常见问题
1.视觉编码器和 LLM 连接时,使用 BLIP2中 Q-Former那种复杂的 Adaptor 好还是 LLaVA中简单的 MLP 好,说说各自的优缺点? Q-Former(BLIP2): 优点:Q-Former 通过查询机制有效融合了视觉和语言特征…...
2025 年大模型排行分析:中美竞争与未来展望
具体排名数据见文章结尾 在人工智能领域,大模型的性能成为衡量机构技术实力的重要标志。以下是根据最新排名的一些主要发现,尤其关注中国模型的发展现状和优势。 全球领先的模型 在本次排名中,美国 OpenAI 的多个版本占据榜首位置。具体而…...
为什么后端路由需要携带 /api 作为前缀?前端如何设置基础路径 /api?
一、为什么后端路由需要携带 /api 作为前缀? 1. 区分 API 端点与其他路由 在 Web 应用程序中,后端不仅需要处理 API 请求,还可能需要处理静态资源(如 HTML、CSS、JS 文件)或其他服务(如 WebSocket&#x…...
Mac:Ant 下载+安装+环境配置(详细讲解)
📌 下载 Ant 下载地址:https://ant.apache.org/bindownload.cgi 📌 无需安装 Apache官网下载 Ant 压缩包,无需安装,下载解压后放到自己指定目录下即可。 按我自己的习惯,我会在用户 jane 目录下新建了个…...
web客户端存储,IndexDB相关讲解
IndexDB详细讲解 IndexedDB 是浏览器提供的一种底层 API,用于在客户端存储大量结构化数据。相比 Web Storage(localStorage/sessionStorage),它支持更复杂的数据结构、事务处理、索引查询等高级功能。以下是一个系统化的讲解: 一、核心概念 1、数据库(Database) 每…...