[TOC]
# Linux系统启动过程
我们来一起看CentOS7的启动过程、重要文件和修改启动级别。
## 启动过程
以下截图为CentOS7启动过程。

## Systemd
CentOS7使用到了Systemd,在CentOS早期版本都使用的是Init进程,关于Init进程启动有两个缺点:
* Init是串行启动,所以启动时间较长
* 启动脚本较为复杂
而Systemd就是为解决这些问题,它的设计初衷就是为系统启动和管理提供一套完整解决方案。Systemd 的优点是功能强大,使用方便,缺点是体系庞大(以下截图来源于网络)。

Systemctl是Systemd的主要命令,用于管理系统。它的常用语法如下:
```
# systemctl start [name.service]
# systemctl stop [name.service]
# systemctl restart [name.service]
# systemctl reload [name.service]
$ systemctl status [name.service]
# systemctl is-active [name.service]
$ systemctl list-units --type service --all
```
*注:在Linux系统早期我们可以通过Service命令来管理一些常用的程序生命周期,在CentOS7后推荐用Systemctl来管理程序的生命周期,当然Service命令还是可以使用的。*
我们通过修改系统状态的生命周期,来看一下sytemctl命令的用法:
```
# 重启系统
[djangowang@localhost ~]# systemctl reboot
# 关闭系统,切断电源
[djangowang@localhost ~]# systemctl poweroff
# 关闭系统
[djangowang@localhost ~]# systemctl halt
# 休眠
[djangowang@localhost ~]# systemctl hibernate
# 让系统进入交互式休眠状态
[djangowang@localhost ~]# systemctl hybrid-sleep
# 启动进入救援状态(单用户状态)
[djangowang@localhost ~]# systemctl rescue
```
重启系统和关机的几重方式:
* 重启系统:systemctl reboot、reboot、init 6
* 关机:systemctl halt、halt、init 0
## 重要文件介绍
启动过程Systemd会调用软链接 /etc/systemd/system/default.target ,来最终确认启动级别。
```
[djangowang@localhost ~]# ls /lib/systemd/systemetc/passwd文件**
使用vim命令打开passwd文件,文件每一行都代表一个用户,有几行就代表有几个用户在你的系统中,切记不要轻易删除它们。
```
# vim /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
...
```
上面是系统预设的几个用户,是系统在使用的。我们先来看一下root 这个系统管理员用户,你可以明显的看出来,每一行使用“:”分隔开,共有七个列,分别是 :
* 用户名称:如root就是预设的系统管理员的用户名称
* 密码:早期的Unix系统的密码,是放在这个文字的,不过由于这样一来很容易造成数据的被窃取,所以后来就将数据给它改放到 /etc/shadow 中了
* UID:系统用户的ID。其中0为管理员用户权限,1-1000 为系统保留,1000以上为用户主动创建的ID
* GID:用户的组ID,这个与 /etc/group文件有关,其实 /etc/group文件与 /etc/passwd 差不多,存放组关系和组关系的属性
* 家目录:用户的家目录也可以称为宿主目录,以上面为例, root的家目录在 /root ,所以当 root 登入之后,马上在的所在就是 /root
* Shell :系统解析Shell的解析器,默认为/bin/bash。如果不希望用户登录可以写 /bin/nologin 这一条
**/etc/shadow文件**
由于/etc/passwd文件并不安全,所以后来发展出将密码移动到 /etc/shadow 这个文件中。首先让我们看一下这个文件的内容。
```
[djangowang@localhost ~]# cat /etc/shadow
root:$1$t4Orj6cl$vHdMadf134adf22vvRrQWU0:18388:0:99999:7:::
bin:*:16659:0:99999:7:::
daemon:*:16659:0:99999:7:::
adm:*:16659:0:99999:7:::
lp:*:16659:0:99999:7:::
...
```
同 /etc/passwd 文件一样,文件中每行代表一个用户,同样使用 “:” 作为分隔符,不同之处在于,每行用户信息被划分为 9 个字段。每个字段的含义如下:
* 用户名
* 加密密码
* 最后一次修改时间
* 最小修改时间间隔
* 密码有效期
* 密码需要变更前的警告天数
* 密码过期后的宽限时间
* 用户的密码失效时间
* 保留字段
## 认识/etc/login.defs 文件
/etc/login.defs文件,主要定义了用户登录和用户设置的一些基本信息,用于提升我们系统的安全性。
| 设置项目 | 含义 |
| --- | --- |
| PASS_MAX_DAYS 99999 | 密码有效期,99999是自1970年1月1日起密码有效的天数,相当于 273 年,可理解为密码始终有效 |
| PASS_MIN_DAYS 0 | 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0 |
| PASS_WARN_AGE 7 | 指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天 |
| UID_MIN 1000 | 指定UID从1000开始 |
| UID_MAX 60000 | 指定最大的UID为60000 |
| GID_MIN 1000 | 指定GID为1000开始 |
| GID_MAX 60000 | 用户GID最大为60000 |
| CREATE_HOME yes | 指定在创建用户时,是否同时创建用户主目录,yes表示创建,no则不创建,默认是yes |
| UMASK 077 | 用户主目录的权限默认设置为 077 |
| USERGROUPS_ENAB yes | 指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes |
| ENCRYPT_METHOD SHA512 | 指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密 |
# 软件安装
在Linux的世界中有着不同的发行版本,不同的发行版本安装软件方式也不一样。在CentOS7我们通过yum命令或rpm命令来安装。
## yum安装软件
yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。他可以方便的从互联网下载软件,并自己解决软件之间的依赖关系。以安装Nginx为例,我们直接可以执行以下命令。
```
[djangowang@localhost ~]# yum install nginx
```
关于(yum)命令的主要参数:
* 列出所有可更新的软件清单命令:yum check-update
* 更新所有软件命令:yum update
* 仅安装指定的软件命令:yum install
* 仅更新指定的软件命令:yum update
* 列出所有可安裝的软件清单命令:yum list
* 删除软件包命令:yum remove
* 查找软件包命令:yum search
## RPM 安装软件
rpm命令用于安装本地以*.rpm结尾的包软件。譬如在本地安装nginx.rpm。
```
[djangowang@localhost ~]# rpm -ivh nginx.rpm
```
查看本机安装Nginx的版本。
```
[djangowang@localhost ~]# rpm -qa | grep nginx
```
关于rpm命令常用的参数如下:
* -a # 查询所有软件包。
* -e # 删除指定软件包
* -i # 显示软件包信息
* -l # 列表显示已经安装的软件包
* -q # 使用询问模式,当遇到任何问题时,rpm指令会先询问用户
* -v # 显示指令执行过程
* -vv # 详细显示指令执行过程,便于排错
## 源码安装
在很多时候我们也需要通过源码编译安装软件。我们以安装Openssh软件包为例。 首先下载软件包:
```
[djangowang@localhost ~]# wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz
```
解压缩后进入目录进行配置、编译和安装三步:
```
[djangowang@localhost ~]# cd openssl-1.1.1i
[djangowang@localhost ~]# ./config shared zlib 配置
[djangowang@localhost ~]# make 编译
[djangowang@localhost ~]# make install 安装
```
其中配置是指软件安装目录、开启的功能和参数等,编译是指将c语言代码编译成可执行文件,安装是指将代码安装到系统的指定目录中。根据软件的不同安装后还要经过一些配置如下:
```
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
find / -name openssl
ln -s /usr/local/bin/openssl /usr/bin/openssl
ln -s /usr/local/include/openssl /usr/include/openssl
echo "/usr/local/lib64/" >> /etc/ld.so.conf
ldconfig
openssl version -a
```
最后验证软件是否安装成功,执行( openssl version )命令。
# 定时任务
在Linux中定时任务是非常常用的工具之一,如系统定时备份、恢复、监控采集和系统维护等场景都需要使用到它。通常在Linux中有三种种定时任务分别:
* 一次性的任务,用“at”
* 周期性任务,用“crond”
* 异步的定时任务调度器,用“anacrontab”
本节主要介绍一次性任务和周期性任务两种最常用的应用场景。
## 一次性的任务
一次性任务我们通常用“at”命令来完成,譬如以下案例。
```
[djangowang@localhost ~]# at 17:45
at> ls /etc1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
*:表示任意时间都,实际上就是“每”的意思。可以代表00-23小时或者00-12每月或者00-59分
-:表示区间,是一个范围,00 17-19 * * * cmd,就是每天17,18,19点的整点执行命令
,:是分割时段,30 3,19,21 * * * cmd,就是每天凌晨3和晚上19,21点的半点时刻执行命令
/n:表示分割,可以看成除法,*/5 * * * * cmd,每隔五分钟执行一次
```
关于crond的配置文件,它分别在几个地方如/var/spool/cron/用户名,/etc/crontab和/etc/cron.d2 * * * command
```
2.每晚的21:30重启Apache。
```
30 21 * * * /usr/local/etc/rc.d/httpd restart
```
## 关于定时任务的常用文件
在/etc目下有这些文件:
* cron.d/ # 系统crontab存放目录
* cron.deny # 文件中的用户不能使用cron
* cron.hourly/ # 小时存放
* cron.daily/ # 天存放
* cron.monthly/ # 月存放
* cron.weekly/ # 周存放
在 /var/spool/cron/下还有,按用户存放的crontab。
# 磁盘管理
我们在搭建一台Linux服务器或购买一台云服务器后,随着时间的推移数据的增长,这时我们的磁盘容量就会成为瓶颈,所以要增加新的数据盘来扩容。
## 云服务器磁盘管理
在云服务器管理硬盘分为三步:
* 创建云硬盘 & 挂载
* 查看云硬盘 & 格式化
* Mount云硬盘到指定目录
**创建云硬盘 & 挂载**
购买的云服务器与云硬盘必须在同一个可用区,购买后需要在云控制台上进行挂载。
**查看云硬盘 & 格式化**
在云控制台挂载硬盘后,相当于我们在真实的物理场景将新买的硬盘插入主机。 接着我们执行fdisk就可以查看到这块云硬盘,以下为fdisk命令的参数:
* -l # 列表显示信息的硬盘信息
```
[djangowang@localhost ~]# fdisk -l
Disk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0009ac89
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 20971486 10484719+ 83 Linux
Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
```
我们可以看到/dev/vda是原始的云硬盘,/dev/vdb为新增的云硬盘,我们将/dev/vdb格式化成ext4分区格式。
```
[djangowang@localhost ~]# mkfs.ext4 /dev/vdb
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
```
在Linux中有两种命令来格式化硬盘,分别为:
* mkfs.ext4 /dev/vdb(推荐)
* mkfs -t ext4 /dev/vdb
两种命令的底层工作原理是一样的,推荐第一种,因为它更加简洁。
**挂载云硬盘到指定目录**
首先创建/data1/目录,接着将/dev/vdb挂载到新的目录。
1.创建挂载的目录。
```
[djangowang@localhost ~]# mkdir /data1
```
2.将磁盘挂载到创建的目录上。
```
[djangowang@localhost ~]# mount /dev/vdb /data1
```
3.挂载后可以通过df -h命令或lsblk命令,查看最终的挂载状态。这里需要注意,当服务器重启后,通过以上方法挂载后的磁盘会消失,所以我们需要将/dev/vdb挂载的方式,写入/etc/fstab文件中,系统重启后会自动读取/etc/fstab文件内容,并将其内容挂载到系统上。关于/etc/fstab文件格式如下。
```
[djangowang@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Mar 7 06:38:37 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=4b499d76-769a-40a0-93dc-4a31a59add28 / ext4 defaults 1 1
uuid 挂载目录 挂载分区格式 defaults 1 1
```
在/etc/fstab中的uuid,可以通过blkid命令查看。
```
[djangowang@localhost ~]# blkid
/dev/sr0: UUID="2021-02-23-11-23-13-00" LABEL="config-2" TYPE="iso9660"
/dev/vda1: UUID="4b499d76-769a-40a0-93dc-4a31a59add28" TYPE="ext4"
/dev/vdb: UUID="839fd6ce-69fb-460d-9227-84ac5f1df6f8" TYPE="ext4" # 将本行信息追加到/etc/fstab中
```
将/dev/vdb的相关信息,写入/etc/fstab文件中,具体如下。
```
[djangowang@localhost ~]# cat /etc/fstab
UUID=839fd6ce-69fb-460d-9227-84ac5f1df6f8 /data1 ext4 defaults 1 1
```
*注:修改/etc/fstab文件属于高危的操作,有可能会影响系统的正常启动,所以修改前建议备份此文件后再修改,当出现异常可以用系统单用户模式或vnc登录系统解决。*
# 系统备份
作为一个合格的运维工程师,平日工作中最重要的就是备份数据。 另外还要养成以下比较好的习惯:
* 登录尽量不使用root(管理员)账号
* 修改配置文件前要对配置文件提前备份副本
* 删除文件前,可以先将文件移动到指定的删除目录,等过一定的时间如1天后再删除
除培养自己的习惯外,还要定期对重要磁盘上的数据进行备份,这里就涉及到对文件备份前的打包压缩。在Linux打包和压缩的命令工具有tar、zip、gzip和bzip2等,读者如果了解他们可以根据自己情况选择不同的打包和压缩工具,这里笔者推荐使用tar。tar使用分为两种分别为打包和压缩,关于tar命令的参数:
* -c 将多个文件或目录进行打包
* -A 追加 tar 文件到归档文件
* -f 包名 指定包的文件名。包的扩展名是用来给管理员识别格式的,所以一定要正确指定扩展名
* -v 显示打包文件过程
* -z 压缩
* -C 指定解压目录
## tar 打包文件
譬如我备份/etc/目录下的*.conf文件。可以使用以下命令,先将 *.conf复制到/tmp/bakup目录中。
```
[djangowang@localhost ~]# find /etc/ -name "*.conf" -exec cp {} /tmp/bakup ;
```
将/tmp/bakup目录进行打包,命令如下:
```
[djangowang@localhost ~]# tar -cvf bakup.2021.10.1.tar /tmp/bakup
```
打包并不是把文件压缩,只是将目录中的文件打包成一个文件包,方便备份。将备份的解包:
```
[djangowang@localhost ~]# tar -xvf bakup.2021.10.1.tar -C /tmp/bakup
```
## tar 压缩文件
将/tmp/bakup目录进行压缩备份。
```
[djangowang@localhost ~]# tar -cvzf bakup.2021.10.1.tar.gz /tmp/bakup
```
和打包相比,这里会进行压缩,适合备份的文件比较多的场景,特别是比较大的文本文件非常适合这种方式,但与打包相比压缩会有一定延迟(延迟时间和文件大小相关),但与打包相比优势是最终存储大小要比打包方式小很多。
```
[djangowang@localhost ~]# tar -xvzf bakup.2021.10.1.tar.gz -C /tmp/bakup
```
# 本章小结
在这一章我们首先学习了Linux启动过程、启动过程让我们了解了Linux启动过程中的细节和原理,介绍启动过程中调用的一些重要文件;然后我们学习了系统管理员常用的系统命令和参数,除了这些系统命令外还有一些符号类的命令,我们经常说系统管理员要学会"偷懒",能用一行命令完成的事情绝对不要用两行或多行;接着我们又学习了/etc目录一些比较重要的文件,这些可以让我们更加深入的掌握Linux的原理;我们还学习了Linux的软件安装,常见安装软件的三种方式网络安装、本地安装和源码安装;定时计划任务也是Linux非常重要的知识点之一,结合我们后学学习Shell编程可以让Linux定期为我们执行一些例行的任务减少人为干预;接着我们学习了磁盘管理,当我们购买或使用服务器时,随着时间的推移,数据的增长磁盘不够用,我们就需要增加新的磁盘,这节介绍了如何去增加一块磁盘的操作过程;最后也是作为系统管理员最终要的任务就是备份数据,我们介绍备份数据和还原数据的过程,掌握这些可以让我们后续成为一个合格的系统管理员。下一章我们继续学习高级Linux系统管理和本章不同的是,本章要求读者必须掌握,下一章要求读者适当掌握,因为本章更多介绍的是如何管理一台服务器所必备的知识,下章更多是作为系统管理员管理更多服务器时,所需要了解到的知识。
# 习题
1.如何进入单用户模式?
2.top命令和ps命令的区别是? 什么场景下更适合用ps命令?
3.find命令与locate命令的区别是?
4.如何查看本机是否安装了Nginx软件包?
5.将/etc/下的文件,每天10点备份到/data1/目录下,备份名的格式backup.年月日.tar.gz。



