【linux的系统服务管理】
如果你对windows非常熟悉的话,相信你肯定配置过开机启动的服务,有些服务我们日常用不到则要把它停掉,一来可以节省资源,二来可以减少安全隐患。在linux上同样也有相关的工具来管理系统的服务。
1. ntsysv
用来配置哪些服务开启或者关闭,有点想图形界面,不过是使用键盘来控制的。如果没有这个命令请使用 yum install -y ntsysv 安装它。
敲完这个命令后则显示出如上图中的画面。在屏幕的最上面有’Red Hat’等字样,这是在告诉我们这个工具是由Red Hat公司开发的。按键盘的上下方向键可以调节红色光标,按空格可以选择开启或者不开启,如果前面的中括号内显示有’*’ 则表示开启否则不开启。通过这个工具也可以看到目前系统中所有的服务。建议除’crond, iptables, network, sshd, syslog, irqbalance, sendmail, microcode_ctl’ 外其他服务全部停掉。选择好后,按’tab’键选择ok然后回车。需要重启机器才能生效。
2. chkconfig
Linux系统所有的预设服务可以查看/etc/init.d/目录得到
其实这就是系统所有的预设服务了。为什么这样讲,因为系统预设服务都是可以通过这样的命令实现 ‘service 服务名 start|stop|restart’ ,这里的服务名就是/etc/init.d/目录下的这些文件了。除了可以使用’service crond start ‘启动crond外,还可以使用/etc/init.d/crond start 来启动。
如上图,这两个命令出来的结果是一样的。
再看看这个chkconfig命令,它不仅可以列出来所有的服务,还可以详细到每个级别。这里的级别(0,1,2,3,4,5,6)就是inittab里面介绍的那几个启动级别了。
这样还可以查看某一个服务的启动情况。
用--level 指定级别,后面是服务名,然后是off或者on,--level后还可以跟多个级别。
另外还可以省略级别,默认是针对2,3,4,5级别操作。
另外这个chkconfig 还有一个功能就是可以把某个服务加入到系统服务,即可以使用service 服务名 start 这样的形式,并且可以在chkconfig --list 中查找到。当然也能删除掉。
这个功能常用在把自定义的启动脚本加入到系统服务当中。关于系统服务就讲这些内容,其实还有很多内容笔者没有介绍,道理很简单,一来讲多了你不能消化二来讲多了你也用不上。
【linux中的数据备份】
数据备份,不用说太多吧,毫无疑问很重要。笔者就曾经有过一次非常痛苦的经历,备份策略没有做好,结果磁盘坏掉数据丢失,简直是撕心裂肺的痛呀。还好数据重要性不是特别高,即使是不高也是丢失了数据,这是作为系统管理员最不应该出现的事故。所以,在你以后的系统维护工作中,一定要把数据备份当回事,认真对待。在linux上作为数据备份的工具很多,但笔者就只用一种那就是rsync 从字面上的意思你可以理解为remote sync (远程同步)这样可以让你理解的更深刻一些。Rsync不仅可以远程同步数据(类似于scp),当然还可以本地同步数据(类似于cp),但不同于cp或scp的一点是,rsync不像cp/scp一样会覆盖以前的数据(如果数据已经存在),它会先判断已经存在的数据和新数据有什么不同,只有不同时才会把不同的部分覆盖掉。如果你的linux上下面看例子吧。(如果没有rsync命令请使用yum install -y rsync安装)
上面例子表示把当前目录下的123同步到/tmp/目录下,并且同样也命名为123。如果是远程拷贝的话就是这样的形式了 IP:path (如:10.0.2.34:/root/)
当建立连接后,是需要输入密码的。如果手动去执行这些操作还好,但是如果是写在脚本中怎么办?这就涉及到添加信任关系了,该部分内容稍后会详细介绍。
1. rsync的命令格式
rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
笔者在一开始举的两个例子,第一个例子即为第一种格式,第二个例子即为第二种格式,但不同的是,笔者并没有加user@host 如果不加默认指的是root 。第三种格式是从远程目录同步数据到本地。第四种以及第五种格式使用了两个冒号,这种方式和前面的方式的不同在于验证方式不同,稍后详细介绍。
2. rsync常用选项
-a :归档模式,表示以递归方式传输文件,并保持所有属性,等同于-rlptgoD ,-a选项后面可以跟一个 --no-OPTION 这个表示关闭-rlptgoD中的某一个例如 -a --no-l 等同于-rptgoD
-r :对子目录以递归模式处理,主要是针对目录来说的,如果单独传一个文件不需要加-r,但是传输的是目录必须加-r选项
-v :打印一些信息出来,比如速率,文件数量等
-l :保留软链结
-L :向对待常规文件一样处理软链结,如果是SRC中有软连接文件,则加上该选项后将会把软连接指向的目标文件拷贝到DST
-p :保持文件权限
-o :保持文件属主信息
-g :保持文件属组信息
-D :保持设备文件信息
-t :保持文件时间信息
--delete :删除那些DST中SRC没有的文件
--exclude=PATTERN :指定排除不需要传输的文件,等号后面跟文件名,可以是万用字符模式(如*.txt)
-u :加上这个选项后将会把DST中比SRC还新的文件排除掉,不会覆盖
下面笔者将会针对这些选项做一些列小实验:
1) 建立目录以及文件
笔者建立这些文件的目的就是为做试验做一些准备工作。
2)使用-a选项
这里有一个问题,就是本来想把test1目录直接拷贝成test2目录,可结果rsync却新建了test2目录然后把test1放到test2当中。为了避免这样的情况发生,可以这样做:
加一个斜杠就好了,所以笔者建议你在使用rsync备份目录时要养成加斜杠的习惯。在上面讲了-a选项等同于- rlptgoD,而且-a还可以和--no-OPTION一并使用。
笔者加上-v选项来获得更多的信息,上例中因为没有使用-r选项导致只能拷贝目录但不能拷贝目录下面的内容(英文翻译过来就是“忽略了目录test1/.”,其中test1/.指的就是test1目录内部的所有文件),所以虽然创建了test2目录,但是test2目录为空。下面再看看那个-l选项的作用。
使用-v选项看来就是方便呀,上例告诉我们跳过了非普通文件1.sh,其实1.sh是一个软连接文件,如果不使用-l选项则不会理会软连接文件的。
果真test2目录当中没有那个1.sh的影子。当然加上-l选项则会把软连接文件给拷贝过去,但是软连接的目标文件却没有拷贝过去,有时候咱们指向拷贝软连接文件所指向的目标文件,那这时候该怎么办呢?
3)使用-L选项
一个-L就可以把SRC中软连接的目标文件给拷贝到DST
4) 使用-u选项
首先查看一下test1/1 和 test2/1的访问时间(肯定是一样的),然后使用touch修改一下test2/1的访问时间(此时test2/1要比test1/1的访问时间晚了一些),如果不加-u选项的话,会把test2/1的访问时间变成和test1/1的访问时间一样。这样讲也许你会迷糊,不妨看一看。
看到了吧,本来test2/1的访问时间已经不同于test1/1的访问时间了,但是同步后访问时间又一致了。
现在你明白-u选项的妙用了吧。
5)使用--delete选项
如果不使用--delete选项当SRC有文件删除时,DST是不会删除的,只有加上--delete选项后才能删除掉。还有一种情况就是如果在DST增加文件了,而SRC当中没有这些文件,同步时加上--delete选项后同样会删除新增的文件。
6)使用--exclude 选项
另外还可以使用万用字符*匹配
最后简单总结一下,平时你使用rsync同步数据的时候,使用-a选项基本上就可以达到我们想要的效果了,只是有时候会有个别的需求,会用到-a --no-OPTION, -u, -L, --delete, --exclude这些选项,但是笔者要求你把上面这些全部掌握,毕竟这才几个而已,大部分选项笔者都没有介绍。如果在以后的工作中遇到特殊需求了,就去查一下rsync的man文档吧。
3. rsync 应用实例
1)通过ssh的方式
最上面介绍的5种方式当中,第二、第三(1个冒号)就属于通过ssh的方式,这种方式其实就是让用户去登录到远程机器,然后执行rsync的任务。
这种方式就是前面介绍的第二种方式了,是通过ssh拷贝的数据,是要输入10.0.2.69那台机器root的密码的。
这个则为第三种方式。这两种方式如果写到脚本里,备份起来就有麻烦了,因为要输入密码,脚本本来就是自动的,不可能做到的。但是不代表没有解决办法。那就是通过密钥验证,密钥不设立密码就ok了。还记得在前面笔者曾经介绍过通过密钥登录远程主机吗,下面要讲的内容就是那些东西了。
先提前说一下基本的主机信息: 10.0.2.68 (主机名Aming-1)和10.0.2.69(主机名Aming)需要从Aming-1上拷贝数据到Aming上。
A. 首先确认一下Aming-1上是否有这个文件 /root/.ssh/id_rsa.pub
如果没有安装以下的方法生成:
在这个过程中会有一些交互的过程,因为笔者的/root/.ssh/id_rsa已经存在,所以会问是否覆盖,笔者选择覆盖,然后会提示要输入这个密钥的密码,出于安全考虑应该定义个密码,但是我们的目的就是为了自动化同步数据,所以这里不输入任何密码,直接按回车,即密码为空。最后则生成了私钥(/root/.ssh/id_rsa)和公钥文件(/root/.ssh/id_rsa.pub)
B. 把公钥文件的内容拷贝到目标机器上
复制主机Aming-1的/root/.ssh/id_rsa.pub文件内容,并粘贴到主机Aming的/root/.ssh/authorized_keys中
在这一步也许你会遇到/root/.ssh目录不存在的问题,可以手动创建,并修改目录权限为700也可以执行ssh-keygen命令生成这个目录。保存/root/.ssh/authorized_keys文件后,再到主机Aming-1上执行
你会发现,现在不用输入密码也可以登录主机Aming了。下面再从主机Aming-1上执行一下rsync命令试试吧。
2)通过后台服务的方式
这种方式可以理解成这样,在远程主机上建立一个rsync的服务器,在服务器上配置好rsync的各种应用,然后本机作为rsync的一个客户端去连接远程的rsync服务器。下面笔者就介绍一下,如何去配置一台rsync服务器。
A. 建立并配置rsync的配置文件 /etc/rsyncd.conf
其中配置文件分为两部分全部配置部分和模块配置部分,全局部分就是几个参数而已,就像笔者的rsyncd.conf中port, log file, pid file, address这些都属于全局配置,而[test] 以下部分就是模块配置部分了。一个配置文件中可以有多个模块,模块名自定义,格式就像笔者的rsyncd.conf中的这样。其实模块中的一些参数例如use chroot, max connections, udi, gid, auth users, secrets file以及hosts allow都可以配置成全局的参数。当然笔者给出的参数并不是所有的,你可以通过man rsyncd.conf 获得更多信息。
下面就简单解释一下这些参数的意义:
port :指定在哪个端口启动rsyncd服务,默认是873
log file :指定日志文件
pid file :指定pid文件,这个文件的作用涉及到服务的启动以及停止等进程管理操作
address :指定启动rsyncd服务的IP,假如你的机器有多个IP,就可以指定其中一个启动rsyncd服务,默认是在全部IP上启动
[test] :指定模块名,自定义
path :指定数据存放的路径
use chroot :true|false 默认是true,意思是在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true,如果你的数据当中有软连接文件的话建议设置成false。
max connections :指定最大的连接数,默认是0即没有限制
read only :ture|false 如果为true则不能上传到该模块指定的路径下
list :指定当用户查询该服务器上的可用模块时,该模块是否被列出,设定为true则列出,false则隐藏
uid/gid :指定传输文件时,以哪个用户/组的身份传输
auth users :指定传输时要使用的用户名
secrets file :指定密码文件,该参数连同上面的参数如果不指定则不使用密码验证
hosts allow :指定被允许连接该模块的主机,可以是IP或者网段,如果是多个,之间用空格隔开
B. 编辑secrets file,保存后要赋予600权限
C. 启动rsyncd服务
启动后查看日志,看看是否有错误信息,然后再看下端口是否启动。
如果想开机启动,请把”rsync –daemon –confg=/etc/rsyncd.conf” 写入到/etc/rc.d/rc.local文件。
D. 到另一台机器上测试
记得那个use chroot参数吗,如果设置为true,则/root/test4/1.sh不会被拷贝过来。
修改rsyncd.conf文件,把use chroot改成true,不用重启服务即可生效。
从上例中的详细信息中也可以看到,不能拷贝软连接的。所以请记住,如果涉及到软连接,请设置use chroot=false 。另外这种方式也是可以不用手动输入密码的,两种实现方式。
第一种:指定密码文件
先编辑一个密码文件,并修改600权限。
在同步时,指定密码文件即可(--password-file=/etc/rsyncd.passwd)
第二种:在rsync服务器端不指定用户
把相关的参数都用’#’注释掉。然后再到客户端上测试。
注意,这里不用再加test@这个用户了,默认是以root的身份拷贝的,现在已经不需要输入密码了。
【linux系统日志】
日志重要吗?必须的,没有日志你怎么知道你的系统状况?没有日志你如何排查一个trouble?日志记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。
笔者常查看的日志文件为/var/log/message. 它是核心系统日志文件,包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。另外其他信息,比如某个人的身份切换为 root以及用户自定义安装的软件(apache)的日志也会在这里列出。通常,/var/log/messages 是在做故障诊断时首先要查看的文件。那你肯定会说了,这么多日志都记录到这个文件中,那如果服务器上有很多服务岂不是这个文件很快就会写的很大,没有错,但是系统有一个日志轮询的机制,每星期切换一个日志,变成message.1, message.2,…messages.4 连同message一共有5个这样的日志文件。这是通过logrotate工具的控制来实现的,它的配置文件是/etc/logrotate.conf. 如果没有特殊需求请不要修改这个配置文件。
/var/log/message是由syslogd这个守护进程产生的,如果停掉这个服务则系统不会产生/var/log/message,所以这个服务不要停。Syslogd服务的配置文件为/etc/syslog.conf这个文件定义了日志的级别,具体详细的东西笔者不再阐述,因为若没有特殊需求是不需要修改这个配置文件的,请使用”man syslog.conf” 获得更多关于它的信息。
除了关注/var/log/message外,你还应该多关注一下’dmesg’这个命令,它可以显示系统的启动信息,如果你的某个硬件有问题(比如说网卡)用这个命令也是可以看到的。
这一小节就介绍这么多,在结束之前,笔者给你一个小小的建议。以后在你日常的管理工总中要养成多看日志的习惯,尤其是一些应用软件的日志,比如apache, mysql, php等常用的软件,看它们的日志(错误日志)可以帮助你排查问题以及监控它们的运行状况是否良好。
【xargs与-exec】
1. xargs
在前面的例子中笔者曾经使用过这个命令,你是否有印象呢?现在就详细介绍一下它,平时笔者使用xargs还是比较多的,很方便。
查看xargs的man文档,解释是这样的:build and execute command lines from standard input. 至于翻译成中文理解着有点困难。不妨笔者举个例子说明它的作用。
它的作用就是把管道符前面的输出作为xargs 后面的命令的输入。它的好处在于可以把本来两步或者多步才能完成的任务简单一步就能完成。xargs常常和find命令一起使用,比如,查找当前目录创建时间大于10天的文件,然后再删除。
这种应用是最为常见的,xargs后面的rm 也可以更选项,当是目录时,就需要-r选项了。在笔者看来xargs的这个功能不叫什么,它的另一个功能才叫神奇。现在我有一个这样的需求,查找当前目录下所有.txt的文件,然后把这些.txt的文件变成.txt_bak 。正常情况下,我们不得不写脚本去实现,但是使用xargs就一步。
xargs -n1 –i{} 类似for循环,-n1意思是一个一个对象的去处理,-i{} 把前面的对象使用{}取代,mv {} {}_bak 相当于 mv 1.txt 1.txt_bak。你刚开始接触这个命令时也许有点难以理解,多练习一下你就会熟悉了,笔者建议你记住这个应用,很实用。
2. -exec
使用find命令时,经常使用一个选项就是这个-exec了,可以达到和xargs同样的效果。比如,查找当前目录创建时间大于10天的文件并删除。
这个命令中也是把{}作为前面find出来的文件的替代符,后面的”\”为”;”的脱意符,不然shell会把分号作为该行命令的结尾。这个-exec有时候也挺实用的。
用-exec同样可以实现前面那个复杂的需求。
【screen工具介绍】
有时候,也许你会有这样的需求,需要执行一个命令或者脚本,但是需要几个小时甚至几天。这就要考虑一个问题,就是中途断网或出现其他意外情况,执行的任务中断了怎么办?你可以把命令或者脚本丢到后台运行,不过也不保险。笔者下面就介绍两种方法来避免这样的问题发生。
1. 使用nohup
直接加一个’&’虽然丢到后台了,但是当退出该终端时很有可能这个脚本也会退出的,而在前面加上’nohup’就没有问题了。nohup的作用就是不挂断地运行命令。
2. screen工具的使用
简单来说,screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的SSH连接窗口那样。下面笔者介绍screen的一个简单应用。
1) 打开一个会话,直接输入screen命令然后回车,进入screen会话窗口。如果你没有screen命令,请用’yum install -y screen’安装。
2)screen -ls 查看已经打开的screen会话
3)Ctrl +a 再按d退出该screen会话,只是退出,并没有结束。结束的话输入Ctrl +d 或者输入exit
4)退出后还想再次登录某个screen会话,使用screen -r [screen 编号],这个编号就是上图中那个2082. 当只有一个screen会话时,后面的编号是可以省略的。
当你有某个需要长时间运行的命令或者脚本时就打开一个screen会话,然后运行该任务。按ctrl +a 再按d退出会话,不影响终端窗口上的任何操作。
【linux下同步时间服务器】
时间的准确性在服务器上非常重 要,所以要与标准时间保持同步,毕竟服务器的时钟并不一定精准,所以需要我们每隔一段时间去同步一下时间。笔者所管理的服务器每隔6小时就会同步一下时 间。如何同步呢?这就要用到ntpdate 这个指令。如果你的服务器上没有这个指令,请使用'yum install -y ntpdate'安装,或者下载源码包安装。
同步时间的命令为:'ntpdate timeserver' 这里的timeserver为时间服务器的IP或者hostname,常用的timeserver有210.72.145.44, time.windows.com(windows的时间服务器)。如果你想每隔6小时同步一次那么请指定一个计划任务。
00 */6 * * * /usr/sbin/ntpdate 210.72.145.44 >/dev/null
之所以在后面加一个重定向,是因为这个同步的过程是有内容输出的,因为我们的计划任务是在后台执行的,输出的内容会以邮件的形式发送给用户,所以为了避免邮件太多请输出到/dev/null (在linux下这个设备是虚拟的存在,你可以理解为空洞)