Linux的安装和操作

01_Linux安装和操作

一、回顾

  • keep-alive页面缓存使用
  • 点击显示详情信息
  • 修改删除通讯录信息
  • 项目的本地部署
  • 项目在阿里云服务器中部署

二、目标

  • Centos 简介
  • VMware 虚拟机安装
  • 在 VM 虚拟机中安装 Centos 操作系统
  • XShell 安装
  • 常见目录作用介绍
  • 查询目录内容 ls 命令
  • 目录处理命令

三、内容

1、linux系统介绍

  • Linux,全称GNU/Linux,是一套免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年第一次释出,它主要受到Minix和Unix思想的启发,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debianarchlinux,和基于商业开发的Red Hat Enterprise LinuxSUSEoracle linux等。
  • 发行版本主要有:Debian、RedHat、Centos、Ubuntu、Slackware、clearlinux.

2、Centos 简介

  • CentOS 是一个基于Red Hat Linux 提供的可自由使用源代码的企业级Linux发行版本。每个版本的 CentOS都会获得十年的支持(通过安全更新方式)。新版本的 CentOS 大约每两年发行一次,而每个版本的 CentOS 会定期(大概每六个月)更新一次,以便支持新的硬件。这样,建立一个安全、低维护、稳定、高预测性、高重复性的 Linux 环境。CentOS是Community Enterprise Operating System的缩写。

  • CentOS 是RHEL(Red Hat Enterprise Linux)源代码再编译的产物,而且在RHEL的基础上修正了不少已知的 Bug ,相对于其他 Linux 发行版,其稳定性值得信赖。CentOS在2014初,宣布加入Red Hat。

  • Centos作为主流的一种Linux操作系统,比如后期讲Redis,以及部署一些项目,会把Centos作为服务器操作系统,我们选用Centos,主要是免费,以及稳定。

  • 像详细深入学习Linux,可以参考一本书《鸟哥的私房菜》,pfd文档在今天的资料中。

2、VMware 虚拟机安装

1)、VM的介绍

我们一般用户使用的是windows ,那如何装一个Centos呢,我们一般学习的话,是搞一个VM虚拟机,

在虚拟机里安装一个Centos操作系统来学习,当然正式部署的话 我们一般是从阿里云或者西部数码购买服务器的时候,

选择Centos,那就是一个现成的系统了

2)、安装步骤

下载和安装外链

3、在 VM 虚拟机中安装 Centos 操作系统

1)、下载Centos7

https://www.centos.org/ 这个是Centos官方 最新版本 7  

https://www.centos.org/download/,提供有 DVD安装版本  完整版 以及Min版;

我们为了方便在虚拟机中安装 我们要下载DVD版本,由于是国外线路 比较慢,我们一般是建议下载国内镜像。

有很多科研机构 院校 大型互联网IT公司都提供有镜像下载,我个人推荐 阿里云镜像 https://mirrors.aliyun.com/centos/7/isos/x86_64/

下载那个 DVD版本即可,4.4G左右
  • 因为是国内的阿里云仓库,所以速度会比较快,大概十几分钟到半小时

2)、安装步骤

  • 我们打开之前安装的VM,点击 “创建新的虚拟机

  • 我们选 典型 安装 简单点 然后下一步:

  • 我们稍后安装操作系统 ,点下一步:

  • 这里选 Linux 然后下拉 选CentOS 64位,然后下一步:

  • 这里我们选择下虚拟机安装的位置 (不要太复杂);

  • 默认 下一步:

  • 点完成:

  • OK 至此 一个类似没有操作系统的空壳“机器”安装好了:

  • 接下来,我们在这个“机器”上安装下 Centos操作系统。

3)、配置虚拟机

  • 在安装操作系统之前 我们来给这个“机器”搞下配置。

  • 双击这些配置项,进入配置界面:

  • 这里有个CD/DVD要配置下:

  • 选择使用ISO镜像,要选择我们下载的Centos操作系统的文件:

  • 网络适配器要改下,改成“桥接模式”,这样可以使我们的真是机器和虚拟机能通信:

  • 接下来 我们点击 VM里的 “开启此虚拟机”来安装Centos操作系统。

  • 选第一个 安装:

  • 按 "Enter",开始安装程序;执行一会会出现如下,进入图形界面配置:

  • 我们选中文简体,然后 点“继续”:

  • 这里 假如有 感叹号的地方 要双击进去配置下 然后点“开始安装”:

  • 这里要给最好权限用户 Root 设置下密码 正式环境要复杂点 我们学习的话 简单点的 123456 即可:

  • 然后再等个大概10分钟,让它慢慢安装吧:

  • 安装完后,点下 “重新启动”:

  • 进入系统后,收入用户名Root 以及密码123456 即可进入系统:

  • OK 至此 Centos在虚拟机中安装成功 接下来就是学习下这个系统。

