码迷,mamicode.com
首页 > 数据库 > 详细

安装ORACLE高可用RAC集群11g校验集群安装的可行性输出信息

时间:2019-04-10 16:42:28      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:figure   protoc   not   RoCE   led   gcc   group   ota   started   

安装ORACLE高可用RAC集群11g校验集群安装的可行性输出信息

作者:Eric
微信:loveoracle11g


[grid@node1 grid]$ ./runcluvfy.sh stage -pre crsinst -fixup -n node1,node2 -verbose 

Performing pre-checks for cluster services setup  

Checking node reachability... 

Check: Node reachability from node "node1" 
  Destination Node                      Reachable?               
  ------------------------------------  ------------------------ 
  node1                                 yes                      
  node2                                 yes                      
Result: Node reachability check passed from node "node1" 


Checking user equivalence... 

Check: User equivalence for user "grid" 
  Node Name                             Status                   
  ------------------------------------  ------------------------ 
  node2                                 passed                   
  node1                                 passed                   
Result: User equivalence check passed for user "grid" 

Checking node connectivity... 

Checking hosts config file... 
  Node Name                             Status                   
  ------------------------------------  ------------------------ 
  node2                                 passed                   
  node1                                 passed                   

Verification of the hosts config file successful 


Interface information for node "node2" 
 Name   IP Address      Subnet          Gateway         Def. Gateway    HW Address        MTU    
 ------ --------------- --------------- --------------- --------------- ----------------- ------ 
 eth0   192.168.10.20   192.168.10.0    0.0.0.0         192.168.10.1    00:0C:29:95:FF:9D 1500   
 eth1   192.168.200.20  192.168.200.0   0.0.0.0         192.168.10.1    00:0C:29:95:FF:A7 1500   


Interface information for node "node1" 
 Name   IP Address      Subnet          Gateway         Def. Gateway    HW Address        MTU    
 ------ --------------- --------------- --------------- --------------- ----------------- ------ 
 eth0   192.168.10.10   192.168.10.0    0.0.0.0         192.168.10.1    00:0C:29:E0:B5:05 1500   
 eth1   192.168.200.10  192.168.200.0   0.0.0.0         192.168.10.1    00:0C:29:E0:B5:0F 1500   


Check: Node connectivity of subnet "192.168.10.0" 
  Source                          Destination                     Connected?       
  ------------------------------  ------------------------------  ---------------- 
  node2[192.168.10.20]            node1[192.168.10.10]            yes              
Result: Node connectivity passed for subnet "192.168.10.0" with node(s) node2,node1 


Check: TCP connectivity of subnet "192.168.10.0" 
  Source                          Destination                     Connected?       
  ------------------------------  ------------------------------  ---------------- 
  node1:192.168.10.10             node2:192.168.10.20             passed           
Result: TCP connectivity check passed for subnet "192.168.10.0" 


Check: Node connectivity of subnet "192.168.200.0" 
  Source                          Destination                     Connected?       
  ------------------------------  ------------------------------  ---------------- 
  node2[192.168.200.20]           node1[192.168.200.10]           yes              
Result: Node connectivity passed for subnet "192.168.200.0" with node(s) node2,node1 


Check: TCP connectivity of subnet "192.168.200.0" 
  Source                          Destination                     Connected?       
  ------------------------------  ------------------------------  ---------------- 
  node1:192.168.200.10            node2:192.168.200.20            passed           
Result: TCP connectivity check passed for subnet "192.168.200.0" 


Interfaces found on subnet "192.168.10.0" that are likely candidates for VIP are: 
node2 eth0:192.168.10.20 
node1 eth0:192.168.10.10 

Interfaces found on subnet "192.168.200.0" that are likely candidates for a private interconnect are: 
node2 eth1:192.168.200.20 
node1 eth1:192.168.200.10 
Checking subnet mask consistency... 
Subnet mask consistency check passed for subnet "192.168.10.0". 
Subnet mask consistency check passed for subnet "192.168.200.0". 
Subnet mask consistency check passed. 

Result: Node connectivity check passed 

Checking multicast communication... 

Checking subnet "192.168.10.0" for multicast communication with multicast group "230.0.1.0"... 
Check of subnet "192.168.10.0" for multicast communication with multicast group "230.0.1.0" passed. 

