1. Linux安装

1.1 安装方式介绍

Linux系统的安装方式,主要包含以下两种:

方式概述场景
物理机安装直接将操作系统安装到服务器硬件上企业开发中,我们使用的服务器基本都是采用这种方式
虚拟机安装通过虚拟机软件安装我们在学习阶段,没有自己服务器,而我们又需要学Linux,就可以安装在虚拟机上

虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能、运行在完全隔离环境中的完整计算机系统。常用虚拟机软件:

  • VMWare
  • VirtualBox
  • VMLite WorkStation
  • Qemu
  • HopeddotVOS

那么我们就可以在课程中将Linux操作系统安装在虚拟机中,我们课上选择的虚拟机软件是VMware。

1.2安装Linux

VMware虚拟机安装完毕之后,我们就可以打开VMware,并在上面来安装Linux操作系统。具体步骤如下:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
启动虚拟机->选择"Install CentOS7"->选择语言为 “简体中文”->选择"自动配置分区"
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 网卡设置

服务器重启完成之后,我们可以通过linux的指令 ip addr 来查询Linux系统的IP地址,具体信息如下:

从图中看到,并没有获取到linux系统的IP地址,于启动服务器时未加载网卡,导致IP地址初始化失败而造成的。需要来修改网络初始化配置,设定网卡在系统启动时初始化。

具体操作步骤如下:

1). 修改网卡的配置项
vim /etc/sysconfig/network-scripts/ifcfg-ens33

cd /				进入根目录
cd etc				进入etc目录
cd sysconfig		进入sysconfig目录
cd network-scripts	进入network-scripts
vi ifcfg-ens33		编辑ifcfg-ens33文件


进入文件后执行如下操作:. 按 i 键 		 进入编辑状态
②. 按↑↓键来移动光标, 删除no,输入yes 
③.ESC 键
④. 输入 :wq
⑤.ENTER	保存退出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sNGE5CxT-1653737461405)(assets/image-20210809234131816.png)]

1.4 安装SSH连接工具

FinalShell下载安装

下载地址

默认安装即可

连接Linux

1). 打开finalShell

2). 建立连接

3). 输入Linux的IP地址与用户名和密码

2. Linux目录结构

登录到Linux系统之后,我们需要先来熟悉一下Linux的目录结构。在Linux系统中,也是存在目录的概念的,但是Linux的目录结构和Windows的目录结构是存在比较多的差异的 在Windows目录下,是一个一个的盘符(C盘、D盘、E盘),目录是归属于某一个盘符的。Linux系统中的目录有以下特点:

  • / 是所有目录的顶点

  • 目录结构像一颗倒挂的树

Linux 和 Windows的目录结构对比:

Linux的目录结构,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dAnBoGuL-1653737461408)(assets/image-20210810174954476.png)]

根目录/ 下各个目录的作用及含义说明:

编号目录含义
1/bin存放二进制可执行文件
2/boot存放系统引导时使用的各种文件
3/dev存放设备文件
4/etc存放系统配置文件
5/home存放系统用户的文件
6/lib存放程序运行所需的共享库和内核模块
7/opt额外安装的可选应用程序包所放置的位置
8/root超级用户目录
9/sbin存放二进制可执行文件,只有root用户才能访问
10/tmp存放临时文件
11/usr存放系统应用程序
12/var存放运行时需要改变数据的文件,例如日志文件

3. Linux系统版本

Linux系统的版本分为两种,分别是: 内核版 和 发行版。

1). 内核版

  • 由Linus Torvalds及其团队开发、维护

  • 免费、开源

  • 负责控制硬件

2). 发行版

  • 基于Linux内核版进行扩展

  • 由各个Linux厂商开发、维护

  • 有收费版本和免费版本

常用的Linux操作系统选择的是Linux的发行版本。在linux系统中,有各种各样的发行版本,具体如下:

发行版本特点
Ubuntu以桌面应用为主
RedHat应用最广泛、收费
CentOSRedHat的社区版、免费
openSUSE对个人完全免费、图形界面华丽
Fedora功能完备、快速更新、免费
红旗Linux北京中科红旗软件技术有限公司开发

