busybox制作rootfs

本文详细介绍了如何利用busybox工具在Linux2.6.24内核环境下创建nfs根文件系统的过程,包括主机环境配置、使用busybox创建文件系统、测试与验证等步骤。
  

用busybox创建基于Linux2.6.24内核的nfs根文件系统

 

一、主机环境

  Linux version 2.4.20-8, RedHat9, VMWare5.5.3;

  gcc version 3.4.4, Thread model: posix;

  GNU Make 3.81;

  arm-linux-gcc 4.2.1 (此创建过程见另贴用crosstool脚本编译针对Linux2.6内核的交叉编译工具链)

  所需源文件:

  busybox-1.11.1.tar.bz2;

二、用Busybox创建nfs文件系统

1、解压busybox-1.11.1.tar.bz2,路径为

[root@Sure busybox-1.11.1]# pwd

/home/jacky/busybox-1.11.1

修改Makefilez中的ARCH和CROSS_COMPILE与本机的路径一致:

CROSS_COMPILE ?= /opt/crosstool/bin/arm-s3c2410-linux-gnu-

...

ARCH ?= arm

 

2、编译busybox。先make menuconfig,修改以下:

Busybox Settings --->

    Build Options --->

        [*] Build BusyBox as a static binary (no shared libs)

        //直接编译成静态库,省事点

        (/opt/crosstool/bin/arm-s3c2410-linux-gnu-) Cross Compiler prefix

        //这里和Makefile里保持一致,应该写一处就行了

    Installation Options --->

        [*] Don't use /usr

        //不用本机的目录

Shells --->

    Choose your default shell (ash) --->

    //这里选择shell为ash,应该是默认选中的

        --- ash

        //把ash这档的选项全部选上

保存退出,直接make,make install。

 

3、用shell脚本创建根文件系统的目录结构,并在想要建立根文件系统的地方运行此脚本。我是用root用户登陆的,直接创建了设备节点。

[root@Sure root-s3c2410]# vim makedir.sh

#!/bin/sh

  echo "makeing rootdir"

  mkdir rootfs

  cd rootfs

 

  echo "makeing dir: bin dev etc lib proc sbin sys usr"

  mkdir bin dev etc lib proc sbin sys usr #8 dirs

  mkdir usr/bin usr/lib usr/sbin lib/modules

 

#Don't use mknod, unless you run this Script as

  mknod -m 600 dev/console c 5 1

  mknod -m 666 dev/null c 1 3

 

  echo "making dir: mnt tmp var"

  mkdir mnt tmp var

  chmod 1777 tmp

  mkdir mnt/etc mnt/jiffs2 mnt/yaffs mnt/data mnt/temp

  mkdir var/lib var/lock var/log var/run var/tmp

  chmod 1777 var/tmp

 

  echo "making dir: home root boot"

  mkdir home root boot

  echo "done"

执行这个sh:

[root@Sure root-s3c2410]# sh makedir.sh

创建出一个主文件夹rootfs,里面有一批文件:

[root@Sure rootfs]# ls

bin  boot  dev  etc  home  lib  mnt  proc  root  sbin  sys  tmp  usr  var

 

4、把busybox源码目录下的etc的内容拷贝到这里的etc下

[root@Sure rootfs]# cd etc/

[root@Sure etc]# cp -a /home/jacky/busybox-1.11.1/examples/bootfloppy/etc/* ./

 

5、修改拷贝过来的profile文件

[root@Sure etc]# vim profile

# /etc/profile: system-wide .profile file for the Bourne shells

 

echo "Processing /etc/profile"

# no-op

 

# Set search library path

echo " Set search library path"

export LD_LIBRARY_PATH=/lib:/usr/lib

 

# Set user path

echo " Set user path"

PATH=/bin:/sbin:/usr/bin:/usr/sbin

export PATH

 

# Set PS1

echo " Set PS1"

HOSTNAME=`/bin/hostname`

# 此处让shell提示符显示host名称的。是`,不是’,要注意

