-- rsync的补充: 实现实时同步(也就是源一变化,它就会触发同步) inotify+rsync 软件路径 /share/soft/inotify-tools-3.13.tar.gz # tar xf /share/soft/inotify-tools-3.13.tar.gz -C /usr/src/ # cd /usr/src/inotify-tools-3.13/ # ./configure # make # make install --安装完后,就会产生下面两个命令 /usr/local/bin/inotifywait /usr/local/bin/inotifywatch # /usr/local/bin/inotifywait --help /usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory --这里报错,找不到那个库,但这个库实际上是在/usr/local/lib下的,所以解决方法,把/usr/local/lib/加到ldconfig里 做测试: 测试本机/test目录里一有(增,删,改,属性改变),就会同步到/test1目录 --使用下面的脚本来做 #vim /tmp/1.sh #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test |while read files do rsync -a --delete /test/ /test1/ echo "$files在`date +'%F %T'`被同步" >> /var/log/rsync.log 2>&1 done #nohup sh /tmp/1.sh & 再然后对/test进行各种操作,验证可以实时同步到/test1 --实现双向的实时同步 也有相关的软件(比如unison)可以专门来做双向的实时同步 但我们就可以用inotify反向再做一次再写一个脚本也一样可以简单去实现 远程实时同步 可以使用inotify+rsync(使用secrets file)来实现远程密码方式,或者使用脚本传密码 因为是远程监控同步,所以你可以选用下面几种方法: 1, 把远程目录用nfs挂载过来,当本地目录来监控,然后直接用上面的本地实时同步脚本就可以了 --注意:经测试后,此种方法不可取。(应该是inotify只能支持本地目录的监控,远程目就算是挂载过来也不能监控) 监控远程挂载过来的目录不可以,那么我们可以考虑监控本地的目录,当本地目录内容有变化时,同步到远程挂载过来的NFS目录(但要有写权限) 做法: 实现把35上的/test目录实时同步到37上的/test1目录 10.1.1.35 /test目录 10.1.1.37 /test1目录 步骤一: 在37上 # vim /etc/exports /test1 *(rw,no_root_squash) # /etc/init.d/rpcbind restart # /etc/init.d/nfs restart 步骤二: 在35上 # mkdir /test1/ # mount -t nfs -o vers=3 10.1.1.37:/test1 /test1 --用nfs3版本挂载过来,那么/test1目录就是37上的远程/test1目录了 步骤三: 执行上面讲的两个本地目录同步一样的脚本,测试就可以了 #vim /tmp/1.sh #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test |while read files do rsync -a --delete /test/ /test1/ echo "$files在`date +'%F %T'`被同步" >> /var/log/rsync.log 2>&1 done #nohup sh /tmp/1.sh & 2,使用ssh等效性(ssh密钥登录)让远程机器连接不需要密码,就很容易使用远程监控或同步了 3,用脚本的expect自动应答来处理远程连接时要传的密码问题 4,使用rsync的secrets file的方法然后写脚本 例: 远程被同步端 本地同步端 10.1.1.37 10.1.1.35 我要实现把本地同步端10.1.1.35上的/localtest/目录里的内容实时同步到远程被同步端10.1.1.37的/remotetest/目录 准备: 关闭iptables和selinux 实现过程 第一大步:在远程被同步端10.1.1.37上操作 # mkdir /remotetest/ --创建测试的被同步目录 # vim /etc/rsyncd.conf uid=root gid=root --这里指定使用root身份同步到10,否则默认使用nobody用户(这样你需要把/remotetest/目录改成757的权限,才有权限写) [testsource] path=/remotetest/ ignore errors read only=no --服务级别给写权限 auth users=test --验证的用户取名为test secrets file=/etc/rsyncd.secrets --验证用户test的用户名和密码的存放文件,此文件需要同步端和被同步端都要有(这样我们就可以用这种方式来进行验证,而不需要远程的ssh密码验证了) hosts allow=10.1.1.35 --进一步加强安全,只允许10.1.1.35同步 # vim /etc/rsyncd.secrets --创建这个密码文件,用户名要与上面的auth users指定的一致,密码随意(我这里以321来测试) test:321 # chmod 600 /etc/rsyncd.secrets --为了安全性,把权限改成600,只让root读写(很多其它软件的密码文件也会要求你改成600权限) # yum install xinetd -y # vim /etc/xinetd.d/rsync disable = no -- disable 后面值由yes改为no # /etc/init.d/xinetd restart --重启服务 # chkconfig xinetd on --设置开机自动启动 第二大步:在本地同步端10.1.1.35上操作 先安装inotify软件,步骤参照上面过程,这里省略 # mkdir /localtest/ --创建测试的同步目录 # vim /etc/rsyncd.secrets --也要创建这个密码文件,里面只写密码就可以了。用户我们在后面的脚本里的命令里指定 321 # chmod 600 /etc/rsyncd.secrets --也改成600的权限 # vim /bin/rsync.sh --脚本及其内容 #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /localtest |while read files do rsync -a --delete --password-file=/etc/rsyncd.secrets /localtest/ test@10.1.1.37::testsource done # chmod 755 /bin/rsync.sh --给执行权限,方便执行 # nohup sh /bin/rsync.sh & --后面挂起执行 # vim /etc/rc.local --加到rc.local里让其开头自动启动 nohup sh /bin/rsync.sh & 第三大步: 测试过程省略 =========================================== 远程拷贝比如用scp这种命令,需要密码时,怎么做? 1,使用 <重定向 ,或者<< EOF这种都是做不了的 passwd abc< /dev/null --这种改密码是可以传 123 123 EOF ssh 192.168.64.25 < B A传信息给B,用B的公钥加密,然后传给B后,B用自己的私钥解密 ssh等效性 原理:产生一对密钥,自己持有一个私钥,公钥给对方,需要一对才能解密 ssh-keygen --输入这个命令后,三次回车产生空密码key对 [root@li ~]# ssh-keygen Generating public/private rsa key pair. --默认是rsa加密方式 Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa already exists. Overwrite (y/n)? y Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: ad:2d:f9:af:8a:c7:ab:0b:8e:de:47:ed:73:68:f6:b3 root@li.cluster.com scp /root/.ssh/id_rsa.pub 10.1.1.104:/root/.ssh/authorized_keys--把公钥传给104的机器后,重命令名为authorized_keys # ssh-add /root/.ssh/id_rsa --在rhel6如果不能成功可能需要在本地把自己的私钥加一下 Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa) ssh 10.1.1.104 --直接ssh不需要密码了 ssh-keygen -t dsa --可以这样使用dsa的加密方式 ssh-keygen -t rsa --默认的加密方式 练习:三台机的user1用户之间全部ssh不需要密码,并且ssh自己也不需要密码 A B C 1,A,B,C三台都su - user1,然后使用ssh-keygen产生各自的私钥对 2,在A机器上用user1继续操作, scp Bserver:~/.ssh/id_rsa.pub ~/Bserver_pubkey scp Cserver:~/.ssh/id_rsa.pub ~/Cserver_pubkey 3,cat id_rsa.pub Bserver_pubkey Cserver_pubkey >> authorized_keys 4,scp authorized_keys Bserver:~/.ssh/ scp authorized_keys Cserver:~/.ssh/ 思考: 试想一下,如果你管理1000台服务器,你希望就在一台服务器上能轻松远程管理所有服务器,或者在一台上写脚本可以管理所有服务器,你会怎么做? 答案: 如果你都做ssh等效性,工作量太大;就算是都做好了,也不安全,如果一台被攻破,那么另外999台也没有安全保障了 但并不是说这个没有应用,在少量的几台之间做一些特殊应用还是可以用的;在oracle的RAC集群里,各个节点之间必须要配置这个(只不过是oracle用户,不是root用户);hadoop的管理用户也需要互相配置ssh等效性 管理1000台不使用ssh等效性,要实现管理的话,可以使用expect自动应答脚本 或者使用用户集中化管理,所有的用户都在一个服务器上 ======================================= 模块管理 # ls /usr/src/kernels/`uname -r`/ --内核源码路径 --建议不要删除内核源码,因为有些软件在编译安装要使用到内核源码。如果删除了,安装kernerl-devel软件包就可以了 # ls /lib/modules/`uname -r`/kernel --模块(可以看作是驱动) arch crypto drivers fs kernel lib mm net sound arch/ crypto/ drivers/ fs/ lib/ net/ sound/ 架构平台 加密有关 驱动有关 文件系统 库 网络 声音 --也就是说由内核源码编译出来的模块被分类放在上面的目录 lsmod --查看装载的模块 modinfo vmci --查看特定模块信息 filename: /lib/modules/2.6.32-279.el6.x86_64/misc/vmci.ko supported: external license: GPL v2 version: 9.1.18.0 description: VMware Virtual Machine Communication Interface (VMCI). author: VMware, Inc. alias: pci:v000015ADd00000740sv*sd*bc*sc*i* depends: vermagic: 2.6.32-131.0.15.el6.x86_64 SMP mod_unload modversions parm: disable_host:Disable driver host personality - (default=0) (bool) parm: disable_guest:Disable driver guest personality - (default=0) (bool) parm: disable_msi:Disable MSI use in driver - (default=0) (bool) parm: disable_msix:Disable MSI-X use in driver - (default=0) (bool) rmmod vmci --删除模块 modprobe vmci --装载模块,只写模块名 insmod /lib/modules/2.6.32-279.el6.x86_64/misc/vmci.ko --也是装载模块,但是要写绝对路径 例1,用rmmod删除vsock,vmci,vmmon,vmware虚拟使用不了,再用modprobe加载回去,就又可以使用了 例2,删除网卡模块,网络马上不可用,再加回去就可以使用了 # mii-tool eth0 eth0: negotiated 100baseTx-FD flow-control, link ok [root@li ~]# rmmod r8169 [root@li ~]# mii-tool eth0 SIOCGMIIPHY on 'eth0' failed: No such device [root@li ~]# modprobe r8169 如何确认你的网卡模块是什么,可以使用lspci这样命令查看你的硬件信息 ===================================== 内核编译 (也可以说内核编译优化,但注意不是内核优化,很多人说内核优化是指内核参数的优化,而不是内核的编译优化) 对内核源码的功能进行定制 www.kernel.org --下载内核源代码 ls /usr/src/kernels/`uname -r` --当前使用系统的内核源码 什么情况下需要编译内核? 系统要支持一个功能,但内核默认不支持,又不想升级成新的系统,则需要内核编译 开发了一个模块,需要内核的支持,也需要编入内核 内核编译要考虑几点: 自己定制的内核运行更快,具有更少的代码 把不需要的功能编译进内核可能会有受到漏洞被利用的风险 将某种功能编译成模块方式比直接编译进内核速度要慢 # ls /share/soft/kernel/linux-3.19.7.tar.xz --目前最新版本的内核 # tar xf /share/soft/kernel/linux-3.19.7.tar.xz -C /usr/src/kernels/ # cd /usr/src/kernels/linux-3.19.7/ 编译内核的步骤: 1,make mrproper --消除当前内核源码,使之干净,(和编译软件时的make clean相似) 2,make config --基于文本的传统的配置界面,不推荐使用 make menuconfig --基于ncurses-devel库的一种文本选单方式(要装ncurses-devel) make oldconfig --如果只想在原来的内核配置基础上修改的话,用此选项 make xconfig --基于x windows的图形配置界面,基于qt的(要装avahi-qt3-devel) * 代表编入内核 M 代表编成模块 空 代表不编入内核 有三种括号: 方括号:要么是编进,要么是不编 尖括号:三种选择,编进,不编,编成模块 圆括号: 多选一 --定制完你的内核选项,保存,会把所有的选择结果保存到.config这个文件,你可以vi打开它查看 3,make 4, make modules_install --把编译后的模块复制到/lib/modules/内核新版本/ 以后就可以用modprobe insmod来装载使用 5,make install --拷贝vmlinuz,initramfs 到/boot/下 ,并自动修改grub 上面的编译完成后,就可以reboot你的系统,然后在grub里选择新的内核进入系统进行验证 以前rhel5的iso还有下面这种rpm安装的内核 PAE physical address extend 物理地址扩展 32位系统使用大于4G内存 # rpm -ivh /share/yum/Server/kernel-PAE-2.6.18-164.el5.i686.rpm xen xen虚拟化使用的内核(半虚拟化需要修改内核) # rpm -ivh /share/yum/Server/kernel-xen-2.6.18-164.el5.i686.rpm ====================================== 路由 什么是路由,什么是路由表? 路由就是跨网络访问 路由表是记录路由信息的表(可以单路由表,也可以多路由表) 我们现在讨论的是单路由表,你在linux下用route -n查看 # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet8 172.16.13.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet1 10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1005 0 0 eth0 0.0.0.0 10.1.1.1 0.0.0.0 UG 0 0 0 eth0 我在本机访问一个IP,先找路由表里是否有你访问的网段,有的话则从这个路由条目后面指定的网卡出去;如果路由表里没有你访问的网段,则会找默认路由(也就是网关);如果网关也没有的话,则会报错网络不可达。 加网关只能加你已经有的路由网段里的一个IP才行(此IP不一定存在) 问题:一个linux上能有几个有效网关? 准确来说:一个路由表上可以加多个网关,但只有一个生效。但一台linux是可以做多路由表的,一个路由表一个有效网关,多路由表就是多个网关了。 问题:我一台linux上如果有双网卡,请问可不可以两个网卡配置同网段的不同IP呢? 假设我的eth0 10.1.1.10 eth1 10.1.1.11 如果两个网卡同网关,则会有下面两条路由 10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 它会实现从两张网卡进来的包,却从一张网卡出去,问题就产生了。 也有解决方法(比如多路由表),今天这里不讨论。 静态路由 如下图的实验: 用真实机虚拟的hostonly网络vmnet1模拟IP为1.1.1.1,三台虚拟机都是双网卡(全连接hostonly的vmnet1网络),IP分配如下(掩码假设全为24位),做实验的话使用iptables -F把所有的防火墙规则清空 宿主机 VM1 VM2 VM3 eth0 eth1 --》 eth0 eth1 10.1.1.10 2.2.2.2 《-- 2.2.2.3 4.4.4.4 ip_forward ip_forward vmnet1 eth0 eth1 eth0 1.1.1.1 --》 1.1.1.2 3.3.3.3 《-- 3.3.3.4 从1.1.1.1 ping 1.1.1.2 在宿主机上ping 1.1.1.2,能通 从1.1.1.1 ping 2.2.2.2 ping 2.2.2.2 不能通 解决方法: 1,在宿主机上加路由 route add -net 2.2.2.0 netmask 255.255.255.0 dev vmnet1 2,加网关 route del -net 2.2.2.0 netmask 255.255.255.0 dev vmnet1 --先删除上面的路由 route add default gw 1.1.1.2 在宿主机加了一个网关指向1.1.1.2的基础上,我再继续在宿主机上ping 2.2.2.3 不能ping 解决方法: 在vm2上加网关指向2.2.2.2 route add default gw 2.2.2.2 还要在VM1上打开ip_forward,打开方法有两种 1,# echo 1 > /proc/sys/net/ipv4/ip_forward --马上生效,但重启后就不生效了 2,# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 --改为1 # sysctl -p --保存后,使用此命令让它永久生效 继续ping 3.3.3.3 不通 解决:再在VM1上route add default gw 2.2.2.3 继续ping 3.3.3.4 不通 解决:在VM2上打开ip_forward 还要在VM3上route add default gw 3.3.3.3 继续ping 4.4.4.4 不通 解决:如果在VM2上加一个网关指向3.3.3.4,其实是有问题的,因为VM2上这样就有两个网关了。如果你不使用多路由表的做法,这两个网关只能有一个网关有效。 所以加网关的方式不可行,只能在VM2加路由 route add -net 4.4.4.0 netmask 255.255.255.0 dev eth1 上面终于从1.1.1.1ping到4.4.4.4 如果我把上面的所有网关和ip_forward去掉,然后手动加上路由(也就是说四台机都有四个网段的路由),你会发现也一样从1.1.1.1能ping通4.4.4.4 那么如果还有5网段,6网段,7网段,甚至更多(类似因特网),手动把全世界所有的路由加上也是不可能的事。实际的做法就是使用路由协议(rip,ospf,bgp等)来做,这就是动态路由了。 linux下可以安装类似zebra这样的软路由软件,可以把linux模拟成一台cisco路由器来进行配置。 注意:上面所有网卡都在同网络,你可以换一种方式再去尝试:1网段用vmnet1来模拟,2网段用vmnet2来模拟,3网段用vmnet3来模拟,4网段用vmnet4来模拟