linux 大总结[通俗易懂]

2022-06-26 10:35:26 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

1.Linux介绍

Linux 内核最初只是由芬兰人林纳斯·托瓦兹( Linus Torvalds) 在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。 Linux 能运 行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。 Linux 继承 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、 Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等,其中以 centos在企业中使用最广。

2.Centos 安装

1)下载地址

官网下载链接: http://isoredirect.centos.org/centos/7/isos/x86_64/

2)安装 VMWARE15.5

参考地址:https://blog.csdn.net/weixin_43921994/article/details/105765088

vmware是一个虚拟化工具,它可以安装在我们windows,然后在 vmware里安装 linux系统

3)在VMWARE中安装linux系统

第一步 :选择创建新的虚拟机

第二步:选择默认典型,下一步

第三步:选择默认的稍后安装操作系统

第四步:选择linux和对应的安装版本

第五步:安装位置选择资源充足的盘

第六步:磁盘大小更改成40G,大数据组件需要较多的存储,资源不充足最少 20G

第七步:完成之后界面

第八步:选择上面虚拟机中的设置修改

#内存:改为 2-4GB(电脑总内存 8GB就每台给 2G,电脑内存 16GB就每台给 4G)

#CPU:可以选择1*2或 2*2核心的配置

#ISO 镜像选择 :一定选择自己准备的ISO镜像的路径

#网络:此处选择 nat模

第九步:选择第一行的install安装

默认进入选型是第二个,用鼠标左键点入进入黑窗口,按键盘的向上键跳到第一行,选择Enter确认安装想要把鼠标跳出黑窗口,按ctrl alt键

第十步:等待出现这个界面,选择英文即可

第十一步进入配置修改界面

#修改时间,日期,时区选择亚洲上海,选择左上角 done保存退出

#更改安装包的方式,默认 mininal安装代表最小化;更改安装方式为 GNOME desktop(这是桌面化安装生产机房一般采专用此方式 ),完成后左 上角选择 done。

#配置 hosts主机名和网络,此处我们只设置一下 host名字,进入系统后采用命令行的方式修改也可以

我们将host名设置为 node01,选择 apply应用,左上角 done退出。其中 ens33是网卡的名字

第十二步:选择右下角开始安装

第十三步:设置root用户密码和普通用户的密码

#更改 root密码: ********

#设置普通用户名称 test,密码 *********

第十四步:等待安装

第十五步:安装完成,选择reboot重启

#设置 lisense许可证

第十六步:一路next

4)网络配置

选择虚拟网络编辑器

选择 nat模式,然后点击右下角的更改设置

设置子网 IP:192.168.52.0

子网掩码:255.255.255.0

个人电脑网络设置:找到网络连接中的VMnet8

网卡设置:#vim /etc/sysconfig/network-scripts/ifcfg-ens33 进入网卡设置

编辑

代码语言:javascript复制
TYPE=Ethernet 
PROXY_METHOD=none 
BROWSER_ONLY=no 
#需编辑
BOOTPROTO=static 
DEFROUTE=yes 
IPV4_FAILURE_FATAL=no 
IPV6INIT=yes 
IPV6_AUTOCONF=yes 
IPV6_DEFROUTE=yes 
IPV6_FAILURE_FATAL=no 
IPV6_ADDR_GEN_MODE=stable-privacy 
NAME=ens33 
UUID=4f81f256-131f-4fdb-9365-1ae4c7882aa2 
DEVICE=ens33 

#需编辑
ONBOOT=yes 
IPADDR=192.168.52.100 
NETMASK=255.255.255.0 
GATEWAY=192.168.52.1 DNS1=8.8.8.8

#重启网卡 service network restart

测试网络是否连通外网:ping www.baidu.com

到此 centos7.4安装完成,网络也配置成功

5)Linux远程连接工具

Linux系统中是通过 SSH服务实现的远程登录功能,默认 ssh服 务端口号为 22。Window系统上Linux 远程登录客户端有 SecureCRT, Putty, SSH Secure Shell,XShell等

SecureCRT安装:https://blog.csdn.net/qq_39052513/article/details/100272502

3.Linux文件与目录结构

1)文件

