一、简介
1.什么是Linux?
2.Linux的简史
Linux操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:Unix操作系统、MINIX操作系统、GNU计划、POSIX标准和Internet网络。 20世纪80年代,计算机硬件的性能不断提高,PC的市场不断扩大,当时可供计算机选用的操作系统主要有Unix、DOS和MacOS这几种。Unix价格昂贵,不能运行于PC;DOS显得简陋,且源代码被软件厂商严格保密;MacOS是一种专门用于苹果计算机的操作系统。此时,计算机科学领域迫切需要一个更加完善、强大、廉价和完全开放的操作系统。由于供教学使用的典型操作系统很少,因此当时在荷兰当教授的美国人AndrewS.Tanenbaum编写了一个操作系统,名为MINIX,为了向学生讲述操作系统内部工作原理。MINIX虽然很好,但只是一个用于教学目的的简单操作系统,而不是一个强有力的实用操作系统,然而最大的好处就是公开源代码。全世界学计算机的学生都通过钻研MINIX源代码来了解电脑里运行的MINIX操作系统,芬兰赫尔辛基大学大学二年级的学生Linus Torvalds就是其中一个,在吸收了MINIX精华的基础上,Linus于1991年写出了属于自己的Linux操作系统,版本为Linux0.01,是Linux时***始的标志。他利用Unix的核心,去除繁杂的核心程序,改写成适用于一般计算机的x86系统,并放在网络上供大家下载,1994年推出完整的核心Version1.0,至此,Linux逐渐成为功能完善、稳定的操作系统,并被广泛使用。 (1)GNU计划
中文名:革奴计划,
GNU是“GNU is Not Unix”的递归缩写。
UNIX是一种广泛使用的商业操作系统的名称。GNU就是一个自由的操作系统,
GNU的创始人,理查德·马修·斯托曼,将GNU视为“达成社会目的技术方法”。 作为操作系统,GNU的发展仍未完成,其中最大的问题是具有完备功能的内核尚未被开发成功。GNU的内核,称为Hurd,是自由软件基金会发展的重点,但是其发展尚未成熟。在实际使用上,多半使用Linux内核、FreeBSD等替代方案,作为系统核心,其中主要的操作系统是Linux的发行版。 (2) UNIX操作系统
Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。Unix作为一种开发平台和台式操作系统获得了广泛使用,目前主要用于工程应用和科学计算等领域。UNIX系统是一个分时系统。最早的UNIX系统于1970年问世。此前,只有面向批处理作业的操作系统,这样的系统对于需要立即得到响应的用户来说是太慢了。
(3) POSIX标准
可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼(RMS)应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。
3.GNU、LINUX之间的关系
Unix 系统被发明之后,大家用的很爽。但是后来开始收费和商业闭源了。一个叫 RMS 的大叔觉得很不爽,于是发起 GNU 计划,模仿 Unix 的界面和使用方式,从头做一个开源的版本。然后他自己做了编辑器 Emacs 和编译器 GCC。
GNU 是一个计划或者叫运动。在这个旗帜下成立了 FSF,起草了 GPL 等。
接下来大家纷纷在 GNU 计划下做了很多的工作和项目,基本实现了当初的计划。包括核心的 gcc 和 glibc。但是 GNU 系统缺少操作系统内核。原定的内核叫 HURD,一直完不成。同时 BSD(一种 UNIX 发行版)陷入版权纠纷,x86 平台开发暂停。然后一个叫 Linus 的同学为了在 PC 上运行 Unix,在 Minix 的启发下,开发了 Linux。注意,Linux 只是一个系统内核,系统启动之后使用的仍然是 gcc 和 bash 等软件。Linus 在发布 Linux 的时候选择了 GPL,因此符合 GNU 的宗旨。
最后,大家突然发现,这玩意不正好是 GNU 计划缺的么。于是合在一起打包发布叫 GNU / Linux。然后大家念着念着省掉了前面部分,变成了 Linux 系统。实际上 Debian,RedHat 等 Linux 发行版中内核只占了很小一部分容量。
4.基本思想
Linux的基本思想有两点:
第一,一切都是文件;
第二,每个文件都有确定的用途。
其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。
5.特点
(1)完全免费
Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。 (2)完全兼容POSIX1.0标准
这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。 (3)多用户、多任务
Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。
多任务则是现代电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。
(4)良好的界面
Linux同时具有字符界面和
图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows图形界面的X-Window系统,用户可以使用鼠标对其进行操作。在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。
(5)支持多种平台
Linux可以运行在多种硬件平台上,如具有
x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux 2.4版内核已经能够完全支持
Intel64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。
6.优点
(1)Linux由众多微内核组成,其源代码完全开源;
(2)Linux继承了Unix的特性,具有非常强大的网络功能,其支持所有的因特网协议,包括TCP/
IPv4、
TCP/IPv6和链路层拓扑程序等,且可以利用Unix的网络特性开发出新的协议栈;
(3)Linux系统工具链完整,简单操作就可以配置出合适的开发环境,可以简化开发过程,减少开发中仿真工具的障碍,使系统具有较强的移植性;
7.Linux主要发行版本
8.开源软件
(1)特点
【1】使用的自由:绝大多数开源软件是免费的,但是请注意,开源不等于免费;
【2】研究的自由:可以获得软件的源代码;
【3】散步及改良的自由:可以自由传播、改良甚至销售;
(2)支持互联网的开源技术 --- LAMP架构
9.Linux的应用领域
(1)基于Linux的企业服务器
(2)嵌入式应用
【1】手机、平板电脑等移动终端设备;
【2】其他嵌入式应用
智能家电:机顶盒、游戏机、数码相机等等;
智能卡系统
航空系统
银行系统
卡拉OK点歌系统
。。。
(3)Linux在电影娱乐业的应用
二、系统分区/磁盘分区
1.概念
磁盘分区是使用分区编辑器(partion editor)在磁盘上划分几个逻辑部分。不同类的目录与文件可以存储进不同的分区中,方便管理和读写;
2.分区类型
(1)主分区:最多只能有4个;
(2)扩展分区:
【1】最多只能有1个;
【2】主分区加扩展分区最多有4个;
【3】不能写入数据,只能包含逻辑分区;
(3)逻辑分区:下面的例子中,由于硬盘结构的限制,最多只能有4个分区,但是我们需要5个分区。因此,我们将第4个分区作为扩展分区,分区5和分区6是分区4包含的逻辑分区,分区4只是个概念性的分区,实际上的分区是5和6,所以,真正可以进行格式化和数据的读写的是分区5/6.
3.格式化
格式化(高级格式化),又称为逻辑格式化,它是指根据用户选定的文件系统(如FAT16、FAT32、NTFS、EXT2、EXT3、EXT4等等),在磁盘的特定区域写入特定的数据,在分区中划出一片用于存放文件分配表、目录表等用于文件管理的磁盘空间;格式化的目的就是为了在硬盘中写入我们的文件系统;就像给我们的柜子打隔断,打分层,制定存放规则。
4.硬件设备文件名和分区设备文件名
(1)硬件设备文件名
由于LINUX的思想就是万物都是文件,硬件也是一种特殊的文件。/dev文件下存放的都是硬件设备文件名;
(2)分区设备文件名
我们有了硬件设备文件名后,还要给我们的分区设置文件名,分区文件名是在硬盘文件名后面直接加分区号(阿拉伯数字),例如上面的/dev/hda1 ---- IDE硬盘接口的第一块硬盘/dev/hda --- 第一块硬盘中的第一个分区/dev/hda1,依次类推,hda2就是第二分区,。。。
(3)扩展知识 --- 硬盘的型号分类
【1】IDE硬盘 --- 最古老的,理论的最高传输速率是133Mb/s;
【2】SCSI硬盘 --- 理论的最高传输速率是200Mb/s,主要用在服务器上,因为价格更加昂贵;
【3】SATA --- 串口硬盘,现在已经发展到SATA三代了,
理论的最高传输速率是500Mb/s;前面两种硬盘都已经被淘汰掉了,现在不管是在服务器还是客户端使用的大多都是SATA硬盘接口,所以我们在Linux的文件目录中最常见的是/dev/sda1这样的设备文件名;
5.分区表示
需要注意的是:我们的逻辑分区永远都是从5开始的,这是因为分区号1,2,3,4,是保留给主分区和扩展分区的,即使像硬盘b这样的分区方式,一个主分区,一个扩展分区,我们的逻辑分区也是从5开始的;
6.挂载
(1)必须分区
【1】/(根分区)
【2】swap分区(交换分区,内存2倍,不超过2GB),可以把它理解为我们的虚拟内存,在运行的时候通过交换的方式让人从感官上感觉内存比实际大很多;
(2)推荐分区
/boot(启动分区,200MB)
(3)挂载概念
Linux 系统中“一切皆文件”,所有文件都放置在以根目录为树根的树形目录结构中。在 Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。因此产生的问题是,当在 Linux 系统中使用这些硬件设备时,只有将Linux本身的文件目录与硬件设备的文件目录合二为一,硬件设备才能为我们所用。合二为一的过程称为“挂载”。如果不挂载,通过Linux系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到。 注意:“挂载点”的目录需要以下几个要求:
【1】目录事先存在,可以用mkdir命令新建目录;
【2】挂载点目录不可被其他进程使用到;
【3】挂载点下原有文件将被隐藏。
7.linux文件系统的结构
和Windows不同的是,linux所有的目录都是挂载在我们的根目录下,都是根目录的子目录,但是从硬盘分区来看,不同的文件目录可以使用不同的硬盘分区
8.Linux系统分区步骤以及注意事项
步骤:
(1)分区:把大硬盘分为小的逻辑分区
(2)格式化:写入文件系统
(3)分区设备文件名:给每个分区定义设备文件名
(4)挂载:给每个分区分配挂载点(挂载点必须是空目录,才能进行分配)
注意:
(1)在我们安装系统的时候进行分区和挂载的时候,/boot一定是第一个分区,因为/boot下存放的是系统的启动文件,系统的启动信息一定要放在硬盘的最开始的位置(这个分区号是系统自动分的,一般来说先建的分区的分区号要靠前,但是无论/boot分区什么时候创建,都会自动跳成第一个分区)
(2) swap分区是没有挂载点的,因为它是我们操作系统内核进行直接调用的;
(3)一般都是最后挂载/root,因为剩下的所有分区空间都是要挂载在/root下的,所以最后进行/root分区的挂载,就不需要计算分区大小了,把全部可用空间都分给/root即可,另外,下图发现,/root分区的分区编号是sda5,而不是sda4,这是因为操作系统不知到你接下来还要不要再分区了,而一块硬盘最多只能有四个主分区,所以为了防止出现这种情况,操作系统就自动把第四个分区当做扩展分区了。
(4)在分区和挂载完成之后要进行格式化操作
三、系统安装
1.软件安装包的选择
在格式化完成后要进行个软件包的选择 --- 根据你这个操作系统的用途来进行选择,如果是要进行服务器开发的话,作为服务器而言,稳定性和安全性是它的首要考虑因素,因此做的越少、安装的服务软件越少,越安全越不容易出错,越不容易被攻击,所以一般做服务器开发的话,就选择最小化Minimal
2.安装日志
在/root目录下默认会有这么几个文件,分别是:
这里说一下第三个文件,这个kickstart配置文件的作用就是自动安装系统,不需要程序员的手动参与。当我们需要安装几千台甚至更多的服务器的时候,例如3000多台游戏服务器,总不能让程序员一个个的去安装吧。我们可以通过配置这个让服务器自动安装,但是不能凭空安装,而是要依赖一个已经安装好了服务器,以这个已经安装好了的服务器作为模板,其他的服务器会根据这个模板进行自动安装,这个kickstart配置文件就是模板文件。
四、远程登录管理工具
1.虚拟机网络配置
(1)桥接模式
桥接指的是我们的虚拟机是利用我们的真实网卡来和我们的当前计算机进行通信,我的本机有两个真实网卡,一个是本地连接,一个无线连接,装完虚拟机后会出现两个虚拟网卡(这两个虚拟网卡都是后面两种方式使用的)。
好处:
【1】配置简单;选择桥接模式,并且虚拟机设置和我们主机同一个网段的IP地址,就可以在虚拟机和主机之间直接通信;
【2】局域网内如果有同网段的其他机器,也可以进行通信;
坏处:它需要占用你网段的一个IP,如果同网段有很多主机,那么很容易出现IP地址冲突的问题;
当我们使用网线连接的时候,使用桥接方式会比较方便点;
【1】首先确认我们主机的IP地址,确认网段
【2】修改虚拟机网段和主机一致:ifconfig eth0 192.168.1.156
【3】测试连通
ping 192.168.1.156
(2)NET方式
它代表着你的虚拟机是通过虚拟网卡VMnet8来和我们的主机进行通信的,并且在你主机可以访问互联网的情况下,虚拟机也可以访问我们的互联网;
(3)Host-only
它代表着你的虚拟机是通过虚拟网卡VMnet1来和我们的主机进行通信的,和NET不同的是,它只能和我们的主机进行通信,不可以访问互联网;
当我们使用无线网卡连接到互联网中的时候,使用Host-only模式来进行通信的步骤如下:
【1】查看我们的虚拟网卡VMnet1的IP地址(虚拟网卡会自动的分配一个没有被占用的IP地址),并复制;需要注意的是虚拟IP地址的网段是118,等会需要配置我们的虚拟机的网段在118,否则无法进行通信
【2】回到虚拟机中,首先切换到root用户模式,输入ifconfig(if:interface,网卡的意思),输入这个命令是用来查询虚拟机当前的网卡信息;
根据上面的信息,我们发现当前的虚拟机有这样一块回环网卡LO(loopback),它的IP地址是127.0.0.1(这个IP地址属于特殊的IP地址,主要使用用来做一个本机自我连接通信的)
【3】输入ifconfig eth0 192.168.118.2
之前就强调过了,在Linux所有的东西都是文件,都有文件名,描述我们SATA下的分区的文件是sda1、sda2这样的文件名,而在这里描述我们网卡的文件就是eth0、eth1。。(eth:Ethernet,以太网)。
另外,这个IP地址必须和上面我们在虚拟网卡里看到的IP地址是同一个网段的。
【4】输入ifconfig,查看配置是否成功
【5】在主机上打开cmd进行ping测试,ping 192.168.118.2
如果得到这样一个ICMP的请求应答包,就代表我们的网络配置已经完成了。
(4)注意:
【1】通过ifconfig这个命令来更改IP地址,是临时的改变,在重启后这个更改就会丢失。如果想要永久生效,需要去更改它的配置文件
【2】在使用桥接的模式的时候要注意,如果在配置好了IP地址后,虚拟机和主机还是无法进行通信的话,那么有可能就是我们桥接错了真实的网卡,因为我们的网卡有两个,一个无线网卡,一个有线的网卡,桥接在自动桥接的时候可能会桥接到没有联网的那个网卡上。我们可以手动调整下。
2.SecureCRT远程连接管理工具
(1)步骤
【1】连接
在Hostname里面输入192.168.1.156(虚拟机里linux系统的IP地址),usename:root,在有的linux系统中是禁止root用户远程登入的,所以我们需要创建一个普通用户来进行登入;另外,也是建议使用普通用户来进行登入,因为root用户的权限太大。
这样就连接成功了,在这个界面敲任何的命令都和在虚拟机中直接敲是一样的效果的。
这样即使在不同地方,也可以直接远程登入我们的服务器来进行管理和维护了。
(2) 乱码问题
3.Winscp文件拷贝工具
(1)步骤
【1】新建
【2】保存/登入
(2)连接建立后,直接拖拽文件就可以实现拷贝了,很方便的实现了,win和linux之间的文件传输
五、注意事项
1.Linux严格区分大小写
2. Linux中所有的内容以文件形式保存,包括硬件
3.Linux不靠扩展名区分文件类型(靠的是文件权限)
linux中是不利用扩展名来区分文件类型(linux中的扩展名是为了给管理员来使用的,便于管理员管理)
4.Linux所有的存储设备都必须挂载之后用户才可以使用,包括硬盘、u盘和光盘
5.win下的程序不能直接在Linux中安装和运行
六、服务器管理和维护建议
1.Linux中各目录的作用
(1)前四个目录中存放的是命令相关的(带bin的)
【1】如果有s的话,就是只有root可以执行
【2】单用户模式可以理解为win的安全模式,启动最少的服务,主要是用来做修复用的;
(2)/boot/ 下最好不要去创建和存放文件,以免用完了空间后,导致系统无法正常启动;
(3)/dev/ 和硬件相关的文件都保存在这个目录下
(4)/etc/ 最好备份下
2.服务器注意事项
(1)远程服务器不允许关机,只能重启
(2)重启时应该关闭服务
(3)不要在服务器访问高峰运行高负载命令
(4)远程配置***时不要把自己踢出服务器
(5)指定合理的密码规范并定期更新
(6)合理分配权限(用户的权限够用就好,开启的服务越少越好)
(7)定期备份重要数据和日志(人生苦短,及时备份,不要把鸡蛋放在同一个篮子里)
七、Linux常用命令
1.概述
2.文件处理命令
2.1 概述
2.2 命令格式与目录处理命令ls(-l、-lh、-ld、-a、-i)
(1) [ ]:表示是可选的;
(2) ls -a 或者 ls --all 可以看到隐藏文件(.开头的);
隐藏文件:是操作系统为了告诉用户这是一个系统文件,如果你不是确定要操作它,就不要乱动它;
(3)
ls -l 显示具体信息 第一个部分是权限;
第二个部分是一个引用系数,只在本文件中起作用;
第三个部分是:文件的所有者(唯一,且是可以改变的)
第四个部分是:文件的所属组
第五个部分是:文件大小(利用ls -lh,可以将一些统计的数据更人性化的显示,让人好阅读)
第六个部分是:文件最后一次修改时间,如果没被修改过就是它的创建时间
第七个部分:文件名
(4)ls -ld /etc : d就是目录的意思,直接查看目录的详细信息,而不是目录下的文件;
(5) ls -i (i就是inode,i结点,类似于身份证ID,是唯一的标识符)
2.3 mkdir --- 创建目录
【1】如果这个目录不存在,你又想在这个不存在的目录下创建一个子目录,不加参数的mkdir是会失败的,但是可以加上参数-p,进行递归创建
【2】可以同时创建多个目录
2.4 cd --- 切换目录
2.5 pwd --- 显示当前目录
2.6 rmdir --- 删除空目录
2.7 cp --- 复制文件或目录
【1】复制目录必须加 -r
【2】如果不想改变文件的属性,比如我想备份一个文件,但是不想修改它的最后修改时间,就可以使用-p
【3】可以在拷贝过去的时候修改文件名
2.8 mv --- 剪切文件、改名
也可以在剪切的同时改名,如果我们下同一个目录下进行剪切改名,就相当于改名操作;
2.9 rm --- 删除文件或目录
【1】如果不希望有询问的过程,可以加一个-f
【2】要删除目录的话,最好-rf,因为一个目录下如果有很多的子目录和文件的话,都会一个个都要你确认的。
【3】rm -rf * : 删除这个目录下的所有文件,注意不要随意使用,如果是在根目录下,那就要自我毁灭了;
2.10 touch --- 创建空文件
前面说过了创建一个目录是mkdir命令,这里创建一个文件就是touch命令;
另外文件的命名上,之前说过了linux是不以后缀名或者说扩展名来区分文件类型的,而是通过权限。这里的.list对linux系统而言只是文件名称的一部分,但是我们程序员看到这样一个约定俗称的命名方式,就知道这是一个清单或者说这是一个列表文件。在linux里面扩展名只是为了方便管理员的管理;
在linux里面,除了根分区的符号/之外,所有特殊符号都是可以用来作为文件名称的,但是还是建议遵守一个命名规范,可读写和可查找性会更好,也方便我们分类管理。另外,如果想用带空格的文件名,那么就需要用双引号把这一部分括起来,告诉系统这是一个整体,否则的话,就会创建多个文件,如上所示。不建议使用空格来作为文件名的一部分,因为这样,给我们后面的操作带来了不便,你在对这个文件进行操作的时候,都需要添加双引号。
2.11 cat --- 显示文件内容
cat不太适合用于查看比较长的文件,它只会显示最后一页的内容,可以看到这里是从83行开始显示的。这个时候就可以使用more命令来查看文件内容
2.12 tac --- 显示文件内容(反向列示)
cat 倒过来写就是tac,所以这个命令就是倒着显示文件内容
2.13 more --- 分页显示文件内容
当一个文件很长的时候,使用cat或者tac都显示不完全,这个时候可以使用more,它可以分页的显示文件内容
在进入more命令格式后,我们可以使用空格或者f或者回车进行翻页,区别在于翻页的多少:
(1)使用空格进行翻页:

-------》
(2)使用f进行翻页:

----------》
(3)使用enter进行翻页:
是一行行的翻;
另外,输入q可以退出,当你找到了你想要的内容就可以按q退出了,大小写均可;
2.14 less --- 分页显示文件内容(可向上翻页)和提供关键字查找
less比more更加适用,用more的时候当我们错过了想要查找的内容的时候,无法往回翻。但是less可以向上翻页,按上箭头就是一行行的往上翻,如果按pageup就是一页页的往回翻。
另外,还支持关键字搜索,输入/,然后敲入我们想要搜索的关键字,按n就是跳转到下一个包含这个关键字的位置。
2.15 head --- 显示文件的前面几行
前面的more和less都是全文显示,但是如果这个文件又很长,而我只想要显示这个文件的前面几行,就可以使用head来指定显示的行数;
如果不指定显示多少行,那就默认显示前10行;
2.16 tail --- 显示文件的后行
同样的,如果不指定显示多少行,那就默认显示末尾的10行;
特别地,tail有一个特殊的参数-f,可以动态的显示文件末尾的内容,意思就是可以实时的查找这个文件末尾的变化,可以在监控一个日志的时候使用;
note:tail -f 、 tail -F 、 tailf的区别
【1】
tail -f 等同于--follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止 【2】tail -F 等同于--follow=name --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪
【3】tailf 等同于tail -f -n 10(貌似tail -f或-F默认也是打印最后10行,然后追踪文件),与tail -f不同的是,如果文件不增长,它不会去访问磁盘文件,所以tailf特别适合那些便携机上跟踪日志文件,因为它减少了磁盘访问,可以省电
2.17 ln --- 创建软连接
软链接特征:类似win的快捷方式,可以方便快捷的让我们找到某些文件或者软件。点击快捷方式的时候,并不是直接打开了这个软件,它并不是一个启动程序,它只是一个链接指向,指向了真正的启动方式存放的位置;
在linux里面的软链接的作用和win中快捷方式的作用是类似的,它仅仅是一个符号链接,所以它的大小也很小。在文件类型上是l,表示这是一个软链接,文件的执行权限是三个rwx,这代表着所有的人都可读可写可执行这个文件,请注意,这个权限只是这个软链接的权限,在linux里面所有的软链接的权限都是三个rwx,但是这并不代表着它指向文件的权限,这个权限只是它自身的。
和软链接不同,如果不加参数-s,就是创建一个硬链接,它的作用类似于拷贝,但是和cp命令不同的是,它可以同步更新这个文件的改变。效果等同于:cp -p + 同步更新;
当我们删除掉原本的文件/etc/issue之后,软链接就失效了:
但是硬链接还是可以继续访问的,即使源文件丢失了,硬链接还是存在的。
另外很重要的一点就是,观察本文件和源文件的硬链接和软链接的i结点会发现:
源文件和源文件的硬链接是一个i结点的,但是软链接不是。我们的内核是通过i结点来识别文件的,i结点是唯一的,一个文件只能有一个i结点,但是一个i结点不一定只对应一个文件,比如这里的源文件和它的硬链接,这也解释了,为什么可以同步更新,因为它们两个是同一个i结点的指向文件。并且,在源文件丢失后,i结点就少了一个文件指向,i结点本身并没有丢失,还是指向这剩下的那个文件,就是原文件的硬链接,这也是为什么,在源文件丢失后,软链接就失效了,但是硬链接还是可以显示原来的内容。
3.权限管理命令
3.1 chmod - 改变文件或目录权限
+ : 增加权限;示例:u + x;
-:降低权限;示例:g - r;
=:赋予权限;
在实际的应用中,更多的采用的是数字的方式:
由上可以看出来,修改起来非常方便,640 ---》 rw-r-----;
另外,还有个递归修改权限需要掌握,就是加上参数-R
如图所见,如果不加上递归修改参数-R的话,修改目录linux的权限为777,但是它的子目录权限并不会被修改; 如果有需要修改目录下所有的文件包括子目录的权限都和这个目录的权限保持一致的话,就可以使用递归修改了:
关于文件权限的理解
思考:一个普通用户是否可以删除掉root用户创建的文件:
如上所示,我先切换到了root用户,并创建了一个temp的目录,在这个目录下创建了一个文件,并且修改了temp的权限为777,然后又切换回了普通用户,下面尝试进行删除文件操作,结果如下:
答案是可以的,普通用户成功的删掉了root用户创建的文件;
对文件和目录的权限是有着不同的含义的:
对文件:
【1】r ---》 代表着我们可以对这个file执行cat/more/less/head/tail
【2】w ---》 代表着我们可以vim这个file
【3】x ---》 代表着我们可以执行这个文件,script和command都是可执行文件
对目录:
【1】r ---》 代表着我们可以对这个目录ls
【2】w ---》 代表着我们可以touch/mkdir/rmdir/rm
【3】x ---》 cd
这也就是为什么普通用户也可以删除掉我们root用户创建的文件了,因为这个目录temp的权限被修改为了777,我作为普通用户也是有写权限的,这意味着我可以对这个目录下的文件进行删除或者创建,也可以创建或者删除子目录,甚至删掉这个目录;这个文件的权限是rw-r--r--,普通用户只有读权限,但是对这个文件有写权限只意味着我可以修改这个文件的内容,并不意味着我可以删除它,所以作为普通用户只是不能修改文件的内容,但是可以删除掉它,所以能够删除一个文件并不是你对这个文件有写权限,而是你对这个文件所在的目录有写权限;
不要混淆了目录和文件的rwx的意义。
3.2 chown --- 改变文件或目录的所有者
回顾,之间学习chmod的时候,改变文件的权限是文件的所有者和root才能使用的命令;
那么,谁可以改变这个文件的所有者:只有root可以执行这个操作
3.3 chgrp --- 改变文件或目录的所属组
3.4 umask --- 显示和设置文件的缺省权限
(1)文件的所有者和所有组的缺省设置
【1】文件的所有者就是文件的创建者;
【2】文件的所属组就是这个文件的创建者的缺省组
(2)一个文件创建后就会有权限的缺省设置,这个缺省设置怎么查看以及怎么设置呢?使用umask命令来实现:
注意:当我们使用mkdir的时候,也就是创建一个目录的时候的权限缺省值是可以通过umask -S来查看的,如上所示。但是,如果我们新建的是一个文件,也就是用touch 来创建的,它的权限和缺省值之间的不同就在于:
相比于umask -S显示的缺省值,创建的是一个文件的时候的缺省权限的ugo都比它少了一个x,在linux里面规定缺省创建的文件是不可以具有可执行权限的,所以要对umask设置的缺省值做一个去掉可执行权限的处理;这样做的原因,因为木马病毒都是可执行文件,所以出于安全考虑,在linux里面缺省创建的文件都是不具有可执行权限的。
(3)直接敲入umask,会显示一组数字:
是通过这样一个逻辑与的关系来得出,002所创建的目录的缺省权限是775,创建文件的缺省权限是664
(4)我们也是可以修改缺省权限
假设我们要设置的新的目录缺省权限是700,那么就反过来进行推算:
777 rwx rwx rwx
要求的:077 --- rwx rwx
---------------------
700 rwx --- ---
这样的话,我们就可以通过umask 077来修改缺省权限为700了;
4.文件搜索命令
4.1 find
(1)不推荐使用搜索命令。不管是在win系统还是linux系统中,重要的不是我们可以通过搜索来找到这个文件,而是要尽可能的少用搜索,这要求我们在整个服务器的规划里面能把所有的文件规划好,不要乱放,因为搜索需要占用大量的系统资源,特别是在服务器高峰期的时候进行这样操作是很业余且危险的。
(2)win下可以使用Everything这个小工具来进行快速的文件搜索,但是它支持win,并且只支持ndfs分区,但是建立索引后,搜索的速度非常快;
(3)使用find命令有一个原则:搜索范围尽可能小,匹配条件尽可能精准,这样找到的文件的速度越快,消耗的资源越小;
(3)find格式:
(4)参数:
【1】find [范围] -name [条件]
示例1:精准搜索(只有文件名完全符合的时候才会被搜索出来)
示例2:模糊搜索(使用通配符*和?)
只要文件名包含init就会被搜索出来:
查找所有以init开头文件:
查找所有以init开头的后面有三个字母的文件:
【2】find 范围 -iname 条件: 不区分大小写(由于linux下是严格区分大小写的,所以如果希望在搜索的时候不区分大小写就可以使用iname)
【3】find 范围 -size [+n(大于n)/-n(小于n)/n(等于n)] 条件(根据文件大小进行搜索)
首先要注意,这个n的大小是数据块的大小,在linux里面1数据块 = 512byte = 0.5k(在linux系统里面存储文件的最小单位是数据块)。所以要进行一下换算,假设我们要查找一个100M的文件,100MB = 102400 KB = 204800数据块(1k = 2数据块,所以乘2即可);
另外,如果想要将文件的大小限制在一个区间内的话,就要使用连接符(-a , -o)来实现了:
【4】-exec/-ok 命令 {} \;
上面这个例子:是在/etc目录下,查找以init开头的文件,并对这些文件执行ls -l操作(-exec:是英文单词execute,是执行的意思,后面的{} \;是固定语法,{}表示将查找的结果组合起来,\是转义符,;是结束符)
-exec和-ok的区别在于:-ok多了个询问确认的环节,它会一个个的询问你要不要这样做;
【5】find 范围 -user 条件:根据所有者来查找
【6】find 范围 -cmin/-amin/-mmin 条件:根据文件属性/访问时间/文件内容进行查找
【7】find 范围 -type 条件:根据文件类型查找,一般用于联合条件的查找,例如:find /etc -name init* -a type f(就是在etc目录下查找文件名以init开头的文件)
find /etc -name init* -a type d(就是在etc目录下查找文件名以init开头的目录)
【8】-inum :根据i结点查找
使用场景:比如我们创建了一个文件名为:i love rosie:touch "i love rosie", 这个时候我们想要删除这个文件,rm i love rosie,是会失败的,因为空格是分割符,系统认为我们要删除三个文件,分别叫i 、love 、 rosie。所以起名的时候不要使用空格间隔,如果真的有这些奇怪的文件名,要删除的时候也需要用双引号括起来,表示这是一个整体。但是,如果这个奇怪的文件是别人创建的,而我们想要进行删除却怎么也删除不掉的时候,那么万变不离其宗,每一个文件都有唯一的i结点,我们使用ls -i来查阅这个文件的i结点,然后对他进行查找和联合操作:
.表示在当前这个目录下进行查找,查找i结点为31531的文件,并进行删除操作;
另外的一个使用场景:就是查找一个文件的硬链接,因为硬链接的i结点和这个文件是相同的,所以我们就可以通过find -inum来找到这个文件是否有硬链接了;
4.2 locate
(1)语法:
(2)注意事项:
【1】和find命令不一样的地方在于,它和Everthing这个软件一样,建立了一个文件资料库,这个文件资料库会定期更新,在查找的时候并不是在硬盘上去找,而是在资料库中去查找你所要搜索的这个文件,所以查找速度很快。
【2】之所以速度这么快,是因为在系统里面有一个它维护的文件库,输入命令:locate locate
上面高亮的这个文件就是它所维护的文件库,系统里所有的文件都会定期更新收录到这个文件库中。
【3】这样带来的问题就是,如果这个文件还没有被收录到文件库中,我们使用locate是定位不到这个文件的,例如:
【4】更新文件库:updatedb
【5】如果文件收录在/tmp文件下的话,locate文件库是不会包含的,即使我们updatedb,也是找不到这个文件夹下的文件的;
(3)参数
【1】不区分大小写:-i
4.3 which
(1)命令描述
(2)注意事项
【1】这个命令是更加精确的查找命令;首先,我们知道普通用户可以使用的命令是存放在/usr/bin , 而只有root才可以使用的命令是放在/usr/sbin下面的。那么我怎么知道这个命令是存放在哪个目录下面的呢?当然可以使用find来进行查找,但是这样的速度太慢了,我们可以使用专门的命令which来实现:
【2】这里使用的是ubuntu的系统,所以打which没有显示别名,但是在centos下,打which 会显示这个命令的别名:
关于别名,在linux里面,我们可以给命令起一个别名,简便我们的操作,直接输入alias,会显示所有有别名的命令;
如果想要给一个命令其别名可以:
比如,这里我们想要给rm -i 起一个别名rm,使得我们的每次删除操作都多一个询问环节:
如果想要取消这个命令的别名,就输入unalias 命令即可;
4.4 whereis
(1)描述
(2)注意事项
除了显示命令所在路径之外,还会显示帮助文档路径:
在linux里面,帮助文档路径一般存放在man路径下,man是manual的意义,是手册的意思;
4.5 grep
(1)描述
(2)注意事项
【1】前面的几个命令,find、locate、which、whereis都是在查找文件的名称,而grep是在文件中查找匹配的内容;
【2】如上图所示,如果想要不区分大小写的搜索的话,就要加上参数-i。
【3】如果要排除指定字符串的话,就使用参数-v:
5.帮助命令
5.1 man
(1)描述
(2)注意事项
【1】man的阅读方式类似于more和less的结合,空格和f翻页,回车换行,按q退出,按/进行关键字搜索
【2】使用man来获取一个命令的帮助信息的时候,怎么快速的查阅呢?首先,第一行,也就是NAME会解释它的作用,而SYNOPSIS会显示它的语法格式;DESCRIPTION会显示它的参数及其含义。我们了解一个命令,首先就是通过阅读它的第一行来知道它的作用,阅读第二行来了解它的用法,通过/来进行关键字搜索,可以快速找到想要了解的参数及其含义;例如,使用date可以获取当前的系统时间,如果这个时间是错误的我们就要进行修改,那怎么进行修改呢?我们可以使用man date来查看下格式:
【3】使用man services
这里要注意,man后面不要接文件的路径,而是直接接文件的名称,否则显示的不是这个文件的帮助信息。
通过阅读这个配置文件的帮助信息,我们知道这个配置文件是一个互联网网络服务的列表文件,在这个文件里存放了所有的网络的服务相关的基本信息。