除了上述罗列出来的发行版,还有很多Linux发行版。

4. Linux常用命令

4.1 常用命令

序号命令对应英文作用
1ls [参数] [目录名] list查看当前目录下的内容
2pwd print work directory查看当前所在目录
3cd [目录名]change directory切换目录
4touch [文件名] touch如果文件不存在,创建文件
5mkdir [-p] [目录名] make directory创建目录
6rm [-r] [文件名] remove删除指定文件
7ps [-ef] process status显示当前系统所有进程状态
8kill [-15] [进程号] kill结束执行中的程序或工作
9tail [-f] [文件名] tail动态读文件尾数据
10rpm [参数] [软件名] Red-Hat Package Manager管理软件
11nohup [jar包名].jar &> [日志名].log &no hang up程序后台运行,日志输出到文件
12chmod 777 [文件名] change mode为所有用户授予读、写、执行权限
4.1.2 Linux命令使用技巧

在我们使用Linux系统命令时,可以使用以下几个技巧:

1). Tab键自动补全

2). 连续两次Tab键,给出操作提示

3). 使用上下箭头快速调出历史的命令

4). 使用clear命令或者Ctrl+l快捷键实现清屏

4.1.3 Linux命令格式
command [-options] [parameter]
	
说明: 
	command: 	 命令名
	[-options]:  选项,可用来对命令进行控制,也可以省略
	[parameter]: 传给命令的参数,可以是零个、一个或者多个
	
注意: 
	[] 	 代表可选
	命令名、选项、参数之间有空格进行分隔

操作示例:
[(img-lybl3vMK-1653737981652)(assets/image-20210810192202455.png)]

4.2 文件目录命令

4.2.1 ls 显示
作用: 显示指定目录下的内容
语法: ls [-al] [dir]
说明: 
	-a 显示所有文件及目录 (. 开头的隐藏文件也会列出)
	-l 除文件名称外,同时将文件型态(d表示目录,-表示文件)、权限、拥有者、文件大小等信息详细列出
	
注意: 
	由于我们使用ls命令时经常需要加入-l选项,所以Linux为ls -l命令提供了一种简写方式,即ll
	
常见用法: 
	ls -al 	查看当前目录的所有文件及目录详细信息
	ls -al /etc   查看/etc目录下所有文件及目录详细信息
	ll  	查看当前目录文件及目录的详细信息 

在这里插入图片描述

4.2.2 cd 切换目录
作用: 用于切换当前工作目录,即进入指定目录
语法: cd [dirName]
	
特殊说明: 
	~	表示用户的home目录
	. 	表示目前所在的目录
	.. 	表示目前目录位置的上级目录
	
举例: 
	cd 	..		切换到当前目录的上级目录
	cd 	~		切换到用户的home目录
	cd 	/usr/local	切换到/usr/local目录
	cd ../.. 来切换到上级目录的上级目录。

备注:

​ 用户的home目录

​ root用户 /root

​ 其他用户 /home/xxx

4.2.3 cat 读文件
作用: 用于显示文件内容
语法: cat [-n] fileName

说明:
	-n: 由1开始对所有输出的行数编号

举例:
	cat /etc/profile		查看/etc目录下的profile文件内容

cat 指令会一次性查看文件的所有内容,如果文件内容比较多,这个时候查看起来就不是很方便了,这个时候我们可以通过一个新的指令more。

4.2.4 more 分页读文件
作用: 以分页的形式显示文件内容
语法: more fileName

操作说明:
    [Enter] 向下滚动一行
    [space] 向下滚动一屏
    b 		返回上一屏
    q/Ctrl+C	退出more
	
举例:
	more /etc/profile		以分页方式显示/etc目录下的profile文件内容

比较大的文件时,可能需要经常查询文件尾部的数据信息,需要一直向下翻页,直到最后一页,去看最新添加的数据,这种方式就适合使用tail指令。

4.2.5 tail 动态读文件尾、读文件尾
作用: 查看文件末尾的内容
语法: tail [-f] fileName

说明:
	-f : 动态读取文件末尾内容并显示,通常用于日志文件的内容输出

