26、Xen 故障排除与 xm 命令参考指南

Xen 故障排除与 xm 命令参考指南

1. 调试技巧

1.1 使用 pdb 调试

当你需要调试时,可以在代码中添加调试模块 pdb 。例如,打开 /usr/lib/python2.5/site-packages/xen/xend/XendAPI.py 文件,在文件顶部添加如下代码:

import pdb

然后在第 672 行附近添加断点:

pdb.set_trace()

重新运行服务器,当 xend 遇到新的断点时,就会启动调试器。此时,你可以进行常见的调试操作,如修改变量值、单步执行函数、进入子程序等。

1.2 处理域处于阻塞状态的问题

xm list 工具报告的“阻塞”状态通常意味着域处于空闲状态,但真正的问题可能是域无响应。例如,启动域时出现如下问题:

[root@localhost ~]# xm create -c sebastian.cfg
Using config file "/etc/xen/sebastian.cfg".
Going to boot Fedora Core (2.6.18-1.2798.fc6xen)
  kernel: /vmlinuz-2.6.18-1.2798.fc6xen
  initrd: /initrd-2.6.18-1.2798.fc6xen.img
Started domain sebastian
rtc: IRQ 8 is not free.
i8042.c: No controller found.

查看 /var/log/xen/xend-debug.log 文件,发现如下信息:

10/09/2007 20:11:48 Autoprobing TCP port 
10/09/2007 20:11:48 Autoprobing selected port 5900

端口 5900 是 VNC 端口,问题是 Xen 没有使用 xm console 连接的虚拟控制台设备,而是使用了帧缓冲作为控制台。启动 VNC 客户端并连接到 5900 端口,即可获得预期的图形控制台。

1.3 Xen 信息消息的层次结构

Xen 的信息消息分为以下几个层次:
- DEBUG :开发者用于输出他们感兴趣的信息,通常很有用,但会产生大量数据。
- INFO :对管理员来说有趣或有用的信息,但不表示存在问题。
- WARNING :表示存在问题,但不是关键问题。例如,依赖 VM.get_auto_power_on 函数可能会有问题,但不使用该函数不会有不良影响。
- ERROR :表示真正的、无法否认的错误,通常意味着域异常退出。

1.4 调试热插拔

Xen 广泛使用 udev 来创建和销毁虚拟设备,其与 Linux 热插拔子系统的交互信息通常记录在 /var/log/xen/xen-hotplug.log 文件中。
首先,使用 udevmonitor 查看 udev 事件,它应该显示每个 vif vbd 的添加事件以及 vif 的在线事件。这些事件会通过 /etc/udev/rules.d/xen-backend.rules 规则,执行 /etc/xen/scripts 中的相应脚本。
在感兴趣的设备脚本(如 blktap )顶部添加如下代码,以增加额外的日志记录:

set -x
exec 2>>/var/log/xen-hotplug.log

这将使 shell 展开脚本中的命令并将其写入 xen-hotplug.log 文件,帮助你追踪问题的根源并解决问题。

1.5 使用 strace 进行故障排除

strace 是一种重要的通用故障排除技术,可用于查看 Xen 控制工具的实际操作。例如,当 Xen 无法找到外部二进制文件(如 xen-vncfb )时,可以使用以下命令:

# strace -e trace=open -f xm create prospero 2>&1 | grep ENOENT | less

在设置 PyGRUB 时,使用 strace 发现缺少必要的目录:

# strace xm create -c prospero
(snipped)
mknod("/var/lib/xen/xenbl.4961", S_IFIFO|0600) = -1 ENOENT (No such file or directory)

创建该目录即可解决问题:

# mkdir -p /var/lib/xen/ 

1.6 解决 Python 路径问题

Python 有自己的内部搜索路径,用于查找模块。如果路径中不包含 Xen 模块,可能会出现如下错误:

# xm create -c sebastian.cfg
Using config file "/etc/xen/sebastian.cfg".
Traceback (most recent call last):
  File "/usr/bin/pygrub", line 26, in ?
    import grub.fsys
ImportError: No module named fsys

调整搜索路径的正确方法是在 Python 路径中已存在的目录下添加 .pth 文件,该文件应包含包含 Python 模块的目录路径。例如:

