[TOC]
# Linux系统启动过程
我们来一起看CentOS7的启动过程、重要文件和修改启动级别。
## 启动过程
以下截图为CentOS7启动过程。
![](https://img.kancloud.cn/e6/69/e669e80dfbbacf3982d71698f2e51142_874x744.png =800x700 )
## Systemd
CentOS7使用到了Systemd,在CentOS早期版本都使用的是Init进程,关于Init进程启动有两个缺点:
* Init是串行启动,所以启动时间较长
* 启动脚本较为复杂
而Systemd就是为解决这些问题,它的设计初衷就是为系统启动和管理提供一套完整解决方案。Systemd 的优点是功能强大,使用方便,缺点是体系庞大(以下截图来源于网络)。
![](https://img.kancloud.cn/da/3b/da3b2a7f589d3e135354249b5f64b478_1482x844.png)
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/system/*.target
/lib/systemd/system/anaconda.target
/lib/systemd/system/runlevel0.target
/lib/systemd/system/basic.target
...
```
可以看到Runlevel开头的Target文件,对应着CentOS6的启动级别,不过一样是软链接,指向了同目录下的其他文件。
* 0 ==> runlevel0.target, poweroff.target ( 系统停机维护状态)
* 1 ==> runlevel1.target, rescue.target (单用户工作状态)
* 2 ==> runlevel2.target, multi-user.target (多用户状态,没有NFS)
* 3 ==> runlevel3.target, multi-user.target (多用户态,有NFS)
* 4 ==> runlevel4.target, multi-user.target (系统保留)
* 5 ==> runlevel5.target, graphical.target (图形界面)
* 6 ==> runlevel6.target, reboot.target (重启系统)
## 修改启动级别
在CentOS6中启动级别需要修改/etc/inittab文件,到CentOS7修改启动级别就变为以下两种方式:
* 通过Systemctl命令来修改 (推荐)
* 修改系统链接文件
**Systemctl命令修改**
关于Systemctl命令的使用方式如下。
1.查看当前启动级别。
```
[djangowang@localhost ~]# systemctl get-default
multi-user.target
```
2.修改启动级别为图形。
```
[djangowang@localhost ~]# systemctl set-default graphical.target
```
在CentOS7.8系统,设置图形启动要提前进行安装,安装图形包的方式如下:
```
[djangowang@localhost ~]# yum groupinstall "GNOME Desktop" "Graphical Administration Tools"
```
3.恢复启动级别为多用户。
```
[djangowang@localhost ~]# systemctl set-default multi-user.target
```
**修改系统链接文件**
Systemctl最终也是修改的/lib/systemd/system/ctrl-alt-del.target文件。我们也可以通过修改此软连接达到修改启动级别的目的。
1.查看默认链接文件的指向。
```
[djangowang@localhost ~]# ls -al /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 Apr 21 2016 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target
```
2.默认指向了多用户启动,将多用户启动改为图形启动,修改方式如下:
```
[djangowang@localhost ~]# ln -sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target
```
In命令用于修改文件的软连接,它的两个参数含义:
*\-f 强制执行
*\-s 软链接指向
## 将脚本添加启动项
我们来介绍一下如何通过Systemctl命令来启动自己的程序。譬如有这样一个脚本/data1/test.sh的脚本,将这个脚本添加到系统启动项中,进入/etc/systemd/system/目录,创建test.service文件内容如下:
```
[Unit]
Description=test
After=
[Service]
ExecStart=/data1/test.sh
TimeoutStartSec=0
TimeoutStopSec=30
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
```
切记test.service文件中不能包含中文,如果包含中文会导致你的系统启动异常。关于test.service参数:
* Description # 文件描述
* After # 后置脚本
* ExecStart=/data1/test.sh # 启动时执行程序路径
* ExecStop= # 关闭时执行程序路径
* TimeoutStartSec=0 # 等待启动的时间
* TimeoutStopSec=30 # 等待关闭的超时时间
* RemainAfterExit=yes # 当该服务的所有进程全部退出之后, 是否依然将此服务视为活动(active)状态
* WantedBy=multi-user.target # 在某个级别下启动,当前是多用户状态启动
创建test.sh测试脚本,并以死循环方式运行,内容如下(记得程序要给chmod u+x 权限)。
```
#!/bin/bash
while :
do
sleep 2
echo "test" >> /tmp/log
done
```
将以上脚本加入到启动项。
```
[djangowang@localhost ~]# systemctl enable /etc/systemd/system/test.service
```
确定是否加载成功。
```
[djangowang@localhost ~]# systemctl list-unit-files | grep test.service
test.service enable
```
关于返回状态,这里一共四种:
* enabled:已建立启动链接
* disabled:没建立启动链接
* static:该配置文件没有`[Install]`部分(无法执行),只能作为其他配置文件的依赖
* masked:该配置文件被禁止建立启动链接
如果马上执行此程序,可以通过以下命令实现。
```
[djangowang@localhost ~]# systemctl start test.service
```
# 系统管理命令
在介绍目录结构时,我们曾介绍过Linux系统命令,分别保存在/bin/和/sbin/目录下,其中/sbin更多是系统管理员使用的命令,我们可以通过“whereis+命令”方式查看,系统命令存放的目录位置。在学完本节后您会发现,passwd命令在修改密码时,最终会把修改后的结果写入 /etc/shadow 文件 ,useradd命令创建用户后的信息,分别写入 /etc/passwd 和 /etc/group文件中,还有netstat命令最终读取的是 /proc/net/unix 文件内的信息,并通过sscanf函数对文件内容进行解析格式化后输出,方便我们阅读。在掌握这些系统命令的同时,最好还要更深入了解他的工作原理和作用的文件,方便我们后续做自动化运维时通过自己写的程序,来批量控制成百上千台Linux服务器。 接下来我们将介绍系统管理时的一些常用命令。
## groupadd命令
groupadd命令为系统增加组名,此命令会把增加的组名写入/etc/group文件中,groupadd命令的常用参数:
* -g GID # 自行设定 GID 的值
1.创建guest1群组,并设定GID为77。
```
[djangowang@localhost ~]# groupadd -g 77 guest1
```
2.groupdel命令为系统删除组,此命令会把/etc/group文件中的组名清除。
```
[djangowang@localhost ~ ]# groupdel guest1
```
## chown命令
chown命令用来更改某个目录或文件的用户名和用户组,chown命令的常用参数:
* -R # 递归修改
```
[djangowang@localhost ~ ]# chown user:group text.txt
[djangowang@localhost ~ ]# chown -R user:group /data1/myPrivate/*
```
## useradd命令
useradd命令为系统增加一个用户,useradd命令的常用参数:
* -u # 直接设置一个 UID
* -g # 直接设置一个 GID (此 GID 必须已经存在于 /etc/group 当中)
* -d # 直接将它的家目录,指向已经存在的目录(系统不会再默认创建)
* -M # 不建立家目录
* -s # 定义其使用的Shell
1.创建一个名为guest1的系统用户。
```
[djangowang@localhost ~ ]# useradd guest1
```
2.创建guest2用户,指定UIN、GID和Bash。
```
[djangowang@localhost ~ ]# useradd -u 720 -g 100 -s /bin/bash guest2
```
3.删除guest1用户。
```
[djangowang@localhost ~ ]# userdel guest1
```
*注:userdel命令删除用户在系统注册的信息后,宿主目录保留了用户数据,系统并不会删除。*
## passwd命令
passwd命令有两个常用功能,分别为修改用户的密码,设置新账号的密码,passwd命令的常用参数:
* -d # 删除密码
* -f # 强迫用户下次登录时必须修改口令
* -w # 密码要到期提前警告的天数
* -l # 停止账号使用
* -i # 密码过期后多少天停用账户
* -S # 显示用户密码相关信息
* -- stdin # 将密码通过管道从标准输入中设置
1.创建一个临时用户guest1,并设置它的密码。
```
[djangowang@localhost ~ ]# passwd guest1
Changing password for user guest1
New password: # 输入密码
Retype new password: # 再次输入密码
passwd: all authentication tokens updated successfully # 修改密码成功
```
2.如果不希望使用交互式Shell,可以使用以下方式来修改密码。
```
[djangowang@localhost ~ ]# echo "123456" | passwd --stdin root
```
3.通过chpasswd命令来批量用户的密码。譬如我们先创建一个user.txt文本文件,文件内容格式(username:password) ,内容如下:
```
guest1:abc123
guest2:dfasdf
```
将以上文件内容通过重定向命令,指向chpasswd命令,如下:
```
[djangowang@localhost ~ ]# chpasswd < user.txt
```
这样就可以同时修改两个用户的密码了。
## su命令
su命令切换系统用户。它可以从普通用户切换为管理员用户(root),也可以从普通用户切换任意系统其它用户。
```
[djangowang@localhost ~ ]$ su
Password: # 输入 root 的密码
[djangowang@localhost ~ ]# # 身份变成 root
[djangowang@localhost ~ ]# su - # 加载 root 用户的环境变量
[djangowang@localhost ~ ]# su guest1 # 将 root 的身份改为 guest1 ,且不需要输入密码
[djangowang@localhost ~ ]$ # 身份变为普通用户
```
Linux系统在终端界面下,通过两种符号来区分用户的权限,这两个符号分别为:
* \# 管理员权限
* $ 普通账号权限
## w命令
w命令查看当前登录的用户。当系统中存在异常登录的用户,说明有可能系统被入侵,需要加固我们的系统安全,强制踢掉异常登录的用户,踢掉用户可以使用kill命令。
```
[djangowang@localhost ~ ]# w
00:17:54 up 188 days, 23:28, 1 user, load average: 0.12, 0.16, 0.17
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
djangowang pts/0 58.155.233.6 00:17 0.00s 0.02s 0.00s w
```
## top 命令
top命令(display Linux processes)动态的查看当前系统状态,包括CPU、内存等主要的信息。
![](https://img.kancloud.cn/c6/f0/c6f0caf2ef0cbc38c1f8148f245e939a_1193x1034.png)
**进入与退出**
关于top命令的使用与退出,如下。
```
[djangowang@localhost ~]# top
```
通过“ctrl+c ”快捷键或小写字母q退出。
**top命令输出第一部分**
* 第一行,系统启动天数,登录用户数和load average(系统负载)
* 第二行,Tasks: 29 total (进程总数 )、1 running (正在运行的进程数) 、28 sleeping (睡眠的进程数 )、0 stopped (停止的进程数 )、0 zombie (僵尸进程数)
* 第三行,Cpu(s): 0.3% us (用户空间占用CPU百分比) 、1.0% sy (内核空间占用CPU百分比 )、0.0% ni (用户进程空间内改变过优先级的进程占用CPU百分比) 、98.7% id (空闲CPU百分比) 、0.0% wa (等待输入输出的CPU时间百分比) 、0.0% hi (硬中断占比)、0.0% si (软中断占比)
* 第三行,Mem: 191272k total (物理内存总量) 、173656k used (使用的物理内存总量) 、17616k free (空闲内存总量 )、22052k buff/cache (Buffer用来缓存尚未写入磁盘的内容,Cache(Page Cache)用于从磁盘读取的内容 )
* 第四行,Swap: 192772k total (交换区总量) 、0k used (使用的交换区总量)、192772k free (空闲交换区总量)。
**top命令输出第二、三部分**
* PID 进程Id
* USER 进程所有者的用户名
* %CPU CPU时间占用的百分比
* TIME+ 进程使用的CPU时间总计,单位1/100秒
* COMMAND 命令名/命令行
**其他参数**
进程信息区统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。
| 列名 | 含义 |
| --- | --- |
| PPID | 父进程id |
| PR | 优先级 |
| NI | 负值表示高优先级,正值表示低优先级 |
| VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
| RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA ,CODE 可执行代码占用的物理内存大小,单位kb ,DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb |
| SHR | 共享内存大小,单位kb |
**案例**
1. 输入TOP命令后,再输入1,查看逻辑CPU的个数
2. “top -u root”,查看用户为root的动态进程信息
3. “top -p 1233”,查看指定PID的动态进程信息
4. “top -c”, 查看命令的完成路径
5. “top -m" 切换显示内存信息
6. 输入TOP命令后,再次输入大写字母E,替换内存与swap的显示单位,单位Mib
7. 输入TOP命令后,再次输入小写字母e, 替换VIRT、RES和SHR的显示单位,单位m
8. 输入TOP命令后,再次输入小写字母f,添加更多列选项。
## ps命令
ps (ps - report a snapshot of the current processes)命令查看系统进程命令。ps命令的常用参数:
* -e # 显示所有进程,环境变量
* -f # 全格式
* -u # 显示指定用户的进程
* -l # 显示自己的Bash相关的进程
* -o # 显示指定字段
1.ps命令的案例。
```
[djangowang@localhost ~ ]# ps –efl
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 68272 ep_pol 2020 ? 00:22:28 /usr/lib/systemd/systemd --system --deserialize 22
1 S root 2 0 0 80 0 - 0 kthrea 2020 ? 00:00:05 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 2020 ? 00:06:54 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 2020 ? 00:00:00 [kworker/0:0H]
...
```
返回解释:
* F 代表这个程序的旗标 (flag), 4 代表使用者为 super user(管理员用户)
* S 代表这个程序的状态 (STAT)
* UID 程序被该 UID 所拥有
* PID 程序进程ID
* PPID 父程序的ID
* C CPU 使用的资源百分比
* PRI Priority (优先执行序) 的缩写
* NI Nice 值,进程的优先级
* ADDR kernel function,一般就是 "-"
* SZ 使用掉的内存大小
* WCHAN 程序是否正在运行中,若为 - 表示正在运行中
* TTY 登入者的终端机位置
* TIME 使用掉的 CPU 时间
* CMD 所下达的指令为何
2.显示进程的指定字段,其中字段含义如下
* pid # 进程Id
* comm # 进程名
* user # 进程用户
* lstart # 启动时间
* etime # 运行时间
以下为执行命令。
```
[djangowang@localhost ~ ]# ps -eo pid,comm,user,lstart,etime
16776 kworker/0:2 root Tue Mar 16 21:24:01 2021 01:25:18
17465 kworker/0:0 root Tue Mar 16 21:29:02 2021 01:20:17
22886 kworker/u4:1 root Sun Mar 7 13:05:01 2021 9-09:44:18
...
```
3.关于nice值,当服务器资源比较紧张的时候,可以通过调整优先级来优先处理某个进程的请求。nice 优先级由 -20~19这个范围来表示优先级大小,数值越小,优先级越高,使用renice命令来修改它,如renice -20 1460 ,来将1460这个进程的优先级调整为-20。
*注:负载不高时可以使用top命令或ps命令查看系统负载,但负载高时一定要用ps命令,因为top命令也需要CPU大量计算,在系统负责高时加重系统的负担。*
## kill命令
kill命令主要用于“杀”进程,它的工作原理是给进程发信号,让其结束自己,最终怎么处理这个信号要看接收信号的进程本身和系统内核。kill命令的常用参数:
* -l # 查看信号列表
* HUP # 杀掉进程并重启进程
* -9 # 强制杀进程
1.查看进程,查杀进程、强制查杀进程,和杀死并重启进程。
```
[djangowang@localhost ~ ]# ps –ef
UID PID PPID C STIME TTY TIME CMD
root 154 7 0 Jun10 ? 00:00:00 [pdflush]
[djangowang@localhost ~ ]# kill 154
```
2.查看当前登录的用户,发现异常用户后,将异常用户剔除。
```
[djangowang@localhost ~ ]# w
21:51:32 up 23:50, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 116.77.73.251 21:51 4.00s 0.01s 0.00s w
root pts/1 106.53.60.21 21:51 4.00s 0.01s 0.01s -bash
```
譬如,剔除来自IP:106.53.60.21的用户。查到它的进程ID,并杀掉这个进程。
```
[djangowang@localhost ~ ]# ps -ef | grep pts/1
root 12911 1674 0 21:51 ? 00:00:00 sshd: root@pts/1
[root@VM-0-3-centos ~]# kill -9 12911
```
这时异常登录的用户会断线。
3.关于kill的常见应用场景。
* 进程处于IO等待中,这个时候属于信号屏蔽阶段,对于Kill发送过来的信号,自然不会做出反应,要判断这种情况,可以通过命令 ps aux|grep pid 查看进程状态,如果是D状态,则属于这种情况。这个情况下,一旦IO得到满足了,再次发Kill就可以干掉进程,否则只能重启服务器。
* CPU达到100%了,按CPU负载进行从高到底排序命令ps aux --sort=-pcpu,优先杀掉高负载的进程,否则进程得不到必须的CPU的处理,整个机器会慢慢的卡死或工作异常。
* 僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。我们可以通过命令 ps aux | grep z 进程状态查到它,并将它杀掉。
## free命令
free (Display amount of free and used memory in the system)内存查看命令。free命令常用参数:
* -m # 用 M显示内存的使用情况
* -i # 显示Inode信息
我们来查看一下当前系统内存与Swap的情况。
```
[djangowang@localhost ~]# free -m
total used free shared buff/cache available
Mem: 992 385 63 0 544 459
Swap: 0 0 0
```
返回解释:
* total:表示物理内存总量
* used:内存的使用量
* free:未被分配的内存
* shared:共享内存
* buffers/cache:Buffer用来缓存尚未写入磁盘的内容,Cache(Page Cache)用于从磁盘读取的内容,此功能主要用于提高系统的性能
* available :是应用程序认为可用内存数量,available = free + buffer + cache
## df命令
df (report file system disk space usage)查看磁盘大小命令 。df命令的常用参数:
* -h # 可读性较好的方式显示
* -i # 显示Inode的信息
```
[djangowang@localhost ~]# df -h
文件系统 容量 已用 可用 已用率% 挂载点
devtmpfs 487M 0 487M 0% /dev
tmpfs 497M 24K 497M 1% /dev/shm
tmpfs 497M 424K 496M 1% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
/dev/vda1 50G 18G 29G 39% /
tmpfs 100M 0 100M 0% /run/user/0
```
*注:挂载点的可用率是一个重要的指标,通常监控服务器的磁盘,此值一个重点的监控项*
## ifconfig命令
Ifocnfig命令查看当前系统网卡的IP地址。还可以通过此命令对网卡的状态进行管理。
```
[djangowang@localhost ~ ]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0A:EB:23:8B:90
inet addr:192.168.102.131 Bcast:192.168.102.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2409578 errors:0 dropped:0 overruns:0 frame:0
TX packets:965998 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:840272734 (801.3 MiB) TX bytes:918115554 (875.5 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:2307728 errors:0 dropped:0 overruns:0 frame:0
TX packets:2307728 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:161369570 (153.8 MiB) TX bytes:161369570 (153.8 MiB)
```
以下为Ifconfig命令的输出解释:
* eth0表示:以太网卡零
* inet addr:192.168.102.131本机的IP地址
* Bcast:192.168.102.255 本机的广播地址,用于同时发信息给网络上的其它地址
* Mask:255.255.255.0 本机淹码,本机与网络其他机器进行通信时,判断是否在同一网内
* RX bytes:840272734 (801.3 MiB) RX接收数据大小
* TX bytes:918115554 (875.5 MiB) TX发送数据大小
* MTU:每个数据包的最大传输单元位(MAXimum Transmission Unit)用来控制数据包大小,默认是1500
1.Ifconfig除用于查看本机的IP地址以外,可以修改本机的IP地址(主要用在局域网场景)。
```
[djangowang@localhost ~ ]# ifconfig eth0:0 192.168.102.10 netmask 25.255.255.0
eth0 Link encap:Ethernet HWaddr 00:0A:EB:23:8B:90
inet addr:192.168.102.10 Bcast:192.168.102.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2409578 errors:0 dropped:0 overruns:0 frame:0
TX packets:965998 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:840272734 (801.3 MiB) TX bytes:918115554 (875.5 MiB)
```
2.Ifconfig命令关闭和开启网卡。Down关闭Eth0网卡,Up开启Eth0网卡。
```
[djangowang@localhost ~ ]# ifconfig eth0 down
[djangowang@localhost ~ ]# ifconfig eth0 up
```
## netstat命令
Netstat命令查看本机网络的状态和路由,Netstat命令的常用参数:
* \-n # 不做名字解释
* \-l # 列出有在 Listen (监听) 的服务状态
* \-t # 显示TCP相关选项
* \-r # 查看本机路由
1.查看本机监听的TCP端口。
```
[djangowang@localhost ~ ]# netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
```
2.查看本机路由。
```
[djangowang@localhost ~ ]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default gateway 0.0.0.0 UG 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.224.0 U 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 0 0 0 eth0
```
*注:以上命令的结果与rounte -n 命令的结果一致*
## lsof命令
lsof命令查看连接状态。lsof命令的常用参数:
* -i # 接端口,查看端口的连接状态
查看80端口是由哪个程序监听的。
```
[djangowang@localhost ~ ]# netstat –an | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 :::80 :::* LISTEN
tcp 0 0 :::22 :::* LISTEN
...
[djangowang@localhost ~ ]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
httpd 28126 root 3u IPv6 87902392 TCP *:http (LISTEN)
httpd 28141 www 3u IPv6 87902392 TCP *:http (LISTEN)
httpd 28142 www 3u IPv6 87902392 TCP *:http (LISTEN)
...
```
## 检索命令
Locate命令用于快速检索文件,它和Find命令的区别,Find实时检索磁盘上的文件,Locate是检索的存在数据库中的索引,所以速度要比Find命令快很多,但确实检索并非实时数据。Locate命令的使用方式:
```
[djangowang@localhost ~ ]# updatedb && locate *.conf
```
它的工作原理,Updatedb命令是将当前磁盘上的数据做一个索引更新到本地数据库中,接着使用Locate命令来检索索引中的文件。
# 特殊符号
Linux除了系统命令外还有一些常用的符号命令。在Linux哲学中你会发现它的设计初衷,并不是把所有的功能设计的大而全,而是小而精,譬如ls并不能满足我们所有的需求,但是我们可以通过“管道”拼接其它命令的方式来实现我们想要的功能。当你真正掌握Linux后,你可以想一下是否有什么功能是Linux不能完成的,貌似是没有,所以希望读者在学习Linux过程中,还能适当了解命令和操作系统开发的背景和它背后设计的哲学。
## 管道命令
管道“|”主要用于串联命令的输入和输出。前一个命令的输出作为第二个命令的输入。
```
[djangowang@localhost ~]# cat /etc/passwd | cut -d: -f1 > log
````
多个管道,将字符串进行切割并将大写转为小写。
```
[djangowang@localhost ~]# echo "Hello World : Hello Linux" | cut -d : -f1 | tr [:upper:] [:lower:]
hello world
```
## && 和 || 符号的使用
作为Linux系统管理员要学会“偷懒”,能一行实现的任务就避免通过多行多个命令来实现。在 Linux中就有这样一对命令用来“偷懒” ,其中“&& ”表示前一个命令执行成功,再执行后一个命令,其中命令与命令之间,可以通过“&&”无限延续下去。“||”和“&&”正好相反,表示前一个命令执行失败,再执行第二个命令。
1.“&&”符号案例。
```
[djangowang@localhost ~]# ls && mv * /tmp
```
*注:还可以使用“;”来将两个命令放到一行,“;”与 “&&” 相比,前者只起到将多个命令放入一行执行,语法上不会报错*
2.“||” 符号案例。
```
[djangowang@localhost ~]# ls || echo "empty"
```
## 重定向
在Linux中重定向是非常实用的功能。譬如,将某个命令的输出重定向文件中,间隔一段时间后再次重定向,对比两次命令输出的差别。
| 命令 | 解释 |
| --- | --- |
| command > file | 将输出重定向到 file |
| command < file | 将file中内容重定向给命令 |
| command >> file | 将输出以追加的方式重定向到 file |
| command > file 2>&1 | 标准错误输出 重定向到 标准输出 |
| command > /dev/null | 将数据重定向到空洞 |
| > filename | 清空文件 |
三个比较常见的文件描述符。
| 文件描述符 | 缩写 | 描述 |
| --- | --- | --- |
| 0 | STDIN | 标准输入 |
| 1 | STDOUT | 标准输出 |
| 2 | STDERR | 标准错误输出 |
1.ls查看test文件,其中test文件并不存在会报错,如何将错误的信息追加到log日志文件,这里我们就可以使用文件描述符“2”。
```
[djangowang@localhost ~]# ls test > log
ls: cannot access tt: No such file or directory
[djangowang@localhost ~]# ls test 2> log
```
2.将passwd文件内容重定向给wc命令。
```
[djangowang@localhost ~]# wc < /etc/passwd
37 72 1878
```
3.清空文件内容。
```
[djangowang@localhost ~]# > test
```
## 后台运行相关命令
我们在管理服务器时通常需要把一些脚本放置在后台运行或从后台调出到前台运行等,这时就需要使用到“&”放置后台命令、nohup命令、jobs命令、fg命令放置后台运行、bg调用前台运行和ctrl + z快捷键等。在测试这些命令前,我们先编写测试程序脚本 test.sh,内容如下:
```
#!/bin/bash
while :
do
echo "this is test"
sleep 2
done
```
接下来我们介绍以下6个案例的使用方法:
* & 将程序放到后台
* nohup 将程序放到后台,同时将标准输出和标准错误写入当前目录下的nohup.out文件
* jobs查看后台命令列表
* bg将后台停止的命令,转为执行状态
* fg将后台的进程,调到前台执行
* ctrl + z快捷键,暂定某后程序的执行
1. 将程序放到后台运行。
```
[djangowang@localhost ~]# sh test.sh >> log &
```
将任务放到后台 ,即使关闭Shell退出当前Session依然继续运行,但标准输出和标准错误信息会丢失。
2.nohup命令将程序放到后台运行。
```
[djangowang@localhost ~]# nohup sh test.sh >> log &
```
将任务放到后台,关闭标准输入,前台不再接收任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭Shell退出当前Session依然继续运行。
3.jobs命令,查看当前后台的命令列表。
```
[djangowang@localhost ~]# jobs
[1] Stopped sh test.sh >> log
[2]- Stopped sh test.sh >> log
[3]+ Stopped sh test.sh >> log
[4] Running nohup sh test.sh >> log &
[5] Running nohup sh test.sh >> log &
[6] Running nohup sh test.sh >> log &
```
4.bg命令将后台暂停的命令变为继续执行。 通过jobs命令返回的内容,执行bg %1 ,其中“%”是一个固定格式后接jobs返回的列表状态为Stopped的,将暂停的状态改为已执行。
```
[djangowang@localhost ~]# bg %1
[1] Stopped sh test.sh >> log
[2]- Stopped sh test.sh >> log
[3]+ Stopped sh test.sh >> log
[4] Running nohup sh test.sh >> log &
[5] Running nohup sh test.sh >> log &
[6] Running nohup sh test.sh >> log &
```
5.fg命令将放置后台命令调到前台执行。
```
[djangowang@localhost ~]# fg %1
[1] Stopped sh test.sh >> log
```
6. ctrl + z快捷键,可以将一个正在前台执行的命令放到后台,并且暂停。
## 创建多个文件
通过“{}”符号可以一次创建多个文件或目录,可以按规则也可以自定义。
```
[djangowang@localhost ~]# touch {a,b,c,d,f} && ls
a b c d f
```
# 认识系统重要的文件
## 认识 /etc/passwd 文件与/etc/shadow文件
这两个文件,主要用于存放系统的用户与密码。
**/etc/passwd文件**
使用vim命令打开passwd文件,文件每一行都代表一个用户,切记不要轻易修改本文件,如果一定要修改需要提前进行备份。Linux系统管理员养成一个修改或删除文件前,做提前备份的习惯也是非常重要的。
```
# 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中定时任务是非常常用的工具之一,如系统定时备份、恢复、监控采集和系统维护等场景都需要使用到它。通常在Linux中有三种定时任务分别:
* 一次性的任务,用“at”
* 周期性任务,用“crond”
* 异步的定时任务调度器,用“anacrontab”
本节主要介绍一次性任务和周期性任务两种最常用的应用场景。
## 一次性的任务
一次性任务我们通常用“at”命令来完成,譬如以下案例。
```
[djangowang@localhost ~]# at 17:45
at> ls /etc/* > /tmp/djangowang.log
at> <EOT>
```
其中17:45为执行的时间,ls为执行的命令,“<EOT>”为结束符,通过快捷键“ctrl + d” 退出。通过at-l查看当前一次性的任务队列。
```
[djangowang@localhost ~]# at -l
4 Mon Feb 22 17:45:00 2021 a root
```
## 多次有周期性任务
Crond定时计划任务,我们可以将一些例行的工作交给系统执行,譬如每天的数据备份这时我们就需要用到Crond它的常用命令是Crontab,Crontab的基本操作:
* crontab -u # 设定某个用户的cron服务
* crontab -l # 列出某个用户cron服务的详细内容
* crontab -r # 删除某个用户的cron服务
* crontab -e # 编辑某个用户的cron服务
* crontab -i # 打印提示,输入yes等确认信息
我们执行( crontab -e )调出任务列表,其中任务列表的格式如下(或查看cat /etc/crontab文件 ):
```
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
定时任务的每段为:分,时,日,月,周,用户,命令
第1列表示分钟1~59 每分钟用\*或者 \*/1表示
第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.d/\*。
## 定时任务案例
1. 每两分钟执行一次( command )命令。
```
*/2 * * * 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。
# 系统备份
作为一个合格的运维工程师,平日工作中最重要的就是备份数据,除备份数据外还要养成以下比较好的习惯:
* 登录尽量不使用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的世界中有着不同的发行版本,不同的发行版本安装软件方式也不一样。在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 <package_name>
* 仅更新指定的软件命令:yum update <package_name>
* 列出所有可安裝的软件清单命令:yum list
* 删除软件包命令:yum remove <package_name>
* 查找软件包命令:yum search <keyword>
## RPM 安装软件
rpm命令用于安装本地以*.rpm结尾的包软件。譬如在本地安装Nginx.rpm。通常这种情况是服务器与互联网不通,如校园内网、公司内网等,我们通过从公网下载RPM文件后,通过U盘将数据转到内网服务器并安装。
```
[djangowang@localhost ~]# rpm -ivh nginx.rpm
```
查看本机安装Nginx的版本。
```
[djangowang@localhost ~]# rpm -qa | grep nginx
```
关于rpm命令常用的参数如下:
* -a # 查询所有软件包。
* -e # 删除指定软件包
* -i # 显示软件包信息
* -l # 列表显示已经安装的软件包
* -q # 使用询问模式,当遇到任何问题时,rpm指令会先询问用户
* -v # 显示指令执行过程
* -vv # 详细显示指令执行过程,便于排错
* -h # 显示安装的进度
## 源码安装
我们需要对软件进行一些定制,如开关某些核心功能,以达到安全和性能的一个平衡,这些我们都需要通过源码编译来安装软件。我们以安装Openssh软件包为例。 首先下载软件包:
```
[djangowang@localhost ~]# wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz
```
解压缩后进入目录进行配置、编译和安装三步:
```
[djangowang@localhost ~]# cd openssl-1.1.1
[djangowang@localhost ~]# ./config shared zlib 配置
[djangowang@localhost ~]# make 编译
[djangowang@localhost ~]# make install 安装
```
在CentOS7.8中会报“fatal error: zlib.h: no such file or directory ”错误,解决方法。
```
[djangowang@localhost ~]# wget http://www.zlib.net/zlib-1.2.11.tar.gz
[djangowang@localhost ~]# tar zxvf zlib-1.2.11.tar.gz
[djangowang@localhost ~]# cd zlib-1.2.11
[djangowang@localhost ~]# ./configure
[djangowang@localhost ~]# make test
[djangowang@localhost ~]# make install
```
接着构建共享库。
```
[djangowang@localhost ~]# make clean
[djangowang@localhost ~]# ./configure --shared
[djangowang@localhost ~]# make test
[djangowang@localhost ~]# make install
[djangowang@localhost ~]# cp zutil.h /usr/local/include
[djangowang@localhost ~]# cp zutil.c /usr/local/include
```
其中配置是指软件安装目录、开启的功能和参数等,编译(make)是指将C语言代码编译成可执行文件,安装(make install)是指将代码安装到系统的指定目录中。根据软件的不同,安装后还要经过一些配置如下:
```
[djangowang@localhost ~]# mv /usr/bin/openssl /usr/bin/openssl.bak
[djangowang@localhost ~]# mv /usr/include/openssl /usr/include/openssl.bak
[djangowang@localhost ~]# find / -name openssl
[djangowang@localhost ~]# ln -s /usr/local/bin/openssl /usr/bin/openssl
[djangowang@localhost ~]# ln -s /usr/local/include/openssl /usr/include/openssl
[djangowang@localhost ~]# echo "/usr/local/lib64/" >> /etc/ld.so.conf
[djangowang@localhost ~]# ldconfig
[djangowang@localhost ~]# openssl version -a
```
最后验证软件是否安装成功,执行“openssl version”命令。
# 磁盘管理
我们在搭建一台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登录系统解决。*
# 本章小结
在这一章我们首先学习了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。