# 会在进入根系统后显示Jacky

 

export PS1="\\e[32m[$USER@$HOSTNAME \\w\\a]\\$\\e[00;37m "

# 此处\\e[32m是让后面的“[$USER@$HOSTNAME \\w\\a]”显示为绿色

# \\e[00是关闭效果

# \\e[05是闪烁

# 37m是让后面的显示为白色

# 多个命令可以;号隔开

 

echo "All done!"

echo

6、修改初始化文件inittab和fstab

[root@Sure etc]# vim inittab

::sysinit:/etc/init.d/rcS

::respawn:-/bin/sh

::restart:/sbin/init

 

tty2::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount -a -r

::shutdown:/bin/umount -a -r

::shutdown:/sbin/swapoff –a

[root@Sure etc]# vim fstab

proc /proc proc defaults 0 0

none /tmp ramfs defaults 0 0

mdev /dev ramfs defaults 0 0

sysfs /sys sysfs defaults 0 0

 

7、修改初始化的脚本文件init.d/rcS

[root@Sure etc]# vim init.d/rcS

#! /bin/sh

echo "Processing etc/init.d/rc.S"

 

#hostname ${HOSTNAME}

 

echo " Mount all"

/bin/mount -a

 

echo " Start mdev...."

/bin/echo /sbin/mdev > proc/sys/kernel/hotplug

mdev -s

 

echo "****************************************************"

echo " RootFS by NFS, s3c2410"

echo " Created by Jacky Xu @ 2008.7.13"

echo " Enjoy it!!!"

echo "****************************************************"

echo

 

8、创建一个空的mdev.conf文件,在挂载根文件系统时会用到的

[root@Sure etc]# touch mdev.conf

 

9、从本机拷贝passwd、shadow、group文件。

[root@Sure etc]# cp /etc/passwd .

[root@Sure etc]# cp /etc/shadow .

[root@Sure etc]# cp /etc/group .

修改passwd文件,把第一行和最后一行的bash修改成ash。

 

10、把busybox默认安装目录中的文件全部复制到这里的rootfs中。会发现多了linuxrc -> bin/busybox文件,这是挂载文件系统需要执行的。

[root@Sure etc]# cd ..

[root@Sure rootfs]# cp -Rfv /home/jacky/busybox-1.11.1/_install/ ./

 

OK,以上用busybox创建了一个基本的文件系统。

PS:

    如果编译busybox时选择动态库方式编译,则需要查看生成的busybox使用哪些动态库,然后把它们拷贝到rootfs/lib目录下。

[root@Sure lib]# arm-s3c2410-linux-gnu-readelf -d ../bin/busybox

Dynamic section at offset 0xc1014 contains 21 entries:

  Tag Type Name/Value

 0x00000001 (NEEDED) Shared library: [libm.so.6]

 0x00000001 (NEEDED) Shared library: [libc.so.6]

 0x0000000c (INIT) 0xc2ec

 0x0000000d (FINI) 0xa96b8

 0x00000004 (HASH) 0x80e8

 0x00000005 (STRTAB) 0xa4c4

 0x00000006 (SYMTAB) 0x8b64

 0x0000000a (STRSZ) 3505 (bytes)

 0x0000000b (SYMENT) 16 (bytes)

 0x00000015 (DEBUG) 0x0

 0x00000003 (PLTGOT) 0xd10e4

 0x00000002 (PLTRELSZ) 3112 (bytes)

 0x00000014 (PLTREL) REL

 0x00000017 (JMPREL) 0xb6c4

 0x00000011 (REL) 0xb674

 0x00000012 (RELSZ) 80 (bytes)

 0x00000013 (RELENT) 8 (bytes)

 0x6ffffffe (VERNEED) 0xb5a4

 0x6fffffff (VERNEEDNUM) 2

 0x6ffffff0 (VERSYM) 0xb276

 0x00000000 (NULL) 0x0