# echo "/usr/local/lib/python2.5/site-packages" >> /usr/lib/python2.5/local.pth

启动 Python 确认路径是否更新正确:

# python
>>>> import sys
>>>> print sys.path
['', '/usr/lib/python25.zip', 'usr/lib/python2.5' (etc)
'/usr/local/lib/python2.5/site-packages']

1.7 处理神秘锁定问题

如果 Xen 或 dom0 神秘挂起,可能是 dom0 发生内核崩溃,同时控制台日志记录不足。
- 使用串行控制台可以获得更详细的信息,若未看到崩溃消息,可以尝试在控制台连续按下三次 CTRL - A 切换输入到 Xen 管理程序。
- 若没有串行控制台,尽量将 VGA 控制台保持在 tty1 ,有时可以使用数码相机保存内核崩溃的输出。
- 若机器在看到崩溃消息前重启,且无法使用串行控制台,可以在 domU menu.lst 文件中指定 Linux 内核的模块行添加 panic = 0 参数,但这会导致计算机挂起而非重启,适合测试环境。

1.8 内核参数:安全模式

当管理程序串行控制台也无法工作时,可以尝试以下内核参数:
- ignorebiostables :在某些 Intel 芯片组的 I/O 压力下,该参数可能有助于避免挂起。
- acpi = off nousb :有报告称这些参数可以提高某些硬件的稳定性。
- 禁用 BIOS 中的超线程功能,某些 Xen 版本可能存在相关问题。
/boot/grub/menu.lst 文件中添加这些参数后的示例如下:

root hd0(0)
kernel /boot/xen-3.0.gz
module /boot/vmlinuz-2.6-xen ignorebiostables acpi=off noapic nousb

1.9 获取帮助

  • 邮件咨询 :可以直接发送与 Xen 相关的问题邮件,但不保证能够得到帮助。
  • 邮件列表 :有多个关于 Xen 的流行邮件列表,如 Xen - users Xen - devel Xen - users 更适合初学者提问。
  • Xen 维基 :Xen 有一个广泛的维基,虽然部分内容可能过时,但仍是一个有价值的起点。
  • Xen IRC 频道 :在 irc.oftc.net 上有一个受欢迎的 #xen 频道,可以随时加入交流。
  • Bugzilla :Xen 维护了一个公开的 Bug 数据库,可通过关键字搜索问题。
  • 发行版供应商 :不要忘记参考发行版供应商的特定文档和支持资源。
  • xen - bugtool :当其他方法都失败时,可以使用 xen - bugtool 收集相关故障排除信息,将其保存为 .tar.bz2 文件后,可上传到网络并发送消息到 Xen - devel 邮件列表。

1.10 xm 命令概述

xm 命令是与 Xen 控制平面功能交互的主要接口,通过向 xend 发送指令来实现各种功能。 xm 命令的一般语法如下:

xm <subcommand> <domain specifier> [options]

选项可以放在域指定符之前或之后,通常建议放在最后。例如,关闭域 10 的命令如下:

xm shutdown 10

xm 命令通常是异步的,可能在实际完成之前返回。例如, xm shutdown 命令可能需要几分钟才能真正关闭域,通常需要使用 xm list 命令确认域是否已停止运行。

1.11 xm 子命令列表

