Search Posts

分类: 管理

CentOS的firewall-cmd用法详细总结

Centos 采用的防火墙firewalld简介:

firewalld 是 CentOS 和其他一些 Linux 发行版中默认使用的防火墙软件,它提供了一种灵活的方式来管理系统的网络安全和连接。

firewalld 使用 D-Bus 接口来管理网络连接,它使用基于区域的策略来控制入站和出站流量,并且可以在运行时动态更新规则。这使得 firewalld 比传统的 iptables 防火墙更加灵活和易于管理。

以下是 firewalld 的一些主要特点:

  1. 支持基于区域的策略:firewalld 使用基于区域的策略来控制入站和出站流量。每个区域都有一个预定义的安全级别和一组服务,这些服务定义了允许访问的端口和协议。你可以轻松地将系统接口分配给不同的区域,并在区域之间移动。

  2. 支持动态更新规则:firewalld 可以在运行时动态更新规则,无需重启防火墙服务。这使得添加或删除规则变得更加方便和快捷。

  3. 支持网络连接跟踪:firewalld 可以跟踪网络连接并在其生命周期内应用相应的规则。这使得 firewalld 能够更好地保护系统安全和隐私。

  4. 支持 IPv6:firewalld 支持 IPv6,可以轻松地管理 IPv6 网络安全。

  5. 支持命令行和图形界面:firewalld 提供了命令行和图形界面两种管理方式。你可以使用命令行工具 firewall-cmd 来管理防火墙,也可以使用图形界面工具 firewall-config 来配置防火墙规则。

总之,firewalld 是一个功能强大且易于管理的防火墙软件,它提供了一种灵活的方式来保护系统网络安全和连接。如果你使用 CentOS 或其他一些 Linux 发行版,firewalld 是一个值得考虑的防火墙解决方案。

firewall-cmd 的不同场景应用举例:

如果通过命令方式修改firewalld防火墙规则,则通过firewall-cmd 命令具体执行,以下是一些实际例子:

firewall-cmd 设置linux防火墙允许80端口对外访问:

firewall-cmd --zone=public --add-port=80/tcp --permanent

查看当前规则:

firewall-cmd --list-all public

允许特定服务通过防火墙:

firewall-cmd --zone=public --add-service=httpd --permanent

让firewall-cmd命令设置的规则马上生效:

firewall-cmd --reload

对于非默认端口的开放,除了要防火墙允许,还要selinux允许,

在centos7等最新的发行版上,默认启用了selinux,而selinux允许指定端口的命令是:

semanage port -a -t http_port_t -p tcp 81
semanage port -a -t ssh_port_t -p tcp 222
semanage port -a -t vnc_port_t -p tcp 5999

除非关闭了selinux(命令 setenforce 0 可关闭 selinux ,如果永久关闭,可编辑/etc/sysconfig/selinux 文件将 SELINUX=enforcing 改成 SELINUX=disabled),才不需要额外执行以上命令。

要指定允许的来源ip和目标端口:

firewall-cmd --permanent --zone=public --add-rich-rule='
  rule family="ipv4"
  source address="10.10.99.10/32"
  port protocol="tcp" port="80" accept'

firewalld 根据nginx访问日志的 503 记录,自动屏蔽特定ip:

iptables 方式:

*/1 * * * * for itm in /usr/bin/tail -2000 /www/wwwlogs/site.com.log
查看余下内容

如何格式化超出 4TB 限制的 Ext4 文件系统

所有文件系统都有限制

Ext 系列的文件系统也不例外。使用标准 4KiB 块大小,32 位 Ext3 的卷限制为 16TB。随着存储介质的进步和容量增加的更大可用性,Ext4 的开发是为了克服这一限制。Ext4 现在将支持高达 1 EB (EiB) 的卷。

这是一个了不起的改进,但是当您实际格式化其中一个卷时会发生什么?如果您的系统运行一些较旧的 fs 工具(如 Debian Squeeze),那么在尝试格式化大型卷时可能会遇到这种情况(假设我们在此示例中在 /dev/vg0/lv_data 处有一个 19TB 的分区)。

