飞道的博客

【进大厂必学】3W字180张图学习Linux基础总结

298人阅读  评论(0)

大家好,我是蓝蓝。

就不多说这段时间干啥去了吧,期间和很多的同学聊了天,有的童鞋已经开始工作,聊了聊工作上的事儿。有的是今年即将毕业的童鞋,有着自己的小目标,有的想尝试互联网,所以现在基本上都快进行二轮的复习了,有的同学备战公务员,凭着年轻这股劲儿向往自己理想的生活状态,无论怎么样,长路漫漫,走一步,算一步,每一步都算数。

今天分享的这篇文章是 Linux 相关的基础知识,深一点的内容基本上没有,不过对于刚需小伙伴来说,也就够了,有时间的话,最好按照这些命令去试一试,敲一敲,这样记忆更加深刻。

老规矩,先看目录,目录原图比较大,微信公众号后台没法放,本文文章比较长,代码部分全部采用贴图的方式,这样看着更加整洁,相关函数或命令的使用方法,如果涉及到多个参数,我则采用的思维导图的方式,更加直观,所以导致本文图片100张,建议大家收藏后慢慢看。

为什么使用 Linux 或者 为什么要去学习 Linux

在看这篇之前,大家需要知道为什么去学习它,对于我而言,是一次偶然的比赛中接触到 Linux,从而开启 Linux 的学习。

知道了很多线上的服务,很多的服务器都是 Linux 系统,那么对于迟早都要入职的我们,提早的学习 Linux 的基本使用将尤为的必要。

总结一下,学习 Linux 最重要的几点:

  • 对于使用 C/C++ 开发者,可以方便直接在 Linux 中编译运行程序
  • Linux 作为开源项目,其精妙的数据结构设计值得深入学习
  • 我们将要面对的各种笔试,面试需要它

在我的面试过程中,大厂互联网的面试会考察 Linux 操作系统中概念的基本底层原理,而对于国企,事业单位,银行等企业就会直接问 Linux 的基本使用了。

好了,正式开始学习。

一 Linux简介及安装

不同学校开设的课程不一样,我们学校计算机专业在大三的时候开设 Linux 这门课程,不过学习的内容偏向理论,至于相关命令和功能的实现具体原理并不清楚。

直到几年后,发现大部分的系统,诸如团购,打车等系统都部署在 Linux 中,另外相关云计算,大数据,容器相关技术也都是基于Linux

为什么说了解Linux 的生态,会让你学到更多的新技术?

我们要知道很多的大牛通过Linux来开发各种如那件,数据库 MysqlkafkaSpark 等技术都会默认提供 Linux 的安装运维手册,所以尽快的进入 Linux 的世界对于个人的进步和职业发展都是非常有好处的

每当我们买了手机,买了电脑,上手就可以用,这是因为预装了操作系统。所以呀,哪有什么岁月静好,其实有人帮我们负重前行了,操作系统就是这样一个角色。

那么操作系统帮助我们做了哪些事儿呢?

  • 我们只需要点击桌面上的图标,应用程序就开启
  • 电脑咋个知道我们鼠标点击的那个位置
  • 为什么我一回车,这些字符就飞出去了

这几个任何一个操作,基本上都覆盖了操作系统的所有功能,现在就进入熟悉而陌生的操作系统世界。

1 vmvare

虚拟机是什么?

虚拟机通过软件的方式来模拟完整的硬件系统,运行在完全隔离的计算机系统。每个虚拟计算机可以独立运行并安装各种软件和应用。

学习 Linux 最简单、最实用的环境即虚拟机环境,通常即本文中的 VMvare

使用虚拟机模拟出来的 Linux 学习环境简单且容易上手,能够较为真实的模拟出真正的Linux

当然你也可以将自己的笔记本装成 Linux 的环境,但是这样加大了学习的难度,如果需要 进行 Linux 集群的学习,那就更不方便了。

使用虚拟机系统环境,我们可以对虚拟系统随意进行任何的设置和更改,甚至可以格式化虚拟机系统硬盘,进行重新分区等操作,而且完全不用担心会丢掉有用的数据,因为虚拟机是系统上运行的一个虚拟软件,对虚拟机系统的任何操作都相当于是在操作虚拟机的虚拟机设备和系统,不会影响电脑上的真实数据。

说了这么多,现在开始安装 VMvare。

  • 首先从官方下载并解压虚拟机安装包,然后双击运行

  • 点击下一步

  • 选择安装位置,最好不要出现中文哈,不然后续可能出现莫名奇妙的问题。

  • 设置用户体验选项,都可以选择

  • 在桌面和开始菜单程序文件夹创建快捷方式。

  • 百度一个许可证ZG1WH-ATY96-H80QP-X7PEX-Y30V4,注意选择的版本号。

  • 打开 Vmvare。

  • 点击新建虚拟机向导-选择文件-新建虚拟机-打开。

  • 选择自定义,然后下一步。

  • 下一步。

  • 安装客户机操作系统,选择稍后安装操作系统。

  • 命名虚拟机-更改虚拟机名称并选择安装的位置。

  • 更改主机配置进行处理的分配。

  • 虚拟内存分配:注意内存分配不能大于主机内存。

  • 设置虚拟机网络得类型,这里选择 NAT(下文会介绍三种网络配置方式的区别)

  • IO控制器选择,选择LSILogic。
  • 磁盘类型选择SCSI即可。

  • 创建磁盘选择创建新虚拟磁盘

  • 指定磁盘文件

  • 修改路径

  • 选择自定义硬件

  • 选择centos得ISO镜像文件,先选择CDDVN—ISO镜像文件—浏览找到镜像、

  • 点击完成

  • 开启虚拟机 选择配置好的虚拟机。

  • 鼠标移动到虚拟机内部,上下键选择install centos7然后回车。

  • 选择软件选择最小安装,选择语言。

  • 软件安装。

  • 选择计算节点。

  • 开始安装。

  • 设置root密码,点击完成配置。

2 进行网络配置

现在我们的 Centos 还是个空壳子,如果我们需要访问外网,则需要进一步配置。“秀才不出门,便知天下事”,你是秀才你试试。

没有网络,我们可能停留在看电视,跳皮筋的年代,我还真是会跳皮筋

为了让我们下载软件更加的顺畅,速度更快,最快速度白嫖资源,不得不个配置网络

  • 打开配置文件
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
  • 更改相应的配置
DEVICE=eth0 #设备名称,可根据ifcofnig命令查看到。
BOOTPROTO=dhcp #连接方式,dhcp会自动分配地址,此时不需要在下面设置ip和网关
HWADDR=00:0C:29:AD:66:9F #硬件地址,可根据ifcofnig命令查看到。
ONBOOT=yes #yes表示启动就执行该配置,需要改为yes
  • service restart network 完事 ping www.baidu.com

既然要配置网络,我们先看看网络的配置文件在哪里,以及相关的配置有哪些,分别代表是什么意思

  • 打开网络配置文件

BOOTPROTO = static,表示启用了静态 IP 地址,默认为 none

NAME = eth0,与网卡配置文件对应的一个标签,如果为 eth0 则配置文件是ifcfg-eth0

UUID = xxxx,网卡唯一设备标识,系统自动得生成

DEVICE = XXX,网卡设备名称,是物理设备标识

IPADDR0 = XXX,表示设置IP地址。这里注意后面的数字,在 Centos7 以后可以一个网卡配置多个 IP 地址

PREFIX0 = 24,设置子网掩码,这里设置子网掩码的方法和之前的版本也不一样,24代表是255.255.255.0

Getway = XXX,网关地址,什么是网关线面会详细阐述

知道配置文件每一行代表的含义以后,就可以根据自己的需求进行配置了,记得配置完成以后重启网络,如果是Centos7,那么命令

service network restart
  • 本地回环配置文件 /etc/sysconfig/network-scriptis/ifcfg-lo

第一行 Device:网络的设备名

第二到四行:lo 接口的 IP 地址,子网掩码,网络号

第七行:lo 接口的广播地址

第八行:开机启动 lo接口

第九行:将lo接口设置为本地回环地址

  • DNS 配置文件/etc/resolv.conf

这里的「namespace」 表示域名服务器,后面的 IP地址就是DNS 服务器,当用户在Linux中访问某个域名的时候,就需要靠这些 DNS 服务器来解析

  • 设置主机和 IP 绑定配置文件 /etc/hosts

为什么会说说这个配置文件呢,因为当在部署集群的时候,我们需要在此配置,方便我们不用每次都是输入其他机器得IP进行访问,而是直接使用用户名即可。

类似于 Windows 下得 hosts 文件,我们看看 Linux 中的 /etc/hosts 的内容

从上面我们发现,hosts 文件中的每一行内容为一个主机,每一行由三个部分组成,其中每个部分按空格隔开。

多说一句,以后大家如果需要分析一些日志文件的时候,一定要清楚是按照什么分割的,免得浪费了时间却还没有处理好问题

  • 第一部分:网络 IP 地址

  • 第二部分:主机名域名

  • 第三部分:主机名

