使用 PXE+Kickstart 批量网络自动装机
前言:
正常安装系统的话使用u盘一个一个安装会非常慢,所以批量安装的技术就出来了。
一、 概念
- PXE (Preboot eXecute Environment,预启动执行环境)是由 Intel 公司开发的技术,可以让计算机通过网络来启动操作系统(前提是计算机上安装的网卡支持 PXE 技术)主 要用于在无人机值守安装系统中引导客户端主机安装 Linux 操作系统。
- Kickstart 是一种无 人值守的安装方式,其工作原理是预先把原本需要运维人员手工填写的参数保存成一个 ks.cfg 文件,当安装过程中需要填写参数时则自动匹配 Kickstart 生成的文件。所以只要Kickstart 文件包含了安装过程中需要人工填写的所有参数,那么从理论上来讲完全不需要 运维人员的干预,就可以自动完成安装工作。
二、 实现方式
PXE服务端涉及到的软件有: dhcp,tftp-server,vsftpd,syslinux
- dhcp 为客户端网卡提供地址,并返回pxe(pxelinux.0 引导程序文件),指定tftp服务器地址
- tftp-server 为客户端提供 驱动程序(操作系统镜像文件),引导程序,内核程序,开机执行配置文件 下载。客户端使用网卡作为tftp的客户端进行下载
- vsftpd 将光盘安装介质传输给客户机,并使用Kickstart应答文件进行配置客户机(不用配置账号,应该是使用匿名账号进行传输 )
- syslinux 提供 pxelinux.0 引导程序 文件
具体实现如下:
- 网卡需要查找相关的dhcp服务器(获取地址时间)
- 找到后dhcp服务器提供ip地址,和引导程序(boot loader)的地址 还提供给客户机TFTPserver地址(dhcp本身不提供tftp服务)
- 网卡使用tftp客户端吧引导程序加载到内存中来
- bios执行引导程序
- 引导程序会去TFTP去查找配置文件
- 根据配置文件去引导安装系统
- 系统安装过程

三、 实验开始
这里我使用“VMware Workstation”作为实验环境。
客户机只需要和PXE服务端在一个物理网络就是,其他不用配置,下面主要是配置PXE服务端
1. 关闭虚拟机的DHCP功能,并记录下IP范围和网关地址,为后面配置静态地址上网使用。(如果是真实的生产环境,这步可以跳过)
这里我选择的网络模式是NAT
a) 关闭DHCP功能
编辑-- > 虚拟网络编辑器

b) 记录ip范围和网关地址
编辑-- > 虚拟网络编辑器 --> NAT设置

c) 打开虚拟机配置静态地址
tip:根据自己的情况配置
cd /etc/sysconfig/network-scripts/
vi ifcfg-ens33

重启一下网络
systemctl restart network
测试一下是否联通外网。