可以看出,使用了libm.so.6和libc.so.6两个库。发现只拷贝这两个库还不够,还需要ld-linux.so.2和libgcc_s.so.1,也就是我编译出来的这个busybox需要4个动态库文件。

# cp /opt/crosstool/arm-s3c2410-linux-gnu/sys-root/lib/libm.so.6 .

# cp /opt/crosstool/arm-s3c2410-linux-gnu/sys-root/lib/libc.so.6 .

# cp /opt/crosstool/arm-s3c2410-linux-gnu/sys-root/lib/ld-linux.so.2 .

# cp /opt/crosstool/arm-s3c2410-linux-gnu/lib/libgcc_s.so.1 .

这样,使用动态库可以节省一半左右的空间,不过效率有所降低。

 

三、测试

1、在本机修改/etc/export文件,重启NFS服务:

[root@Sure rootfs]# vim /etc/exports

/home/jacky/root-s3c2410/rootfs 192.168.1.*(rw,sync,no_root_squash)

[root@Sure rootfs]# service nfs restart

 

2、在Bootloader中传递以下参数给Kernel:

root=/dev/nfs rw nfsroot=192.168.1.249:/home/jacky/root-s3c2410/rootfs ip=192.168.1.199:192.168.1.249:192.168.1.1:255.255.255.0:Jacky:eth0:off console=ttySAC0,115200 init=/linuxrc noinitrd

 

3、启动目标板,串口输出显示根文件系统已经加载成功:

Boot Parameters: root=/dev/nfs rw nfsroot=192.168.1.249:/home/jacky/root-s3c2410/rootfs ip=192.168.1.199:192.168.1.249:192.168.1.1:255.255.255.0:Jacky:eth0:off console=ttySAC0,115200 init=/linuxrc noinitrd

Now, booting Linux...

Uncompressing Linux........................................................................................................... done, booting the kernel.

Linux version 2.6.24.7 (root@Sure) (gcc version 4.2.1) #5 Sat Jul 12 17:26:16 CST 2008

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177

Machine: SMDK2410

ATAG_INITRD is deprecated; please update your bootloader.

Memory policy: ECC disabled, Data cache writeback

CPU S3C2410A (id 0x32410002)

S3C2410: core 200.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz

S3C24XX Clocks, (c) 2004 Simtec Electronics

CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on

CPU0: D VIVT write-back cache

CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256

Kernel command line: root=/dev/nfs rw nfsroot=192.168.1.249:/home/jacky/root-s3c2410/rootfs ip=192.168.1.199:192.168.1.249:192.168.1.1:255.255.255.0:Jacky:eth0:off console=ttySAC0,115200 init=/linuxrc noinitrd

irq: clearing subpending status 00000003

PID hash table entries: 256 (order: 8, 1024 bytes)

timer tcon=00000000, tcnt a2c1, tcfg 00000200,00000000, usec 00001eb8

Console: colour dummy device 80x30

console [ttySAC0] enabled

Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)

Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)

Memory: 64MB = 64MB total

Memory: 61440KB available (3048K code, 314K data, 128K init)

Mount-cache hash table entries: 512

CPU: Testing write buffer coherency: ok

net_namespace: 64 bytes

NET: Registered protocol family 16

S3C2410 Power Management, (c) 2004 Simtec Electronics

S3C2410: Initialising architecture

S3C24XX DMA Driver, (c) 2003-2004,2006 Simtec Electronics

DMA channel 0 at c4800000, irq 33

DMA channel 1 at c4800040, irq 34

DMA channel 2 at c4800080, irq 35

DMA channel 3 at c48000c0, irq 36

usbcore: registered new interface driver usbfs

usbcore: registered new interface driver hub

usbcore: registered new device driver usb

Bluetooth: Core ver 2.11

NET: Registered protocol family 31

Bluetooth: HCI device and connection manager initialized

Bluetooth: HCI socket layer initialized

NET: Registered protocol family 2

IP route cache hash table entries: 1024 (order: 0, 4096 bytes)

TCP established hash table entries: 2048 (order: 2, 16384 bytes)