虽然看起来很乱,但是还是有迹可循的,这一行表示了这个配置文件的格式信息, service-name port/protocol [aliases ...]
服务的名称 + 端口号/协议 【别名】
这个时候,我们打开这个配置文件,less /etc/service
由于通过配置文件的帮助信息知道这个配置文件的格式和作用,那如上面的这个用来远程连接的协议ssh,我们就能轻松的解读了;
服务名:ssh
端口号:22
协议:tcp
再来举个例子,在/etc下存放了一个passwd的配置文件,我们同样可以通过man passwd来了解这个配置文件的作用和格式是什么样子的。
但是,往下看的时候,发现一个配置文件竟然有选项,这是怎么回事呢?
使用whereis 来查看这个文件,会显示文件帮助文档路径。我们发现,passwd既是一个命令又是一个配置文件,所以它才会有选项信息。而后面的都是帮助文档,在linux里面,帮助文档是要分类的,1:命令的帮助,5:配置文件的帮助;所以它会首先显示命令的帮助,那么我们想要查看配置文件的帮助怎么办呢?man 5 passwd:
5.2 whatis
如果我们只想简单的看看这个命令是干什么用的,那就使用whatis
5.3 apropos
如果我们只想简单的看看这个配置文件是干什么用的,那就使用apropos,记住后面直接加文件名即可,不要加绝对路径
5.4 help
(1)描述
(2)注意事项:
【1】如果我们只是想查看这个命令的选项信息的话,我们可以使用 [命令] --help来实现:
【2】什么叫内置命令?
Shell就是一个命令解释器,它将我们敲入的命令返回给内核,再将内核返回的结果显示给你看。像这样的命令解释器,linux里面有好几个,shell里面有一些内置的命令,怎么去判断这个命令是一个内置的命令呢?---那些找不到路径的,例如cd
这些内置命令是无法使用man来获取帮助信息的:
我们可以使用help来获取这些shell内置命令的帮助:
5.5 info
使用上和man大同小异,可根据个人习惯来进行选择;
6.用户管理命令
6.1 adduser / useradd
(1)描述
(2)useradd 和 adduser的区别
useradd 这个命令添加的用户不能远程登录,在本机登录时的登录界面也不会把所添加的用户列出来。 所以,用adduser这个命令更好一点
adduser实际上不是一个命令,它是一个基于useradd的perl脚本。
6.2 passwd
(1) 描述
(2)注意事项
【1】root用户可以更改所有的用户的密码,并且可以设置简单密码,系统会提示但是不会阻止这次修改。普通用户只能修改自己的密码,并且不可以太简单,系统会阻止这次修改;
【2】使用useradd创建的用户是没有密码的,是无法登入我们的系统的,因此我们要使用passed来给它设置一个密码;but,这样的用户是没有被加入到sudoers组的,所以它无法使用sudo su来切换到root用户,或者其他用户,只用通过su root切换到root用户。而我忘记了我的root用户的密码=-=;
6.3 who
(1)描述
(2)注意事项
第一个是用户的名称,一个用户可以多次登入,所以这里有三次登入的信息
第二个字段是登入的终端,tty:虚拟控制台(1~6:表示文字登入终端,7:图形界面终端);pts/n:是远程终端,这个n在理论上没有限制,这是远程登入的用户,就是使用securCRT、putty等***H协议的远程登录工具的用户。pts/0在本机上。另外,在xwindow下,打开的那个终端也是pts/n的。
第三个字段是登入的时间
第四个字段是登入的IP地址,如果没有就是本地终端;
(3)w
这个可以获取更加详细的登入信息,第一个是系统的时间,第二个up是连续运行的时间(uptime),第三个是登入用户的个数,第四个是负载的指数,分别记录了过去的1分钟、5分钟、15分钟负载的情况(这个值可以帮助我们判断服务器的负载情况怎么样)。
其他的,比如IDLE表示这个用户登入过来已经空闲多久了,PCPU是当前这个用户执行的这个操作占用CPU的时间,WHAT就是它当前执行了什么操作,JCPU是累积占用CPU的时间;(这些信息可以帮助我们判断这个用户是不是要被提出这个系统)
7.压缩解压命令
7.1 gzip和gunzip
(1)gzip
(2)gunzip / gzip -d
或者使用gzip -d 都是可以实现解压缩.gz文件的;
(3)注意事项
【1】gzip只能压缩文件,不可以压缩目录
【2】而且不保留源文件
7.2 tar
(1)
【1】先打包再压缩
首先,使用tar -cvf 【打包后的文件名】 【要打包的文件】来进行打包,加了-v就会显示详细信息;
打包完成以后,就可以使用gzip来压缩了:如下:
【2】打包并压缩
使用tar -zcf或 tar -zcvf(显示详细信息)
(2)如果我们想要进行备份,就可以使用tar命令来实现打包压缩
如在linux里面,/etc目录下几乎存放着系统所有的配置文件,我们可以使用tar对其进行打包存放在当前目录下,以备份;
(3)解包:tar -zxvf
只是将-c替换成了-x,其他都是一样的操作;
7.3 zip和unzip
(1)描述
(2)注意事项
【1】.zip是win和linux都支持的格式,在我们不想安装第三方软件的时候,可以使用这种格式的压缩包来在win和linux下进行传输;
【2】和上面的gzip不同的是,它可以保留源文件,并且可以压缩目录加上参数-r
【3】还会人性化的提示你,压缩比是多少
(3)解压缩:unzip
7.4 bzip2和bunzip2
(1)描述
(2)注意事项
【1】这是gzip的升级版,主要是提高了压缩比。
【2】相比于gzip而言,它是可以保留源文件的,只要加上选项-k即可
【3】同样可以和tar一起使用
先打包再压缩
压缩并打包:将-zcf改成-jcf即可
(3)解压缩:bunzip2或者tar -xjf
8.网络命令
8.1 write
(1)描述
(2)注意事项
【1】回退的时候使用ctrl + 回退键或者del来删除写错的信息;
【2】按ctrl + d保存结束
【3】给当前服务器的在线用户发送信息,必须得是在线用户
holahamster 发信息
rosie接收并回复信息:
8.2 wall
(1)描述
(2)注意事项
【1】和write不同的是,这是广播信息,给所有在线用户发送信息
【2】自己也会收到这条广播信息
holahamster:
rosie:
lisa:
8.3 ping
(1)描述
(2)注意事项
【1】和win不同的是,它不会ping四次就停止了,而是一直在ping,直到我们按下ctrl + z
【2】如果想要和win一样ping几次后就停止ping的话,加上参数-c + ping的次数即可:
【3】ping的时候重点关注的信息是:一个是time表示返回时间,time越小表示网络越好;
第二个是packet loss,表示丢包率,丢包率如果非常高,表示我们的网络状态不稳定,需要调整
8.4 ifconfig
(1)描述
(2)注意事项
【1】直接输入ifconfig会得到当前的网络信息:
【2】一般计算机都会有两块网卡,一个ens代表本地真实网卡,一个lo代表一个回环网卡,用来本计通信和测试的,ip地址是固定的:127.0.0.1
【3】信息解读:
首先是网络类型:一般来说都是以太网
然后是HWaddr,是我们计算机的物理地址,也叫mac地址,是一个用16进制表示的,48位的地址;
然后是inet addr,是我们当前计算机的IP地址
【4】ifconfig是可以暂时修改我们的ip地址的,使用ifconfig 网卡的名称 新的IP地址即可,但是要注意的是,如果是采用远程登入的方式管理我们的服务器,ip地址的修改会导致我们连接的断开,这个要进行这个操作之前请确保配置都以保存备份。
8.5 mail
(1)描述
(2)注意事项
【1】Cc是抄送的意思,carbon copy,意思是发送给出了收件人以外的其他人。
【2】主题输入完之后,就可以回车输入正文了,当结束输入的时候就输入ctrl + d来保存发送
rosie:
lisa:
【3】当我们收到新邮件的时候,直接输入mail就可以来查看了:
这里表示我们当前计算机,有两封邮件,N表示new,是未读的标志 , 后面是发信的时间,以及信件的标题:test,这两封邮件都保存在我们的邮箱地址/var/mail/lisa下面;
N后面的数字代表邮件的序列号,想要查看第几封信,直接输入邮件的序列号即可,比如:
如果想回来刚才那个收件列表界面,就输入h:
【4】在这样个交互界面,我们可以进行的操作可以使用help命令来查看
1》删除一个邮件:d 邮件序号
2》退出mail界面,按q
【5】系统有时候会给我们的root用户发送一些邮件,这些信息一般来说都是非常重要的,比如日志、系统报错,当我们发现这些邮件的时候,不要忽略,要去查看一下,因为这说明我们的系统中有可能出现了一些问题;
8.6 last
(1)描述
(2)注意事项
【1】这是一条非常有效的命令,可以帮助我们鉴别我们的服务器是否出现了侵入问题,它会列出,谁登入过,来源终端,IP地址,登入时间,退出时间,持续时间都会显示