路由

我和你的通信需要网络的传输,这个传输过程中可以说经历了九九八十一难,就是这样穿过无数的节点,无数的路由器才将信息传递到你的屏幕。

那么为了保证将信息传递给你,在数据传输到达某一个网络节点后,这个网络节点需要根据**「约定」将数据传送到另一个网络节点,然后再传输到下一个节点,以此类推到达目标主机。这里的每个网络节点就是「路由」,所谓的约定即路由规则**

不使用路由就不行么

举个例子,我给你寄几箱猕猴桃,我的地点在北京,到了快递点,我需要写你的地址,比如是"成都市高新区马保国镇222单元",通常邮寄点不会直接帮你送到指定的地址,而是可能先到成都,然后成都这边揽收再送到马保国镇,这种就是采用分发得策略来提升效率。

这里的寄送系统就是一个大型的网络系统,每个寄存点主要负责快递的传送任务,只要快递到达寄存点,就得准确,迅速将信件投递到下一个寄存点处,这里的快递就是通过「路由机制」准确,快速的寄送到目的地的。

有哪几种路由呢

  • 静态路由

静态路由是系统管理员通过 route 手工加入的静态路由规则

  • 动态路由

动态路由是不同机器彼此经由程序相互交换路由规则而来的。如果网络发生了变化,路由软件会重新计算路由并发出新的路由更新信息

路由如何配置

Linux 中,通过 route 命令配置静态路由信息,

route [-n|ee]

常用的选项

  • 查看当前路由表信息

从上面我们可以知道通过route -n 输出的为纯IP 地址,而route输出的信息就会包含主机名信息,下面说说选项的含义

  • Destination :网络号,即 network 的意思
  • Gateway:连出去的网关地址
  • Flag
    • U:代表路由启动勒
    • H:代表目标路由是一部主机而非网络
    • R:代表使用动态路由的时候,回复路由信息标识
    • G:表示需要通过外部的主机来转递数据
    • M:表示路由已经修改了

网关是什么

不知道大家经历过在宿舍买台交换机,然后几台机器组成局域网打游戏的日子没有。那个时候苦逼呀,只能打局域网的游戏,不能上网

时代在进步,科技在腾飞呐,学校就给每个宿舍分配一一个IP 地址,这个IP 地址是学校的网管部门负责,宿舍网的IP 通常是 192.168.1.x,校园网的 IP 地址假设是 10.10.x.x

如果此时你想在宿舍上网,通常有两个方案

  • 第一种方案:舍友们众筹买一张网卡,然后插入到A同学的电脑上,一张网卡的线插在宿舍的交换机,另一张网卡插在校园网的网口,此时就可以上网,但是A同学电脑就贡献出去了,只能看你们打游戏,他自嗨,多可怜
  • 第二种方案:买个路由器,这个路由器有内网网口和外网网口,外网网口插在校园网的网口上面(当然配置的时候根据网管部门所要求的),内网网口连接上宿舍的所有电脑,这样的话,路由器就得一直都开着

宿舍长可以上网了,其他人的电脑要上网还需要配置下各自的网卡,通常是DHCP 默认配置,在配置的时候你就会发现有个叫做Gateway的东西,这就是网关,要了解网关不得不去了解MAC 头和 IP 的头部

MAC和IP头部有啥?

网卡自出生那天起,就带上了这个地址,那么问题来了,为啥不使用 MAC 地址进行通信呢?因为靠 MAC 地址没法定位准确,它更像身份证,作为唯一标识。举个例子,我住在“成都市高新区 B 座 5 楼”,有个女娃儿可以问路人:“成都市高清区 B座在哪里”,路人可以给他比较明确的地点,但是如果她问:“你知道小蓝(身份证)在哪儿吗”,很明显无从得知,说不定以为"你是个傻子吧"。

你可以找到IP地址(成都市高新区 B5 楼),但是可能还是找不到我,这个时候假设你可能去服务台问(其实是靠吼,身份证为XXX的是哪位),这个时候我听到自然就会答应,不过你如果在北京喊,就听不见了,所以 MAC 地址实际上通信范围是比较小的,局限在一个子网里。它的头部结构如下

图中的类型大部分都是IP 数据包,IP 里面可能包含了 TCPHTTP 等,这都是封装的事儿了。拥有了这个 MAC 地址,就会在链路上广播,MAC 的网卡才发现这个包原来是给它的,网卡将包收进来,打开 IP 包,发现 IP地址是自己的,再打开 TCP 包发现端口是自己,还是 80,正好就是目前监听的端口

上述IP 头部的详细信息就先不说了,这里主要述说源 IP 和目标 IP 地址,当我们要访问一个IP 地址的时候,需要判断这个目标 IP 是否和当前的IP 地址在同一个网段

怎么判断是否在同一个网段

此时涉及到网络的 CIDR 和子网掩码了。我们通常将 IP地址比喻为门牌号码,既然是门牌号码,如果一样了就会冲突。假设大家都将地址设置为三单元 110,那快递小哥就压根找不到地方,所以,我们使用电脑的时候,有时出现上不了网了,很可能是IP冲突了哟。

10.120.55.73,这就是一个IP地址。按照"."分割,其中每个部分占8个 bit ,所以 IP 地址为32位,这样的话IP地址一共就有约 42.9 亿个,很明显在现在看来不够用,但是当初设计者哪知道现在这么多计算机呀,于是出现了IPV6128 位,至于够不够用还得看看国家的生育政策了

不够用就算了,还将这些 IP 地址分为了5

对于 A,B,C 这三类,分为了两部分,前面一部分为网络号,后面一部分为主机号,还是比较好理解。假设大家都是3单元 110,小蓝是东华小区的110,而小李是万科小区的 110

那么这几类,分别代表了多少的主机数量呢

从上图我们发现C类的地址 254个,B类地址 65534,这放在一个网络下面岂不是太浪费,有没有折中的方法呢

CIDR

CIDR 叫做无类型域间选路。将上面32位的地址分为两部分,分别为网络号和主机号。比如地址 10.120.55.73/24,斜杠后面的24表示在 32位中,前面的24为网络号,后面的 8 位为主机号

如何得到网络号

将子网掩码和IP 地址进行 AND 运算就可得到网络号。此时子网掩码为 255.255.255.0255 转换为二进制为 11和任何的数进行 AND 运算都是原来的数值,所以前面三个数不变,为 10.120.55。后面一个数为 00和任何数进行AND运算为 0,所以最后一个数为 0,合计后就是 10.120.55.0,这就是网络号

什么是私有地址和共有地址呢

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cv7Ydab6-1622033442378)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201203194644514.png)]

我们平时自己的电脑或者办公室里,一般都是私有 IP 地址,因为这些IP地址由相关组织的内部管理,自己分配使用,所以我的私有IP 地址可能和你的是一样的

这就好比我所在的小区是 3 栋,你的小区也是3栋。但是除了小区,就需要使用共有IP地址了。就像建设路 1000 号,这是相关部门划分的,不能两个小区都叫做建设路1000

怎么获取公有 IP 地址呢

这就需要花钱了,毕竟是共有的,比较香且有限制。假设你要做一个网站,全国人民都可以访问,就需要买个IP 地址了

在这五类地址中,还差一个 D 类组播地址。从名字可以看出,这类地址属于一个组的机器都能收到。就仿佛QQ群,发个消息大家都能看到,至于回复不回复另说

好了,回到网关

如果你想和你的室友通信,就和网关没有关系,因为你们在同一个网关,只需要通过 ARP获得MAC 地址,然后将源 MAC 和目的 MAC 放入到MAC头中发出去即可

如果不是在同一个网段,你想和你的异地女友聊天,这个时候会先访问默认网关Gateway,这个过程和发往同一个网段的其他机器又是一样的,将源地址和目的地址放入IP头,通过 ARP获取网关MAC地址,将源 MAC 和网关 MAC 放入 MAC 头部发送出去,网关所在端口接受以后下一步操作就看网关了

网管呢可以当作是路由器,路由器是一个物理设备,假设有 5 个网口,五个网口相当于五条路,分别连接五个局域网,每条路的IP 地址都和局域网的IP地址是同一个网段,每条路都是它握住的那个局域网的网关

简单来说:如果一个包想发到其他的局域网,都会选择一条路 ,然后根据路由算法,选择另一条路加上IP头和MAC投扔出去

到底选择哪一条路?

  • 静态路由

静态路由比较简单,直接在路由器上配置规则,规则为:假设访问A网站,就从 2 号口出去,下一跳为 IP2;如果想访问B网站,则从 3号口出去,下一跳为IP3,随后缓存在路由器中

那么IP 头和 MAC 头,需要修改哪些内容呢

桥接的基本原理

桥接默认使用 VMnet0Bridge 桥当作为一个机器,这个机器有两块网卡分别处于两个局域网中,使用""连接,这样局域网A和B就无缝的连接起来,桥接的时候 VMWare 网卡和物理网卡处于同一个 IP 网段