4、finalShell 安装

1)、finalShell 安装

  • finalShell就是一个远程控制Centos的软件;(用finalShell比较方便,试用的都知道,界面也人性化)

  • 一款国内产品FinalShell,还是一块良心国货。初步体验了一下,确实是良心之作。且免费(通用版),支持国货。

    下面附上一些截图和官方连接:

    官网:http://www.hostbuf.com/

  • 安装直接根据提示,一直下一步即可,也不需要额外配置

03

2)、查询系统IP

  • 这里之所以是查看下IP ,是我们后面要建一个Centos远程工具Xshell 连接Centos的时候,需要IP地址,所以我们这里先学会查看虚拟机里的Centos7的IP地址。
  • 输入ip查询命名 ip addr:

40

  • 发现 ens33 没有 inet 这个属性,那么就没法通过IP地址连接虚拟机。

  • 接着来查看ens33网卡的配置: vi /etc/sysconfig/network-scripts/ifcfg-ens33 注意vi后面加空格

    vi是Linux内置的文本编辑器命令 打开文件的意思

41

  • 从配置清单中可以发现 CentOS 7 默认是不启动网卡的(ONBOOT=no)。
  • 按一下i,把这一项改为YES(ONBOOT=yes):

42

  • 然后按 Esc 退出 再出入命令 :wq 再按Enter即可 (备注 :wq 是保存然后退出的意思 后面会专门讲下vi)
  • 然后重启网络服务: sudo service network restart

43

  • 然后我们再输入 ip addr 命令

44

  • 这里 inet属性显示了 虚拟机里的IP 192.168.1.107 (你们的可能和我不一样)

3)、链接到虚拟机

  • 这里我们要新建一个连接,步骤如图所示

04

05

06

07

5、常见目录作用介绍

  • 系统的主要目录结构:

01

  • 我们先切换到系统根目录 / 看看根目录下有哪些目录
[root@localhost ~]# cd /

[root@localhost /]# ls

bin   dev  home  lib64  mnt  proc  run   srv  tmp  var

boot  etc  lib   media  opt  root  sbin  sys  usr

[root@localhost /]# 
  • 这里首先看下 根目录/ 下的 bin 和 sbin
在user下也有bin和sbin

[root@localhost /]# ls usr/

bin  games    lib    libexec  sbin   src

etc  include  lib64  local    share  tmp

[root@localhost /]# 
  • 根目录下的bin和sbin,usr目录下的bin和sbin,这四个目录都是用来保存系统命令的。
bin: 
bin为binary的简写主要放置一些系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。

/usr/bin:
主 要放置一些应用软体工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome*、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb*、wget等。 

/sbin: 
主 要放置一些系统管理的必备程式例如:cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、 runlevel、shutdown等。

/usr/sbin:
放置一些网路管理的必备程式例如:dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等
  • bin目录下的命令普通用户和root用户都可以执行,但是sbin下的命令只有root用户可以执行。
  • 其他目录的介绍和作用
/boot目录,是启动目录,存的是启动相关的文件,该目录下不要乱存东西;

/dev设备文件保存目录

/etc配置文件保存目录

/home普通用户的家目录

/lib系统库保存目录

/mnt系统挂载目录

/media挂载目录

/root超级用户的家目录

/tmp临时目录

/proc直接写入内存的,虚拟文件系统

/sys直接写入内存的,虚拟文件系统

/var系统相关文档内容

6、查询目录内容 ls 命令

  • 首先解释下这块, root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,#代表用户权限 #表示超级用户,$表示普通用户;
  • 查询目录中内容命令 ls (list缩写)
格式 ls [选项]  [文件或目录]
选项:
  -a 显示所有文件,包括隐藏文件
  -l  显示详细信息
  -d 查看目录属性
  -h 人性化显示文件大小
  -i  显示inode
  • 超级用户root默认的当前目录是 root目录
我们可以用pwd命名(Print Working Directory 打印当前工作目录)看到
我们打印下当前目录下文件信息:
[root@localhost ~]# ls
anaconda-ks.cfg
只有一个文件
  • 假如我们要列出所有文件 用 ls -a 把隐藏文件也显示出来
