GPTSoVITS部署中安装pyopenjta依赖发生报错 raise CalledProcessError(self.returncode, self.args, self.

报错具体如下:

Looking in indexes: https://pypi.doubanio.com/simple/
Collecting pyopenjtalk
  Using cached https://pypi.doubanio.com/packages/b4/80/a2505a37937fcd108b7c1ab66f7d1d48560525b1da71993860d11095a286/pyopenjtalk-0.3.0.tar.gz (1.5 MB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... error
  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─> [25 lines of output]
      setup.py:26: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
        _CYTHON_INSTALLED = ver >= LooseVersion(min_cython_ver)
      Traceback (most recent call last):
        File "/root/anaconda3/envs/vits/bin/cmake", line 5, in <module>
          from cmake import cmake
      ModuleNotFoundError: No module named 'cmake'
      Traceback (most recent call last):
        File "/root/anaconda3/envs/vits/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
          main()
        File "/root/anaconda3/envs/vits/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
        File "/root/anaconda3/envs/vits/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 118, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-52_vy20r/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 162, in get_requires_for_build_wheel
          return self._get_build_requires(
        File "/tmp/pip-build-env-52_vy20r/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 143, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-52_vy20r/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 267, in run_setup
          super(_BuildMetaLegacyBackend,
        
<think>我们正在分析的是VerifiedBootVersion2VerityImageBuilder类的Build方法。该方法的主要功能是向镜像文件添加dm-verity哈希树和AVB元数据。根据引用[1],avbtool是用于处理AVB操作的工具,而引用[2]中展示了在Makefile中如何调用add_hashtree_footer。 Build方法的代码逻辑如下: 1. 确定要使用的avbtool命令: - 根据构造时指定的footer_type(AVB_HASH_FOOTER或AVB_HASHTREE_FOOTER)来决定使用add_hash_footer还是add_hashtree_footer命令。 2. 构建基本命令: - 命令以avbtool开头,后跟add_hash_footer或add_hashtree_footer。 - 添加必要的参数:分区大小(--partition_size)、分区名称(--partition_name)和要处理的镜像文件(--image)。 3. 添加签名相关参数(如果提供了密钥和算法): - 如果构造时指定了key_path和algorithm,则添加--key和--algorithm参数。 4. 添加盐值(如果提供了): - 如果构造时指定了salt,则添加--salt参数。 5. 添加额外的签名参数(signing_args): - 这些参数在构造对象时传入,通常来自构建系统的配置(如Makefile中的BOARD_AVB_*_ADD_HASHTREE_FOOTER_ARGS)。 6. 执行命令: - 使用common.Run运行命令,并获取输出。 - 检查命令的返回码,如果非零则抛出异常。 下面我们来看具体的代码: ```python def Build(self, out_file): """Adds dm-verity hashtree and AVB metadata to an image. Args: out_file: Path to image to modify. """ # 1. 确定命令:根据footer_type选择添加哈希页脚还是哈希树页脚 add_footer = ("add_hash_footer" if self.footer_type == self.AVB_HASH_FOOTER else "add_hashtree_footer") # 2. 构建基本命令 cmd = [self.avbtool, add_footer, "--partition_size", str(self.partition_size), "--partition_name", self.partition_name, "--image", out_file] # 3. 添加签名相关参数(如果密钥和算法存在) if self.key_path and self.algorithm: cmd.extend(["--key", self.key_path, "--algorithm", self.algorithm]) # 4. 添加盐值(如果提供了) if self.salt: cmd.extend(["--salt", self.salt]) # 5. 添加额外的签名参数 cmd.extend(shlex.split(self.signing_args)) # 6. 执行命令 proc = common.Run(cmd) output, _ = proc.communicate() if proc.returncode != 0: raise BuildVerityImageError("Failed to add AVB footer: {}".format(output)) ``` ### 功能说明 该方法通过调用avbtool工具,向镜像文件(out_file)添加一个哈希树页脚(或哈希页脚)以及AVB元数据。添加页脚后,镜像文件将包含以下部分: - 原始镜像数据 - dm-verity哈希树(对于哈希树页脚) - AVB元数据(包括描述符、签名等) ### 参数解析 - `partition_size`:整个分区的大小(包括元数据),由构建系统提供。 - `partition_name`:分区的名称,如"system"、"vendor"等。 - `key_path`和`algorithm`:用于签名的密钥和算法(如SHA256_RSA4096)。 - `salt`:一个十六进制字符串,用于增强哈希树的安全性。如果不提供,avbtool会生成一个随机的盐值。 - `signing_args`:其他传递给avbtool的参数,比如`--prop`、`--prop_from_file`等。 ### 执行流程 1. 构造完整的命令行参数列表。 2. 调用avbtool,该工具会: a. 计算镜像的哈希树(对于hashtree_footer)。 b. 生成AVB描述符。 c. 将描述符和哈希树附加到镜像的末尾(或预留的位置)并更新分区大小。 d. 如果提供了密钥,则对元数据进行签名。 3. 检查命令执行结果,如果失败则抛出异常。 ### 数学原理 在添加哈希树页脚时,avbtool会为镜像数据构建一个Merkle树(哈希树)。假设镜像数据被划分为$n$个数据块,每个块的大小为4KiB(默认)。那么哈希树的计算过程如下: - 叶子节点:对每个数据块计算哈希值(使用盐值): $$ \text{leaf}_i = H(\text{salt} \parallel \text{block}_i) $$ - 内部节点:由子节点的哈希值连接后再计算哈希得到: $$ \text{parent} = H(\text{salt} \parallel \text{child}_1 \parallel \text{child}_2 \parallel \dots \parallel \text{child}_{m}) $$ 其中,$m$通常为2(二叉树)或更多(avbtool默认使用$m=2$,但实际参数可能根据配置变化)。 最终,根哈希(root hash)将被包含在AVB描述符中,并用于设备启动时的验证。 ### 安全性 - 盐值(salt)的引入可以防止彩虹表攻击,确保相同的原始数据块在不同设备上产生不同的哈希值[^1]。 - 使用数字签名可以确保元数据的完整性和来源可信。 ### 相关问题 1. 在AVB 2.0中,哈希树页脚和哈希页脚有什么区别? 2. 如何选择AVB签名算法? 3. 盐值在构建哈希树时的作用是什么?[^1] 4. 如果分区大小发生变化,AVB元数据会如何调整? 5. 在构建过程中出现签名失败的原因可能有哪些? </think>### VerifiedBootVersion2VerityImageBuilder.Build() 方法解析 #### 功能概述 此方法通过调用 `avbtool` 向磁盘镜像添加 **dm-verity 哈希树**和 **AVB (Android Verified Boot) 元数据**,实现分区数据的完整性验证和安全启动支持[^1][^2]。核心功能包括: 1. 构造哈希树页脚(hashtree footer) 2. 生成分区元数据描述符 3. 添加数字签名(可选) 4. 更新镜像文件结构 #### 代码逻辑详解 ```python def Build(self, out_file): # 1. 确定页脚类型:哈希树页脚 vs 哈希页脚 add_footer = ("add_hash_footer" if self.footer_type == self.AVB_HASH_FOOTER else "add_hashtree_footer") # 📌 # 2. 构造基础命令参数 cmd = [self.avbtool, add_footer, "--partition_size", str(self.partition_size), # 分区总大小 "--partition_name", self.partition_name, # 分区名(如 system/vendor) "--image", out_file] # 目标镜像文件 # 3. 添加密钥签名参数(若提供) if self.key_path and self.algorithm: cmd.extend(["--key", self.key_path, # 签名私钥路径 "--algorithm", self.algorithm]) # 加密算法(如 SHA256_RSA4096) # 4. 添加盐值参数(若提供) if self.salt: cmd.extend(["--salt", self.salt]) # 🧂 抗彩虹表攻击 # 5. 追加构建系统预设参数 cmd.extend(shlex.split(self.signing_args)) # 📋 # 6. 执行avbtool命令 proc = common.Run(cmd) output, _ = proc.communicate() # 7. 错误处理 if proc.returncode != 0: raise BuildVerityImageError("Failed to add AVB footer: {}".format(output)) ``` #### 关键技术点 1. **哈希树构建原理**(`add_hashtree_footer`) - 数据块划分:镜像按 4KB 块分割:$ \text{block}_i, i \in [0, N-1] $ - 叶子节点计算: $$ H_{\text{leaf}_i} = \text{SHA256}(\text{salt} \parallel \text{block}_i) $$ - 父节点递归: $$ H_{\text{parent}} = \text{SHA256}\left( \bigparallel_{k=0}^{127} H_{\text{child}_k} \right) $$ - 最终生成 Merkle 树结构存储于镜像尾部[^1] 2. **元数据结构** ```mermaid graph LR A[镜像数据] --> B[哈希树] B --> C[AVB描述符] C --> D[签名数据] D --> E[页脚元数据] ``` 页脚包含:分区名、哈希算法、盐值、根哈希、签名信息 3. **盐值安全作用** - 防御场景:阻止针对相同数据块的彩虹表攻击 - 数学保证: $$ \text{Security} \propto \frac{1}{|\text{SaltSpace}|} $$ 默认使用全局盐值 `FIXED_SALT`,但支持自定义[^1] #### 执行流程 1. 输入:原始系统镜像(如 `system.img`) 2. 输出:包含验证结构的签名镜像 3. 空间占用: $$ \text{总大小} = \text{数据区} + \left\lceil \frac{N}{128} \right\rceil \times \text{block\_size} + \text{metadata} $$ 其中: - $N$ = 数据块数量 - $\text{metadata}$ ≤ 64KB (MAX_VBMETA_SIZE) #### 典型应用场景 在 Android 构建系统中触发: ```makefile $(AVBTOOL) add_hashtree_footer \ --image $(1) \ --key $(KEY_PATH) \ --algorithm SHA256_RSA4096 \ --partition_size $(SIZE) ``` 对应 `BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS` 参数[^2] ### 相关问题 1. 盐值如何增强哈希树的安全性?[^1] 2. AVB 1.0 和 2.0 的验证机制有何本质区别? 3. 如何计算哈希树的空间开销? 4. 启动时如何验证哈希树的完整性?[^2] 5. 为什么需要在构建阶段预留分区空间?[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光芒再现dev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值