Vmvare 桥是同样的原理,Vmvare 软件会虚拟一块网卡,当使用桥接的时候,Vmvare 会虚拟一块网卡和真正的物理网卡进行桥接,这样的话,发送到物理网卡的所有数据包就到了 Vmvare 虚拟机

而由 Vmvare 发出的数据包也会通过桥从物理网卡那端发出,所以,如果物理网卡可以上网,那么桥接的虚拟网卡也基本上没问题

联网的方式

桥接的方式是最简单的,主机怎么联网,那么虚拟机就怎么联网,将虚拟及当作局域网中的一台电脑就好了

注意:主机网卡可以访问 internet 的局域网的时候,虚拟机才会通过Bridge 访问 internet

Nat

Nat的基本原理

NAT的全称是 Network address translateNAT 应用在 Internet 网关和路由器上。比如192.168.0.123这个地址需要访问 Internet,数据包会先到路由器或网关,然后网关和路由器会有一个能访问 InternetIP 地址,这样的网关和路由器在收到数据包后,对数据包的 IP 进行更改 (NAT),这样就可以让私有网段的主机能够顺利访问 Internet,这个技术解决了 IP稀缺的问题,同样的私有IP 可以网关 NAT上网

那么对于 Vmvare 是同样的道理,它会在虚拟机和主机之间伪造一块网卡,这个网卡和虚拟机的 IP 出于同一个地址段,网卡和主机的网络接口进行 NAT,意味着虚拟发出的每一块数据包都会经过虚拟网卡,然后 NAT,从主机的接口发送出去

注意:虚拟网卡和虚拟机处于同一个地址段,虚拟机和主机处于不同的地址段,主机相当于虚拟机的网关,所以虚拟机能够ping通主机的 IP,但是主机 Ping不同虚拟机 IP

联网方式

  • 动态 IP 地址

这个方式简单,直接将虚拟机设置成使用 DHCP 方式上网,Linux 开启DHCP 服务即可。注意:在 Vmvare 中,需要在编辑-----虚拟网络设置中,将 DHCP 开启,默认为关闭

  • 静态 IP 设置

如果不想使用DHCP,也可以手动设置: 
  IP 设置与 Vmnet1 同网段,网关设置成Vmnet8 的网关(在“虚拟网络设置”里的Net选项卡里能找到Gateway)通常是 xxx.xxx.xxx.2。 子网掩码设置与VMnet8 相同(设置好IP地址后,子网掩码自动生成)
DNS 设置与主机相同。
 例如:主机IP10.70.54.31,设置虚拟机IP为 10.70.54.22NetmaskGatewayDNS 都与主机相同即可实现 虚拟机 —主机 虚拟机<---->互联网 通信。

提示:使用 NAT 技术,主机能上网,虚拟机就可以访问 Internet,但是主机不能访问虚拟机

host–only的方式

这种方式:只需要主机和虚拟机通信,不让虚拟机访问 Internet。同样是两种方式

  • 动态IP地址

此处和上面一样,开启 DHCP 以后,虚拟机就可以自动的获取 IP 地址和 DNS

  • 静态地址

将IP地址设置为和VM一个网段,网关设置为VMnet1的网关,

也可以手动设置,将虚拟机IP 设置与 VMnet1同网段,网关设置成VMnet1 的网关相同,其余设置与 VMnet1 相同,DNS 设置与主机相同。
例如:VMnet1 IP:172.16.249.1 Gateway :172.16.249.2  
那么虚拟机 IP:172.16.249.100 Gateway: 172.16.249.2
这样、 虚拟机<—>主机 可以通信,但是、 虚拟机<—>互联网 无法通信
提示:Host-only技术只用于主机和虚拟机互访,于访问internet无关。

3 安装xshell

我们已经完成了安装Vmvare 并导入了Centos,那么我们如何去玩儿这个看似很牛皮的玩意?直接上手?不习惯吧,那我们用个远程工具连连

Xshell是一个强大的安全终端模拟软件,Xshell可以在 Windows 界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。除此之外,其还有丰富的外观配色方案以及样式选择。

  • 下载 Xshell(别去下了,贼慢麻烦)
  • 链接测试(因为使用的 SSH,那么确保 Centos22 端口已经打开了)
  • 文件-----属性进行Xshell相关的配置,比如配色,字体大小等

这里介绍的即Xshell了,是一个强大的安全终端模拟如那件。支持 SSH1,SSH2 等协议。方便远程连接到远程主机,除此之外,还有丰富的配色方案和样式选择。安装就很简单了,下面将安装的过程还是放在这作为记录供参考

  • 安装 Xshell,去官网 download。进入安装页面

  • 选择免费为家庭/学校

  • 接受许可

  • 安装完成

  • 外观设置,字体设置,文件----属性中

  • 设置配色主题

Xshell 使用过程中的技巧有哪些?

  • 复制粘贴Ctrl+Insert进行复制,Shift+Insert进行粘贴
  • 右击将当前页面的内容复制到记事本中
  • 快速点击三次就可以选中当前行
  • 快速在多个session中切换。Alt+数字标识且数字====切换到指定session
  • 将命令同时发送给多个session 中(对了,大家可以安装哈rz,sz 方便安装下载文件)

4 基本命令的使用

命令太多,必须要全部记忆,但是要学会如何查每个命令的参数。我画了个思维导图可以当作小字典查看,下面列出可能我们使用频率会更高的命令

如果你要切换到登录用户的主目录,可以使用 cd ~,如果需要切换到指定的目录则使用 cd /home/lj,回到上次所在的目录则 cd -。好了,非常基础的命令看个小思维导图即可,进阶一些且常用的命令继续往下看。

5 常用命令整理

今天总结几个非常常用的 Linux 命令,其中有几个在面试中很可能问相关命令的原理,比如后台运行命令。希望对大家有所帮助,最好自己去尝试在Linux操作系统中实践一下。

查看目录以及权限

Windows 中,使用 dir 查看当前目录中文件。在 Linux 中使用ls(list)查看当前目录文件。Windows 中的 dir,如下图所示:

Linux 中,通常使用ls -l列出,其中可以查看文件属性,所属用户组等较为详细的信息。下面详细解释从左到右每一列是什么意思

其中第一列的第一个字段代表文件类型,后面的 9 个字符代表模式,整个一串分为三小组,每一小组三个字段。

第一组为所属用户权限。第二组为所属组的权限。第三组为其他用户所属权限。其中 r(read) 代表可读,w(write) 代表可写,e(execute) 代表可执行。在后面的 9 个字符中,如果是字母说明有相应的权限,如果为"-"代表没有权限。举一个例子:

-rw-r-r--: 此为普通文件,对于所属用户为可读可写不能执行,对于所属组仅仅可读,对于其他用户仅为读。

第二列为硬链接数,硬链接作用之一是允许一个文件拥有多个有效路径名,从而防止误删。但是只能在同一文件系统中的文件之间进行连接,不能对目录进行创建。

第三列是所属用户,第四列为所属组,第五列为文件大小,第六列为文件被修改的时间,最后为文件名。其中刻印使用chown改变所属用户,chgrp 改变所属组。

nohup(no hang up不要挂起的意思)

这是常用后台启动程序的常用方法,如果在交互命令行中运行程序,我们只需要 ctrl+c 就可以终止程序。在交互环境下,我们的输出一般都会直接输出到当前界面,在后台启动的时候通常会定向到文件,那通常情况是下面这个命令。

其中 1 表示标准输出。2 表示文件标准错误输出。2>1& 即将两者合并,但是合并到哪里,就是 X.file

查看进程

有的时候我们需要查看进程是否已经启动或者查看进程的状态并终止进程。经常使用的命令为 ps -ef—列出当前正在运行的程序,那如何定位我们想要查看的进程呢,这个时候就可以结合 grep ,即

如何解压缩文件

常用参数

  • -c:创建的 tar 文件
  • -x:解开 tar 文件
  • -t:列出 tar 文件中办函的文件信息
  • -r:附加新的文件到 tar 中

如何在多台服务器之间传输文件?

通过 scp 命令在多台服务器中的相互复制 传输文件。为了省下输入密码,可以设置免密登录。

如何动态查看应用的执行结果,如我想知道每隔一秒高亮显示网络连接数的变化情况

我想查看磁盘的大小

我想抓取数据包并分析网络情况

Linux 中通常就会使用tcpdump 来抓取网络中的报文,并进行分析。

知道了相关参数,下面看几个案例

我想知道当前网络中的文件连接情况

如果让你使用一个命令进行网络连接并上传相关文件,你会使用什么命令

nc–>“瑞士军刀”。不知大家在渗透过程中,拿了shell有没有使用nc 搞点事儿。它用来快速构建网络链接。常用来调试客户端程序。

我想要方便的查看网卡的相关信息及TCP网络连接状态

netstat 是一个网络信息统计工具。它可以得到网卡接口上全部了解,路由表信息,网卡接口信息等。通常在网络编程中我们用它来显示 TCP 连接以及状态信息。

我想实时查看当前系统的进程信息,CPU使用情况等信息

这时候vmstat 就派上用场了。