[root@localhost ~]# ls -a
.   anaconda-ks.cfg  .bash_logout   .bashrc  .tcshrc
..  .bash_history    .bash_profile  .cshrc
多了一些文件
  • 我们也可以看其他目录的文件
[root@localhost ~]# ls /etc/
adjtime                   modprobe.d
aliases                   modules-load.d
aliases.db                motd
alternatives              mtab
anacrontab                my.cnf
asound.conf               my.cnf.d
audisp                    NetworkManager
audit                     network
  • 同样也可以看具体某个文件
[root@localhost ~]# ls -l /etc/vconsole.conf
-rw-r--r--. 1 root root 37 6月  10 05:23 /etc/vconsole.conf
  • 我们用 -l 或者 -la 组合 列出详细信息
[root@localhost ~]# ls -l
总用量 4
-rw-------. 1 root root 1237 6月  10 05:24 anaconda-ks.cfg

[root@localhost ~]# ls -la
总用量 24
dr-xr-x---.  2 root root  135 6月  11 21:13 .
dr-xr-xr-x. 17 root root  224 6月  10 05:23 ..
-rw-------.  1 root root 1237 6月  10 05:24 anaconda-ks.cfg
-rw-------.  1 root root    0 6月  11 21:13 .bash_history
-rw-r--r--.  1 root root   18 12月 29 2013 .bash_logout
-rw-r--r--.  1 root root  176 12月 29 2013 .bash_profile
-rw-r--r--.  1 root root  176 12月 29 2013 .bashrc
-rw-r--r--.  1 root root  100 12月 29 2013 .cshrc
-rw-r--r--.  1 root root  129 12月 29 2013 .tcshrc

这里第一列 比如 dr-xr-xr-x.  代表文件类型以及所有者,所属组以及其他者权限
第一位d代表文件类型 常见的有   - 文件 d目录 | 软件链接文件
后面9位 每3位一个组 分别是 所有者u 所属组g 以及 其他者o的权限
权限分三种 r读  w写   x执行
比如  dr-xr-xr-x  这个目录 所有者 所属组 以及其他者 都有 读和执行权限;
比如  -rw------- 这个文件  所有者有读写权限 所属组以及其他者没有权限;
第二列 那个数字  是 硬链接次数 后面再说;
第三列 root  是 所有者;
第四列 root 是 所属组;
第五列 是文件大小;假如看不惯  可用 ls -lh 

[root@localhost ~]# ls -lh
总用量 4.0K
-rw-------. 1 root root 1.3K 6月  10 05:24 anaconda-ks.cfg
第六列的日期是该文件最后一次修改时间;
最后一列 是文件名称
  • 查看目录属性 要加 -d
[root@localhost ~]# ls -ld /etc/
drwxr-xr-x. 78 root root 8192 6月  13 15:50 /etc/
  • 查看文件的inode属性 类似 主键 唯一识别文件的Id 用 -i
[root@localhost ~]# ls -li
总用量 4
33574979 -rw-------. 1 root root 1237 6月  10 05:24 anaconda-ks.cfg
33574979 就是inode属性

7、目录处理命令

  • linux中 关于目录 有几个重要概念
一个是 / 根目录  还有一个当前用户的家目录 比如 root用户的家目录是 /root  普通用户的家目录是/home/xxx下
  • root登录 默认家目录 是root 我们这里先用 cd .. 进入 / 根目录
[root@localhost ~]# cd ..
[root@localhost /]# 
  • 然后我们看下 根目录 / 下有哪些目录
[root@localhost /]# ls 
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@localhost /]# 
  • 我们用 cd 回到家目录
[root@localhost /]# cd
[root@localhost ~]# 
  • 创建目录命令 mkdir (make directories)
比如在/root 下建一个 书籍目录
[root@localhost ~]# mkdir 书籍
[root@localhost ~]# ls
anaconda-ks.cfg  书籍
[root@localhost ~]# 
  • 我们要递归创建目录和文件
[root@localhost ~]# mkdir 书籍2/java编程思想
mkdir: 无法创建目录"书籍2/java编程思想": 没有那个文件或目录
 发现失败了 默认不准递归创建 要递归创建的话 家-p
[root@localhost ~]# mkdir -p 书籍2/java编程思想
[root@localhost ~]# ls
anaconda-ks.cfg  书籍  书籍2
[root@localhost ~]# ls /root/书籍2/
java编程思想
[root@localhost ~]# 
  • 切换所在目录,cd (change directory)
