第二课:《Linux就该这么学》课堂笔记
“工作马马虎虎,只想在兴趣和游戏中寻觅快活,充其量只能获得一时的快感,绝不能尝到从心底涌出的惊喜和快乐,但来自工作的喜悦并不像糖果那样—放进嘴里就甜味十足,而是需要从苦劳与艰辛中渗出,因此当我们聚精会神,孜孜不倦,克服艰辛后的成就感,世上没有哪种喜悦可以类比”。——稻盛和夫
“更何况人类生活中工作占据了较大的比重,如果不能从劳动中、工作中获得充实感,那么即使从别的地方找到快乐,最终我们仍然会感到空虚和缺憾”。——稻盛和夫
————————————————————————————————————————
学习重点:
第一章 部署虚拟环境安装Linux系统
1.1 准备您的工具 |
1.2 安装配置VM虚拟机 |
VM虚拟机软件为用户提供了3种可选的网络模式,分别为桥接模式、NAT模式与仅主机模式。这里选择“仅主机模式”:
Ø 桥接模式:相当于在物理主机与虚拟机网卡之间架设了一座桥梁,从而可以通过物理主机的网卡访问外网。
Ø NAT模式:让VM虚拟机的网络服务发挥路由器的作用,使得通过虚拟机软件模拟的主机可以通过物理主机访问外网,在真机中NAT虚拟机网卡对应的物理网卡是VMnet8。
Ø 仅主机模式:仅让虚拟机内的主机与物理主机通信,不能访问外网,在真机中仅主机模式模拟网卡对应的物理网卡是VMnet1。
把USB控制器、声卡、打印机设备等不需要的设备统统移除掉。移掉声卡后可以避免在输入错误后发出提示声音,确保自己在今后实验中思绪不被打扰。
1.3 安装您的Linux系统 |
安装RHEL 7或CentOS 7系统时,您的电脑的CPU需要支持VT(Virtualization Technology,虚拟化技术)。
所谓VT,指的是让单台计算机能够分割出多个独立资源区,并让每个资源区按照需要模拟出系统的一项技术,其本质就是通过中间层实现计算机资源的管理和再分配,让系统资源的利用率最大化。如果开启虚拟机后依然提示“CPU不支持VT技术”等报错信息,请重启电脑并进入到BIOS中把VT虚拟化功能开启即可。
1.4 重置root管理员密码 |
平日里让运维人员头疼的事情已经很多了,因此偶尔把Linux系统的密码忘记了并不用慌,只需简单几步就可以完成密码的重置工作。但是,如果您是第一次阅读本书,或者之前没有Linux系统的使用经验,请一定先跳过本节,等学习完Linux系统的命令后再来学习本节内容。如果您刚刚接手了一台Linux系统,要先确定是否为RHEL 7系统。如果是,然后再进行下面的操作。
[root@linuxprobe ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.0 (Maipo)
重启Linux系统主机并出现引导界面时,按下键盘上的e键进入内核编辑界面。
在linux16参数这行的最后面追加“rd.break”参数,然后按下Ctrl + X组合键来运行修改过的内核程序。
大约30秒过后,进入到系统的紧急求援模式。
依次输入以下命令,等待系统重启操作完毕,然后就可以使用新密码linuxprobe来登录Linux系统了。命令行执行效果如图1-49所示。
图1-49 重置Linux系统的root管理员密码
mount -o remount,rw /sysroot
chroot /sysroot
passwd
touch /.autorelabel
exit
reboot
1.5 RPM(红帽软件包管理器) |
在RPM(红帽软件包管理器)公布之前,要想在Linux系统中安装软件只能采取源码包的方式安装。
RPM机制则为解决这些问题而设计的。RPM有点像Windows系统中的控制面板,会建立统一的数据库文件,详细记录软件信息并能够自动分析依赖关系。表1-1是一些常用的RPM软件包命令。
表1-1 常用的RPM软件包命令
安装软件的命令格式 |
rpm -ivh filename.rpm |
升级软件的命令格式 |
rpm -Uvh filename.rpm |
卸载软件的命令格式 |
rpm -e filename.rpm |
查询软件描述信息的命令格式 |
rpm -qpi filename.rpm |
列出软件文件信息的命令格式 |
rpm -qpl filename.rpm |
查询文件属于哪个RPM的命令格式 |
rpm -qf filename |
1.6 Yum软件仓库 |
尽管RPM能够帮助用户查询软件相关的依赖关系,但问题还是要运维人员自己来解决,而有些大型软件可能与数十个程序都有依赖关系。Yum软件仓库便是为了进一步降低软件安装难度和复杂度而设计的技术。Yum软件仓库可以根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包并安装到系统。Yum软件仓库的技术拓扑:
图1-50 Yum软件仓库的技术拓扑图
表1-2 常见的Yum命令
命令 |
作用 |
yum repolist all |
列出所有仓库 |
yum list all |
列出仓库中所有软件包 |
yum info软件包名称 |
查看软件包信息 |
yum install软件包名称 |
安装软件包 |
yum reinstall软件包名称 |
重新安装软件包 |
yum update软件包名称 |
升级软件包 |
yum remove软件包名称 |
移除软件包 |
yum clean all |
清除所有仓库缓存 |
yum check-update |
检查可更新的软件包 |
yum grouplist |
查看系统中已经安装的软件包组 |
yum groupinstall软件包组 |
安装指定的软件包组 |
yum groupremove软件包组 |
移除指定的软件包组 |
yum groupinfo软件包组 |
查询指定的软件包组信息 |
1.7 systemd初始化进程 |
Linux操作系统的开机过程是这样的,即从BIOS开始,然后进入Boot Loader,再加载系统内核,然后内核进行初始化,最后启动初始化进程。初始化进程作为Linux系统的第一个进程,它需要完成Linux系统中相关的初始化工作,为用户提供合适的工作环境。红帽RHEL 7系统已经替换掉了熟悉的初始化进程服务System V init,正式采用全新的systemd初始化进程服务。如果您之前学习的是RHEL 5或RHEL 6系统,可能会不习惯。systemd初始化进程服务采用了并发启动机制,开机速度得到了不小的提升。
systemd用目标(target)代替了System V init中运行级别的概念,这两者的区别:
表1-3 systemd与System V init的区别以及作用
System V init运行级别 |
systemd目标名称 |
作用 |
0 |
runlevel0.target, poweroff.target |
关机 |
1 |
runlevel1.target, rescue.target |
单用户模式 |
2 |
runlevel2.target, multi-user.target |
等同于级别3 |
3 |
runlevel3.target, multi-user.target |
多用户的文本界面 |
4 |
runlevel4.target, multi-user.target |
等同于级别3 |
5 |
runlevel5.target, graphical.target |
多用户的图形界面 |
6 |
runlevel6.target, reboot.target |
重启 |
emergency |
emergency.target |
紧急Shell |
如果想要将系统默认的运行目标修改为“多用户,无图形”模式,可直接用ln命令把多用户模式目标文件连接到/etc/systemd/system/目录:
[root@linuxprobe ~]# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/
system/default.target
在RHEL 7系统中是使用systemctl命令来管理服务的。RHEL 6系统中System V init命令与RHEL 7系统中systemctl命令的对比。
表1-4 systemctl管理服务的启动、重启、停止、重载、查看状态等常用命令
System V init命令(RHEL 6系统) |
systemctl命令(RHEL 7系统) |
作用 |
service foo start |
systemctl start foo.service |
启动服务 |
service foo restart |
systemctl restart foo.service |
重启服务 |
service foo stop |
systemctl stop foo.service |
停止服务 |
service foo reload |
systemctl reload foo.service |
重新加载配置文件(不终止服务) |
service foo status |
systemctl status foo.service |
查看服务状态 |
表1-5 systemctl设置服务开机启动、不启动、查看各级别下服务启动状态等常用命令
System V init命令(RHEL 6系统) |
systemctl命令(RHEL 7系统) |
作用 |
chkconfig foo on |
systemctl enable foo.service |
开机自动启动 |
chkconfig foo off |
systemctl disable foo.service |
开机不自动启动 |
chkconfig foo |
systemctl is-enabled foo.service |
查看特定服务是否为开机自动启动 |
chkconfig --list |
systemctl list-unit-files --type=service |
查看各个级别下服务的启动与禁用情况 |
第二章 新手必须掌握的Linux命令
2.1 强大好用的Shell |
图形化工具相较于Linux命令行界面会更加消耗系统资源,因此经验丰富的运维人员甚至都不会给Linux系统安装图形界面,需要开始运维工作时直接通过命令行模式远程连接过去,不得不说这样做确实挺高效的。
图2-1 用户与Linux系统的交互
Shell就是这样的一个命令行工具。Shell(也称为终端或壳)充当的是人与内核(硬件)之间的翻译官,用户把一些命令“告诉”终端,它就会调用相应的程序服务去完成某些工作。现在包括红帽系统在内的许多主流Linux系统默认使用的终端是Bash(Bourne-Again SHell)解释器。主流Linux系统选择Bash解释器作为命令行终端主要有以下4项优势,读者可以在今后的学习和生产工作中细细体会Linux系统命令行的美妙之处,真正从心里爱上它们。
Ø 通过上下方向键来调取过往执行过的Linux命令;
Ø 命令或参数仅需输入前几位就可以用Tab键补全;
Ø 具有强大的批处理脚本;
Ø 具有实用的环境变量功能。
2.2 执行查看帮助命令 |
既然Linux系统中已经有了Bash这么好用的“翻译官”,那么接下来就有必要好好学习下怎么跟它沟通了。
常见执行Linux命令的格式是这样的:
命令名称 [命令参数] [命令对象]
注意,命令名称、命令参数、命令对象之间请用空格键分隔。
命令对象一般是指要处理的文件、目录、用户等资源,而命令参数可以用长格式(完整的选项名称),也可以用短格式(单个字母的缩写),两者分别用--与-作为前缀。Linux新手不会执行命令大多是因为参数比较复杂,参数值需要随不同的命令和需求情况而发生改变。因此,要想灵活搭配各种参数,执行自己想要的功能,则需要长时间的经验积累了。
表2-1 命令参数的长格式与短格式示例
长格式 |
man --help |
短格式 |
man -h |
在man命令帮助信息的界面中,所包含的常用操作按键及其用途如表2-2所示。
长格式和短格式命令顺口溜:
“长长不可合并,长短不可合并,短短可以合并,只保留一个减号”
表2-2 man命令中常用按键以及用途
按键 |
用途 |
空格键 |
向下翻一页 |
PaGe down |
向下翻一页 |
PaGe up |
向上翻一页 |
home |
直接前往首页 |
end |
直接前往尾页 |
/ |
从上至下搜索某个关键词,如“/linux” |
? |
从下至上搜索某个关键词,如“?linux” |
n |
定位到下一个搜索到的关键词 |
N |
定位到上一个搜索到的关键词 |
q |
退出帮助文档 |
一般来讲,使用man命令查看到的帮助内容信息都会很长很多,如果读者不了解帮助文档信息的目录结构和操作方法,乍一看到这么多信息可能会感到相当困惑。man命令的帮助信息的结构如表2-3所示。
表2-3 man命令帮助信息的结构以及意义
结构名称 |
代表意义 |
NAME |
命令的名称 |
SYNOPSIS |
参数的大致使用方法 |
DESCRIPTION |
介绍说明 |
EXAMPLES |
演示(附带简单说明) |
OVERVIEW |
概述 |
DEFAULTS |
默认的功能 |
OPTIONS |
具体的可用选项(带介绍) |
ENVIRONMENT |
环境变量 |
FILES |
用到的文件 |
SEE ALSO |
相关的资料 |
HISTORY |
维护历史与联系方式 |
2.3 常用系统工作命令 |
1.echo命令
echo命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]”。
例如,把指定字符串“Linuxprobe.com”输出到终端屏幕的命令为:
[root@linuxprobe ~]# echo Linuxprobe.Com
该命令会在终端屏幕上显示如下信息:
Linuxprobe.Com
下面,我们使用$变量的方式提取变量SHELL的值,并将其输出到屏幕上:
[root@linuxprobe ~]# echo $SHELL
/bin/bash
2.date命令
date命令用于显示及设置系统的时间或日期,格式为“date [选项] [+指定的格式]”。
只需在强大的date命令中输入以“+”号开头的参数,即可按照指定格式来输出系统的时间或日期,这样在日常工作时便可以把备份数据的命令与指定格式输出的时间信息结合到一起。例如,把打包后的文件自动按照“年-月-日”的格式打包成“backup-2017-9-1.tar.gz”,用户只需要看一眼文件名称就能大概了解到每个文件的备份时间了。date命令中常见的参数格式及作用如表2-4所示。
表2-4 date命令中的参数以及作用
参数 |
作用 |
%t |
跳格[Tab键] |
%H |
小时(00~23) |
%I |
小时(00~12) |
%M |
分钟(00~59) |
%S |
秒(00~59) |
%j |
今年中的第几天 |
按照默认格式查看当前系统时间的date命令如下所示:
[root@linuxprobe ~]# date
Mon Aug 24 16:11:23 CST 2017
按照“年-月-日 小时:分钟:秒”的格式查看当前系统时间的date命令如下所示:
[root@linuxprobe ~]# date "+%Y-%m-%d %H:%M:%S"
2017-08-24 16:29:12
将系统的当前时间设置为2017年9月1日8点30分的date命令如下所示:
[root@linuxprobe ~]# date -s "20170901 8:30:00"
Fri Sep 1 08:30:00 CST 2017
再次使用date命令并按照默认的格式查看当前的系统时间,如下所示:
[root@linuxprobe ~]# date
Fri Sep 1 08:30:01 CST 2017
date命令中的参数%j可用来查看今天是当年中的第几天。这个参数能够很好地区分备份时间的新旧,即数字越大,越靠近当前时间。该参数的使用方式以及显示结果如下所示。
[root@linuxprobe ~]# date "+%j"
244
3.reboot命令
reboot命令用于重启系统,其格式为reboot。
由于重启计算机这种操作会涉及硬件资源的管理权限,因此默认只能使用root管理员来重启,其命令如下:
[root@linuxprobe ~]# reboot
4.poweroff命令
poweroff命令用于关闭系统,其格式为poweroff。
该命令与reboot命令相同,都会涉及硬件资源的管理权限,因此默认只有root管理员才可以关闭电脑,其命令如下:
[root@linuxprobe ~]# poweroff
5.wget命令
wget命令用于在终端中下载网络文件,格式为“wget [参数] 下载地址”。
如果您没有Linux系统的管理经验,当前只需了解一下wget命令的参数以及作用,然后看一下下面的演示实验即可,切记不要急于求成。后面章节将逐步讲解Linux系统的配置管理方法,可以等您掌握了网卡的配置方法后再来进行这个实验操作。表2-5所示为wget命令的参数以及参数的作用。
表2-5 wget命令的参数以及作用
参数 |
作用 |
-b |
后台下载模式 |
-P |
下载到指定目录 |
-t |
最大尝试次数 |
-c |
断点续传 |
-p |
下载页面内所有资源,包括图片、视频等 |
-r |
递归下载 |
尝试使用wget命令从本书的配套站点中下载本书的最新pdf格式电子文档,这个文件的完整路径为http://www.linuxprobe.com/docs/LinuxProbe.pdf,执行该命令后的下载效果如下:
[root@linuxprobe ~]# wget http://www.linuxprobe.com/docs/LinuxProbe.pdf
--2017-08-24 19:30:12 -- http://www.linuxprobe.com/docs/LinuxProbe.pdf
Resolving www.linuxprobe.com (www.linuxprobe.com)... 220.181.105.185
Connecting to www.linuxprobe.com (www.linuxprobe.com)|220.181.105.185|:80...
connected.
HTTP request sent, awaiting response... 200 OK
Length: 45948568 (44M) [application/pdf]
Saving to: ‘LinuxProbe.pdf’
100%[==========================================>] 45,948,568 32.9MB/s in 1.3s
2017-08-24 19:30:14 (32.9 MB/s) - ‘LinuxProbe.pdf’ saved [45948568/45948568]
接下来,我们使用wget命令递归下载www.linuxprobe.com网站内的所有页面数据以及文件,下载完后会自动保存到当前路径下一个名为www.linuxprobe.com的目录中。执行该操作的命令为wget -r -p http://www.linuxprobe.com,该命令的执行结果如下。
[root@linuxprobe ~]# wget -r -p http://www.linuxprobe.com
--2017-08-24 19:31:41-- http://www.linuxprobe.com/
Resolving www.linuxprobe.com... 106.185.25.197
Connecting to www.linuxprobe.com|106.185.25.197|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: 'www.linuxprobe.com/index.html'
………………省略下载过程………………
6.ps命令
ps命令用于查看系统中的进程状态,格式为“ps [参数]”。
表2-6 ps命令的参数以及作用
参数 |
作用 |
-a |
显示所有进程(包括其他用户的进程) |
-u |
用户以及其他详细信息 |
-x |
显示没有控制终端的进程 |
Linux系统中时刻运行着许多进程,如果能够合理地管理它们,则可以优化系统的性能。在Linux系统中,有5种常见的进程状态,分别为运行、中断、不可中断、僵死与停止,其各自含义如下所示。
Ø R(运行):进程正在运行或在运行队列中等待。
Ø S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该 状态。
Ø D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其中断。
Ø Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。
Ø T(停止):进程收到停止信号后停止运行。
当执行ps aux命令后通常会看到如表2-7所示的进程状态,表2-7中只是列举了部分输出值,而且正常的输出值中不包括中文注释。
表2-7 进程状态
USER |
PID |
%CPU |
%MEM |
VSZ |
RSS |
TTY |
STAT |
START |
TIME |
COMMAND |
进程的所有者 |
进程ID号 |
运算器占用率 |
内存占用率 |
虚拟内存使用量(单位是KB) |
占用的固定内存量(单位是KB) |
所在终端 |
进程 状态 |
被启动 的时间 |
实际使用 |
命令名称与参数 |
root |
1 |
0.0 |
0.4 |
53684 |
7628 |
? |
Ss |
07 :22 |
0:02 |
/usr/lib/systemd/systemd |
root |
2 |
0.0 |
0.0 |
0 |
0 |
? |
S |
07:22 |
0:00 |
[kthreadd] |
root |
3 |
0.0 |
0.0 |
0 |
0 |
? |
S |
07:22 |
0:00 |
[ksoftirqd/0] |
root |
5 |
0.0 |
0.0 |
0 |
0 |
? |
S< |
07:22 |
0:00 |
[kworker/0:0H] |
root |
7 |
0.0 |
0.0 |
0 |
0 |
? |
S |
07:22 |
0:00 |
[migration/0] |
………………省略部分输出信息……………… |
注: |
|
|
如前面所提到的,在Linux系统中的命令参数有长短格式之分,长格式和长格式之间不能合并,长格式和短格式之间也不能合并,但短格式和短格式之间是可以合并的,合并后仅保留一个-(减号)即可。另外ps命令可允许参数不加减号(-),因此可直接写成ps aux的样子。 |
7.top命令
top命令用于动态地监视进程活动与系统负载等信息,其格式为top。
top命令相当强大,能够动态地查看系统运维状态,完全将它看作Linux中的“强化版的Windows任务管理器”。top命令的运行界面如图2-6所示。
图2-6 top命令的运行界面
在图2-6中,top命令执行结果的前5行为系统整体的统计信息,其所代表的含义如下。
Ø 第1行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低)。
Ø 第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
Ø 第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。
注: |
|
|
第3行中的数据均为CPU数据并以百分比格式显示,例如“97.1 id”意味着有97.1%的CPU处理器资源处于空闲。 |
Ø 第4行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。
Ø 第5行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。
8.pidof命令
pidof命令用于查询某个指定服务进程的PID值,格式为“pidof [参数] [服务名称]”。
每个进程的进程号码值(PID)是唯一的,因此可以通过PID来区分不同的进程。例如,可以使用如下命令来查询本机上sshd服务程序的PID:
[root@linuxprobe ~]# pidof sshd
2156
9.kill命令
kill命令用于终止某个指定PID的服务进程,格式为“kill [参数] [进程PID]”。
接下来,我们使用kill命令把上面用pidof命令查询到的PID所代表的进程终止掉,其命令如下所示。这种操作的效果等同于强制停止sshd服务。
[root@linuxprobe ~]# kill 2156
10.killall命令
killall命令用于终止某个指定名称的服务所对应的全部进程,格式为:“killall [参数] [服务名称]”。
[root@linuxprobe ~]# pidof httpd
13581 13580 13579 13578 13577 13576
[root@linuxprobe ~]# killall httpd
[root@linuxprobe ~]# pidof httpd
[root@linuxprobe ~]#
注: |
|
|
如果我们在系统终端中执行一个命令后想立即停止它,可以同时按下Ctrl + C组合键(生产环境中比较常用的一个快捷键),这样将立即终止该命令的进程。或者,如果有些命令在执行时不断地在屏幕上输出信息,影响到后续命令的输入,则可以在执行命令时在末尾添加上一个&符号,这样命令将进入系统后台来执行。 |
0条评论