vmstat能够实时输出系统的进程信息,内存使用,CPU 使用等资源的使用情况

看一下vmstat 都有哪些输出字段。

这里注意哈,如果查看磁盘的更加详细信息,有另外iostat 所得到的信心就更加详细哟

我想实时的查看多处理器中各个 CPU 的使用情况

可以使用 mpstat 命令进行查看,不过需要先安装 sysstat 包,在 Centos 中直接使用 yum install systat 就可完成安装

然后我们看看各个字段什么意思。

我想将文件拆分为几个小文件

我想统计文件中单词的个数。

我想一页一页的查看文件内容

查看日志的前几条数据或后几条数据

查看几个文件的内容差异

5 用户管理及权限

Linux 是一个多用户的操作系统,意思是允许多个用户同时登录到系统中,并响应每个用户的请i去。但是任何需要使用系统的用户,都需要一个账号,账号分为管理员账号和普通用户的账号。

Linux 中,操作系统会根据UID 来判断用户,如果id0则为管理员账户,可能存在多个管理员账户。

Linux中,每个用户都会属于一个组,意味着当创建用户的时候,系统会自动创建一个同名组作为次账户的主组。

用户和组的关系以配置文件的方式关联,相关配置文件如下

系统在创建新的账号时,会根据账号类型,自动的分配账号的 UIDGID,通常情况 UIDGID 唯一且不重复

刚才说了可以创建自己的用户,那么怎么创建自己的用户呢?

添加用户

更改密码

系统有很多的用户,怎么进行用户的切换?

如果需要

用户之间的切换使用 su 命令实现。root用户可以无需输入密码切换到lj用户,如果普通用户lj切换到 root 用户则需要输入密码,我们看看

如何切换路径,绝对路径和相对路径

6 软件的安装方法

在Linux安装相关的工具分为三种方式,分别为源码安装,RPM 包安装以及 YUM 安装方式

源码安装方式

开源软件都会提供源码下载的方式,对于源代码安装方式的好处即可以定制软件功能,安装需要的模块,不需要的模块可以屏蔽,方便管理,卸载等。

对于源码安装的步骤如下

  • 下载解压源码

一般下载下来源码以后都会存在一个 Readme 文件,首先应该仔细阅读这个文件,可能有很多需要修复的以前人家遇见的问题都会在上面做记录,以免入坑不回头

  • 分析平台环境
  • 编译安装软件

这里会使用 make 工具,make 工具就会通过 makefile 文件来实现。makefile文件 是一种按照某种语法来编写且定义了各个文件的依赖关系。

Linux 中,习惯使用 Makefile 替代 makefile,当用户执行 configure 后,就会在当前目录生成这个 makefile 文件,然后用户输入 make 就开始运行。我们看看 Makefile 是怎么个有样子

make和 make install 的关系

当我们输入 make 命令过后即进入了编译阶段,编译时间根据软件的程序规模大小以及硬件配置有关,当输入make install就会开始安装软件,我们可以指定安装目录也可以不指定,系统将给你默认指定目录为 /user/local,这样安装完毕。

RPM安装方式

RPMRed Hat 公司开发出来的 Linux 下的软件包管理工具。这些以 .rpm结尾的包包含了已经编译好的二进制可执行文件,一句话即将源代码进行编译,安装,然后封装为RPM包

优点即安装简单,方便,因为已经编译完成,安装只是用来验证和解压过程,缺点也比较明显,过于依赖于操作系统,要求RPM包的安装环境必须和RPM封装时的环境保持一致,

RPM包是怎么个样子?

server-2.1.0-22.I386.rpm

其中:server 为如那件的名称

2.1.0:软件的版本号

22:软件更新发行的次数

i386:适合硬件发行的次数

.rpm:rpm软件包的标识

YUM安装方式

  • 查看是否存在yum
rpm -qa | grep yum
  • 没有则安装
rpm -ivh yum-*.noarch.rpm
  • 自定义yum的配置。我们可以通过打开 /etc/yum.repos.d/Centos-Base.repo 进行源的配置

YUM有哪些特点呢

  • 安装方便
  • 可以同时配置多个源
  • 配置文件简单明了

推荐个不错的yum源

  • EPEL

是一个针对红帽企业版Linux及衍生发行版的一个高质量附加软件包项目。

  • RPMForge

这是一个第三方软件仓库,被centos社区认为是一个最安全最稳定的一个软件仓库

7 shell脚本练习

大部分情况都是Linux操作系统,那么熟悉命令的用法以外,熟悉使用shell脚本能节省不少时间

shell是什么

平时经常在 Linux 操作系统中使用各种命令,比如查看当前的目录文件,我们会使用 "ls" 或者 "ls -l",这些字符串参数实际上会被"某段程序"执行并启动。这个负责将用户输入的字符串转换为需要执行程序的东西叫做shell。即帮用户更方便使用操作系统接口的“壳”。同样的壳还有当我输入Maven+相关参数的时候是不是就会去执行相应的功能,我们驶入 SQL 语句的时候,数据库引擎是不是也会各种调用,一样的道理

尝试编写第一个shell

vim 创建打开一个文件,扩展名为.sh。如下所示

变量的使用

变量名和等号之间不能有空格

定义变量注意事项:

  • 命名首个字符不能是数字,只能使用英文字母、数字和下划线
  • 不能使用标点符号
  • 不能使用bash中关键字

使用变量(使用变量的过程中,最好加上花括号),只需要在变量前面加上美元符号即可

只读变量

使用 readonly 将变量定义为只读,只读意味着不能改变

删除变量

使用unset删除变量 变量删除以后不能再次使用,且不能删除只读变量

变量类型

  • 局部变量

仅当前shell可用

  • 环境变量

所有程序都能访问环境变量

  • shell变量

通过一部分环境变量和shell 变量保证shell 的正常运行

字符串

使用字符串的过程中,既可以用双引号也可以用单引号,也可以不用

  • 单引号

单引号内容原样输出,不能包含变量,且不能出现单独单引号

  • 双引号

可以出现转义字符

获取字符串长度

使用 # 获取字符串长度

数组

支持一维数组,数组元素之间通过空格隔开,读取数组,使用 @输出数组所有元素

获取数组中所有元素以及数组长度

看看结果

注释

单行注释

使用#开头的行为注释,会被解释器忽略

多行注释

shell传递参数

在执行shell的时候,命令行指定参数,如下所示

结果

下面看看这个例子

结果

相同点:都是会引用所有参数

不同点:在使用双引号的时候。如果脚本运行时两个参数为a,b,则"*“等价于"ab”,而"@“等价于"a”,“b”

8 printf

使用 printf 格式化字符串,同时可以指定字符串宽度和对齐方式,格式如下

结果

9 test

shell 中的test用于检查某个条件是否成立

案例

结果

if语句语法格式

如果简化为一行

if else-if else

案例 判断两数值是否相等

for循环

while语句

“ 通常用于从输入文件不断读取数据

无限循环

case语句

“ 多选择语句。取值后面为单词in,每一个模式以")"结束。匹配发现取值符合某一模式后,其间所有命令开始执行直至 “;;”。

输入不同的内容,会有不同的结果,例如:

输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3

跳出循环

break

break命令允许跳出所有循环

continue

“ 跳出当次循环

10 shell函数

“ 用户定义函数,然后在shell脚本中随便调用,格式如下

例子

带return语句

函数参数

shell重定向

输出重定向

“ command1 > file # 如果file中存在内容将被清空覆盖。如果追加使用command1 >>file

cat dir.txt

/dev/null文件

“ 写入到它的内容都会被丢弃,会起到"禁止输出"的效果,如果希望屏蔽stdout和stderr “ command > /dev/null 2>&1

注意:Linux命令行都会打开三个文件

  • 标准输入文件:stdin文件描述符为0
  • 标准输出文件:stdout文件描述符为1
  • 标准错误文件:stderr文件描述符2

12 shell实战

  • 请将当前目录中demo.txt第二行第三列数据输出到demo2.txt中

  • 日志如下统计访问ip最多的前10个

uniq - 删除排序文件中的重复行 sort对于文本进行排序 -l 按照当前环境排序. -m 合并已经排序好的文件,不排序. -n 按照字符串的数值顺序比较,暗含-b -r 颠倒比较的结果.

  • 如何检查文件系统中是否存在某个文件

  • 每个脚本开始的 #!/bin/sh 或 #!/bin/bash 表示什么意思 ?

“ #!/bin/bash 表示脚本使用 /bin/bash。对于 python 脚本,就是 #!/usr/bin/python

  • &和&&区别

“ “&” 脚本在后台运行时使用它。“&&”当前一个脚本成功完成才执行后面的命令

  • 脚本文件中,如何将其重定向标准输出和标准错误流到 log.txt 文件 ?

  • 如何计算本地用户的数目

  • shell中进行字符串比较和数字比较

  • 统计内存使用

结果

  • 批量更改文件名

“ 批量修改123目录下txt为txt.temp。将temp打包为test.tar.gz

8 awk文本处理工具