Checking subnet "192.168.200.0" for multicast communication with multicast group "230.0.1.0"... 
Check of subnet "192.168.200.0" for multicast communication with multicast group "230.0.1.0" passed. 

Check of multicast communication passed. 

Checking ASMLib configuration. 
  Node Name                             Status                   
  ------------------------------------  ------------------------ 
  node2                                 passed                   
  node1                                 passed                   
Result: Check for ASMLib configuration passed. 

Check: Total memory  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         1.9613GB (2056560.0KB)    1.5GB (1572864.0KB)       passed     
  node1         1.9613GB (2056560.0KB)    1.5GB (1572864.0KB)       passed     
Result: Total memory check passed 

Check: Available memory  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         1.677GB (1758412.0KB)     50MB (51200.0KB)          passed     
  node1         1.6378GB (1717384.0KB)    50MB (51200.0KB)          passed     
Result: Available memory check passed 

Check: Swap space  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         3.9987GB (4192924.0KB)    2.9419GB (3084840.0KB)    passed     
  node1         3.9987GB (4192924.0KB)    2.9419GB (3084840.0KB)    passed     
Result: Swap space check passed 

Check: Free disk space for "node2:/tmp"  
  Path              Node Name     Mount point   Available     Required      Status       
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  /tmp              node2         /tmp          3.7764GB      1GB           passed       
Result: Free disk space check passed for "node2:/tmp" 

Check: Free disk space for "node1:/tmp"  
  Path              Node Name     Mount point   Available     Required      Status       
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  /tmp              node1         /tmp          3.7556GB      1GB           passed       
Result: Free disk space check passed for "node1:/tmp" 

Check: User existence for "grid"  
  Node Name     Status                    Comment                  
  ------------  ------------------------  ------------------------ 
  node2         passed                    exists(1100)             
  node1         passed                    exists(1100)             

Checking for multiple users with UID value 1100 
Result: Check for multiple users with UID value 1100 passed  
Result: User existence check passed for "grid" 

Check: Group existence for "oinstall"  
  Node Name     Status                    Comment                  
  ------------  ------------------------  ------------------------ 
  node2         passed                    exists                   
  node1         passed                    exists                   
Result: Group existence check passed for "oinstall" 

Check: Group existence for "dba"  
  Node Name     Status                    Comment                  
  ------------  ------------------------  ------------------------ 
  node2         passed                    exists                   
  node1         passed                    exists                   
Result: Group existence check passed for "dba" 

Check: Membership of user "grid" in group "oinstall" [as Primary] 
  Node Name         User Exists   Group Exists  User in Group  Primary       Status       
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             yes           yes           yes           yes           passed       
  node1             yes           yes           yes           yes           passed       
Result: Membership check for user "grid" in group "oinstall" [as Primary] passed 

Check: Membership of user "grid" in group "dba"  
  Node Name         User Exists   Group Exists  User in Group  Status           
  ----------------  ------------  ------------  ------------  ---------------- 
  node2             yes           yes           no            failed           
  node1             yes           yes           no            failed           
Result: Membership check for user "grid" in group "dba" failed 

Check: Run level  
  Node Name     run level                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         5                         3,5                       passed     
  node1         5                         3,5                       passed     
Result: Run level check passed 

Check: Hard limits for "maximum open file descriptors"  
  Node Name         Type          Available     Required      Status           
  ----------------  ------------  ------------  ------------  ---------------- 
  node2             hard          65536         65536         passed           
  node1             hard          65536         65536         passed           
Result: Hard limits check passed for "maximum open file descriptors" 

Check: Soft limits for "maximum open file descriptors"  
  Node Name         Type          Available     Required      Status           
  ----------------  ------------  ------------  ------------  ---------------- 
  node2             soft          1024          1024          passed           
  node1             soft          1024          1024          passed           
Result: Soft limits check passed for "maximum open file descriptors" 

Check: Hard limits for "maximum user processes"  
  Node Name         Type          Available     Required      Status           
  ----------------  ------------  ------------  ------------  ---------------- 
  node2             hard          16384         16384         passed           
  node1             hard          16384         16384         passed           