简化操作
cd ~     进行当前用户的家目录
cd 
cd - 进入上次目录
cd .. 进入上一级目录
cd . 进入当前目录

我们先进入 /root/书籍2/ 目录
然后cd ~ 回到家目录 /root/
然后 cd - 进入上次目录 也就是 /root/书籍2/ 目录
再cd.. 进入 /root/目录
cd .没啥意义(注意cd后面要加个空格);
[root@localhost ~]# cd /root/书籍2/
[root@localhost 书籍2]# cd ~
[root@localhost ~]# cd -
/root/书籍2
[root@localhost 书籍2]# cd ..
[root@localhost ~]# cd.
-bash: cd.: 未找到命令
[root@localhost ~]# cd .
[root@localhost ~]# 
  • 目录补全以及命名补全 tag键
比如 切换目录 /usr 假如记不清楚 直接 /u 然后 tag键,则自动补全;
[root@localhost ~]# cd .
[root@localhost ~]# cd /usr/
[root@localhost usr]#
  • pwd命令(print working directory)打印工作目录,当前目录所在的全路径
就是打印当前位置
[root@localhost ~]# pwd
/root
[root@localhost ~]# 
  • 删除空目录: rmdir (remove empty directories)
rmdir [目录名]
我们删除root下的空目录 书籍 试下
[root@localhost ~]# ls
anaconda-ks.cfg  书籍  书籍2
[root@localhost ~]# rmdir 书籍/
[root@localhost ~]# ls
anaconda-ks.cfg  书籍2
[root@localhost ~]# 
发现没问题
我们删除 书籍2目录时,
[root@localhost ~]# rmdir 书籍2/
rmdir: 删除 "书籍2/" 失败: 目录非空
[root@localhost ~]# 
报错了,因为 书籍2 目录 非空;
这里的话 假如要删除 书籍2 目录 我们需要先把书籍2里面的文件或者目录先删除,然后才能删除书籍2目录,
这个是非常不现实的,所以 rmdir命令了解即可,以后基本不用的。
  • 删除文件或目录:rm (remove)
rm -rf [文件或目录]
选项: 
-r 删除目录
-f 强制
我们用 touch命令新建一个空文件
然后用rm命令删除
[root@localhost ~]# touch java牛
[root@localhost ~]# ls
anaconda-ks.cfg  java牛  书籍2
[root@localhost ~]# rm java牛
rm:是否删除普通空文件 "java牛"?n
[root@localhost ~]# ls
anaconda-ks.cfg  java牛  书籍2
[root@localhost ~]# rm java牛
rm:是否删除普通空文件 "java牛"?y
[root@localhost ~]# ls
anaconda-ks.cfg  书籍2
[root@localhost ~]# 
删除文件会提醒是否删除,输入n 不删除 输入y 删除;
假如我们删除 书籍2 目录
[root@localhost ~]# rm 书籍2/
rm: 无法删除"书籍2/": 是一个目录
报错,假如要用rm删除目录,必须 加 -r
[root@localhost ~]# rm -r 书籍2/
rm:是否进入目录"书籍2/"? y
rm:是否删除目录 "书籍2/java编程思想"?y
rm:是否删除目录 "书籍2/"?y
[root@localhost ~]# ls
anaconda-ks.cfg
依然提示我们是否要删除,假如有一万个文件 那得输入y到手麻;
我们用 mk -rf 来强制删除 无需提醒
[root@localhost ~]# mkdir -p 书籍2/java编程思想
[root@localhost ~]# ls
anaconda-ks.cfg  书籍2
[root@localhost ~]# rm -rf 书籍2/
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# 
这样方便很多  直截了当;以后用删除 就用 rm -rf 命令即可;
  • 复制命令:cp (copy)
cp [选项] [源文件或目录] [目标目录]

选项:
-r 复制目录
-p 连带文件属性复制
-d 若源文件是链接文件,则复制链接属性
-a 相当于 -pdr