TCP bind hash table entries: 2048 (order: 1, 8192 bytes)

TCP: Hash tables configured (established 2048 bind 2048)

TCP reno registered

NetWinder Floating Point Emulator V0.97 (double precision)

JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc.

JFS: nTxBlock = 480, nTxLock = 3840

io scheduler noop registered

io scheduler anticipatory registered (default)

io scheduler deadline registered

io scheduler cfq registered

s3c2410-lcd s3c2410-lcd: no platform data for lcd, cannot attach

s3c2410-lcd: probe of s3c2410-lcd failed with error -22

lp: driver loaded but no devices found

ppdev: user-space parallel port driver

Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled

s3c2410-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410

s3c2410-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410

s3c2410-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410

RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize

loop: module loaded

Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410)

eth0: CS8900A rev E at 0xe0000300 irq=53, addr: 00: 0:3E:26:0A: 0

Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2

ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx

S3C24XX NAND Driver, (c) 2004 Simtec Electronics

s3c2410-nand s3c2410-nand: Tacls=3, 30ns Twrph0=7 70ns, Twrph1=3 30ns

NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)

Scanning device for bad blocks

Creating 5 MTD partitions on "NAND 64MiB 3,3V 8-bit":

0x00000000-0x00100000 : "Bootloader"

0x00100000-0x00400000 : "Kernel"

0x00400000-0x03400000 : "Root"

0x03400000-0x03fe0000 : "ExtRoot"

0x03fe0000-0x04000000 : "Param"

usbmon: debugfs is not available

s3c2410-ohci s3c2410-ohci: S3C24XX OHCI

s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1

s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000

usb usb1: configuration #1 chosen from 1 choice

hub 1-0:1.0: USB hub found

hub 1-0:1.0: 2 ports detected

mice: PS/2 mouse device common for all mice

S3C24XX RTC, (c) 2004,2006 Simtec Electronics

s3c2410-i2c s3c2410-i2c: slave address 0x10

s3c2410-i2c s3c2410-i2c: bus frequency set to 390 KHz

s3c2410-i2c s3c2410-i2c: i2c-0: S3C I2C adapter

S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics

s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled

TCP cubic registered

NET: Registered protocol family 1

NET: Registered protocol family 17

RPC: Registered udp transport module.

RPC: Registered tcp transport module.

drivers/rtc/hctosys.c: unable to open rtc device (rtc0)

IP-Config: Complete:

      device=eth0, addr=192.168.1.199, mask=255.255.255.0, gw=192.168.1.1,

     host=Jacky, domain=, nis-domain=(none),

     bootserver=192.168.1.249, rootserver=192.168.1.249, rootpath=

Looking up port of RPC 100003/2 on 192.168.1.249

Looking up port of RPC 100005/1 on 192.168.1.249

VFS: Mounted root (nfs filesystem).

Freeing init memory: 128K

init started: BusyBox v1.11.1 (2008-07-13 14:46:21 CST)

starting pid 789, tty '': '/etc/init.d/rcS'

Processing etc/init.d/rc.S

  Mount all

  Start mdev....

****************************************************

              RootFS by NFS, s3c2410

         Created by Jacky Xu @ 2008.7.13

                   Enjoy

****************************************************

 

starting pid 793, tty '': '-/bin/sh'

Processing /etc/profile

  Set search library path

  Set user path

  Set PS1

All

 

[root@Jacky /]# ls

bin dev home linuxrc proc sbin tmp var

boot etc lib mnt root sys usr

[root@Jacky /]#

 

已经直接进入了nfs文件系统!

 

 