awk是一个处理文本文件的应用程序,几乎所有的Linux系统都自带了这个程序

依次处理每一行,并读取里面的每一个字段。对于处理生产环境的日志有着非常高校的作用

基本用法

上面 lan.txt 是 awk 需要处理的文本文件。前面单引号里面有一个大括号,单引号里面就是每一行的处理动作。其中 print 为打印命令,$0位当前行,所以执行结果就是把每一行原样打印出来

print $0 即将标准输入my name is lanlan ,c 重新打印一遍

为了方便,我们直接使用/etc/passwd文件进行操作,

变量

上面我们说了,可以使用符号“$+”数字的方式表示第几个字段,其实还有一些变量可以直接表示相应的字段。比如“$NFb” 表示最后一个字段

这里出现了双引号,表示原样输出

其他常用的内置变量

  • FILENAME:当前文件名
  • FS:字段分隔符,默认是空格和制表符。
  • RS:行分隔符,用于分割每一行,默认是换行符。
  • OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
  • ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
  • OFMT:数字输出的格式,默认为%.6g。

函数

既然算是一门语言,函数当然少不了,下面看一波常用的函数

函数toupper()用于将字符转为大写

可以发现第一个字段输出的时候变成了大写

  • tolower():字符转为小写。
  • length():返回字符串长度。
  • substr():返回子字符串。
  • sin():正弦。
  • cos():余弦。
  • sqrt():平方根。
  • rand():随机数。

5 条件

通过使用相应的条件,过滤出自己想要的内容

上菜

这里/usr/表示只输出包含usr的行

这个例子输出奇数行

下面的例子输出第一个字段等于指定值的行。

5 if语句

通过if语句编写比较复杂的内容

上面代码输出第一个字段的第一个字符大于m的行。

if 结构还可以指定 else 部分。

9 进程管理与定时任务和后台执行

crond是什么?

crond是一个可以在指定时间执行一个shell脚本或者一系列的Linux命令。和Windows下的计划任务类似。当安装完操作系统后,默认会安装这个服务工具,并且会自动启动crond进程。

在Linux中任务的调度分为两类

  • 系统任务的调度

系统会周期性的执行一些工作,比如说写缓存的数据到硬盘,清理日志等

  • 用户任务的调度

用户定期也会执行一些任务,比如用户数据的备份,定时的邮件提醒等,这些都是通过crondtab来设置

那么crontab到底怎么用么

首先看看crontab的使用格式:

常见的选项

  • -u user:很明显是需要表明是那个用户的crontab服务,别瞎搞
  • file:file是命名文件的名字,表示将file作为crontab的任务列表文件并载入到crontab中
  • -e:e为edit,表示标记某个用户的crontab文件内容
  • -l:显示用户的crontab文件、

crontab的含义

创建的crontab文件,每一行代表一项任务,每个字段都有对应的设置规则,一共分为6个字段,分别为:

  • minute:区间 0-59
  • hour:区间0-23
  • day:区间0-31
  • month:区间1-12
  • week:区间0-7 周日可以是0/7
  • command

这里的command代表的是需要执行的而命令,通常为脚本文件,

除了上面几个字段,还需要注意几个特殊字段

  • *:代表所有可能的值
  • ,:通过,来表示区间范围的值
  • _:整数之间的中杠表示一个证书范围
  • 正斜线:表示时间的间隔频率,比如0-23/2表示每两个小时执行一次

开始放几个例子

这代表的是每天早上5点运行backup.sh

每个工作日11:59pm进行备份作业

每五分钟运行一个命令

crontab有哪些选项

crontab -e:修 改crontab文件,如果文件不存在会自动创建

crontab -l:显示crontab文件

crontab -r:删除crontab 文件

crontab -ir:删除crontab文件前提醒用户

10后台运行

用途:不挂断的运行命令

语法:nohup Command [ Arg … ] [&]

  • 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。

  • 如果当前目录的 “nohup.out” 文件不可写,输出重定向到“$HOME/nohup.out ”文件中。

  • 如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

退出状态:该命令返回下列出口值:

  • 126 可以查找但不能调用 Command 参数指定的命令。

  • 127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

  • 否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

使用 &

用途:在后台运行

一般两个一起用

才疏学浅,难免有纰漏,如果你发现错误的地方,麻烦告诉我,我对其修正。

和文件的权限,当我们知道怎么用了以后,是不是就需要去了解他是怎么个设计理念呢,我们下期再见!

二、Linux基本结构

才开始接触虚拟机的时候,确实很奇怪的,不过又觉得蛮新奇的,相信通过前面两篇文章,你应该装好了自己的虚拟机,也可以尝试做做实验,敲命令了。如果还没有装或者还没有熟悉命令,赶快去试试,听话

在Linux中,系统默认的用户是root,其实和 windows 的 administrator 类似,root 用户可以操作操作系统的任何文件和设备,OMG,记住了,是大哥大,干啥都行,所以在生产环境就不要乱用root了,权利越大,责任越大呐。

1 系统与硬件相关

虚拟装好了,我们就比较好奇这些配置都是什么。如果你还记得第一篇中的安装过程,那么在这里的操作你就知道了 “原来是这样”。

查看系统的 pci 设备

lspci 命令可以查看所有的 PCI 设备,比如主板,声卡等

  • 查看CPU信息

其中 processor 是逻辑处理器的唯标识符,vendor-id 是处理器类型,如果是英特尔的处理器,那么字符串就是genuinelntel。physical id 是每个封装的唯一标识符,也是一个物理的CPU,siblings 表示位于相同物理封装中的逻辑处理器数量,core id 为每个内核的唯一标识符

在 siblings 和 CPU cores 有个对应关系,如果 siblings 是 CPU cores 的两倍,则系统支持超线程。

如果要查看 CPU 的个数,那么可以通过下面的命令

如果要查看系统所有的逻辑CPU个数

如果要查看内存的信息

从结果可以看出,目前总内存为1.8G,可用1.5G,缓冲区占用1260KB。

查看磁盘分区的信息

从上图我们可以看见虚拟了 42G 的磁盘以及每个分区的大小,是不是关于硬件相关的信息看的清清楚楚了,就这样不再神秘

2 文件系统的了解

  • 经典树形目录

Linux 牛逼之一在于将所有的内容以文件的形式展现出来,通过一个树形的结构统一管理和组织这些文件。Linux 典型的树形结构如下图所示

这个树有个根,根下面很多**「杈」「杈」**上可以长出很多叶子

整个系统都是按照文件的形式放在根目录中,同时会将文件分类,这样形成一个树形目录结构,这样的布局给管理文件带来了很大的方便,我们确实需要去了解这些目录结构,对于后续的系统排错还是蛮重要的哒。虽然有些啰嗦,不过这些图确实是实打实的画出来的,没事看看就知道了,不用记住。

  • etc目录

这个目录主要存放的是管理文件用的相关配置文件,比较重要的 /etc/rc,用户信息文件 /etc/passwd,具体的如下图

  • /usr目录

这个目录主要存放的是应用程序和文件,如果在安装软件的时候,选择默认安装的位置,通常就会默认在这个位置,下次就别问我装的东西去哪里,what??具体信息如下图

  • /var目录

通常用来存放系统运行的日志文件,如下图

  • /dev 目录

包含所有的设备文件

  • /proc 目录

这个目录是虚拟目录,主要存放的是内存的映射,通过这个目录和内核的数据结构打交道比如修改内核参数,获取进程的相关信息,具体信息如下

其他目录

  • /boot目录

这么说吧,你要是把这个目录给干掉了,你就是大哥。它存放了启动 Linux 的核心文件,包含镜像文件和链接文件,破坏后系统基本上就不能启动

  • /bin/sbin

当你装相关的软件或者安装包后,很多时候都会链接在这个目录下面,另外这里也存放了平时我们使用的各种 shell 命令。比如cp,ls,dd等

对于sbin,这里的 s 是 super 的意思,意味着需要超级用户才能执行的命令。常见磁盘分区 fdisk,创建文件系统的 mkfs就在这里

  • /home

这个目录是系统中每个用户的工作目录,每个用户都会有自己主目录,通常名称为用户名,如果有个用户是小蓝,那么主目录就是xiaolan

  • /lib

在开发的过程中,很多共享库文件等很多放在这里,这个目录会包含引导进程所需要的静态库文件。后续在分享程序开发的时候会深入掰扯

  • /root

一般用户没有进入这个目录的权限,它是root的主目录

  • /lost+found

保存丢失的文件。什么意思,如果我们不恰当的关机操作,可能导致一些文件丢失,这些丢失的临时文件可能就会存放在这里。当重新启动的时候,引导程序就会运行 fsck 程序并发现这个文件

  • /tmp

用于存放临时文件,随时可能被删除

3 CPU核心部件

这部分内容是先过一边,后续会对每一个部分进行详细的阐述

Linux 的内核相当于 CPU 的大脑,经过了十几年的共同努力,现在已经到xxx核。

