[toc]
Linux系统启动过程
我们来一起看CentOS7的启动过程、重要文件和修改启动级别。
启动过程
以下截图为CentOS7启动过程。
![](linux_enterprise/images/screenshot_1613530845383.png =800x700 )
Systemd
CentOS7使用到了Systemd,在CentOS早期版本都使用的是Init进程,关于Init进程启动有两个缺点:
- Init是串行启动,所以启动时间较长
- 启动脚本较为复杂
而Systemd就是为解决这些问题,它的设计初衷就是为系统启动和管理提供一套完整解决方案。Systemd 的优点是功能强大,使用方便,缺点是体系庞大(以下截图来源于网络)。
Systemctl是Systemd的主要命令,用于管理系统。它的常用语法如下:
1 | # systemctl start [name.service] |
注:在Linux系统早期我们可以通过Service命令来管理一些常用的程序生命周期,在CentOS7后推荐用Systemctl来管理程序的生命周期,当然Service命令还是可以使用的。
我们通过修改系统状态的生命周期,来看一下sytemctl命令的用法:
1 | # 重启系统 |
重启系统和关机的几重方式:
- 重启系统:systemctl reboot、reboot、init 6
- 关机:systemctl halt、halt、init 0
重要文件介绍
启动过程Systemd会调用软链接 /etc/systemd/system/default.target ,来最终确认启动级别。
1 | [djangowang@localhost ~]# ls /lib/systemd/system/*.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.查看当前启动级别。
1 | [djangowang@localhost ~]# systemctl get-default |
2.修改启动级别为图形。
1 | [djangowang@localhost ~]# systemctl set-default graphical.target |
在CentOS7.8系统,设置图形启动要提前进行安装,安装图形包的方式如下:
1 | [djangowang@localhost ~]# yum groupinstall "GNOME Desktop" "Graphical Administration Tools" |
3.恢复启动级别为多用户。
1 | [djangowang@localhost ~]# systemctl set-default multi-user.target |
修改系统链接文件
Systemctl最终也是修改的/lib/systemd/system/ctrl-alt-del.target文件。我们也可以通过修改此软连接达到修改启动级别的目的。
1.查看默认链接文件的指向。
1 | [djangowang@localhost ~]# ls -al /etc/systemd/system/default.target |
2.默认指向了多用户启动,将多用户启动改为图形启动,修改方式如下:
1 | [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文件内容如下:
1 | [Unit] |
切记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 权限)。
1 | #!/bin/bash |
将以上脚本加入到启动项。
1 | [djangowang@localhost ~]# systemctl enable /etc/systemd/system/test.service |
确定是否加载成功。
1 | [djangowang@localhost ~]# systemctl list-unit-files | grep test.service |
关于返回状态,这里一共四种:
- enabled:已建立启动链接
- disabled:没建立启动链接
- static:该配置文件没有
[Install]
部分(无法执行),只能作为其他配置文件的依赖 - masked:该配置文件被禁止建立启动链接
如果马上执行此程序,可以通过以下命令实现。
1 | [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。
1 | [djangowang@localhost ~]# groupadd -g 77 guest1 |
2.groupdel命令为系统删除组,此命令会把/etc/group文件中的组名清除。
1 | [djangowang@localhost ~ ]# groupdel guest1 |
chown命令
chown命令用来更改某个目录或文件的用户名和用户组,chown命令的常用参数:
- -R # 递归修改
1 | [djangowang@localhost ~ ]# chown user:group text.txt |
useradd命令
useradd命令为系统增加一个用户,useradd命令的常用参数:
- -u # 直接设置一个 UID
- -g # 直接设置一个 GID (此 GID 必须已经存在于 /etc/group 当中)
- -d # 直接将它的家目录,指向已经存在的目录(系统不会再默认创建)
- -M # 不建立家目录
- -s # 定义其使用的Shell
1.创建一个名为guest1的系统用户。
1 | [djangowang@localhost ~ ]# useradd guest1 |
2.创建guest2用户,指定UIN、GID和Bash。
1 | [djangowang@localhost ~ ]# useradd -u 720 -g 100 -s /bin/bash guest2 |
3.删除guest1用户。
1 | [djangowang@localhost ~ ]# userdel guest1 |
注:userdel命令删除用户在系统注册的信息后,宿主目录保留了用户数据,系统并不会删除。
passwd命令
passwd命令有两个常用功能,分别为修改用户的密码,设置新账号的密码,passwd命令的常用参数:
- -d # 删除密码
- -f # 强迫用户下次登录时必须修改口令
- -w # 密码要到期提前警告的天数
- -l # 停止账号使用
- -i # 密码过期后多少天停用账户
- -S # 显示用户密码相关信息
- – stdin # 将密码通过管道从标准输入中设置
1.创建一个临时用户guest1,并设置它的密码。
1 | [djangowang@localhost ~ ]# passwd guest1 |
2.如果不希望使用交互式Shell,可以使用以下方式来修改密码。
1 | [djangowang@localhost ~ ]# echo "123456" | passwd --stdin root |
3.通过chpasswd命令来批量用户的密码。譬如我们先创建一个user.txt文本文件,文件内容格式(username:password) ,内容如下:
1 | guest1:abc123 |
将以上文件内容通过重定向命令,指向chpasswd命令,如下:
1 | [djangowang@localhost ~ ]# chpasswd < user.txt |
这样就可以同时修改两个用户的密码了。
su命令
su命令切换系统用户。它可以从普通用户切换为管理员用户(root),也可以从普通用户切换任意系统其它用户。
1 | [djangowang@localhost ~ ]$ su |
Linux系统在终端界面下,通过两种符号来区分用户的权限,这两个符号分别为:
- # 管理员权限
- $ 普通账号权限
w命令
w命令查看当前登录的用户。当系统中存在异常登录的用户,说明有可能系统被入侵,需要加固我们的系统安全,强制踢掉异常登录的用户,踢掉用户可以使用kill命令。
1 | [djangowang@localhost ~ ]# w |
top 命令
top命令(display Linux processes)动态的查看当前系统状态,包括CPU、内存等主要的信息。
进入与退出
关于top命令的使用与退出,如下。
1 | [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 |
案例
- 输入TOP命令后,再输入1,查看逻辑CPU的个数
- “top -u root”,查看用户为root的动态进程信息
- “top -p 1233”,查看指定PID的动态进程信息
- “top -c”, 查看命令的完成路径
- “top -m” 切换显示内存信息
- 输入TOP命令后,再次输入大写字母E,替换内存与swap的显示单位,单位Mib
- 输入TOP命令后,再次输入小写字母e, 替换VIRT、RES和SHR的显示单位,单位m
- 输入TOP命令后,再次输入小写字母f,添加更多列选项。
ps命令
ps (ps - report a snapshot of the current processes)命令查看系统进程命令。ps命令的常用参数:
- -e # 显示所有进程,环境变量
- -f # 全格式
- -u # 显示指定用户的进程
- -l # 显示自己的Bash相关的进程
- -o # 显示指定字段
1.ps命令的案例。
1 | [djangowang@localhost ~ ]# ps –efl |
返回解释:
- 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 # 运行时间
以下为执行命令。
1 | [djangowang@localhost ~ ]# ps -eo pid,comm,user,lstart,etime |
3.关于nice值,当服务器资源比较紧张的时候,可以通过调整优先级来优先处理某个进程的请求。nice 优先级由 -20~19这个范围来表示优先级大小,数值越小,优先级越高,使用renice命令来修改它,如renice -20 1460 ,来将1460这个进程的优先级调整为-20。
注:负载不高时可以使用top命令或ps命令查看系统负载,但负载高时一定要用ps命令,因为top命令也需要CPU大量计算,在系统负责高时加重系统的负担。
kill命令
kill命令主要用于“杀”进程,它的工作原理是给进程发信号,让其结束自己,最终怎么处理这个信号要看接收信号的进程本身和系统内核。kill命令的常用参数:
- -l # 查看信号列表
- HUP # 杀掉进程并重启进程
- -9 # 强制杀进程
1.查看进程,查杀进程、强制查杀进程,和杀死并重启进程。
1 | [djangowang@localhost ~ ]# ps –ef |
2.查看当前登录的用户,发现异常用户后,将异常用户剔除。
1 | [djangowang@localhost ~ ]# w |
譬如,剔除来自IP:106.53.60.21的用户。查到它的进程ID,并杀掉这个进程。
1 | [djangowang@localhost ~ ]# ps -ef | grep pts/1 |
这时异常登录的用户会断线。
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的情况。
1 | [djangowang@localhost ~]# free -m |
返回解释:
- 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的信息
1 | [djangowang@localhost ~]# df -h |
注:挂载点的可用率是一个重要的指标,通常监控服务器的磁盘,此值一个重点的监控项
ifconfig命令
Ifocnfig命令查看当前系统网卡的IP地址。还可以通过此命令对网卡的状态进行管理。
1 | [djangowang@localhost ~ ]# ifconfig |
以下为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地址(主要用在局域网场景)。
1 | [djangowang@localhost ~ ]# ifconfig eth0:0 192.168.102.10 netmask 25.255.255.0 |
2.Ifconfig命令关闭和开启网卡。Down关闭Eth0网卡,Up开启Eth0网卡。
1 | [djangowang@localhost ~ ]# ifconfig eth0 down |
netstat命令
Netstat命令查看本机网络的状态和路由,Netstat命令的常用参数:
- -n # 不做名字解释
- -l # 列出有在 Listen (监听) 的服务状态
- -t # 显示TCP相关选项
- -r # 查看本机路由
1.查看本机监听的TCP端口。
1 | [djangowang@localhost ~ ]# netstat -tnl |
2.查看本机路由。
1 | [djangowang@localhost ~ ]# netstat -rn |
注:以上命令的结果与rounte -n 命令的结果一致
lsof命令
lsof命令查看连接状态。lsof命令的常用参数:
- -i # 接端口,查看端口的连接状态
查看80端口是由哪个程序监听的。
1 | [djangowang@localhost ~ ]# netstat –an | more |
检索命令
Locate命令用于快速检索文件,它和Find命令的区别,Find实时检索磁盘上的文件,Locate是检索的存在数据库中的索引,所以速度要比Find命令快很多,但确实检索并非实时数据。Locate命令的使用方式:
1 | [djangowang@localhost ~ ]# updatedb && locate *.conf |
它的工作原理,Updatedb命令是将当前磁盘上的数据做一个索引更新到本地数据库中,接着使用Locate命令来检索索引中的文件。
特殊符号
Linux除了系统命令外还有一些常用的符号命令。在Linux哲学中你会发现它的设计初衷,并不是把所有的功能设计的大而全,而是小而精,譬如ls并不能满足我们所有的需求,但是我们可以通过“管道”拼接其它命令的方式来实现我们想要的功能。当你真正掌握Linux后,你可以想一下是否有什么功能是Linux不能完成的,貌似是没有,所以希望读者在学习Linux过程中,还能适当了解命令和操作系统开发的背景和它背后设计的哲学。
管道命令
管道“|”主要用于串联命令的输入和输出。前一个命令的输出作为第二个命令的输入。
1 | [djangowang@localhost ~]# cat /etc/passwd | cut -d: -f1 > log |
[djangowang@localhost ~]# echo “Hello World : Hello Linux” | cut -d : -f1 | tr [:upper:] [:lower:]
hello world
1 |
|
[djangowang@localhost ~]# ls && mv * /tmp
1 | *注:还可以使用“;”来将两个命令放到一行,“;”与 “&&” 相比,前者只起到将多个命令放入一行执行,语法上不会报错* |
[djangowang@localhost ~]# ls || echo “empty”
1 |
|
[djangowang@localhost ~]# ls test > log
ls: cannot access tt: No such file or directory
[djangowang@localhost ~]# ls test 2> log
1 | 2.将passwd文件内容重定向给wc命令。 |
[djangowang@localhost ~]# wc < /etc/passwd
37 72 1878
1 | 3.清空文件内容。 |
[djangowang@localhost ~]# > test
1 | ## 后台运行相关命令 |
#!/bin/bash
while :
do
echo “this is test”
sleep 2
done
1 | 接下来我们介绍以下6个案例的使用方法: |
[djangowang@localhost ~]# sh test.sh >> log &
1 | 将任务放到后台 ,即使关闭Shell退出当前Session依然继续运行,但标准输出和标准错误信息会丢失。 |
[djangowang@localhost ~]# nohup sh test.sh >> log &
1 | 将任务放到后台,关闭标准输入,前台不再接收任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭Shell退出当前Session依然继续运行。 |
[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 &
1 | 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 &
1 | 5.fg命令将放置后台命令调到前台执行。 |
[djangowang@localhost ~]# fg %1
[1] Stopped sh test.sh >> log
1 | 6. ctrl + z快捷键,可以将一个正在前台执行的命令放到后台,并且暂停。 |
[djangowang@localhost ~]# touch {a,b,c,d,f} && ls
a b c d f
1 |
|
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
…
1 | 上面是系统预设的几个用户,是系统在使用的。我们先来看一下root 这个系统管理员用户,你可以明显的看出来,每一行使用“:”分隔开,共有七个列,分别是 : |
[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:::
…
1 | 同 /etc/passwd 文件一样,文件中每行代表一个用户,同样使用 “:” 作为分隔符,不同之处在于,每行用户信息被划分为 9 个字段。每个字段的含义如下: |
[djangowang@localhost ~]# at 17:45
at> ls /etc/* > /tmp/djangowang.log
at>
1 | 其中17:45为执行的时间,ls为执行的命令,“<EOT>”为结束符,通过快捷键“ctrl + d” 退出。通过at-l查看当前一次性的任务队列。 |
[djangowang@localhost ~]# at -l
4 Mon Feb 22 17:45:00 2021 a root
1 |
|
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,每隔五分钟执行一次
1 | 关于crond的配置文件,它分别在几个地方如/var/spool/cron/用户名,/etc/crontab和/etc/cron.d/\*。 |
*/2 * * * command
1 | 2.每晚的21:30重启Apache。 |
30 21 * * * /usr/local/etc/rc.d/httpd restart
1 | ## 关于定时任务的常用文件 |
[djangowang@localhost ~]# find /etc/ -name “*.conf” -exec cp {} /tmp/bakup ;
1 | 将/tmp/bakup目录进行打包,命令如下: |
[djangowang@localhost ~]# tar -cvf bakup.2021.10.1.tar /tmp/bakup
1 | 打包并不是把文件压缩,只是将目录中的文件打包成一个文件包,方便备份。将备份的解包: |
[djangowang@localhost ~]# tar -xvf bakup.2021.10.1.tar -C /tmp/bakup
1 |
|
[djangowang@localhost ~]# tar -cvzf bakup.2021.10.1.tar.gz /tmp/bakup
1 | 和打包相比,这里会进行压缩,适合备份的文件比较多的场景,特别是比较大的文本文件非常适合这种方式,但与打包相比压缩会有一定延迟(延迟时间和文件大小相关),但与打包相比优势是最终存储大小要比打包方式小很多,节约我们更多磁盘空间。 |
[djangowang@localhost ~]# tar -xvzf bakup.2021.10.1.tar.gz -C /tmp/bakup
1 |
|
[djangowang@localhost ~]# yum install nginx
1 | 关于yum命令的主要参数: |
[djangowang@localhost ~]# rpm -ivh nginx.rpm
1 | 查看本机安装Nginx的版本。 |
[djangowang@localhost ~]# rpm -qa | grep nginx
1 | 关于rpm命令常用的参数如下: |
[djangowang@localhost ~]# wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz
1 | 解压缩后进入目录进行配置、编译和安装三步: |
[djangowang@localhost ~]# cd openssl-1.1.1
[djangowang@localhost ~]# ./config shared zlib 配置
[djangowang@localhost ~]# make 编译
[djangowang@localhost ~]# make install 安装
1 | 在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
1 | 接着构建共享库。 |
[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
1 | 其中配置是指软件安装目录、开启的功能和参数等,编译(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
1 | 最后验证软件是否安装成功,执行“openssl version”命令。 |
[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
1 | 我们可以看到/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
1 |
|
[djangowang@localhost ~]# mkdir /data1
1 | 2.将磁盘挂载到创建的目录上。 |
[djangowang@localhost ~]# mount /dev/vdb /data1
1 | 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
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中
1 | 将/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。