子命令 说明
addlabel, cfgbootpolicy, dumppolicy, getlabel, labels, loadpolicy, makepolicy, resources, rmlabel 与 Xen 的安全策略基础设施交互
block - attach, block - configure, block - detach, block - list 管理附加到域的存储设备
console 连接到指定域的控制台
create 创建并启动域,需要指定配置文件
debug - keys * 与 Xen 内置的 GDB 存根交互(Xen 3.1 及以后版本)
delete * 从 Xen 管理中移除域(Xen 3.1 及以后版本)
destroy 强制终止域,立即释放资源
dmesg 打印内核启动的诊断消息
domid, domname 根据域名查找域 ID 或根据域 ID 查找域名
dry - run 测试是否能成功找到并使用虚拟设备,也可用于调试域配置中的 Python 代码
dump - core 触发立即内存转储
info 打印 Xen 主机的有用信息
list 列出域信息,可显示域的状态
log 打印 /var/log/xend.log 文件内容
mem - max 指定域可使用的最大内存
mem - set 调整域的内存分配
migrate 迁移域
network - attach, network - detach, network - list 管理虚拟网络设备
new * 将域添加到 Xen 管理,但不分配资源或运行(Xen 3.1 及以后版本)
pause 暂停域
reboot 命令域干净地重启
rename 更改域的可读名称
restore, save 保存和恢复域的状态,类似于休眠
resume * 使域从暂停状态恢复(Xen 3.1 及以后版本)
sched - credit 配置信用调度器
sched - sedf 调整过时的 SEDF 调度器的参数
shell * 启动交互式 shell(Xen 3.1 及以后版本)
shutdown 命令域关闭
start * 启动已管理的域(Xen 3.1 及以后版本)
suspend * 暂停已管理的域(Xen 3.1 及以后版本)
sysrq 向域发送魔法系统请求键
top 以类似于 top 命令的格式显示运行中的 Xen 域的状态信息
trigger * 向域发送 CPU 事件(Xen 3.1 及以后版本)
unpause 恢复已暂停的域
uptime 打印域的运行时间
vcpu - list, vcpu - pin, vcpu - set 控制 SMP 系统中域使用的 CPU
vnet - create, vnet - delete, vnet - list 与 Xen 的 VLAN 支持交互
vtpm - list 列出附加到域的虚拟 TPM

流程图:Xen 故障排除流程

graph TD;
    A[遇到问题] --> B{问题类型};
    B -->|域阻塞| C[查看日志,如 /var/log/xen/xend-debug.log];
    C --> D{是否找到原因};
    D -->|是| E[解决问题];
    D -->|否| F[进一步调试,如使用 strace];
    B -->|热插拔问题| G[使用 udevmonitor 查看事件];
    G --> H[添加额外日志记录];
    H --> I[追踪问题根源并解决];
    B -->|Python 路径问题| J[检查 Python 搜索路径];
    J --> K[添加 .pth 文件];
    K --> L[确认路径更新];
    B -->|神秘锁定| M{是否有串行控制台};
    M -->|是| N[查看串行控制台消息];
    M -->|否| O[保持 VGA 控制台在 tty1];
    N --> P{是否看到崩溃消息};
    P -->|否| Q[按三次 CTRL - A 切换输入];
    O --> R[可使用数码相机保存输出];
    B -->|其他| S[尝试内核参数];
    S --> T{是否解决问题};
    T -->|是| E;
    T -->|否| U[使用 xen - bugtool 收集信息];
    U --> V[上传信息到网络并咨询邮件列表];

以上就是 Xen 故障排除和 xm 命令的相关内容,希望能帮助你更好地使用和管理 Xen 环境。在遇到问题时,按照上述步骤逐步排查,通常可以找到解决方法。如果仍然无法解决,可以通过各种渠道获取更多帮助。

2. xm 子命令详细解析

2.1 安全策略相关子命令

addlabel cfgbootpolicy dumppolicy getlabel labels loadpolicy makepolicy resources rmlabel 这些子命令用于与 Xen 的安全策略基础设施交互。不过目前在实际应用中,尚未发现这些安全策略有太多实用价值。若你对安全模块感兴趣,可查看 Xen 源代码分发中包含的示例策略。

2.2 存储设备管理子命令

  • block - attach :将存储设备附加到指定的域。具体操作时,需明确设备的相关信息和要附加到的目标域。
  • block - configure :对已附加到域的存储设备进行配置,可调整设备的参数等。
  • block - detach :从指定域中分离存储设备。
  • block - list :列出附加到指定域的所有存储设备,方便查看设备状态和信息。

2.3 控制台子命令

console 子命令用于连接到指定域的控制台。但要注意,只有当域配置为使用 Xen 的虚拟控制台时,该命令才有效。即使配置正确,有时可能需要按下 ENTER 键才能获得登录提示。对于新用户来说,输入 xm console 后看到空白屏幕可能会感到困惑,这是因为自上次使用后,控制台缓冲区没有新内容。

2.4 创建域子命令

