ubuntu 14.04 无人职守全自动安装-基础知识

Ubuntu 也可以使用配置文件自动回答响应安装过程中的交互内容。他支持两种方式,一种是使用红帽系的kickstart配置文件,但这种方式功能支持的不全,比如磁盘分区等。Ubuntu其实有自己专用的配置方法,即debian系的preseed。他们两个也可共同使用。

本文只对preseed方式做介绍,因为相关资料不是很丰富,没有找到最准确完整的可配置项,遇到特殊的需求还是要自行google,一般搜索格式为:”preseed ubuntu xxxxxxx“,尽量使用英文搜索。

有些内容研究尚不彻底,望广大网友多提宝贵意见和建议。

参考资料:https://help.ubuntu.com/14.04/installation-guide/amd64/apb.html

http://ftp.dc.volia.com/pub/debian/preseed/partman-auto-recipe.txt

http://razvangavril.com/linux-administration/custom-ubuntu-server-iso/

三种方式

preseed配置文件可以通过三种方式提供:initrd文件, 普通文件 和 网络文件.(txt.cfg也可以指定,不建议在此指定过多参数)

依据安装介质的不同,这三种方式并不能全部支持,如下表:

安装方式 initrd文件 普通文件 网络文件
CD/DVD(光盘安装) 支持 支持 支持
netboot(PXE网络安装) 支持 不支持 支持
hd-media (硬盘安装) 支持 支持 支持

initrd文件:支持所有preseed参数
普通文件:支持安装界面语言,键盘选择之后的参数
网络文件:支持配置好网络之后的参数

initrd文件支持所有安装方式和所有参数,缺点是不便于修改;普通文件的方式不支持网络安装,支持的参数较全面(可以用安装选单参数配合 ),但是易于修改;网络文件缺点是需要联网,且有http或ftp服务器,支持的参数少。 三种方式可以混合使用。

本人建议:
如果想在一个文件中配置所有参数那就选择initrd方式。否则可选择混合方式。
光盘安装,使用txt.cfg参数+普通文件的方式。PXE安装可选择initrd+网络方式。

initrd文件操作