Linux系统中一切皆文件

2)目录结构

4.linux中文本编辑器

vim是从 vi 发展出来的一个文本编辑器 。代码补完、编译及错误跳转等方便编程的功能特别丰富

代码语言:javascript复制
1.进入插入模式
    i: 插入光标前一个字符
    I: 插入行首
    a: 插入光标后一个字符
    A: 插入行未 
    o: 向下新开一行 ,插入行首
    O: 向上新开一行 ,插入行首
2.进入末行模式
    在命令模式下 ,用户按 “:”键即可进入末行模式
3.退出   
    :q 退出 
    :q! 退出并不保存
    :w 保存 :wq 保存并退出
    :x 保存并退出
4.查找命令
    /: str查找 
    n: 下一个
    N:上一个
5.替换命令
    把 abc全部替换成 123
    :%s/abc/123/g---末行模式下,将当前文件中的所有 abc替换成 123。如果不使用 g, 则只会替换每一行的第一个 abc
    :1, 10s/abc/123/g---末行模式下,将第一行至第 10行之间的 abc替换成 123
6.vim里面执行shell下命令
    末行模式里输入 !,后面跟命令
7.进入命令模式
    ESC:从插入模式或末行模式进入命令模式
8.移动光标
    h: 左移 
    j: 下移 
    k: 上移 
    l: 右移 
    M: 光标移动到当前屏幕的中间行
    L: 光标移动到当前屏幕最后一行行首
    gg: 光标移动 文件开头
    G: 光标移动到文件末尾
    G: 移动到指定行 ,行号 G (扩展:打开文件时跳转指定行 ,vi 文件名  行数 ) 
    w: 向后一次移动一个字
    b: 向前一次移动一个字
    {: 按段移动 ,上移 
    }: 按段移动 ,下移 
    Ctr-d: 向下翻半屏
    Ctr-u: 向上翻半屏
    Ctr-f: 向下翻一屏
    Ctr-b: 向上翻一屏
9.撤销命令
    u: 一步一步撤销
    Ctr-r: 反撤销
10.删除命令
    x: 删除光标后一个字符 ,相当于 Del 
    X: 删除光标前一个字符 ,相当于 Backspace 
    dd: 删除光标所在行 ,n dd 删除指定的行数
    D: 删除光标后本行所有内容 ,包含光标所在字符
    d0: 删除光标前本行所有内容 ,不包含光标所在字符
    dw: 删除光标开始位置的字 ,包含光标所在字符
11.复制粘贴
    yy: 复制当前行 ,n yy 复制 n 行 
    p: 在光标所在位置向下新开辟一行 ,粘贴
12.替换操作
    r: 替换当前字符
    R: 替换当前行光标后的字符
13.文本行移动
    >>: 文本行右移
    <<: 文本行左移
14.重复命令
    .: 重复上一次操作的命令
15.可视模式
    v: 按字符移动 ,选中文本
    V: 按行移动 ,选中文本可视模式可以配合 d, y, >>, << 实现对文本块的删除 ,复制 ,左右移动

5.linux常用基本命令

1)基础快捷键

代码语言:javascript复制
ctrl   c 停止进程 
ctrl l 清屏;彻底清屏是: reset 
ctrl   q 退出 
善于用 tab键补全 提示 (更重要的是可以防止敲错 ) 
上下键 查找执行过的命令
ctrl  alt

2)文件命令

代码语言:javascript复制
#pwd 显示当前工作目录的绝对路径
#ls,ll,ll -a 
#cd 进入到某一个目录下
#mkdir 创建文件夹 
#rmdir 删除文件夹 
#touch 创建文件 
#cp 复制文件 /文件夹 
#cp -r 递归复制,多级目录
#mv 移动文件 夹/重命名
#rm 删除文件 
#rm -rf 强制删除文件不需要确认
#cat 查看文件
#more 查看文件
#less 查看文件
#echo 输出 #head 查看文件头部
#tail 查看文件末尾
#tail -f 实时查看文件末尾
#nl 文件带行号标准输出
# > 覆盖 
# >> 追加
#ln -s 目标目录 软链接地址 创建 软链接
rm -rf 软链接地址 删除软连接
ln -snf 新目标目录 软链接地址 修改软连接
# history 查看已经执行过历史命令