create 子命令在近期版本的 Xen 中,相当于 xm new 后再执行 xm start ,是创建并启动域的常用命令。该命令期望输入一个配置文件的名称,若未指定文件,则默认使用 /etc/xen/xmdefconfig create 子命令支持以下选项:
- -h :打印帮助信息。
- -q :安静模式,减少输出信息。
- --path :指定域配置文件的基础路径,默认为 /etc/xen
- -n :预运行模式,打印将生成的配置,用于调试域配置中的 Python 代码。
- -x :类似于 -n ,但以 XML 格式输出域定义。不过截至 Xen 3.3,此选项仍依赖已弃用的 xml.dom.ext 模块,在许多 Python 安装中可能无法正常工作。
- -c :自动连接到控制台,这对于与 PyGRUB 交互是必需的。
- -s :跳过 XML 域配置的 DTD 检查。

若未为 xm create 提供完整路径,它将默认在 /etc/xen 中查找配置文件,可使用 --path 选项更改查找路径。

2.5 调试相关子命令

  • debug - keys *(Xen 3.1 及以后版本) :该子命令用于与 Xen 内置的 GDB 存根交互,允许发送魔法按键来控制存根的输出。但只有在编译 Xen 时启用了 GDB 存根,此命令才会生效,通常仅在开发 Xen 内部代码时有用。
  • dry - run :理论上,此子命令用于测试 Xen 是否能成功找到并使用其虚拟设备,但实际效果并不理想,在预测启动域是否成功方面表现不佳。不过,它在调试域配置中的 Python 代码时很有用,同时也是 xm create 的一个子选项,可使 xm create 以预运行模式创建域。

2.6 域管理子命令

  • delete *(Xen 3.1 及以后版本) :从 Xen 的管理中移除指定的域。若域正在运行,该命令会先关闭域,然后移除其定义。
  • destroy :此命令相当于直接拔掉物理机器的电源插头,会强制终止指定的域,并立即将所有资源返回给管理程序。当 domU 完全锁定时,可能需要使用该命令来终止它。
  • domid 和 domname domid 命令根据域名查找对应的域 ID, domname 命令则根据域 ID 查找对应的域名。当管理大量域时,这两个命令非常实用。

2.7 系统信息子命令

  • dmesg :与系统的 dmesg 命令类似,用于打印内核启动时的诊断消息,有助于排查系统启动过程中出现的问题。
  • info :打印关于 Xen 主机的大量有用信息,包括所使用的 Xen 精确版本、处理器的功能以及可供 domU 使用的内存等。
  • log :简单地打印 /var/log/xend.log 文件的内容,方便查看 Xen 控制守护进程的日志信息。

2.8 域列表子命令

list 子命令以表格形式列出域的信息。其最简形式仅列出域,但也可通过提供 --long 选项打印出关于域的详细信息,包括完整的 s - 表达式。短形式的 list 命令还会显示每个域的状态:
- 'b'(blocked) :表示域正在等待某些操作,可能是 I/O 操作或调度原因。空闲的域通常会显示为阻塞状态,这是正常现象,当有任务时会自动解除阻塞。
- 'p'(paused) :表示域已被 xm pause 命令暂停。
- 'c'(crashed) :表示域已崩溃。
- 'd'(dying) :表示域正在关闭并处于被管理程序销毁的过程中。若域长时间处于此状态,可能存在 bug。
- 's'(shutdown) :表示域正在关闭,可能是由于内部命令(如 halt )或 dom0 发出的命令(如 xm shutdown )。使用 xm new 导入的域定义在使用 xm start 启动之前,也会显示为关闭状态。
- 'r'(running) :表示域当前正在物理计算机上执行。在单处理器机器上, xm list 通常会显示 dom0 是唯一运行的域,因为 dom0 负责生成和显示 xm list 的输出。

2.9 内存管理子命令

  • mem - max :指定域可使用的最大内存量(以兆字节为单位),此设置与域配置文件中的 maxmem 指令相同。目前,该命令对正在运行的域无效,更改将在域重启后生效。
  • mem - set :通过向目标 domU 中的气球驱动程序发送消息来调整域的内存分配。但这种调整需要 domU 操作系统的配合,因此不能保证一定成功。而且,如果分配的内存过多或过少,可能会导致域不稳定,所以一般不建议频繁使用此命令。

