PXE高效批量网络装机

系统装机的三种引导方式

1.硬盘

2.光驱(u盘)

3.网络启动 pxe

系统安装过程

  • 加载boot loader

Boot Loader 是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境

  • 加载启动安装菜单

  • 加载内核和initrd系统(文件才能使用文件)

  • 加载根系统()

  • 运行anaconda的安装向导

Linux安装光盘的安装相关文件

在系统光盘的isolinux目录下有和安装相关的文件

  • boot.cat: 相当于grub的第一阶段

  • isolinux.bin:光盘引导程序,在mkisofs的选项中需要明确给出文件路径,这个文件属于SYSLINUX项目

  • isolinux.cfg:启动菜单的配置文件,当光盘启动后(即运行isolinux.bin),会自动去找isolinux.cfg文件

  • vesamenu.c32:是光盘启动后的启动菜单图形界面,也属于SYSLINUX项目,menu.c32提供纯文本的菜单

  • memtest:内存检测程序

  • splash.png:光盘启动菜单界面的背景图

  • vmlinuz:是内核映像

  • initrd.img:ramfs文件(精简版的linux系统,文件系统驱动等)

准备四大文件:内核vmlinuz、驱动initrd.img/:精简版

1、什么是PXE

PXE 的全称是 preboot execute environment它其实是Intel在很久以前提出来的一项用于通过网络来引导系统的标准。允许客户机通过网络从远程服务器上下载引导镜像,并加载安装文件或者整个操作系统。

pxe是通过网卡引导启动

1.1实现的硬件条件

1.BIOS支持

2.网卡支持(现在基本都已支持)

3.需要在bios中开启开关,服务器一般没打开(bmc界面里打开)

4.网络中有一台 DHCP 服务器以便为客户机自动分配地址、指定引导文件位置 网卡自带DHCP功能 dhcp 指明分配的ip地址

5.服务器通过 tftp服务(简单文件传输协议)来提供系统内核和引导镜像的下载 udp()协议 网卡自带这个功能(不支持其他的远程共享服务)

自带的站点(/var/lib/tftp?) initrd.img(驱动) vmlinuz(内核) pxelinux.cfg/default(引导文件) pxelinux.0(小型的grub程序) tftp 指明?

2、实现过程讲解

1.网卡需要查找相关的dhcp服务器(获取地址时间)

2.找到后dhcp服务器提供ip地址,和引导程序(boot loader)的地址 还提供给客户机TFTPserver地址(dhcp本身不提供tftp服务)

3.网卡使用tftp客户端吧引导程序加载到内存中来

4.bios执行引导程序

5.引导程序会去TFTP去查找配置文件

6.根据配置文件去引导安装系统

7.系统安装过程

3、搭建过程中服务详解

PXE 远程安装服务器集成了 CentOS 7 安装源、TFTP 服务、DHCP 服务,能 够向客户机裸机发送 PXE 引导程序、Linux 内核、启动菜单等数据,以及提供安装文件。

3.1 TFTP服务

TFTP(简单文件传输协议):内核和引导文件

是一种基于UDP协议实现的用于在客户机和服务器之间进行简单文件传输的协议,适合于小型文件传输的应用场合。TFTP服务默认由xinetd服务进行管理,使用UDP69端口。

3.2 vsftp

可以使用http ftp等方式,ftp文件传输的一种。

3.3 syslinux

syslinux是一个功能强大的引导加载程序,而且兼容各种介质。它的目的是简化首次安装Linux的时间,并建立修护或其它特殊用途的启动盘。它的安装很简单,一旦安装syslinux好之后,sysLinux启动盘就可以引导各种基于DOS的工具,以及MS-DOS/Windows或者任何其它操作系统。

pxelinux.0用于启动pxe

3.4 DHCP服务

分配IP地址,让客户机有能力联网

pxe是通过网卡引导启动、

网卡自带:IP地址、tftp软件功能

  • 请求IP地址

  • 返回IP地址和PXE文件位置

4、pxe优点

1.规模化:同时装配多台服务器 2.自动化:安装系统、配置各种服务 3.远程实现:不需要光盘、U盘等安装介质

5、操作过程

大概过程

  1. 分配给同一局域网内新加机器的地址(配置文件) dhcp 分配地址 指明tftp 服务器的地址

  2. tftp服务端开启udp,配置成默认关闭

  3. 安装syslinux取得pxelinux.0 文件

  4. 安装vsftpd服务挂载软件安装源(mount /dev/sr0 /var/ftp/centos7)

  5. 将四大文件拷入(/var/lib/tftpboot )

  • initrd.img

  • pxelinux.0(类似grub)

  • pxelinux.cfg/default(手写)

  • vmlinuz