Result: Hard limits check passed for "maximum user processes" 

Check: Soft limits for "maximum user processes"  
  Node Name         Type          Available     Required      Status           
  ----------------  ------------  ------------  ------------  ---------------- 
  node2             soft          2047          2047          passed           
  node1             soft          2047          2047          passed           
Result: Soft limits check passed for "maximum user processes" 

Check: System architecture  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         x86_64                    x86_64                    passed     
  node1         x86_64                    x86_64                    passed     
Result: System architecture check passed 

Check: Kernel version  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         2.6.18-308.el5            2.6.18                    passed     
  node1         2.6.18-308.el5            2.6.18                    passed     
Result: Kernel version check passed 

Check: Kernel parameter for "semmsl"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             250           250           250           passed           
  node1             250           250           250           passed           
Result: Kernel parameter check passed for "semmsl" 

Check: Kernel parameter for "semmns"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             32000         32000         32000         passed           
  node1             32000         32000         32000         passed           
Result: Kernel parameter check passed for "semmns" 

Check: Kernel parameter for "semopm"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             100           100           100           passed           
  node1             100           100           100           passed           
Result: Kernel parameter check passed for "semopm" 

Check: Kernel parameter for "semmni"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             128           128           128           passed           
  node1             128           128           128           passed           
Result: Kernel parameter check passed for "semmni" 

Check: Kernel parameter for "shmmax"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             68719476736   68719476736   1052958720    passed           
  node1             68719476736   68719476736   1052958720    passed           
Result: Kernel parameter check passed for "shmmax" 

Check: Kernel parameter for "shmmni"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             4096          4096          4096          passed           
  node1             4096          4096          4096          passed           
Result: Kernel parameter check passed for "shmmni" 

Check: Kernel parameter for "shmall"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             4294967296    4294967296    2097152       passed           
  node1             4294967296    4294967296    2097152       passed           
Result: Kernel parameter check passed for "shmall" 

Check: Kernel parameter for "file-max"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             6815744       6815744       6815744       passed           
  node1             6815744       6815744       6815744       passed           
Result: Kernel parameter check passed for "file-max" 

Check: Kernel parameter for "ip_local_port_range"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             between 9000.0 & 65500.0  between 9000.0 & 65500.0  between 9000.0 & 65500.0  passed           
  node1             between 9000.0 & 65500.0  between 9000.0 & 65500.0  between 9000.0 & 65500.0  passed           
Result: Kernel parameter check passed for "ip_local_port_range" 

Check: Kernel parameter for "rmem_default"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             262144        262144        262144        passed           
  node1             262144        262144        262144        passed           
Result: Kernel parameter check passed for "rmem_default" 

Check: Kernel parameter for "rmem_max"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             4194304       4194304       4194304       passed           
  node1             4194304       4194304       4194304       passed           
Result: Kernel parameter check passed for "rmem_max" 

Check: Kernel parameter for "wmem_default"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             262144        262144        262144        passed           
  node1             262144        262144        262144        passed           
Result: Kernel parameter check passed for "wmem_default" 

Check: Kernel parameter for "wmem_max"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             1048576       1048576       1048576       passed           
  node1             1048576       1048576       1048576       passed           
Result: Kernel parameter check passed for "wmem_max" 

Check: Kernel parameter for "aio-max-nr"  
  Node Name         Current       Configured    Required      Status        Comment      
  ----------------  ------------  ------------  ------------  ------------  ------------ 
  node2             1048576       1048576       1048576       passed           
  node1             1048576       1048576       1048576       passed           
Result: Kernel parameter check passed for "aio-max-nr" 

Check: Package existence for "make"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         make-3.81-3.el5           make-3.81                 passed     
  node1         make-3.81-3.el5           make-3.81                 passed     
Result: Package existence check passed for "make" 

Check: Package existence for "binutils"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         binutils-2.17.50.0.6-20.el5  binutils-2.17.50.0.6      passed     
  node1         binutils-2.17.50.0.6-20.el5  binutils-2.17.50.0.6      passed     
Result: Package existence check passed for "binutils" 

