rsync通过服务同步及系统日志介绍、screen工具的使用

rsync通过服务同步及系统日志介绍、screen工具的使用

evobot 800 2018-05-15

本文继续介绍rsync如何通过服务进行同步,另外介绍了Linux的系统日志和Screen工具的配置和使用。


rsync服务同步

  • rsync通过服务同步的架构为CS架构,默认端口为873,启动服务后,机器之间可以通过服务端口进行通信和同步;

  • 服务同步的格式为rsync -av ... SRC host::[Module],如果配置文件中配置了auth users则命令为rsync -av ...SRC [user]@host::[module],对应的配置文件为/etc/rsyncd.conf,配置文件内容如下:

    port=873	#指定rsync服务的监听端口
    log file=/var/log/rsync.log	
    pid file=/var/run/rsync.pid	
    address=192.168.199.141	#指定监听的本机ip,注释此项表示监听全部本机地址
    [test]	#模块名
    path=/tmp/rsync	#指定数据存放路径
    use chroot=true	
    #开启此选项后,连接时会chroot到path中,如果path中存在软连接文件,同步时又使用了-L选项,那么将会报错,这时可以将其设置为false
    max connections=4	#指定最大连接数,默认为0
    read only=true	#true表示path可写,false表示只读
    list=true	#表示当用户使用rsync -avP 192.168.199.141::查询该服务器的可用模块时,该模块是否被列出,建议设置为false
    uid=root
    gid=root #指定传输时以什么用户身份传输,即文件的uid/gid
    auth users=test	#指定传输时使用的用户名
    secrets file=/etc/rsyncd.passwd #指定auth users的密码文件,格式为username:passwd,权限为600
    hosts allow=192.168.199.142	#允许哪些服务器连接本机,多个IP使用空格分割,或者使用ip段:192.168.133.0/24
    

    指定的path必须要存在,命令中的module模块名指的是配置文件中的[test]配置。

    如果指定了auth userssecrets file,对端机器在连接时可以创建rsync_pass.txt文件,并将密码写入其中,在同步时使用命令rsync -av ...SRC --port=[port] --password-file=[/path/rsync_pass.txt][user]@host::[module],密码文件的权限为600。

  • 启动rsync服务命令为rsync --daemon:

    [root@localhost ~]# rsync --daemon
    [root@localhost ~]# ps -aux | grep rsync
    root       9472  0.0  0.1 126292  1684 pts/0    S+   22:24   0:00 vi /etc/rsyncd.conf
    root       9502  0.0  0.0 114688   552 ?        Ss   22:34   0:00 rsync --daemon
    root       9506  0.0  0.0 112668   972 pts/1    S+   22:35   0:00 grep --color=auto rsync
    [root@localhost ~]# netstat -lntp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1134/sshd           
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1709/master         
    tcp        0      0 192.168.199.141:873     0.0.0.0:*               LISTEN      9502/rsync          
    tcp6       0      0 :::22                   :::*                    LISTEN      1134/sshd           
    tcp6       0      0 ::1:25                  :::*                    LISTEN      1709/master
    
  • 在另一台机器上执行命令进行同步:

    [root@localhost tmp]# rsync -avP /tmp/lab.swp 192.168.199.141::test/
    sending incremental file list
    lab.swp
        104,857,600 100%   47.92MB/s    0:00:02 (xfr#1, to-chk=0/1)
    
    sent 104,883,286 bytes  received 35 bytes  29,966,663.14 bytes/sec
    total size is 104,857,600  speedup is 1.00
    
    • 在配置文件内有auth userssecrets file两个配置,如果不想使用密码认证的话,可以注释这两行;
    • 如果在执行命令时报错提示如下:
    rsync: failed to connect to 192.168.199.140 (192.168.199.140): No route to host (113)
    rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
    
    • 那么可以安装telnet检查对端机器的rsync的端口是否开放,telnet命令格式为telnet [ip address][port]
    [root@localhost tmp]# telnet 192.168.199.141 873
    Trying 192.168.199.141...
    telnet: connect to address 192.168.199.141: No route to host
    
    • 上面的输出表示对端端口无响应,然后我们需要检查对端机器的防火墙,可以关闭firewalld防火墙再重新telnet:
    [root@localhost tmp]# telnet 192.168.199.141 873
    Trying 192.168.199.141...
    Connected to 192.168.199.141.
    Escape character is '^]'.
    @RSYNCD: 31.0
    ^]
    telnet> quit
    Connection closed.
    
    • 上面的输出表示对端机器端口正常,这时候再重新执行rsync命令即可。
  • 使用命令rsync -avP host::[module]/files DEST的形式从远端机器上拉取文件;

  • 如果对端机器的rsync更改了端口,那么再同步时需要使用--port=[port]指定端口进行同步。


