Linux操作系统与项目部署
注意:本版块会涉及到操作系统
相关知识。
现在,几乎所有智能设备都有一个自己的操作系统,比如我们的家用个人电脑,基本都是预装Windows操作系统,我们的手机也有Android和iOS操作系统,还有程序员比较青睐的MacBook,预装MacOS操作系统,甚至连Macbook的Touchbar都有一个自己的小型操作系统。
操作系统是管理计算机硬件与软件资源的计算机程序,操作系统可以对计算机系统的各项资源板块开展调度工作,运用计算机操作系统可以减少人工资源分配的工作强度。
在我们的电脑没有操作系统的情况下,它就是一堆电子元器件组合而成的机器,就像我们有了一具完整的身体,但是现在缺少的是一个大脑,来控制我们的身体做出各种动作和行为,而安装了操作系统,就像为电脑注入了灵魂,操作系统会帮助我们对所有的硬件进行调度和管理。
比如我们现在最常用的Windows操作系统,我们可以在系统中做各种各样的事情,包括游戏、看片、学习、编程等,而所有的程序正是基于操作系统之上运行的,操作系统帮助我们与底层硬件进行交互,而在程序中我们只需要告诉操作系统我们需要做什么就可以了,操作系统知道该如何使用和调度底层的硬件,来完成我们程序中指定的任务。
(如果你在自己电脑上安装过Windows操作系统,甚至自己打过驱动程序,或是使用安装过Linux任意发行版本,那么本章学习起来会比较轻松)
发展简史
这是整个SpringBoot阶段的最后部分了,为了不让学习那么枯燥,我们先来讲点小故事。
在1965年,当时还处于批处理操作系统的时代,但是它只能同时供一个用户使用,而当时人们正希望能够开发一种交互式的、具有多道程序处理能力的分时操作系统。于是,贝尔实验室、美国麻省理工学院和通用电气公司联合发起了一项名为 Multics 的工程计划,而目的也是希望能够开发出这样的一个操作系统,但是最终由于各种原因以失败告终。
以肯•汤普森为首的贝尔实验室研究人员吸取了 Multics 工程计划失败的经验教训,于 1969 年实现了分时操作系统的雏形,在1970 年该操作系统正式取名为UNIX,它是一个强大的多用户、多任务操作系统,支持多种处理器架构,1973 年,也就是C语言问世不久后,UNIX操作系统的绝大部分源代码都用C语言进行了重写。
从这之后,大量的UNIX发行版本涌现(基于Unix进行完善的系统)比如 FreeBSD 就是美国加利福尼亚大学伯克利分校开发的 UNIX 版本,它由来自世界各地的志愿者开发和维护,为不同架构的计算机系统提供了不同程度的支持。
而后来1984年苹果公司发布的的MacOS(在Macintosh电脑上搭载)操作系统,正是在 FreeBSD 基础之上开发的全新操作系统,这是首次计算机正式跨进图形化时代,具有里程碑的意义。
同年,乔布斯非常高兴地将自家的图形化MacOS界面展示给微软创始人比尔盖茨,并且希望微软可以为MacOS开发一些软件。比尔盖茨一看,woc,这玩意牛逼啊,咱们自己也给安排一个。于是,在1985年,微软仿造MacOS并基于MS-DOS操作系统,开发出了名为Windows的操作系统:
Windows操作系统的问世,无疑是对MacOS的一次打击,因为MacOS只能搭载在Mac上,但是售价实在太贵,并且软件生态也不尽人意,同时代的Windows却能够安装到各种各样的DIY电脑上,称其为PC,尤其是后来的Windows95,几乎是封神的存在,各种各样基于Windows的软件、游戏层出不穷,以至于到今天为止,MacOS的市场占有率依然远低于Windows,不过Apple这十几年一直在注重自家软件生态的发展,总体来说在办公领域体验感其实和Windows差不多,甚至可能还更好,但是打游戏,别想了。
说了这么多,Linux呢,怎么一句都没提它呢?最牛逼的当然放最后说(不是
Unix虽然强大但是有着昂贵的授权费用,并且不开放源代码,于是有人发起了GNU运动(GNU IS NOT UNIX,带有那么一丝嘲讽),模仿 Unix 的界面和使用方式,从头做一个开源的版本。在1987年荷兰有个大学教授安德鲁写了一个Minix,类似于Unix,专用于教学。当Minix流传开来之后,世界各地的黑客们纷纷开始使用并改进,希望把改进的东西合并到Minix中,但是安德鲁觉得他的系统是用于教学的,不能破坏纯净性,于是拒绝了。
在1991年,林纳斯.托瓦兹(Linus Torvalds)认为Minix不够开放,自己又写了一个全新的开源操作系统,它希望这个系统由全世界的爱好者一同参与开发,并且不收费,于是Linux内核就被公开发布到互联网上。一经发布,便引起了社会强烈的反响,在大家的努力下,于1994年Linux的1.0版本正式发布。结合当时的GNU运动,最终合在一起称为了GNU/Linux,以一只企鹅Tux作为吉祥物。
没错,Git也是林纳斯.托瓦兹只花了2周时间开发的。不过林纳斯非常讨厌C++,他认为C++只会让一个项目变得混乱。
从此以后,各式各样的基于Linux发行版就开始出现:
这些发行版都是在Linux内核的基础之上,添加了大量的额外功能,包括开发环境、图形化桌面、包管理等。包括我们的安卓系统,也是基于Linux之上的,而我们要重点介绍的就是基于Debian之上的Ubuntu操作系统。
最后,2022年了,我们再来看一下各大操作系统的市场占有率:
- Windows11/10/7:80%
- MacOS:11%
- Linux:5%
- 其他:4%
Windows无疑是现在最广泛的操作系统,尤其是Windows XP,是多少00后的青春,很多游戏都是基于Windows平台。当然,如果你已经厌倦了游戏,一心只读圣贤书的话,那么还是建议直接使用任意Linux桌面版或是Mac,因为它们能够为你提供极致和纯粹的开发体验(貌似之前华为也出过Linux笔记本?)
安装Ubuntu系统
这里我们就以安装虚拟机的方式在我们的电脑上安装Linux操作系统,我们选用Ubuntu作为教程,如果有经济实力,可以在腾讯云、阿里云之类的服务商购买一台云服务器,并选择预装Ubuntu系统;如果你还想搞嵌入式开发之类的工作,可以购买一台树莓派服务器,也可以在上面安装Ubuntu系统,相当于一台迷你主机。在你已经有云服务器的情况下,可以直接跳过虚拟机安装教学。
官网下载:https://cn.ubuntu.com/download/server/step1
注意是下载服务器版本,不是桌面版本。
在虚拟机中安装
这里我们使用VMware进行安装,VMware是一个虚拟化应用程序,它可以在我们当前运行的操作系统之上,创建一个虚线的主机,相当于创建了一台电脑,而我们就可以在这台电脑上安装各种各样的操作系统,并且我们可以自由为其分配CPU核心和内存以及硬盘容量(如果你接触过云计算相关内容,应该会对虚拟化技术有所了解)
官网下载:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html
安装完成后,会出现一个类似于CMD的命令窗口,而我们就是通过输入命令来操作我们的操作系统。
使用SSH远程连接
如果你使用的是树莓派或是云服务器,那么你会得到一个公网的IP地址,以及默认的用户名和密码,由于服务器安装的Ubuntu并不是在我们的电脑上运行的,那么我们怎么去远程操作呢?
比如我们要远程操作一台Windows电脑,直接使用远程桌面连接即可,但是Ubuntu上来就是命令行,这种情况下要实现远程连接就只能使用SSH终端。
SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。
云服务器上安装的Ubuntu默认都是自带了OpenSSH服务端的,我们可以直接连接,如果你的Ubuntu服务器上没有安装OpenSSH服务器端,那么可以输入命令进行安装:
1 2 |
|
这里我们使用XShell来进行SSH登陆,官网:https://www.netsarang.com/zh/free-for-home-school/
文件系统介绍
在Windows下,我们的整个硬盘实际上可以被分为多个磁盘驱动器:
我们一般习惯将软件装到D盘,文件数据存在E盘,系统和一些环境安装在C盘,根据不同的盘符进行划分,并且每个盘都有各自的存储容量大小。而在Linux中,没有这个概念,所有的文件都是位于根目录下的:
我们可以看到根目录下有很多个文件夹,它们都有着各自的划分:
- /bin 可执行二进制文件的目录,如常用的命令 ls、tar、mv、cat 等实际上都是一些小的应用程序
- /home 普通用户的主目录,对应Windows下的C:/Users/用户名/
- /root root用户的主目录(root用户是具有最高权限的用户,之后会讲)
- /boot 内核文件的引导目录, 放置 linux 系统启动时用到的一些文件
- /sbing 超级用户使用的指令文件
- /tmp 临时文件目录,一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
- /dev 设备文件目录,在Linux中万物皆文件,实际上你插入的U盘等设备都会在dev目录下生成一个文件,我们可以很方便地通过文件IO方式去操作外设,对嵌入式开发极为友好。
- /lib 共享库,系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。
- /usr 第三方 程序目录
- /etc 配置程序目录,系统配置文件存放的目录
- /var 可变文件,放置系统执行过程中经常变化的文件
- /opt 用户使用目录,给主机额外安装软件所摆放的目录。
我们可以直接输入命令来查看目录下的所有文件:
1 2 3 4 |
|
那么我们如何才能像Windows那样方便的管理Linux中的文件呢?我们可以使用FTP管理工具,默认情况下Ubuntu是安装了SFTP服务器的。
这里我们使用Xftp来进行管理,官网:https://www.netsarang.com/zh/free-for-home-school/
用户和用户组
我们整个Linux阶段的学习主要是以实操为主,大量的命令需要大量的使用才能记得更牢固。
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统的用户,都必须申请一个账号,然后以这个账号的身份进入系统。比如我们之前就是使用我们在创建服务器时申请的初始用户test,通过输入用户名和密码登录到系统中,之后才能使用各种命令进行操作。其实用户机制和我们的Windows比较类似。一般的普通用户只能做一些比较基本的操作,并且只能在自己的目录(如/home/test)中进行文件的创建和删除操作。
我们可以看到,当前状态信息分为三段:
1 |
|
格式为:用户名@服务器名称:当前所处的目录$,其中~代表用户目录,如果不是用户目录,会显示当前的绝对路径地址。我们也可以使用pwd
命令来直接查看当前所处的目录。
在Linux中默认存在一个超级用户root,而此用户拥有最高执行权限,它能够修改任何的内容,甚至可以删除整个Linux内核,正常情况下不会使用root用户进行登陆,只有在特殊情况下才会使用root用户来进行一些操作,root用户非常危险,哪怕一个小小的命令都能够毁掉整个Linux系统,比如rm -rf /*
,感兴趣的话我们可以放在最后来演示(在以前老是听说安卓手机root,实际上就是获取安卓系统底层Linux系统的root权限,以实现修改系统文件的目的)
我们可以使用sudo -s
并输入当前用户的密码切换到root用户,可以看到出现了一些变化:
1 2 3 |
|
我们发现$
符号变成了#
符号,注意此符号表示当前的用户权限等级,并且test也变为了root,在此用户下,我们可以随意修改test用户文件夹以外的内容,而test用户下则无法修改。如果需要退出root用户,直接输入exit
即可。
接着我们来看一下,如何进行用户的管理操作,进行用户管理,包括添加用户和删除用户都需要root权限才可以执行,但是现在我们是test用户,我们可以在命令前面添加sudo
来暂时以管理员身份执行此命令,比如说我们现在想要添加一个新的用户:
1 |
|
其中study
就是我们想要创建的新用户,useradd
命令就是创建新用户的命令,同样的,删除用户:
1 |
|
Linux中的命令一般都可以携带一些参数来以更多特地的方式执行,我们可以在创建用户时,添加一些额外的参数来进行更多高级操作:
- -d<登录目录> 指定用户登录时的起始目录。
- -g<群组> 指定用户所属的群组。
- -G<群组> 指定用户所属的附加群组。
- -m 自动建立用户的登入目录。
- -M 不要自动建立用户的登入目录。
- -s 指定Shell,一般指定为/bin/bash
如果还想查看更多命令,可以直接使用man
来查看命令的详细参数列表,比如:
1 |
|
比如我们现在需要在用户创建时顺便创建用户的文件夹,并指定shell(任意一种命令解释程序,用于处理我们输入的命令)为bash:
1 |
|
可以看到已经自动在home目录下创建了study文件夹(这里..表示上一级目录,.表示当前目录):
1 2 |
|
用户创建完成之后,我们可以为此用户设定密码(如果不指定用户,那么会设置当前用户的密码):
1 |
|
输入密码之后,我们可以使用命令来切换用户:
1 2 3 |
|
可以看到,切换用户后名称已经修改为study了,我们使用exit
即可退出当前用户回到test。
输入who
可以查看当前登录账号(注意是登录的账号)输入whoami
可以查看当前的操作账号:
1 2 3 4 5 6 7 8 |
|
接着我们来看用户组,每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。我们可以输入groups
来查看当前用户所有的用户组:
1 2 |
|
我们可以输入id
来查看用户所属的用户相关信息:
1 2 |
|
我们可以看到test用户默认情况下主要用户组为同名的test用户组,并且还属于一些其他的用户组,其中sudo用户组就表示可以执行sudo
命令,我们发现我们创建的study用户没有sudo的执行权限:
1 2 3 |
|
正是因为没有加入到sudo用户组,这里我们来尝试将其添加到sudo用户组:
1 2 |
|
使用usermod
命令来对用户的相关设置进行修改,参数与useradd大致相同:
1 2 3 |
|
接着切换到study用户就可以使用sudo命令了:
1 2 3 4 5 6 |
|
实际上,我们的用户信息是存储在配置文件中的,我们之前说了,配置文件一般都放在etc目录下,而用户和用户组相关的配置文件,存放在/etc/passwd
和/etc/group
中,我们可以使用cat命令将文件内容打印到控制台:
1 2 3 4 5 6 |
|
格式为:注册名:口令:用户标识号:组标识号:用户名:用户主目录:命令解释程序
,而我们的密码则存放在/etc/shadow
中,是以加密形式存储的,并且需要root权限才能查看。
常用命令
接着我们来看一下Linux系统中一些比较常用的命令。
文件操作
文件是最基本的内容,我们可以使用ls命令列出当前目录中所有的文件,参数-a表示包含所有的隐藏文件,-l表示列出详细信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
可以看到当前目录下的整个文件列表,那么这些信息各种代表什么意思呢,尤其是最前面那一栏类似于drwxr-xr-x
的字符串。
它表示文件的属性,其中第1个字符表示此文件的类型:-
表示普通文件,l
为链接文件,d
表示目录(文件夹),c
表示字符设备、b
表示块设备,还有p
有名管道、f
堆栈文件、s
套接字等,这些一般都是用于进程之间通信使用的。
第2-4个字符表示文件的拥有者(User)对该文件的权限,第5-7个字符表示文件所属用户组(Group)内用户对该文件的权限,最后8-10个字符表示其他用户(Other)对该文件的权限。其中r
为读权限、w
为写权限、x
为执行权限,为了方便记忆,直接记UGO就行了。
比如drwxr-xr-x
就表示这是一个目录,文件的拥有者可以在目录中读、写和执行,而同一用户组的其他用户只能读和执行,其他用户也是一样。
第二栏数据可以看到是一列数字,它表示文件创建的链接文件(快捷方式)数量,一般只有1表示只有当前文件,我们也可以尝试创建一个链接文件:
1 |
|
创建后,会生成一个名为kk的文件,我们对此文件的操作相当于直接操作.bash_logout,跟Windows中的快捷方式比较类似,了解一下即可。再次执行ll
命令,可以看到.bash_logout的链接数变成了2。
第三栏数据为该文件或是目录的拥有者。
第四栏数据表示所属的组。
第五栏数据表示文件大小,以字节为单位。
第六栏数据为文件的最后一次修改时间
最后一栏就是文件名称了,就不多说了,再次提及..表示上级目录,.表示当前目录,最前面有一个.开头的文件为隐藏文件。可以看到上级目录(也就是/home目录)所有者为root,并且非root用户无法进行写操作,只能执行读操作,而当前目录以及目录下所有文件则属于test用户,test用户可以随意进行修改。
在了解了Linux的文件查看之后再去看Windows的文件管理,会觉得Windows的太拉了:
那么,如果我们希望对文件的属性进行修改,比如我们现在希望将某个文件的写权限给关闭,可以使用chmod
命令来进行文件属性修改,我们先创建一个test文件,使用touch
命令来创建文件,使用mkdir
命令来创建目录:
1 2 3 |
|
可以看到文件创建之后的默认权限为可读可写,接着我们来将其修改为只读,chmod的使用方法如下:
- chmod (u/g/o/a)(+/-)(r/w/x) 文件名称
我们可以从ugo中选择或是直接a表示所有,+和-表示添加和删除权限,最后rwx不用我说了吧
1 2 3 |
|
除了这种方式之外,我们也可以使用数字来代替,比如现在我要给前两个添加读权限,那么:
约定:r=4,w=2,x=1,需要什么权限就让对应权限的数字相加,一个数字表示一个rwx的权限状态,比如我们想修改为-rw-rw-r--
,那么对应的数字就是664
,对应的命令为:
1 2 3 |
|
如果我们想修改文件的拥有者或是所属组,可以使用chown
和chgrp
命令:
1 2 3 4 5 6 7 8 |
|
再次操作该文件,会发现没权限:
1 2 |
|
接着我们来看文件的复制、移动和删除,这里我们先创建一个新的目录并进入到此目录用于操作:
1 2 3 |
|
首先我们演示文件的复制操作,文件的复制使用cp
命令,比如现在我们想把上一级目录中的test文件复制到当前目录中:
1 2 3 |
|
那么如果我们想要将一整个目录进行复制呢?我们需要添加一个-r
参数表示将目录中的文件递归复制:
1 2 3 4 5 6 7 |
|
可以看到我们的整个目录中所有的文件也一起被复制了。
接着我们来看看移动操作,相当于是直接将一个文件转移到另一个目录中了,我们再创建一个目录用于文件的移动,并将test文件移动到此目录中,我们使用mv
命令进行文件的移动:
1 2 3 4 5 6 7 |
|
现在我们想要移动个目录到另一个目录中,比如我们想将study目录移动到study2目录中:
1 2 3 4 5 6 |
|
mv
命令不仅能实现文件的移动,还可以实现对文件重命名操作,比如我们想将文件test重命名为yyds,那么直接将其进行移动操作即可:
1 2 3 4 5 |
|
最后就是删除命令了,使用rm
进行删除操作,比如现在我们想删除study2目录(注意需要添加-r参数表示递归删除文件夹中的内容):
1 2 3 |
|
而最常提到的rm -rf /*
正是删除根目录下所有的文件(非常危险的操作),-f表示忽略不存在的文件,不进行任何提示,*是一个通配符,表示任意文件。这里我们演示一下删除所有.txt结尾的文件:
1 2 3 4 5 6 |
|
最后我们再来看文件的搜索,我们使用find命令来进行搜索,比如我想搜索/etc目录下名为passwd的文件:
1 2 3 4 |
|
它还支持通配符,比如搜索以s开头的文件:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
系统管理
接着我们来查看一些系统管理相关的命令,比如我们Windows中的任务管理器,我们可以使用top
命令来打开:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
可以很清楚地看到当前CPU的使用情况以及内存的占用情况。
按下数字键1,可以展示所有CPU核心的使用情况:
1 2 |
|
按下f键可以设置以哪一列进行排序或是显示那些参数:
1 2 3 |
|
按下q键即可退出监控界面。
我们可以直接输入free命令来查看当前系统的内存使用情况:
1 2 3 4 |
|
其中-m表示以M为单位,也可以-g表示以G为单位,默认是kb为单位。
最后就是磁盘容量,我们可以使用lsblk
来查看所有块设备的信息,其中就包括我们的硬盘、光驱等:
1 2 3 4 5 6 7 8 9 10 11 |
|
可以看到nvme开头的就是我们的硬盘(这个因人而异,可能你们的是sda,磁盘类型不同名称就不同)可以看到nvme0n1
容量为20G,并且512M用作存放EFI文件,1G存放启动文件,剩余容量就是存放系统文件和我们的用户目录。
这里要提到一个挂载的概念:
挂载,指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。
比如我们的主硬盘,挂载点就被设定为/
根目录,而我们所有保存的文件都会存储在硬盘中,如果你有U盘(最好将U盘的文件格式改为ExFat,可以直接在Windows中进行格式化,然后随便放入一些文件即可)之类的东西,我们可以演示一下对U盘进行挂载:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
将U盘插入电脑,选择连接到Linux,输入sudo fdisk -l
命令来查看硬盘实体情况,可以看到有一个USB DISK设备,注意观察一下是不是和自己的U盘容量一致,可以看到设备名称为/dev/sda1
。
接着我们设备挂载到一个目录下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
最后进入到此目录中,就能看到你U盘中的文件了,如果你不想使用U盘了,可以直接取消挂载:
1 2 |
|
最后我们可以通过df
命令查看当前磁盘使用情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
输入ps
可以查看当前运行的一些进程,其实和top有点类似,但是没有监控功能,只能显示当前的。
1 2 3 4 |
|
添加-ef查看所有的进程:
1 2 3 4 5 6 7 8 |
|
我们可以找到对应的进程ID(PID),使用kill命令将其强制终止:
1 2 3 4 5 6 |
|
比如我们可以将当前会话的bash给杀死,那么会导致我们的连接直接断开,其中-9是一个信号,表示杀死进程:
- 1 (HUP):重新加载进程。
- 9 (KILL):杀死一个进程。
- 15 (TERM):正常停止一个进程。
最后如果我们想要正常关机,只需要输入shutdown即可,系统会创建一个关机计划,并在指定时间关机,或是添加now表示立即关机:
1 2 3 4 5 6 |
|
压缩解压
比较常用的压缩和解压也是重点,我们在Windows中经常需要下载一些压缩包,并且将压缩包解压才能获得里面的文件,而Linux中也支持文件的压缩和解压。
这里我们使用tar
命令来完成文件亚索和解压操作,在Linux中比较常用的是gzip格式,后缀名一般为.gz,tar命令的参数-c表示对文件进行压缩,创建新的压缩文件,-x表示进行解压操作,-z表示以gzip格式进行操作,-v可以在处理过程中输出一些日志信息,-f表示对普通文件进行操作,这里我们创建三个文件并对这三个文件进行打包:
1 2 3 4 5 6 7 |
|
接着我们删除刚刚三个文件,再执行解压操作,得到压缩包中文件:
1 2 3 4 5 6 7 8 9 |
|
同样的,我们也可以对一个文件夹进行打包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
到此,Linux的一些基本命令就讲解为止。
vim文本编辑器
和Windows中的记事本一样,Linux中也有文本编辑器,叫做Vi编辑器,Ubuntu中内置了Vi编辑器的升级版Vim,我们这里就讲解Vim编辑器的使用。
我们可以直接输入vim 文件名称
来使用Vim编辑器对文本文件进行编辑:
1 |
|
进入编辑器之后,我们发现界面变成了:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
这时我们直接输入内容是无法完成的,因为默认进入之后为命令模式
,Vim编辑器默认有三种模式:
- 命令模式:此模式下可以输入任意的命令进行操作,所有的输入都被看做是命令输入,而不是文本编辑输入。
- 编辑模式:此模式下输入的任何内容都会以文本编辑方式写入到文件中,就像我们直接在Windows的记事本中写内容一样。
- 末行模式:此模式下用于输入一些复杂命令,会在最后一行进行复杂命令的输入。
在命令模式下,我们可以直接按下键盘上的i
,此命令表示进行插入操作,会自动切换到编辑模式,这时可以看到最下方变为:
1 2 3 4 5 6 7 8 |
|
而这时我们所有的输入内容都可以直接写到文件中了,如果我们想回到命令模式,按下Esc
键即可。
除了i
以外,我们也可以按下a
表示从当前光标所在位置之后继续写,与i
不同的是,i
会在光标之前继续写,o
会直接跳到下一行,而A
表示在当前行的最后继续写入,I
表示在当前行的最前面继续写入。
这里我们随便粘贴一段文本信息进去(不要用Ctrl+V,Linux中没这操作,XShell右键点粘贴):
1 2 3 4 5 6 7 8 9 |
|
在我们编辑完成之后,需要进入到末行模式进行文件的保存并退出,按下:
进入末行模式,再输入wq即可保存退出。
接着我们来看一些比较常用的命令,首先是命令模式下的光标移动命令:
- ^ 直接调到本行最前面
- $ 直接跳到本行最后面
- gg 直接跳到第一行
- [N]G 跳转到第N行
- [N]方向键 向一个方向跳转N个字符
在末行模式下,常用的复杂命令有:
- :set number 开启行号
- :w 保存
- :wq或:x 保存并关闭
- :q 关闭
- :q! 强制关闭
我们可以输入/
或是?
在末行模式中使用搜索功能,比如我们要搜索单词it
:
1 |
|
接着会在文本中出现高亮,按n
跳转到下一个搜索结果,?是从后向前搜索,/是从前向后搜索。
它还支持替换功能,但是使用起来稍微比较复杂,语法如下:
1 |
|
addr表示第几行或是一个范围,option表示操作类型:
- g: globe,表示全局替换
- c: confirm,表示进行确认
- p: 表示替代结果逐行显示(Ctrl + L恢复屏幕)
- i: ignore,不区分大小写
比如我们要将当前行中的it
全部替换为he
,那么可以这样写:
1 |
|
实际上除了以上三种模式外,还有一种模式叫做可视化模式,按下键盘上的v
即可进入,它能够支持选取一段文本,选取后,我们可以对指定段落的文本内容快速进行复制、剪切、删除、插入等操作,非常方便。在此模式下,我们可以通过上下左右键进行选取,以进入可视化模式时的位置作为基本位置,通过移动另一端来进行选取。
我们可以使用以下命令来对选中区域进行各种操作:
- y 复制选中区域
- d/x 剪切(删除)选中区域
- p 粘贴
- u 撤销上一步
当然,这些命令在命令模式下也可以使用,但是可视化模式下使用更适合一些。
环境安装和项目部署
在学习完了Linux操作系统的一些基本操作之后,我们接着来看如何进行项目的环境安装和部署,包括安装JDK、Nginx服务器,以及上传我们的SpringBoot项目并运行。
我们可以直接使用apt进行软件的安装,它是一个高级的安装包管理工具,我们可以直接寻找对应的软件进行安装,无需再去官网进行下载,非常方便,软件仓库中默认已经帮助我们存放了大量实用软件的安装包,只需要一个安装命令就可以进行安装了。
实际上Ubuntu系统已经为我们自带了一些环境了,比如Python3:
1 2 3 4 5 6 7 |
|
C语言的编译工具GCC可以通过APT进行安装:
1 |
|
安装后,可以编写一个简单的C语言程序并且编译为可执行文件:
1 2 3 4 5 |
|
1 2 3 4 |
|
而JDK实际上安装也非常简单,通过APT即可:
1 2 3 4 |
|
接着我们来测试一下编译和运行,首先编写一个Java程序:
1 |
|
1 2 3 4 5 |
|
1 2 3 4 5 |
|
接着我们来部署一下Redis服务器:
1 |
|
安装完成后,可以直接使用redis-cli
命令打开Redis客户端连接本地的服务器:
1 2 3 |
|
使用和之前Windows下没有区别。
接着我们安装一下MySQL服务器,同样的,直接使用apt即可:
1 |
|
我们直接直接登录MySQL服务器,注意要在root权限下使用,这样就不用输入密码了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
可以发现实际上就是我们之前在Windows的CMD中使用的样子,接着我们就创建一个生产环境下使用的数据库:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
接着我们创建一个用户来使用这个数据,一会我们就可以将SpringBoot配置文件进行修改并直接放到此服务器上进行部署。
1 2 3 4 5 |
|
如果觉得这样很麻烦不是可视化的,可以使用Navicat连接进行操作,注意开启一下MySQL的外网访问。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
使用test用户登录之后,查看数据库列表,有book_manage就OK了。
最后我们修改一下SpringBoot项目的生产环境配置即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
然后启动我们的项目:
1 |
|
现在我们将前端页面的API访问地址修改为我们的SpringBoot服务器地址,即可正常使用了。
我们也可以将我们的静态资源使用Nginx服务器进行代理:
Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 在高连接并发的情况下,Nginx是Apache服务器不错的替代品。
Nginx非常强大,它能够通提供非常方便的反向代理服务,并且支持负载均衡,不过我们这里用一下反向代理就可以了,实际上就是代理我们的前端页面,然后我们访问Nginx服务器即可访问到静态资源,这样我们前后端都放在了服务器上(你也可以搞两台服务器,一台挂静态资源一台挂SpringBoot服务器,实现真正意义上的分离,有条件的还能上个域名和证书啥的)。
安装如下:
1 |
|
安装完成后,我们可以直接访问:http://192.168.10.4/,能够出现Nginx页面表示安装成功!
接着我们将静态资源上传到Linux服务器中,然后对Nginx进行反向代理配置:
1 2 3 4 5 6 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
然后就可以直接访问到我们的前端页面了,这时再开启SpringBoot服务器即可,可以在最后添加&符号表示后台启动。