Check: Package existence for "gcc(x86_64)"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         gcc(x86_64)-4.1.2-52.el5  gcc(x86_64)-4.1.2         passed     
  node1         gcc(x86_64)-4.1.2-52.el5  gcc(x86_64)-4.1.2         passed     
Result: Package existence check passed for "gcc(x86_64)" 

Check: Package existence for "libaio(x86_64)"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         libaio(x86_64)-0.3.106-5  libaio(x86_64)-0.3.106    passed     
  node1         libaio(x86_64)-0.3.106-5  libaio(x86_64)-0.3.106    passed     
Result: Package existence check passed for "libaio(x86_64)" 

Check: Package existence for "glibc(x86_64)"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         glibc(x86_64)-2.5-81      glibc(x86_64)-2.5-24      passed     
  node1         glibc(x86_64)-2.5-81      glibc(x86_64)-2.5-24      passed     
Result: Package existence check passed for "glibc(x86_64)" 

Check: Package existence for "compat-libstdc++-33(x86_64)"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         compat-libstdc++-33(x86_64)-3.2.3-61  compat-libstdc++-33(x86_64)-3.2.3  passed     
  node1         compat-libstdc++-33(x86_64)-3.2.3-61  compat-libstdc++-33(x86_64)-3.2.3  passed     
Result: Package existence check passed for "compat-libstdc++-33(x86_64)" 

Check: Package existence for "elfutils-libelf(x86_64)"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         elfutils-libelf(x86_64)-0.137-3.el5  elfutils-libelf(x86_64)-0.125  passed     
  node1         elfutils-libelf(x86_64)-0.137-3.el5  elfutils-libelf(x86_64)-0.125  passed     
Result: Package existence check passed for "elfutils-libelf(x86_64)" 

Check: Package existence for "elfutils-libelf-devel"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         elfutils-libelf-devel-0.137-3.el5  elfutils-libelf-devel-0.125  passed     
  node1         elfutils-libelf-devel-0.137-3.el5  elfutils-libelf-devel-0.125  passed     
Result: Package existence check passed for "elfutils-libelf-devel" 

Check: Package existence for "glibc-common"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         glibc-common-2.5-81       glibc-common-2.5          passed     
  node1         glibc-common-2.5-81       glibc-common-2.5          passed     
Result: Package existence check passed for "glibc-common" 

Check: Package existence for "glibc-devel(x86_64)"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         glibc-devel(x86_64)-2.5-81  glibc-devel(x86_64)-2.5   passed     
  node1         glibc-devel(x86_64)-2.5-81  glibc-devel(x86_64)-2.5   passed     
Result: Package existence check passed for "glibc-devel(x86_64)" 

Check: Package existence for "glibc-headers"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         glibc-headers-2.5-81      glibc-headers-2.5         passed     
  node1         glibc-headers-2.5-81      glibc-headers-2.5         passed     
Result: Package existence check passed for "glibc-headers" 

Check: Package existence for "gcc-c++(x86_64)"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         gcc-c++(x86_64)-4.1.2-52.el5  gcc-c++(x86_64)-4.1.2     passed     
  node1         gcc-c++(x86_64)-4.1.2-52.el5  gcc-c++(x86_64)-4.1.2     passed     
Result: Package existence check passed for "gcc-c++(x86_64)" 

Check: Package existence for "libaio-devel(x86_64)"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         libaio-devel(x86_64)-0.3.106-5  libaio-devel(x86_64)-0.3.106  passed     
  node1         libaio-devel(x86_64)-0.3.106-5  libaio-devel(x86_64)-0.3.106  passed     
Result: Package existence check passed for "libaio-devel(x86_64)" 

Check: Package existence for "libgcc(x86_64)"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         libgcc(x86_64)-4.1.2-52.el5  libgcc(x86_64)-4.1.2      passed     
  node1         libgcc(x86_64)-4.1.2-52.el5  libgcc(x86_64)-4.1.2      passed     
Result: Package existence check passed for "libgcc(x86_64)" 

Check: Package existence for "libstdc++(x86_64)"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         libstdc++(x86_64)-4.1.2-52.el5  libstdc++(x86_64)-4.1.2   passed     
  node1         libstdc++(x86_64)-4.1.2-52.el5  libstdc++(x86_64)-4.1.2   passed     