Linux系统日志

messages日志及logrotate介绍

  • 系统日志会记录与系统有关的所有信息,能够帮助我们排查错误和了解机器状态;

  • /var/log/messages日志是Linux系统的总日志,没有单独定义日志的服务,都会将日志记录在内,当messages日志达到一定大小时,系统会使用logrotate服务对其进行切割,logrotate的配置文件为/etc/logrotate.conf

    [lux@evobot log]$ cat /etc/logrotate.conf
    # see "man logrotate" for details
    # rotate log files weekly
    weekly	# 表示每周切割一次
    
    # keep 4 weeks worth of backlogs
    rotate 4	#表示保留4个日志
    
    # create new (empty) log files after rotating old ones
    create	#切割完成时创建为新文件
    
    # use date as a suffix of the rotated file
    dateext	#新文件的后缀名,这里表示日期
    
    # uncomment this if you want your log files compressed
    #compress	#是否压缩
    
    # RPM packages drop log rotation information into this directory
    include /etc/logrotate.d	#包含指定目录下的其他配置文件
    
    # no packages own wtmp and btmp -- we'll rotate them here
    # 对指定日志进行切割的配置
    /var/log/wtmp {	
        monthly
        create 0664 root utmp	#创建时指定权限属主属组
            minsize 1M	#最小大小
        rotate 1	#保留个数
    }
    
    /var/log/btmp {
        missingok
        monthly
        create 0600 root utmp
        rotate 1
    }
    
    # system-specific logs may be also be configured here.
    
  • 而在/etc/logrotate.d目录下,还有logrotate的其他配置文件:

    [lux@evobot log]$ ls /etc/logrotate.d/
    bootlog  chrony  nginx  syslog  wpa_supplicant  yum
    
    [lux@evobot log]$ cat /etc/logrotate.d/syslog
    /var/log/cron
    /var/log/maillog
    /var/log/messages
    /var/log/secure
    /var/log/spooler
    {
            sharedscripts
            dateext
            rotate 25
            size 40M
            compress
            dateformat  -%Y%m%d%s
            postrotate
                    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true	#由于新建了日志文件,需要重启服务让日志写入到新的文件中
            endscript
    }
    

    关于logrotate的详细介绍,可以参考文章logrotate 使用详解

logrotate示例

日志配置

  • 通常不需要修改logrotate.conf文件,只需要将需要轮询的日志独立配置文件放在/etc/logrotate.d/目录下即可;

  • 创建一个10MB的随机比特流数据日志文件:

    touch /var/log/test-log
    head -c 10M /dev/urandom > /var/log/test-log
    
  • /etc/logrotate.d/目录下为日志文件创建同名配置文件:

    vi /etc/logrotate.d/test-log
    

    写入如下配置:

    /var/log/test-log {
        monthly
        rotate 5
        compress
        delaycompress
        missingok
        notifempty
        create 644 root root
        postrotate
            /usr/bin/killall -HUP rsyslogd
        endscript
    }
    
    • monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’;
    • rotate 5: 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除;
    • compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩;
    • delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用;
    • missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误;
    • otifempty: 如果日志文件为空,轮循不会进行;
    • create 644 root root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件;
    • postrotate/endscript: 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。
  • 日志增长到指定大小进行分割:

    /var/log/test-log {
      size=50M
      rotate 5
      create 644 root root
      postrotate
          /usr/bin/killall -HUP rsyslogd
      endscript
    }
    
  • 分割的日志按照日期命名:

    /var/log/test-log {
      monthly
      rotate 5
      dateext
      create 644 root root
      postrotate
          /usr/bin/killall -HUP rsyslogd
      endscript
    }
    