6.将服务开启,关闭防火墙

具体操作步骤:

安装、关防火墙

  1. ##先全都安装一下
  2. [root@31yml ~]#yum install tftp-server vsftpd syslinux dhcp -y
  3. ##别忘了关闭防火墙
  4. [root@31yml ~]#systemctl stop firewalld
  5. [root@31yml ~]#setenforce 0

将配置文件模板复制到dhcp目录下

  1. ###
  2. [root@31yml ~]#cat /etc/dhcp/dhcpd.conf //提示你模板在哪
  3. #
  4. # DHCP Server Configuration file.
  5. # see /usr/share/doc/dhcp*/dhcpd.conf.example
  6. # see dhcpd.conf(5) man page
  7. #
  8. [root@31yml ~]#yum install dhcp -y
  9. [root@31yml ~]#cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf

  10. [root@31yml ~]#cd /etc/dhcp/
  11. [root@31yml dhcp]#ls
  12. dhclient.d dhclient-exit-hooks.d dhcpd6.conf dhcpd.conf scripts
  13. [root@31yml dhcp]#vim dhcpd.conf

  14. subnet 192.168.177.0 netmask 255.255.255.0 {
  15. range 192.168.177.10 192.168.177.50;
  16. option routers 192.168.177.2;
  17. next-server 192.168.177.100;
  18. filename "pxelinux.0";
  19. }
  20. [root@31yml dhcp]#systemctl start dhcpd
  21. ###
  22. [root@31yml dhcp]#yum install tftp-server.x86_64 -y
  23. [root@31yml dhcp]#rpm -ql tftp-server
  24. /etc/xinetd.d/tftp
  25. /usr/lib/systemd/system/tftp.service
  26. /usr/lib/systemd/system/tftp.socket
  27. /usr/sbin/in.tftpd
  28. /usr/share/doc/tftp-server-5.2
  29. /usr/share/doc/tftp-server-5.2/CHANGES
  30. /usr/share/doc/tftp-server-5.2/README
  31. /usr/share/doc/tftp-server-5.2/README.security
  32. /usr/share/man/man8/in.tftpd.8.gz
  33. /usr/share/man/man8/tftpd.8.gz
  34. /var/lib/tftpboot

拷贝

  1. ##安装tftp,装过也无碍
  2. [root@localhost isolinux]# yum install tftp-server -y
  3. [root@localhost isolinux]# rpm -ql tftp-server
  4. /etc/xinetd.d/tftp ##配置文件
  5. /usr/lib/systemd/system/tftp.service
  6. /usr/lib/systemd/system/tftp.socket
  7. /usr/sbin/in.tftpd
  8. /usr/share/doc/tftp-server-5.2
  9. /usr/share/doc/tftp-server-5.2/CHANGES
  10. /usr/share/doc/tftp-server-5.2/README
  11. /usr/share/doc/tftp-server-5.2/README.security
  12. /usr/share/man/man8/in.tftpd.8.gz
  13. /usr/share/man/man8/tftpd.8.gz
  14. /var/lib/tftpboot ##站点,四文件放置路径
  15. [root@31yml ~]#vim /etc/xinetd.d/tftp

  16. 1 # default: off
  17. 2 # description: The tftp server serves files using the trivial file transfer \
  18. 3 # protocol. The tftp protocol is often used to boot diskless \
  19. 4 # workstations, download configuration files to network-aware printers, \
  20. 5 # and to start the installation process for some operating systems.
  21. 6 service tftp
  22. 7 {
  23. 8 socket_type = dgram
  24. 9 protocol = udp
  25. 10 wait = yes
  26. 11 user = root
  27. 12 server = /usr/sbin/in.tftpd
  28. 13 server_args = -s /var/lib/tftpboot
  29. 14 disable = no
  30. 15 per_source = 11
  31. 16 cps = 100 2
  32. 17 flags = IPv4
  33. 18 }

  34. #每项详解
  35. service tftp
  36. {
  37. socket_type = dgram
  38. protocol = udp
  39. wait = no //wait no表示客户机可以多台一起连接,yes表示客户机只能一台一台连接,表示是否开启多线程一起工作,否则需要等待
  40. user = root
  41. server = /usr/sbin/in.tftpd
  42. server_args = -s /var/lib/tftpboot //指定TFTP根目录(引导文件的存储路径) -c允许上传
  43. disable = no //disable no表示开启TFTP服务
  44. per_source = 11 //通过限制一个主机的最大连接数,从而防止某个主机独占某个服务,这里每个IP地址的连接数是11个
  45. cps = 100 2 //表示服务器最多启动100个连接,如果达到这个数目将停止启动新服务2秒。在此期间不接受任何请求
  46. flags = IPv4
  47. }