<think>我们有两个主要问题:1.解决u-boot编译时缺少gnutls/gnutls.h头文件的错误;2.在安装busybox1.36.1制作rootfs文件。对于第一个问题:缺少gnutls/gnutls.h这个头文件属于gnutls开发包,通常在Linux系统中可以通过包管理器安装。由于u-boot的某些功能(如网络相关)可能依赖这个库,所以需要安装对应的开发包。对于第二个问题:制作rootfs在引用[1]中,我们注意到编译后会生成rootfs.ext2和rootfs.ext4等文件,说明制作rootfs是构建过程的一部分。通常,制作rootfs包括:-使用busybox安装基本的命令到目标目录(例如,通过`makeinstall`将busybox安装到某个目录,如`_install`)。-创建必要的目录结构(dev,proc,sys,etc,bin,sbin,usr,lib等)。-添加必要的配置文件(如inittab、rcS等,这些在busybox的examples目录下有示例)。-使用工具(如genext2fs,mkfs.ext4等)将目录制作成镜像文件。根据引用[2],我们还可以通过NFS挂载rootfs进行测试,但在制作阶段我们主要关注如何生成镜像文件。现在,结合引用[4],我们还注意到在OpenWrt中有自动挂载的配置,但是我们在制作rootfs时不需要考虑这些,除非我们的rootfs是为OpenWrt准备的。不过,这里我们制作通用的rootfs。详细步骤:问题1:缺少gnutls/gnutls.h解决方案:在Ubuntu/Debian系统上,可以安装libgnutls28-dev包:```bashsudoapt-getinstalllibgnutls28-dev```在其他Linux发行版上,包名可能略有不同(例如Fedora上可能是gnutls-devel)。问题2:制作rootfs(以ext4格式为例)的步骤:1.编译并安装busybox1.36.1:```bashmakedefconfigmakemenuconfig#可选,进行配置,比如选择静态链接,这样就不需要额外拷贝库文件make-j$(nproc)makeinstall```这会在busybox目录下生成`_install`目录,里面包含基本的命令。2.创建rootfs目录结构:```bash#假设我们在当前目录下创建rootfs目录mkdirrootfscdrootfscp-r../busybox-1.36.1/_install/*.mkdir-pdevprocsysetc/init.dtmplibusr/lib```3.创建init脚本(例如`etc/inittab`)和启动脚本(例如`etc/init.d/rcS`):-`etc/inittab`示例:```::sysinit:/etc/init.d/rcS::askfirst:-/bin/sh::ctrlaltdel:/sbin/reboot::shutdown:/sbin/swapoff-a::shutdown:/bin/umount-a-r::restart:/sbin/init```-`etc/init.d/rcS`示例(需添加可执行权限):```bash#!/bin/shmount-tprocproc/procmount-tsysfssysfs/sysmount-ttmpfstmpfs/tmp#其他挂载或启动任务echo"StartingrcS..."```然后设置可执行权限:`chmod+xetc/init.d/rcS`4.如果使用动态链接,需要将工具链的库文件拷贝到rootfs的lib目录(例如`lib/`)。如果是静态编译busybox,则可以省略。5.使用工具生成ext4镜像:```bash#假设rootfs目录在当前目录的rootfs,生成大小为128MB的ext4镜像genext2fs-drootfs-b131072-Urootfs.ext2#使用genext2fs创建ext2(也可以转成ext4)#或者使用mkfs.ext4mkdir-pimagesddif=/dev/zeroof=images/rootfs.ext4bs=1Mcount=128mkfs.ext4images/rootfs.ext4sudomount-oloopimages/rootfs.ext4/mntsudocp-rrootfs/*/mnt/sudoumount/mnt```另外,引用[3]中提到了lxc容器的配置,这与我们的rootfs制作关系不大,但注意在配置容器时可能需要类似的rootfs目录结构。因此,总结回答:针对缺少gnutls/gnutls.h的问题,安装对应的开发包。针对制作rootfs,按照上述步骤构建目录结构,添加配置,然后使用工具制作成镜像。注意:在制作rootfs时,确保busybox是静态编译(在配置中选择“Buildstaticbinary(nosharedlibs)”),这样就不需要额外拷贝库文件,简化过程。最后,引用[1]中提到的编译后会生成rootfs.ext2和rootfs.ext4,可能是构建系统自动完成了上述步骤(比如使用Buildroot或Yocto等构建系统),但用户是手动编译busybox,所以需要手动制作。相关问题:§§相关问题§§1.如何配置busybox以静态编译?2.rootfs中还需要哪些必要的配置文件?3.如何为嵌入式系统设置自动挂载(如引用[4]中的mdev配置)?4.如何通过NFS挂载rootfs进行调试(如引用[2]所示)?</think> ### 解决u-boot编译缺少gnutls/gnutls.h问题 #### 原因分析 该错误表明系统缺失**GnuTLS开发库**。GnuTLS是用于实现SSL/TLS协议的安全通信库,u-boot在启用加密功能(如HTTPS引导)时需要该库[^1]。 #### 解决方案 1. **安装GnuTLS开发包**(以Ubuntu为例) ```bash sudo apt-get update sudo apt-get install libgnutls28-dev # 安装开发头文件和库 ``` - 其他发行版对应包名: - Fedora/CentOS: `gnutls-devel` - Arch: `gnutls` 2. **重新配置u-boot** ```bash make distclean # 清理旧配置 make <your_board>_defconfig # 使用目标板配置文件 make menuconfig # 检查加密功能配置 ``` - 验证`CONFIG_FIT_SIGNATURE`和`CONFIG_CMD_LOAD_OTP`等加密相关选项状态 3. **验证安装** ```bash ls /usr/include/gnutls/gnutls.h # 确认头文件存在 ``` 4. **重新编译** ```bash make all CROSS_COMPILE=arm-linux-gnueabihf- # 替换为你的交叉编译器 ``` > 📌 注:若仍报错,检查交叉编译器是否包含GnuTLS支持(通过`arm-linux-gnueabihf-gcc -v`查看库路径) --- ### 制作Busybox 1.36.1 rootfs步骤 #### 准备工作 1. **编译Busybox** ```bash make menuconfig # 设置静态编译: Settings → Build static binary make -j$(nproc) make CONFIG_PREFIX=./rootfs install # 安装到rootfs目录 ``` #### 构建rootfs结构 ```bash cd rootfs mkdir -p dev etc/init.d proc sys tmp lib/modules usr/bin usr/sbin ``` #### 添加关键文件 1. **创建init脚本** (`sbin/init`) ```bash #!/bin/sh mount -t proc proc /proc mount -t sysfs sysfs /sys echo "Welcome to MyRootFS!" exec /bin/sh chmod +x sbin/init ``` 2. **配置inittab** (`etc/inittab`) ```ini ::sysinit:/etc/init.d/rcS ::respawn:/sbin/getty -L ttyAMA0 115200 vt100 # 串口登录 ``` 3. **启动脚本** (`etc/init.d/rcS`) ```bash #!/bin/sh /bin/mount -a echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s chmod +x etc/init.d/rcS ``` #### 生成文件系统镜像 1. **EXT4格式镜像** ```bash dd if=/dev/zero of=rootfs.ext4 bs=1M count=128 # 创建128MB镜像 mkfs.ext4 rootfs.ext4 sudo mount -o loop rootfs.ext4 /mnt sudo cp -r rootfs/* /mnt sudo umount /mnt ``` 2. **兼容u-boot的镜像**(参考[1]) ```bash mkimage -A arm -O linux -T ramdisk -C gzip \ -d rootfs.ext4 uRamdisk # 生成u-boot可加载的ramdisk ``` #### 验证方式 1. **QEMU测试** ```bash qemu-system-arm -M versatilepb -kernel zImage \ -dtb stm32mp157c-myir.dtb \ -append "root=/dev/ram0" \ -initrd uRamdisk ``` 2. **开发板加载**(参考[2][4]) 将镜像放入`output/images/`,通过tFTP/NFS引导系统 > 💡 关键配置: > - 静态编译Busybox避免库依赖问题[^2] > - 通过`mdev`实现设备节点自动创建(参考[4]的mdev配置) > - 对齐u-boot的ramdisk要求(镜像类型/压缩格式)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值