logrotate操作

  • logrotate可以使用命令手动调用,如为/etc/logrotate.d/目录下所有配置调用logrotate:

    # logrorate /etc/logrotate.conf
    
  • 为某个特定配置调用:

    # logrotate /etc/logrotate.d/test-log
    
  • logrotate命令具有-d选项,可以运行logrotate,但实际不会真正去操作日志,只会模拟打印结果:

    # logratatte -d /etc/logrotate.d/test-log
    
  • 不满足日志轮询条件时,可以使用-f参数强制轮询,-v输出详细信息:

    # logrotate -vf /etc/logrotate.d/test-log
    
  • logrotate自身的日志位于/var/lib/logrotate/status/目录,如果需要临时指定日志输出路径,使用如下命令:

    # logrotate -vf -s /var/log/logrotate-status /etc/logrotate.d/test-log
    

dmsg日志

  • dmesg命令可以查看系统的硬件相关的日志,dmesg日志是保存在内存中的,例如服务器有硬件故障,就需要查看这个日志,dmesg -c可以清空日志。
  • /var/log/dmesg日志与dmesg命令查看的日志是不同的,其记录的是系统启动的相关日志。

last/lastb命令

  • last命令会调用/var/log/wtmp文件,这个文件为二进制文件,记录了系统所有的登陆日志,内容包括用户名、tty、来源ip,登陆时间和注销时间;
  • lastb命令则调用/var/log/btmp文件,同样是二进制文件,记录了登陆失败的日志。

secure日志

  • /var/log/secure日志记录了登陆成功和登陆失败的详细日志,并会记录失败的具体原因。并且还记录了系统中其他一些安全相关的日志,如sudo命令、定时任务等等。

screen工具

  • Screen是个终端的多路复用器。可以在一个终端内执行任意多个应用程序。简单来说screen解决了终端下两个问题:

    1. 终端下工作有时会面临需要打开多个个终端,或者多个标签页的清空,每个里面运行一个应用或者完整某类功能。然后在终端之间需要经常切换切换,screen只需要一个终端就可以解决。
    2. 一般远程登录服务器,断网之后会使任务或命令中断,虽然可以使用nohup command &使命令在后台执行,但是这样会看不到命令的输出。而screen即使断网,或者放在后台、退出,都可以随时恢复。
  • 使用screen之前需要安装screen软件包,直接执行screen命令就会创建一个虚拟终端,在其中可以任意执行任务,使用快捷键ctrl+a+d可以将screen虚拟终端放入后台,同时在虚拟终端中的任务不会终端,仍旧会继续执行;

  • screen -ls可以查看所有的终端,Detached表示在后台运行,Attached表示在前台运行,每个终端最前面的数字为终端的ID:

    [root@evobot ~]# screen -ls
    There is a screen on:
            17491.pts-0.evobot      (Detached)
    1 Socket in /var/run/screen/S-root.
    
  • 恢复Detached的screen终端,使用screen -r [id]

    [root@evobot ~]# screen -r 17491
    
  • 结束一个screen终端,可以在终端内使用exit命令结束,或者使用ctrl+k杀死当前终端;

  • 创建screen终端还可以使用screen -S [name]来指定一个名字创建终端,这样在恢复终端时可以使用screen -r [name]来恢复终端。



# rsync