一些关于认识实习中,CentOS 环境相关配置的记录和经验分享(教程向)

注意:考虑到这篇文章的受众主要是我的大学同学,为了大家的网络流量费着想,本篇内容中所有的下载链接均只提供 IPv6 的形式(JDK 除外。资源来自清华 TUNA)。

By MaxXing

安装和配置 CentOS

注意:甚至从第一步起,我就没有按照校方给出的认识实习教程来进行配置了。

这个故事告诉我们,和 MaxXing 一起玩可能会翻车(不存在的 = =

在安装版本的选择上,我选用了目前(2018.6)最新的 CentOS 7.5.1804 版本。并且,考虑到需要让大家尽快接触和熟悉 Linux 服务器端相关的使用和配置操作,我选用了 “最小安装” 的版本,此版本只在安装过程中出现 GUI(图形用户界面),安装完毕后不会默认配置 GUI——这就意味着,各位在安装完成后,需要全部使用命令行来完成 Linux 系统的相关操作。大家可以点此下载本次安装所需的镜像文件。

是不是很刺激(逃

系统安装

不要慌,至少安装过程还是很简单的。首先我们使用 VMware 或者其他任何一个虚拟机软件新建虚拟机,然后在这个过程中进行一些相关的设置。我个人为虚拟机分配了 1024 MB 内存,4 个 CPU 核心以及 60 GB 的虚拟存储空间,大家可以根据自己电脑的配置对虚拟机资源的分配做出适当的调整。比如说 Linux 虚拟机其实不会占用特别多的 CPU 和存储资源,实际只分配两个 CPU 核心和 20 GB 存储是完全够用的。

虚拟机的配置

接下来我们就可以启动虚拟机进行系统的安装工作了。在启动之前将 CentOS 的安装镜像作为 CD-ROM 载入,之后启动虚拟机,按照安装流程进行即可,此处不再赘述。在安装过程中,我们需要设置 root 账户的密码,并且可以另行建立一个账户用作一般使用。这里我推荐大家除了 root 账户之外再建立一个新账户,在正常使用系统时避免直接登录 root 操作,这样做可以防止某些意外的发生(比如 “rm -rf /”)。

一些初步配置

系统安装完成之后,虚拟机会重新启动,并且进入命令行界面。初始状态下,我们输入用户名和密码,登录之后就能进入系统进行操作了。

大家如果是初次接触这种命令行界面的话可能会一头雾水,不知所措,被水淹没(划掉),实际上在这类 Linux 操作系统中,所有操作都是在这个黑漆漆的命令行界面(被称作 Shell)中实现的,比如编辑代码、更新软件、调试程序、操作文件……等等。接下来我们就来列举一些可能会对大家有所帮助的操作。

P.S. 如果大家(各位大佬们)已经对这一套流程很熟悉了,可以直接跳过以下内容 = =

“都坐下,这是基本操作

进入 Shell 之后,屏幕上会显示类似[user@host ~]$的字样(具体视情况而定),之后是闪动的光标。这代表着 Shell 目前在等待着我们的输入。而光标前的内容分别代表了以下的含义:

  • user: 当前登录的用户名。名字可能是自己起的,比如 maxxing;也可能是系统规定的,比如 root
  • host: 当前登录的主机名,对初学者解释起来稍有点复杂,可以暂时忽略。
  • ~ : 当前的工作目录,其实就是指示了目前你在什么位置。

我们就先从上面的第三条说起吧。目前工作路径这里显示的是 ~——这个符号比较特殊,它代表我们目前处在当前用户的 “家目录”。这个 “家目录” 可以类比 Windows 中那个放着桌面文件夹、下载文件夹、我的文档等等之类的目录,基本上是一块用户的自留地,用户有什么个人文件都可以放进去。

既然我们目前处在 ~ 目录,那我们所做的一切操作默认都会在这条路径中生效的。比如我们输入 ls,然后回车……

[maxxing@localhost ~]$ ls
[maxxing@localhost ~]$

哒哒!……然而什么也没有发生。那是因为 ls 命令的意思是显示当前目录下所有的文件和文件夹,类似 DOS 中的 dir 命令。但是初始状态下目录 ~ 里确实什么都没有,于是什么也不会显示。那假如我们输入 touch test.txt——这条命令的含义是在当前目录新建一个名字叫 test.txt 的空文件——之后再输入 ls 的话,命令行界面就会产生输出了,如下:

[maxxing@localhost ~]$ touch test.txt
[maxxing@localhost ~]$ ls
test.txt
[maxxing@localhost ~]$

这说明当前工作目录,也就是 ~ 目录之下确实创建了一个名为 test.txt 的文件。那如果我们想切换工作目录,应该怎么办呢?这时候我们就需要用到 cd 命令了。这里的 cd 不是 “给你一张过去的 CD” 里的 “CD”,而代表的是 “change directory” 的含义,也就是 “改变目录”。比如:

[maxxing@localhost ~]$ cd /usr
[maxxing@localhost usr]$ ls
bin  etc  games  include  java  lib  lib64  libexec  local  sbin  share  src  tmp
[maxxing@localhost usr]$

我们首先将工作目录改到了 /usr,可以注意到我们执行完 cd 命令之后,Shell 提示符中的 ~ 字样就会变成 usr 字样,表面工作目录发生了变化。这时候再执行 ls,我们会发现这次的输出和上次完全不同,因为工作目录发生了变化,目录的文件自然发生了更改。

需要注意的是,Linux 中路径的表示和 Windows 不太一样。在 Windows 中,一个合法的路径大概长这个样子:C:\Windows\system32,抑或是 E:\Media\学习资料\马原.avi。我们可以发现,Windows 中路径的开头一般是一个代表盘符的字母;之后是冒号和反斜杠,代表盘符的根目录;再然后是从根目录起的树状结构,目录之间依然采用反斜杠分隔。而 Linux 中的路径,比如 /usr/bin/gcc,并不会以盘符作为开头,而是直接以斜杠 /作为开头,之后的目录分隔符也是斜杠符号——这是因为 Linux 中没有盘符的概念,所有的磁盘分区、各种设备等等都存放在系统的某个目录之下;而系统目录的根自然也不会是盘符了,所有文件结构都有一个统一的根,那就是 /,一切的一切都从 / 开始。

还有一个不同之处:Linux 的文件系统中,文件或者文件夹的命名区分大小写,而 Windows 中并不区分。这就意味着 Test.txttest.txt 在 Windows 中表示的是一个相同的文件,在 Linux 中表示的却是两个截然不同的文件。

不过,Linux 中相对路径的概念和表示和 Windows 中是相同的。比如我现在想让工作目录退回上一级,可以这么写:

[maxxing@localhost usr]$ cd ..
[maxxing@localhost /]$

可以看到,工作路径变成了 / 也就是根目录,因为 /usr/../ 指向的就是 /usr 目录的上一级,也就是根目录。另外,Linux 中的 ~ 本身也相当于一个相对路径,我们可以直接使用 ~ 来指代当前用户的家目录,比如:

[maxxing@localhost /]$ cd ~
[maxxing@localhost ~]$

嗖的一声(根本没有好吗),我们回家了。那既然 ~ 这个目录是一个相对路径,它表示称绝对路径的形式是什么样子的呢?这时候介绍一条新命令:pwd,也就是 print working directory(输出工作目录)的缩写。顾名思义,这个命令会输出当前工作目录的绝对路径:

[maxxing@localhost ~]$ pwd
/home/maxxing
[maxxing@localhost ~]$

可以看到,当前用户的家目录实际上位于 /home/maxxing。因为当前用户名字叫做 maxxing,家就是 home,所以表示成路径就是如此了,很好理解吧。那我们还知道,系统中默认最高权限的账户是 root 账户,一般每个账户都会有家目录,按照这个逻辑,root 账户的家目录自然应该是 /home/root 了。是不是呢?我们来验证一下。

我们尝试使用相对路径表示的方法来进入这个目录。当前目录是 ~,要回到上一级应该是 cd ..,如果要回到上一级目录下的某个目录,那应该是 cd ../xxx,xxx 是目录的名字。现在我们不知道是不是有一个叫做 ../root 的目录,为了避免出错,我们可以这么做:先在命令行输入 cd ../,然后按下键盘上的 tab 键:

[maxxing@localhost ~]$ cd ../maxxing/

在 Shell 中,tab 键的作用是补全当前输入。如果当前输入的是一个路径,Shell 就会尝试为我们补充我们可能要找的目录。结果我们发现,Shell 直接给我们补全了当前用户的目录。那我们尝试输入 cd ../ro 然后再按下 tab 呢?理论上如果 root 目录真的存在的话,命令会被补全成 cd ../root/,然而……什么也没有发生。这也说明了,在 /home 路径中,实际上不存在一个叫 root 的目录,只有孤零零的一个 maxxing 目录。不过,这个例子告诉我们,在不确定输入的路径是否存在,或者是输入的路径太长懒得打字的时候,可以直接按下 tab,Shell 会自动为你补全可能的路径,这样可以节省很多时间。

以上举例了几条十分简单的 Linux 命令。Linux 的命令行操作实在是太多了,如果一一讲解会耗费很多篇幅的。实际使用过程中大家也没必要去死记硬背,基本上知道一些简单的操作:比如如何创建文件、删除文件、切换目录、查看目录下的文件、运行程序、查看帮助文档……就可以胜任绝大多数日常操作了。当然,如果你能理解和应用 “管道” 的思想,甚至能使用 Shell 脚本来帮助自己自动化地完成一些任务,那是再好不过的了。

那假如我真的不太清楚使用何种 Linux 命令来做某件事怎么办呢?比如我们想给某个文件重命名,但是不知道怎么办,比起一个人发呆或者问别人,最好的方法其实是直接去搜索引擎搜索 “Linux 文件 重命名”,然后从搜索结果中学习这些操作。长此以往,日积月累之中,Linux 的使用对我们而言就不在话下了。

其实一般要给人推荐 Linux 的基础或者进阶教程,大家一般会选择《快乐的 Linux 命令行》、《鸟哥的 Linux 私房菜》……之类的。Anyway,有时间真的可以去看看,反正我是没时间于是根本没看过 = =

Linux 的关机和重启

在 Linux 操作系统当中,关机和重新启动可以用两条十分简短的命令来实现,它们分别是 haltreboot。当我们在 Shell 中执行这些命令的时候,系统会立刻执行关机或者重新启动操作。要注意的是,这两条命令均不会给我们确认的提示,所以在执行之前请确保系统的所有工作都准备妥当。

除此之外,如果我们想实现定时关机或者重启(虽然看起来暂时没什么用),可以使用 shutdown 命令,比如说我想让系统在 10 分钟之后关机,我可以执行:

[maxxing@localhost ~]$ shutdown -h +10

这里的 -h 参数指的就是 halt,如果要重启可以使用 -r;而 +10 参数代表延迟 10 分钟执行,如果要立即执行的话,可以使用 now

试着使用 vi 进行文本编辑

哦忘了说了,CentOS 中内置了 Python 2.7.5,也就是说我们也可以在 Shell 界面中输入 python 之后按下回车,进入 Python 的 REPL 来即时解释执行 Python 程序,或者是使用 python file 的方式来让 Python 解释器执行路径 file 只想的那个 Python 程序。大家如果会使用 Python 编程的话,可以直接一试身手。比如说以下这个求斐波那契数列(Fibonacci sequence)的程序:

def fib(n):
    return 1 if n <= 2 else fib(n - 1) + fib(n - 2)

print(fib(input("input n: ")))

那大家就会产生疑问:如果是在 Windows 这种有图形界面的操作系统里,我还可以直接开一个 PyCharm、VSCode 甚至记事本窗口,写好代码直接保存成文件,再想办法运行;在现在这种连个鼠标都找不到的黑底白字 Shell 界面,要怎么操作才能像 Windows 那样编辑一个文本文档呢?总不能用在 Shell 里一行一行的输入某些命令的方式来实现吧……

当然不是这样的,Shell 界面虽然没有鼠标,但是它也可以实现方便的文本编辑。事实上文本编辑本身和鼠标没有任何关系,和图形用户界面(GUI)也没什么关系。因为你只不过是打一些字,只用键盘完全可以完成;而且也不需要什么好看的图标或者窗口来表示一些什么东西,就需要一个界面显示你目前编辑的文字内容即可。所以 Linux 的文本编辑方式设计的往往比 Windows 上的看起来更简洁,更紧凑,更 geek,更让大众用户有点看不懂;但是当你熟悉之后,编辑的效率往往会大幅提高,甚至比使用 Windows 上的编辑器快得多。

在 CentOS 中,就预装了这样一个强大的文本编辑器,它的名字叫做 vi。大家可能在其他地方听说过, “黑客最喜欢使用的编辑器是 Vim”……云云,这里的 “Vim” 就是一个 vi 的变种,它本质上也是 vi,只不过功能更强大一点。

注意:在 Linux/UNIX 上有两种强大的文本编辑器:一个是目前要介绍的 vi/Vim,还有一个是 GNU 开发的 Emacs。Linux 用户们(主要是程序员)经常会围绕着 “vi 和 Emacs 谁更牛逼” 这个问题互相撕逼,所以我只是想让大家知道,程序员们是一种特别喜欢站队和互撕的生物。

哈?你问我支持哪一个编辑器吗?你看我都在这里给你安利 vi 了,这个问题简直不言而喻。辣鸡 Emacs(光速逃

当然本着学习的态度,也欢迎大家使用 Emacs 进行文本编辑,只不过 CentOS 的确没有预装 Emacs……

当我们在命令行输入 vi 并按下回车的时候,就进入了 vi 编辑器的界面。当然我们也可以输入 vi file,vi 会自动打开并编辑 file 这个文件。如果文件不存在,vi 会新建一个名为 file 的文件,然后进入编辑界面。实际使用时,人们往往会直接输入第二种命令。我们在此输入 vi fib.py,之后回车。

[maxxing@localhost ~]$ vi fib.py

这时我们可以看到之前的 Shell 界面的内容都消失不见了,这是因为 vi 为了更好的文本编辑体验,自己会以全屏的方式运行。

vi 的默认界面

然后我们会发现,当我们尝试输入字符的时候,屏幕上什么也不会显示。这是因为 vi 本身分为若干种模式,在启动之后 vi 会处在命令模式,这个模式中 vi 会将所有的键盘输入视为命令,而不会将其当作输入的内容。如果要切换到编辑模式,我们应当按下 i 键。

编辑模式

此时,编辑器底部的状态栏会显示 -- INSERT -- 字样,这就说明我们目前已经可以输入文本打字编辑文件了。比如我们输入之前给出的示例 Python 代码:

输入代码

当然,大家的界面看起来一定会和我的不太一样,因为我的 vi 经过了一些特殊的配置,目前来说这个不重要。但是,仅仅这样做是不能完成编辑任务的,因为按照正常的写代码流程,我的文件还没保存,编辑的内容也就不会写入到文件里。而且就算保存了,我们目前也不知道怎么从 vi 中退出去……

要保存文件的话,首先得退出编辑模式,回到命令模式。在编辑模式状态下,按下键盘上的 ESC 键就能回到命令模式了。这个时候底部的 -- INSERT -- 字样会消失。接着,我们输入 :w,要注意字母 w 之前还有一个冒号。此时我们会发现,底栏中出现了光标,并且内容就是我们刚才输入的 :w。接着按下回车:

保存文件

根据底部出现的提示信息,我们新建的文件已经成功保存了。大家其实可以发现,当我们在命令模式输入冒号的时候,底部状态栏就会被激活,等待我们输入一些指令。我们之后输入的字母 w 实际上代表了 “write”,也就是 “写入” 的意思,所以这条命令的意义就是保存文件。这个时候,如果我们还要修改文件的内容,可以再次按 i 进行编辑,完毕之后先按下 ESC 回到命令模式,接着重复上述操作进行文件保存。

那如果想退出 vi,返回 Shell 怎么办呢?提示一下,退出的英文是 quit,所以同理,在命令模式下输入 :q,再敲回车,我们就可以回到 Shell 界面了。

除了以上说到的命令之外,还有一条命令比较常用,就是 :wq。这个命令是上述 :w:q 命令的组合体,它的意义自然也无需多说:先保存,后退出。因为我们有时候只是使用 vi 打开某个文件,进行一些简单的修改,之后就要保存,然后立即返回 Shell,这条命令可以为我们节省一点时间。

以上就是 vi 的基本使用了,大家如果只是掌握上述内容,日常在 Linux 中修改一些配置文件,或者写一些代码什么的基本都不成问题。但是我在前文说过,vi 是一个异常强大的文本编辑器,如果它只有这些简单的功能,自然配不上这样的名头。实际上 vi 的命令和操作数不胜数,一些复杂操作对初学者来说也并不友好,但是当我们可以熟练掌握这些操作的时候,我们就可以体验飞一般的文本编辑了。大家不妨在网络上寻找一些 vi/Vim 的操作教程或者配置教程,身体力行,看看 vi 这个编辑器到底还能做哪些意想不到的事情。

配置网络

在默认的情况下,虚拟机中安装的 CentOS 是无法直接连接互联网的,虽然它已经通过宿主机本身的网络转换具有了连接外网的能力,但是系统内部的网络服务并没有运行。这个时候如果我们想联网更新系统内软件包,或者是在 CentOS 中执行一些其他需要联网才能执行的操作就会遇到麻烦。

首先我们尝试启动网络服务:

[maxxing@localhost ~]$ service network start

如果大家直接使用 root 账户登录系统,在执行完这条命令之后网络服务就会直接启动。但是如果像是以上那个例子,我们可以看到登录的账户名字是 “maxxing” 而不是 “root”,在执行这样的操作时,系统会检查用户的权限。有时候我们会因为用户的权限问题,而没有办法做出一些对系统的配置操作,为了避免这样的情况,我们可以在明确地知道自己要对系统做什么的时候,使用如下的方法来用更高的权限执行操作:

[maxxing@localhost ~]$ sudo service network start

可以看到命令之前被加上了 sudo,这代表当前命令是被超级用户执行的(superuser do)——超级用户当然就代表权限很高很 NB 的用户了,权限问题迎刃而解。当然这么做也是需要认证的,当我们请求使用 sudo 执行命令的时候,会被要求输入超级用户的密码,一般情况需要输入 root 账户或者其他管理员账户的密码,这取决于 Shell 中提示的用户名称。我们根据提示输入密码,然后按下回车,就可以顺利执行命令了。

注意:在输入密码的时候,Shell 界面不会显示密码的内容(废话嘛),也不会像 Windows 一样把密码的字符显示成星号,而是什么都不显示。所以不要以为是键盘坏了,可以当作自己是在盲打……

这个时候虚拟机里的 CentOS 就可以正常的连接外网了。但是网络服务并不会随着系统的启动而自行启动,这就意味着我们每次启动系统之后,都需要手动的执行一遍命令,再手动输入密码,之后才能联网。这样未免有点麻烦,所以有没有更给力一点的方法呢?

能不能再给力一点啊,老师?

当然有。这个时候我们就需要修改系统配置,让网络服务每次都随系统自启动了。执行下列命令:

[maxxing@localhost ~]$ sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33

看了之前的教程,这条命令的含义想必也不需要我解释了,事实上就是直接用最高权限执行 vi,让它编辑位于 /etc/sysconfig/network-scripts/ 的文件 ifcfg-ens33,这个文件存储的正是我们的网络配置。文件的内容大概长这个样子:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
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=bc6e0fc2-bf3c-4349-95a1-1bf28f17ce58
DEVICE=ens33
ONBOOT=no

我们需要将第四行 BOOTPROTO 之后的项目修改为 dhcp,以及将最后一行 ONBOOT 之后的项目修改为 yes。修改完之后 :wq 保存退出,大功告成。这样我们每次启动系统的时候,网络也会自动连接,省去了手动配置的麻烦。

更新和安装软件

就像 macOS 和 iOS 里有一个 App Store,Android 里有一个 Google Play(大清自有国情在此),Linux 里通常都会有一种程序,来根据用户的需要,自动从网上下载、安装或者更新软件包——这种程序的名字叫做包管理器。在 CentOS 中,我们可以使用 yum 这一包管理器来进行各种软件包的安装、更新或者卸载。

首先我们来看一下软件的更新操作。通常情况下,Windows 在进行全新安装之后会检查 Windows Update 上的补丁,让系统时刻处在最新的状态。CentOS 中我们也可以手动进行系统更新(虽然这么理解有点不太合适),执行以下命令:

[maxxing@localhost ~]$ sudo yum update
[maxxing@localhost ~]$ sudo yum upgrade

这个时候 yum 会连接网络,更新软件包列表,然后根据列表中的软件包版本信息,与系统中已安装的版本信息进行比对,如果发现某个软件包存在新版本,就下载更新。执行完这一整套操作之后,我们系统中所有的软件,包括系统的内核都会升级到最新的版本。以后在必要的时候大家也可以自行执行这样的更新操作。

注意:

反正现在是认识实习,在系统和软件版本方面怎么折腾都行,出问题了大不了回滚到之前的快照……哦对了,VMware 还有大部分虚拟机软件都是有快照或者克隆功能的,相当于对虚拟机执行备份,此处不再赘述,各位可以自行学习。在学习 Linux 的过程中也十分推荐大家保持软件的更新,这样我们可以第一时间接触到新的技术;而且就算遇到一些兼容性问题,也可以锻炼自己处理问题的能力,为未来积累经验。

但是如果未来大家开始工作,在实际的生产环境中,千万不要贸然更新软件。因为谁也说不准新版本的软件的兼容性如何,是否会和系统里的其他软件产生冲突之类。毕竟,稳定性才是最重要的。

那如果我想安装新的软件,应该怎么操作呢?在这里我们拿 GCC 来举个例子。首先介绍一下,GCC 的全程是 GNU Compiler Collection,是 GNU 开发的一款著名的编译器套件。目前它可以编译包含 C 和 C++ 在内的多种编程语言,但是人们提到的 “GCC” 往往指的是编译 C 和 C++ 的那个 GCC。在绝大多数 Linux/UNIX 系统上,C/C++ 语言的默认编译器都是 GCC,不过我们的 CentOS 似乎没有预装 GCC 这个软件。为了方便 C/C++ 的编译,以及保证某些依赖 GCC 的软件的正常运行,我们接下来要手动安装 GCC。执行下列命令:

[maxxing@localhost ~]$ sudo yum install gcc
[maxxing@localhost ~]$ sudo yum install gcc-c++

可以看到,刚刚更新软件包和软件的时候,我们分别使用了 yumupdateupgrade 参数,而在安装软件的时候,我们使用了 install 参数。在 install 之后,我们需要制定要安装的软件的名字,然后 yum 就会在软件包列表中寻找我们需要的软件,接着自动下载、安装和配置软件包——事情就是这么简单。

切换到 root

在以上的教程中,我们会遇到许多只有 “超级用户” 这种权限极高的用户才可以执行的命令,比如使用 service 命令启停系统服务,或者执行软件包的升级操作。这个时候我们需要在命令之前加上 sudo,表示这条命令需要更高的权限,然后输入超级用户的密码,这样才能完成命令的执行。这么做在某些情况下其实特别麻烦,比如我们一连若干个操作都是安装软件,然后每次我们都需要在 yum 之前写 sudo,耗时费力。所以有没有一种方法,让我们直接全成利用超级用户的特权执行命令,而不是在某些命令之前加 sudo 来提权呢?

当然有(尴尬的设问句)。在之前我们曾经提到过,如果我们直接使用 root 用户登录系统,那我们所执行的一切操作都是以系统的最高权限进行的。这样做可以让一切命令的执行畅通无阻,但是同样,我们也需要为自己的一些危险行为,譬如修改系统敏感设置,作出代价。那么,登录到 root 用户不失为一种办法。

在许多类 UNIX 系统中,root 就是一种特权的象征。我们在使用 Android 系统智能手机的时候经常会听到:如何如何操作怎么怎么折腾就能把整个机子 “root” 掉,这里的 “root” 实际上就来源于此。

除了在系统启动时,我们使用 root 用户登入,其实还有一种方法可以让我们随时随地切换到 root 用户,那就是 su 命令。这条命令的含义是 “switch user”,也就是 “切换用户”。我们可以使用以下的方法,在任何时候切换到 root 用户:

[maxxing@localhost ~]$ su root
[root@localhost maxxing]#

当然,和 sudo 类似,在低权限账户切换到 root 用户时,基于安全性考量,必须输入 root 用户的密码。这个时候我们可以注意到,Shell 的提示符发生了变化:首先是用户名的显示变成了 “root”,这很合理,因为我们切换到的用户就是 root 用户;最后的 $ 符号也发生了改变,变成了 # 符号,这两个符号中,前者代表登录的用户是普通用户,后者代表登录的用户是拥有较高权限的管理员用户;另外一点,我们注意到,当前工作目录的显示从 ~ 变成了 maxxing(之前登录用户的用户名),这一点需要做出另行解释:

大家应该还记得在第一部分,基本操作的讲解中,我们使用 pwd 命令查看了用户 maxxing 的家目录的绝对路径,其实就是 /home/maxxing。而当我们使用 maxxing 这个身份登录系统的时候,家目录会被简写作 ~。我们目前的工作路径正是家目录,所以提示符中的工作路径部分显示的内容就是 ~

而当我们切换到 root 用户之后,我们的工作路径并没有发生变化,依然是 maxxing 用户的家目录,也就是 /home/maxxing。但是这个目录并不是 root 用户的家目录,root 用户的家目录另有所在。也就是说,登录的用户不同,~ 这一相对路径所指代的绝对路径也会随之改变,但是始终指向当前用户的家目录。这么说来,当前工作路径自然也就不会显示成 ~ 了。大家如果有兴趣,可以在 root 用户登录的情况下,cd ~ 进入家目录,然后输入 pwd 看看 root 的家目录究竟位于何处。

回到之前的主题,如果我们想回到我们切换之前的用户,应该怎么做呢?同样很简单,直接输入 exit 即可:

[root@localhost maxxing]# exit
[maxxing@localhost ~]$

为了方便起见,之后的命令行输入示例中将不再写类似 [maxxing@localhost ~]$ 这样的完整提示符,而是简写作 $ 或者 #

配置共享目录

其实这么说来,我们已经学会了 CentOS 的基本操作、配置了网络、更新了软件包……该做的工作似乎已经都做完了,那么为什么还不能愉快的开始我们的环境配置工作呢?

因为大家想一下,我们日常的开发工作肯定不会直接在 CentOS 里写 Java 代码、调试、运行之类,因为我们的 IDE 并没有运行在 CentOS 环境中。而且虚拟机本身的资源也有限,非要受罪在里面跑个 IDE 写 Java 程序有点太难受了,所以正常的开发模式应该是:我们在自己的宿主机上运行 IDE,进行软件的开发和部分调试工作;然后再想办法把写好的程序放在 CentOS 的虚拟机中,去模拟真实的服务端运行环境,进行进一步的调试。

哦对了,个人建议大家不要使用 Eclipse 开发 Java 应用程序,这个 IDE 实在是有些笨拙而且过时。有一个在易用性和功能性上碾压 Eclipse 的 IDE 存在,那就是 JetBrains 公司开发的 IntelliJ IDEA,说它是目前地球上最好用的 Java IDE 一点都不过分。

强烈推荐。强烈推荐。强烈推荐。重要的话说三遍。

所以问题来了:我们目前还没办法直接把我们写好的 Java 程序放在虚拟机里,因为……就是没办法放嘛~你想想看虚拟机里运行着一个黑乎乎的家伙,你又没办法把文件直接拖进去,虚拟机里的系统又没办法访问外面,什么的。>///<

为了解决这样的问题,我们必须为虚拟机内的系统安装一些特殊的驱动程序,使得系统可以通过虚拟的硬件来访问宿主机的环境。对于 VMware 和大多数虚拟机来说,我们可以安装一个名为 open-vm-tools 的软件:

# yum install open-vm-tools

在这之后,我们还需要进行一些配置才能让虚拟机中的 CentOS 访问到外部的文件。首先在虚拟机的设置界面中启用共享文件夹,然后将宿主机中用作和虚拟机交换数据的文件夹添加到列表当中。

添加共享文件夹

Windows 的设置界面和 macOS 的有一些差异,但是大家应该都是可以找得到的。这里为了图省事,我们直接把 “下载” 文件夹设置成和虚拟机共享。在此之后,我们就可以在 CentOS 中确认系统是否检测到了这个共享文件夹:

# vmware-hgfsclient

这个时候,Shell 中应当输出共享文件夹的名称(如果有多个共享文件夹,会输出一个全部文件夹名称的列表)。要注意,如果在安装系统时系统语言没有设置成汉语,而文件夹名字又是中文字符,命令行的输出就会显示乱码。不过这不要紧,我们知道这个文件夹确实被检测到了就行。

既然顺利的检测到了共享文件夹的配置,我们就可以尝试将共享文件夹挂载在 CentOS 的文件系统之中了。首先为大家介绍一下挂载(Mount)的概念。

前文我们说过,Linux 的文件系统和 Windows 的有很大差别,Windows 中一般会以若干个不同的盘符来区分不同的磁盘、分区或者其他 IO 设备。通常情况下,应用程序安装在 C 盘,数据可能会放在 D 盘,但是应用程序却能够同时读取自己的配置设置和 D 盘的其他数据,这说明 Windows 中的 “C 盘”、 “D 盘” 在默认情况下都是准备就绪的,我们随时可以访问。但是在 Linux 中没有盘符的概念,默认情况下只有系统所处的分区是激活状态,假如我们需要使用 “D 盘” 中的数据,我们就必须先将这个分区挂载到当前文件系统的某个目录下。比如我们将 “D 盘” 挂载到了 /mnt/disk 目录下,那么在 Windows 中访问 D:\Test\test.txt,就相当于访问 /mnt/disk/Test/test.txt 了。

虚拟机提供的共享文件夹实际上被 CentOS 当作了一个新的存储设备(也许可以这么理解),于是如果我们想访问其中的文件,我们首先应当将这个设备挂载到某个目录之下。根据 Linux 的使用习惯,设备的挂载点一般都位于 /mnt 目录之下——从这个目录的命名也能看出它的作用:mnt 实际上就是 mount 的缩写(省略所有元音字母)。首先在 /mnt 下新建目录,用于挂载目标设备:

# mkdir /mnt/hgfs

mkdir 命令用来新建目录(make directory),或者按照 Windows 的说法叫做 “新建文件夹”,命令之后给定新建目录的位置。这个时候 /mnt 目录下已经多出了一个叫做 hgfs 的文件夹了,其实这个目录叫什么并无所谓,这个目录将作为共享文件夹的挂载点。之后我们使用以下命令来完成共享文件夹的挂载:

# vmhgfs-fuse .host:/ /mnt/hgfs

这条命令的最后一个参数就是挂载点的位置。要注意,如果我们在 /mnt 中新建的目录不是这个名称,或者想要将共享文件夹挂载到其他位置,我们就应该修改这个参数。这样就大功告成了,之后如果我们需要在宿主机和虚拟机之间传递文件,只需要将文件拷贝到宿主机的共享文件夹中,然后在虚拟机内的 CentOS 中访问 /mnt/hgfs 下的目录即可。

但是目前还有一个问题,如果尝试重新启动系统,大家就会发现,之前已经挂载好的文件系统并没有自动的被再次挂载。也就是说,每次操作系统启动之后,我们不得不手动重新执行上述的挂载操作,这样显然也是很麻烦的。和之前的网络服务同样,我们可以自行修改系统的配置文件,来实现共享文件夹的自动挂在。使用 vi 编辑 /etc/fstab(需要超级用户权限),在文件的末尾添加以下内容:

.host:/  /mnt/hgfs  fuse.vmhgfs-fuse  allow_other,defaults  0 0

总共六列,每一列之间使用若干空格进行分隔,其中的第二列显然是挂载点的位置,可以按需修改。设置完毕之后之后保存。操作系统启动时会自动读取这些设置,然后根据内容对指定的文件系统进行挂载,这样我们就可以方便的访问虚拟机的共享文件夹了。

使用 SSH 连接 CentOS

其实所有基本操作在以上的内容中都已经全部介绍完毕了,这一部分只是我个人喜好,并且也推荐大家用一下 = =

正常情况下,我们可以直接启动虚拟机,然后在虚拟机界面登录操作系统,然后进行一系列操作之类……这么做完全可以,其实这样就相当于我们在某个机器上安装了 CentOS,然后直接在机器之前进行面对面操作,完成系统环境的相关配置。但是试想一下,假如我们未来面临同样的境遇:公司要求我们负责一台 Linux 服务器的环境配置和维护,我们直接跑到服务器机房,和机柜里的某个主机进行面对面操作显然是不现实的(而且即便真有这样的机会,服务器的机子绝对不会给你提供键盘和显示器的)。那这就要求我们通过远程连接的方法,借助网络来访问和操作服务器。

在 Linux 系统中我们可以使用 SSH 协议实现 Shell 的远程登录,通过虚拟机,我们也可以模拟这一操作。SSH 是 Secure Shell 的缩写,是一种专为远程登录制定的,附带有加密等安全机制的网络协议。通常情况下 Linux 系统都会附带 SSH 协议的服务,并且默认启动——CentOS 中就是如此,我们不需要做任何额外的配置,就可以直接在外部通过 SSH 连接到虚拟机中的 CentOS 系统。

如果大家使用的同样也是 Linux 环境,或者是类似 macOS 的 UNIX 环境,那么的系统中已经自带了 ssh 程序用来进行远程连接。如果大家使用的是 Windows 系统,传统的解决方法是下载一个名为 PuTTY 的工具(体积很小,而且不需要安装),这个工具内置了 SSH 连接的功能,并且提供了一个不错的 Shell 操作环境,方便我们进行远程操作。在 Windows 10 当中,系统提供了一个 “OpenSSH Client” 的可选功能,我们也可以安装这个功能,这样就可以直接在内置的 PowerShell 中使用 ssh 命令进行远程连接了。

在连接到一个远程的 Linux 主机之前,我们首先要知道这个主机的 IP 地址。如果大家使用租用或者购买的服务器,供应商会直接提供 IP 地址的信息。在目前虚拟机的环境当中,我们可以执行 ip addr 这一命令来查看当前虚拟机的 IP 地址:

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:61:9a:2c brd ff:ff:ff:ff:ff:ff
    inet 192.168.60.148/24 brd 192.168.60.255 scope global noprefixroute dynamic ens33
       valid_lft 1731sec preferred_lft 1731sec
    inet6 fe80::4bda:265d:6019:eabf/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

命令会输出一系列信息,可能大家会觉得眼花缭乱。其实根据一些简单的网络常识,我们可以从中提取出我们需要的信息。如果大家不太清楚,可以给大家普及一下:

  • IPv4 地址由四组 0~255 的数字组成,格式形如 xxx.xxx.xxx.xxx
  • IP 地址 127.0.0.1 通常用来指代当前机器,可以把它理解成一个 “相对” 的 IP 地址,在任何一个计算机上连接 127.0.0.1 都会连接到它自己;
  • 192.168.xxx.xxx 通常为局域网 IP,而且局域网内通常有两个特殊的地址:一个是网络地址,一个是广播地址,它们具体的 IP 地址取决于子网掩码的设置。不过一般情况下,IP 地址中的第四段的值为 0 或者 255 时都表示特殊的地址。

那么这样看来,ip addr 输出的网络设备的 IP 信息中,第一个 IP 127.0.0.1 自带的是自身,没什么意义;之后的 192.168.60.148 是一个局域网 IP,它代表的正是虚拟机在和宿主机组成的局域网中的 IP 地址,是我们需要的地址;192.168.60.255 是一个广播地址,我们不需要这个地址。于是,我们就可以使用 ssh 命令来连接虚拟机了,注意这个操作是在宿主机中进行的:

$ ssh 192.168.60.148

这样的话,我们就可以在宿主机的命令行中直接连接到虚拟机中的 CentOS 了。如果大家使用了 Windows 上的 PuTTY 工具或者其他图形化 SSH 工具,在进行 SSH 连接时同理,只不过是把这个 IP 地址输入对应的 IP 地址设置的文本框中。

为了防止大家直接复制这条命令去执行,在这里再次强调:192.168.60.148 这个 IP 地址的值只是根据上述 ip addr 指令的输出推测出的一个值,我们没办法保证这个地址永远都不会变,或者在任何一个人电脑中的虚拟机里都是这样的地址。大家在执行命令的时候需要根据自己的情况来确定虚拟机的 IP。

经过这么一番折腾之后,我们就可以在外部 “远程” 连接到虚拟机里的 CentOS 了,之后的操作和在虚拟机内部的 Shell 中的操作方式完全一致。如果大家在命令行中使用了上述命令的话,默认可能会登陆到一个普通账户。如果大家想在 SSH 连接之前选择具体远程登录到哪一个用户,比如登录到 root,可以在命令行中这样操作:

$ ssh root@192.168.60.148

@ 符号隔开用户名和 IP 地址,这有点类似于我们所知的电子邮件地址,后者同样是用 @ 符号分隔账户名和电子邮件主机。

以上就是 CentOS 安装和配置的基础教程的全部内容了,希望大家能有所收获,学到关于 CentOS 的更多知识。接下来的教程讲解了如何配置我们进行认识实习所需的环境,相对来说比较简短和直接,方便大家参阅。

安装 JDK

JDK,全名为 Java Development Kit,也就是 Java 的开发工具,是我们进行 Java 开发时必不可少的工具。JDK 中包含了两个重要的软件:一个是 Java 的编译器 javac,负责将我们编写的 Java 源程序编译成可供执行的二进制文件;另一个是 Java 的虚拟机(JVM)java,负责执行编译完毕的 Java 程序,并且为它提供运行时的相关支持。

相对于网络上流行的 JDK 安装方法,我们在这里直接使用 rpm 命令安装 JDK 10.0.1 的 rpm 包,这么做的优点是无需处理环境变量配置的问题。首先在此处下载 JDK 10 的 rpm 包(同意协议后选择列表中的第一项),之后将下载得到的文件 jdk-10.0.1_linux-x64_bin.rpm 放在合适的位置,然后执行以下命令:

# rpm -ivh jdk-10.0.1_linux-x64_bin.rpm

即可安装 JDK。安装完成之后,可以使用以下的方法检查安装是否生效:

$ java --version
$ javac --version

上述命令执行完毕后应显示 Java 虚拟机和编译器对应的版本信息。当然了,写几个 Java 程序来检查一下编译器和 JVM 是否正常工作也是完全可以的:

public class JavaTest {
    public static void main(String[] args) {
        System.out.println("test infomation...");
    }
}

将文件保存为 JavaTest.java,之后执行以下命令,可以看到程序的输出:

$ javac JavaTest.java
$ java JavaTest
test information...

安装 Tomcat

Tomcat 是 Apache 开发的一款基于 Java 的 Web 服务器,我们开发的基于 Spring 的 Web 应用必须借助 Tomcat 这一平台才可以被外部访问。接下来我们将在 CentOS 中安装 Tomcat。

首先我们需要解压缩 Tomcat 的安装包。将 apache-tomcat-9.0.10.tar.gz 放在 CentOS 系统中合适的目录,然后执行解压缩命令:

$ tar -zxvf apache-tomcat-9.0.10.tar.gz

之后,目录中应该会产生一个名为 apache-tomcat-9.0.10 的文件夹,该文件夹包含了 Tomcat 的主程序。习惯上,我们会将这类应用程序放在 /usr/local 目录下:

$ mv apache-tomcat-9.0.10 /usr/local/

这样基本上就完成了 Tomcat 的安装。如果之前的 JDK 配置没有出问题的话,我们可以运行 Tomcat 程序目录下的 bin/startup.sh 来启动 Tomcat:

$ /usr/local/apache-tomcat-9.0.10/bin/startup.sh

同样的,我们看到目录中还有一个 shutdown.sh,这个文件用于结束 Tomcat 的运行。之后,我们理论上就可以访问 Tomcat 提供的 Web 服务了。不过在此之前,我们还需要增加防火墙记录以开放 8080 端口:

# firewall-cmd --zone=public --add-port=8080/tcp --permanent

因为默认状态下,Tomcat 的 Web 服务会在本机的 8080 端口启动,但是 CentOS 自带的防火墙会屏蔽所有来自 8080 端口的外部访问。为了防止我们在宿主机中进行调试的时候访问不到虚拟机中的 Tomcat,我们必须做出这样的设置。之后,再次执行 ip addr 命令确认虚拟机的 IP,假设 IP 地址为 192.168.60.148,我们即可在浏览器中访问 192.168.60.148:8080 来测试 Tomcat 是否正常启动。

为了方便我们登录 Tomcat 的管理后台,我们需要修改 tomcat-users.xml 来设置浏览器登录 Tomcat 管理后台时的用户。编辑 Tomcat 目录下的 conf/tomcat-users.xml,在 </tomcat-users> 也就是最后一行之前添加以下内容:

  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="manager-status"/>
  <user username="admin" password="自己随便改个密码啦别是中文就行"
         roles="manager-gui,manager-script,manager-jmx,manager-status"/>

这样我们即可使用用户名 admin 和对应的密码来登陆 Tomcat 的管理后台了。接着编辑 Tomcat 目录下的 webapps/manager/META-INF/context.xml,我们可以找到以下内容:

  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />

这条配置限制了我们只能从服务器本机访问 Tomcat 的管理后台,为了方便我们进行调试,我们需要注释掉这条配置:

<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->

这样我们就可以在外部登录 Tomcat 的管理后台了。我们可以打开 Tomcat 的页面,然后点击 “Manager App”,在弹出的对话框中输入我们设置的用户名和密码,就可以管理 Web App 了。

Tomcat 管理入口

同样,方便起见,我们可以配置 Tomcat 使其开机自动启动。在 Tomcat 目录下的 bin 目录中新建文件 setenv.sh 并写入以下内容:

# add tomcat pid
CATALINA_PID="$CATALINA_BASE/tomcat.pid"
# add java opts
JAVA_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=1024m -Xms512M -Xmx1024M -XX:MaxNewSize=256m"

Tomcat 启动时会根据这个配置建立系统服务所需的 PID 文件,并且配置 Java 的内存相关的设置。之后我们在 /usr/lib/systemd/system 中添加 tomcat.service 文件并写入以下内容:

[Unit]
Description=Tomcat
After=syslog.target network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
PIDFile=/usr/local/apache-tomcat-9.0.10/tomcat.pid
ExecStart=/usr/local/apache-tomcat-9.0.10/bin/startup.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

注意,其中第 7 行和第 8 行的内容中,/usr/local/apache-tomcat-9.0.10 代表 Tomcat 所在的目录,如果大家没有按照这个设置来配置 Tomcat 的安装目录,则需要自己根据需要修改这两条配置。之后,我们只需要执行:

# systemctl enable tomcat

这样,Tomcat 服务就可以跟随系统一同启动了。

安装 MySQL

MySQL 是一种数据库,在此不再赘述。我们在这里同样将采用 rpm 包的方式来安装 MySQL。首先卸载系统自带的 MariaDB,这个似乎会和 MySQL 发生冲突:

# yum remove mari*

下载所需的文件,之后将安装包的压缩包 mysql-8.0.11-1.el7.x86_64.rpm-bundle.tar 拷贝到随便什么位置,然后解压缩:

# tar -zxvf mysql-8.0.11-1.el7.x86_64.rpm-bundle.tar

这时我们发现,压缩包中包含若干个 rpm 包,此时先不要着急安装,我们需要先安装一些 MySQL 安装过程中所需要的依赖软件包。经过作者个人的测试,似乎如果我们以之前的 Linux 基本教程中安装过的软件包为基础,目前只需要安装 net-tools 一个软件包即可:

# yum install net-tools

之后我们就可以愉快的开始安装 MySQL 的过程了。按顺序执行以下安装命令,注意一定要按照顺序

# rpm -ivh mysql-community-common-8.0.11-1.el7.x86_64.rpm
# rpm -ivh mysql-community-libs-8.0.11-1.el7.x86_64.rpm
# rpm -ivh mysql-community-client-8.0.11-1.el7.x86_64.rpm
# rpm -ivh mysql-community-server-8.0.11-1.el7.x86_64.rpm

看着这些命令都很长,其实它们只有一部分是不同的,安装顺序分别为 commonlibsclientserver

在这之后,我们就完成了 MySQL 的安装工作。接下来我们需要初始化 MySQL:

# mysqld --initialize --user=mysql

初始化完成后,程序会在 /var/log/mysqld.log 中写入相关的日志信息,我们可以尝试使用以下命令查看:

# cat /var/log/mysqld.log
2018-07-07T13:21:27.317775Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.11) initializing of server in progress as process 47280
2018-07-07T13:21:28.510060Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: )4dlE/y8njay
2018-07-07T13:21:29.339134Z 0 [System] [MY-013170] [Server] /usr/sbin/mysqld (mysqld 8.0.11) initializing of server has completed

我们可以看到,在文件的第二行,服务端程序为我们新建了 MySQL 数据库的 root 用户,并且为我们生成了一个巨难记的临时密码:)4dlE/y8njay。我们当然可以从头到尾一直使用这个密码,不过考虑到我们的发际线和逐渐减退的老年人记忆力,我们一会需要修改这个默认的密码,不过首先我们必须记住这个密码以便一会登入数据库。