# mkfs -t ext4 /dev/vg0/lv_data 
mke2fs 1.42.7 (21-Jan-2013) 
mkfs.ext4: Size of device (0x131a47800 blocks) /dev/vg0/lv_data too big to be expressed in 32 bits using a block-size of 4096.

解决方式

解决方式1:使用 e2fsprogs 工具

尽管 Ext4 文件系统已更新为支持 64 位卷,但这些工具可能不支持。这里的解决方案是获取最新版本的 e2fsprogs 实用程序并自己构建它们。

首先,从sourceforge获取实用程序:

# cd /opt/
# wget -O e2fsprogs-1.42.7.tar.gz 
http://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.42.7/e2fsprogs-1.42.7.tar.gz?r=http%3A%2F%2Fe2fsprogs.sourceforge.net%2F&ts=1361548232&use_mirror=superb-dca3

然后,提取文件并为您的构建进行设置

# tar -xzvf e2fsprogs-1.42.7.tar.gz
# cd e2fsprogs-1.42.7
# mkdir build
# cd build

如果您没有开发工具(如编译器和make),请立即安装它们

# apt-get install build-essential

现在,您已准备好构建工具:

# ../configure
# make
# make install

但是,在实际创建文件系统之前,您需要编辑 /etc/mke2fs.conf… 查看余下内容

linux下ext3文件系统突然变成readonly只读的问题分析和解决方式

ext3是linux下较老的文件系统格式,但目前仍有少部分用户在使用ext3作为linux文件系统格式。

linux下ext3文件系统突然变成readonly 问题线索

#tail  -100  /var/log/messages

 Sep  1 04:02:21 www syslogd 1.4.1: restart.
 Sep  1 11:22:16 www avahi-daemon[2691]: Invalid query packet.
 Sep  1 11:22:57 www last message repeated 14 times
 Sep  1 11:22:57 www avahi-daemon[2691]: Invalid query packet.
 Sep  1 13:45:29 www kernel: ext3_abort called.
 Sep  1 13:45:29 www kernel: EXT3-fs error (device hdb1): ext3_put_super: Couldn't clean up the journal
 Sep  1 13:46:31 www kernel: kjournald starting.  Commit interval 5 seconds
 Sep  1 13:46:31 www kernel: EXT3 FS on hdb1, internal journal
 Sep  1 13:46:31 www kernel: EXT3-fs: mounted filesystem with ordered data mode.
 Sep  1 13:48:25 www kernel: printk: 5 messages suppressed.
查看余下内容

磁盘分区UUID 变化导致 start job is running for /dev/disk/by-uuid/2XX-XXXX 等待时间延迟错误,以及/etc/fstab的原理

磁盘分区UUID 变化导致启动等待的问题、解决过程

用户说分区扩容后,出现启动提示等待1分半时间,然后能进入系统。但感觉每次等待,等久了觉得麻烦,问能否解决。

后根据错误提示,认为/etc/fstab 内容可能有误。

初步认为是EFI分区 有问题。

后与用户沟通确认,扩容时更新了swap分区和根分区的UUID,然后出现上述问题。指导用户将/etc/fstab里的分区的UUID值改成使用扩容后的分区的新UUID,然后重启看到等待问题不再出现。

linux的磁盘的 UUID 变化与/etc/fstab 配置文件的作用:

关于 /etc/fstab 的语法结构和参数作用,可参考 开软技巧 作者在【深入理解Linux】公众号中总结的一篇专题文章:https://mp.weixin.qq.com/s/NEjeNSdkR3LucqI0kN89PQ

现原文《Linux的/etc/fstab文件一些常识。很重要也很简单,现在就看懂它!》摘录如下:

fstab文件包含了你的电脑上的存储设备及其文件系统的信息。它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的文件。具体来说:用fstab可以自动挂载各种文件系统格式的硬盘、分区、可移动设备和远程设备等。对于Windows与Linux双操作系统用户,用fstab挂载FAT格式和NTFS格式的分区,可以在Linux中共享windows系统下的资源。

这个文件的全路径是/etc/fstab。它只是一个文本文件,你能够用你喜欢的编辑器打开它,但是必须是root用户才能编辑它。同时fsck、mount、umount的等命令都利用该程序。