3)文本处理类命令

代码语言:javascript复制
wc [option] [file]... 
    -l: 统计行数 
    -c: 统计字节数 
    -w;统计单词数

tr: 转换字符或删除字符 
    tr '集合 1' '集合 2' 
    tr -d '字符集合 '

cut:
    -d字符:指定分隔符   
    -f#: 指定要显示字段   
    单个数字:一个字段   
    逗号分隔的多个数字:指定多个离散字段   
    -:连续字段,如 3-5;
    例子:cut test.txt -f "1,3" -d " "------# 以空格分开每一行并输出第 1个和第 3个字段

sort [option] file... 
    -f: 忽略字符大小写;
    -n: 比较数值大小;
    -t: 指定分隔符 
    -k: 指定分隔后进行比较字段
    -u: 重复的行,只显示一次;
uniq:移除重复的行
    -c:显示每行重复的次数
    -d:仅显示重复过的行
    -u: 仅显示不曾重复的行

4)系统信息命令

代码语言:javascript复制
#date 查看当前系统时间
#data -s 修改时间 
#w 显示登陆用户
#uname -a 查看系统内核
#cat /proc/cpuinfo 查看 cpu信息 
#cat /proc/meminfo 查

5)压缩/解压命令

代码语言:javascript复制
#tar -xvf file.tar 解压 .tar结尾的 
#tar -zxvf file.tar.gz 解压 .tar.gz文件 
#tar -cf file.tar file 创建包含 files的文件 file.tar 
#gzip -d file.gz 将 file.gz解压缩为 file

6)网络命令

代码语言:javascript复制
#ping host(主机名 ) 网络是否连通 
#telnet ip 端口  网络是否连通
#curl url 调用
#ifconfig 查看本机 ip等信息
#telnet ip 端口 查看端口是否占用
(没有这个命令执行 yum -y install telnet ) 
#wget file 下载文件 
#tcpdump tcp port 端口 抓包 tcp
#hostname  查看主机名

7)权限命令

代码语言:javascript复制
1.文件权限命令:
#chmod 777 file 为所有用户添加读,写,执行权限
#chmod 755 file 为所有者添加 rwx权限,为组和其他用户添加
rx权限 
2.文件所属用户和用户组权限命令:
#chown hadoop:hadoop file 将 file的用户和用户组都改为 hadoop

8)用户管理命令

代码语言:javascript复制
useradd 用户名 添加新用户 
useradd -g 组名 用户名 给某个组创建用户
passwd 用户名 设置用户密码 
cat /etc/passwd 查看创建了那些用户
Su 用户名 切换用户 
userdel 用户名 删除用户但保存用户主目录
userdel -r 用户名 用户和用户主目录,都删除
whoami 显示自身用户名称
who am i 显示登录用户的用户名
usermod -g 更改用户组 用户名


例子:
2.修改配置文件
[root@hadoop101 ~]#vi /etc/sudoers 修改 /etc/sudoers 文件,找到下面一行 (91行),在 root下面添加一行,
如下所示:
## Allow root to run any commands anywhere 
root ALL=(ALL) ALL 
hadoopALL=(ALL) ALL 
或者配置成采用 sudo命令时,不需要输入密码
## Allow root to run any commands anywhere 
root ALL=(ALL) ALL 
hadoopALL=(ALL) NOPASSWD:ALL 
修改完毕,现在可以用 hadoop帐号登录,然后用命令 sudo ,即可 获得 root权限进行操作。

9)用户组管理命令

代码语言:javascript复制
groupadd 组名 添加组
groupdel 组名 删除组
groupmod -n 新组名 老组名 指定工作组的新组名
cat /etc/group 查看创建了哪些组

10)搜索查找命令

代码语言:javascript复制
1.find查找文件或者目录
    常用: find / -name file 查找 /目录下 file文件
2.grep 过滤查找及“ “|”管道符 (详细使用见下一章中的 grepgrep)
    1.管道符,“ ,“|”,表示将前一个命令的处理结果输出传递给后面的命令处理
    2.grep常常跟在 |的后面做过滤查找
    3.反转 grep -v 
    4.示例 
        #查找某文件在第几行 ls | grep -n test 
        #查找某进程 ps -ef | grep PID 
        #查看日志中含有 errer cat file |grep error