Result: Package existence check passed for "libstdc++(x86_64)" 

Check: Package existence for "libstdc++-devel(x86_64)"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         libstdc++-devel(x86_64)-4.1.2-52.el5  libstdc++-devel(x86_64)-4.1.2  passed     
  node1         libstdc++-devel(x86_64)-4.1.2-52.el5  libstdc++-devel(x86_64)-4.1.2  passed     
Result: Package existence check passed for "libstdc++-devel(x86_64)" 

Check: Package existence for "sysstat"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         sysstat-7.0.2-11.el5      sysstat-7.0.2             passed     
  node1         sysstat-7.0.2-11.el5      sysstat-7.0.2             passed     
Result: Package existence check passed for "sysstat" 

Check: Package existence for "ksh"  
  Node Name     Available                 Required                  Status     
  ------------  ------------------------  ------------------------  ---------- 
  node2         ksh-20100621-5.el5        ksh-20060214              passed     
  node1         ksh-20100621-5.el5        ksh-20060214              passed     
Result: Package existence check passed for "ksh" 

Checking for multiple users with UID value 0 
Result: Check for multiple users with UID value 0 passed  

Check: Current group ID  
Result: Current group ID check passed 

Starting check for consistency of primary group of root user 
  Node Name                             Status                   
  ------------------------------------  ------------------------ 
  node2                                 passed                   
  node1                                 passed                   

Check for consistency of root user‘s primary group passed 

Starting Clock synchronization checks using Network Time Protocol(NTP)... 

NTP Configuration file check started... 
Network Time Protocol(NTP) configuration file not found on any of the nodes. Oracle Cluster Time Synchronization Service(CTSS) can be used instead of NTP for time synchronization on the cluster nodes 
No NTP Daemons or Services were found to be running 

Result: Clock synchronization check using Network Time Protocol(NTP) passed 

Checking Core file name pattern consistency... 
Core file name pattern consistency check passed. 

Checking to make sure user "grid" is not in "root" group 
  Node Name     Status                    Comment                  
  ------------  ------------------------  ------------------------ 
  node2         passed                    does not exist           
  node1         passed                    does not exist           
Result: User "grid" is not part of "root" group. Check passed 

Check default user file creation mask 
  Node Name     Available                 Required                  Comment    
  ------------  ------------------------  ------------------------  ---------- 
  node2         0022                      0022                      passed     
  node1         0022                      0022                      passed     
Result: Default user file creation mask check passed 
Checking consistency of file "/etc/resolv.conf" across nodes 

Checking the file "/etc/resolv.conf" to make sure only one of domain and search entries is defined 
File "/etc/resolv.conf" does not have both domain and search entries defined 
Checking if domain entry in file "/etc/resolv.conf" is consistent across the nodes... 
domain entry in file "/etc/resolv.conf" is consistent across nodes 
Checking if search entry in file "/etc/resolv.conf" is consistent across the nodes... 
search entry in file "/etc/resolv.conf" is consistent across nodes 
Checking file "/etc/resolv.conf" to make sure that only one search entry is defined 
All nodes have one search entry defined in file "/etc/resolv.conf" 
Checking all nodes to make sure that search entry is "oracle.com" as found on node "node2" 
All nodes of the cluster have same value for ‘search‘ 
Checking DNS response time for an unreachable node 
  Node Name                             Status                   
  ------------------------------------  ------------------------ 
  node2                                 passed                   
  node1                                 passed                   
The DNS response time for an unreachable node is within acceptable limit on all nodes 

File "/etc/resolv.conf" is consistent across nodes 

Check: Time zone consistency 
Result: Time zone consistency check passed 
Fixup information has been generated for following node(s): 
node2,node1 
Please run the following script on each node as "root" user to execute the fixups: 
‘/tmp/CVU_11.2.0.4.0_grid/runfixup.sh‘ 

Pre-check for cluster services setup was unsuccessful on all the nodes. 
[grid@node1 grid]$ 

安装ORACLE高可用RAC集群11g校验集群安装的可行性输出信息

标签:figure   protoc   not   RoCE   led   gcc   group   ota   started   

原文地址:https://www.cnblogs.com/zhouwanchun/p/10684191.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!