tail /etc/profile		显示/etc目录下的profile文件末尾10行的内容
tail -20 /etc/profile	显示/etc目录下的profile文件末尾20行的内容
tail -f /itcast/my.log	动态读取/itcast目录下的my.log文件末尾内容并显示

使用快捷键 Ctrl+C , 结束当前进程。

4.2.6 mkdir 创建目录
作用: 创建目录
语法: mkdir [-p] dirName

说明: 
	-p: 确保目录名称存在,不存在的就创建一个。通过此选项,可以实现多层目录同时创建

举例: 
    mkdir whr在当前目录下,建立一个名为itcast的子目录
    mkdir -p whr/test   在工作目录下的whr目录中建立一个名为test的子目录,若whr目录不存在,则建立一个
4.2.7 rmdir

不能删除非空目录

作用: 删除空目录
语法: rmdir [-p] dirName

说明:
	-p: 当子目录被删除后使父目录为空目录的话,则一并删除

举例:
    rmdir whr删除名为whr的空目录
    rmdir -p whr/test   删除whr目录中名为test的子目录,若test目录删除后whr目录变为空目录,则也被删除
    rmdir whr*   删除名称以whr开始的空目录

*: 是一个通配符,代表任意字符;

rmdir whr* : 删除以itcast开头的目录

rmdir *whr : 删除以itcast结尾的目录

4.2.8 rm
作用: 删除文件或者目录
语法: rm [-rf] name

说明: 
    -r: 将目录及目录中所有文件(目录)逐一删除,即递归删除
    -f: 无需确认,直接删除
	
举例: 
    rm -r itcast/     删除名为itcast的目录和目录中所有文件,删除前需确认
    rm -rf itcast/    无需确认,直接删除名为itcast的目录和目录中所有文件
    rm -f hello.txt   无需确认,直接删除hello.txt文件

注意: 对于 rm -rf xxx 这样的指令,在执行的时候,一定要慎重,确认无误后再进行删除,避免误删。

4.3 拷贝移动命令

4.3.1 cp 拷贝、重命名
作用: 用于复制文件或目录
语法: cp [-r] source dest

说明: 
	-r: 如果复制的是目录需要使用此选项,此时将复制该目录下所有的子目录和文件