3.which 查找命令
    white 命令

11)磁盘分区挂载命令

代码语言:javascript复制
df -h 查看磁盘使用 /剩余空间 
fdisk -l 磁盘分区
mount 挂载
umount 卸载

12)进程管理命令

代码语言:javascript复制
UID 用户 ID 
PID 进程 ID 
ps aux | grep xxx 查看系统中所有进程
ps -ef | grep xxx 可以查看子父进程之间的关系
kill -9 PID 强制杀死进程
top 查看所有进程 /cpu/内存 /负载 
netstat -anp |grep 进程号 查看该进程网络信息
netstat -nlp | grep 端口号 查看网络端口号占用情况

13)crond系统定时任务

Crontab -e 编辑定时文件

参考文档:https://blog.csdn.net/qq_22172133/article/details/81263736

14)rpm包管理与yum管理

代码语言:javascript复制
1.rpm相关命令:
rpm -qa|grep 包名 查找已经安装的 rpm某包 
rpm -ivh 包名 安装 rpm包 
rpm -e 包名 删除 rpm包 
rpm -e -- nodeps 软件包 删除 rpm包不检查依赖
2.yum源管理:详情见链接文档
https://blog.csdn.net/qingfenggege/article/details/80394564 
3.yum在线安装 lrzsz上传下载工具
yum -y install lrzsz

15)ssh免密

代码语言:javascript复制
1.ssh是什么? 
SSH(SecureShell),是建立在应用层基础上的安全协议,其 SSH客户端适用于多种平台,可以有效防止远程管理过程中的信息泄露问题。
2.配置 hadoop用户 ssh免密: 
ssh-keygen -t rsa 
三台机器在 hadoop用户下,执行以下命令将公钥拷贝到 node01服 务器上面去
ssh-copy-id node01 
node01在 hadoop用户下,执行以下命令,将 authorized_keys拷贝 到 node02与 node03服务器 
cd /home/hadoop/.ssh/ scp authorized_keys node02:$PWD
scp authorized_keys node03:$PWD

16)防火墙

代码语言:javascript复制
systemctl stop firewalld.service 关闭防火墙
systemctl status firewalld.service 查看防火墙状态
systemctl disable firewalld.service 禁止开启启动防火墙

6.linux实用故障排查

1)排查思路

大数据集群运行在linux系统上总会遇见各种各样的问题,我们要定位问题,基本从这几个方面入手排查: cpu, 内存,磁盘 IO,网络, GC等。

2) cpu

一些概念:多核,超线程,CPU频率( 2.2GHZ)(节能模式,普通模式,超能模式,bios里设置, 搭集群要注意下这个参数尽量关闭节能模式) bios里可以关闭 。

#1 查看物理 CPU个数 cat /proc/cpuinfo |grep “physical id”|sort |uniq|wc -l

#2查看逻辑 cpu个数 cat /proc/cpuinfo |grep “processor”|wc -l

#3 在生产集群中我们通常通过 top来查看 cpu的使用率来判断系统 的负载情况 ,Top 然后按 1,可以看到 cpu的使用率

3)内存

#1,常见内存大小 64 G— 128G– 256G— 512G,通过 free -g来查看系 统内存是否不足

4)磁盘IO

#1磁盘种类: sata(150M/s左右 ) sas(300 M/S左右) ssd(最快也最贵)一般磁盘 2T-4T,服务器支持的最大存储也不同,比较常见的 48T,一 般服务器可以支持 12-24块盘 。

#2磁盘 io的查看: 可以定位是否是因为 io过大导致性能下降 iostat -mx 2 如果没有这个命令:yum install -y sysstat

#3 df -h 查看磁盘空间

#4 df -T 查看磁盘的格式化的格式,主流一般是 xfs和 ext4,系统盘默认是 xfs,后续添加数据盘尽量也是 xfs格式这样统一比较好,也方便写脚本批量挂盘

#5 lsblk 能够查看盘与分区以及 ssd盘,用 fdisk查看盘可能识别不到ssd