拷贝pxelinux.0

  1. ##先安装软件,安装过也无碍
  2. [root@31yml ~]#yum install syslinux -y //引导程序文件需要先安装此服务
  3. [root@31yml ~]#rpm -ql syslinux |grep pxelinux.0 //安装完成后找到该文件的地址
  4. /usr/share/syslinux/gpxelinux.0
  5. /usr/share/syslinux/pxelinux.0
  6. [root@localhost isolinux]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ //拷贝到站点文件里

拷贝initrd.img与vmlinuz

配置pxelinux.cfg/default

  1. ##先安装软件,安装过也无碍
  2. [root@31yml ~]#yum install vsftpd -y
  3. [root@31yml ~]#rpm -ql vsftpd
  4. /etc/logrotate.d/vsftpd
  5. /etc/pam.d/vsftpd
  6. /etc/vsftpd
  7. /etc/vsftpd/ftpusers
  8. /etc/vsftpd/user_list
  9. /etc/vsftpd/vsftpd.conf
  10. /etc/vsftpd/vsftpd_conf_migrate.sh
  11. /usr/lib/systemd/system-generators/vsftpd-generator
  12. /usr/lib/systemd/system/vsftpd.service
  13. /usr/lib/systemd/system/vsftpd.target
  14. /usr/lib/systemd/system/vsftpd@.service
  15. /usr/sbin/vsftpd
  16. /usr/share/doc/vsftpd-3.0.2
  17. /usr/share/doc/vsftpd-3.0.2/AUDIT
  18. /usr/share/doc/vsftpd-3.0.2/BENCHMARKS
  19. /usr/share/doc/vsftpd-3.0.2/BUGS
  20. /usr/share/doc/vsftpd-3.0.2/COPYING
  21. /usr/share/doc/vsftpd-3.0.2/Changelog
  22. /usr/share/doc/vsftpd-3.0.2/EXAMPLE
  23. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE
  24. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/README
  25. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/README.configuration
  26. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf
  27. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.xinetd
  28. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD
  29. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/README
  30. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/README.configuration
  31. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/vsftpd.conf
  32. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG
  33. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/README
  34. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/README.configuration
  35. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/hosts.allow
  36. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/README
  37. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_HOSTS
  38. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_HOSTS/README
  39. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS
  40. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/README
  41. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/README.configuration
  42. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/logins.txt
  43. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/vsftpd.conf
  44. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/vsftpd.pam
  45. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS_2
  46. /usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS_2/README
  47. /usr/share/doc/vsftpd-3.0.2/FAQ
  48. /usr/share/doc/vsftpd-3.0.2/INSTALL
  49. /usr/share/doc/vsftpd-3.0.2/LICENSE
  50. /usr/share/doc/vsftpd-3.0.2/README
  51. /usr/share/doc/vsftpd-3.0.2/README.security
  52. /usr/share/doc/vsftpd-3.0.2/REWARD
  53. /usr/share/doc/vsftpd-3.0.2/SECURITY
  54. /usr/share/doc/vsftpd-3.0.2/SECURITY/DESIGN
  55. /usr/share/doc/vsftpd-3.0.2/SECURITY/IMPLEMENTATION
  56. /usr/share/doc/vsftpd-3.0.2/SECURITY/OVERVIEW
  57. /usr/share/doc/vsftpd-3.0.2/SECURITY/TRUST
  58. /usr/share/doc/vsftpd-3.0.2/SIZE
  59. /usr/share/doc/vsftpd-3.0.2/SPEED
  60. /usr/share/doc/vsftpd-3.0.2/TODO
  61. /usr/share/doc/vsftpd-3.0.2/TUNING
  62. /usr/share/doc/vsftpd-3.0.2/vsftpd.xinetd
  63. /usr/share/man/man5/vsftpd.conf.5.gz
  64. /usr/share/man/man8/vsftpd.8.gz
  65. /var/ftp
  66. /var/ftp/pub##

  67. [root@31yml ~]#cd /var/ftp/
  68. [root@31yml ftp]#mkdir centos7
  69. [root@31yml ftp]#mount /dev/sr0 /var/ftp/centos7/
  70. mount: /dev/sr0 写保护,将以只读方式挂载
  71. [root@31yml ftp]#cd centos7/
  72. [root@31yml centos7]#ls
  73. CentOS_BuildTag EULA images LiveOS repodata RPM-GPG-KEY-CentOS-Testing-7
  74. EFI GPL isolinux Packages RPM-GPG-KEY-CentOS-7 TRANS.TBL
  75. [root@31yml centos7]#cd images/
  76. [root@31yml images]#ls
  77. efiboot.img pxeboot TRANS.TBL
  78. [root@31yml images]#cd pxeboot/
  79. [root@31yml pxeboot]#ls
  80. initrd.img TRANS.TBL vmlinuz
  81. [root@31yml pxeboot]#cp initrd.img vmlinuz /var/lib/tftpboot/
  82. [root@31yml pxeboot]#cd /var/lib/tftpboot/
  83. [root@31yml tftpboot]#mkdir pxelinux.cfg
  84. [root@31yml tftpboot]#cd pxelinux.cfg/
  85. [root@31yml pxelinux.cfg]#vim default

  86. default linux
  87. timeout 600
  88. label linux
  89. kernel vmlinuz
  90. append initrd=initrd.img method=ftp://192.168.177.100/centos7
  91. label text
  92. kernel vmlinuz
  93. append text initrd=initrd.img method=ftp://192.168.177.100/centos7

  94. label rescue
  95. kernel vmlinuz
  96. append rescue initrd=initrd.img method=ftp://192.168.177.100/centos7

  97. ##关闭防火墙#启动程序
  98. [root@31yml tftpboot]#systemctl stop firewalld
  99. [root@31yml tftpboot]#systemctl start dhcpd
  100. [root@31yml tftpboot]#systemctl start tftp
  101. [root@31yml tftpboot]#systemctl start vsftpd

  1.  