我们复制下文件
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# cp anaconda-ks.cfg /tmp/abc
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# ls /tmp/
abc
ks-script-p0Ci4J
systemd-private-12ece3aaa1eb44678dbf684dbccbc32f-vmtoolsd.service-xjTV7r
systemd-private-3588b18d27f94b80849d22621ef2defb-vmtoolsd.service-wmk7Jt
systemd-private-90f54554da784e52aeb890d207e41094-vmtoolsd.service-I8F1Yy
systemd-private-d5f08625d54e4ed3a0faa9b9fb944db5-vmtoolsd.service-4rHPpX
systemd-private-f68c251a6a6c46ac94b4c1e73090ef59-vmtoolsd.service-S6J6U0
systemd-private-f7cb736915b24ef2b72faee1ec860c6d-vmtoolsd.service-ldpfcl
yum.log
把 root下的anaconda-ks.cfg复制到了 tmp下 并且重名为 abc
假如 cp anaconda-ks.cfg /tmp/abc 不加文件名 则新文件名称不变
[root@localhost ~]# cp anaconda-ks.cfg /tmp/
[root@localhost ~]# ls /tmp/
abc
anaconda-ks.cfg
ks-script-p0Ci4J
systemd-private-12ece3aaa1eb44678dbf684dbccbc32f-vmtoolsd.service-xjTV7r
systemd-private-3588b18d27f94b80849d22621ef2defb-vmtoolsd.service-wmk7Jt
systemd-private-90f54554da784e52aeb890d207e41094-vmtoolsd.service-I8F1Yy
systemd-private-d5f08625d54e4ed3a0faa9b9fb944db5-vmtoolsd.service-4rHPpX
systemd-private-f68c251a6a6c46ac94b4c1e73090ef59-vmtoolsd.service-S6J6U0
systemd-private-f7cb736915b24ef2b72faee1ec860c6d-vmtoolsd.service-ldpfcl
yum.log

假如复制目录:
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# mkdir -p 书籍2/java编程思想
[root@localhost ~]# ls
anaconda-ks.cfg  书籍2
[root@localhost ~]# cp 书籍2/ /tmp/
cp: 略过目录"书籍2/"
我们需要加 -r
[root@localhost ~]# cp -r 书籍2/ /tmp/
[root@localhost ~]# ls /tmp/
abc
anaconda-ks.cfg
ks-script-p0Ci4J
systemd-private-12ece3aaa1eb44678dbf684dbccbc32f-vmtoolsd.service-xjTV7r
systemd-private-3588b18d27f94b80849d22621ef2defb-vmtoolsd.service-wmk7Jt
systemd-private-90f54554da784e52aeb890d207e41094-vmtoolsd.service-I8F1Yy
systemd-private-d5f08625d54e4ed3a0faa9b9fb944db5-vmtoolsd.service-4rHPpX
systemd-private-f68c251a6a6c46ac94b4c1e73090ef59-vmtoolsd.service-S6J6U0
systemd-private-f7cb736915b24ef2b72faee1ec860c6d-vmtoolsd.service-ldpfcl
yum.log
书籍2
  • 这里我们用 ls -l 或者缩写命令 ll 来看下 文件的详细信息:

  • 时间不一样;第二个是复制文件的当前时间;假如我们需要把目录或者文件的属性一起复制 我们加 -a命名:

  • 剪切或改名命令:mv (move)

mv [原文件或目录] [目标目录]
我们把 root下的 书籍2 剪切到 tmp 下 并且重命名
[root@localhost ~]# ls
anaconda-ks.cfg  书籍2
[root@localhost ~]# mv 书籍2 /tmp/书籍2哈哈
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# ls /tmp/
abc
anaconda-ks.cfg
ks-script-p0Ci4J
systemd-private-12ece3aaa1eb44678dbf684dbccbc32f-vmtoolsd.service-xjTV7r
systemd-private-3588b18d27f94b80849d22621ef2defb-vmtoolsd.service-wmk7Jt
systemd-private-90f54554da784e52aeb890d207e41094-vmtoolsd.service-I8F1Yy
systemd-private-d5f08625d54e4ed3a0faa9b9fb944db5-vmtoolsd.service-4rHPpX
systemd-private-f68c251a6a6c46ac94b4c1e73090ef59-vmtoolsd.service-S6J6U0
systemd-private-f7cb736915b24ef2b72faee1ec860c6d-vmtoolsd.service-ldpfcl
yum.log
书籍2
书籍2哈哈

假如在同一个目录 那就是重新命令操作了
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# mkdir -p 书籍2/java.pdf
[root@localhost ~]# ls
anaconda-ks.cfg  书籍2
[root@localhost ~]# mv 书籍2/ 牛逼/
[root@localhost ~]# ls
anaconda-ks.cfg  牛逼
[root@localhost ~]# ls 牛逼/
java.pdf
[root@localhost ~]# 

四、总结

  • Centos 简介
  • VMware 虚拟机安装
  • 在 VM 虚拟机中安装 Centos 操作系统
  • XShell 安装和链接虚拟机
  • 常见目录作用介绍
  • 基础指令的使用
I Really Want to Stay at Your House
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