可以连通外网,接下来的操作就可以使用xshell来操作了。
2. 下载所需的软件
[root@localhost ~]# yum -y install tftp tftp-server dhcp syslinux vsftpd
3. 服务配置文件修改
3.1. tftp配置
[root@localhost ~]# cat /etc/xinetd.d/tftp
# default: off
# description: The tftp server serves files using the trivial file transfer \
# protocol. The tftp protocol is often used to boot diskless \
# workstations, download configuration files to network-aware printers, \
# and to start the installation process for some operating systems.
service tftp
{socket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /var/lib/tftpboot tftp 默认 / 目录disable = no # 将yes修改为no 启用tftpper_source = 11cps = 100 2flags = IPv4
}
启动tftp-server服务
[root@localhost ~]# systemctl enable tftp --now
Created symlink from /etc/systemd/system/sockets.target.wants/tftp.socket to /usr/lib/systemd/system/tftp.socket.
关闭防火墙和selinux
[root@localhost ~]#systemctl disable firewalld --now
[root@localhost ~]#setenforce 0
[root@localhost ~]#sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
3.2. dhcp服务配置
[root@localhost ~]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.example
# see dhcpd.conf(5) man pageddns-update-style interim; # 支持DNS动态更新
ignore client-updates; # 忽略客户端更新DNS记录
subnet 192.168.92.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; # 客户端地址掩码 option domain-name-servers 192.168.92.2; # 客户端dns地址 option routers 192.168.92.2; # 客户端网关地址 range dynamic-bootp 192.168.92.100 192.168.92.200; # 客户端ip地址池 default-lease-time 21600; # 默认租约max-lease-time 43200; # 最大租约时间next-server 192.168.92.10; # tftp地址 filename "pxelinux.0"; # 引导程序文件
}
启动dhcp服务
[root@localhost ~]# systemctl enable dhcpd --now
Created symlink from /etc/systemd/system/multi-user.target.wants/dhcpd.service to /usr/lib/systemd/system/dhcpd.service.
3.3. vsftpd 服务配置
只需启动即可,默认 / 目录在 /var/ftp/
[root@localhost ~]# systemctl enable vsftpd --now
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
4. 文件准备
4.1. 将pxe引导程序放到 tftp / 目录
pxe 引导文件由 syslinux 提供
[root@localhost ~]# rpm -ql syslinux | grep pxelinux.0
/usr/share/syslinux/gpxelinux.0
/usr/share/syslinux/pxelinux.0
[root@localhost ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
4.2. 将内核文件放到 tftp / 目录下
1) 内核程序在 光盘镜像中,需要使用的话需要将光盘镜像挂载到 对应目录。
[root@localhost ~]# ll /dev/sr0
brw-rw----. 1 root cdrom 11, 0 May 8 20:38 /dev/sr0
[root@localhost ~]# mount /dev/sr0 /mnt
mount: /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 900M 0 900M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda2 20G 1.6G 19G 8% /
/dev/sda1 197M 120M 77M 61% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/sr0 4.4G 4.4G 0 100% /mnt
2) 将vmlinuz内核程序放到 tftp / 目录下
[root@localhost ~]# cp /mnt/isolinux/vmlinuz /var/lib/tftpboot/
4.3. 将initrd.img 文件(操作系统镜像)放到 tftp / 目录下
[root@localhost ~]# cp /mnt/isolinux/initrd.img /var/lib/tftpboot/
4.4. 将开机执行配置文件放到 tftp / 目录下
在 tftp / 目录下创建 pxelinux.cfg 目录,将开机执行配置文件放到 tftp / 下的pxelinux.cfg目录中并重名了为default
[root@localhost ~]# cp /mnt/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
现在查看 tftp / 目录下 有哪些文件
[root@localhost ~]# ll /var/lib/tftpboot/ -R
/var/lib/tftpboot/:
total 60480
-rw-r--r--. 1 root root 55129656 May 8 21:35 initrd.img
-rw-r--r--. 1 root root 26759 May 8 21:27 pxelinux.0
drwxr-xr-x. 2 root root 21 May 8 21:39 pxelinux.cfg
-rwxr-xr-x. 1 root root 6769256 May 8 21:33 vmlinuz/var/lib/tftpboot/pxelinux.cfg:
total 4
-rw-r--r--. 1 root root 3032 May 8 21:39 default
4.5. 将安装光盘文件放到 vsftp 目录,提供给客户端下载
在 4,2 已经将光盘文件挂载到了 /mnt 目录,所以现在只需要将 /mnt 目录下的文件 拷贝到 vsftp 目录即可。
创建ftp存放光盘文件的目录
[root@localhost ~]# mkdir /var/ftp/Centos7.9
将光盘文件拷贝到ftp对应目录
[root@localhost ~]# cp -rp /mnt/* /var/ftp/Centos7.9/
4.6. 将Kickstart 应答文件放到ftp / 目录下,并重名了为ks.cfg
如果我们刚装完系统,在 /root 目录下就会生成一个 anaconda-ks.cfg 文件,这个就是
Kickstart 应答文件,只需要稍微修改就可以使用,下篇将介绍使用system-config-kickstart图形化工具,定义Kickstart 应答文件,当然这需要你的操作系统有 GUI。
[root@localhost ~]# cp /root/anaconda-ks.cfg /var/ftp/ks.cfg
# 授权,如果权限不够,客户机就无法通过这个文件进行配置
[root@localhost ~]# chmod 777 /var/ftp/ks.cfg
5. 修改开机配置文件和Kickstart应答文件
现在所有的文件都准备就绪了,现在只需要修改 这两个文件,就大功告成了
5.1. 修改开机配置文件
默认的开机菜单中有两个选项,要么是安装系统,要么是对安装介质进行检验。
default 文件,把第 1 行的 default 参数 修改为 linux,这样系统在开机时就会默认执行那个名称为 linux的选项了。我们将默认的光盘镜像安装方式修改成 FTP 文件传输方式,并指定好光盘镜像的获取网址以及 Kickstart 应答文件的获取路径:
default linux
... ...
label linuxmenu label ^Install CentOS 7kernel vmlinuzappend initrd=initrd.img inst.stage3=ftp://192.168.92.10/Centos7.9 ks=ftp://192.168.92.10/ks.cfg quiet
... ...
5.2. 修改Kickstart 应答文件
5.2.1. kickstart应答文件的组成部分
kickstart文件主要包括三个部分:命令段,程序包段,脚本段
命令段:指明各种安装前配置,如键盘类型等
命令段中的常见命令:
- keyboard: 设定键盘类型
- lang: 语言类型
- zerombr:清除mbr
- clearpart:清除分区
- part: 创建分区
- rootpw: 指明root的密码
- timezone: 时区
- text: 文本安装界面
- network:指定网络设置
- firewall:设置防火墙设置
- selinux:设置selinux设置
- reboot:安装完自动重启
- user:安装完成后为系统创建新用户
- url: 指明安装源
程序包段:指明要安装的程序包组或程序包,不安装的程序包等
%packages
@core:这个子部分表示基础系统的软件包,包括操作系统内核、文件系统和基本工具等。
@base:这个子部分表示基本软件包,包括一些命令行工具和基本服务。
@<package_group>:这个子部分表示需要安装的软件包组,可以是预定义的软件包组,也可以是自定义的软件包组。
<package_name>:这个子部分表示需要单独安装的软件包,可以是操作系统提供的软件包,也可以是第三方软件包。
%end
下面是一个简单的Kickstart文件%packages部分的例子:
# 如下示例安装了基础系统软件包、命令行工具、Web服务器、MySQL数据库和OpenSSH服务器。同时也单独安装了openssh-server软件包。
%packages
@core
@base
@web-server
@mysql
openssh-server
%end
在 kickstart 应答文件的 %packages 部分中,可以使用 " - 软件包名称" 的格式来指定不安装某个软件包。例如,如果你想要安装所有的 “@core” 软件包,但不想安装 “emacs” 软件包,可以这样写:
# 这样在安装系统时,kickstart 将会安装 “@core” 软件包组中的所有软件包,但不会安装 “emacs” 软件包。请注意,软件包名称前面的 “-” 符号非常重要,它指示 kickstart 不要安装这个软件包。
%packages
@core
-emacs
%end
查看系统安装的软件包组:
yum grouplist
安装软件包组:yum groupinstall
卸载软件包组:yum groupremove
脚本段:
#安装前脚本
%pre
%end
#安装后脚本
%post
%end
%post
useradd wang # 安装完创建用户
%end
5.2.2. kickstart修改
对密码进行加密:
openssl passwd -1 "adm@123"
可参考链接:https://www.cnblogs.com/panwenbin-logs/p/9340430.html
对参数的了解可参考链接:https://www.cnblogs.com/dinmin/articles/15348374.html
[root@localhost ~]# cat /var/ftp/ks.cfg
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
url --url=ftp://192.168.92.10/Centos7.9 # 获取镜像文件的方式
# Use graphical install
graphical # 在 图像化界面下安装
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8 # 系统语言# Network information
network --bootproto=dhcp --device=ens33 --ipv6=auto --no-activate
network --hostname=localhost.localdomain# Root password
rootpw --iscrypted $1$WriG9jbZ$3HCtLDoIqcDg3juOGUrXK0 # 加密后的密码
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc # 时区设置
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda # 设置启动盘
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --ondisk=sda --size=200 # boot 分区设置大小,默认为M,不可设置单位
part / --fstype="xfs" --ondisk=sda --grow # --grow 将剩余的容量全部划分%packages #安装的软件包
@^minimal
@core
chrony
kexec-tools%end%addon com_redhat_kdump --enable --reserve-mb='auto'%end%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%endfirewall --disable # 不启动防护墙,默认是启动
selinux --disable # 不启动selinux,默认是启动
reboot # 安装完系统后重启
6. 客户机测试
需要注意事项:
a. 客户机下载软件包是存放在内存中,所以至少需要2G
b. 必须和PXE服务器处理同一个物理网络
c. PXE服务器所有服务端口必须是开放的。



