day 19
day 19 笔记
1.什么是软件包
##什么是软件程序
软件程序就是程序员通过编程语言写好的一推代码,通过一些方式运行。比如通过编译后生成一个应用程序,称之为软件。
软件包就是将应用程序,配置文件和数据文件打包的产物。
是一个将二进制命令(程序源码,经过编译后的一个单个可执行命令产物)+配置文件+数据文件,打包好的一个单个文件,
例如 nginx_v.10.rpm
##以网站后端源代码为例
golang 编译型
golang这样的编译型语言,写完一推200行的后端代码,编译产生 ./start_go 这样的可执行命令。编译后的命令,看不到源码。
golang 代码写完,发给你的就是一些【 可执行命令 + 一推配置文件 + 数据文件 = Linux后端程序 】
python 解释型语言
python 代码写完了,发给你的基本是一个压缩包,里面是一推 python 源码( 文件夹 + .py文件)
这些是能够看到程序源码的,运维要做的就是 (python 源代码解压缩 + 一推配置文件 + 数据文件 ==python后端网站)
nginx 配置文件
/etc/nginx/nginx.conf 配置文件,写了用于控制该软件不哦那个功能的参数
Linux软件包
centos / redhats 下的 nginx 软件包 ———————————— nginx-1.10.rpm
ubutnu 下的 nginx 软件包 ———————————————————————— nginx1.10.deb
所有的linux发行版都采用了某种形式的软件包系统,这使得linux软件管理和在windows下一样方便,
suse、red hat、fedora,centos等发行版都是用rpm包
Debian和Ubuntu则使用nginx.deb格式的软件包。
mysql-5-3-4.rpm
redis-3-4-3.rpm
nginx2-3-2.rpm
在Windows中 qq.exe 网易云.exe wechat.exe
在macos中 qq.dmg
在Linux中 qq.rpm
2.Linux软件包格式
源码包
就是一大推源代码程序,是由程序员按照特定的格式和语法编写出来的。
##编辑型语言源码包
go 语言
如下一段源代码
[root@localhost ~]# vim golang.go
package mainimport
"fmt"func main() {
fmt.Println("Linux")
}
[root@localhost ~]# go run golang.go #用golang 运行这段代码
Linux
[root@localhost ~]# go build golang.go #编译这个代码文件
[root@localhost ~]# ls
anaconda-ks.cfg golang golang.go xin.py #生成了 golang 这个二进制可执行命令
[root@localhost ~]# ./golang #执行这个命令
Linux
[root@localhost ~]#
C 语言
未编译源码包一个纯 C 语言包 ———————— https://tengine.taobao.org/download/tengine-2.3.3.tar.gz
#########对运维来说,可以不提供该语言的环境在机器上,比如不用装go环境
##解释型语言源码包
如下的 python 代码
[root@localhost ~]# vim hello.py
#coding:utf-8
print("HelloWorld")
[root@localhost ~]# python hello.py
HelloWorld
像解释型语言源码包这样的需要在机器上配置好环境变量,如果没有配置变量,这个代码就运行不起来。
##脚本语言程序源码
脚本型语言,如python很容易出错,代码自上而下,一行一行的去翻译
用在快速开发上,比如测试开发,运维开发,自动化开发
比如网站开发
二进制包
二进制包,也就是源码包经过成功编译之后产生的包
已经编译好, centos 平台可以使用的 rpm 包。———————————— nginx-1.10.rpm
特殊的,很方便的二进制包,支持二进制包下载的某些软件———————— .tar.gz 格式 下载解压即可用
二进制源码包
mysql-community-5.7.25-.el7.src.rpm
下载后还需要自己再构建rpm 构建命令 rpm.rpmbuild
常见的二进制软件包格式
RedHat/Centos/Fedora/SUSE —————————————— 安装包文件后缀格式 .rpm (rpm包相关命令 rpm / rpbuild)
Ubuntu/Debian —————————————————— 安装包文件后缀格式 .deb (deb 包相关命令 dpkg / 在线安装 deb apt命令)
比如去下载 nginx 软件包,会看到很多复杂的格式
编译好的 rpm 包—————————————————— nginx-1.10.rpm
nginx源代码包———————————————————— nginx-2.3.3.tar.gz (纯 C 语言文件)
解压即用的nginx二进制包——————————— nginx-2.3.3-x86-64.tar.gz
rpm二进制包—————————————————————— nginx-el7-src.rpm
3.关于源代码编译的过程解释
1. 程序员写的代码,如 下代码,计算机是不认识的,只认识010101
print('hello world')
2.因此代码都是经过系统的一个编译器,进行,编译成机器语言,计算机才能执行的
比如有哪些编译器
c语言用的gcc编译器
golang语言用的golang编译器
上面这俩特点是,代码写完,需要用户,手动的进行 build ,将源码编译成一个二进制的命令(机器可识别的)
编译型语言,是吧上述所有代码,全部检测完毕后,生成另一个正确的二进制命令
代码写完后,编译器,自动可以检测出所有的语法问题,因此编译型语言不易出错
golang ,c c++ ,适用于开发系统级工具,比如 docker k8s
比如linux操作系统
python 语言解释型语言(python编译器)
python一遍翻译程序员写的代码,一遍编译成机器认识的机器与语言
xxxxxxxxxxxxx ===============
xxxxxxxxxxxxx ===============
xxxxxxxxxxxxx ====代码出错了,程序直接崩溃
xxxxxxxxxxxxx
脚本型语言,如python很容易出错,代码自上而下,一行一行的去翻译
用在快速开发上,比如测试开发,运维开发,自动化开发
比如网站开发
4.体验编译过程和解释过程
编译型过程
下载编译器,入门golang 写代码,写golang先得有编译器
golang.xx.rpm安装包
yum install golang -y
# 程序源码如下
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
## 可以用两种方式去运行这个代码
如果不编译,就必须要求机器上得存在对应的编译器
[root@localhost ~]# go run Hello.go #不生成二进制命令,直接底层编译后执行,看到效果
hello world
[root@localhost ~]# go build Hello.go #编译命令,生成二进制命令,源代码已经被写入到这个文件
[root@localhost ~]#
[root@localhost ~]# ls
Hello Hello.go #生成了对应的 二进制命令
[root@localhost ~]#
[root@localhost ~]# ./Hello #直接执行此命令
hello world
[root@localhost ~]#
编译的好处在于该二进制命令,现在丢给任意的一个Linux系统是 64 位架构的机器上,可以直接运行。
一次编译,到处运行(这也是 docker 的理念)
解释型过程
在Linux上要用到两个语言 bash python3
yum install python3 python3-devel -y
[root@localhost ~]# cat hello.py
print("你好 世界")
python 想运行程序,必须要解释其存在机器上,然后才能执行
# python3 是可以处理中文的
[root@localhost ~]# python3 hello.py
你好 世界
# python2 是不能处理中文的
[root@localhost ~]# python hello.py
File "hello.py", line 1
SyntaxError: Non-ASCII character '\xe4' in file hello.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
[root@localhost ~]#
用python的公司必须要求你在 Linux 机器上安装好这个环境,程序员写的 python 代码才能运行
5.编译和rpm报的区别
二进制包——————不需要从源代码再编译了,拿来即用,安装简单,但是程序安装路径受限,可定制性很差。
源代码包——————需要编译后使用,安装难度大,定制化很强。
可以在编译过程中,指定开启20个功能,以及日志,配置文件,安装的路径均可自定义
6.RPM 包安装管理命令
# 在线下载 rpm 包
很多软件的官网,以及第三方软件仓库,会提供 rpm 的下载功能
http://rom.pbone.net/
www.rpomfind.net
更好的,更精准的官网下载
http://nginx.org/packages/
下载对应架构的 rpm 包
http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.10.0-1.el7.ngx.x86_64.rpm
# rpm 命令的参数及实际应用
-ivh 安装包
[root@localhost opt]# rpm -vih vim-enhanced-7.4.160-4.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:vim-enhanced-2:7.4.160-4.el7 ################################# [100%]
-qi 查看软件详细信息
[root@localhost ~]# rpm -qi vim-enhanced
Name : vim-enhanced
Epoch : 2
Version : 7.4.160
Release : 4.el7
Architecture: x86_64
Install Date: Sat 26 Mar 2022 04:30:06 AM CST
Group : Applications/Editors
Size : 2296714
License : Vim
Signature : RSA/SHA256, Wed 25 Apr 2018 07:50:34 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : vim-7.4.160-4.el7.src.rpm
Build Date : Wed 11 Apr 2018 07:55:09 AM CST
Build Host : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://www.vim.org/
Summary : A version of the VIM editor which includes recent enhancements
Description :
VIM (VIsual editor iMproved) is an updated and improved version of the
vi editor. Vi was the first real screen-based editor for UNIX, and is
still very popular. VIM improves on vi by adding new features:
multiple windows, multi-level undo, block highlighting and more. The
vim-enhanced package contains a version of VIM with extra, recently
introduced features like Python and Perl interpreters.
Install the vim-enhanced package if you'd like to use a version of the
VIM editor which includes recently added enhancements like
interpreters for the Python and Perl scripting languages. You'll also
need to install the vim-common package.
[root@localhost ~]#
-qa 查看软件是否安装
[root@localhost ~]# rpm -qa vim-enhanced
vim-enhanced-7.4.160-4.el7.x86_64
[root@localhost ~]#
-e 卸载软件
[root@localhost opt]# rpm -e vim-enhanced
-qf 查询软件包
[root@localhost ~]# rpm -qf /etc/profile.d/vim.sh
vim-enhanced-7.4.160-4.el7.x86_64
-ql 查看安装软件生成那些文件
[root@localhost ~]# rpm -ql vim-enhanced
/etc/profile.d/vim.csh
/etc/profile.d/vim.sh
/usr/bin/rvim
/usr/bin/vim
/usr/bin/vimdiff
/usr/bin/vimtutor
[root@localhost ~]#
-Uvh 升级安装的软件
[root@localhost opt]# rpm -Uvh firefox-52.7.3-1.el7_5.x86_64.rpm 警告:firefox-52.7.3-1.el7_5.x86_64.rpm: 头V4 DSA/SHA1 Signature, 密钥 ID 192a7d7d: NOKEY准备中... ################################# [100%]正在升级/安装... 1:firefox-52.7.3-1.el7_5 ################################# [ 50%]正在清理/删除... 2:firefox-52.7.0-1.el7.centos ################################# [100%]
# 注意 #
如果软件升级的版本过大,里面可能会涉及很多的功能更新,说白了就是要再装一推 rpm 包,无法手动管理
如果是小版本的升级涉及的依赖就会很少。
#本地光盘镜像 rpm 包
centons7-ios 镜像文件,内置了绝大多数软件的 rpm 包
1. 光盘插入服务器光驱
2. 在系统中找到光盘信息—————————————————— lsblk 命令
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
└─centos-root 253:0 0 19G 0 lvm /
sr0 11:0 1 4.2G 0 rom #目前是未挂载状态
[root@localhost ~]#
3. 挂载,读取到关盘内容—————————————————— mount 命令
[root@localhost ~]# mount /dev/sr0 /mnt
mount: /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
└─centos-root 253:0 0 19G 0 lvm /
sr0 11:0 1 4.2G 0 rom /mnt #当前已经挂载到 /mnt 目录
[root@localhost ~]#
4. 查看光盘中的 rpm 包
[root@localhost ~]# ls /mnt/Packages/ #这个目录下有大量的 rpm 包,找到想要安装的包,安装即可
5. 例如安装 vim 命令
## 卸载原有的 vim
yum remove vim -y
## 拷贝光盘中的 vim 然后去安装
### 先看看这个目录下的 vim 包
[root@localhost Packages]# ls | grep 'vim'
vim-common-7.4.160-4.el7.x86_64.rpm
vim-enhanced-7.4.160-4.el7.x86_64.rpm
vim-filesystem-7.4.160-4.el7.x86_64.rpm
vim-minimal-7.4.160-4.el7.x86_64.rpm
vim-X11-7.4.160-4.el7.x86_64.rpm
### 把这些包都拷贝到 /opt 下去安装
[root@localhost Packages]# cp vim* /opt
[root@localhost Packages]#
[root@localhost Packages]# cd /opt
[root@localhost opt]# ls
vim-common-7.4.160-4.el7.x86_64.rpm
vim-enhanced-7.4.160-4.el7.x86_64.rpm
vim-filesystem-7.4.160-4.el7.x86_64.rpm
vim-minimal-7.4.160-4.el7.x86_64.rpm
vim-X11-7.4.160-4.el7.x86_64.rpm
### 去安装 vim 的包
[root@localhost opt]# rpm -ivh vim-minimal-7.4.160-4.el7.x86_64.rpm
Preparing... ################################# [100%]
package vim-minimal-2:7.4.160-4.el7.x86_64 is already installed
[root@localhost opt]# rpm -ivh vim-filesystem-7.4.160-4.el7.x86_64.rpm
Preparing... ################################# [100%]
package vim-filesystem-2:7.4.160-4.el7.x86_64 is already installed
[root@localhost opt]#
[root@localhost opt]# rpm -ivh vim-common-7.4.160-4.el7.x86_64.rpm
Preparing... ################################# [100%]
package vim-common-2:7.4.160-4.el7.x86_64 is already installed
[root@localhost opt]# rpm -vih vim-enhanced-7.4.160-4.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:vim-enhanced-2:7.4.160-4.el7 ################################# [100%]
6. 最后取消光盘挂载
## 取消挂载命令—————————————————— umount 命令
[root@localhost ~]# umount /mnt
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
└─centos-root 253:0 0 19G 0 lvm /
sr0 11:0 1 4.2G 0 rom
用 rpm 安装的时候会存在依赖报错的问题,需要手动去解决依赖关系
关于 rpm 安装解决依赖关系
通过 yum 安装的 vim ,这个 vim 是去阿里云 rpm 仓库拿来的版本,要比本地光盘中的更新
通过 yum 安装的 vim ,版本的依赖版本都比本地光盘的新
通过 yum remmove vim -y 卸载后,没有完全卸载,它的一些依赖关系,版本可能还是新的,需要再次卸载
rpm 的依赖冲突,一定要是一层一层去解决,不能跳级,也就是依赖说少了哪个软件,就装哪个软件。
7.源码包安装管理命令
1.源码安装 nginx 工具,编译安装淘宝 nginx
## 下载源码包
[root@localhost ~]# wget https://tengine.taobao.org/download/tengine-2.3.0.tar.gz
## Linux编译环境准备
yum install -y gcc make gcc-c++ ncurses-devel # 用于编译安装 C 语言代码
yum install golang -y # 用于编译 golang 代码环境
## 解压缩进行编译安装
[root@localhost opt]# tar -zxf tengine-2.3.0.tar.gz
[root@localhost opt]# cd tengine-2.3.0
开始编译安装要注意先进行编译参数的配置。给nginx添加支持https证书的功能(nginx 默认是不支持 https 协议的)
只能在编译的时候添加这个功能
## 下载 https 协议
[root@localhost tengine-2.3.0]# yum -y install openssl openssl-devel pcre pcre-devel zlib zlib-devel
## 执行编译参数,安装nginx可以扩展其他功能
[root@localhost tengine-2.3.0]# ./configure --prefix=/opt/my_tenginx/ --with-http_ssl_module
## 开始编译安装 (make&&make install 当 make 命令执行后,自动执行 make install 命令)
[root@localhost tengine-2.3.0]# make&&make install
只有在 make install 成功后才会生成指定的 nginx 路径 /opt/my_tenginx 文件夹
## 检查安装的 nginx 是否生成,编译安装的 nginx 全部在这个目录下了
[root@localhost ~]# cd /opt/my_tenginx/
[root@localhost my_tenginx]# ls
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
[root@localhost my_tenginx]#
## 可以用该目录下的二进制 nginx 命令,启动淘宝 nginx 了
[root@localhost tengine-2.3.0]#
[root@localhost my_tenginx]# cd sbin
[root@localhost sbin]# ls
nginx
[root@localhost sbin]# ./nginx
## 把启动命令添加到环境变量中
[root@localhost ~]# vim /etc/profile
PATH=/opt/my_tenginx/sbin/:$PATH # $PATH 在原本 PATH 变量基础上添加新的环境变量
## 还有个命令可以验证该 nginx 信息
[root@localhost ~]# /usr/sbin/nginx -v # 查看 nginx 版本号
nginx version: nginx/1.20.1
[root@localhost ~]# curl -I 192.168.0.122
HTTP/1.1 200 OK
Server: Tengine/2.3.0
Date: Sat, 26 Mar 2022 21:46:32 GMT
Content-Type: text/html
Content-Length: 555
Last-Modified: Fri, 25 Mar 2022 21:22:29 GMT
Connection: keep-alive
ETag: "623e3295-22b"
Accept-Ranges: bytes
## 升级编译安装的软件
删除旧的,重新编译新的
## 删除编译安装的软件
1.直接删除编译安装的指定目录即可 rm -rf /opt/my_tenginx
2.清楚PATH变量
8.解压即用软件包
就是一个已经编译好的二进制命令,拿来用就好了
给机器部署 Java 环境,选择下载 Java 的二进制包,解压即用
1. 下载二进制Java压缩包
[root@localhost ~]# wget http://yuchaoit.cn/jdk-8u221-linux-x64.tar.gz
[root@localhost ~]# mv jdk-8u221-linux-x64.tar.gz /opt
2. 解压缩包
[root@localhost opt]# tar -zxf jdk-8u221-linux-x64.tar.gz
## 配置环境变量
(1) 创建软连接
[root@localhost opt]# ln -s /opt/jdk1.8.0_221/ /opt/jdk
(2) 配置Java环境
[root@localhost opt]# vim /etc/profile
export JAVA_HOME=/opt/jdk
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/my_python3-9-11//bin://opt/my_tenginx/sbin:/opt/jdk/bin
(3) 退出重新登陆加载环境变量
3. 验证Java是否可用
[root@localhost opt]# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
[root@localhost opt]#
4. 准备一段Java代码 验证环境是否可用
需要注意的是 创建的 Java 文件名要和代码中的名字一致 (即 public class 后边跟的名字)
[root@localhost opt]# vim HelloWorld.java
public class HelloWorld {
public static void main(String []args) {
System.out.println("超哥带你学linux");
}
}
5. 编译这个代码 (命令 javac + 文件名)
[root@localhost opt]# javac HelloWorld.java
[root@localhost opt]#
[root@localhost opt]#
[root@localhost opt]# ls
HelloWorld.class jdk1.8.0_221 my_tenginx Python-3.9.11.tgz
HelloWorld.java jdk-8u221-linux-x64.tar.gz nginx-1.10.0-1.el7.ngx.x86_64.rpm tengine-2.3.0
jdk my_python3-9-11 Python-3.9.11 tengine-2.3.0.tar.gz
6. 运行代码 (命令 java + 文件名没有后缀的)
[root@localhost opt]# java HelloWorld
超哥带你学linux
[root@localhost opt]#
由于 Java 比较特殊,必须配置Linux的环境变量才可以使用
如果是 golang 只需要直接解压缩,把命令加入到 PATH 变量即可快速使用
9.yum自动化软件管理命令
使用 yum 工具配置 yum 源即可。
yum源的配置官网 https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b11oJtGAH
## 配置两个源
(1) 能够下载centos自带的绝大多数软件
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
(2) 能够下载绝大多数第三方软件的仓库
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
## 配置源之前需要显备份默认的 yum 仓库配置文件
(1) 进入 yum 源默认的配置文件目录,备份所有的 *.repo 文件即可
[root@localhost ~]# cd /etc/yum.repos.d/ #yum 默认配置文件目录
[root@localhost yum.repos.d]# mv ./*.repo bak_repos.d/
(2) 下载新的 yum 仓库文件
[root@localhost yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
## 看到文件目录结构
[root@localhost yum.repos.d]# ll
total 8
drwxr-xr-x. 2 root root 187 Mar 26 01:02 bak_repos.d
-rw-r--r--. 1 root root 2523 Dec 26 2020 CentOS-Base.repo
-rw-r--r--. 1 root root 664 Dec 26 2020 epel.repo
[root@localhost yum.repos.d]#
## 更新 yum 缓存
[root@localhost yum.repos.d]# yum clean all #删除原缓存
[root@localhost yum.repos.d]# yum makecache #更新新的缓存
## 可以自动化管理机器上 rpm 安装的软件
## yum 常见命令
yum install # 安装某文件
yum remove # 删除某文件
通过 yum 安装的程序,可以通过 systemctl 去管理启停操作如:
systemctl statr nginx
10.安装软件注意事项
安装方式有三种
1. rpm手动安装
手动解决所有依赖,比较难用
2. yum自动安装
yum就是去管理 rpm包的,自动解决依赖关系
3. 源码编译安装
软件都装到一个目录下,管理该目录即可,无法用 yum去管理
需要注意他们的安装路径以及管理脚本是否会发生冲突。所以要注意机器上的程序是通过上面哪一种方式安装的
11.活学活用
学会rpm,编译安装,yum安装后,安装其他软件的时候,要如何安装
作为运维,要提供服务器运行环境,开发环境
比如一个网站程序涉及到的安装程序
数据库软件—————— musql
开发语言环境———— Java golang python
web服务器—————— nginx apache(httpd)
缓存数据库—————— redis
太多软件都需要安装,具体要用什么方式去安装,就需要对每一种安装方式都要理解,然后灵活应用
比如在断网的环境下
yum 没办法去外网瞎咋软件就需要准备好该软件所需要的所有 rpm 上传到 Linux机器去安装这些恶 rpm 包
比如在限制了软件版本情况下
就需要选择源代码编译,自己去官网,随便找到符合要求的版本,进行定制化安装
安装大型,复杂的软件,以及有很多自定只要求的软件,需要选择编译安装
安装一些基础环境,比如Linux底层的一些软件,利用 yum 全部自动化安装就行
基本上小型工具 yum都可直接安装完成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律