Linux® 初始 RAM 磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。initrd 文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再将这个 initrd RAM 磁盘卸载,并释放内存。在很多嵌入式 Linux 系统中,initrd 就是最终的根文件系统。(引自:http://www.ibm.com/developerworks/cn/linux/l-initrd.html)

安装镜像中包含有光盘安装(/install/initrd.gz)和PXE网络安装(/install/netboot/ubuntu-installer/amd64/initrd.gz)所需的两个initrd文件。他们的制作方式是相同的:

VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV


gunzip initrd.gz
mv initrd initrd.img
mkdir initrd
cd initrd
cpio –i <../initrd.img

这样initrd.gz会变成一个initrd路径,进入路径添加一个preseed.cfg文件,文件名不能错,下文讲到的preseed参数写在里边。然后重新打包initrd.gz


find . | cpio -o -H newc | gzip -9 > ../initrd.gz

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

txt.cfg指定

此种方式只限于少量参数,否则会很混乱。且似乎指能用于光盘安装。
/isolinux/txt.cfg
===== 8< ==========
default autoinstall
label autoinstall
  menu label ^Auto Install Ubuntu Server
  kernel /install/vmlinuz
  append  file=/cdrom/preseed/ubuntu-server-autoins.seed  vga=788 initrd=/install/initrd.gz locale=en_US console-setup/ask_detect=false keyboard-configuration/layoutcode=us quiet --
====== >8 =========

如图中橙色背景处的参数,与preseed的中的区别在于:
preseed中为>
# Preseeding only locale sets language, country and locale.
d-i debian-installer/locale string en_US

txt.cfg中应该为>
debian-installer/locale=en_US
因为locale 是 debian-installer/locale的简写形式(见参考资料),所以最终我们可以写成:
locale=en_US

其他参数类似,不再赘述


preseed参数

光盘镜像中包含一个配置文件示例(/doc/install/manual/example-preseed.txt.gz),下文为尝试使用中文注释的可配项(英语不太好,不准确请见谅,欢迎指正),'#'为注释符

###########################################################################
##  地区 和 键盘 配置
##  在文件配置方式下不可用,可在txt.cfg中添加 locale=en_US 和 console-setup/ask_detect=false keyboard-configuration/layoutcode=us 
#############################################################################

# 预置 区域语言,国家和地区.
d-i debian-installer/locale string en_US

# 灵活的单独配置语言、国家、地区.
#d-i debian-installer/language string en
#d-i debian-installer/country string NL
#d-i debian-installer/locale string en_GB.UTF-8

# 可选项,指定附加的地区.
#d-i localechooser/supported-locales en_US.UTF-8, nl_NL.UTF-8


# 键盘 选择.
# 禁用交互式键盘布局自动探测.
d-i console-setup/ask_detect boolean false
# 指定键盘模式和布局
#d-i keyboard-configuration/modelcode string pc105
d-i keyboard-configuration/layoutcode string us
# 选择布局变种,比如dvorak(如果省略, 将使用基本布局)
#d-i keyboard-configuration/variantcode string dvorak


######################################################################################
##  配置网络
##  (PXE网络安装时不可用)
######################################################################################
# 彻底禁用配置网络. 在没有网络设备的机器上使用光盘安装时非常有用,
# 否则会遇到讨厌的网络警告,长时间的等待超时等.
#d-i netcfg/enable boolean false

# 网络配置程序将会自动选择一个连接有网线的网口. 
# 这会跳过在多网卡的机器上显示网口列表.
#d-i netcfg/choose_interface select auto

# 或直接指定要配置的网口:
d-i netcfg/choose_interface select eth0

# 如果你的dhcp服务器很慢,安装程序等待dhcp的配置.
# 这个超时选项可能很有用.
d-i netcfg/dhcp_timeout string 60


# 如果你想手动配置网络,解注此处和后边静态配置网卡的内容.
#d-i netcfg/disable_autoconfig boolean true


# 如果你想让本配置文件在有或者没有dhcp服务器的情况下都起作用,
# 解除此处的注释和后边静态配置网口的内容.
#d-i netcfg/dhcp_failed note
#d-i netcfg/dhcp_options select Configure network manually


# 静态网络配置.
#d-i netcfg/get_nameservers string 8.8.8.8
#d-i netcfg/get_ipaddress string 192.168.1.42
#d-i netcfg/get_netmask string 255.255.255.0
#d-i netcfg/get_gateway string 192.168.1.1
#d-i netcfg/confirm_static boolean true


# 从dhcp服务器获取的主机名和域名的优先级高于此处的配置
# 但是, 设置这些变量值仍然可以防止相关对话框的显示.
d-i netcfg/get_hostname string unassigned-hostname
#d-i netcfg/get_domain string unassigned-domain


# 禁用讨厌的 WEP 键 对话框.
#d-i netcfg/wireless_wep string
# 古怪的dhcp主机名,有些ISP使用它作为分类密码.
#d-i netcfg/dhcp_hostname string radish


# 如果需要不是自由软件的固件,网卡的或其他硬件的, 你可以配置安装程序总是加载他们而不提示,或者设置成false直接不询问.
#d-i hw-detect/load_firmware boolean true


######################################################################################
##  网络控制台
######################################################################################
# 使用后边的配置,如果你想使用网络控制台
# 通过SSH远程控制安装.这个只在你想手动控制剩下的安装时才有意义.
#d-i anna/choose_modules string network-console
#d-i network-console/password password r00tme
#d-i network-console/password-again password r00tme
# 用此处配置代替密码,如果你想用基于key文件的身份认证
#d-i network-console/authorized_keys_url http://host/authorized_keys




######################################################################################
##  镜像设置
######################################################################################
# 如果此处设置ftp,mirror/country 不需要设置.
#d-i mirror/protocol string ftp
#d-i mirror/country string manual
#d-i mirror/http/hostname string archive.ubuntu.com
#d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string


# 第二选择:默认情况下,安装程序使用 CC.archive.ubuntu.com 
# CC是选择的国家的 ISO-3166-2 代码 .
# 预置在此处安装过程中将不会再询问.
#d-i mirror/http/mirror select CC.archive.ubuntu.com


# 安装的软件包.
#d-i mirror/suite string trusty
# Suite to use for loading installer components (optional).
#d-i mirror/udeb/suite string trusty
# Components to use for loading installer components (optional).
#d-i mirror/udeb/components multiselect main, restricted


######################################################################################
##  时间和时区设置
######################################################################################
# 控制硬件时间是否设置为UTC.
d-i clock-setup/utc boolean true

# You may set this to any valid setting for $TZ; see the contents of
# /usr/share/zoneinfo/ for valid values.
d-i time/zone string Asia/Shanghai

# Controls whether to use NTP to set the clock during the install
#d-i clock-setup/ntp boolean true
# NTP server to use. The default is almost always fine here.
#d-i clock-setup/ntp-server string ntp.example.com


######################################################################################
##   Partitioning
######################################################################################
# If the system has free space you can choose to only partition that space.
# This is only honoured if partman-auto/method (below) is not set.
# Alternatives: custom, some_device, some_device_crypto, some_device_lvm.
#d-i partman-auto/init_automatically_partition select biggest_free


# auto unmount. This was missing in the example preseed
d-i preseed/early_command string umount /media || true
#d-i partman/unmount_active boolean true  # this doesn't work


# Alternatively, you may specify a disk to partition. If the system has only
# one disk the installer will default to using that, but otherwise the device
# name must be given in traditional, non-devfs format (so e.g. /dev/hda or
# /dev/sda, and not e.g. /dev/discs/disc0/disc).
# For example, to use the first SCSI/SATA hard disk:
d-i partman-auto/disk string /dev/sda
# In addition, you'll need to specify the method to use.
# The presently available methods are:
# - regular: use the usual partition types for your architecture
# - lvm:     use LVM to partition the disk
# - crypto:  use LVM within an encrypted partition
d-i partman-auto/method string lvm


## with encrypted LVM you can set passphrase, it should more than 8 characters, I haven't find encrypt this and auto use weak passwd
#d-i partman-auto/method string crypto
#d-i partman-crypto/passphrase password 123456
#d-i partman-crypto/passphrase-again password 123456
partman-crypto partman-crypto/weak_passphrase boolean true


# If one of the disks that are going to be automatically partitioned
# contains an old LVM configuration, the user will normally receive a
# warning. This can be preseeded away...
d-i partman-lvm/device_remove_lvm boolean true
# The same applies to pre-existing software RAID array:
d-i partman-md/device_remove_md boolean true
# And the same goes for the confirmation to write the lvm partitions.
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true #NOTE: This was missing in the example preseed


# For LVM partitioning, you can select how much of the volume group to use
# for logical volumes.
d-i partman-auto-lvm/guided_size string max
#d-i partman-auto-lvm/guided_size string 10GB
#d-i partman-auto-lvm/guided_size string 50%
d-i partman-auto-lvm/new_vg_name string vg-workstation




# You can choose one of the three predefined partitioning recipes:
# - atomic: all files in one partition
# - home:   separate /home partition
# - multi:  separate /home, /usr, /var, and /tmp partitions
d-i partman-auto/choose_recipe select atomic
#d-i partman-auto/choose_recipe select custom-lvm


## Or provide a recipe of your own...


# If you have a way to get a recipe file into the d-i environment, you can
# just point at it.
#d-i partman-auto/expert_recipe_file string /hd-media/recipe


# If not, you can put an entire recipe into the preconfiguration file in one
# (logical) line. This example creates a small /boot partition, suitable
# swap, and uses the rest of the space for the root partition:


#d-i partman-auto/expert_recipe string                         \
#      custom-lvm ::                                           \
#        500 500 500 ext4 $primary{ } $bootable{ }             \
#        mountpoint{ /boot }                                   \
#        method{ format }                                      \
#        format{ }                                             \
#        use_filesystem{ }                                     \
#        filesystem{ ext4 }                                    \
#        .                                                     \
#        1024 1024 1024 ext4 $lvmok{ }                    \
#        mountpoint{ /var }                                   \
#        lv_name{ var }                                       \
#        in_vg { vg-workstation }                              \
#        method{ format }                                      \
#        format{ }                                             \
#        use_filesystem{ }                                     \
#        filesystem{ ext4 }                                    \
#        .                                                     \
#        1024 4096 1000000000 ext4 $lvmok{ }                     \
#        mountpoint{ / }                                       \
#        lv_name{ root }                                       \
#        in_vg { vg-workstation }                              \
#        method{ format }                                      \
#        format{ }                                             \
#        use_filesystem{ }                                     \
#        filesystem{ ext4 }                                    \
#        .                                                     \
#        64 512 300% linux-swap $lvmok{ }                   \
#        lv_name{ swap }                                       \
#        in_vg { vg-workstation }                              \
#        method{ swap }                                        \
#        format{ }                                             \
#        .


# If you just want to change the default filesystem from ext3 to something
# else, you can do that without providing a full recipe.
d-i partman/default_filesystem string ext4


# The full recipe format is documented in the file partman-auto-recipe.txt
# included in the 'debian-installer' package or available from D-I source
# repository. This also documents how to specify settings such as file
# system labels, volume group names and which physical devices to include
# in a volume group.


# This makes partman automatically partition without confirmation, provided
# that you told it what to do using one of the methods above.
d-i partman-partitioning/confirm_write_new_label boolean true
#d-i partman/choose_partition select finish # Note , this is worong! As follows
d-i partman/choose_partition \
    select Finish partitioning and write changes to disk
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true


######################################################################################
##   Partitioning using RAID
######################################################################################
# The method should be set to "raid".
#d-i partman-auto/method string raid
# Specify the disks to be partitioned. They will all get the same layout,
# so this will only work if the disks are the same size.
#d-i partman-auto/disk string /dev/sda /dev/sdb


# Next you need to specify the physical partitions that will be used. 
#d-i partman-auto/expert_recipe string \
#      multiraid ::                                         \
#              1000 5000 4000 raid                          \
#                      $primary{ } method{ raid }           \
#              .                                            \
#              64 512 300% raid                             \
#                      method{ raid }                       \
#              .                                            \
#              500 10000 1000000000 raid                    \
#                      method{ raid }                       \
#              .


# Last you need to specify how the previously defined partitions will be
# used in the RAID setup. Remember to use the correct partition numbers
# for logical partitions. RAID levels 0, 1, 5, 6 and 10 are supported;
# devices are separated using "#".
# Parameters are:
# <raidtype> <devcount> <sparecount> <fstype> <mountpoint> \
#          <devices> <sparedevices>


#d-i partman-auto-raid/recipe string \
#    1 2 0 ext3 /                    \
#          /dev/sda1#/dev/sdb1       \
#    .                               \
#    1 2 0 swap -                    \
#          /dev/sda5#/dev/sdb5       \
#    .                               \
#    0 2 0 ext3 /home                \
#          /dev/sda6#/dev/sdb6       \
#    .


# For additional information see the file partman-auto-raid-recipe.txt
# included in the 'debian-installer' package or available from D-I source
# repository.


# This makes partman automatically partition without confirmation.
#d-i partman-md/confirm boolean true
#d-i partman-partitioning/confirm_write_new_label boolean true
#d-i partman/choose_partition select finish
#d-i partman/confirm boolean true
#d-i partman/confirm_nooverwrite boolean true


######################################################################################
##   Controlling how partitions are mounted
######################################################################################
# The default is to mount by UUID, but you can also choose "traditional" to
# use traditional device names, or "label" to try filesystem labels before
# falling back to UUIDs.
#d-i partman/mount_style select uuid


######################################################################################
##   Base system installation
######################################################################################
# Configure APT to not install recommended packages by default. Use of this
# option can result in an incomplete system and should only be used by very
# experienced users.
#d-i base-installer/install-recommends boolean false


# The kernel image (meta) package to be installed; "none" can be used if no
# kernel is to be installed.
#d-i base-installer/kernel/image string linux-generic




######################################################################################
##   Account setup
##   The following command can be used to generate an MD5 hash for a password:
##   $ printf "123456" | mkpasswd -s -m md5
######################################################################################
# Skip creation of a root account (normal user account will be able to
# use sudo). The default is false; preseed this to true if you want to set
# a root password.
d-i passwd/root-login boolean root
# Alternatively, to skip creation of a normal user account.
#d-i passwd/make-user boolean false


# Root password, either in clear text
#d-i passwd/root-password password 123456
#d-i passwd/root-password-again password 123456
# or encrypted using an MD5 hash.
d-i passwd/root-password-crypted password $1$mTX9z2NE$2GASUCmhyKysazfeD2jE80


# To create a normal user account.
d-i passwd/user-fullname string Ubuntu User
d-i passwd/username string ubuntu
# Normal user's password, either in clear text
#d-i passwd/user-password password 123456
#d-i passwd/user-password-again password 123456
# or encrypted using an MD5 hash.
d-i passwd/user-password-crypted password $1$z4dTGw4N$OvJwkB7XsVlLJBns2Y32m1
# Create the first user with the specified UID instead of the default.
#d-i passwd/user-uid string 1010
# The installer will warn about weak passwords. If you are sure you know
# what you're doing and want to override it, uncomment this.
d-i user-setup/allow-password-weak boolean true




# The user account will be added to some standard initial groups. To
# override that, use this.
#d-i passwd/user-default-groups string audio cdrom video


# Set to true if you want to encrypt the first user's home directory.
d-i user-setup/encrypt-home boolean false




######################################################################################
##   Apt setup
######################################################################################
# You can choose to install restricted and universe software, or to install
# software from the backports repository.
#d-i apt-setup/restricted boolean true
#d-i apt-setup/universe boolean true
#d-i apt-setup/backports boolean true
# Uncomment this if you don't want to use a network mirror.
#d-i apt-setup/use_mirror boolean false
# Select which update services to use; define the mirrors to be used.
# Values shown below are the normal defaults.
#d-i apt-setup/services-select multiselect security
#d-i apt-setup/security_host string security.ubuntu.com
#d-i apt-setup/security_path string /ubuntu


# Additional repositories, local[0-9] available
#d-i apt-setup/local0/repository string \
#       http://local.server/ubuntu trusty main
#d-i apt-setup/local0/comment string local server
# Enable deb-src lines
#d-i apt-setup/local0/source boolean true
# URL to the public key of the local repository; you must provide a key or
# apt will complain about the unauthenticated repository and so the
# sources.list line will be left commented out
#d-i apt-setup/local0/key string http://local.server/key


# By default the installer requires that repositories be authenticated
# using a known gpg key. This setting can be used to disable that
# authentication. Warning: Insecure, not recommended.
#d-i debian-installer/allow_unauthenticated boolean true


######################################################################################
##   Package selection
##   Available tasks as of this writing include:
##    standard
##    ubuntu-desktop
##    kubuntu-desktop
##    edubuntu-desktop
##    xubuntu-desktop
##    dns-server
##    lamp-server
######################################################################################
#tasksel tasksel/first multiselect ubuntu-desktop
#tasksel tasksel/first multiselect lamp-server, print-server
#tasksel tasksel/first multiselect kubuntu-desktop
tasksel tasksel/first multiselect standard


# Individual additional packages to install
d-i pkgsel/include string openssh-server build-essential
# Whether to upgrade packages after debootstrap.
# Allowed values: none, safe-upgrade, full-upgrade
d-i pkgsel/upgrade select none


# Language pack selection
#d-i pkgsel/language-packs multiselect de, en, zh


# Policy for applying updates. May be "none" (no automatic updates),
# "unattended-upgrades" (install security updates automatically), or
# "landscape" (manage system with Landscape).
d-i pkgsel/update-policy select none


# Some versions of the installer can report back on what software you have
# installed, and what software you use. The default is not to report back,
# but sending reports helps the project determine what software is most
# popular and include it on CDs.
#popularity-contest popularity-contest/participate boolean false


# By default, the system's locate database will be updated after the
# installer has finished installing most packages. This may take a while, so
# if you don't want it, you can set this to "false" to turn it off.
d-i pkgsel/updatedb boolean false


######################################################################################
##   Boot loader installation
######################################################################################
# Grub is the default boot loader (for x86). If you want lilo installed
# instead, uncomment this:
#d-i grub-installer/skip boolean true
# To also skip installing lilo, and install no bootloader, uncomment this
# too:
#d-i lilo-installer/skip boolean true


# With a few exceptions for unusual partitioning setups, GRUB 2 is now the
# default. If you need GRUB Legacy for some particular reason, then
# uncomment this:
#d-i grub-installer/grub2_instead_of_grub_legacy boolean false


# This is fairly safe to set, it makes grub install automatically to the MBR
# if no other operating system is detected on the machine.
d-i grub-installer/only_debian boolean true


# This one makes grub-installer install to the MBR if it also finds some other
# OS, which is less safe as it might not be able to boot that other OS.
d-i grub-installer/with_other_os boolean true


# Alternatively, if you want to install to a location other than the mbr,
# uncomment and edit these lines:
#d-i grub-installer/only_debian boolean false
#d-i grub-installer/with_other_os boolean false
#d-i grub-installer/bootdev  string (hd0,0)
# To install grub to multiple disks:
#d-i grub-installer/bootdev  string (hd0,0) (hd1,0) (hd2,0)


# Optional password for grub, either in clear text
#d-i grub-installer/password password r00tme
#d-i grub-installer/password-again password r00tme
# or encrypted using an MD5 hash, see grub-md5-crypt(8).
#d-i grub-installer/password-crypted password [MD5 hash]


# Use the following option to add additional boot parameters for the
# installed system (if supported by the bootloader installer).
# Note: options passed to the installer will be added automatically.
#d-i debian-installer/add-kernel-opts string nousb
# example:
##d-i debian-installer/add-kernel-opts string vga=normal nomodeset audit=0 intel_idle.max_cstate=0 processor.max_cstate=1 cgroup_enable=memory swapaccount=1
######################################################################################
##   Finishing up the installation
######################################################################################
# During installations from serial console, the regular virtual consoles
# (VT1-VT6) are normally disabled in /etc/inittab. Uncomment the next
# line to prevent this.
#d-i finish-install/keep-consoles boolean true


# Avoid that last message about the install being complete.
d-i finish-install/reboot_in_progress note


# This will prevent the installer from ejecting the CD during the reboot,
# which is useful in some situations.
d-i cdrom-detect/eject boolean true


# This is how to make the installer shutdown when finished, but not
# reboot into the installed system.
#d-i debian-installer/exit/halt boolean true
# This will power off the machine instead of just halting it.
#d-i debian-installer/exit/poweroff boolean true




######################################################################################
##   X configuration
######################################################################################
# X can detect the right driver for some cards, but if you're preseeding,
# you override whatever it chooses. Still, vesa will work most places.
#xserver-xorg xserver-xorg/config/device/driver select vesa


# A caveat with mouse autodetection is that if it fails, X will retry it
# over and over. So if it's preseeded to be done, there is a possibility of
# an infinite loop if the mouse is not autodetected.
#xserver-xorg xserver-xorg/autodetect_mouse boolean true


# Monitor autodetection is recommended.
xserver-xorg xserver-xorg/autodetect_monitor boolean true
# Uncomment if you have an LCD display.
#xserver-xorg xserver-xorg/config/monitor/lcd boolean true
# X has three configuration paths for the monitor. Here's how to preseed
# the "medium" path, which is always available. The "simple" path may not
# be available, and the "advanced" path asks too many questions.
#xserver-xorg xserver-xorg/config/monitor/selection-method \
#       select medium
#xserver-xorg xserver-xorg/config/monitor/mode-list \
#       select 1024x768 @ 60 Hz




d-i preseed/late_command string echo 'hehe' > /var/log/test.txt
######################################################################################
##   Preseeding other packages
######################################################################################
# Depending on what software you choose to install, or if things go wrong
# during the installation process, it's possible that other questions may
# be asked. You can preseed those too, of course. To get a list of every
# possible question that could be asked during an install, do an
# installation, and then run these commands:
#   debconf-get-selections --installer > file
#   debconf-get-selections >> file



转载于:https://my.oschina.net/tinyhare/blog/378406

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值