作为一个开源操作系统,也给予我们难得的机会去学习这个成熟的操作系统,一个完整的计算机内核包含五个部分,分别是内存管理进程管理进程间通信虚拟文件系统和网络接口,这一部分在后面的文章会单独介绍,先了解个大概,如果看过之前的面试连载文章,很多时候都会涉及到这些问题,这么说吧,在面试中的百分之八十的问题,你都可以联系到操作系统层面,或者和操作系统相关知识点,相关设计理念巧合,当然不是巧合,就是学习过往成熟的经验罢了

  • 内存管理

我们知道,在区区的小内存环境下,可以运行很多的软件。Linux 内存管理中支持虚拟内存,即在系统上可以运行所有程序占用的内存总量大于实际物理内存,多余的这部分内存是从磁盘申请所得,在内存紧缺的情况下,内存管理就会负责在磁盘和内存之间进行交换。

  • 进程管理

Linux 可多任务运行,那么在单CPU的情况下怎么支持多任务呢。这个任务就得交给进程调度来完成了。每当系统运行的时候,调度器会分配一个时间片,然后调度器根据不同的时间片选择进程运行。比如A进程的时间片用完了,那么调度器会选择一个新的进程继续运行,由于这个切换的速度和频率都很快,以致于让我感觉是多个程序在同时的运行,实际上CPU 在同一个时间只有一个进程在运行。

  • 进程间通信

各个进程的友好相处才能共建繁华生态嘛。不同的进程有自己的进程空间,要通信就得找只隔壁耳朵内核中专。在一般情况下,一个进程等待硬件操作完成就会被挂起,硬件操作完毕进程回复执行,这个协调过程就是进程间的通信机制了

  • 虚拟文件系统

为了让众多的文件系统有一个统一的接口,采用了通用的文件模型—虚拟文件系统。虚拟文件系统分为逻辑文件系统设备驱动程序。其中逻辑文件系统如 ex2,ex3 等。设备驱动程序包含了硬件控制器所编写的设备驱动程序模块。

  • 网络接口

首先需要知道每一种网络硬件设备都会对应相应的设备驱动程序,网络设备驱动程序主要负责与硬件设备来进行通信

4 CPU运行机制

知道了CPU的目录结构,现在说说其运行机制,主要包括了 init 系统,系统的运行级别,系统的关闭方法

  • Linux 初始化init系统

启动首先从 Bios 开始,接下来 Linux 引导程序将内核载入内存进行内核初始化,随后启动 init 进程,这个进程是系统的第一个进程,负责产出其他的进程

仅仅让内核运行起来还没啥用处,还需要管理,控制这些进程,从而系统进入一个用户设定的用户模式,即 init 系统

起初采用 sysinit,它主要依赖于脚本,串行启动进程,最大的缺点就是慢,在服务器上看还没有什么影响,如果是在手机移动端,这得急死人,随后出现了systemd取代了慢的upstart

在 Wndows 中,系统有安全运行模式和正常运行的模式,在 Linux 中的运行级别更加的灵活

一共有七种运行级别,定义在 /etc/inittab 中,sysinit 会检查 /etc/inittab 文件查看是否含有 initdefault 来启动一个默认的运行级别

  • 0:表示关机模式

  • 1:单用户模式

  • 6:重启模式,关闭所有的运行进程

  • 2:表示多用户模式

  • 3:表示多用户模式,支持nfs服务

  • 4:表示基本不用的用户模式,可以实现特定的等了请求

  • 5:表示完成多用户模式,默认等了到x-windows系统

这些数字和 init 结合就产生了相应的含义,比如init 1表示系统进入单用户模式,、init 6表示系统将重新启动

有了新的systemd管理体系以后,默认的运行级别通过软连接的方式实现。

查看系统的默认target,如下所示

如果需要修改运行级别和targe的对应关系,可以通过下面命令实现

5 系统关机过程

关机方式很多,比如init shutdown halt reboot,下面我们分别看看这些方式以及

  • shutdown

才开始学习 Linux 操作系统,不要动不动的就拔电源,我们知道此时很多的进程正在如火如荼的进行,你的这一操作,很可能就导致场面混乱,很多进程数据丢失,严重一点可能进程间开始打架,导致硬件设备损坏

shutdown 是 shell 编写的程序,必须要超级用户才能执行。首先通过广播的方式告诉系统所有的用户,系统将在xx时间关闭,同时 login 指令冻结,意味着其他用户此时不能等了,时间一到,i就会发信号给shuinit程序吧,init程序就会改变运行级别

shutdown命令之shutdown常见参数

  • -f:重新启动的时候不执行fsck

  • -k:只是发送西悉尼给所有用户但不会真正关机

  • -r:shutdown之后重启系统

  • 时间:设置多长时间可以九天跑一次

  • halt命令

  • reboot

reboot和halt类似,只是reboot是关机后重启

halt参数

  • -i:关机之前关闭所有的网络接口
  • -n:halt执行的时候不会调用系统指令sync

init主要用户系统在不同运行级别的切换,切换工作是立即完成的

6 系统服务管理工具

在 Centos7 以后,一个非常大的改变即使用了 systemd 管理工具,它不仅可以完成系统初始化的工作,还可以对系统和服务进行管理。同时它也兼容了之前的 sysinit,之前的版本中,这些初始化脚本服务存在于 /etc/rc.d/init 中,现在被.service文件扩展结尾的代替

配置文件位于 /etc/systemd 目录下,配置工具的命令使用 /bin/sbin 目录下,备用的配置文件位于 /lib/systemd 目录,可以通过rpm -ql systemd查看所有的路径

另外,为了方便操作,systemd提供了强大的命令行工具systemctl,下面我们看看这些常见的启动停止服务的命令

启动 停止 重启服务

通过systemctl启动一个服务

停掉此服务

重启服务

关闭服务

如果要查看这个服务状态

三、Linux安全

相信通过上一篇的分享,已经架设了属于自己的Linux,就这样得空客就安全了吗?当然不是,今天我们一起看看Linux本省得一些安全策略。对了,关于Linux的内容是系列内容,希望大家可以从0开始搭建,然后按步骤操作,后续涉及的集群,大数据,可视化等一些的学习都会基于这个环境,所以mark住没问题。

下午回到家就想睡觉,醒来以为快早上了,一看时间原来才晚上十一点了,感冒了两周,颓废了半个月,心态不咋好,现在又来和你们见面了,加油!


1 Linux安全策略

在生产环境几乎都是 Linux,为了保护我们程序,防止我们功能被破坏,会采取一些列的措施,所以提前学习和了解这些策略势必也会为后面的学习打下不错的基础

常见的攻击类型有哪些呢

  • 密码暴力破解

目的比较明确,通过爆破工具破解用户的密码,进入服务器获取资源进行系统的破坏。我们可以想象一个字典,字典足够强大,逐一匹配就可以找到服务器的密码

  • 拒绝服务攻击

通过大量的请求来占用足够多的服务资源,使得网络阻塞或者服务器死机,导致 Linux 服务器无法给用户提供服务。常见的拒绝服务攻击有 Dos 与分布式拒绝服务攻击。黑客通常是利用伪装的源地址或者控制其他的目标机器发出大量的连接请求,由于服务器无法在短时间接受这么多请求,从而导致系统资源耗尽,服务挂起。

  • 应用程序漏洞攻击

这种情况一般是黑客通过类似扫描工具扫描服务器可能存在的漏洞,然后根据漏洞渗入到服务器进行相应的破坏,常见比如sql注入,漏洞攻击,网页权限漏洞等

如何进行防范呢

彻底的防范是不可能,但是可以尽全力的防范,通常需要一系列的安全设备和规则进行约束

  • 网络传输的安全

常见的网络安全设备有硬件防火墙网络入侵检测路由器交换机等。防火墙对进出网络的主机进行规则匹配,尽量保证合法的主机进入网络,可是有些攻击行为是在防火墙允许的范围内,这个时候防火墙就无所能及了,就需要诸如IDS设备来辅助。IDS会对系统的整体运行情况进行监控,尽全力发现攻击企图,从而保证网络系统资源的机密性,完整性和可用性

  • 操作系统的安全

操作系统安全即服务器本身的一些安全设置和优化。比如系统内核的定期升级,自带软件的更新,配置 iptable 规则,关闭无关服务等

很多常见的病毒程序,防火墙很难阻止,此时如果系统存在杀毒工具也是可以直接破掉第一道防线

  • 应用软件安全

应用软件安全顾名思义即部署在服务器中应用的安全策略配置,比如我们会对数据库进行配置防止非规则内的连接数据库等

再比如 SQL注入,跨站脚本都属于应用软件安全漏洞造成的攻击

那么常用的安全策略有哪些呢

  • 软件及时更新

这一块我估计很多人都不会在意,毕竟需要重新安装比较麻烦,但是很多时候需要更新,是因为有漏洞了,意味着Hack利用这些漏洞就很容易进你的系统,所以需要尤其注意

  • 端口服务

一般一个有效的连接,即客户端和服务端端口的建立过程。而端口在系统中也是有一些规则的

