本教程官方讨论群:591293628 欢迎加入
简介
Linux是开发人员不可缺少的“专用操作系统”,强大的内核、各种命令行工具、文件系统、终端都能为你的开发带来极大的便利,它也是几乎所有开发人员的必修课。也许你还并未听说过这个神奇的系统,今天就让我们一起来认识他。
目标
- 安装Linux操作系统的一个桌面发行版
- 了解Linux系统的特点
- 学习一些常用的Linux基本指令,学习使用终端
- 学习如何在Linux上安装软件包和环境依赖
任务
- 搭建LNMP环境,为后端开发的学习做准备
预期时间
- 1-2 天 (鉴于首次安装linux系统对于不同电脑来说难度不同,所以可酌情增加)
前言
Linux的诞生
让我们回到年代久远的70年代,那时候windows等类似的图形化操作系统还没有诞生,系统操作主要以命令行指令为主。在这个阶段诞生了UNIX操作系统,它是历史上第一款相对较为成型的操作系统(也一直沿用到今日)。90年代,芬兰人李纳斯·托瓦兹(Linus Torvalds)认为UNIX太过臃肿而且不开源,萌生了开发自己的操作系统的想法,于是他基于UNIX和POSIX两大操作系统的基本机制开发了Linux(Linus' Unix)系统,由于设计的成功和开源社区的推动,Linux最终成为了开发界独占鳌头的操作系统(内核)。
Linux的诞生伴随着开源意识的崛起,在极客文化史上也有着重要的地位,对这方面感兴趣的同学不妨去了解一下 : )
为什么要使用Linux
你可能会问,用Windows就不能做开发了吗?答案当然是可以的,只是没有那么方便。
首先你可以简要的了解一下Linux和Windows之间的差别:
我根据个人的经验,简要的概括一下Linux在开发中几大优点:
Linux系统内核比起Windows要透明,简单得多,因此你可以根据所需深入系统进行调试,更容易理解你程序运行的流程以及debug(当然这也带来更大的危险性)
许多的开发工具都是基于Linux开发的,并且需要借助Linux的终端命令行来使用,比如我们接下来要接触到的git,composer,npm,nginx...等等,这些工具虽然在Windows上也能使用,但是安装和使用都要麻烦许多。
强大的终端。借助各种工具,你可以使用终端快速完成很多操作,很快你就将意识到,图形界面是阻碍程序员生产力发展的一个重要因素(笑)
安装Linux
让我们进入正题,首先你得给自己的电脑安装上Linux操作系统才能用它(如果你是MAC用户可以跳过这一步了,OSX系统基于Unix系统,已经能满足绝大多数开发需要)。不过要说明的一点是,我们这里所说的Linux操作系统,是各种公司基于Linux内核封装的发行版,目前主流的Linux发行版有以下几个:
- Debian
- Ubuntu(最为常见的图形版本之一,基于Debian,在服务器上也有很好的表现)
- RedHat
- centOS(老牌服务器操作系统,基于RedHat)
- Kali(黑客神器,附有大量渗透测试工具)
- Deepin(国产良心,基于Debian)
- Arch(Linux内核永远保持最新,适合热爱尝鲜和折腾的人)
有关发行版的选择在这里不做过多的赘述,你可以任选一款喜欢的,对于新手我们首推使用Deepin,省去很多麻烦的配置,其次是Ubuntu。
有关Linux的安装本次教程不能给出详细的流程来,因为各大发行版本,甚至于各种电脑的安装方式都不尽相同,下面给出一个比较通用的安装流程,详细的情况请根据自己电脑的版本和要安装的发行版本来进行搜索以获得更多支持。
安装流程
- 建议备份电脑上的重要资料,以防发生意外丢失数据
- 确认自己的电脑为UEFI方式启动,这个可以在BIOS的Boot中查看(如果你不知道啥是BIOS,怎么进入BIOS,请进行搜索..),另外建议将secure boot关闭。
- 在windows的磁盘管理工具中压缩一个有剩余空间的磁盘,得到一个50G以上空间的未格式化的分区(千万不要格式化),也不要分配盘符。
- 下载所需发行版的镜像(.iso文件),然后使用UltraISO刻盘工具(Deepin有自己的刻盘工具)将其刻录到一个U盘上(刻盘会格式化U盘)
- 在BIOS中设置开启启动顺序为U盘第一,或者使用快速启动菜单选择,从刻录的u盘启动电脑,一般就会进入一个图形化的安装界面。
- 选择刚才分出来的空闲区间,把新系统安装在上面(某些发行版本可能需要自己指定挂载点)
- 耐心等待安装完毕后拔出U盘重启,一般就可以看到双系统的引导了,至此安装完毕,你可以同时在电脑上使用Linux和Windows两种系统。
- Deepin用户可以查看这个教程来安装,其安装过程相对简单的多,推荐新手使用国产良心系统Deepin! Deepin安装教程
系统基本知识和指令
接下来的知识点基于各发行版本共用的Linux内核来进行讲解,主要是为了说明Linux系统的一些特征和常用指令,帮助你理解Linux的本质、思想以及如何操作。
使用终端
终端是我们使用命令来和Linux内核交互的重要渠道,也是使用Linux的最大理由之一,接下来的所有操作和知识点都将围绕终端的操作来展开。
注意,这里的终端快捷操作和指令主要基于bash来进行,这是绝大多数发行版本默认的终端系统。
打开终端
一般你可以在所有的应用程序中找到名为“终端”或者“Terminal”的应用,打开来会是一个带着闪烁光标的小黑框(除了Ubuntu以外的系统一般都会默认终端为黑白底色)。Debian系的发行版本往往可以使用快捷键Ctrl+Alt+T
来打开一个新终端,这个非常有用。
我们来看一个典型的终端启动界面
你可以同时打开多个终端进行不同的操作和指令。
1.文件系统
文件是Linux系统中最为基础、最为底层的抽象。Linux早期的一个核心理念是:一切皆为文件——无论是普通文件、目录、应用程序、乃至进程、线程等一系列的资源都可以被抽象成文件。
Linux中主要有三种类别的文件类型:普通文件
,目录
,链接
,你可以把他们类比为Windows下的文件
,文件夹
和快捷方式
。
此外linux的整个文件系统为一个属性系统,根节点为/
目录,以此向下扩展,主要的目录如下所示:
每个目录都有着自己的作用,其中最为常用的几个目录是
/home/用户名
用户主目录,这里保存着系统中每个用户的主目录,一般登录后默认的工作目录就是这里,你可以使用~
来指代你的主目录,比如我的用户名为mark,那么/home/mark
和~
是等价的。此目录主要用于存放用户的各种文件,如图片,文档,安装包等等,也是你以后最常用到的目录。/etc
配置目录,各大软件都喜欢默认把自己的配置文件放在这里。如果你要修改一个软件的属性和配置,来这里准能找得到。/usr/local/bin
这里是放置各种全局命令脚本的地方,一般都是各种各样的链接。/var
主要用来存放共享到网络上的文件,在后端开发中,习惯会把运行用的代码和脚本放在/var/www
目录下。
文件系统的相关指令
文件系统相关的指令较为基础,也比较多,这里给出一篇链接教程供大家学习:
为了满足日常开发的需要,你需要了解以下知识:
-
ls
,mkdir
,cd
,cat
,rm
,cp
,mv
,touch
等基础指令的使用 - 如何识别目录,文件和链接
体会为什么程序员们总拿rm -rf /
这条命令作为“删库跑路”的梗
!快捷键
在继续讲解后面的指令前,你一定要先了解几个最实用常用的终端快捷键。
Tab:智能补全
在使用cd,ls等命令时你一定已经发现了,如果要自己一点一点手打冗长的目录或者文件名称,是一件极其痛苦的事情,其实我们是不用这么麻烦自己手动去输入的,只要使用tab键,终端会自动推测你当前位置可能需要补全的内容,如果只有一个候选项那么将会自动填充,如果有多个候选项将会显示一个列表,你可以输入几个字母进行进一步的填充。
这么说可能比较抽象,我们来看几个基础的实例:
比如我们的目录下有这么两个文件:
我们现在想要删除fjaofjoaifjiojoiaffjfa
这个文件(靠上那个),自己去输这个名字可得折腾死,现在然我们试着使用补全,输入rm f
然后按下tab键:
首先会自动补全一个j,这是因为当前目录下以f开头的文件后面必定跟着一个j,再按下tab键就会显示一个候选的列表,因为以fj开头的文件有两个,这时候需要你做出进一步的选择,我们输入一个a然后再按下tab键就可以补全选中第一个文件了。
另外除了文件、目录名,几乎所有需要输入的东西都可以使用tab键补全,比如命令、用户名..总之当你不知道输入什么的时候就按几下tab键吧(笑),亲自尝试几次你很快就能掌握这个快捷键。
CTRL+C 取消正在进行中的操作
这个快捷键可以停止一个正在进行的操作,比如ping
指令,运行之后是这样的:
当你运行后它会不停的向指定的地址发送数据包来测试连接是否通常,在执行过程中,你输入任何东西都没有用,当你不想再运行它的时候,就按下CTRL+C快捷键,这个操作就会被取消,然后返回我们的终端了:
复制和粘贴
bash终端中一般使用ctrl+shift+c和ctrl+shift+v来进行复制和粘贴
2.用户和权限系统
现在我们来讲解Linux系统中的第二层重要抽象:用户、用户组和权限系统。这个东西要真想讲明白可就复杂了,在当前阶段,你只需要了解一下目录和文件的权限属性,以及一些sudo
提权这样的常用操作就可以了。
用户和用户组
linux是一款多用户的操作系统,也就是说可以有多个用户同时使用该操作系统。那么,为了区分不同用户对文件的可操作度,就出现了以组来划分用户的系统:用户组。
而在众多的用户中,有一个名为root的用户拥有至高无上的权利,我们一般可以通过在命令前加sudo
来实现以root身份进行操作:
mkdir temp
sudo mkdir temp // 以root用户的身份创建
以root身份运行命令可以带来很大的遍历(基本避免一切permission denied问题),但是也会带来很大的危险性,因为root拥有对整个系统的完整控制权,如果被人提权或者操作不当将会带来极大的危害性,摧毁整个系统也是分分钟的事(少年,来一发sudo rm -rf /
?)。
文件属性
上面白话了那么多,不谈到具体情况还是没法理解权限系统的,现在让我们来谈谈最常见的情况:也就是文件和目录的操作。
首先查看这篇文章来学习文件的权限相关属性:
这将有助你更好的了解ls -al
命令所展示的列表,此外要记住两个最常见的权限代码:777
和755
,在大部分的开发调试和生产环境下,我们都会用到这样属性的目录。
运行程序
现在我们来深入一些,讨论运维和后端开发中较为常见的一个问题,那就是运行的程序(进程)的权限问题。之前说过linux把一切都抽象成文件,这就使得进程也拥有了和文件一样的权限属性:运行它的人是谁?它能正常的读哪些文件?写哪些文件?这些问题常常能够决定一个进程的稳定性和安全性。
为了保持稳定和安全,我们在真正的生产环境中常常基于用户和用户组来指定一系列的策略,一般来说我们不会以root身份去运行后台的进程,而是会为它分配一个专用的账户,同时把这个进程所需的资源(文件)的拥有者改为这个账户所有,然后基于用户组来分配合理的权限以实现进程之间基于资源的通信。
实际的情况可能还要比这个复杂一些,希望你在这里明白的一点是,程序的运行也是和权限挂钩的,这对后台的进程而言尤为重要,在后面nginx服务器的配置中你将很快的意识到这一点。
3.安装程序和扩展
基本的终端命令已经学习的差不多了,如果linux的功能被局限在这几十个指令里,那就太无趣了。Linux既然是一个操作系统,就应该能和windows一样安装各种软件,现在让我们来看看基于终端的程序是如何安装、卸载和管理的。
统一包管理平台
在Linux系统上安装应用是一件很神奇的事情,你根本不需要和在windows上一样在网上到处找下载地址,每一个发行版都会为我们提供官方的一个软件库,基本上你能用到的绝大多数扩展和软件都能在这里找到,一般你只需要一行命令就能完成下载、安装甚至是配置。
我们一般称这个库为包管理平台,这是因为Linux把独立的一个个功能或是程序命名为包,程序一般会基于包开发来产生新的包,这就不可避免的会产生依赖问题(顺便一提,依赖问题是以后我们经常会遇到的一个事情)。
在这里提一下常见的几种依赖问题:
- 需要安装包
A
,但是包A
是基于B
来开发的,就必须先安装包B
,一般情况下遇到这种情况包管理器会帮我们自动安装好B
,来解决这个依赖。 - 需要安装包
A
,包A
是基于B
来开发的,但是目前由于某些原因(比如其他软件需要),已经安装了一个和A
所需的版本不同的包B'
,这种牵扯到版本的依赖就变得复杂起来,往往需要我们自己手动去调试解决冲突。
实际上说了这么多,在我们实际使用的过程中倒是很少遇到依赖冲突等情况,不过这里还是讲一下,以便大家对包的管理有一个更进一步的了解和意识。
使用包管理平台
不同系的linux发行版本拥有不同的包管理平台,最为常见的两种是debian系的apt
和redhat系的yum
,就个人角度而言,apt
上的包比起yum
要更新更全一些,所以这里还是推荐大家使用debian系的ubuntu和deepin来作为日常开发的主力系统,下面的教程也会基于apt
来进行。
现在我们来介绍基于apt
的包管理命令,那就是apt-get
,请注意,因为是对系统安装功能,下面的所有指令基本都需要sudo
来提升权限。
-
apt-get update
这个用于更新包列表,我们使用apt安装功能时,往往是在本地缓存的列表中寻找对应的包的,因此如果你没有使用这个命令去及时更新你本地的列表,来保持和线上列表的同步,你就很可能会找不到这个包,或者安装到一个较老版本的包。
一般这个命令只会在你第一次使用apt-get安装软件前,或者更新了线上软件源(待会会讲到)以及添加了额外的第三方软件仓库时才需要执行,你不需要非常频繁的去update你的列表,有时候几个月一次都是够的。
-
apt-get install 包名
这个就是安装了,只要你知道包名,安装一个软件就只需要这一行命令,简单爽快。
-
apt search 关键字
问题是,有些时候我们不太能确定要安装的包名,你可以用这个命令来查找远程源中有哪些名字相近的包。(虽然大多数情况下我们是先谷歌到要安装啥包才去install的,基本也用不到它)
apt list
这个用于列出当前系统中都安装了哪些包,一般会输出一堆成百上千的列表,为了能够进一步缩小范围,一般会使用apt list |grep 关键字
这样的形式来查找。|grep 关键字
是一个十分好用的限定功能,当你需要在大量的终端输出中检索一些特定的信息时,都可以使用它,建议自己搜索一下它的使用原理和途径。
-
apt-get remove 包名
用于卸载一个已经安装的包。
上述就是用于安装扩展和功能的基本命令,最后我再列出一个较为常用的修复依赖用的命令:apt-get install -f
,安装时遇到依赖冲突可以试试它(虽然不一定好使)。
现在我们来尝试一下,装上一个tree
命令试试吧:
首先apt-get update
:
等待一会之后就可以apt-get install tree
来安装了,记得输入y确认(如果你在这里等了非常长的时间或者根本没法update,请准备更换你的软件源,下面我们会提到一下):
好了,现在我们就可以使用tree命令了:
是不是超级简单,如果你不想要这玩意了,apt remove tree
就可以删掉它了。
软件源
我们刚才说到统一包管理平台,它是有一个线上的大仓库(源)的,update就是在同步这个源到本地,实际上除了官方提供的源,我们也有很多其他机构(比如各大知名学校和公司)维护的源,有些时候因为某些原因,可能会导致你现在的源访问、安装软件的速度比较缓慢,这时候就需要换源,具体的操作也不是特别复杂,这个主要针对于用ubuntu等国外发行版本的同学,大部分国内的发行版源都是很快很稳定的。
软件源,在我们的操作系统里其实就是一个包含了几个网址的文件而已,这些网址就是apt命令去获取包列表的途径,因此所谓的换源就是把这个文件里面的网址给替换一下而已,现在我们来说一下这个文件的位置,它就是/etc/apt/
下的sources.list
。
我们先cd /etc/apt
移动到该目录下,然后使用sudo gedit sources.list
来查看和编辑里面的内容。
(注意,gedit是debian系中的一个GUI文本编辑器,如果你的发行版本中没有可以考虑安装或者使用较为通用的vim,nano等指令)
没错,一个源的格式大概就是这样的:
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
如果你发现sources.list里面是空的也没关系,很多发行版本在使用默认软件源时都不会读取sources.list里面的内容。
现在让我们来尝试更换软件源为阿里官方源吧
首先你应该把原来的sources.list
备份一下,正所谓小心驶得万年船,在执行一些危险的系统操作时最好都这么干
我们sudo cp sources.list sources.list.bak
就可以在当前目录下复制一个sources.list
的备份sources.list.bak
,备份文件的名字你可以随便取,只要你能记得起来就可以。这样当我们遇到问题需要重置原来的源时,只需要sudo mv sources.list.bak sources.list
就可以覆盖还原了。
然后我们需要上网搜索所需要更换的源列表,请记住一定要指明你的发行版名称和版本,比如ubuntu14.04就一定要搜索ubuntu14.04的源,如果用错了发行版或者版本(比如用了16.04的软件源),将会导致apt无法工作。
在这里推荐几个提供优质软件源的公司和学校:网易、阿里、中科大以及腾讯都是不错的选择。
现在让我们更换阿里的软件源,执行sudo gedit sources.list
,把查找到的源的内容复制进去然后保存(ctrl+s):
接下来执行sudo apt-get update
更新,就完成了,以后install和update的资源都将从阿里源获取。
任务1:安装LAMP环境
下一讲开始我们将会以PHP语言为基础来入门后端开发,但后端开发可不是只要一个编辑器和浏览器就能上手的,我们需要在本地配置一个服务器环境,它需要以下几个模块
- 应用服务器:nginx或apache2,这里暂时使用不需配置的apache2,后续我们会改为nginx
- 一个后端开发语言,我们选择php,版本为最新的7.0
- 数据库:主要是mysql或者MariaDB
现在你需要使用所讲的知识,参考下面这篇我所写的教程来安装相应的软件包,并进行相应配置,完成开发环境的搭建:
注意如果你是16.04以上的ubuntu或者最新的deepin的话,请跳过中间增加php7.0源的指令:
//这两行不用执行
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
测试你是否完成环境搭建的办法是,在/var/www/html
目录下,创建一个test.php
文件,然后将以下内容复制进去并保存
<?php
phpinfo();
?>
接下来在浏览器中访问http://localhost/test.php
,如果看到以下的画面就算成功了:
任务2:学习PHP基本语法
在搭建环境后,请先自学一部分PHP的基本语法,这些内容比较冗长麻烦,所以我在后续的教程中会跳过,同时这也是检验你自学能力的一个小测试,在下次课开始前,你应该学习一下php的基础语法(放心,很简单),只需要了解以下内容就够了:
- 变量的定义和使用
- 函数的定义和使用
- 基本流程控制:选择和循环
- 数组的使用:这里是个重点,好好学习一下这个神奇的数据结构
相信我,PHP的语法在有C语言基础的情况下基本半天就能看完了: )
学习链接依旧是菜鸟教程:PHP教程
你大概需要看这几节就够了:
小结
这一篇教程算是有些难度了,希望大家能够坚持努力一些,你离真正的开发者已经不远了。
我在下一讲等你
给出一些相关的阅读:
以及一些推荐书籍:
《鸟哥的linux私房菜》
、《PHP之道》
、《图解HTTP》
等,以供想要深入了解的同学进一步学习。