#6 fdisk -l 查看磁盘与未挂载的磁盘和分区信息

#7 cat /etc/fstab 查看磁盘挂载信息,新加磁盘要手动永久挂在需要在这个配置文件里添加, 6列。如果这个文件写错了,重启服务器正常模式下是启动不了的!!!

5)网络

#1 查看是否 ping通:ping IP

#2 查看某端口是否被监听 示例:比如你起启动datanode没有启动,查看日志报错: Address in used ,翻译过来就是端口被占用,那你得查看下这个端口被哪个程序占用了,就用 netatat -anp|grep 端口号,就可以知道它的进程,比如下图进程pid就是 107484,就可以用 kill -9 PID强制杀死

#3网卡模式配置( bound6,负载均衡

6)系统负载

Top Uptime W cat /proc/loadavg

7)GC问题

#1是否 full GC(GC是 java里面 JVM的东西,不了解的可以去看下) Jps查出要查看的 pid,用 jstat -gcutil pid,看第四列 O如果 100%就是 fullGC

8)日志查看

#1首先要知道日志的位置 ,一种是去配置文件查看有没有配置相关位置,一种是去通过进程查看如下 用 ps -ef |grep pid通过显示出来的信息可以找到日志的位置 。

# 2查看日志 实时查看日志文件后100行: tail -f 100 file 静态查看:vim filelog,然后 可以通过关键字 error/warn等查

7.linux运维之生产监控工具

1.zabbix:https://blog.51cto.com/u_14154700/2419934

2.nagios(网络监控):https://www.cnblogs.com/52-qq/p/9773880.html

3.Prometheus(普罗米修斯 ):https://blog.csdn.net/csolo/article/details/82460539

4.ganglia (hadoop集群监控常用工具):https://www.cnblogs.com/marility/p/9444357.html

8.自动化运维工具ansible与pdsh

https://www.cnblogs.com/keerya/p/7987886.html#_label2_0_1

https://blog.csdn.net/weixin_42193400/article/details/82148974

9.并行管理工具 pdsh与 pssh

相关文档:https://www.cnblogs.com/goldenblade/p/9604642.html

10.linux知识点扩展

1)运行级别

运行级别 0:系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动 运行级别 1:单用户工作状态 root权限,用于系统维护,禁止远程登陆运行级别

2:多用户状态 (没有 NFS) 运行级别

3:完全的多用户状态 (有 NFS),登陆后进入控制台命令行模式运行级别

4:系统未使用,保留运行级别

5:X11控制台,登陆后进入图形 GUI模式 运行级别 6:系统正常关闭并重启,默认运行级别不设为

6,否则不能正常启动

2)运行级别原理

1.在目录 /etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service)

2.在/etc/rc.d下有 7个名为 rcN.d的目录,对应系统的 7个运行级别

3.rcN.d目录下都是一些符号链接文件,这些链接文件都指向 init.d目 录下的 service脚本文件,命名规则为 K nn 服务名或 S nn 服务名,其中 nn为两位数字。 4。系统会根据指定的运行级别进入对应的 rcN.d目录,并按照文件名顺序检索目录下的链接文件 对于以 K开头的文件,系统将终止对应的服务对于以 S开头的文件,系统将启动对应的服务 5。查看运行级别用: runlevel

6。进入其它运行级别用: init N

7。另外 init0为关机, init 6为重启系统 由于现在的 Linux系统安装完后就运行在第 5个级别,即系统启动后直接进入图形界面,而不用在字符模式下登录后用 startx或者 xinit 来起动图形界面。建议在系统安装完成后把系统的默认运行等级设置在第 3级,在字符终端登录后,再手工输入 startx 命令起动图 形界面。可以用如下的方法修改:

用文本编辑器修改 /etc/inittab文件:

把代码 : id:5:initdefault:这一行,修改成代码 : id:3:initdefault:保存后就 reboot重起,系统就默认起动到字符界面。不同运行级别之间的 差别的在于系 统默认起动的服务的不同,如运行级别 3默认不启动 X图形界面服务,而运行级别 5 却默认起动。

