第一章 Linux下的文件操作
1. 显示文件或文件夹
ls -显示当前文件夹下的文件及文件夹
ls 文件夹名/文件名 -如果是文件夹名字会显示出文件夹下的所有文件及文件夹,如果是文件则仅仅将文件名显示在下方
ls -l -列出所有的文件,包含文件的属性和权限,没有隐藏文件
ls -a -查看全部文件,包括隐藏文件
ls -al -显示所有文件包括隐藏文件
2. 查看文件内容
cat 文件名 -一次性把文件中的内容全部输出出来
head 文件名 -查看头10行文件的内容
tail 文件名 -查看末尾10行文件的内容
less 文件名 -可以翻页查看内容,使用↑↓可以实现翻页
head和tail 后面均可加参数,例:head -n 2 文件名,意思是显示头两行的内容,tail则是显示后两行的内容
3. Linux下的文件位置学习
pwd -可以查看 我 当前所在的位置
cd 文件名 -进入文件夹
cd .. -返回上一级文件夹
cd / -返回到 /
mkdir 文件夹名 -在当前目录下创建一个文件夹
mkdir 文件夹名/文件夹名/... -在指定的目录下创建文件夹
4. 基础命令操作和快捷键
4.1 对文件或文件夹的复制,移动,删除
有的时候文件的名字会很长,要想看他里面的东西会很浪费时间,所以linux提供了Tab补全功能。
已有文件夹名 abcdefghight
想要进入该名字长的文件夹 cd a 然后按Tab键会自动给与补全后面的名字,非常的实用。
还可以补全 里面的文件夹或文件 ,如下图:
当我正在输入ls时不想输后面的 内容, Ctrl + C 然后取消
top -持续查看系统各项指标 ,使用Ctrl + C取消
上下箭头可以查看自己刚才输入过的命令
有时候命令比较多,使用上下箭头找起来非常的繁琐,Ctrl + R组合键也是可以找之前用过的命令,不一样的是可以根据首字母来过滤查找
[root@localhost /]# 在这种情况下按 Ctrl + R 组合键 然后输入刚才用过的命令中的相关的字母就可以查找到,如下图:
文件的复制、移动和删除
- 复制
cp 要被复制的文件 被送到的位置 -文件的复制
cp -r 要被复制的文件夹 被送到的位置 -文件夹的复制,不是复制文件夹,而是只将文件夹下的内
test/* *是一个通配符,代表是“所有”
有的时候系统会提示让输入 y 确认操作,如果文件很多需要每一个都写一个 y 比较繁琐,所以在命令前面加上 可以避免这种情况,例如:[root@localhost /]# cp -r test/* java/
- 删除
rm 文件名 -删除文件
rm -r 文件夹名 -删除文件夹名
- 移动
mv 需移动的文件/文件名 移动到的位置 -移动操作中移动文件/文件夹都不要加 -r
4.2 查找文件,隐藏文件的概念
- 查找文件
find . -name 文件/文件夹名 -.代表当前目录下
find /etc/ -name "ifcfg*" -exec cp -v {} /root/aaaa.aa/
find 查找,-exec后面接上要执行的命令,{}代表的是前面被find找到的所有结果
等同于:
cp -v /etc/sysconfig/netword/ifcfg-* /root/aaaa.aa/
- 隐藏文件
Linux的隐藏文件就是说使用 ls 看不到的文件
创建一个隐藏文件 : touch .文件名 -就是在文件名前面加一个 . 即可
4.3 帮助信息,路径信息
4.3.1 帮助信息
- fdisk -l -查看本地的硬盘信息
-
帮助信息
- man ls -显示ls命令的手册 可以通过 /-F 进行,F是命令的首字母
- --help -等同于man
4.3.2 路径信息
Linux的结构是一个树的根状结构,登录之后,目录的起点就是在家目录即 “ / ”表示根。
绝对路径
从 / 开始,最终找到一个文件/文件夹所经过的这一段路线,叫做绝对路径,例如:/root/java/Java1/aa
相对路径
从当前的位置出发去访问文件,而不是从 / 出发。例如:当前在Java目录下,访问aa ls java1/aa
第二章 Linux必会的编辑器:Vim
1. vim编辑器的简单操作流程
vim 需要编辑的文件名
vim后进入的叫做控制模式,按 i 之后叫做编辑模式
编辑完成后按下键盘上的 :键,然后输入 wq 保存退出,然后回到命令行,编辑保存完成。
如果说vim后没有按 i 键(控制模式),然会 x 键可以删除当前光标处的字符。
2. 光标跳跃快捷键
快捷键 | 功能 |
---|---|
shift+^ | 快速到行首 |
shift+$ | 快速到行尾 |
shift+E | 向后大跳 大跳是按空格,其他忽略,所以跳的更大 |
shift+B | 向前大跳 |
E | 向后小跳 |
B | 向前小跳,小跳是以单词为单位,遇到特殊符号(- . 空格)就会跳跃, |
gg | 跳到文本最开头 |
shift+G | 跳到文本最末尾 |
Ctrl+F,Ctrl+B | 快速翻页 |
YY | 复制光标所在行,在控制模式下 |
P | 将复制的内容粘贴到光标所在行,在控制模式下 |
/ 或者 ? 要查找的字符 | /字符 从上往下查找,?字符 从下往上查找,...通配符表示一个字符,*通配符表示多个字符 |
%s///g | 在控制模式下,在前面两个 // 中间写上文本中要替换的字符,后面 // 中间写上替换为 |
- Vim 缓存文件的处理
如果编辑过程中突然断电,而文件没有保存下来,Vim有一种保护机制,当重新打开使用 vim文件名是会由一个 文件名.swp的文件
然后在使用的时候由需要的选项可以恢复,恢复完毕后需要删除.swp文件 rm .文件名.swp
3. 小巧编辑器:nano
这个编辑器跟vim编辑器一样可以编辑文件不过这个不需要选择模式,可以直接输入内容
nano 文件名Ctrl+O 保存内容Ctrl+X 退出Ctrl+G 打开帮助手册
第三章 Linux的用户和登录
3.1. Linux下的用户分类
3.1.1 无敌的root用户
在linux中,创建另一个新的用户需要操作系统的最高权限,就是root用户
[root@localhost /]# whoami --查看自己的用户身份,只输出账号名[root@localhost /]# id [用户名] --输出更多关于账号的id和组的信息
3.1.2 自己创建的用户
[root@localhost /]# useradd 用户名 --创建用户,如果说用户已经存在则不能重复创建,会提示:useradd: user 'usertest' already exists[root@localhost /]# passwd [用户名] --修改密码,不加用户名是修改当前用户密码[root@localhost /]# su 用户名 --切换当前登录的用户
3.1.3 系统用户的存在
-
Linux操作系统中存在三种类型的账号,每一种都有自己的单独用处
- root:至高无上的权限
- 普通用户
- 系统账号(nginx,ntp):不是给人用的,是给程序用的,这种账号默认是无法登录的,这两个账号不是自创的,而是在安装一些软件时,软件程序自动在Linux中创建的,一般情况下,这种账号不能拿来直接使用的,而是某些软件在运行时,由他们自己来使用。
3.2 Linux 用户账号的属性
3.2.1 第一个配置文件
Linux的账号管理系统就是遵从着配置文件,(通过vim修改passwd可以新增一个用户),所以说配置文件才是核心,而平时用的命令,其实也是围绕着这样的文件来工作。
3.2.2 用户和用户组的关系
- Linux中有组 (group) 和 附属组 (groups)- Linux下一个用户必须最少属于一个组,如果一个用户不属于任何组是不被允许的- Linux的用户第一个属于的组或者说第一个开始默认就属于的组叫做 主组。- Linux下用户还可以属于其他的组,可以同时属于N多个组,但是这些组只是这个用户的附属组。- 没有组的用户是不被Linux接受的
[root@localhost /]# vim /etc/group --可以在group配置文件中修改属组的信息
3.2.3 用户家目录
- 在创建一个新用户的 时候会在home文件夹下面创建对应的用户名的文件夹,如果使用 在 配置文件passwd中创建的用户需要手动在home文件下创建一个文件夹,否则无法切换且登录
3.2.4 从用户登录角度认识 bash
登录Linux其实就是登录了一个叫做bash的shell,也就是俗称的Linux的命令行。
- passwd 配置文件的最后一项可以查看登录的方式,vi,bash,nologin等
3.2.5 使用sudo来切换用户
之前一直使用 su 命令来切换用户登录,这种方式属于永久登录,相当于注销当前用户,换一个用户来使用。
sudo 是一个很有意思的命令,它可以临时切换成别的用户来执行任务,完成后立刻回到之前的用户。
[root@server01 ~]# sudo -u linuxuser ls /bin/bash/bin/bash[root@server01 ~]# sudo -u linuxuser lsls: cannot open directory :Permission denied
-u以什么用户临时运行,ls /bin/bash是要做的事情
Permission denied报错是因为当前目录是root,linuxuser没有权限访问
- 一个普通用户想查看硬盘,但/sbin/fdisk命令只有root用户才能使用,所以普通用户可以通过临时sudo root以root的身份来执行一次这个命令,用完奉还身份,不过需要root给予授权才可以。
给一个普通用户sudo到root的授权,附加这一行的意思是给linuxuser用户使用sudo的权利,而且可以用任何身份,运行任何命令,而且还不需要输入密码,对应中间的all=(all),nopasswd:all
[root@server01 ~]# visudo修改sudo配置文件在本文中搜索并找到这一段内容## Allow root to run any commands anywhereroot ALL=(ALL) ALL加上这一行内容## Allow root to run any commands anywhereroot ALL=(ALL) ALLlinuxuser ALL=(ALL) NOPASSWD: ALL 给予linuxuser授权
切换到root就可以临时执行成功了
3.2.6 Linux用户的密码管理
- 用root用户打开 shadow文件,看到很多的字母和数字,这个就是密码。
3.2.7 远程用户和本地用户的引入
- 本地登录:就是装着Linux的计算机/服务器,接上键盘显示器就可以输入账号密码登录的。
- 远程登录:没办法接键盘、显示器,只能通过网络的方式来远程登录。
不管是本地登录,还是远程登录,用的都是Linux的本地账号密码,也就是说同一个root管理员账号,本地登录也可以,远程登录也可以。
如果两个人用的都是root管理员,输入的账号密码一样,不过并不知道对方的存在,互不干扰,这其实就是突出了Linux的一大优势,就是真正的多用户管理模式。
第四章 Linux的权限机制
4.1 Linux的权限
4.1.1 Linux从文件的属性看起
4.1.2 属主和属组的概念
上面图片中,后半部分,两个root ,第一个代表这个文件夹是属于root用户一个人的;第二个root代表这个文件夹是属于root这个组的。
换句话说就是:就是这个/root/文件夹承认root用户是主人,同时还承认一个root组中的所有成员也都是主人。
假如一个文件夹确定了属主是某个用户,属组是某个组,那就是说这两个用户可以对这个文件夹为所欲为了?
4.1.3 权限位
- 位置1:决定是不是可以读,如果可以读就是 r ;如果不可以读就是 -
- 位置2:决定是不是可以写,如果可以写就是 w ;如果不可以就是 -
- 位置3:决定是不是可以执行,如果可以执行就是 x ;如果不可以执行就是 -
4.1.4 普通文件和权限位的关系
一个普通的文本文件,属主是 linuxuser,属组是 admin,linuxuser对应的权限是 rwx,也就是可读,可写,可执行;admin 组对应的权限是r-x,也就是,可读,不可写,可执行。
对于一个普通文件来说,如果有可读权限则可通过cat命令读取内容:
cat /home/linuxuser/1.txt --有可读权限才能这样看文件里的内容,可读权限指的是文件中的内容是否可以被访问到
如果有可写权限的可以通过 vim 进行编辑文件:
vim /home/linuxuser/1.txt --有可写权限的话,才可以编辑文件,并且允许你保存如果没有权限,Vim不让保存。
可执行权限,是针对Shell脚本而言的,有可执行权限才能被执行
可执行权限指的是如果这个文件是一个脚本文件,就必须得有可执行权限才能运行起来。脚本的意思就是一段代码,执行一段功能。
4.1.5 解读文件夹和权限位的关系
- 文件夹的权限与普通文件还是有一些差别的
对于文件来说,只有文件夹有可读权限才能通过 ls 命令访问这个文件夹下的内容
只有文件夹具有可写权限,才能在文件夹下进行 创建,删除,改文件名的操作
可执行权限,准确的说,就是不能进入这个文件夹,最直接的就是 cd 命令能不能用。
4.1.6 other其他用户权限是什么
其他用户权限,既不是属组,也不是属主,就算所是其他用户。
/root/ 文件夹的权限很严格,除了root用户外,其他的任何用户都没有任何权限。切换到 linuxuser 下测试,什么权限也没有(linuxuser 在这里就相当于是其他用户)。
4.1.7 修改权限
chown -R 属主:属组 用户文件夹 --chown命令配合-R可以一次性改变属主和属组。
chmod u=rwx g=rx o=r 用户文件夹 --u代表user,也就是属主,g代表属组的权限,o代表其他权限chmod a=rwx 用户文件夹 --a代表所有的权限包括属主,属组,其他还可以使用加减法,例如:u-w 表示去掉可写权限,u+w 表示加上可写权限。
4.1.8 用数字快速修改权限
规定:r = 4,w = 2,x = 0,-=0(没有权限就是0),然后用加法进行计算。
4.2 Linux权限的扩展
4.2.1 文件默认权限 umask
当在Linux下创建一个新文件或文件夹时,就算没有设定权限,也会自带一个默认权限,下图这种情况就是 umask 的原因。
umask 的值是 0022,第一个0不用管先,在Linux操作系统中,有初始最大权限的概念,文件是 666,文件夹是 777,这就相当于锁定一个初始值。
Linux当前的umask是022,用它做一个减法,把最大初始权限每一位分别减去对应的umask的每一位,例如:777-022的每位相减的结果是 755,所以创建一个文件的默认权限就是 755。
需要特别说明的是,如果是针对一个文件夹,就直接用减法就可以了。如果是针对一个普通文件,还是可以用减法,不过要分两种情况,
第一种情况,减法后的每一位都是偶数,这就是最终结果
第二种情况,减法后的任意一位是奇数,那么这一位奇数需要 +1。
可以通过 vim /etc/profile 命令来修改 umask 的值
4.2.2 文件的特殊权限位
linuxuser时一个普通用户,没有任何权限,但是修改了密码,也就是修改了 shadow 文件。
当找到passwd命令时,发现这个命令的属主权限中有一个是 s,这代表了普通用户linuxuser使用passwd命令时,系统看到passwd命令中属主属性有大写 S 后,表示这个命令的属主权限被linuxuser用户获得,也就是linuxuser用户获得文件 /etc/shadow 的root 的rwx权限。
一个普通用户linuxuser是没有权限直接修改 /etc/shadow 文件的,因为这个文件的权限是 --- --- ---,而linuxuser修改自己密码时使用 passwd 命令,等于说 passwd是一个桥梁。passwd 这个命令也是一个文件,也就是 /usr/bin/passwd,并且这个文件的属主权限中有一位 SGID。有了这个 SGID 后,当普通用户 linuxuser 调用这个 passwd 命令时,linux系统就去找这个 passwd 文件的属主,发现 passwd 文件的属主是 root 管理员,并且 root 对这个 passwd 文件有 rw 权限。所以说,root 用户对passwd 文件有 读/写权限,于是Linux 操作系统让 linuxuser 用户继承了 读/写 权限,并可以临时用在 shadow 文件上,这样普通用户就通过passwd命令修改了 shadow 文件。SGID 就是一个继承属组的关系。
如果说一个目录没有 SGID 权限时,在这个目录下创建的子目录的属组就是默认的用户属组
如果说一个目录有 SGID 权限时,不管是那个用户,在这个下面创建子目录都会继承上目录的属组。
第五章 在Linux操作系统下查看各种性能指标
5.1 Linux下硬盘相关情况
5.1.1 使用 df 命令快速查看硬盘状况
5.1.2 初识 Linux 下的硬盘和分区
- 在 Windows 下,一块硬盘被分成两个分区,一般是 C 盘、D 盘形式表示。如果想要访问这个分区,直接用鼠标双击就可以进去。
- 在 Linux 下,一块硬盘是不变的,有两个分区也是不变的。变化的是没有了桌面图标和鼠标。取而代之的是用一个目录作为分区的表示和入口。
5.1.3 Linux 下分区查看和访问
使用 fdisk -l 命令可以宏观地来查看当前有几个硬盘,几个分区。 上图 /dev/sda 就代表了一块硬盘,/dev/目录,之前学过操作系统都是文件,所以一个硬盘或者一个分区也都是用文件表示。而在 Linux 下,用来表示硬盘和分区(或者说是设备)的文件统一放在 /dev/目录下。
再来说 sda 代表什么,这里其实应该把这个词拆开来看:sd 和 a 。sd 代表这是一个 SATA 接口的硬盘(一般的个人计算机硬盘接口分为两种,即老式的 IDE 硬盘和新的 SATA 硬盘,现在基本上都是 SATA),而 a 在这里表示第一块硬盘,如果还有更多的硬盘,就会顺序地往下排列:sdb,sdc,sdd 等。
5.1.4 结合 fdisk 命令和 df 命令查看硬盘分区信息
上图中 df 命令的输出结果的左边第一列指的就是分区。
df 命令的输出结果的最右边一列,表示分区的入口在哪里。” / “ 也是一个目录,由于它是最开始的第一个目录,所以又叫他根目录。
df 命令输出结果的两个分区分别对应的入口一个是 ” / “,另一个是 ” /boot “,在执行 cd 命令时可以选择进入。
5.2 Linux 下查看内存
5.2.1 快速理解内存是什么
上图是 CPU 和内存、硬盘之间的关系。电影,电子书,游戏,听歌,这些电影,游戏,音乐都是统称为数据。所有的这些数据都是保存在硬盘中,因为硬盘的地方最大。
如果说要打游戏,会有上图一个简单的流程。
第一步: CPU 向硬盘发起命令,把所需的游戏数据先定位好,方便查找
第二步:游戏数据会从硬盘调入内存中
第三步:一边玩游戏,CPU 一边把每一步走棋都进行计算,把这些中间下棋的结果先暂停都存在内存中
第四步:不想玩的时候,在游戏中单机保存游戏,这样当前的战局结果会被存入硬盘中,想接着玩,会先从内存中读取上一次的结果。
说明
硬盘作为最大的容器,平时所有的内容都存在里面(大多数存的内容都暂时不用),不过它的速度最慢,所以 CPU 不可能一直跟它索要数据,不然 CPU 要等很久。 内存的容量比硬盘要小很多,但内存的速度比硬盘快的多。所以例如玩游戏,CPU 会大部分都只和内存互动,把中间产生的所有结果都先放在内存中,只有当单击保存游戏以后,这个结果才会被存回硬盘中。 一般的内存都不能永久存储数据,一旦突然停电,没有保存,那么当前你的游戏会全白玩,内存中的数据都丢失。 内存的好坏会直接影响计算机的运行速度。 为什么内存这么重要?因为内存的存取速度远远超过硬盘的速度,脱离了内存,计算机 CPU 就不能正常地存取数据,所以内存是直接影响计算性能的重要部件。 计算机部件运行速度排行为:CPU > 内存 > 硬盘
5.2.2 使用 free 命令快速查看 Linux 下的内存指标
free -h --查看内存指标
- total:指一共有多少内存
- used:正在被使用的内存
- free:完全空闲的内存
- shared:共享内存(几乎没有实际的用处)
- buffer/cache:缓存缓冲内存
- available:真是可用的内存
5.2.3 使用 free 命令查看内存的基本原理
> 简单举例说明,从汉代开始,中国的打仗就开始采用屯田制,简单地说就是:士兵们有战争时就去打仗,空闲时就去耕田,一举两得。对应到Linux的内存使用,其实跟这个例子比较类似。>> 休息的士兵:不打仗、不耕田,就在军营中天天吃饭休息。这一部分的士兵就是相当于 free 内存,也就是空闲的内存。>> 耕田的士兵:在地里耕种,也在给国家做着贡献,不过在国君的眼中,耕田的优先级远没有打仗的高,所以说这些耕种的士兵其实也是处于随时待命的状态,一旦前方战事吃紧,那么他们立刻可以换上军装去打仗,并不耽误。这一部分的士兵相当于 buffer/cache 内存。>> 正在打仗的士兵:就是在使用中的士兵,在前方厮杀忙得不可开交。这就是相当于 used,也就是忙中内存。>> 回头看,所谓的还有多少内存,其实就是休息的士兵+耕田的士兵总和就是随时可用的士兵。也就是 available 是真实可以用的内存, available = free + buffer/cache。>>
5.2.4 Linux 中的 cache 高速缓存
把 CPU 比作救火车,cache 比作蓄水池,内存比作拎水桶的用户,假设一个救灾用火的场景。灾区缺水,一辆救火车负责把大量的水运送给用户,而救火车用的是高压水枪,出水的速度极快无比,但是灾区的用户只能每个人拎着水桶来取水,如果救火车用高压枪直接喷给用户,那就变成洗澡,不是送水。
既然这样,救火车不得不大幅度降低自己的效率,把高压水枪的压力减到最小,慢慢地给用户出水,用户逐个排队来救火车、高压水枪这里取水,这样的话,救火车效率就变得极其低下,还有那么多受灾的地区,盼着救火车赶过去。
为了解决这个问题,如果在中间设置一个蓄水池,让救火车先把所有的水快速地冲入进去,然后救火车就赶去别处,而用户们自己再去蓄水池取水,这样问题就解决了。
CPU 的速度最快,内存速度远远赶不上 CPU(虽然内存比硬盘快的多,但跟 CPU 比起来还是太慢),那么 CPU 为了提高效率,就先把中间数据交给 cache 高速缓存,然后 CPU 把剩下的任务甩给 cache 缓存,自己就去忙别的,接下来,内存再到缓存中取数据。cache 可以理解为上面的蓄水池。
5.2.5 Linux 内存中的 buffer 缓冲区
buffer 叫做缓冲区,主要为了提高写硬盘的速度。
例子:樱桃大丰收,村里决定集体采摘,然后用大货车运到集市上去卖。假如每人每摘下来一个樱桃,就立刻送到卡车上去,效率太低。所以没人配备一个大箩筐,采摘下来的樱桃先放满一箩筐,然后再一次送到卡车上装车。这样就大大提高了效率,也缓解了村民的工作压力。
buffer缓冲区就是这个大箩筐,每当有大量数据要被写入硬盘时,把所有的零碎数据(一个个的樱桃),先统一放入 buffer 中,当buffer 积累到一定量时,再一次性写入硬盘。这样,既提高了效率,又大大地缓解了硬盘的压力。这就是内存中的 buffer 缓冲区。
总的来说,cache 为了高效率地读,buffer 为了高效率地写,这两种都是内存缓冲技术,也是 Linux 管理内存高效的重要标志。
[root@localhost /]# echo 3 > /proc/sys/vm/drop_caches --清理 cache 缓存
5.3 Linux 下查看 CPU 指标
5.3.1 什么是进程
一个正在跑着的应用就是一个进程。例如:在 win 上正用虚拟机学 Linux,而同时还戴着耳机听音乐。桌面最下面的任务栏里还开着浏览器,开着 QQ。这些都是正在运行的软件,不管你当前的注意力放在哪一个软件上,他们都是进程。在Linux下无法直观地看到进程。需要一些命令才操作。
- ping命令是一个用来检查网络通不通的小工具,不是 Linux 系统独有的,其他操作系统也都有的。ping 命令可以持续不断地往一个 IP地址上发送数据包,如果到达这个 IP 的网络是通的,那么就会如上显示。用ping命令后,就开启了一个持续不断运行的进程,它每秒钟发送一次,收回一次。
127.0.0.1 是一个 IP 地址,不过这个是本机的 IP地址。ping 127.0.0.1 等于是检查自己通不通,肯定是通的。
这样就开启了一个持续不断的运行的程序,也就是一个进程。ping 命令一旦开始运行后,当前的命令行就被它占据了,只能盯着看,不能做别的事,Ctrl + C 组合键可以终止这个进程。像 ping 这样,把当前使用的命令行或者窗口给霸占的进程,叫做前台进程或者是跟你直接互动的进程。
5.3.2 执行和观察后台
ping 127.0.0.1 >> ping.log & --(>> piing.log)把 ping 的输出信息,保存到一个文件中,& 当前进程放入后台进程,使用 >> 符号把内容放入文件又称作重定向。jobs --查看以 & 方式放入后台的进程,只能看到 & 放入后台的进程tail -f ping.log -- 可以不断追踪文件的末尾内容tail -f 的效果感觉就像看着 ping 命令输出一样,其实这是每一次 ping 后把一条输出信息存进去的效果。
jobs 命令显示出在后台的进程,并且一个进程前面都有一个进程号。 使用 【 fg % 进程号 】 就可以让这个进程回到前台。
5.3.3 使用 ps 命令观察 Linux 下用户自己的进程
ps 其实是process status 的缩写,意思就是进程状况。bash 意思是当前正在用的这个命令行,ps 其实是因为刚刚运行了 ps 命令。PID 是进程 id 的意思,在 Linux 中一个进程有独一无二的进程 PID。在只输入 ps (不加任何参数)的情况下,看到的结果输出是属于自己的,意思就是说同一台服务器上,张三输入 ps 后看到的是属于自己的进程。
5.3.4 使用 ps 命令观察 Linux 下全局的进程
ps -ef --查看整个操作系统的进程
PPID:父进程 ID 号
先有父进程,然后子进程是由父进程创建出来的,父子之间就有一种连带的关系、归属的关系。
STIME:进程启动的时刻。就是这个进程什么时间被开起来的。启动时间如果超过了 24 小时,就只能显示 年,月,日,不能显示具体是时分秒。
TIME:进程总共占用 CPU 的时间。
5.3.5 用令牌的形式计算 CPU 使用率
> CPU 整体的工作形式好像是公交车,走一站停一下上几个人,继续去下一站。 > > 在计算中,待处理的任务有很多,根据先来后到、优先级不同的原则,操作系统给这些任务合理地分配 CPU 令牌也就是时间片,有了令牌的任务,就好比是公交车有了乘客,那么公交车 CPU 到来的时候,载上指定的人数,然后继续往后面的站开。
假如现在 CPU 要处理三个任务(也就是三个进程),在 1min 的时间内,进程 01 一共使用了 10 + 10 = 20s 的时间,也就是说 CPU 为了进程 01,分配了 20s 的工作时间给他。那么在这 1min 的时间内,进程 01 的CPU的使用率是 20s / 60s * 100% = 33%。
其实,CPU 的使用率就是用时间累加的方式来计算。
5.3.6 top 命令查看 CPU 使用率
上下两部分是同时刷新的,默认情况下,每个几秒就刷新一次,如果连续按 Enter 键,也可以让 top 命令迅速刷新。
上半部分:显示 Linux 系统的整体状况,包括负载,进程数,CPU 使用率,内存等
下半部分:显示一个个的进程,跟ps命令相似,ps 命令更细致,这里是按照倒序排列,把当前使用资源最多的进程逐行显示出来。
第四列 82.1 id,id 代表的idle,即是空闲的意思。当前空闲 CPU 占了 82.1%,使用了 17.9%,代表的是整个 CPU 的平均使用率。
在 top 界面按一下数字 1 可以看到每一个核的使用率。
第六章 Linux管道符和重定向
6.1 神奇的管道符
管道符的作用就好比一个连接器,最终目的是修饰和改变原始的输出结果,负责把前面的输出结果递交给后面的修饰符,起着一个承上启下的作用。
如下图:命令行1执行后会有一个原始输出的结果,这个输出结果经过中间的管道符后,提交给后面的命令行2,命令行2 把之前的输出作为自己的输入,最终得到处理后的结果。
6.1.1 管道符做过滤器使用
- 过滤类型:就是从原本的输出结果中截取需要的一部分出来,其他的部分不要。例如:grep,还有 head,tail,awk等;
例一 : 管道符 + grep 实现行过滤
例二 :管道符 + head 和 tail 实现过滤开头和结尾的行
管道符与 awk 的连用
awk 是Linux 下的一个强大的文本处理工具,自身是一个命令,同时也是一个编程平台。
awk 取列之前,需要先定义如何分隔每一行,也就是用什么符号来分隔一行内容。 -F 参数就是用来指定分隔符,-F “ ” 就是按照空格来分隔,另外 awk 默认情况下就是按照空格分隔,所以 -F 省略可以不写。把一行内容分隔好之后,接下来就用表达式写出来,表达式就是后面的 ‘{print 1}’,其实 {print 1} 就是编程语句,为了方便就整合在一行中。
6.1.2 管道符做统计作用
统计,把cat输出的结果用管道符传给 wc 命令,可以得到所有结果的行数
排序,原本杂乱无序的内容通过管道符传给sort以后,可以实现基本的排序功能,sort 默认按照第一列来排序的, sort -rn 的作用是按照数字倒序排列,这样最大的数字会被排列在最前面。
合并同类项,有的数据文件内容会有重复的,可以使用 uniq -c 来合并相同的行,并且统计出数量,只能统计连续的数字,不连续的会被分成两个合并字段,如果想要统计一列数字的数量需要先进行排序然后在进行统计, cat test.txt | sort | uniq -c
6.1.3 管道符的扩展功能使用
6.2 实用的重定向
6.2.1 什么是重定向?
管道符是把前一个命令的输出传递给后一个命令,作为后一个命令的输入。而重定向 “ > ” 则是把一个命令的输出传递保存进入一个文件中。
实际操作:
注意:1. 重定向 “ > ” 会自动创建新的文件,不需要提前touch新的文件,如果删除文件再次执行重定向的命令文件又会被创建出来。
重定向 “ > ” 会完全覆盖文件原本的内容
6.2.2 追加重定向 >>
重定向 > 会完全覆盖一个文件原本的内容,追加重定向 >> 就是解决这一问题,再不覆盖原有的记录的基础上在下面追加新的记录。
6.2.3 Linux 标准输出和错误输出
平时在Linux下输入命令,按Enter键之后命令会被执行,这些命令在执行后没有任何提示,默默地把事情做好。
有些命令执行后会有输出返回的,可以看到:如下图
类似于执行完后返回来的信息,又叫做标准输出。标准输出简单地说就是命令执行成功后,返回来的正确输出。
相对于标准输出会有错误输出,执行一个不存在的文件会出错。
在Linux中,一个命令的输出有两种:标准正确输出和标准错误输出。错误的输出是不能使用 > 重定向的。
获取的错误信息的方法:2>,在 > 前面加2 可以重定向错误的信息到一个文件中。
第七章 Linux的磁盘管理、挂载和逻辑卷 LVM
7.1 Linux 的分区机制
7.1.1 Windows 与Linux分区的区别
在Windows通过鼠标单机盘符,来进入一个分区;而在Linux则是通过cd命令进入目录来进入一个分区,这就是两个操作系统最大的不同。
7.1.2 Linux的主分区,扩展分区,逻辑分区
使用 fdisk /dev/sdb 可以查看硬盘信息,也可以编辑硬盘,sdb是新创建的硬盘,接着输入 p 就会显示当前硬盘的信息,接下来输入 n 表示开始创建分区,不保存不会生效。
输入 n 之后系统会给出两个选择:
- primary:主分区 - extended:扩展分区
分区分类:
主分区:是最重要的分区形式,使用率最高。一块硬盘上最多只能建立4个主分区,每建立一个主分区,它都会占用一个编号,从 01 到 04逐一递增。如果需要超过 4 个分区需要用到扩展分区。
扩展分区:不受 4个的限制,其实扩展分区跟主分区一样都占用这4个位置的名额,扩展分区是可以继续划分出多个分区的,扩展分区内部再划分出来的分区叫做逻辑分区。
注意:不管主分区和扩展分区总数有没有达到4个,逻辑分区永远都是固定从编号 05 开始 。
7.1.3 实际操作建立各种类型的分区
创建一个分区
第一步:先输入 n,表示要创建新分区
第二步:紧接着输入 p,p代表是primary,对应上面的第一个提示。
p primary (0 primary, 0 extended, 4 free) ,代表这几个主分区,几个扩展分区,4个名额还有多少
第三步:输入 p 后按 Enter键后,如下,系统提示选择分区编号
Partition number (1-4, default 1): 这里分区编号是 1-4 ,可以在这里输入其中任意一个数字。如果不输入直接按回车就默认设定为1.
第四步:默认编号是 1
First sector (2048-10485759, default 2048):
sector 代表扇区,理解什么是扇区还要知道很多硬盘物理概念。例如:一个硬盘有多少磁道,盘面,磁头等,按照最简单的方式来理解,其实 First sector (2048-10485759, default 2048): 可以这样理解: 现在要创建一个新的分区,Linux在问我们希望把这个新分区分多大的空间,它给出的范围2048-10485759。这里可以理解Linux把这一块硬盘的总容量分成一个个的等份。
然后输入 p 就可以看到新的分区了
计算一下
512字节 * 10485759 = 5,368,708,608字节
1024字节 = 1KB
1024KB = 1MB
5,368,708,608 / 1024 / 1024 = 5,119.99951171875 MB差不多就是 5GB
由于操作系统的一些特性,一个硬盘、分区都做不到一个整数的容量。
第五步:分区设定好后并不会立即生效,需要 wq 保存一下
7.1.4 Linux 创建文件系统
已经创建好分区后没有文件系统是不能使用的。把刚创建的分区好比做是一个空教室,创建分区的最终目的是存储文件,把大量的文件好比做是一个个学生,学生没办法在一个空教室入座学习,需要给教室布置课桌椅,这些课桌椅就可以理解为分区的文件系统,有了文件系统后,学生/文件才能对号入座。
创建文件系统:mkfs.ext4 + 目标分区,ext4 指的是Linux文件系统的格式
执行完这个命令后文件系统就创建好了,还需要一个步骤 挂载 就能正式让分区投入使用。
7.2 Linux下的挂载机制
7.2.1 挂载概念
挂载就是把一个分区和一个文件夹关联起来,让这个文件夹成为分区的入口。卸载就是相反去掉这个关联。
7.2.2 快速 mount 挂载第一个分区
重新创建三个分区,分别指定文件系统。
已经创建的三个分区是 sdb1 sdb2 sdb3 ,然后创建三个文件夹 opt1 opt2 opt3
然后使用 mount 命令 先指定要被挂载的分区,再指定挂载到那个文件夹。然后使用 df 命令就可以清楚的看到三个分区已经被挂载到相应的文件目录下。
三个分区已经挂载好,但是如果机器重启的话就会白挂载了。所以必须还得有一种方法实现挂载永久化。
vim /etc/fstab --使用这个vim编辑这个文件,在文件最后添加3行,保存退出后,挂载就会永久生效
第一列:设备名称,也就是要被挂载的分区
第二列:挂载点,也就是希望挂载到那个文件夹
第三列:文件系统的格式,这个之前都是采用ext4文件格式
第四列:文件系统的参数,这里给予不同的参数,可以让挂载后的分区有一些特殊功能,一般设置defaults即可
第五列:备份参数,一般就设置 0 0即可。
7.2.3 卸载分区和冲突的解决方法
使用 umount /opt1/ 可以卸载指定的分区,
但是卸载一个分区后,仅仅是断掉和文件夹的关联而已。而分区中已保存的文件不会受到任何影响。
使用 umount 可以方便的卸载掉当前为使用的分区
如果当前分区另一个人正在里面编辑文件,则 umount 不能够立即卸载
解决这个冲突有两种方式:
正常关闭正在使用该分区的程序。即可卸载
找到并杀死使用分区的程序
lsof(8) or fuser(1) --通过文件找进程,也就说可以知道当前是什么程序,打开了某个 / 某些文件
通过 losf+管道符,可以过滤出正在编辑的文件的程序就是进行
lsof | grep 1.txtvim 4205 root 3u REGB,17 12283 34 /opt1/1.txt
其中第二列 4205 表示的是 进程ID /PID,可以通过 kill 掉这个进程来结束它,在执行 umount 就可以成功的卸载掉分区了。
kill 4205
7.2.4 硬盘不足的处理方法
一个分区再大,也有容量用完的时候。
例如:普通用户的家目录都在 /home 下,而 /home 分配了一个单独的分区 sdb1,这个 sdb1 分区有 800 MB,真个 sdb 硬盘有 3G。sdb1分区已经用完,需要进行处理
第一种方法:
先备份再重新分区,这种方法比较笨拙但相对稳妥,不易出问题。
步骤:
第二种方法:直接扩充分区 sdb1
步骤:
umount 卸载 /home 目录
fdisk 进入 sdb,删除 sdb1 并重新创建 sdb1 分区,要保证分区的起始点和之前一样,结尾点是到最右边。一个分区的扩容一定是左边起始点不变,而右边向右扩充
填充分区。原本的 sdb1 分区从 800MB 扩容到了 3000MB,也就是说出来了 2200MB 的空间,而原本的 800MB 中,已经有之前的数据,这个被保留下来。但后面的 2200MB 空间是一个全新的空间,这个空间不但没有任何数据,连文件系统也没有。
需要显示用命令 e2fsck -f /dev/sdb1 进行硬盘分区检验,通过后才能执行 填充
此时对分区的填充工作不能使用 mkfs.ext4命令(不然之前的数据会被清空),而是用一个新命令 resize2fs 来填充分区的文件系统。
7.3 Linux 硬盘相关扩展知识
ext4 是最新一代的 LInux 文件系统,ext4 之前还有一个发展的过程,最早的ext是最为一个不够成熟的,等到 ext2时 就变成了一个里程碑,称为Linux 的正规文件系统。然后 ext3 ext4 更多的被视为 ext2 的功能增强,但核心本质不变。
7.3.1 Linux 文件系统下的存放方式
Linux 下怎么存放文件,当然不是说随意扔进硬盘中存放,一个裸盘没有能力存文件,必须有一个帮手,这个帮手就是文件系统。
文件系统就好像是一个大管家,协助硬盘把所有的文件分门别类,有序地管理、存放起来。
Linux ext2 文件系统的基本核心是把文件分成 inode 和 block 两个部分来存放。现有一个文件 mylog.txt,在文件系统的眼中会把这个文件分成两个部分对待,第一个部分是这个文件的属性,第二个部分则是这个文件中的真实内容。
之前学习过文件的各种读、写、执行权限,也学习过文件的属主、属组,类似这些就是文件的属性。
属性会单独存放在一个地方,就是 inode。而文件的真实内容就是 Vim 编辑进去的内容。内容会单独存放在一个地方就是 bolock(也叫做块)。
7.3.2 以 inode 为核心的文件系统
inode 和block 的诞生之父就是格式化(创建文件系统),就是之前的标准做法,先用 fdisk 把硬盘做好几个分区,但这时分区都是空的 。
下面实验:对随便一个硬盘,然后随便分出去几个分区,分好之后,先不要执行 mkfs.ext4.
然后使用 dumpe2fs 命令来查看一个分区(硬盘)的文件系统信息。这里会提示找不到 superbolock,也就是说找不到正确的文件系统。
没有文件系统的分区,Linux 也不允许我们去挂载它,也就是没有办法正常使用
然后给 sdb1 创建文件系统
然后在使用命令 dumpe2fs /dev/sdb1 | less ,显示当前这个分区空闲可用的 inodes 和 blocks 有多少个。
dumpe2fs 给的信息太过详细了,如果只是要关注 inode 的信息,可以直接使用 df -i 来查看inodes的使用率。现在上图中 sdb1 分区总共有46837个可用inodes,在 Linux 下每创建一个新的文件,就要消耗一个 inode。当前分区最多可以让我们创建 46837 个不同的文件。
7.3.3 inode 和 block 的关系
文件的大小很容易知道的,block的大小需要用命令查看其大小:
dumpe2fs /dev/sdb1 | grep "Block size" --查看block大小
下面做个实例:
使用之前的 dumpe2fs 命令可以查看一个分区block大小,这个 4096 单位是字节,换算一下就是 4KB 的大小,既然一个 block 的容量是 4KB,那么如何知道一个文件具体占用了多少block。
先用 dd 创建一个 1MB 大小的文件,然后使用 ls 的特殊参数指定当前数据块大小是 4096 ,最后得到这个文件一共占用了 256 个blocks
一个文件系统中的逻辑块 block 的大小有限,也是固定的。当一个文件较大时,它会占用多个 blocks 来存储,然而这个文件对应的 inode 却只有一个。
假设有一个文件 1.txt,想去访问它,首先通过文件名还有所在路径找到这个文件对应的 inode 编号,在Linux文件系统中,inode和block都有编号,例如找到编号为 7 的inode,只找到 inode 是不行的,最终是为了访问文件的内容。编号 7 的inode中又记录了关联的几个 block 的编号,分别是 2,5,7,14,这样下来,文件系统就通过 indoe 找到所需要的文件块。
像Linux这样的文件系统,又称作索引式文件系统,特点就是稳定而高效。
7.3.4 Linux 下的 block group 和 superblock
在一个硬盘或者分区中,这么多的 inode 和 block 不会全部堆在一起的,会影响访问效率,而是要有规则地划分出组来。
一个分区创建好文件系统之后,就把所有的 inode 和 block 在逻辑上分成多个组,每个组都有自己独立的 inode 和 block。
使用命令
dumpe2fs /dev/sdb1
可以看到输出信息,可以清楚地看到分成多个 block groups
当所有的 inode 和 block 在文件系统中创建好之后,为了提高硬盘的访问效率就会被平均地分成多个组,每个组都有独立的 inode 和 block。
一个分区中有大量的 inode 和 block,然后又被分成了多个组,每个组自成体系,在分区中开始被挂载使用后,组下的各个成员都开始运作起来,需要一个东西来记录这些成员信息,这就是 superblock 的功能。superblock 超级块,本身也就是一个 块,只不过记录的东西与普通的块不一样。
通常一个分区中,第一个 block group 会含有 superblock,而后面的 block group 可能会有它的备份。虽然这个superblock 空间不大,却非常的重要,因为整个分区的核心信息都会记录在这个 superblock中,可以说没有 superblock 就没有这个分区的存在
创建完文件系统后 mkfs.ext4 /dev/sdb1 可以看到
7.3.5 Linux 下的硬链接和软链接
硬链接:
创建硬链接:
ln + 已有的文件 + 要创建的链接文件ln report.txt report注意:链接文件创建出来以后,硬盘的空间不会有丝毫的减少的创建一个硬链接,相当于是用一个新的文件名,并不是复制一个文件,而是用另外一个文件名指向到原本已有的 inode,再指向到原本已有的 block 上。block 没有被复制,所以才不会减少剩余空间。
软链接:
创建软链接:
ln -s 已有的文件 + 要创建的链接文件ln -s report.txt report创建一个软链接与硬链接的唯一区别就是多了一个参数 -s ,创建出来的软链接有一个 —> 箭头指向,箭头左侧是软链接文件,右侧是源文件
硬链接和软链接的区别:
软链接是首先创建出一个完整的文件出来,有独立的 inode,也有独立的 block。不过这个 block 里存在的内容比较特殊,存的是源文件的完整路径 “ /etc/ssh/sshd_config ”,软链接就是强行记录下源文件的所在地点和名字,然后直接导向过去。如果源文件被删除,软链接文件则变成无法访问状态。
硬链接由于是共享同一个 inode,所以它不能跨越分区,也就是说,硬链接只能在同一个分区中创建。而软链接则不同,它保存的是源文件的位置信息,所以无论跨区不跨区都一样,软链接比较像 windows 里的创建快捷方式
硬链接如果删除了源文件,不会受到任何影响,照样可以访问,而软链接由于仅仅是一个快捷方式,如果源文件不存在了,那么这个软链接文件也没办法访问。
7.4 逻辑卷 LVM 在线扩容
7.4.1 逻辑卷 LVM 是什么
在Linux 下,一个硬盘分好了区后,大小已经固定下来,不好改变,除非把这个分区卸载,然后删掉分区,重新利用剩余空间再创建一个更大的分区,如果这样做的话会有问题,就是如果有某个软件或进程正在使用这个分区的数据就必须把他们停下来才能卸载。
如果分区2只有1GB,不够用扩展2GB还是不够用了,硬盘已经没有地方扩容,再装上一个硬盘也是没有办法扩充的。
逻辑卷可以 海纳百川,这个 逻辑卷LVM 是可以随时随地创建出一个卷来的。
7.4.2 LVM实际操作
分区和硬盘打标签,分区和硬盘在融入逻辑卷之前必须先打个标签,这相当于是告诉 Linux 操作系统这些分区或硬盘将要加入逻辑卷中。给分区或硬盘打标签的方法很简单:使用命令 pvcreate + 设备名字。
创建大仓库,就是创建一个 LVM 卷组,使用 vgcreate + 仓库名字 + 多个设备,并把 sdb1、sdb2 都融入进去,仓库的总空间为 sdb1 + sdb2
创建好仓库后就可以从里面分出“空间”来创建一个卷,使用 lvcreate 命令来创建一个名字叫 mylv01 的卷,并且分配 1GB 的空间。命令 myvg01 代表从 myvg01 仓库中索取空间来创建卷。
然后使用 vgdisplay 可以查看 仓库已经使用 1GB 的空间,剩余 1.99GB 的空间。
给创建出来的卷创建文件系统(格式化),创建出来的卷等同于一个分区,所以说需要给他创建文件系统。注意:格式化需要到 /dev/myvg01目录下找到 mylv01
然后把这个卷挂载到一个目录上就可以使用了。
mount /dev/myvg01/mylv01 /optpv(物理卷),vg(卷组)
7.4.3 逻辑卷 LVM 自由伸缩在线扩充
假设 mylv01 的空间 1GB 不够,需要扩充,可以使用 lvextend 把卷 mylv01 进行扩充
lvextend -L +1G /dev/myvg01/mylv01
然后使用 df -h 查看的时候还是 1GB,少了一个步骤,就是 resize2fs ,用来把扩容出来的空间填补文件系统。
resize2fs /dev/myvg01/mylv01
如果仓库的空间也用完了,需要再给虚拟机添加另一块硬盘 sdc
添加好之后,先创建 pv
pvcreate /dev/sdc
然后用 vgextend(vg 代表卷组,extend 表示扩展的意思,就是扩展卷组)。用来扩充 vg 卷组,相当于添加新的硬盘或者新的分区进入大仓库中
vgextend myvg01 /dev/sdc
然后用 vgdisplay myvg01 命令就可以看到扩容成功了。
逻辑卷的扩充是绝对安全的,但是逻辑卷的缩小是有风险的,因为一个硬盘中的数据(block 块)分布并不是一个挨着一个的,也有可能分散这使用,如果把一个正在使用的卷缩小,很有可能造成数据的错位或者丢失。
第八章 Linux 下安装软件
8.1 Linux 连网
8.1.1 虚拟机连接桥接网络
点击高级配置 MAC 地址
然后重启虚拟机就可以生效了
8.1.2 配置网卡获取动态 IP
桥接网卡配置好后,需要配置Linux 的 IP 地址
DHCP 的功能(一般家用的路由器都有)可以自动分配 IP 地址。
网卡配置文件:
cd /etc/sysconfig/network-scripts/
找到 ifcfg 开头的文件
第一个是是需要修改的网卡文件,第二个是本地回环接口。
使用 vim 编辑器编辑 ifcfg-eno16777736 这个文件
- BOOTPROTO=dhcp 让网卡迎合 DHCP,自动获取 IP 地址
- ONBOOT=yes 是开机后网卡自动启动。
修改好两条后需要让网卡重启,让新的配置生效:
service network restart重启后使用 ifconfig 可以看到获得的 IP 地址。
8.1.3 常用网络命令并检查上网成功与否
ping 命令
用ping命令后,每一次都执行,说明网络连通了。
curl -I www.baidu.com
这个命令可以被看做命令行下的简易浏览器,相当于使用浏览器来访问百度的首页,http返回码,200就代表访问成功了
不过 curl 毕竟是工作在命令行上,不能像真的浏览器那样展现网页,仅仅输出一部分信息。通常用来测试使用看看某个网页是否可以正常打开
wget + 下载地址
Linux 常用的下载命令,可以将指定的文件下载到本地,除了下载文件外,也可以用来下载页面
8.2 Linux 下的 RPM 包管理
8.2.1 软件安装
软件的安装绝大部分内容其实是文件的复制,也就是说,把安装包的拆出来的准备好的源文件,按照指定的目录复制到操作系统中,之后再单击一个开始之类的文件。
Linux 下,软件的安装与 Windows 大同小异,也是把准备好的源文件从安装包中取出,然后放到 Linux 的某条路径下面就可以使用了,简单的 ls 命令可以执行,也是一个软件。
8.2.2 Linux 下软件安装的三个方法
源代码编译安装
网上找到源代码,下载后,保存到一个文件中,然后自己编译,gcc 文件名,把可执行文件做出来然后放到Linux中的合适位置。
RPM 包安装
先在网上查找需要的 RPM 包,打包形式,通常是把已经编译好的可执行文件放在包中,下载后即可安装,方便快捷。不便修改,有依赖性
Yum 安装
底层走的是 RPM 包安装,这种方式更自动化,懒人化,非常方便。
8.2.3 RPM 包
RPM 包特点:是一种文件,只不过是一种打包文件。每个包中都包含了不同的文件(可执行文件,普通文件等);一旦 RPM 包安装到 Linux 系统中,就等于注册进去了,Linux 会记住所有的安装上的RPM包;假设一个 RPM 包中包含 A,B 两个文件,当 RPM 包被安装后,RPM 包和 A,B 两个文件会始终保持这一种连带关系。也就是说,无论何时都可以查到 A,B 两个文件来自 RPM 包。
使用 rpm -pa 命令可以查看Linux 下安装了那些 RPM 包,总共安装了多少个。会列出很多
使用管道符命令:rpm -qa | wc -l ,可以统计总共的数量。
查看文件和 RPM 包的关联
使用命令:rpm -qf +文件,命令就可以知道这个文件来自那个 RPM 包,这就是所谓的确认 RPM 包和文件的连带关系。
使用 rpm -ql +完整的 RPM 包的名称,可以查看这个已安装的 RPM 包中包含了那些内容。
运行后会有很多的文件,就不一一截屏了。
其中有大量的 /bin/ 下的各种常用命令,/usr/bin/下的命令,/etc/下的一些配置文件和脚本等。RPM 包就像一个 Linux 的基础命令包。
命令:rpm -qi +完整的 RPM 包的名称,可以查看包的总体的概述信息,版本,日期,发行商,描述,网站等重要信息。RPM 就是 CentOS 下的一个基础 Shell 命令包
8.2.4 快速安装和卸载 RPM 包
网址:centos.pkgs.org,这个网址可以下载需要的 rpm 包
-
安装
rpm -ivh 文件名.rpm
-
卸载
rpm -e 文件名.rpm
-
升级
rpm -Uvh 文件名.rpm
-
压缩文件,.tar
tar -cvf 文件名.tar
-
解压缩
tar -cvzf 文件名.gz
8.3 Yum 安装
RPM 安装一些小软件,小工具还好,如果安装一些大型的软件,头疼的就是 RPM 包的依赖关系。Yum 工具本身就是为了自动解决 RPM 包的依赖关系。
快速安装:
yum -y install 文件名
yum install 软件名这个命令只需要看结果,会展示一个总体的信息,要安装多少个包,同时依赖多少个包,总共下载/安装的大小是多少,如果觉得没问题,最后输入 y 就可以开始安装。开始安装,会先把所有需要的 RPM 包一次下载,然后参照依赖关系逐个开始安装的。
8.3.1 Yum 查询,升级,删除
查询
yum search vim
Yum中,如果想要搜索一下能不能安装 vim,则不需要输入完整的名字,只需输入近似的软件名称即可
删除
yum remove vim
8.3.2 Yum 源
Yum 其实没有想象中的很智能的去网上找相应的东西,它是到指定好的仓库中寻找软件,如果仓库中没有,也就没办法安装。
这种 Yum仓库也称为 Yum 源,就是Yum安装软件的源头。
vim /etc/yum.repos.d/CentOS- --这个命令查看仓库的源头里面的文件必须是以 .repo 结尾的,在打开相应的 .repo 后会有各种类型[base]:这个中括号代表一段配置的开始,下面这些都属于这一段配置,也叫做容器。里面的名字可以自定义,但不能有两个相同[]存在。name:只是注解,可有可无mirrorlist:列出这个容器可以使用的镜像站点baseurl:这个最重要,因为后面的网址就是 Yum 真正去到的地址enable:1 是启动,0 是关闭。
第九章 Linux 下的计划任务和时间同步
9.1 什么叫计划任务
计划任务:就是有计划地去做一项任务,其实计划任务是到了固定的时间点,让机器自动去做制定的任务;
9.1.1 crontab 的快速实例入门演示
Linux 下最常用的计划任务软件叫做 crontab,软件的名字,本身也是命令的名字。
实例:
指定一个任务,每天早上 8:00 时,检查一下硬盘调 容量,并且记录下来
执行 crontab 命令
crontab -e
命令执行后,会进入一个 vim 文档编辑的界面,在这里输入一下内容:
0 8 * * * df -h >> /tmp/df.log
保存退出即可,计划任务指定完成。
说明:Linux 下的 crontab 计划任务是按人头划分的,每个用户都可以定义自己的计划任务,默认情况下,彼此之间是看不到的,也无法修改别人的计划任务,除非是 root 用户权限
执行 crontab -e 后,就等于是“ 进入自己的计划任务编辑模式 ”,其实就是 vim 打开了 /var/spool/cron/下的一个文件,这个文件就是用来保存每个用户的计划任务,按照用户名来记录。
任务的编写格式:
0 8 * * * df -h >> /tmp/df.log
前半部分由 5 部分组成,按照从左到右的顺序分别代表 分,时,日,月,周
- 分:相当于是钟表的分针,代表第几分的意思
- 时:相当于是钟表的时针,代表第几个小时的意思,这里的是 0 点到 24 点
- 日:也就是日历中的几号
- 月:也就是日历中的几月
- 周:周一,周二,... 周日
- *:代表是任意,不管是几月,几号,几周,只要到了前面的时间就执行 某 任务,也就是等于一年 365 天,天天到点执行该任务
11.1.2 如何缩短 crontab 的时间间隔
crontab 中最小的单位是 1min,这个是硬性规定的,所以需要用新的命令来实现所要的功能。
sleep2 ; ping www.baidu.com --分号功能:先执行分号左边的语句,然后再执行分号右边的语句,这一行是输入完按Enter键后暂停 2s,然后才开始 ping
首先,最终目的是让 crontab 实现 10s 一次地执行命令 A,6 行命令 * * * * *,也全都是执行同样的命令 A
假设 现在时间是 14:00:00,计划任务启动,这 6 行任务既然都是每分钟执行一次,那么他们就会被同时触发,也就是说到了 14:00:00的时候,命令 A 就在这一瞬间被同时执行了 6 次
不过,有 sleep ,所以每一行执行都会被延迟执行,例如,第一行的命令 A 会在 14:00:00 就被立即执行,第二行的命令 A 会执行等待 10s ,10s 后才会执行命令 A。这样 虽然 6 行命令都被同时执行,但是后一行会在前一行运行过 10s 后,才会运行,这样如此循环就实现了每 10s 一次的计划任务。
tail -f /root/sleep.log -- 这个命令可以通过 date 验证是否10s 执行一次
9.2 时间同步的引入
9.2.1 认识时间同步的重要性
游戏中的大区,还有跨服对战区等,其实从技术的角度出发,游戏中所谓的不同大区,也就是不同的服务器,同一台服务器上的玩家们是再同一个区的。
跨服对战区是一种处在中间的临时区域,只有在开启跨服对战时,两个不同大区的玩家才会凑到一起比武较量
假设晚 21:00 有一场跨服大战,报名截止 20:50,由于服务器上的时间没有同步,导致每台服务器时间不一样,玩家游戏画面中的时间自然也就不一样。
这种情况下,第一区的玩家时间还处在 20:30,有些玩家还没有到报名时间,而另一个区的玩家时间是 20:50,准备进入了,可是战场服务器的时间却已经是 21:10,已经开始 10min 了。所以服务器时间的不统一,会造成很尴尬的后果。
9.2.2 时区和时间的设置
使用date命令后
CST:代表时区,每个国家所处的地理位置不同所以每个国家的时区会不同的。例如:日本时间 12:00,北京时间时差 1h,所以 12:00-1h就是当前北京时间。时区的不同可以通过 + - 的方法来推算时间。
EDT:是美国东部夏令时时间
CST:是 China Standard Time UT+8:00,是美国时区
timedatectl set-timezone Asia/Shanghai --设置为上海的时区然后通过 date 命令修改时间 date -s "2020-11-26 09:03:00"
这样设置并不是十分准确的,所以用另一种更高级的方法来同步时间:
ntpdate 0.asia.pool.ntp.org -- ntpdate + 时间服务器名字(IP地址)
网上有很多的 NTP 服务器,全程 Network Time Protocol,即网络时间协议,是用来使计算机时间同步的一种协议,以一个 NTP 服务器上的时间为准,把自己的服务器跟他进行同步,来校正我们的时间,网页搜索即可得到NTP服务器。
9.2.3 用 ntpdate + crontab 实现时间同步
ntpdate 仅仅是当时同步一次
0 */2 * * * ntpdate 0.asia.pool.ntp.org || ntpdate ntp1.aliyun.com -- 可以使用计划任务,2h执行一次时间同步
|| 是一种运算符号,叫做 逻辑或 运算,功能:如果左边命令执行成功了,就用不着在执行右边的命令;如果左边的命令执行失败了,那么就要执行右边的命令。
第十章 Linux 运行级别管理
10.1 CentOS 7 Linux 运行级别管理
10.1.1 Linux 运行级别的概念
CentOS 刚刚启动的时候,会先选择一个运行级别,然后再按照这个级别来启动系统
运行级别:理解为一种模式,方法,以某一种方式来启动 Linux 操作系统,不同的运行级别下的系统,调用的服务种类和数量各不相同,所以说就会呈现出不同的使用环境。
0 2 4 6 几乎不被用到,不是重点,1 3 5 中 3 的使用率最高。
10.1.2 图解
运行级别1:又叫单用户模式,Linux 操作系统不管怎么稳定,还是有遇到系统出问题的时候,如启动不起来等问题,单用户模式也可以认为是紧急救援模式,这个模式下,Linux 操作系统的很多功能会被暂时关闭掉,只启动一部分重要的功能,让用户快速进入 Linux 操作系统,然后再进行修复
运行级别3:又叫做完整多用户模式,这种模式下,除了图形界面没有以外,其他的功能都是一应俱全的,所有工作都在命令行
运行级别5:图形化模式,完整的功能,这种模式下,一开机就会直接进入图形界面,不进入命令行,图形界面也可以进入命令行,而且命令行的外观很好看。一般服务器不会用5来启动,因为图形界面对于互联网上的服务器来说毫无用处,很浪费硬件资源。
10.1.3 查看和修改运行级别
cat /etc/redhat-release -- 查看当前系统版本systemctl get-default --查看当前系统的默认运行级别,默认级别:不会立刻生效,只有在下次重启系统时,才会生效runlevel -- 当前运行模式 5,5 3意思是之前运行级别不知道,现在运行级别是 5
systemctl set-default multi-user.target -- 修改为 运行级别 3
修改了默认级别不会立刻生效,必须等下一次重启
如果不想重启切换需要用一下两个命令:
systemctl isolate multi-user.targetinit 3
第十一章 SSH服务
11.1 基本概述
11.1.1 C/S 模型
左边是客户端,作为请求的发起方;右边是服务器,作为被访问的一方。
11.1.2 SSH 客户端
ssh 客户端其实就是一个软件或者是一个 ssh 命令
三种准备客户端的途径:
11.1.3 SSH 登录远程机器
ssh +用户名@IP地址 --用户名和 ip 地址都指的是 SSH 服务器端的。也就是目标机器上的。
第十二章 服务与进程实体化
12.1 Linux 操作系统的启动流程和 init 进程
12.1.1 Linux 开机启动流程
Linux 操作系统中,不管软件还是命令还是服务脚本,都是一个个的脚本,用过就消失了。
Linux 中是 systemd 启动进程。
单击开机按钮,就是给计算机通电
一台计算机是由多个零件拼凑成的,通过 BIOS(输入输出系统) 发现 CPU,内存,硬盘,网卡,主板拼凑
主要两大功能:检查和发现所有硬件设备以及找到硬件的一个起点(也就是引导设备),也就是操作系统存在硬盘上,所以就是要先找到硬盘作为第一个启动,把硬盘作为起点
硬盘作为起点,但上面数据太多,MBR 是硬盘加载后第一个被读到的数据。里面记录着整个硬盘的分区,就是让计算机先大体了解一下硬盘的整体框架,知道了框架后,才能开始读其他的数据
通过 MBR,计算机大体了解了硬盘的框架,接下来是读数据,硬盘上的视频音乐对启动系统是无用的,只有和操作系统本身相关的数据才是计算机急需的。
所以需要一个引导程序,由它来负责找到操作系统的准确位置,这个引导程序就是 GRUB
GRUB 作为引导程序,最终目的是找到操作系统,GRUB 下一步会引导到 Linux 内核,平时说的操作系统 Linux,其实 Linux 这个词原本指的就是它的内核 kernal,或者说是 驱动程式,而驱动是为了调度所有计算机硬件而存在的,只有内核才能称作 Linux,后面启动的命令行、图形界面、各种服务、工具其实是 Linux 的附属品,所以 GRUB 的下一步是引导内核启动,也就是启动 Linux
Linux 内核启动,平常使用的各种工具服务都是进程,所有的进程都要有一个统一的起点,init 是作为Linux 操作系统启动的第一个程序,后续各种服务进程其实都是被 init 再启动起来。
12.1.2 第一个启动的进程 systemd
init 是一个统称,作为第一个启动的程序,这个 init 程序从 Linux 诞生开始就在不断地更新,目前新一代的 init 系统叫做 systemd。
init 程序在不断发展中有很多的版本。
systemd 是最新一代的 init 程序。
-
查看 systemd
进程 PID 是 1,说明是头一个进程,老版本的 CentOS 第一个进程叫做 init
ps -ef | grep systemd
pstree -- 把 Linux 下面所有进程按照一个树形结构显示出来,进程比喻成 树枝
12.2 CentOS 7.x 专属服务管理器 systemd
进程是操作系统的最小组成单位,太多进程混在一起的话不容易识别,于是有了服务的概念。服务:就是把某种特定的进程或者一些特定的进程包装一下,变成更容易读懂的形式。
systemd 既可以代表 CentOS 7.x 的第一个进程,同时也是 CentOS 7.x 的一个独特的服务体系框架。
12.2.1 systemctl 探索 systemd
systemd 是CnetOS 7.x 的第一个进程,是所有其他进程的父进程。其实 systemd 更多的功能是管理和维护,也就说 Linux 完全开启后,systemd 会维护着整个系统下的进程或者说是所有服务。
第一行 systemd Utilities 意思是 systemd 的自带工具,有了这些工具,可以轻松地访问 systemd。这些工具中,systemctl 是 systemd 最重要的命令。systemctl 可以轻松访问 systemd 发送指令,让 systemd 去做各种各样的工作
list-units:展示出单位,--type=service 指定类型是服务的
上图输出太多有删减,systemctl 展示了 systemd 下管理的所有服务单位 Unit
在 LInux 下的所有的进程,服务,配置等这些元素统称为 Unit,也就是一个单位。
这些单位被赋予了不同的类型。上图中显示的单位类型都是 service名称中用后缀表示
所有的服务都被抽象成一个个的Unit单位。
12.2.2 用systemctl 来探索服务的背后
用 systemctl 向一个服务发出指令,例如:启动,停止,重启一个服务
systemctl cat + 服务名称 -- 可以查看一个服务的详细信息
ExecStart=/usr/sbin/sshd -D $OPTIONS当执行 启动ssh服务的时候,发生的动作,可以看出,启动SSH服务其实就是运行了一个sshd的命令ps -ef | grep sshd -- 查看 sshd,SSH服务的背后就是一个进程root 5198 4708 0 08:35 pts/0 00:00:00 grep --color=auto sshd
systemctl status + 服务名称 -- 用来查看某一个服务当前的状态
systemd 提供的另一个重要工具:journalctl,用来统一记录 systemd 中所有的 Unit 的日志信息,方便进行排错。
journalctl -xe -- 显示信息
12.2.3 systemd 的启动项设置
在 Linux 中设置一个启动项非常重要。
systemctl enable sshd.service -- 在开机时启用服务systemctl disable sshd.service -- 在开机时禁用服务
systemd 下的服务如果想启动起来,必须有对应的文件,否则手动自动都启动不起来
systemd 下的服务配置文件都保存在 /usr/lib/systemd/system 下,然而 Linux 本身启动只关注另一个目录:/etc/systemd/system,所以,要想启动需要将配置文件放于两个文件夹中,两个文件不必要各放一个,创建一个软链接即可。
看看那些服务是开机启动的
systemctl list-unit-files|grep enabled
12.2.4 target 运行级别
其实 target 代表一组 Units,就是实实在在的东西,例如:一个 SSH 服务,一个 VSFTR 服务,target 就是特定的很多个 Units 拼成一组。
systemd 下的一个服务想让他启动就得在 /etc/systemd/system 下创建一个软链接,然后用 ls 命令查看是找不到 sshd.service 的软链接
用 find 命令可以看到:
sshd.service 是有的,只不过存在于一层子目录下面:multi-usr.target.wants,说明 sshd.service 包含在 multi-user 这个 target 组中。开机启动 multi-user 组顺带就会把 sshd.service 也给启动了。在定义一个 systemd Unit 时,它的配置文件中会指明这个 Unit 属于那个 target。
所谓的运行级别,不过指的就是一个 target 组设置成开机启动,下面用 systemctl 显示所有的 Units,并指定 Unit 的类型为 target
第十三章 基础网络知识
13.1 认识网络
13.1.1 认识小规模的网络
所谓的计算机网络就是计算机和计算机的通信,一台计算机叫做单机,两台计算机通过一根网线连接起来就可以称为网络。
13.1.2 最小局域网
局域网指的也就是可以自行搭建的,计算机数目在几台到几十台左右的网络。
13.2 逐步深入
13.2.1 网段和子网掩码
一个 IP 地址需要依靠子网掩码来区分网络位和主机位,子网掩码就是其中的 255.255.255.0,这个子网掩码的三个 255 指定了 IP 地址的前三位是网络位,最后一位是主机位。
网络位相同的情况下,就是同一个网段的 IP 地址,可以直接通信,如果不是同一个网段的 IP 地址,不能直接通信。在同一网段中(网络位相同的情况下),每台计算机的主机都只能是唯一的,如果出现两个一样的就会出现网络冲突。
-- 查看子网掩码ifconfig ip a
13.2.2 路由器
- 不同网段的 IP 地址需要借助网络设备(路由器)进行通信。
13.2.3 网关和路由功能
四台计算机都是不同网段的 IP 地址,然后每一台计算机都连接到路由器上的一个网口,这个网口跟直接连接的计算机处于同一个网段(例如:计算机 01 是 192.168.0.100/24,那么网关 1 是 192.168.0.1/24,处在同一个网段中)
这样计算机和网卡就可以直接通信,把数据先传送到网关上,然后由于路由器本身有路由功能,路由功能就是转发网络数据包,于是不同网关之间就可以相互传递,实现了不同网络的通信。
- 实现路由功能的未必一定是路由器,可以是一台Linux 服务器,一台多网卡的 Linux 服务器可以充当路由器使用,需要一些配置。
13.2.4 私网和公网
私网可以理解为封闭,小型的局域网,机器数比较少,使用都是私网 IP(如:192.168.×× 或 172.16.×× 等),私网也可以称作内网,
私网只要有计算机,网线,有基本的网络设备就可以自行架设,公网不可以,必须依靠专门的接入商给我们分配公网 IP ,公网的网关才能进入。
13.2.5 域名和DNS服务器
IP 地址是不容易记忆的形式,用一种方法来修饰 IP 地址就是域名,DNS 服务器也叫做域名服务器,是用来翻译和转换域名与 IP 地址。
当我们访问某一个网址的时候,会先拿着这个网站的域名去询问离我们最近的 DNS 服务器,它在自己的数据库中查询记录,然后把最终 IP 地址告诉我们,最后,再用 IP 地址去访问到真正的网站,这个过程中用户是感觉不到的,输入一个域名直接打开一个网站了。
13.2.6 TCP/IP 协议
我们平时接触的网络大多数都是宏观的,例如:打开一个网页,发送一封邮件,配置一个 IP 地址等等,这些操作发生时,其实背后都是 TCP/IP 协议在运作,只是一般情况下看不到。
互联网非常的庞大,又没有中心的载体,有着无数条网络线路,也有着无数台大大小小的服务器还有个人计算机。如果想访问一台国外计算机ping了一下需要经过少则几十个多则几百个路由器,中间错综复杂,而且网络还时刻发生变化,保证每一次网络通信的就是 TCP/IP 协议了。
协议:就是一种事先规定好的条款和规范,不管一个网络架构怎么样,只要数据在传输时,严格遵循某一种协议规范,那就必然可以顺利到达彼岸。