2.10 迁移相关子命令

migrate 子命令用于迁移域。迁移过程较为复杂,涉及到资源的重新分配和状态的保存与恢复。在迁移过程中,需要确保目标主机具备足够的资源和合适的环境。

2.11 网络设备管理子命令

  • network - attach :将虚拟网络设备(如 vif )附加到指定的域。
  • network - detach :从指定域中分离虚拟网络设备。
  • network - list :列出附加到指定域的所有虚拟网络设备,方便查看网络设备的状态和配置。

2.12 生命周期管理子命令

  • new *(Xen 3.1 及以后版本) :将一个域添加到 Xen 的管理中,但并不实际分配资源或运行该域。通常需要配合 -f 选项指定一个描述域的文件,该文件可以是 XML 格式或标准的 Python 配置格式。添加后,可使用 xm start 命令启动该域。
  • start *(Xen 3.1 及以后版本) :启动已添加到 Xen 管理中的域。
  • pause :暂停指定的域。暂停期间,域继续占用内存并锁定其设备,但不会在 CPU 上调度运行。
  • reboot :命令指定的域进行干净的重启。但如果使用 PyGRUB, xm reboot 不会加载新的内核,需要先关闭域,然后重新创建才能加载新内核,这与在 domU 内部使用 shutdown -r 命令类似。
  • rename :允许管理员更改与域 ID 关联的可读名称。
  • restore 和 save :这两个子命令相互配合,实现域的状态保存和恢复功能,类似于计算机的休眠功能。 xm save 命令使域释放其资源并将状态保存到指定的文件中, xm restore 命令则从之前创建的保存文件中恢复域的状态。
  • resume *(Xen 3.1 及以后版本) :指示处于暂停状态的域恢复运行。此命令仅适用于由 xend 生命周期支持管理的域,即 xend 具备管理非活动域的能力。
  • suspend *(Xen 3.1 及以后版本) :暂停已管理的域,使其进入暂停状态。

2.13 调度器相关子命令

  • sched - credit :信用调度器是 Xen 的默认调度器, sched - credit 子命令用于配置信用调度器,允许显示或调整域的权重和上限。通过合理调整这些参数,可以优化域的资源分配和调度。
  • sched - sedf :虽然 sedf 调度器已过时,但如果仍在使用该调度器,可以使用 sched - sedf 子命令调整域的调度参数。

2.14 其他子命令

  • shell *(Xen 3.1 及以后版本) :启动一个交互式 shell,称为 “The Xen Master”,在该 shell 中可以直接执行各种 xm 子命令,提供了一种更便捷的操作方式。
  • shutdown :命令指定的域进行关闭操作,但不会立即重启。该命令需要 domU 的配合,如果域未能正常关闭, xend 不会强制终止它。若 xm shutdown 命令失败,可以尝试使用 xm destroy 命令。
  • sysrq :向 domU 发送魔法系统请求键。由于 dom0 不会将系统请求键传递给 domU ,因此无法通过 xm console 发送系统请求键。当域看起来无响应时,该命令是一个有用的最后手段。具体的系统请求键功能可以参考 Linux 内核源代码树中的 Documentation/sysrq.txt 文件。
  • top :以类似于系统 top 命令的格式显示正在运行的 Xen 域的状态信息,包括 CPU 使用率、内存使用率等,方便实时监控域的运行状态。
  • trigger *(Xen 3.1 及以后版本) :向指定的域发送 CPU 事件,可触发不可屏蔽中断(NMI)、复位或初始化事件。不过,在 Xen 3.2/i386 中,复位和初始化事件可能会返回 “函数未实现” 的错误消息。该命令主要用于调试目的。
  • unpause :恢复已被 xm pause 命令暂停的域,使其继续在 CPU 上调度运行。
  • uptime :打印指定域的运行时间。若未指定域,则打印所有 VM 的运行时间。
  • vcpu - list, vcpu - pin, vcpu - set :这些子命令用于控制 SMP 系统中域使用的 CPU。 vcpu - list 列出域使用的 vcpu 信息, vcpu - pin 可以将域的 vcpu 固定到特定的物理 CPU 上, vcpu - set 可以调整域使用的 vcpu 数量。
  • vnet - create, vnet - delete, vnet - list :与 Xen 的 VLAN 支持交互。不过目前尚未有实际使用这些功能的案例,若你在使用过程中有相关经验,欢迎分享。
  • vtpm - list :列出附加到指定域的虚拟 TPM(可信平台模块)。虽然在文档中对 TPM 的介绍不多,但在某些安全相关的场景中可能会用到。