/etc/fstab 是启动时的配置文件,不过,实际 filesystem 的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个文件当中的。每次我们在更动 filesystem 的挂载时,也会同时更动这两个文件喔!

系统挂载的一些限制:

  • 根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。

  • 其它 mount point 必须为已创建的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则

  • 所有 mount point 在同一时间之内﹐只能挂载一次。

  • 所有 partition 在同一时间之内﹐只能挂载一次。

  • 如若进行卸除,您必须先将工作目录移到 mount point(及其子目录) 之外。

/etc/fstab 配置文件的各字段解释:

示例:

#                                

#NOTE: If your BOOT partition is ReiserFS, add the notail option to opts.
/dev/sda10        /boot            ext4        noauto,noatime    1 2
/dev/sda6         /                ext4        noatime           0 1
/dev/sda9         none             swap        sw                0 0
/dev/cdrom        /mnt/cdrom       auto        noauto,ro         0 0

其实 /etc/fstab (filesystem table) 就是将我们利用 mount 命令进行挂载时, 将所有的选项与参数写入到这个文件中就是了。除此之外, /etc/fstab 还加入了 dump 这个备份用命令的支持! 与启动时是否进行文件系统检验 fsck 等命令有关。

<file systems> 挂载设备 :

不是我们通常理解的文件系统,而是指设备(硬盘及其分区,DVD光驱等)。它告知我们设备(分区)的名字,这是你在命令行中挂载(mount)、卸载(umount)设备时要用到的。

<mountpoint> 挂载点:

告诉我们设备挂载到哪里。

<type> 文件系统类型:

Linux支持许多文件系统。 要得到一个完整的支持名单查找mount man-page。典型 的名字包括这些:ext2, ext3, reiserfs, xfs, jfs,iso9660, vfat, ntfs, swap和auto, ‘auto’ 不是一个文件系统,而是让mount命令自动判断文件类型,特别对于可移动设备,软盘,DVD驱动器,这样做是很有必要的,因为可能每次挂载的文件类型不一致。

<opts> 文件系统参数:

这部分是最有用的设置!!! 它能使你所挂载的设备在开机时自动加载、使中文显示不出现乱码、限制对挂载分区读写权限。它是与mount命令的用法相关的,要想得到一个完整的列表,参考mount manpage.… 查看余下内容

centos用旧版本的rpm安装包覆盖新版本的已安装的包安装软件

若系统上已安装有其他新版本的包。要用旧版本的rpm包替换,可以rpm -Uvh参数 加上–oldpackage,根据 rpm的说明文档,https://manpages.org/rpm/8

--force Same as using --replacepkgs, --replacefiles, and --oldpackage.

也就是 –oldpackage 相当于–force ,强制安装。也就是以下命令是用旧版本的rpm包 强制替换 新版本的rpm包。

rpm -Uvh /home/libxml2-2.9.1-6.el7_2.3.x86_64.rpm --oldpackage
查看余下内容