在Linux操作系统中,系统定义了 65535 个端口,这些端口又分为两个部分,按照 1024 分割,分为只有 root 用户才能启用的端口和客户端的端口,对于只有root用户才能启动的端口:

也就是 0-1023 的端口,需要 root 才能启用,因为这些端口预留给一些预设的服务使用,不经常使用的端口最好关闭,比如 Ftp 的21端口,25的 Mail 服务端口

客户端的端口

1024端口以上的通常给客户端软件使用,由软件随机分配,对于大于1024的端口不受root的限制,比如默认的3306就是数据库的默认端口

如何查看端口的状态呢?

通过 netstat -tunl 查看

从上图可以发现启用了22端口,这是默认就打开了,我的远程工具XSHELL即就是连接的这个端口

如何查看链接的状态呢

如果查看端口对应的什么服务,执行什么命令呢

服务与端口是什么关系

我们可能经常听到什么服务对应什么端口,他们两是一一对应的关心,没有服务运行即没有端口对应,那是不是这些服务都必须使用默认的端口呢

当然不是,大部分的软件都会有配置文件,根据相应的配置就好了

一定要记得关闭不必要的服务

在Linux中,服务的启动和关闭管理有两种方式,第一种方式是直接启动脚本,在 Centos7 之前是在 /etc/init.d 目录下的服务启动和关闭。在 Centos7 以后,使用 systemctl 工具来完成,这个在后续的系统管理会详细给大家说说。

如果要启动 sshd 服务,可以使用下面的命令

另外一种情况是通过超级服务管理一些常用的网络服务,比如 Centos 的超级服务 Xinetd,这个服务可以管理的服务如 Vsftpd 等,我们可以通过 /etc/init.d/xinted restart 来完成服务的重启

在Linux中,通过 chkconfig 命令或者 systemctl 判断服务是否开启

我们怎么知道关闭哪些不必要的服务呢

这里列出一个表格

还有一些其他的安全设置

  • 禁止系统响应任何从外部来的ping请求

ping通过用来检查网络的连通性,如果能够ping通,攻击者就知道这是一个活跃的机器,那么怎么禁止ping请求呢

  • 删除不必要的用户组

删除系统不必要的用户 userdel username

删除系统不必要的组 groupdel groupname

  • 关闭selinux

首先它是内核强制访问控制安全系统,,由于它和现在的linux应用程序和内核模块有一些兼容问题,如果要查看是否已启用

通过使用 getenforce,如果要关闭selinux,修改下面的文件

2 说说防火墙

防火墙有硬件防火墙和软件防火墙,在这里主要介绍软件防火墙。根据工作方式的不同又分为封包式防火墙应用层网关防火墙

硬件防火墙使用专有的操作系统,如果按照工作方式来划分,那么防火墙也分为过滤式防火墙、应用层网关防火墙两种,后面给大家介绍的 iptable 即属于过滤式防火墙

Iptable 是 Linux 中内嵌好的防火墙软件,集成在内核中,因此效率非常高的。它可以通过你设置一些封包过滤规则来定义什么数据包可以接受,什么数据包剔除

iptable的使用环境?

  • 保护自身本机

windows中有防火墙软件,iptables类似,在Linux中的位置如下

从上图可以发现,在交互的过程中,首先要经过 Linux 自身的 iptables 防火墙,作为第一层的安全过滤,随后经过防火墙的第二层的过滤最终到达互联网,所以可以说Linux自带的iptables是系统安全的最后一道防线。

  • 独立的Linux主机对整个网络进行防护

如下图所示,部署在Linux路由器上对整个局域网进行安全防护

从位置来看,位于外网与局域网之间,防火墙在路由器的上面,所以先对进入局域网的数据包进行过滤,这样不就对局域网主机进行了访问控制,以此来保护局域网的安全

  • 多台Linux主机对Lan进行多层安全防护

通常局域网划分了子网,在子网钱部署一道Linux防火墙,然后将一些保密的资源放在这个子网里,子网通过设置第二道Linux防火墙设置相对更高的安全等级

  • 对DMZ进行安全防护

DMZ区域通常将互联网与局域网隔离开的一个特殊网络区域,通常部署一些不包含机密信息的服务器,比如ftp,这样来自外网的访问者可以通过Linux防火墙来访问DMZ的服务,即使DMZ服务器遭到破坏,也不会影响另一部分网络

iptables的基本使用是如何的?

  • iptables 的前生后世

Linux最早出现的防火墙叫做 ipfw,是基于Linux2.0内核的。随后在 Linux2.2 中推出了ipchains,语法更容易理解且功能更强大,随后 iptables 在 Linux2.4 出现,同时也包含了 ipchains,但是两者无法兼容,iptables防火墙越来越强大,Linux2.4以后就基本上使用iptables防火墙了

  • iptables的组成

iptables=ip tables,意味着是IP表的意思,对的,它是由多个表组成,且每个表的用途不一样,在每个表中定义了很多链,通过这些链设置规则和策略

iptables呢有三种表的选项,管理本机数据进出的 filter 表,管理防火前内部主机的 NAT 表和改变包头内容的mangle

先来看看filter进行信息表的过滤,分别包含了INPUT、OUTPUT和FORWARD链

NAT表主要用于网络地址转换,再上一个篇也有说过,它包含了PREROUTING、POSTROUTING和OUTPUT链

mangle表包含了一些用于标记高级路由的信息报,可以改变包以及包头内容,如TTL、TOS,MARK。它知识在内核空间为包设置一个标记而已,这个表内置了五个链:PREROUTING、POSTROUTING、OUTPUT、INPUT和FORWARD

通过多个路由规则和预设规则组成了功能链,然后多个功能链组成功能表,多个功能表组成iptables防火墙

iptables的执行过程是怎么样的呢?

当数据包到达Linux主机,首先进行 iptables 过滤,如果数据包满足规则1指定的条件则直接执行相应的操作,后面的2,3规则就不再理会

举个例子

假设目前这个 LInux 可以对外提供 www 的服务,对于网络 192.168.50.0/24 中的网络主机开放访问www服务,但是禁止192.168.50.133访问www服务,规则如下

  • 规则1:禁止192.168.50.133主机访问www服务
  • 规则2:允许本地网络访问www服务

这样子设置完规则后,本地的网络除了133不能访问以外,其他的都能访问。如果反过来

  • 规则1:允许本地网络192.168.50.0/24访问www服务
  • 规则2:禁止192.168.50.133主机访问www服务、

此时的规则1允许所有主机访问Linux服务器的www服务,自然也包含了133主机,规则2将显得毫无意义

iptables的使用语法是怎么样的呢

  • 启动和关闭iptables
servcie iptables start//启动service iptables stop//关闭chkconfig --level 35 iptables on //设置iptables开机默认启动

iptables的防火墙规则如何查看以及如何清除修改?

格式:iptabls [-t tables] -L -vn -FXZ
  • 查看当前系统filter表的几条链规则
iptables -L -n

3 用户以及用户组的管理

用户组

Linux是一个真实且多用户多任务的操作系统,意味着张三王五李四都可以同时使用同一个Linux操作系统,但是他们三儿不能互相访问各自的内容,不同的用户有不同的权限,每个用户在权限范围内完成不同的任务,Linux正是通过这样的权限划分和管理实现多用户的运行机制

Linux用户的分类是怎么样的呢

  • 超级用户

超级用户,默认为root,具有最高的权限

  • 普通用户

只能对自己目录下的文件进行访问

  • 虚拟用户

最大的特点是不能访问登录系统,他们的存在主要是为了方便系统管理,满足相关系统进程对文件属性的要求

用户和组

用户通过向Linux申请用户访问系统,这样可以合理的利用和控制系统,同时也可以帮助用户组织文件,达到提供对用户文件的安全性保护的目的

什么是用户组呢

有时候需要协同办公,假设一共10个人,让这10个人对文件的操作具有相同的权限,需要给每个用户授权,这样岂不是太麻烦了,Linux就使用的概念,让属于组的用户都具有相同的权限

用户和组的关系

用户和组的关系可以是一对一,也可以是一对多设置多对多

  • 一对一:这个组就只有一个用户
  • 一对多:这个用户存在于多个组中,具有多个组的共同权限
  • 多对1:多个用户存在一个组,具有相同权限
  • 多对多:多个用户存在于多个组

用户的配置文件在哪儿?

用户和组相关配置文件,我们分别查看如下几个文件

  • /etc/passwd

这个文件是系统用户配置文件,起格式如下

用户名:密码:用户标识号:组标识号:注释描述:主目录:默认shell

看看/etc/passwd是什么样子

详细说说这些都是什么意思

  • 用户名:用户账户
  • 密码:为了保护用户隐私,这里面存放的都是一个特殊字符,加密的用户密码存放在/etc/shadow中
  • 用户标识号:用户的UID,每个用户都会有一个UID且唯一,0是超级用户的标识,1-99由系统保留,

作为普通用户,UID从500开始,用户的权限和角色也是根据 UID 而定,如果把普通用户的 UID 设置为0,将拥有root权限,这个非常的危险

  • 组标识号:组的GID,记录用户所在组,对应于/etc/group文件的一条记录
  • 主目录:用户登录默认所处的目录
  • 默认shell:默认使用的用户解析器,用户的所有操作都是通过shell传递给内核的