问题:

如果客户机卡在这样的提示

表明,它没有获取到IP地址,找不到你配置的文件,我就是如此,发现是网关配错了,修改对后有后续了

如果出现过这样的信息,表明服务器防火墙没关,拒绝提供下载,一定要关。

6、kickstart无人值守安装

kickstart无人值守安装(脚本、自动化)

注意:CentOS 8,7,6 不同版本的kickstart文件格式不尽相同,不可混用

  1. [root@localhost tftpboot]#yum install system-config-kickstart -y
  2. #安装图形化工具

基本配置:

安装方法:

引导文件:

分区:

添加网卡

验证配置可以不用添加,防火墙配置可用直接禁用

取消图形化安装

保存

选择文件路径,在/var/ftp/下保存

再到终端里添加配置文件

  1. [root@31yml ~]#cd /var/ftp/
  2. [root@31yml ftp]#ls
  3. #查看应答文件
  4. centos7 ks.cfg pub
  5. [root@31yml ftp]#cd
  6. [root@31yml ~]#ls
  7. anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面

  8. [root@localhost ftp]#cd /var/lib/tftpboot/
  9. [root@localhost tftpboot]#ls
  10. initrd.img menu.c32 pxelinux.0 pxelinux.cfg vmlinuz
  11. [root@localhost tftpboot]#cd pxelinux.cfg
  12. [root@localhost pxelinux.cfg]#vim default
  13. #将应答文件 位置指明

  14. default menu.c32
  15. prompt 1

  16. label auto
  17. menu label Auto Install CentOS Linux ^7
  18. kernel vmlinuz
  19. append initrd=initrd.img method=ftp://192.168.100.100/centos7 ks=ftp://192.168.100.100/ks.cfg

  20. label text
  21. kernel vmlinuz
  22. append text initrd=initrd.img method=ftp://192.168.100.100/centos7


  23. label rescue
  24. kernel vmlinuz
  25. append rescue initrd=initrd.img method=ftp://192.168.100.100/centos7

之后再次启动虚拟机,就会自动安装并配置系统

