在 Debian 上安装和配置 Xen

SUN 每隔一段时间都会有一些服务器捐给大学、实验室、研究机构等。我们项目组就刚 “骗” 了几台免费的 Sun Fire 服务器,当然也和我们是 SUN(也许现在应该叫 Oracle)的长期客户有关,我们的服务器基本都是 SUN 的。现在只要新机器一进来就先虚拟化,虚拟化后才能上机柜,技术变化太快了,记得几年前我们买机器一上来首先装的是操作系统,现在 hypervisor 代替了操作系统。

首先最小化安装64位的 Debian,下面的安装步骤和配置过程基于 Debian 5.04 版本,CentOS 版本可以参看:在 CentOS 上安装和配置 Xen,Ubuntu 版本可以参看:在 Ubuntu 上安装和配置 Xen,OpenSolaris 版本参看:在 OpenSolaris 上安装和配置 Xen,NetBSD 版本参看:在 NetBSD 上安装和配置 Xen.

安装 Xen

检查一下 source list:

# vi /etc/apt/sources.list

deb http://http.us.debian.org/debian stable main contrib non-free
#deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free
deb http://security.debian.org stable/updates main contrib non-free

安装 Xen 及相关工具:

# apt-get install xen-hypervisor-3.2-1-amd64 \
xen-linux-system-2.6.26-2-xen-amd64 xen-utils-3.2-1 \
xenstore-utils xenwatch xen-shell xen-tools

我们需要很多 loop devices 来挂载基于文件的虚拟机,所以需要把 loop device 的数目限制设成最大

# vi /etc/modules

loop max_loop=64

安装完 Xen 后,Debian 上的 Xen 的默认网络配置用的是 network-dummy,和 CentOS 上有点不一样,我们需要修改成 bridge 以便每个虚拟机都像一个独立机器一样运行在网络上:

# vi /etc/xen/xend-config.sxp

#(network-script network-dummy)
(network-script network-bridge)

安装成功后,检查 Xen 内核是否已经装好,并给内核加上 dom0_mem=256M 限制 Xen Dom0 的内存,防止 dom0 把内存耗光:

# vi /boot/grub/menu.lst

...
title           Xen 3.2-1-amd64 / Debian GNU/Linux, kernel 2.6.26-2-xen-amd64
root            (hd0,0)
kernel          /xen-3.2-1-amd64.gz dom0_mem=256M
module          /vmlinuz-2.6.26-2-xen-amd64 root=/dev/mapper/vpsee-root ro console=tty0
module          /initrd.img-2.6.26-2-xen-amd64
...

重启系统后检查一下是否是 Xen 的内核以及 Xen 是否启动:

# reboot

# uname -r
2.6.26-2-xen-amd64

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   256     2     r-----      9.3

创建和安装 guest

如果把正在运行的 Xen 内核的操作系统看成 host 的话,那么运行在 host 上面的操作系统就可以看成 guest。先建一个目录用来存放所有的 guest 操作系统的 image,vm01.img,vm02.img 等,1个 guest 对应1个 image。

# mkdir /vm

# xen-create-image --hostname=vm01 --size=10Gb --swap=512Mb --ide \
--ip=172.16.39.121 --netmask=255.255.254.0 --gateway=172.16.38.1 --force \
--dir=/vm --memory=512Mb --arch=i386 \
--kernel=/boot/vmlinuz-2.6.26-2-xen-amd64 \
--debootstrap --dist=etch --mirror=http://ftp2.de.debian.org/debian/ --password

可以根据需要调整 /etc/xen-tools/xen-tools.conf

进入 guest

安装成功后需要增加给对应的虚拟机器增加一个 Xen 配置文件以便 Xen 能启动这个虚拟机:

# vi /etc/xen/vm01

kernel      = '/boot/vmlinuz-2.6.26-2-xen-amd64'
ramdisk     = '/boot/initrd.img-2.6.26-2-xen-amd64'
memory      = '512'
root        = '/dev/xvda2 ro'
disk        = [
                  'file:/vm/domains/vm01/swap.img,xvda1,w',
                  'file:/vm/domains/vm01/disk.img,xvda2,w',
              ]
name        = 'vm01'
vif         = [ 'ip=172.16.39.121,mac=00:16:3E:C0:21:DE' ]
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