Linux系统盘扩展分区和文件系统的操作总结

  1. 前提条件

    • 确保Linux实例的操作系统是Alibaba Cloud Linux 2/3、CentOS 6及以上、Debian 8及以上或者Ubuntu14及以上版本。

       
      说明 

      如果为其他操作系统,扩容操作请参见扩展分区和文件系统_Linux数据盘

    • 已在ECS控制台扩容云盘容量。具体操作,请参见步骤一:扩容云盘容量

    • (强烈建议)已创建云盘快照,做好数据备份。具体操作,请参见创建一个云盘快照

       
      说明 

      扩容分区和文件系统正常情况不会丢失数据。为避免误操作导致数据丢失或异常,建议您创建快照备份云盘数据。

    • 本文档不适用于开启了多重挂载功能且使用了集群文件系统的场景。更多信息,请参见开启多重挂载功能

     

    操作步骤

    本文操作适用于以下云盘扩容场景:

    在文档末尾分别以扩容MBR分区、GPT分区、裸数据盘为例,为您展示了扩容分区和文件系统的命令示例,供您参考。

    您可以尝试使用一键扩容工具。该工具会自动生成扩容命令,并支持一键执行扩容命令,帮助您实现操作系统内的分区和文件系统扩容。

     
    1. 访问EBS控制台工具集下的扩容分区和文件系统工具

    2. 选择待操作的云盘,然后单击提交

    3. 工具将检测操作系统分区状态。如果显示操作系统未扩容分区字样,且解决方案中包含自动生成的命令,则可以按照如下操作进行一键扩容。

       
      说明 

      如果未显示扩容命令,则说明工具暂不支持该种情况,您仍需要参考文档手动执行扩容。

      1. 解决方案区域的云助手工具页签中,确认自动生成的扩容命令,然后单击执行上述远程命令

      2. 在弹出的发送命令对话框单击执行,系统将自动执行扩容命令。

      3. 看到命令执行成功提示后,单击取消关闭对话框。

        即可看到该云盘的分区和文件系统扩容成功。

         

        在ECS控制台上扩容云盘容量后,对应分区和文件系统并未扩容,您还需要进入ECS实例内部继续扩容云盘的分区和文件系统,将扩容部分的容量划分至已有分区及文件系统内,使云盘扩容生效。本文为您介绍如何通过两个步骤完成Linux实例云盘的分区和文件系统扩容。

    准备工作:获取目标云盘信息

    执行扩容分区和文件操作系统前,请先获取待扩容云盘和云盘分区信息。

    方式一:通过命令行获取
    方式二:通过控制台获取
     
    1. 远程连接ECS实例。

      具体操作,请参见通过密码或密钥认证登录Linux实例

    2. 运行以下命令,确认待扩容云盘及其分区信息。

      fdisk -lu

      如图所示,表示该实例有2块云盘,系统盘/dev/vda和数据盘/dev/vdb,我们以数据盘/dev/vdb为例。其中:

      • ①:云盘的设备名称。

      • ②:云盘是否分区及分区名称。

        • 已分区:如果有②处的分区信息表示已分区,Device取值为分区名称(示例中为/dev/vdb1),数字1是分区编号,则需扩容分区和文件系统。

        • 未分区(裸设备):如果没有②处的分区信息表示未分区,为裸设备。则无需执行步骤1:扩容分区,直接执行步骤2:扩容文件系统即可。

      • ③:云盘的分区类型。

        Disk label type值为dos表示MBR分区,值为gpt表示GPT分区。

         
        说明
        • 不同操作系统的显示略有不同。如果没有Disk label type字段,可通过System字段判断。System值为Linux表示MBR分区,值为GPT表示GPT分区。

        • 较低版本的fdisk可能不能正常显示GPT分区表。您可以通过gdisk -l /dev/vdb命令查看分区类型。

      • ④:确认待扩容的分区。

        由于容量= sectors值*512 bytes,图示例中:

        • 云盘/dev/vdb的sectors=125829120,则云盘容量=125829120*512bytes=64.4GB(等于60GiB)

        • 分区/dev/vdb1的sectors=(End-Start)=83886078,则分区容量= 83886078*512bytes=42.9GB(等于40GiB)

        根据计算得出/dev/vdb1分区的容量小于云盘/dev/vdb的容量,即/dev/vdb1分区需要扩容。

         
        说明 

        您也可以通过运行lsblk命令查看哪个分区待扩容。

    步骤1:扩容分区

    本操作以公共镜像Alibaba Cloud Linux 2.1903 LTS 64位操作系统、在ECS实例内部将云盘分区/dev/vdb1由40 GiB扩容至60 GiB(已在控制台扩大容量为60 GiB)为例,请您根据实际环境进行操作。

    1. 可选:根据准备工作获取的信息,如果您的云盘分区类型为MBR且在控制台扩容后容量大于2 TiB,需先转换分区为GPT分区。

      具体操作,请参见转换Linux数据盘的分区类型

    2. 运行以下命令,扩容指定分区。例如扩容分区名称为/dev/vdb1的分区,则执行如下命令。

       
      说明 

      命令参数中的/dev/vdb1之间需要空格分隔,1是分区编号。

      Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本
      Debian 8及以上版本、Ubuntu14及以上
       
      • MBR分区

        type growpart || yum install -y cloud-utils-growpart
        LC_ALL=en_US.UTF-8
查看余下内容

docker端口绑定到ipv6导致ipv4请求无法转发的问题和解决

本文是对docker 端口绑定到ipv6 导致ipv4请求无法转发的问题的一些记录和解决过程。