3. 总结

Xen 是一个功能强大但复杂的虚拟化管理系统,在使用过程中难免会遇到各种问题。通过掌握 xm 命令的各个子命令以及相应的故障排除方法,可以更高效地管理和维护 Xen 环境。

在遇到问题时,首先要根据问题的表现和类型,按照故障排除流程逐步排查。例如,若域出现阻塞状态,可先查看相关日志文件,确定问题根源;若遇到 Python 路径问题,可通过添加 .pth 文件来解决。同时,合理利用各种工具和资源,如 strace xen - bugtool 等,以及各种获取帮助的渠道,如邮件列表、维基和 IRC 频道等,能够更好地解决问题。

此外,对于 xm 子命令的使用,要根据具体需求选择合适的命令,并注意不同命令的适用条件和限制。例如,一些新的子命令可能仅适用于特定版本的 Xen,在使用时需要确认版本兼容性。

希望本文能够帮助你更好地理解和使用 Xen 虚拟化系统,在实际操作中更加得心应手。若你在使用过程中还有其他疑问或经验,欢迎交流分享。

流程图:xm 子命令使用流程

graph TD;
    A[选择操作类型] --> B{管理类型};
    B -->|安全策略| C[使用 addlabel 等子命令];
    B -->|存储设备| D[使用 block - attach 等子命令];
    B -->|控制台| E[使用 console 子命令];
    B -->|创建域| F[使用 create 子命令];
    B -->|调试| G[使用 debug - keys 或 dry - run 子命令];
    B -->|域管理| H[使用 delete 等子命令];
    B -->|系统信息| I[使用 dmesg 等子命令];
    B -->|域列表| J[使用 list 子命令];
    B -->|内存管理| K[使用 mem - max 等子命令];
    B -->|迁移| L[使用 migrate 子命令];
    B -->|网络设备| M[使用 network - attach 等子命令];
    B -->|生命周期管理| N[使用 new 等子命令];
    B -->|调度器| O[使用 sched - credit 等子命令];
    B -->|其他| P[使用 sysrq 等子命令];
    C --> Q[执行具体操作];
    D --> Q;
    E --> Q;
    F --> Q;
    G --> Q;
    H --> Q;
    I --> Q;
    J --> Q;
    K --> Q;
    L --> Q;
    M --> Q;
    N --> Q;
    O --> Q;
    P --> Q;
    Q --> R[检查操作结果];
    R -->|成功| S[完成操作];
    R -->|失败| T[进行故障排除];
    T --> A;

通过以上的总结和流程图,希望能为你在使用 Xen 和 xm 命令时提供清晰的指导,帮助你更好地应对各种情况。

【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)内容概要:本文介绍了基于蒙特卡洛和拉格朗日方法的电动汽车充电站有序充电调度优化方案,重点在于采用分散式优化策略应对分时电价机制下的充电需求管理。通过构建数学模型,结合不确定性因素如用户充电行为和电网负荷波动,利用蒙特卡洛模拟生成大量场景,并运用拉格朗日松弛法对复杂问题进行分解求解,从而实现全局最优或近似最优的充电调度计划。该方法有效降低了电网峰值负荷压力,提升了充电站运营效率经济效益,同时兼顾用户充电便利性。 适合人群:具备一定电力系统、优化算法和Matlab编程基础的高校研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。 使用场景及目标:①应用于电动汽车充电站的日常运营管理,优化充电负荷分布;②服务于城市智能交通系统规划,提升电网交通系统的协同水平;③作为学术研究案例,用于验证分散式优化算法在复杂能源系统中的有效性。 阅读建议:建议读者结合Matlab代码实现部分,深入理解蒙特卡洛模拟拉格朗日松弛法的具体实施步骤,重点关注场景生成、约束处理迭代收敛过程,以便在实际项目中灵活应用改进。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值