> For the complete documentation index, see [llms.txt](https://hezhiqiang.gitbook.io/about-the-author/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hezhiqiang.gitbook.io/about-the-author/yun-wei-huan-jing-da-jian/centos7-an-zhuang-yu-you-hua.md).

# CentOS 7 安装与优化

#### 博客作者：联系请[点击](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)，搬运不易，希望请作者喝咖啡，可以点击[联系博客作者](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)

## &#x20;前言

&#x20;           CentOS 7与CentOS 6之间最大的差别就是初始化技术不同，CentOS 7采用的初始化技术是Systemd,并行的运行方式，除了这一点之外，服务启动、开机启动文件、网络命令方面等等，我们一起通过这篇文章来了解一下系统初始化技术的演变过程。

### Sysvinit技术

**特点：**

1.系统第1个进程为init;\
2.init进程是所有进程的父进程，不可kill；\
3.大多数Linux发行版的init系统是和SystemV相兼容的，被称为sysvinti\
4.代表系统：CentOS5 CentOS6

**优点：**

sysvinit运行非常良好，概念简单清晰，它主要依赖于shell脚本。

**缺点：**

1.按照一定顺序执行---->启动太慢。\
2.很容易hang住，fstab与nfs挂载问题

### Upstart技术

CentOS6采用了upstart技术代替sysVinit进行引导，Upstart对rc.sysinit脚本做了大量的优化，缩短了系统初始化的启动时间，但是CentOS6为了简便管理员的操作，upstart的很多特性并没有凸显或直接不支持。

代表系统：CentOS6, Ubuntu14, 从CentOS7, Ubuntu15开始使用systemd

### Systemd技术

新系统都会采用的技术（RedHat7,CentOS7,Ubuntu15等）；\
设计目标是克服sysvinit固有的缺点，提高系统的启动速度；\
和Sysvinit兼容，降低迁移成本；\
最主要优点：并行启动\
pid为1的进程

## 三种启动技术对比：

![](/files/-MaKgcl8p0bQsWNPb-PP)

## 并行启动三大原理：

### 1、解决socket 依赖/端口依赖 socket 网络套接字文件

![](/files/-MaKguJkU3_vGCfKH1Rq)

### 2、解决D-Bus 依赖：采用了D-Bus 为程序之间的通讯工具，类似消息队列，可以缓存信息

![](/files/-MaKhAV_CLlqPnK7B9UM)

### 3、解决文件系统依赖、类似autofs机制 先加载boot、swap、/ 分区，后直接启动系统，延迟启动其他guaz

![](/files/-MaKhKnQdmH1EWpLsAGR)

## 下载CentOS

开始安装CentOS之前，必须下载安装ISO映像，可从CentOS网站<https://www.centos.org/download/>获得镜像。

## 安装CentOS 7系统

{% hint style="success" %}
这里为了性能考虑，采用最小化安装，虚拟机选择，磁盘空间尽量大一些
{% endhint %}

### 修改网卡名为eth

1. 开机进入安装
2. 把光标移动到Install CentOS7,按下TAB键
3. 添加内核参数 让网卡名称变为eth
4. 空格 输入 `net.ifnames=0 biosdevname=0` 然后回车

![](/files/-MaTgMKmhz_yTTQSVQ6v)

### 选择语言

1. 滑动鼠标，点击中文，选择简体中文
2. 点击继续

![](/files/-MaThRK5GAxFnWTjD4rc)

### &#x20;设置网络连接和主机名

1. 勾选开机自启动
2. 设置IP地址
3. 修改主机名，点击应用
4. 点击完成

![](/files/-MaTiuHN5CA_J5bzygG3)

### 选择安装的环境，选择最小化安装。

1. 注意勾选依赖包
2. 点击完成

![](/files/-MaTjtlu53860IVXDMWB)

### 选择磁盘分区。

1. 选择磁盘分区
2. 点击完成

![](/files/-MaTkQeCnXLOmJIwJ1Li)

\
开始安装，安装的过程中设置root的密码。

![](/files/-MaTlms1Hrp8Woa1UMtZ)

## 优化CentOS 7系统

### nmtui

nmtui 可提供一个文本界面配置由 NetworkManager 控制的网络， 该工具包含在 `NetworkManager-tui` 子软件包中，写入时，不会默认随 **NetworkManager** 安装该子软件包。要安装 `NetworkManager-tui`，请作为 `root` 运行以下命令：

```
[root@CentOS7 ~]# yum -y install NetworkManager-tui
```

root 用户运行下面的命令在当前会话中启动该服务：

```
[root@CentOS7 ~]# systemctl start NetworkManager
```

运行 `systemctl enable` 命令确定每次系统引导时都启动 **NetworkManager**：

```
[root@CentOS7 ~]# systemctl enable NetworkManager
```

启动 **nmtui**，请按如下方式运行命令：

```
[root@CentOS7 ~]# nmtui
```

![](/files/-MaTxsvDi7d7NAcNhOxl)

编写时，**nmtui** 不支持所有连接类型，特别是无法编辑使用 WPA Enterprise 的 VPN、Wi-Fi 连接，或无法编辑使用 `802.1X` 的以太网连接。

### 修改主机名

临时 `hostname`\
永久`vim /etc/hostname`\
修改主机名永久和临时一步到位：`hostnamectl set-hostname hezhiqiang`

### 查看系统版本

```
[root@hezhiqiang ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
```

### Yum源上的优化

> 在CentOS6的时候，默认是从官方源下载rpm包的，由于是国外的yum源很慢不能用，CentOS7在这里做了优化，当我们使用yum安装软件的时候，默认不会再从官方下载，而是自动寻找离自己地理位置最近的yum源开始下载。

#### 配置Yum源

```
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

#官方epel源
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
```

### 安装常用命令

> 如果在安装系统的时候选择minimal，会比之前CentOS 6的时候以更小的包来安装，比如：`vim、ifconfig、route、setup、netstat`等等很多命令都没有了。。在安装系统后可加入以下软件包：

```
yum install lrzsz tree net-tools nmap vim bash-completion lsof dos2unix nc telnet ntp wget rng-tools psmisc screen -y
```

{% hint style="success" %}

```
lrzsz     #支持windowns平台的上传下载linux。在windowns远程连接工具上可以使用。
net-tools #CentOS 7.2.11 默认没有ifconfig命令。net-tools提供一些网络命令。
bash-completion #自动命令补全的工具。
rng-tools       #生成随机数嫡池的一个工具，有了这个工具tomcat启动会变得非常快。
psmisc     #这个包含有killall命令。
screen     #可以新建一个窗口，把任务放在后台运行。
```

{% endhint %}

### 字符集修改

{% hint style="info" %}

```
vim /etc/locale.conf    #字符集配置文件
localectl set-locale LANG=zh_CN.UTF-8  #命令行一步到位
```

{% endhint %}

```
临时修改
[root@CentOS7 ~]# echo $LANGzh_CN.UTF-8
永久修改
[root@CentOS7 ~]# localectl set-locale LANG=zh_CN.UTF-8
[root@CentOS7 ~]# localectl status
   System Locale: LANG=zh_CN.UTF-8
       VC Keymap: us
      X11 Layout: us
```

### 开机启动管理

```
systemctl status cron.service             #查看定时任务状态
systemctl stop cron.service               #关闭定时任务
systemctl status cron.service             #查看操作情况
systemctl list-unit-files|grep enable     #查看当前开启自启的服务
systemctl disable postfix.service         #关闭邮件服务
systemctl list-unit-files|grep postfix    #查看邮件服务是否开启
systemctl stop firewalld.service          #关闭防火墙

```

{% hint style="danger" %}
注意：CentOS 7中继续使用`/etc/rc.d/rc.local`需要执行如下命令赋予可执行权限
{% endhint %}

```
chmod +x /etc/rc.d/rc.local
```

## **优化Linux运行级别**

{% hint style="success" %}
**企业场景面试题**：Linux的7种运行级别，及对应作用。（要牢记）\
**企业场景面试题**：要把Linux的运营级别从3改成5，要修改哪个文件？\
答案：**/etc/inittab**
{% endhint %}

Linux系统7个运行级别（0：关机,停机模式、1：单用户模式、2：多用户模式、3：完整的多用户文本模式、4：系统未使用，保留一般不用、5：图形化模式、6：重启模式），运行级就是操作系统当前正在运行的功能级别。这个级别从0到6 ，具有不同的功能。

### 启动原理说明：

1. 在目录/etc/rc.d/init.d下有许多服务器脚本程序，一般称为服务(service)。
2. 在/etc/rc.d下有7个名为rcN.d的目录，对应系统的7个运行级别即(0-6)。

```
[root@hezhiqiang ~]# cd /etc/rc.d/ 
[root@hezhiqiang rc.d]# ll
总用量 4
drwxr-xr-x. 2 root root  70 5月  24 22:28 init.d
drwxr-xr-x. 2 root root  45 5月  24 22:28 rc0.d
drwxr-xr-x. 2 root root  45 5月  24 22:28 rc1.d
drwxr-xr-x. 2 root root  45 5月  24 22:28 rc2.d
drwxr-xr-x. 2 root root  45 5月  24 22:28 rc3.d
drwxr-xr-x. 2 root root  45 5月  24 22:28 rc4.d
drwxr-xr-x. 2 root root  45 5月  24 22:28 rc5.d
drwxr-xr-x. 2 root root  45 5月  24 22:28 rc6.d
-rw-r--r--. 1 root root 473 10月  2 2020 rc.local
```

rcN.d目录下都是一些符号链接（即软链接）文件，这些链接文件都指向/etc/rc.d/init.d目录下的service脚本文件，命名规则为K+nn+服务名或S+nn+服务名，其中nn为两拉伯数字，系统启动时，会根据指定的运行级别进入对应的rcN.d目录，并按照文件名顺序检索目录下的链接文件：对于以K开头的文件，系统将终止对应的服务，对于以S开头的文件，系统将启动对应的服务。

### 级别具体说明：

* 0： 系统停机（关机）模式，系统默认运行级别不能设置为0，否则不能正常启动，一开机就自动关机。&#x20;
* 1：单用户模式，root权限，用于系统维护，禁止远程登陆，就像Windows下的安全模式登录。&#x20;
* 2：多用户模式，没有NFS网络支持。&#x20;
* 3：完整的多用户文本模式，有NFS，登陆后进入控制台命令行模式。&#x20;
* 4：系统未使用，保留一般不用，在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时，可以切换到这个模式来做一些设置。&#x20;
* 5：图形化模式，登陆后进入图形GUI模式或GNOME、KDE图形化界面，如X Window系统。 6：重启模式，默认运行级别不能设为
* 6，否则不能正常启动，就会一直开机重启开机重启。

### 查看当前Linux运行模式：

```
[root@hezhiqiang ~]# runlevel
N 3
```

{% hint style="danger" %}
**注意**：输入init 0，系统会关机；输入init 6，系统会自动重启，这两个命令要非常小心！ 标准的Linux运行级别为3或5，如果是3的话，系统就在多用户状态；如果是5的话，则是运行着图形化模式，不同的运行级别有不同的用处，根据自己的不同情形来设置。
{% endhint %}

### 设置当前运行级别：

```
[root@hezhiqiang ~]# init 输入数字0-6，就切换到你要的模式。
```

* `runlevel`：查看当前系统运行级别。
* `init`：切换运行级别，后面接对应级别的数字，例如init 6就是重启linux服务器。

#### 临时生效，只有五种运行级别

```
[root@hezhiqiang ~]# ls -lh /usr/lib/systemd/system/runlevel*.target
lrwxrwxrwx. 1 root root 15 5月  24 22:28 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 5月  24 22:28 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 5月  24 22:28 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 5月  24 22:28 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 5月  24 22:28 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 5月  24 22:28 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 5月  24 22:28 /usr/lib/systemd/system/runlevel6.target -> reboot.target
```

#### Systemd 系统启动文件的目录

```
ls /usr/lib/systemd/system
```

语法格式： <http://www.jinbuguo.com/systemd/systemd.service.html>

`systemctl`**:融合service和chkconfig的功能于一体,兼容SysV和LSB的启动脚本，而且够在进程启动过程中更有效地引导加载服务。**

### Sysvinit命令与Systemd命令对比

![](/files/-MaUZThLSWuW8T_-z5NN)

### 设置默认运行级别：

{% hint style="danger" %}
**注意：**

* 默认运行级别不能设置为0，否则不能正常启动，一开机就自动关机。
* 默认运行级别不能设为6，否则不能正常启动，就会一直开机重启开机重启。
  {% endhint %}

```
systemctl get-default # 查看当前运行级别
systemctl get-default graphical.target   # 切换到5
systemctl get-default multi-user.target  # 切换到3
systemctl isolate graphical.target	     # 在不重启的情况下，切换到图形界面下
systemctl isolate multi-user.target	     # 在不重启的情况下，切换到运行级别mulit-user下
```

## CentOS 7 修改网卡名为eth0

{% hint style="info" %}
解决更换网卡后名称变更的问题，更改名称的方法，修改CentOS7网卡名称为传统名称eth0格式&#x20;
{% endhint %}

### 方法一：

在进入安装界面的时候把光标移动到Install CentOS7,按下tab键，在后面输入“`net.ifnames=0 biosdevname=0`”回车即可。

![](/files/-MaU0tcB7ao1_AzCqBeu)

### 方法二：

#### 进入网卡配置文件目录 <a href="#jin-ru-wang-ka-pei-zhi-wen-jian-mu-lu" id="jin-ru-wang-ka-pei-zhi-wen-jian-mu-lu"></a>

```
[root@hezhiqiang ~]# cd /etc/sysconfig/network-scripts/
```

#### 重命名网卡 <a href="#zhong-ming-ming-wang-ka" id="zhong-ming-ming-wang-ka"></a>

```
[root@hezhiqiang network-scripts]# mv ifcfg-eno16777736 ifcfg-eth0
```

#### 修改配置文件NAME、DEVICE <a href="#xiu-gai-pei-zhi-wen-jian-namedevice" id="xiu-gai-pei-zhi-wen-jian-namedevice"></a>

```
[root@hezhiqiang network-scripts]# vim ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=static
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=eth0
UUID=552c01f7-fd9d-4f19-913e-379a2bf5a467
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.111
"ifcfg-eth0" 14L, 239C written 

```

## 修改grub

GRUB是大多数Linux系统默认使用的引导程序, 可以通过启动菜单的方式选择进入不同的操作系统

```
sed -i.bak 's#crashkernel=auto rhgb quiet#crashkernel=auto rhgb net.ifnames=0 biosdevname=0 quiet#g' /etc/sysconfig/grub
```

```
[root@centos7 network-scripts]# vim /etc/sysconfig/grub 
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb net.ifnames=0 biosdevname=0 quiet"
"/etc/sysconfig/grub" 7L, 263C written 
```

### 生成启动菜单

```
[root@centos7 network-scripts]# grub2-mkconfig -o /boot/grub2/grub.cfg 
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-327.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-7ed5d4eebe4c43e3aadbda68cd0ef311
Found initrd image: /boot/initramfs-0-rescue-7ed5d4eebe4c43e3aadbda68cd0ef311.img
done
```

### 重启系统生效

```
[root@centos7 network-scripts]# reboot
```

### 查看是否成功

> centos7默认没有`ifconfig`命令，需`yum install net-tools -y`安装

```
[root@centos7 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.111  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fe57:875c  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:57:87:5c  txqueuelen 1000  (Ethernet)
        RX packets 39  bytes 4887 (4.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 43  bytes 7502 (7.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

## SELinux 的工作模式

SELinux 提供了 3 种工作模式：Disabled、Permissive 和 Enforcing，而每种模式都为 Linux 系统安全提供了不同的好处。

### **Disable工作模式（关闭模式）**

在 Disable 模式中，SELinux 被关闭，默认的 DAC 访问控制方式被使用。对于那些不需要增强安全性的环境来说，该模式是非常有用的。\
\
例如，若从你的角度看正在运行的应用程序工作正常，但是却产生了大量的 SELinux AVC 拒绝消息，最终可能会填满日志文件，从而导致系统无法使用。在这种情况下，最直接的解决方法就是禁用 SELinux，当然，你也可以在应用程序所访问的文件上设置正确的安全上下文。\
\
需要注意的是，在禁用 SELinux 之前，需要考虑一下是否可能会在系统上再次使用 SELinux，如果决定以后将其设置为 Enforcing 或 Permissive，那么当下次重启系统时，系统将会通过一个自动 SELinux 文件重新进程标记。\
\
关闭 SELinux 的方式也很简单，只需编辑配置文件 /etc/selinux/config，并将文本中 SELINUX= 更改为 SELINUX=disabled 即可，重启系统后，SELinux 就被禁用了。

### **Permissive工作模式（宽容模式）**

在 Permissive 模式中，SELinux 被启用，但安全策略规则并没有被强制执行。当安全策略规则应该拒绝访问时，访问仍然被允许。然而，此时会向日志文件发送一条消息，表示该访问应该被拒绝。\
\
SELinux Permissive 模式主要用于以下几种情况：\
审核当前的 SELinux 策略规则；\
测试新应用程序，看看将 SELinux 策略规则应用到这些程序时会有什么效果；\
解决某一特定服务或应用程序在 SELinux 下不再正常工作的故障。\
\
某些情况下，可使用 audit2allow 命令来读取 SELinux 审核日志并生成新的 SELinux 规则，从而有选择性地允许被拒绝的行为，而这也是一种在不禁用 SELinux 的情况下，让应用程序在 Linux 系统上工作的快速方法。

### **Enforcing工作模式（强制模式）**

Enforcing 模式， SELinux 被启动，并强制执行所有的安全策略规则。

## 禁用SELinux

&#x20;**查看SElinux状态**

```
[root@hezhiqiang ~]# getenforce
Enforcing
```

临时修改selinux模式为Permissive工作模式（宽容模式）

```
[root@hezhiqiang ~]# setenforce 0
[root@hezhiqiang ~]# getenforce
Permissive
```

永久修改selinux模式为Disable工作模式（关闭模式）

```
[root@hezhiqiang ~]# grep -i  ^selinux   /etc/selinux/config
SELINUX=enforcing
[root@hezhiqiang ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
[root@hezhiqiang ~]# grep "SELINUX=disabled" /etc/selinux/config
SELINUX=disabled
```

## 关闭防火墙

{% hint style="info" %}
&#x20;**CentOS 7默认使用的是firewall作为防火墙**
{% endhint %}

```
systemctl stop    firewalld.service 
systemctl disable firewalld.service 
```

### 开机时间优化

* `systemd-analyze time              #查看系统的启动时间`
* `systemd-analyze blame             #查看系统每个服务的启动时间`
* `systemd-analyze plot >bootime.avg #生成图形化效果，然后sz bootime.avg下载`

### 开机启动时间

```
[root@hezhiqiang ~]# systemd-analyze time
Startup finished in 483ms (kernel) + 1.405s (initrd) + 27.000s (userspace) = 28.889s
```

### 查看具体的使用时间

```
systemd-analyze blame
```

### 生产图表

```
systemd-analyze plot >bootime.svg #保存到指定文件
sz bootime.svg                    #上传到windown查看
```

### 开机启动项优化

```
systemctl list-unit-files|egrep "^ab|^aud|^kdump|vm|^md|^mic|^post|lvm" |awk '{print $1}'|sed -r 's#(.*)#systemctl disable &#g'|bash
```