问题症状

vmware虚拟机的 centos 7 里面运行了docker 的mysql服务,端口转发3306:3306,结果发现虚拟机外的系统无法访问到虚拟机的3306的数据库服务。

核心的原因

docker 对与ipv6默认是没有打开forwarding 设置的

首先官方的介绍:
在默认的配置中,流量的端口转发分为两种:内部流量转发(本机),外部流量转发(跨机器)

举个例子:

#docker run -d -p 80:80 nginx

这个操作会在iptables中增加如下策略(是的,docker所有的端口转发都是靠iptables实现的)

#iptables -t nat -L -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
    0     0 DOCKER     all  --  any    any     anywhere             anywhere             ADDRTYPE match dst-type LOCAL
 
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
 
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
    1    60 DOCKER     all  --  any    any     anywhere            !loopback/8          
查看余下内容

/etc/pam.d/system-auth-ac 写法错误导致root用户无法执行passwd命令的问题解决记录

问题产生过程

某用户 希望设置linux 在任何用户输入密码错误次数超过6次的情况下能触发 用户账号锁定40秒的防护功能(锁后root用户无法登录)。等40秒后,登录界面输入 root用户的正确密码,看能否登陆。但用户自行修改系统配置文件后,系统出现故障:root用户无法执行passwd命令。passwd命令执行后出现如下图的报错:

故障线索分析

注意 其中的一个关键错误:

passwd: module is unknown

illegal module type : root_unlock_time

看起来跟识别模块异常有关。以 module is unkonw 和 illegal module type : root_unlock_time 作为关键词,搜索查到跟 /etc/pam.d/system-auth-ac 相关。



根据/etc/pam.d/system-auth-ac 这个信息,打开文件查看内容。

初步解决验证尝试

给文件的 /etc/pam.d/system-auth-ac 的passwd相关的2行加了注释。
注释后这个文件的第3-4行内容是:

#auth required pam_tally2.so  onerr=fail  deny=6  unlock_time=40 even_deny_root   
#root_unlock_time=30 

注释后就不存在passwd执行后提示passwd: module is unknown的问题了。

但这些语句在 /etc/pam.d/system-auth-ac 文件中本来就有的,为什么突然会报错呢?

经过跟 纯净安装的 /etc/pam.d/system-auth-ac 文件原始内容比对,发现了原因: root_unlock_time=30 并不是单独成行的,用户不小心手动将 它换行,就不符合该文件的语法要求。这个system-auth-ac 文件因为语法错误就无法正常被解析,是本文错误的根源。

最终解决过程记录

请在 linux系统的单用户模式下,使用nano编辑器修正 system-auth-ac 文件内容:

nano   /etc/pam.d/system-auth-ac

以修改 /etc/pam.d/system-auth-ac 文件。
把原来的第3-4行改成:
auth required pam_tally2.so onerr=fail deny=6 unlock_time=40 even_deny_root root_unlock_time=30
(修改后就只剩一行,也就是把原来3-4行合并到一起) 注意even_deny_root root_unlock_time=30这是两个参数,它们之间至少要有用一个空格。

这样就启用了 rhel 5系统的 PAM方式防密码破解防护功能

如何验证是否生效

reboot命令,正常重启系统,如果能进入图形桌面,登录。就说明修改生效。

验证/etc/pam.d/system-auth-ac 修改后是否达到了账号密码错误超过6次后自动锁定的防护效果

root用户,桌面登录之前,输入密码错误次数超过6次,则触发 锁用户的防护(锁后root用户无法登录)。等40秒后,登录界面输入 root用户的正确密码,看能否登陆。

参考文档

根据 man pam_tally2帮助说明文档 ,上述

auth required pam_tally2.so
查看余下内容

使用shell的grep过滤思路,查找lizardfs中副本数偏少的文件、查找lizardfs中损坏的文件

使用shell的grep等命令查找 /mnt/lizardfs/temp 目录的内的所有文件是否存在副本数异常的文件:

find /mnt/lizardfs/temp -type f -exec sh -c 'mfsfileinfo "{}" | grep -q "no valid copies" && echo "{}";' \;

命令说明