、
【2】如果,我们只想知道用户最后登入的信息,那就使用lastlog:

、
和last不同的是,它会先把所有的用户都列出来,包括我们的伪用户,并显示它们最后一次的登入信息
【3】如果,我们不想查看所有的用户的最后一次登入的时间,而是想指定用户,那就加上-u 用户名
8.7 traceroute
(1)描述
(2)注意事项
【1】traceroute的原理
traceroute是用来检测发出数据包的主机到目标主机之间所经过的网关数量的工具。traceroute的原理是试图以最小的TTL(存活时间)发出探测包来跟踪数据包到达目标主机所经过的网关,然后监听一个来自网关ICMP的应答。发送数据包的大小默认为38个字节。 原理:程序利用增加存活时间(TTL)来实现其功能。每当数据包(3个数据包包括源地址,目的地址和包发出的时间标签)经过一个路由器,其存活时间就会减1。当其存活时间是0时,主机便取消数据包,并传送一个ICMP(Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。) TTL数据包给原数据包的发出者。
traceroute程序完整过程:首先它发送一份TTL字段为1的IP数据包给目的主机,处理这个数据包的第一个路由器将TTL值减1,然后丢弃该数据报,并给源主机发送一个ICMP报文(“超时”信息,这个报文包含了路由器的IP地址,这样就得到了第一个路由器的地址),然后traceroute发送一个TTL为2的数据报来得到第二个路由器的IP地址,继续这个过程,直至这个数据报到达目的主机。
【2】参数
-d 使用Socket层级的排错功能。
-f 设置第一个检测数据包的存活数值TTL的大小。
-F 设置勿离断位。
-g 设置来源路由网关,最多可设置8个。
-i 使用指定的网络界面送出数据包。
-I 使用ICMP回应取代UDP资料信息。
-m 设置检测数据包的最大存活数值TTL的大小。
-n 直接使用IP地址而非主机名称。
-p 设置UDP传输协议的通信端口。
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。
-s 设置本地主机送出数据包的IP地址。
-t 设置检测数据包的TOS数值。
-v 详细显示指令的执行过程。
-w 设置等待远端主机回报的时间。
-x 开启或关闭数据包的正确性检验。
【4】特殊情况:
有时我们traceroute 一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是***封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会 有延时长的现象;您可以加-n 参数来避免DNS解析,以IP格式输出数据。
如果在局域网中的不同网段之间,我们可以通过traceroute 来排查问题所在,是主机的问题还是网关的问题。如果我们通过远程来访问某台服务器遇到问题时,我们用到traceroute 追踪数据包所经过的网关,提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,就是我们发现问题所在,IDC服务商也不可能帮助我们解决。
【5】如何确定目的主机
目的主机接受在接收到TTL值为1的IP数据包是不会丢失的吧,这样也不会产生一个超时的ICMP数据报文了,那么程序如何判断是否已经到达目的主机了呢?在Linux下,traceroute程序发送一个UDP数据报给目的主机,但是它选择一个不可能的值作为UDP端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口,因此该数据报到达目的主机时,目的主机会产生一个“端口不可达”错误的ICMP报文,这样traceroute程序要做的就是区分接收到的ICMP报文是超时还是端口不可达,从而来区分是路由器还是目的主机