为了保证用户的密码安全,使用了/etc/shadow

  • 用户名:与/etc/passwd的用户名相同的含义
  • 加密密码:存放的是加密以后的用户密码字符串,如果字段是* !等,对应的用户不能登录系统
  • 最后一次的修改时间:表示从某个时间起,到用户最近一次修改密码的间隔天数
  • 最小间隔时间:两次修改密码之间的最小时间间隔
  • 最大时间间隔:两次修改密码之间的最大时间间隔
  • 警告时间:系统开始警告到密码正式失效的时间
  • 不活动时间:表示用户密码作废以后多少天,系统禁止这个用户
  • 失效时间:用户的账号生存期

/etc/group是干啥的

  • 组名:用户组的名称,组名不能重复
  • 密码:存放用户组加密后密码字串,默认设置在/etc/shadow文件中,而这里的x代替
  • 组标识号:Gid与/etc/passwd中组标识号对应
  • 组内用户列表:多个用户使用逗号分隔

/etc/default/useradd文件

为什么我们通过 useradd 命令创建一个用户后,默认在 /home 下且使用的shell是 /bin/bash ,看看 /etc/default/useradd 就明白了

/etc/default/useradd 定义了新建用户的一些默认属性,比如用户的主目录,使用 shell 等,通过更改增额文件就可以改变新建用户的默认属性值

用户的管理工具有哪些?

  • groupadd命令

groupadd用来新建用户组,其语法格式如下所示

groupadd -g gid group

这里的选项 -g 表示指定新建用户组的GID,这个GID必须唯一

选项-o:一般和-g同时使用,表示新用有的一直y户组gid和系统已y

此时创建一个lan_group1用户组和lan——group2用户组

group -g 1110 lan_group1
Group -g 1120 lan_group2
More /etc/group| grep lan_group1

  • groupdel命令

groupdel用于删除用户组

groupdel 名称

如果删除lan_group1

groupdel lan_group1

详细说说useradd/usermod等命令

  • useradd

如果在使用useradd的时候,不使用任何的参数,那么系统首先会读取配置文件/etc/login.defs和/etc/default/useradd,然后根据这两个配置文件来添加用户。随后想/etc/passwd和/etc/group添加用户和用户组记录,同时会在/etc/passwd中添加队以ing的加密文件。接着系统就会在/etc/default/useradd中增加用户主目录,这样一个主目录就算建立了。

useradd的基本使用和常用选项

  • -u uid:唯一用户标识号
  • -g group:指定用户登录的默认组
  • -d home:指定新建用户的默认主目录,如果不指定在,则会在etc/default/useradd中创建用户主目录
  • -e expire:指定用户的账号过期时间

如何更改用户的账户属性信息

通过usermod修改用户的账户信息。

usermod -u -g -G -d .....

常用的选项

  • -u uid:指定用户新uid,唯一
  • -d 主目录:修改用户登陆的主目录
  • -c 注释:修改用户的注释信息
  • -f:失效日

如果要删除用户呢

通过userdel删除用户,指定"-r"参数不仅删除用户,还会删除用户的主目录

好了举一个完整一点的例子

  • 添加一个用户lan_linux,所属用户组为base_linux,附加用户组为forme_linux,同时指定用户的默认主目录为/opt/base_linux
  • 添加用户test,指定UID为666,默认shell为/bin/sh,指定用户组为上面的
  • 修改用户test的主用户组为test_modify,同时修改test的附加组

4 文件权限

通过 ls 命令就可以查看文件以及目录的权限信息,如果使用 ls -al则还可以查看隐藏文件

为了更加详细的了解每一行各个段什么意思,我们取出一行

第一列由10个字符组成,其中分为4个部分,拆解如下

  • 文档类型,其中d表示目录,l 表示软连接。当为 - 表示是文件,为 c 表示字符设备文件

接下来的三个部分,3个字符为一组,r-读,w-写,x-执行

  • 第二个部分 user 部分,是对文档所有者权限的设定,rwx 表示用户对 xxx 有读写执行的所有权
  • group部分,是文档所属用户组权限的设定
  • other部分是对文档所有者之外的其他用户的权限设定

第二列表示文档的连接数,表示有多少文件执行一个inode

  • 第三列表示文档所属的用户和用户组
  • 第四列是文档的大小
  • 第五列表示最后一次修改的日期
  • 第六列是文档名称

这些权限如何去修改呢

通过chown改变文件和目录的权限,所有者包含了用户和用户组。

使用方法:chown -R y 用户名称 文件 目录

-R: 进行递归式的权限更改,意味着将目录下所哟肚饿文件,子目录都更新为指定的用户组权限,这个操作需要多多谨慎

如果需要修改访问的权限呢?

使用 chmod 来改变文件或目录的访问权限。使用方法有两种,一种是字母和操作符表达式的字符设定法,另一种是包含数字的数字设定法

先来看第一种—字符设定法

语法:chmod [who] [+ | - | =] [mode] 文件名

下面详细说一下各个选项的含义

  • who表示操作的对象,可以是下面字母中的任何一个

    • 如果是u,则代表用户,即文件或者目录的所有者
    • 如果为g,则代表用户组,即文件或目录所属组
    • 如果为o,表示其他用户,
    • 如果为a,表示所有用户
  • 操作符有哪些

    • “+”表示添加某个权限
    • “-”表示取消某个权限
    • “=”表示赋予给定可执行的权限,其中可以是可读,可写,可执行
  • mode表示可以执行的权限,其中可以是r,w,x以及他们的组合

  • 文件名可以是以空格分开的文件列表,支持通配符

案例

修改文件test.log文件,使其所有者具有所有权限,用户组和其他用户具有只读权限

数字设定法

即上面的r用数字4代替,w用2代替,x用1代替,所以如果想让文件的属主拥有读写权限,可以通过4+2的方式来实现,

  • 755:第一个 7代表文件所有者的权限,通过4+2+1得到。第二个5标识文件所属组的权限,通过4+0+1实现

举个例子

修改文件test.log的权限为644

四、Linux书籍推荐

哈哈哈,能看到这的估计很少吧,如果都看到这里了,是不是可以点赞一下了,谢谢。这些知识是非常基础的内容,如果是国企,银行等单位的面试基本上是够了。如果是 Linux 相关的开发岗位,这肯定远远不够,相关的书籍在之前的那篇文章给大家已经说了,有需要的也可以去看看。

五、Linux开源项目

这里涉及的项目属于Linux服务端开发必备的知识了,对于网络编程而言,建议大家先去看游双写的高性能服务编程,然后熟悉使用wireshark,或者他的开发包winpcap/libpcap,通过这两个包来练习下网络拆包,组包,分流等等操作,这样也许会让你对网络有更加直观的认识。下面的源码大部分都是有带注释的,所以看着就更清晰明了。

webbench

这是一个在 Linux 中进行网站压测的工具。通过 fork 来模拟多个客户段同时访问 URL,测试网站在这种压力下的性能。采用纯 C 语言实现,源码加起来不过600行。

Tinyhttpd

一共502行,当然很多人在此基础上加上了其他的请求方法,你也可以去试试。另外作者还在这个基础上附带一个client,做做实验,加深对HTTP报文,请求的理解

libcurl

这个库是当初实习的时候使用的库,多协议文件传输库,实现文件的下载,续传等功能,通过这个库能够非常方便的实现断续下载等功能。

libevent

c语言编写的轻量级开源高性能事件通知库,这里面你会了解如下几个地方,另外 B 站也有个完整的 Libevent的源码分析与实战。

  • 跨平台代码怎么实现

  • 多种IO多路复用的使用方法

  • 定时器怎么实现

  • 如何注册事件的优先级

Muduo

对于应届生而言,如果是面Linux相关的开发岗位,应该都会去了解下这个库吧,他是一个基于Reactor模式的C++网络库,采用的是非阻塞IO模型,是基于事件驱动和回调,也有和上面相关库的性能对比。

LevelDb

LevelDb是两位谷歌大佬开发,且说能够处理十亿规模kv数据持久性存储的C++程序库。和Redis不同的是,他不会狂吃内存,而是将大部分的数据存储再磁盘上

cJSon

cJson是c语言中的一个json编解码器,一共500行代码,速度却比较理想。结构清晰,值得学习

redis

5 总结

从 Linux 的安装到命令基本使用,软件的安装,常见的维护方式及网络配置。通过这篇文章基本上应付面试中的基本 Linux 相关问题,如果是诸如腾讯的 C/C++ 岗位,那么这些知识将远远不够,需要大家更加深入的去学习相关书籍和上方的开源项目。

好了,至此,Linux 复习的 V1 版就到这了,如果需要 PDF思维导图 的小伙伴,可以帮忙在下方点个点赞数超过500则出暗黑和Github两个版本的 PDF。


转载:https://blog.csdn.net/L15519543837/article/details/117152504
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场