PXE批量网络装机的更多相关文章

  1. 教你 PXE高效批量网络装机

    PXE高效批量网络装机一.PXE概述① PXE (Preboot eXcution Environment)② PXE批量部署的优点③ 服务端④ 客户端二.部署PXE远程安装服务搭建PXE远程安装服务 ...

  2. PXE高效批量网络装机

    PXE高效批量网络装机               一.PXE概述                1)PXE (Preboot eXcution Environment)               ...

  3. Linux网络第六章:PXE高效批量网络装机及kickstart无人值守安装

    目录 一.PXE基础知识 二.PXE使用服务 三.高效批量网络装机实操 1.环境准备 2.配置dhcpd服务 3.配置FTP服务 4.配置TFTP服务 5.配置kickstart无人值守 6.启动服务 ...

  4. Linux PXE无人值守网络装机

    Linux PXE无人值守网络装机 一.实验环境: 2台Linux系统(RHEL6.5版本),1台作为:PXE远程安装服务器(安装dhcp服务.ftp服务.tftp服务),另1台作为:客户端(未装RH ...

  5. DHCP\PXE+kickstart网络装机平台

    DHCP概述及原理: ​ DHCP地址分配的四次会话 ​ DISCOVERY -****OFFER -REQUEST -ACK 服务端基本概念: 租期:允许客户机组用IP地址的时间期限,单位为秒 作用 ...

  6. PXE高效能批量网络装机

    PXE简绍 PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器 ...

  7. 项目(三)PXE高效能批量网络装机

    PXE:预启动执行环境 PXE是由intel公司开发的网络引导技术,工作在Client/Server模式,允许客户机通过网络从远程服务器下载引导镜像,并加载安装文件或者整个操作系统. 若要搭建PXE网 ...

  8. Linux系统——PXE高效能批量网络装机

    PXE:Pre-boot Excution Environment,预启动执行环境,石油Intel公司开发的网络引导技术,工作在Client.Server模式,允许客户机通过网络从远程服务器下载阴道镜 ...

  9. Linux网络服务第六章PXE高效能批量网络装机

    1.IP地址配置 2.关闭防火墙以及selinux状态如下 systemctl  stop     firewalld Iptables -F Setenforce 0 三.部署FTP服务 1.安装F ...

  10. PXE+Kickstart网络装机(Centos6.5版本)

    1.原理说明: PXE Client:表示需要安装操作系统的机器,统称客户端: TFTP server:表示安装TFTPD服务的机器: DHCP server:表示安装DCHPD服务的机器: 在实际的 ...

随机推荐

  1. PDF书签的编辑器,基于(python、Tkinter)

    使用 脚本 在github下载源码. 安装python3 安装必要的python包 pip install numpy pip install pandas pip install PyMuPDF p ...

  2. IIS 应用程序池 PowerShell 脚本更改高级属性的方法

    ## IIS WebAdmin Module Import-Module WebAdministration $AppPool = "mqttService(8011)" $Sit ...

  3. 如何通过cookie、session鉴权(nodejs/koa)

    http是一种无状态的协议,每一个请求都是独立的,即使同一个页面向服务器发送多次请求,服务器也无法区分是不是同一用户,所以这个时候可以借助于cookie来做身份认证,当用户登录成功,服务器为浏览器设置 ...

  4. [nginx]日志中记录自定义请求头

    前言 假设在请求中自定义了一个请求头,key为"version",参数值为"1.2.3",需要在日志中捕获这个请求头. nginx日志配置 只需要用变量http ...

  5. vivo 场景下的 H5无障碍适配实践

    作者:vivo 互联网前端团队- Zhang Li.Dai Wenkuan 随着信息无障碍的建设越来越受重视,开发人员在无障碍适配中也遇到了越来越多的挑战.本文是笔者在vivo开发H5项目做无障碍适配 ...

  6. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-12-playwright操作iframe-中篇

    1.简介 按照计划今天就要用实际的例子进行iframe自动化测试.经过宏哥长时间的查找,终于找到了一个含有iframe的网页(QQ邮箱和163邮箱),别的邮箱宏哥就没有细看了.所以今天这一篇的主要内容 ...

  7. 带你读论文丨Fuzzing漏洞挖掘详细总结 GreyOne

    本文分享自华为云社区<[论文阅读] (03) 清华张超老师 - Fuzzing漏洞挖掘详细总结 GreyOne>,作者: eastmount. 一.传统的漏洞挖掘方法 演讲题目: 数据流敏 ...

  8. 《SQL与数据库基础》03. SQL-DML

    目录 DML 数据插入 数据删除 数据更新 本文以 MySQL 为例 DML 数据插入 给指定字段添加数据: INSERT INTO 表(字段1, 字段2, ......, 字段n) VALUES(值 ...

  9. Go之流程控制大全: 细节、示例与最佳实践

    本文深入探讨Go语言中的流程控制语法,包括基本的if-else条件分支.for循环.switch-case多条件分支,以及与特定数据类型相关的流程控制,如for-range循环和type-switch ...

  10. Gradle 设置全局镜像源

    复制 init.gradle.kts 文件到 Windows 的 %USERPROFILE%/.gradle 或者 Linux 的 ~/.gradle 目录下.也可以直接复制文末的代码为 init.g ...