7. 使用 system-config-kickstart 创建应答文件(扩展)
使用 system-config-kickstart 创建应答文件需要在 级别5 系统中才能运行,因为需要图形化
7.1. 安装system-config-kickstart
[root@localhost ~]# yum -y install system-config-kickstart
7.2. 启动,配置
可以在应用程序中找到,也可以调用命令
[root@localhost ~]# system-config-kickstart

配置完可以点击预览,最后保存

最后将自定义的ks.cfg 文件cp到指定的目录即可。
参考链接:https://www.cnblogs.com/panwenbin-logs/p/9340430.html
https://www.cnblogs.com/dinmin/articles/15348374.html
https://blog.csdn.net/G_D0120/article/details/135631769
相关文章:
使用 PXE+Kickstart 批量网络自动装机
前言: 正常安装系统的话使用u盘一个一个安装会非常慢,所以批量安装的技术就出来了。 一、 概念 PXE (Preboot eXecute Environment,预启动执行环境)是由 Intel 公司开发的技术,可以让计算机通过网络来启动…...
微信小程序交互增强:实现上拉加载、下拉刷新与一键返回顶部【代码示例】
微信小程序交互增强:实现上拉加载、下拉刷新与一键返回顶部【代码示例】 基础概念实现步骤与代码示例1. 下拉刷新2. 上拉加载更多3. 返回顶部 性能优化与安全考虑结语与讨论 在微信小程序的开发过程中,提供流畅的用户体验至关重要,其中上拉加…...
leetcode刷题指南
本文我将分享给大家一套我自己使用良久并觉得非常高效的 学习论,它可以运用到 Leetcode 上的刷题,也可以 generalize 到生活中涉及到学习以及记忆的方方面面。当然,本文将以 Leetcode 刷题为 case study 去进行讲解。 更具体一点, 我会教大家…...
hadoop学习---基于Hive的数据仓库相关函数机制及其优化方案
Hive相关函数(部分): if函数: 作用: 用于进行逻辑判断操作 语法: if(条件, true返回信息,false返回信息) 注意: if函数支持嵌套使用 select if(aa,’bbbb’,111) fromlxw_dual; bbbb select if(1<2,100,200) fromlxw_dual; 200nvl函数:…...
【MySQL数据库】丨高可用之MHA集群部署
一、准备工作 1.1 修改主机名 vim /etc/hosts# 添加对应主机 192.168.28.128 mha1 192.168.28.131 mha2 192.168.28.132 mha31.2 关闭防火墙及修改selinux # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭自启动# 修改selinux vim /etc/sy…...
uniapp的底部弹出层实现保姆式教程
实现照片: 此过程先进入uniapp官网,找到扩展组件 打开找到里面的uni-popup和uni-icons 点击进入,下载&安装 点击下载并导入HBuilderX 导入到你使用的目录,如test目录 同样将uni-icons点击下载并导入HBuilderX 点击合并 此时te…...
国外IP代理免费试用技巧
随着互联网的普及,人们越来越依赖于网络来获取信息、进行交流和娱乐。国外IP代理就成了利器之一。在本文中,我们将探讨如何免费使用国外IP代理。 一、了解国外IP代理的原理 国外IP代理,简单来说,就是通过连接到位于国外的代理服务…...
vue-cropper裁剪图片 vue
效果图 1.配置环境 npm install vue-cropper 2.代码 <template><div class"cropper-content"><div class"cropper-box"><div class"cropper"><vue-cropper ref"cropper" :img"option.img" :…...
算法-卡尔曼滤波之基本数学的概念
1.均值 定义:均值是一组数据中所有数值的总和除以数据的数量。均值是数据的中心趋势的一种度量,通常用符号 xˉ 表示。 :对于包含 n 个数据的数据集 {𝑥1,𝑥2,...,𝑥𝑛},均值 xˉ 计…...
NeoVim配置文件基本的
init.lua 文件 require(options) require(keymaps) require(plugins) require(colorscheme) require(lsp)-- 插件 require("config.lualine") require("config.nvim-tree") require("config.treesitter")~\lua\plugins.lua 文件 local lazypa…...
Qt学习笔记1.3.4 QtCore-Qt资源系统
文章目录 资源收集文件(.qrc)外部二进制资源内编译(compiled-in)资源压缩使用应用程序中的资源使用库中的资源 Qt资源系统是一种 独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一组特定的文件(图标、翻译文件等)&#x…...
同城组局同城活动找搭子小程序JAVA源码面芽组局的实现方案
功能概述 基于微信小程序开发的一款软件,支持用户动态发布、私信聊天关注、礼物充值打赏、发起活动组局、用户报名参与、支持商家入驻,对接广告功能等。 活动发布:用户可以在平台上发布各种类型的活动,如户外徒步、音乐会观赏、…...
Unable to locate the .NET SDK
问题描述: vs2019 加载项目时,提示如下: Unable to locate the .NET SDK as specified by global.json, please check that the specified version is installed. 项目中没有globan找al.json 文件 先使用: dotnet --list-sdks 命…...
C++STL初阶(1):string的使用及初阶原理
此文作为学习stl的笔记,许多普及、概念性的知识点将不再罗列(如stl的发展、背景等) 便于读者作为复习等方法了解。 0.STL简介(笔记向) STL不是祖师爷本贾尼实现的,是在惠普实验室中实现的。其作为一个数据结…...
Day41-Java基础之反射和动态代理
1. 反射 1.1 反射的概述: 专业的解释(了解一下): 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意属性和方法ÿ…...
Tomcat的实现
在一台电脑上启动tomcat,tomcat是server,即服务器。服务器只会被实例化一次,tomcat这只猫就是服务器。服务器下包含多个子节点服务,即service,顾名思义就是对外提供服务。服务器通常只有一个服务,默认是卡特…...
RK3576 Camera:资源介绍
RK3576是RK今年上市的中高端旗舰芯片,定位弱于RK3588。这篇文章主要分享一下RK3576这颗主控芯片的camera资源。 (1)RK3576 camera资源 ①RK3576 camera硬件框图 RK3576的camera硬件框图如图所示,拥有一路4lane的DCPHYÿ…...
Symfony DomCrawler库在反爬虫应对中的应用
在当今信息爆炸的时代,互联网上的数据量巨大,但这也带来了一些问题,比如恶意爬虫可能会对网站造成严重的影响,导致资源浪费和服务不稳定。为了解决这个问题,许多网站采取了反爬虫策略。Symfony DomCrawler库是一个强大…...
1Panel应用推荐:Uptime Kuma
1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…...
传输文件协议FTP与LFTP
目录 一.简介 二. FTP基础 主动模式(Active Mode): 被动模式(Passive Mode): 三. Vsftp 服务器简介 四. Vsftpd配置 1. 安装vsftpd(ftp服务端) 2.编辑配置文件 (…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