本质上是没有区别的,更无所谓不同级别间功能强弱的问题。用户完全可自给定义不同级别的默认服务。在任何运行级别,用户都可用 init 命令来切换到其他运行级别。

3)开机过程

通电 ->BIOS->MBR->GRUB->Kernel->/sbin/init->Runlevel

1.BIOS

BIOS: Basic Input/Output System 执行系统完整性检查,从软盘,光盘,硬盘中查找 boot loader(取决与你的启动顺序)BIOS的主要功能就是搜索并加载执行 MBR boot loader程序

2.MBR

MBR: Master Boot Record. MBR位于主盘的第一快扇区,如 :/dev/hda或者 /dev/sda.MBR共 512bytes. 1-446bytes存放主要的 boot loader信息, 447~510bytes存放 分区表信息,最后 2个 bytes存放 mbr验证信息。MBR包含 GRUB信息。(或者 LILO信息) MBR 的主要功能就是加载并执行 GRUB boot loader。

3.GRUB

GRUB:Grand Unified Bootloader. 如果你有多个 kernel p_w_picpaths安装在你的系统中,你可以通过GRUB选择那个被执行。GRUB启动的时候会有个选择界面,几秒钟没有任何输入的话,将会 加载你 GRUB配置文件中指定的默认 kernel p_w_picpath 。

GRUB的配置文件:/boot/grub/grub.conf (/etc/grub.conf is a link to this).

GRUB 的主要功能就是加载并执行 Kernel and initrd p_w_picpaths.

4.Kernel

挂载 grub.conf 中指定 “root=” 的根目录 执行 /sbin/init 程序 因为 /sbin/init 是 LINUX kernel执行的第一程序,理所当然 /sbin/init 的 PID为 1. ‘ps -ef | grep init’ 命令可以验证 .

initrd: Initial RAM Disk. 在 kernel完全起来, root文件系统被挂载之前, initrd被 kernel当做 临时 root文件系统。当然 initrd还包含了一些编译好的驱动,这些驱动用来在启动的时候访问硬件。

5.Init

查看 /etc/inittab配置文件来决定 Linux的运行( run level)。

LINUX的运行级别: 0 – halt (关机 )

1 – Single user mode (单用户模式 )

2 – Multiuser, without NFS (多用户模式 ,无网络 )

3 – Full multiuser mode (多用户模式 ,有网络 ,无图形界面 )

4 – unused (没用 ,用户自定义 )

5 – X11 (多用户模式 ,有网络 ,有图形界面 )

6– reboot (重启 )

Init从/etc/inittab配置文件中得到默认启动级别,然后加载并执行相应级别的程序 . 执行 ‘grep initdefault /etc/inittab’ 命令可得到你系统的默认启动级别 。

6.Runlevel programs

当 LINUX系统启动完成后,你会发现许多的服务进程也启动了,例如:“starting sendmail …. OK”. 这些服务程序都放在相应 LINUX系 统启动级别的文件夹下面。根据你 LINUX默认启动级别,系统将会执行以下其中一个文件架下面的服务程序:

Run level 0 – /etc/rc.d/rc0.d/

Run level 1 – /etc/rc.d/rc1.d/

Run level 2 – /etc/rc.d/rc2.d/

Run level 3 – /etc/rc.d/rc3.d/

Run level 4 – /etc/rc.d/rc4.d/

Run level 5 – /etc/rc.d/rc5.d/

Run level 6 – /etc/rc.d/rc6.d/

11.linux的零拷贝

参考文档:https://www.cnblogs.com/skying555/p/11122072.html

“零拷贝 ” 描述的是 CPU不执行拷贝数据从一块内存区域到另一块区域的任务的计算机操作。它通常用于在网络上传输文件时节省 CPU周期和内存带宽。简单来说,零拷贝就是一种避免 CPU 将数据从一 块存储拷贝到另外一块存储的技术。 “零拷贝 ”正是通过消除这些 多余的拷贝来提升性能的 。在数据传输的过程中, 避免数据在内核空间缓冲区和用户空间缓冲区之间进行拷贝 ,以及数据在内核空间缓冲区内的 CPU拷贝 。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134133.html原文链接:https://javaforall.cn

0 人点赞