RH134的内容要比RH124的内容更难一点,不过重点不是将基础命令,而是介绍一些系统常用的服务。理解这些服务对于管理Linux来说很重要,并且在很多时候对会用到,比如NFS服务,比如系统时钟服务。
但总的来说,还是可以上手的,只不过RH134部分最后面包括了podman容器内容。我现在还在考虑要不要写着一部分,因为后面打算写一个docker系列,但是podman和docker还是有些区别的,这些差异还是需要讲讲的。
这一篇文件主要讲讲调度未来任务、分析和存储系统日志、归档和传输文件三部分内容。在RH124内容我没有讲到vim的使用还有find和which命令,我会在本篇结尾做一个RH124补充。
调度未来任务
这主要就是atd服务进程和crond服务进程来实现,分别用客户端工具at和crontab来管理任务。区别在于前者是调度一次性任务,后者是调度周期性任务。
[1]一次性延迟任务
at命令会使用交互式方式来输入要调度的未来任务,除非结合管道符'|'来使用。如echo "date >> out.txt" | at now +2min,如果给出日期,默认是当前时间,如果给出的是时间,默认今天或明天。
使用atq或者at -l可以列出要调度的一次性任务,包括任务编号和所在的任务队列,任务队列有26个,从a-z优先级依次下降。使用atrm n或者at -d n可以删除编号为n的任务。
[2]周期性任务
主要有两个层面,一个是用户个人周期任务,一个是系统周期任务。
使用crontab -e可以编辑个人周期性作业,使用分时日月周来确定作业的周期性执行时间。使用crontab -l可以列出周期性作业,使用crontab -r则可以删除。
如果是root用户,可以使用crontab -lu name来列出指定用户的周期性作业,使用crontab -eu name则可以编辑指定用户的周期性作业。
至于系统周期性作业,则需要编辑对应的配置文件。/etc/crontab文件和/etc/cron.d目录下的文件定义系统的自定义周期性任务。和用户的周期性作业不同的是,系统周期性任务都需要指定执行任务的用户。
除此之外,如果在要执行周期性任务的时候,系统处于关机状态,那么这些任务并不会执行。除非编辑/etc/anacrontab文件,它会执行那么跳过的任务。还有 `systemd`提供的定时任务单元`.timer`文件,用于替代传统 `cron`或 `at`,实现更灵活、可管理的时间调度。
分析和存储系统日志
先要讲讲redhat linux中是怎么记录日志的,有这么一个服务叫systemd-journald,接收系统的日志数据,并将数据二进制的形式(结构化)放在内存中,默认是在/run/log/journal目录(内存的文件系统)下保存。
接着,rsyslog服务登场了,将内存中的二进制日志数据转储到/var/log目录下,并按日志优先级进行分类,同时将二进制数据转为文本文件(非结构化)。
不过的journalctl也可以解析并格式化这些二进制数据,最终以人类可读的形式输出到终端。如journalctl -n指定日志行数,journal -f则是追踪系统日志,-p则可以执行优先级。
[1]rsyslog服务
rsyslog服务划分了八个优先级,从0-7,有debug、err、notice、info等。并定义了24个设备,有local1、syslog、user等。可以使用logger -p user.notice "消息内容"来模拟日志数据,rsyslog会对相应的日志进行转储。
rsyslog服务转储日志的规则放在/etc/rsyslog.conf文件和/etc/rsyslog.d目录下的文件中,默认已经定义好了一些规则,如大部分日志数据放在/var/log/messages中,和用户ssh登录等安全相关的放在/etc/log/secure文件中,和邮箱相关的放在/var/log/maillog中。
可以手动编辑指定设备与优先级的日志消息的存储路径,如果优先级为none,则不存储该文件。不过如果一直保留日志文件只会越来越多,需要定期清理。但是有个logrotate日志轮转服务,能够周期性将日志文件进行轮转,防止一直占用磁盘空间。
[2]保留系统日志
上面说了journal日志默认是放在/run/log/journal目录下的,在系统重启后就没了。但是可以在systemd-journald服务的配置文件中修改,路径是/etc/systemd/journald.conf。
将配置文件中的Storage参数设置为persistent,默认会将日志数据保存在/var/log/journal目录下(不存在则创建),设置为volatile则是放在/run/log/journal目录下。
还有auto,如果/var/log/journal存在则放在该目录下,否则放在/run/log/journal目录下。最后一个是none,表示不存储任何日志数据,修改该配置文件后需要重启服务。
[3]维护准确的时间
这一部分主要讲讲chronyd服务,它会自动与配置好的NTP服务器进行时间同步。默认情况下,chronyd服务使用NTP Pool Project的服务器进行时间同步,使用timedatectl 当前系统的时间,时区以及NTP同步设置(公共NTP服务器)。
但是对于隔离网络的计算机来说可能需要更改NTP服务器,在/etc/chrony.conf文件中配置NTP服务器,每行需要写三个字段,用空格隔开。
第一个字段可以写server,也可以写peer。server则比本地NTP服务器高一个级别,peer则是同级别。不过server 仅声明时间源,层级关系由 NTP 协议动态协商。
第二个字段是NTP服务器的IP地址或者域名,最后一个字段则是时钟同步选项,推荐用iburst(redhat推荐)。
使用chronyc sources -v可以查看配置的NTP服务器IP地址或域名。timedatectl set-timezones 可以设置时区,timedatectl set-time可以设置系统时间,timedatectl set-ntp false表示不用NTP服务。
归档和传输文件
tar命令也非常实用,则很多时候都会用到,所以理解其中的选项也很重要。不过这一小节除了讲归档,还会讲一讲在网络上传输文件。
[1]管理压缩的tar存档
压缩方式有gzip、bzip2、xz三种常用的算法,后缀名分别为.tar.gz、.tar.bz2、.tar.xz,可以使用file命令来查看具体的压缩算法。使用-z表示gzip蒜贩,使用-j表示bzip2算法,使用-J表示xz算法。
-c参数表示归档,-x参数则表示解压,使用-v参数会显示详细信息,使用-f参数则是指定文件,-C可以指定解压目录(和-x结合起来使用),注意如果是归档-c,先指定压缩文件的名称,后面跟要压缩的文件名称。
当然了,也可以只打包不压缩,如tar -cvf dir1 dir2 dir3。注意使用tar打包的时候,由于压缩包是属于打包用户的,所以会改变文件和目录的权限,需要使用-p来保留文件的权限设置。
[2]安全文件传输程序SFTP--secure file transport program
这个中译英是自己想的,不知道正不正确,看着很对。使用sftp user@host远程登录,有一个文件传输程序叫FTP,不过SFTP相比会对数据进行加密。
pwd可以列出目标主机的当前目录,每个命令前加l表示在本地主机上运行,如lpwd则是列出本地主机当前目录。put -r /etc用于将本地主机的/etc目录递归上传到目标主机的工作目录,而get则是下载目标主机的文件。
[3]rsync--在系统之间安全的同步文件
虽然上面已经有程序能够实现传输文件了,但是每次传输都是完整的传输文件,对于rsync来说则不是。rsync只传输文件之间的差异部分,能够极大的加快更新速度。
如果要保留文件权限,所有者这类的,需要使用-a选项(上传的时候要保留文件的所有权,必须是目标系统的root用户,如果是下载的时候要保留文件所有权,必须以root用户运行rsync命令)。
如果要保留ACL访问控制列表,则需要使用-A,如果需要保留SELinux上下文,则需要使用-X选项,使用-v则是表示输出同步的详细信息。
与sftp不同的是,rsync并不使用交互式的方式,而是通过rsync -av user@host:/etc /etc直接指定要更新的目录,可以是本地同步到远程,也可以是远程同步到本地。当然,还有个有意思的是rsync可以本地同步到本地,如rsync -av /etc /etcd。
RH124补充内容
其实在rh124部分,还有vim编辑器的使用部分没有讲,有些技巧还是很实用的,虽然我记不住。并且这篇的话本应该在开头讲一讲如何提高命令的效率,不过我都放在这一部分来讲了。
[1]vim编辑器的使用
有命令行模式,插入模式,可视模式等,在命令行模式按u撤销,按nyy复制当前行及后n-1行,按p是从光标下一行粘贴,按P是从光标上一行粘贴。
使用dd可删除当前行,在命令模式按v可进入视图模式,按ctrl+v进入行模式,shfit+v进入快模式。
在插入模式中,使用set number可以显示行号,使用set paste表示要粘贴,此时粘贴会保留原格式。unset number则不显示行号,使用/string则是查找,按n表示下一个查找对象。
[2]如何提高命令行的效率
使用set或者env可以查看当前shell的环境变量,unset用于取消环境变量。SHELL=sh这是设置环境变量,不过仅对当前shell有效,子进程中无效。使用export SHELL=sh则表示子进程可以继承该环境变量。
shell脚本也就是scripts,必须要有执行权限才能当命令使用,否则需要有读权限然后可以用 bash scripts来执行脚本。脚本的首行#!/bin/bash用来指定解释器路径(当做命令使用的时候),否则默认以当前的shell来执行该脚本。
如果执行脚本(当作命令使用)时不指定scripts的路径,会默认在PATH中去搜索脚本,which命令专门是在PATH中查找可执行文件的命令。
在脚本中可以使用exit 0来提前退出脚本。结果保存在`$?`中,`$?`是一个 特殊变量,用于获取上一条命令的退出状态。循环结构有for it; do it; done或者while it; do it; done,条件则是使用if it; then it; else it; fi结构。