以上通过 find 的 -exec sh -c ‘xxxx’ \; 来对每个找到的文件执行 xxxx 操作,xxxx为 单引号内的具体脚本内容,在这个例子里面是mfsfileinfo "{}" | grep -q "no valid copies" && echo "{}"; 也就是先通过mfsfileinfo 获取文件信息,若文件只有元记录,但fileinfo的chunk丢失,mfsfileinfo 查询文件会返回no valid copies,根据这个条件成立的前提下,则可通过&& echo "{}"; 的方式,将问题文件的路径打印出来,实现后续的文件修复操作。

使用shell找出linux的 lizardfs 的副本数不足3份:

假设lizardfs的存储安全要求,副本数要求至少3份,如果某个文件的副本数不足3份,则打印出文件路径,以备后续增加对应文件的副本数。

find /mnt/lizardfs/temp -type f -exec sh -c 'mfsfileinfo "{}" | grep -q -c "copy 3" || echo "{}";' \;

本命令参考来源:https://github.com/lizardfs/lizardfs/issues/222查看余下内容

使用python3自带的trace模块跟踪调试脚本执行过程,实现python脚本的运行性能分析和问题调试

python 的 trace 调试介绍

python -m trace --trace xxxxx.py 是一种 Python 命令行方式,它可以用于代码调试和性能分析。具体来说,它可以让你跟踪 Python 程序的执行过程,记录下每个语句的执行情况,以及它们所花费的时间和调用次数等信息。

python trace运行方式的优势包括:

  1. 代码调试:trace 模块可以帮助你找出代码中的错误和潜在问题,因为它可以记录每个语句的执行情况,以及它们所花费的时间和调用次数等信息。这有助于你分析代码的执行过程,并找出可能导致程序崩溃或性能下降的问题。

  2. 性能分析:trace 模块还可以帮助你分析代码的性能问题,因为它可以记录每个语句的执行时间和调用次数等信息。这有助于你找出代码中的瓶颈,并进行优化,以提高程序的性能。

  3. 应用广泛:trace 模块是 Python 自带的标准库,因此在各种 Python 环境中都可以使用。无论是在本地开发环境中,还是在部署服务器上,都可以使用这种方式来进行代码调试和性能分析。

python trace方式潜在的问题

需要注意的是,在使用 trace 模块时,由于它会记录每个语句的执行情况,因此可能会对程序的性能产生一定影响,特别是对于大型程序和高并发程序来说,可能会影响程序的运行速度。因此,在使用 trace 模块时,需要谨慎选择需要跟踪的语句和模块,以避免对程序的性能产生太大的影响。

调试结果的输出如何保存为文件、如何可视化

python -m trace --trace xxxxx.py 命令行方式会将跟踪信息输出到标准输出,而不会生成 dump 文件。如果你需要将跟踪信息保存到文件中,可以使用 -o 选项指定输出文件名,例如:

python -m trace --trace -o trace.log xxxxx.py

这样就会将跟踪信息保存到 trace.log 文件中。

python trace实时查看运行状态

关于实时查看运行状态,trace 模块本身并没有提供实时查看运行状态的功能。但你可以在程序运行时,通过打印一些调试信息来实现实时查看的效果。例如,在程序中插入一些 print() 语句,输出一些关键信息,就可以在程序运行时实时查看运行状态。

python trace结果如何通过web界面查看?

若要通过web 面板查看结果python trace的结果,你可以使用一些第三方工具来对 trace 产生的跟踪信息进行可视化。例如,SnakeViz 工具可以将 trace 产生的跟踪信息可视化为交互式火焰图,帮助你更直观地分析和优化程序的性能。你可以通过 pip 命令安装 SnakeViz,然后使用以下命令启动:

pip install snakeviz

python -m cProfile -o trace.out xxxxx.py
snakeviz trace.out

其中 -o 选项用于将 trace 产生的跟踪信息保存到文件中,snakeviz 命令用于启动 SnakeViz 工具并打开可视化界面。在界面中,你可以查看整个程序的执行过程,找出代码瓶颈,优化程序性能。… 查看余下内容

下一页 » « 上一页
加好友请备注:chinaoss
您可以在微信公众号联系我们
我们将24小时内回复。
取消