启动刚安装的 Debian 虚拟机后就可以登录了,

# xm create vm01
# xm console vm01

如果要退出 guest 的话,用 Ctrl + ],就会回到 host。

如果想每次启动 host 时自动启动 guest 的话:

# ln -s /etc/xen/vm01 /etc/xen/auto

更懒的办法

如果觉得安装 guest 操作系统太麻烦,可以到 http://stacklet.com/ 下载一个已经装好的镜像文件,调整 Xen guest 的配置文件,然后在 host 下启动 guest 镜像就可以了,这里这里有更详细的介绍。

增加 swap

如何给 guest 系统(domU)增加 swap,这里有介绍。

评论 (51 Comments)

  1. 32位的很难装吗?

  2. 那你是属于大学、实验室、研究机构的哪一个呢?

  3. 一样的,没什么区别。

  4. 请教:更懒的办法中,已经安装好的镜像是什么格式的文件,我能否自己建立一个服务器,专门存储一些安装好的镜像模板文件,数据中心大规模部署的时候就不需要再重新安装了。

  5. 磁盘镜像文件。对,不需要重装,到时候只需要拷贝镜像文件就可以了。

  6. 请问下vpsee大哥,你们单位的Xen是否有较大规模的部署?如果针对数据中心较大规模的Xen平台,虚拟机备份恢复这块是如何考虑的呢?

  7. 我们所有 Xen 镜像都存储在专门的存储服务器上,而且这些镜像每天都会备份到备份服务器。
    多台 xen 应用服务器 - 多台 xen 镜像存储服务器 - 2台 xen 备份服务器

  8. 镜像备份是全备还是增量备份呢,为什么不用共享存储(NAS,SAN)连接多台Xen服务器,然后再备份存储里的镜像呢,请教一下。

  9. 我们用的正是 Sun StorageTek NAS 存储服务器连到 Xen 应用服务器上的。目前是全备份,虚拟机的镜像是一个磁盘文件(大小不变),所以增量备份不好做(因为没有增量)。我们正在考虑其他的备份方案,比如把虚拟机磁盘文件打散后再增量备份。不过就我们目前的应用来说全备份已经能满足需要。

  10. 谢谢vpsee讲解,又长了不少知识。现有如下问题想请教:
    1.不知你们在备份虚拟机镜像是采用什么方法进行备份的,是否只能停止虚拟机运行后再进行虚拟机克隆呢?那如果这样的话比较重要的生产系统必须7×24小时运转的话该如何处理,如果可采用不停机备份,请问下有何解决方案解决?
    2.据您的描述,你们IDC应该有大量的采用Xen技术的虚拟平台服务器,管理如此众多的虚拟机请问是采用何种方式?有没有像VMware vCenter Server类似的工具和解决方案呢,我这几天在搜索一下convirt(Xenman)的资料,据官网描述,该工具几乎可以做到和VMware想同的功能,如在线迁移,资源池,等高可用功能,请问您已经采用了该工具吗?
    再次谢谢您。

  11. 1、用 LVM snapshot 备份。可以用 save/restore/migrate 等做在线备份,这样在线备份的问题是必须是同一 CPU 的两台机器(最好其他硬件也相同),因为 save 一个 Xen 虚拟机后,换到另一个不同 CPU 的机器上可能导致指令不执行(CPU 不同,save 的指令可能在 restore 后无效),现在还没有更好的办法。所以如果要求不是很高,又不想冒险的话最好还是冷备份(关闭虚拟机后备份)。
    2、我们虚拟技术架构在不同的平台上,有 Xen, VMware ESXi, Citrix XenServer, VirtualBox 等, VMware ESXi 和 Citrix XenServer 都有相应的 GUI 管理工具,管理起来相对简单。Xen 则由我们自己的脚本来管理,现有很多 Xen 的管理工具,不过都满足不了我们的要求。

  12. 谢谢vpsee的精彩解答,对于第一点您说的关闭虚拟机后备份(冷备份)请问是采用什么方式的呢,是直接拷贝镜像文件至存储上面还是采用红帽的virt-clone命令呢,请指教。
    还有,请问你们的Xen平台都是部署在什么版本的Linux平台呢,如果是红帽或者是SUSE,请问是否是采用这些发行版自带的虚拟化组件还是安装裸系统后再重新安装的呢?

  13. 用 xen 的 save/restore 就可以了。
    我们使用各个版本的 Linux,甚至还有 OpenSolaris,一般都是先安装一个最小系统再装 Xen.

  14. 谢谢,再次请教下您的Xen服务器一般是采用那个版本?相对比较新的Xen3.4.2吗,还有,编译源码安装Xen好像比较麻烦点,而升级Xen也比较麻烦,不知道这个您是怎么解决的。

  15. 一般来说我们都是下载最新版本编译,编译没有那么麻烦,和编译 Linux 内核差不多。最好根据自己服务器的硬件定制内核,可以把内核里面不用的驱动、多余的文件系统等都去掉,这样性能会更好一些。

  16. 谢谢vpsee。今天在升级一台Xen服务器的时候升级完成重启服务器后无法进入系统,提示如下配置文件不存在,我是按照该篇文章来升级的http://www.fallday.org/archives/474/comment-page-1#comment-203

    在这一步时
    修改/boot/grub/grub.conf

    title CentOS with Xen 3.4.2
    root (hd0,0)
    kernel /xen-3.4.2.gz console=vga
    module /vmlinuz-2.6.18.8-xen ro root=LABEL=/
    module /initrd-2.6.18.8-xen-3.4.2
    未做好修改,导致系统无法启动,在grub界面按以上修改后,系统也无法启动,请vpsee指教。

  17. 按要求修改后,系统能正常启动,但是Xen无法正常启动。
    #xm info
    [[email protected] ~]# xm info
    Error: (13, ‘Permission denied’)
    Usage: xm info

    Get information about Xen host.
    #xm list
    [[email protected] ~]# xm list
    Name ID Mem(MiB) VCPUs State Time(s)
    ACMError: Security information not found in info struct.
    Domain-0 0 3921 4 r—– 34.5

  18. 你在编译内核的时候禁止了 ACM_SECURITY ? = n 这个选项吗?禁止后再试试。

  19. VPsee您好,在编译的时候没有设置ACM_SECURITY ? = n这个选项。后我查询了该目录
    # Enable XSM security module. Enabling XSM requires selection of an
    # XSM security module (FLASK_ENABLE or ACM_SECURITY).
    XSM_ENABLE ?= n
    FLASK_ENABLE ?= n
    ACM_SECURITY ?= n
    后,我修改ACM_SECURITY ?= y,重启服务器后,但是问题依旧,请问VPsee,我是否需要再次重装系统然后再次编译?

  20. make dist查找编译错误,发现有如下错误:
    make -f /tools/xen-3.4.2/xen/Rules.mk -C acm built_in.o
    make[5]: Entering directory `/tools/xen-3.4.2/xen/xsm/acm’
    gcc -O2 -fomit-frame-pointer -m32 -march=i686 -fno-strict-aliasing -std=gnu99 -Wall -Wstrict-prototypes -Wno-unused-value -Wdeclaration-after-statement -DNDEBUG -nostdinc -fno-builtin -fno-common -iwithprefix include -Werror -Wno-pointer-arith -pipe -I/tools/xen-3.4.2/xen/include -I/tools/xen-3.4.2/xen/include/asm-x86/mach-generic -I/tools/xen-3.4.2/xen/include/asm-x86/mach-default -msoft-float -fno-stack-protector -g -D__XEN__ -DACM_SECURITY -DXSM_MAGIC=0xbcde0100 -MMD -MF .acm_core.o.d -c acm_core.c -o acm_core.o
    acm_core.c: In function ‘acm_init’:
    acm_core.c:283: 错误:‘policy_buffer’ 未声明 (在此函数内第一次使用)
    acm_core.c:283: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
    acm_core.c:283: 错误:所在的函数内只报告一次。)
    acm_core.c:283: 错误:‘policy_size’ 未声明 (在此函数内第一次使用)
    cc1: warnings being treated as errors
    acm_core.c:319: 警告:隐式声明函数 ‘register_xsm’
    acm_core.c: 在顶层:
    acm_core.c:325: 警告:数据定义时没有类型或存储类
    acm_core.c:325: 警告:在 ‘xsm_initcall’ 的声明中,类型默认为 ‘int’
    acm_core.c:325: 警告:函数声明中出现形参名却未指定类型
    make[5]: *** [acm_core.o] 错误 1
    make[5]: Leaving directory `/tools/xen-3.4.2/xen/xsm/acm’
    make[4]: *** [acm/built_in.o] 错误 2
    make[4]: Leaving directory `/tools/xen-3.4.2/xen/xsm’
    make[3]: *** [/tools/xen-3.4.2/xen/xsm/built_in.o] 错误 2
    make[3]: Leaving directory `/tools/xen-3.4.2/xen/arch/x86′
    make[2]: *** [/tools/xen-3.4.2/xen/xen] 错误 2
    make[2]: Leaving directory `/tools/xen-3.4.2/xen’
    make[1]: *** [install] 错误 2
    make[1]: Leaving directory `/tools/xen-3.4.2/xen’
    make: *** [install-xen] 错误 2

  21. 同时选这两项:
    ACM_SECURITY ?= y
    ACM_DEFAULT_SECURITY_POLICY ?= ACM_NULL_POLICY

    make dist 再试试?不需要重装系统,估计是 domains 和 policy 关联问题。

    如果彻底不用 ACM 也应该可以:
    ACM_SECURITY ?= n
    虽然你屏幕上会报错,只是提醒你 ACM 不能关联到相应的 policy 而已,你试试能不能正常创建虚拟机,你的 domain0 已经成功在运行啊。

  22. 回vpsee,在Config.mk文件中,没有找到ACM_DEFAULT_SECURITY_POLICY ?= ACM_NULL_POLICY这一行,make dist显示错误结果如下:
    make[3]: *** [all] 错误 1
    make[3]: Leaving directory `/tools/xen-3.4.2/tools/firmware’
    make[2]: *** [subdir-install-firmware] 错误 2
    make[2]: Leaving directory `/tools/xen-3.4.2/tools’
    make[1]: *** [subdirs-install] 错误 2
    make[1]: Leaving directory `/tools/xen-3.4.2/tools’
    make: *** [install-tools] 错误 2

    另:使用virt-install无法安装虚拟机系统,提示[[email protected] acm]# virt-install
    ERROR 无法连接到 ‘localhost:8000’: 拒绝连接
    Traceback (most recent call last):
    File “/usr/sbin/virt-install”, line 861, in ?
    main()
    File “/usr/sbin/virt-install”, line 636, in main
    conn = cli.getConnection(options.connect)
    File “/usr/lib/python2.4/site-packages/virtinst/cli.py”, line 126, in getConnection
    conn = libvirt.open(connect)
    File “/usr/lib/python2.4/site-packages/libvirt.py”, line 159, in open
    if ret is None:raise libvirtError(‘virConnectOpen() failed’)
    libvirtError: 无法连接到 ‘localhost:8000’: 拒绝连接
    用VNC远程连接服务器,打开virt-manager也提示A Xen host kernel was booted
    the xend service has been started

  23. 你的 /etc/xen/xend-config.sxp 里的
    (xend-http-server yes)
    (xend-unix-server yes)
    (xend-port 8000)
    应该都是开着的吧?

  24. 查看xend-config.sxp目录内容如下:
    #(xend-http-server no)
    (xend-http-server yes)
    (xend-unix-server yes)
    #(xend-tcp-xmlrpc-server no)
    #(xend-unix-xmlrpc-server yes)
    #(xend-relocation-server no)
    # The relocation server should be kept desactivated unless using a trusted
    # network, the domain virtual memory will be exchanged in raw form without
    # encryption of the communication. See also xend-relocation-hosts-allow option

    (xend-unix-path /var/lib/xend/xend-socket)

    # Port xend should use for the HTTP interface, if xend-http-server is set.
    #(xend-port 8000)
    (xend-port 8000)

  25. vpsee好,stacklet.com一直提示403权限错误,http://jailtime.org/也是到stacklet.com的链接,还有其他地方能下到镜像么?谢谢。

  26. 不能吧,stacklet.com 访问很稳定啊,你用 vpn 代理试试。

  27. Can’t find version 3.2 of xen utils
    安装没有提示错误
    xend不能启动,是怎么回事啊? 在debian5.04 amd64

  28. 用 dpkg -l | grep -i xen 检查一下是否安装 xen-utils, xen-utils-common 等。

  29. ii xen-utils-3.2-1 3.2.1-2 XEN administrative tools
    ii xen-utils-common 3.4.2-4 XEN administrative tools – common files
    这个算是正常到吗

  30. uname-r
    2.6.26-2-xen-amd64
    就是不能启动xend,奇怪

  31. hi vpsee:
    我想要使用xen的xsm模块,xen版本3.4.2,编译之后加载策略使用:
    xm setpolicy ACM test
    这个策略文件我只是把原有的示例里的内容完全复制出来一份放在policy文件夹下面了,输出为:
    Error:’ACM policy type not supported.’
    请问这是为什么呢?
    我在/usr/lib/python2.5/site-packages/xen/xm/setpolicy.py里面看到这个错误是在第131行处理的。
    server.xend.security.get_xstype()返回的是0

    谢谢

  32. 你确定编译 xen 的时候 xsm 和 acm 模块都包含进来了吧?错误提示 “ACM policy type not supported” 显示好像没有 ACM 模块的支持。
    XSM_ENABLE ?= y
    FLASK_ENABLE ?= y
    ACM_SECURITY ?= y

  33. 谢谢回复,我已经找到问题了,xend-config.sxp里面要加(xsm_module_name acm),加上之后就成了。我查到这个xstype是由xend rpc返回的,还以为必须要用Xen-API server才可以,结果浪费了两天时间。谢谢了,以后还请多多指点。

  34. hi,vpsee, my I have your email?

  35. Email 可以在博客上找到,如果是技术问题的话直接在博客上留言就可以了:)

  36. 好的。我现在有个问题,当我给虚拟机及其镜像文件加好label之后,启动报错说:’VIF’ must be labeled
    我在/usr/lib/python2.5/site-packages/xen/xend/server/netif.py中找到了:
    def do_access_control(self,config):
    错误就是在这个函数里抛出的:
    res_label = config.get(“security_label”)
    if len(stes) > 1 or res_label:
    if not res_label:
    raise VmError(“‘VIF’ must be labeled”)
    于是我知道当前label中ste type的数量大于1,并且res_label为空(虽然完全不明白为什么要做这样的判断)
    我到我的虚拟机配置文件中在vif一项中做了如下修改(原本只有mac地址)
    vif=[‘mac=xx:xx:xx:xx:xx:xx, security_label=blablabla, policy=test’]
    再xm create,报错说security_label是invalid option,于是我又查到在/usr/lib/python2.5/site-packages/xen/xm/create.py里认为label是合法的选项但security_label不合法(是bug?),于是我又把security_label加到合法选项集合里面,启动,结果继续报错:Error: need more than 1 value to unpack.这个错误应该是从rpc server端抛出来的了,这些label和policy的值跟我使用的策略逻辑上没有冲突,希望能帮忙分析一下这是为什么,thx!

  37. 可以把 policy 写在 vif 吗?有 security_label 这个选项吗,好像是 label 吧?你看看下面这个写法行不行:
    vif = [ ” ]
    access_control = [ ‘policy=test, label=blablabla’ ]

  38. hi vpsee,
    uname -r show
    2.6.32-5-xen-amd64

    but xend can not start.

    run xend directly show:
    WARNING! Can’t find hypervisor information in sysfs!
    ERROR Internal error: Could not obtain handle on privileged command interface (2 = No such file or directory)

    any suggestion?

    tks

  39. 你可能没有安装 xen hypervisor,xen kernel 要运行在 xen hypervisor 上才可以。

  40. 我想问的是怎么能在VM中安装XEN呢?
    我是VM中有Debian
    Debian中想安装XEN 可是弹出以下信息:
    A virtual CPU has entered the shutdown state. This would have caused a physical machine to restart. This can be caused by an incorrect configuration of the virtual machine, a bug in the operating system or a problem in the VMware Workstation software. Press OK to restart the virtual machine or Cancel to power off the virtual machine.
    博主可有解决方法呀?

  41. 现在回头来看下,这文章写的不够详细,只能算是博主成功了.

  42. 你好:
    请问一下:如何升级xen内核,我现在的版本是:2.6.18-194.el5xen ,如果现在想要升级到更高版本该怎么做?

  43. @janson
    只能通过源码升级,在 Debian 上源码安装 Xen.

  44. 您好
    写的非常详细,学习了!
    不过http://stacklet.com/这个网站现在不能下载guest镜像了,要收费…不知道博主能不能再给个其他地址

  45. @fenix
    好像没有其他的地址可以下载,有些个人做的镜像放在网上不太可靠,最好还是找这种有组织的官方镜像下载。

  46. jailtime.org这个网站只提供kernel部分的下载,操作系统需要付费了。

  47. @vpsee
    debian squeeze 启动 domU 出错,错误信息如下:
    [ 0.157746] Write protecting the kernel read-only data: 4332k
    Loading, please wait…
    [ 0.181479] udev[56]: starting version 164
    Begin: Loading essential drivers … [ 0.288130] SCSI subsystem initialized
    done.
    Begin: Running /scripts/init-premount … done.
    Begin: Mounting root file system … Begin: Running /scripts/local-top … [ 0.318694] device-mapper: uevent: version 1.0.3
    [ 0.318889] device-mapper: ioctl: 4.15.0-ioctl (2009-04-01) initialised: [email protected]
    done.
    Begin: Waiting for root file system … done.
    Gave up waiting for root device. Common problems:
    – Boot args (cat /proc/cmdline)
    – Check rootdelay= (did the system wait long enough?)
    – Check root= (did the system wait for the right device?)
    – Missing modules (cat /proc/modules; ls /dev)
    ALERT! /dev/xvda2 does not exist. Dropping to a shell!

    BusyBox v1.17.1 (Debian 1:1.17.1-8) built-in shell (ash)
    Enter ‘help’ for a list of built-in commands.

    安装的软件包如下:
    [email protected]:/etc/xen# dpkg -l | grep xen
    ii libxenstore3.0 4.0.1-2 Xenstore communications library for Xen
    ii linux-image-2.6.32-5-xen-amd64 2.6.32-35 Linux 2.6.32 for 64-bit PCs, Xen dom0 support
    ii linux-image-xen-amd64 2.6.32+29 Linux for 64-bit PCs (meta-package), Xen dom0 support
    ii xen-hypervisor-4.0-amd64 4.0.1-2 The Xen Hypervisor on AMD64
    ii xen-linux-system-2.6-xen-amd64 2.6.32+29 Xen system with Linux 2.6 for 64-bit PCs (meta-package)
    ii xen-linux-system-2.6.32-5-xen-amd64 2.6.32-35 Xen system with Linux 2.6.32 on 64-bit PCs (meta-package)
    ii xen-qemu-dm-4.0 4.0.1-2 Xen Qemu Device Model virtual machine hardware emulator
    ii xen-tools 4.2-1 Tools to manage Xen virtual servers
    ii xen-utils-4.0 4.0.1-2 XEN administrative tools
    ii xen-utils-common 4.0.0-1 XEN administrative tools – common files
    ii xenstore-utils 4.0.1-2 Xenstore utilities for Xen
    [email protected]:/etc/xen# uname -r
    2.6.32-5-xen-amd64

    奇怪的是,我在另一台laptop上同样的配置就没有任何问题。
    这个问题google上搜索到的也较少,不知道你有没有遇到过。

  48. @cohan
    很明显启动原因是因为没有找到 root 文件系统,/dev/xvda2 不存在,你看看 vm 系统里面和 xen 启动 vm 的配置文件里面的 /dev/xvda2 是否匹配。比如这里用的是 sda1:
    disk = [ “file:/home/vm/vm01.img,sda1,w” ]
    root = “/dev/sda1”

  49. 我在debian6.04上安装了xen和xen-tools,但每次用xen-create-image命令新建VPS的时候总是会报这个错误:
    /tmp/8UooFlvlvL/etc/ssh/ssh_host_rsa_key.pub: No such file or directory
    一直解决不了
    旁边一台配置完全相同的宿主却没有问题,求帮组

  50. @nouh
    你的网络环境需要设置代理服务器吗?试一下 export http_proxy = “http://yourproxy.com:3128” 后再 xen-create-image

  51. vpsee你好,我想启用xen的shype模块,但是用户手册就是说修改Config.mk后直接make world。但是我make world总是不成功,请问你有什么相关的资料吗?谢谢

发表评论