举例: 
    cp hello.txt whr/            将hello.txt复制到whr目录中
    cp hello.txt ./hi.txt           将hello.txt复制到当前目录,并改名为hi.txt
    cp -r whr/ ./test/    	将whr目录和目录下所有文件复制到test目录下
    cp -r whr/* ./test/ 	 	将whr目录下所有文件复制到test目录下
4.3.2 mv 移动、重命名
作用: 为文件或目录改名、或将文件或目录移动到其它位置
语法: mv source dest

举例: 
    mv hello.txt hi.txt                 将hello.txt改名为hi.txt
    mv hi.txt whr/                  将文件hi.txt移动到whr目录中
    mv hi.txt whr/hello.txt   		将hi.txt移动到whr目录中,并改名为hello.txt
    mv whr/ test/                 如果test目录不存在,将whr目录改名为test
    mv whr/ test/                 如果test目录存在,将whr目录移动到test目录中

4.4 tar -zxvf 压缩包命令

作用: 对文件进行打包、解包、压缩、解压
语法: tar  [-zcxvf]  fileName  [files]
    包文件后缀为.tar表示只是完成了打包,并没有压缩
    包文件后缀为.tar.gz表示打包的同时还进行了压缩

说明:
    -z: z代表的是gzip,通过gzip命令处理文件,gzip可以对文件压缩或者解压
    -c: c代表的是create,即创建新的包文件
    -x: x代表的是extract,实现从包文件中还原文件
    -v: v代表的是verbose,显示命令的执行过程
    -f: f代表的是file,用于指定包文件的名称

举例:
    打包
        tar -cvf hello.tar ./*		  		将当前目录下所有文件打包,打包后的文件名为hello.tar
        tar -zcvf hello.tar.gz ./*		  	将当前目录下所有文件打包并压缩,打包后的文件名为hello.tar.gz
		
    解包
        tar -xvf hello.tar		  			将hello.tar文件进行解包,并将解包后的文件放在当前目录
        tar -zxvf hello.tar.gz		  		将hello.tar.gz文件进行解压,并将解压后的文件放在当前目录
    解包并指定目录
        tar -zxvf hello.tar.gz -C /usr/local     将hello.tar.gz文件进行解压,并将解压后的文件放在/usr/local目录

4.5 文本编辑命令

文本编辑的命令,主要包含两个: vi 和 vim,两个命令的用法类似

4.5.1 vi&vim介绍

作用: vi命令是Linux系统提供的一个文本编辑工具,可以对文件内容进行编辑,类似于Windows中的记事本

语法: vi fileName

说明:
1). vim是从vi发展来的一个功能更加强大的文本编辑工具,编辑文件时可以对文本内容进行着色,方便我们对文件进行编辑处理,所以实际工作中vim更加常用。
2). 要使用vim命令,需要我们自己完成安装。可以使用下面的命令来完成安装:yum install vim

4.5.2 vim安装

命令: yum install vim

安装过程中,有确认提示,此时输入 y,回车,继续安装:

4.5.3 vim使用

作用: 对文件内容进行编辑,vim其实就是一个文本编辑器
语法: vim fileName
说明:

  1. 在使用vim命令编辑文件时,如果指定的文件存在则直接打开此文件。如果指定的文件不存在则新建文件。
  2. vim在进行文本编辑时共分为三种模式,分别是 命令模式(Command mode),插入模式(Insert mode)和底行模式(Last line mode)。这三种模式之间可以相互切换。我们在使用vim时一定要注意我们当前所处的是哪种模式。

三种模式:

  • 命令模式

    1. 命令模式下可以查看文件内容、移动光标(上下左右箭头、gg、G)
    2. 通过vim命令打开文件后,默认进入命令模式
    3. 另外两种模式需要首先进入命令模式,才能进入彼此
    命令模式指令含义
    gg定位到文本内容的第一行
    G定位到文本内容的最后一行
    dd删除光标所在行的数据
    ndd删除当前光标所在行及之后的n行数据
    u撤销操作
    shift+zz保存并退出
    i 或 a 或 o进入插入模式
  • 插入模式

    1. 插入模式下可以对文件内容进行编辑
    2. 在命令模式下按下[i,a,o]任意一个,可以进入插入模式。进入插入模式后,下方会出现【insert】字样
    3. 在插入模式下按下ESC键,回到命令模式
  • 底行模式

    1. 底行模式下可以通过命令对文件内容进行查找、显示行号、退出等操作
    2. 在命令模式下按下[:,/]任意一个,可以进入底行模式
    3. 通过/方式进入底行模式后,可以对文件内容进行查找
    4. 通过:方式进入底行模式后,可以输入wq(保存并退出)、q!(不保存退出)、set nu(显示行号)
    底行模式命令含义
    :wq保存并退出
    :q!不保存退出
    :set nu显示行号
    :set nonu取消行号显示
    :n定位到第n行, 如 :10 就是定位到第10行

4.6 find、grep查找命令

4.6.1 find
作用: 在指定目录下查找文件
语法: find dirName -option fileName

举例:
    find  .  –name "*.java"			在当前目录及其子目录下查找.java结尾文件
    find  /whr-name "*.java"	在/whr目录及其子目录下查找.java结尾的文件
4.6.2 grep
作用: 从指定文件中查找指定的文本内容
语法: grep word fileName
举例: 
    grep Hello HelloWorld.java	查找HelloWorld.java文件中出现的Hello字符串的位置
    grep hello *.java			查找当前目录中所有.java结尾的文件中包含hello字符串的位置

4.7 ps 进程命令

作用: 显示当前系统的进程状态
语法: ps [-ef]

举例: 
    ps -ef|grep tomcat	查找当前进程中名字包含tomcat的进程
    ps -u root			显示指定用户信息
   
  • ps命令是linux下非常强大的进程查看命令,通过ps -ef可以查看当前运行的所有进程的详细信息
  • “|” 在Linux中称为管道符,可以将前一个命令的结果输出给后一个命令作为输入
  • 使用ps命令查看进程时,经常配合管道符和查找命令 grep 一起使用,来查看特定进程

4.8 kill 结束命令

作用: 显示当前系统的进程状态
语法: kill [-9] uuid

举例: 
   kill -9 79947 	强制结束进程号为79947的进程
   kill -15 79947   正常关闭进程号为79947的进程
   

4.9 rpm 管理软件包命令

作用: 显示当前系统的进程状态
语法: rpm [参数] [软件包名]

举例: 
   rpm -qa 	查询当前系统中安装的所有软件
   rpm -qa | grep mysql  查询当前系统带mysql名称的软件
   rpm -e --nodeps [软件包名]  卸载软件
   rpm -U file.rpm 升级软件包

   

4.10 netstat 网络相关信息命令

作用: 用来打印Linux中网络系统的状态信息,Linux系统的网络情况
语法: rnetstat -tunlp	
说明:
	-l或--listening:显示监控中的服务器的Socket;
	-n或--numeric:直接使用ip地址,而不通过域名服务器;
	-p或--programs:显示正在使用Socket的程序识别码和程序名称;
	-t或--tcp:显示TCP传输协议的连线状况;
	-u或--udp:显示UDP传输协议的连线状况;

举例: 
	netstat -tunlp					查看已经启动的服务
	netstat -tunlp | grep mysql		查看mysql的服务信息

	ps –ef | grep mysql				查看mysql进程

   

4.11 yum 在线软件安装方式

作用: 一种在线软件安装方式,本质上还是rpm安装,自动下载安装包并安装,安装过程中自动解决库依赖问题(安装过程需要联网)
语法: yum 

举例: 
	yum list lrzsz  列出lrzsz安装包
	yum install lrzsz  在线安装git
	yum update  升级现有软件及系统内核

yum拓展知识:

​ 1. 如果在不更改软件来源的情况下,是需要联网才能使用yum的,那么我们安装的软件是从哪儿下载的呢,这里就涉及到一个概念: yum源。

​ 2. 我们可以通过一个指令,来检查当前的yum源

 ​

​ 从图中,我们可以看到我们安装的 CentOS7 采用的是网易的163yum源。

​ 3. 网络 yum 源配置文件位于 /etc/yum.repos.d/ 目录下,文件扩展名为"*.repo"

​ 可以看到,该目录下有 7 个 yum 配置文件,通常情况下 CentOS-Base.repo 文件生效。

​ 4. 添加阿里云yum源

​ A. 先通过 yum install wget ,安装wget命令

​ B. 备份默认的网易163的yum源,执行指令 :

​ 切换目录: cd /etc/yum.repos.d/

​ 创建备份目录: mkdir bak

​ 移动现有的yum源文件到bak: mv *.repo bak/

​ C. 下载阿里云的yum源

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

​ D. 执行命令,重新生成cache

yum clean all

yum makecache

​ E. 再次查看yum源

​ 之后,我们通过yum指令安装软件,就是从阿里云下载的。

4.12 nohup 不挂断地运行指定命令

作用: 用于不挂断地运行指定命令,退出终端不会影响程序的运行
语法: nohup Command [ Arg … ] [&]

参数说明:
	Command:要执行的命令
	Arg:一些参数,可以指定输出文件
	&:让命令在后台运行

举例:
	nohup java -jar boot工程.jar &> hello.log &
	上述指令的含义为: 后台运行 java -jar 命令,并将日志输出到hello.log文件


5. 防火墙操作

防火墙自动启动,防火墙拦截了所有端口的访问。操作防火墙,具体指令如下:

操作指令备注
查看防火墙状态systemctl status firewalld / firewall-cmd --state
暂时关闭防火墙systemctl stop firewalld
永久关闭防火墙(禁用开机自启)systemctl disable firewalld下次启动,才生效
暂时开启防火墙systemctl start firewalld
永久开启防火墙(启用开机自启)systemctl enable firewalld下次启动,才生效
开放指定端口firewall-cmd --zone=public --add-port=8080/tcp --permanent需要重新加载生效
关闭指定端口firewall-cmd --zone=public --remove-port=8080/tcp --permanent需要重新加载生效
立即生效(重新加载)firewall-cmd --reload
查看开放端口firewall-cmd --zone=public --list-ports
查看网络连接状态和监听端口netstat -tuln

注意:

​ A. systemctl是管理Linux中服务的命令,可以对服务进行启动、停止、重启、查看状态等操作

​ B. firewall-cmd是Linux中专门用于控制防火墙的命令

​ C. 为了保证系统安全,服务器的防火墙不建议关闭

6. Linux权限

linux系统是一个多用户的操作系统,并且针对每一个用户,Linux会严格的控制操作权限。

1). chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令

2). Linux中的权限分为三种 :读( r )、写(w)、执行(x)

3). Linux文件权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)

4). 只有文件的所有者和超级用户可以修改文件或目录的权限

5). 要执行Shell脚本需要有对此脚本文件的执行权限(x),如果没有则不能执行

Linux系统中权限描述如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uBBRZsG4-1653740545635)(assets/image-20210815162945754.png)]

解析当前脚本的权限情况:

chmod命令可以使用八进制数来指定权限(0 - 代表无 , 1 - 执行x , 2 - 写w , 4 - 读r):

权限rwx
7读 + 写 + 执行rwx
6读 + 写rw-
5读 + 执行r-x
4只读r–
3写 + 执行-wx
2只写-w-
1只执行–x
0

举例:

chmod 777 bootStart.sh   为所有用户授予读、写、执行权限
chmod 755 bootStart.sh   为文件拥有者授予读、写、执行权限,同组用户和其他用户授予读、执行权限
chmod 210 bootStart.sh   为文件拥有者授予写权限,同组用户授予执行权限,其他用户没有任何权限

注意:

三个数字分别代表不同用户的权限

  • 第1位表示文件拥有者的权限
  • 第2位表示同组用户的权限
  • 第3位表示其他用户的权限

7. 设置静态IP

1). 设置静态IP

设置静态ip,我们就需要修改 vim /etc/sysconfig/network-scripts/ifcfg-ens33配置文件,内容如下:

​​​​​​​TYPE=Ethernet   #设备类型
PROXY_METHOD=none
BROWSER_ONLY=no
#是否启动DPCH:none为禁止使用;static是使用静态ip;DPCH为使用DPCH服务​​​​​​
​​​​​​​#如果要设定多网口绑定bond,必须为none
BOOTPROTO=static
IPADDR="192.168.30.100"        # 设置的静态IP地址
NETMASK="255.255.255.0"        # 子网掩码
GATEWAY="192.168.30.2"         # 网关地址
DNS1="192.168.30.2"            # DNS1服务器
DNS2="192.168.30.3"            # DNS2服务器     
DEFROUTE=yes                   #default route  是否把这个网卡设置为ipv4默认路由    
IPV4_FAILURE_FATAL=no          #如果ipv4设置失败则禁用设备
IPV6INIT=yes				   #是否使用ipv6
IPV6_AUTOCONF=yes			   #ipv6自动配置
IPV6_DEFROUTE=yes			   #是否把这个网卡设置为ipv6默认路由
IPV6_FAILURE_FATAL=no 	       #如果ipv6设置失败则禁用设备
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33					   #网络连接的名字
UUID=afd0baa3-8bf4-4e26-8d20-5bc426b75fd6	#随机的唯一标识
DEVICE=ens33				   #网卡名称
ONBOOT=yes					   #启动或重启是否启动该设备
ZONE=public

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ab6fqfXg-1653740545640)(assets/image-20210815171934667.png)]

上述我们所设置的网段为30,需要和我们虚拟机中的虚拟网络编辑器中的NAT模式配置的网关保持一致。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZDDxtB8g-1653740545641)(assets/image-20210815172303896.png)]

2). 重启网络服务

ip地址修改完毕之后,需要重启网络服务,执行如下指令:

systemctl restart network

注意:重启完网络服务后ip地址已经发生了改变,此时FinalShell已经连接不上Linux系统,需要修改当前连接IP地址才能连接到Linux。

Logo

更多推荐