接着,我们需要配置一下 MySQL 的服务,使其随系统自启动,命令和配置 Tomcat 时类似:

# systemctl enable mysqld
# systemctl start mysqld

第二条命令的作用是立即启动 MySQL 的服务,以便于接下来我们登录数据库:

# mysql -u root -p

这个时候我们指定使用 root 用户登录数据库,MySQL 会要求我们输入密码,我们在此输入刚才那个巨难记的默认密码。之后我们就进入了 MySQL 的操作界面。我们使用如下的命令修改 root 用户的密码。注意是数据库中的 root 用户,这个 root 用户和系统的 root 用户是两回事,修改这个用户的密码不会影响系统的 root 用户:

mysql> set password for root@localhost = password('随便写一个密码啦别太简单就行');

注意句末的分号。之后我们就可以使用修改过后的密码登录数据库了。我们可以使用 exit; 或者 quit; 命令退出 MySQL。至此,我们就完成了 MySQL 的安装和配置。

一个小测试

待补充,看来作者 MaxXing 暂时鸽了这部分(当然还有以下所有部分 = =

Git 初见

待补充,我们已经和百度达成了合作伙伴关系,以后有问题直接问百度,别找我们了(逃 = =

团队协作

待补充,各位可以自学嘛,丢个链接:Learn Git Branching = =

标签: 教程向, 经验分享, centos, linux

已有 5 条评论

  1. 小铭 小铭

    请问有打赏的地方么

  2. 飘蓝 飘蓝

    双击666

  3. 夏天 夏天

    我想知道软件什么时候更新欸……

    1. 目前暂时没有更新 MaxXSoft 主页上软件的打算,因为那些软件都是很久很久以前用 VB6 写的(捂脸。
      目前我已经转向了其他更底层的计算机研究方向,近期写的软件主要都放在 http://github.com/MaxXSoft 上,如果您有兴趣,欢迎 star 并一起讨论(逃 = =

  4. 灵

    手机版文首TOC无效了么?

添加新评论