vmware设置centos虚拟机nat联网

今天在vmware虚拟主机中安装hearbeat,为了使用最新的版本,选用编译安装了。在编译过程中,需要连接被墙的网站下载文件,那只能用vpn,但我使用的是桥接方式联网,使用不了真实主机的vpn,于是改用nat联网,设置过程中遇到一些问题,现记录如何设置。
真实主机设置:
本人安装的是vmware 8.0.1英文版。
1、首先检查VM NAT的设置。
打开VM,在菜单中打开Edit->Virtual Network Editor,在弹出的窗口选择VMnet8,检查是否启用了DHCP和设置子网地址和子网掩码,如图:
FAQ
2、设置虚拟机的联网方式为NAT。
3、设置真实主机VMware Network Adapter VMnet8网卡为自动获取ip和自动获取dns。
4、检查真实主机的VMware DHCP Service 和VMware NAT Service两个服务是否启动。
CentOS虚拟主机设置:
首先在真实主机中获取VMware Network Adapter VMnet8网卡的信息,如windows在cmd下执行ipconfig,如图:
FAQ
根据图我们知道,ip地址为192.168.79.1,掩码为255.255.255.0,所以我们设置虚拟机的网关为192.168.79.2,子掩码255.255.255.0。
设置虚拟机网卡:

  1. vi /etc/sysconfig/network-script/ifcfg-eth0

设置为:

  1. BOOTPROTO=dhcp
  2. GATEWAY=192.168.79.2
  3. NETMASK=255.255.255.0
  4. ONBOOT=yes

之后重启网卡:

  1. service network restart

使用FreeNx或VNC连接CentOS桌面

我们这里学习使用FreeNx或VNC连接CentOS远程桌面。

FreeNx简介

FreeNX是近年来继VNC之后新出现的远程控制解决方案,基本原理是将XWindows的信号压缩后传输到远程客户端显示,而VNC是直接截取屏幕图 像处理传输。这样,在同样的传输信道条件下,FreeNX可以比VNC提供更好的操作感和实时性。

VNC简介

VNC是一款优秀的远程控制工具软件,由著名的AT&T的欧洲研究实验室开发的。VNC是在基于UNIX和Linux操作系统的免费的开放源码软件,远程控制能力强大,高效实用,其性能可以和Windows和MAC中的任何远程控制软件媲美。

gnome桌面安装

如果没有安装桌面,首先需要安装好桌面。

  1. yum -y groupinstall ‘GNOME Desktop Environment’ ‘X Window System’

FreeNx安装配置

1、安装freenx

  1. yum -y install  nx freenx

2、如果你机器的ssh设置了PasswordAuthentication no,即取消密码认证,则需要在它下面加上:

  1. AllowUsers nxuser

nxuser是freenx的用户。
3、编辑文件node.conf

  1. vi /etc/nxserver/node.conf

把#ENABLE_PASSDB_AUTHENTICATION=”0″更改为ENABLE_PASSDB_AUTHENTICATION=”1″。
4、增加nxserver用户。

  1. useradd myuser
  2. passwd myuser
  3. nxserver –adduser myuser
  4. nxserver –passwd myuser

5、下载NX客户端软件,安装启动NX,输入Session名称(随意),输入Host和Port,点击Next,在下拉框中选择gnome桌面,继续next,finish。这时会跳出一个登录框,点击configure,点击key,复制服务器上/etc/nxserver/client.id_dsa.key的文件内容到这个文本框,保存。这时又回到登录框,直接输入用户和密码登录即可。

VNC安装配置

1、安装VNC

  1. yum install vnc-server

2、添加用户

  1. useradd vnc
  2. passwd vnc

3、设置用户的vnc密码

  1. su vnc
  2. vncpasswd
  3. exit

4、编辑vnc服务器配置文件

  1. vi /etc/sysconfig/vncservers

在最后加上:

  1. VNCSERVERS="1:vnc"
  2. VNCSERVERARGS[1]="-geometry 1024×768"

5、创建xstartup脚本(centos-6用户忽视此步)

  1. /sbin/service vncserver start
  2. /sbin/service vncserver stop
  3. su vnc
  4. vi  ~/.vnc/xstartup

加入如下代码:

  1. #!/bin/sh
  2. # Add the following line to ensure you always have an xterm available.
  3. ( while true ; do xterm ; done ) &
  4. # Uncomment the following two lines for normal desktop:
  5. unset SESSION_MANAGER
  6. exec /etc/X11/xinit/xinitrc
  7. [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
  8. [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
  9. xsetroot -solid grey
  10. vncconfig -iconic &
  11. xterm -geometry 80×24+10+10 -ls -title "$VNCDESKTOP Desktop" &
  12. twm &

退出到root:

  1. exit

6、启动vnc

  1. /sbin/service vncserver start

7、测试vnc
7.1、使用java连接vncserver
在浏览器中输入http://192.168.0.10:5801登录桌面。
7.2、使用vnc viewer连接vncserver
打开vnc viewer,在server中输入192.168.0.10:1进行连接。
注意:192.168.0.10替换成自己的服务器IP。

总结

个人尝试了这两种方法,发现通过freenx连接的桌面,画面非常清晰且流畅,而vnc则逊很多。所以强烈推荐freenx。

Linux安全设置

用户管理

用户权限

1)限制root

  1. echo "tty1" > /etc/securetty
  2. chmod 700 /root

2)密码策略

  1. echo "Passwords expire every 180 days"
  2. perl -npe ‘s/PASS_MAX_DAYSs+99999/PASS_MAX_DAYS 180/’ -i /etc/login.defs
  3. echo "Passwords may only be changed once a day"
  4. perl -npe ‘s/PASS_MIN_DAYSs+0/PASS_MIN_DAYS 1/g’ -i /etc/login.defs

用sha512保护密码而不用md5

  1. authconfig –passalgo=sha512 –update

3)umask限制
更改umask为077

  1. perl -npe ‘s/umasks+0d2/umask 077/g’ -i /etc/bashrc
  2. perl -npe ‘s/umasks+0d2/umask 077/g’ -i /etc/csh.cshrc

4)Pam修改

  1. touch /var/log/tallylog
  1. cat << ‘EOF’ > /etc/pam.d/system-auth
  2. #%PAM-1.0
  3. # This file is auto-generated.
  4. # User changes will be destroyed the next time authconfig is run.
  5. auth        required      pam_env.so
  6. auth        sufficient    pam_unix.so nullok try_first_pass
  7. auth        requisite     pam_succeed_if.so uid >= 500 quiet
  8. auth        required      pam_deny.so
  9. auth        required      pam_tally2.so deny=3 onerr=fail unlock_time=60
  10.  
  11. account     required      pam_unix.so
  12. account     sufficient    pam_succeed_if.so uid < 500 quiet
  13. account     required      pam_permit.so
  14. account     required      pam_tally2.so per_user
  15.  
  16. password    requisite     pam_cracklib.so try_first_pass retry=3 minlen=9 lcredit=-2 ucredit=-2 dcredit=-2 ocredit=-2
  17. password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=10
  18. password    required      pam_deny.so
  19.  
  20. session     optional      pam_keyinit.so revoke
  21. session     required      pam_limits.so
  22. session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
  23. session     required      pam_unix.so
  24. EOF

/var/log/tallylog是二进制日志,记录认证失败情况。可以使用pam_tally2 –reset -u username解锁
5)回收闲置用户

  1. echo "Idle users will be removed after 15 minutes"
  2. echo "readonly TMOUT=900" >> /etc/profile.d/os-security.sh
  3. echo "readonly HISTFILE" >> /etc/profile.d/os-security.sh
  4. chmod +x /etc/profile.d/os-security.sh

6)cron和at限制

  1. echo "Locking down Cron"
  2. touch /etc/cron.allow
  3. chmod 600 /etc/cron.allow
  4. awk -F: ‘{print $1}’ /etc/passwd | grep -v root > /etc/cron.deny
  5. echo "Locking down AT"
  6. touch /etc/at.allow
  7. chmod 600 /etc/at.allow
  8. awk -F: ‘{print $1}’ /etc/passwd | grep -v root > /etc/at.deny

删除系统特殊的的用户和组

  1. userdel username
  2. userdel adm
  3. userdel lp
  4. userdel sync
  5. userdel shutdown
  6. userdel halt
  7. userdel news
  8. userdel uucp
  9. userdel operator
  10. userdel games
  11. userdel gopher

以上所删除用户为系统默认创建,但是在常用服务器中基本不使用的一些帐号,但是这些帐号常被黑客利用和攻击服务器。

  1. groupdel username
  2. groupdel adm
  3. groupdel lp
  4. groupdel news
  5. groupdel uucp
  6. groupdel games
  7. groupdel dip

同样,以上删除的是系统安装是默认创建的一些组帐号。这样就减少受攻击的机会。

服务管理

关闭系统不使用的服务

  1. chkconfig level 35 apmd off
  2. chkconfig level 35 netfs off
  3. chkconfig level 35 yppasswdd off
  4. chkconfig level 35 ypserv off
  5. chkconfig level 35 dhcpd off?
  6. chkconfig level 35 portmap off
  7. chkconfig level 35 lpd off
  8. chkconfig level 35 nfs off
  9. chkconfig level 35 sendmail off
  10. chkconfig level 35 snmpd off
  11. chkconfig level 35 rstatd off
  12. chkconfig level 35 atd off??

定期更新系统

yum -y update,可以加入到cron job。

ssh服务安全

使用证书登录系统,具体不详述,请看这篇文章http://devops.webres.wang/2012/02/strengthen-ssh-security-login-with-certificate/

LAMP安全

系统文件权限

修改init目录文件执行权限

  1. chmod -R 700 /etc/init.d/*

修改部分系统文件的SUID和SGID的权限

  1. chmod a-s /usr/bin/chage
  2. chmod a-s /usr/bin/gpasswd
  3. chmod a-s /usr/bin/wall
  4. chmod a-s /usr/bin/chfn
  5. chmod a-s /usr/bin/chsh
  6. chmod a-s /usr/bin/newgrp
  7. chmod a-s /usr/bin/write
  8. chmod a-s /usr/sbin/usernetctl
  9. chmod a-s /usr/sbin/traceroute
  10. chmod a-s /bin/mount
  11. chmod a-s /bin/umount
  12. chmod a-s /bin/ping
  13. chmod a-s /sbin/netreport

修改系统引导文件

  1. chmod 600 /etc/grub.conf
  2. chattr +i /etc/grub.conf

日志管理

1、系统引导日志

dmesg
使用 dmesg 命令可以快速查看最后一次系统引导的引导日志。通常它的内容会很多,所以您往往会希望将其通过管道传输到一个阅读器。

2、系统运行日志

A、Linux 日志存储在 /var/log 目录中。
这里有几个由系统维护的日志文件,但其他服务和程序也可能会把它们的日志放在这里。大多数日志只有 root 才可以读,不过只需要修改文件的访问权限就可以让其他人可读。
以下是常用的系统日志文件名称及其描述:
lastlog 记录用户最后一次成功登录时间
loginlog 不良的登陆尝试记录?
messages 记录输出到系统主控台以及由syslog系统服务程序产生的消息
utmp 记录当前登录的每个用户
utmpx 扩展的utmp
wtmp 记录每一次用户登录和注销的历史信息 wtmpx 扩展的wtmp
vold.log 记录使用外部介质出现的错误
xferkig 记录Ftp的存取情况 sulog 记录su命令的使用情况
acct 记录每个用户使用过的命令
aculog 拨出自动呼叫记录
B、/var/log/messages
messages 日志是核心系统日志文件。它包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息,比如某个人的身份切换为 root,也在这里列出。如果服务正在运行,比如 DHCP 服务器,您可以在messages 文件中观察它的活动。通常,/var/log/messages 是您在做故障诊断时首先要查看的文件。
C、/var/log/XFree86.0.log
这个日志记录的是 Xfree86 Xwindows 服务器最后一次执行的结果。如果您在启动到图形模式时遇到了问题,一般情况从这个文件中会找到失败的原因。

网络安全

使用TCP_WRAPPERS

使用TCP_WRAPPERS可以使你的系统安全面对外部入侵。最好的策略就是阻止所有
的主机(在”/etc/hosts.deny” 文件中加入”ALL: ALL@ALL, PARANOID” ),然后再在”/etc/hosts.allow” 文件中加入所有允许访问的主机列表。
第一步:
编辑hosts.deny文件(vi /etc/hosts.deny),加入下面这行
# Deny access to everyone.
ALL: ALL@ALL, PARANOID
这表明除非该地址包好在允许访问的主机列表中,否则阻塞所有的服务和地址。
第二步:
编辑hosts.allow文件(vi /etc/hosts.allow),加入允许访问的主机列表,比
如:
ftp: 202.54.15.99 foo.com
202.54.15.99和 foo.com是允许访问ftp服务的ip地址和主机名称。
第三步:
tcpdchk程序是tepd wrapper设置检查程序。它用来检查你的tcp wrapper设置,并报告发现的潜在的和真实的问题。设置完后,运行下面这个命令:
[Root@kapil /]# tcpdchk

iptables防火墙使用

这里不多介绍,请参考:
1、适合Web服务器的iptables规则
2、iptables详细教程

BIND高速缓存DNS服务器配置

配置高速缓存DNS服务器非常的简单,首先当然是安装好bind9了,假设我们的bind安装目录为/usr/local/bind/,我们建立一个主配置文件named.conf。

  1. vi /usr/local/bind/etc/named.conf

写入如下内容:

  1. options {
  2. directory "/usr/local/bind/etc/";
  3. forward only;//所有请求转发到forwarders列表
  4. forwarders { 8.8.8.8;8.8.4.4; };//定义转发请求目的IP
  5. allow-query {any;};//允许所有客户查询
  6. };

这样就完成了高速缓存DNS服务器的配置。

联通电信智能DNS(BIND)配置

本次主要学习通过BIND 9的view功能实现不同地址解析不同的IP,即智能DNS。首先安装BIND9,不懂的请看BIND DNS服务器的安装与主从DNS配置的安装部分安装。

acl文件配置

在配置智能DNS之前,我们需要获取联通电信最新的IP段,并制作成acl文件,这里提供直接提供文件下载,并上传到主从两台dns的/usr/local/bind/etc/目录下。
电信:CHINANET.acl
联通:CNC.acl
当然如果你想获取更新的IP段,可以根据这个脚本实现。http://devops.webres.wang/2012/02/automatic-get-unicom-chinanet-new-ip-ranges/

主DNS配置

named.conf配置

首先生成一个控制key,和三个用于主从同步的key。

  1. rndc-confgen -a
  2. rndc-confgen -a -c /etc/cnc.key -k cnc
  3. rndc-confgen -a -c /etc/chinanet.key -k chinanet
  4. rndc-confgen -a -c /etc/any.key -k any

并也把生成的/etc/cnc.key,/etc/chinanet.key和/etc/any.key传到从服务器。
然后创建named.conf。

  1. vi /usr/local/bind/etc/named.conf

写入如下代码:

  1. include "/etc/rndc.key";//加载rndc.key用于rndc命令
  2. //下面加载的三个key文件用在三个视图里的zone的主从同步。
  3. include "/etc/cnc.key";
  4. include "/etc/chinanet.key";
  5. include "/etc/any.key";
  6. controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndckey"; }; };//定义controls以能使用rndc命令管理bind。
  7. include "/usr/local/bind/etc/CNC.acl"; //cnc acl
  8. include "/usr/local/bind/etc/CHINANET.acl"; //chinanet acl
  9. //定义bind日志
  10. logging {
  11. channel default_syslog { syslog local2; severity notice; };
  12. channel audit_log { file "/var/log/bind.log"; severity notice; print-time yes; };
  13. category default { default_syslog; };
  14. category general { default_syslog; };
  15. category security { audit_log; default_syslog; };
  16. category config { default_syslog; };
  17. category resolver { audit_log; };
  18. category xfer-in { audit_log; };
  19. category xfer-out { audit_log; };
  20. category notify { audit_log; };
  21. category client { audit_log; };
  22. category network { audit_log; };
  23. category update { audit_log; };
  24. category queries { audit_log; };
  25. category lame-servers { audit_log; };
  26. };
  27. options {
  28.     directory "/usr/local/bind/etc";
  29. pid-file "/usr/local/bind/var/run/bind.pid";
  30. transfer-format many-answers;
  31. interface-interval 0;
  32. allow-query { any; };
  33. };
  34.  
  35. view "view_CNC" {
  36. match-clients { key cnc;CNC; };//匹配带key cnc或CNC里的IP段
  37. server 23.19.81.194 {keys cnc;}; //向从服务器发送消息时,用 cnc 加密
  38. zone "qbtop.com" {
  39. type master;
  40. file "qbtop.com.cnc.zone";
  41. allow-transfer { key cnc; };//只允许用 cnc加密过的 zone transfer 请求
  42. };
  43. };
  44.  
  45. view "view_CHINANET" {
  46. match-clients { key chinanet;CHINANET; };
  47. server 23.19.81.194 {keys chinanet;};
  48. zone "qbtop.com" {
  49. type master;
  50. file "qbtop.com.chinanet.zone";
  51. allow-transfer { key chinanet; };
  52. };
  53. };
  54.  
  55. view “view_any” {
  56. match-clients { key any;any; };
  57. server 23.19.81.194 {keys any;};
  58. zone "qbtop.com" {
  59. type master;
  60. file "qbtop.com.any.zone";
  61. allow-transfer { key any; };
  62. };
  63. };

zone文件配置

分别在/usr/local/bind/etc/目录下创建三个文件,qbtop.com.cnc.zone,qbtop.com.chinanet.zone,qbtop.com.any.zone,分别对应联通zone,电信zone和其它zone。
zone内容如下,唯一区别的是IP的不同。

  1. $TTL 3600
  2. @ IN SOA ns1.qbtop.com. hostmaster.qbtop.com. (
  3. 2012022301  ; Serial
  4. 3600 ; Refresh
  5. 900 ; Retry
  6. 3600000 ; Expire
  7. 3600 ) ; Minimum
  8. @ IN NS ns1.qbtop.com.
  9. @ IN NS ns2.qbtop.com.
  10. ns1 IN A 23.19.81.191
  11. ns2 IN A 23.19.81.194
  12. @   IN A 1.1.1.1
  13. www IN A 1.1.1.1

从DNS配置

创建目录slaves

  1. mkdir /usr/local/bind/etc/slaves

创建named.conf文件。

  1. vi /usr/local/bind/etc/named.conf

写入如下代码:

  1. include "/etc/cnc.key";
  2. include "/etc/chinanet.key";
  3. include "/etc/any.key";
  4. include "/usr/local/bind/etc/CNC.acl";  //cnc acl
  5. include "/usr/local/bind/etc/CHINANET.acl"; //chinanet acl
  6. logging {
  7. channel default_syslog { syslog local2; severity notice; };
  8. channel audit_log { file "/var/log/bind.log"; severity notice; print-time yes; };
  9. category default { default_syslog; };
  10. category general { default_syslog; };
  11. category security { audit_log; default_syslog; };
  12. category config { default_syslog; };
  13. category resolver { audit_log; };
  14. category xfer-in { audit_log; };
  15. category xfer-out { audit_log; };
  16. category notify { audit_log; };
  17. category client { audit_log; };
  18. category network { audit_log; };
  19. category update { audit_log; };
  20. category queries { audit_log; };
  21. category lame-servers { audit_log; };
  22. };
  23. options {
  24.     directory "/usr/local/bind/etc";
  25. pid-file "/usr/local/bind/var/run/bind.pid";
  26. transfer-format many-answers;
  27. interface-interval 0;
  28. allow-query { any; };
  29. };
  30.  
  31. view "view_CNC" {
  32. match-clients { key cnc;CNC; };
  33. server 23.19.81.191 {keys cnc;};
  34. zone "qbtop.com" {
  35. type slave;
  36. file "slaves/qbtop.com.cnc.zone";
  37. masters { 23.19.81.191; };
  38. };
  39. };
  40.  
  41. view "view_CHINANET" {
  42. match-clients { key chinanet;CHINANET; };
  43. server 23.19.81.191 {keys chinanet;};
  44. zone "qbtop.com" {
  45. type slave;
  46. file "slaves/qbtop.com.chinanet.zone";
  47. masters { 23.19.81.191; };
  48. };
  49. };
  50.  
  51. view “view_any” {
  52. match-clients { key any;any; };
  53. server 23.19.81.191 {keys any;};
  54. zone "qbtop.com" {
  55. type slave;
  56. file "slaves/qbtop.com.any.zone";
  57. masters { 23.19.81.191; };
  58. };
  59. };

至此,联通电信主从智能DNS已经配置完成,你可以使用如下多线路ping工具检测:
http://ping.chinaz.com/
http://www.webkaka.com/Ping.aspx
http://17ce.com/
http://ping.aizhan.com/

自动获取联通电信最新IP段

如果需要做联通电信的智能DNS,必然需要知道这两个ISP分配到的IP段。我们可以通过apnic下载完整的IP段,再查询IP的whois,再根据各运营商的关键词(如联通的netname是unicom,电信是chinanet或telecom)筛选出IP段。
下面是实现这一功能的脚本:
在执行脚本之前先安装jwhois,bc

  1. yum install jwhois bc
  1. #!/bin/sh
  2. FILE=/root/apnic/ip_apnic
  3. rm -f $FILE
  4. wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest -O $FILE
  5. grep ‘apnic|CN|ipv4|’ $FILE | cut -f 4,5 -d’|’|sed -e ‘s/|/ /g’ | while read ip cnt
  6. do
  7. echo $ip:$cnt
  8.         mask=$(cat << EOF | bc | tail -1
  9. pow=32;
  10. define log2(x) {
  11. if (x<=1) return (pow);
  12. pow–;
  13. return(log2(x/2));
  14. }
  15. log2($cnt)
  16. EOF)
  17.        echo $ip/$mask>> cn.net
  18. if whois [email protected] | grep -i ".*chinanet.*|.*telecom.*">/dev/null;then
  19. echo $ip/$mask >> chinanet
  20. elif whois [email protected] | grep -i ".*unicom.*">/dev/null;then
  21. echo $ip/$mask >> unicom
  22. else
  23. echo $ip/$mask >> others
  24. fi
  25. done

直接执行这脚本就会开始进行IP段筛选,这需要一定的时间,等完成后会在当前目录下生成三个文件unicom,chinanet,others。
下面提供联通电信ip段acl文件:
电信:CHINANET.acl
联通:CNC.acl
脚本参考:http://bbs.chinaunix.net/thread-577601-1-1.html

LVM的安装和使用方法

LVM简介

LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是一种磁盘管理工具,最主要的功能就是可以随时在线调整分区的大小,解决了安装Linux系统时需要评估分区大小的烦恼。

LVM相关术语

物理存储介质(The physical media)
这里指系统的存储设备:硬盘,如:/dev/hda1、/dev/sda等等,是存储系统最低层的存储单元。
物理卷(physical volume)
物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
卷组(Volume Group)
LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。
逻辑卷(logical volume)
LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。
PE(physical extent)
每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。
LE(logical extent)
逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
下面的图示有助于理解:
系统管理

LVM的安装

加载device-mapper模块

从linux内核2.6.9开始,device-mapper模块就已经包含在内,所以你只需加载即可。
加载mapper模块:

  1. modprobe dm_mod

查看是否已经加载:

  1. lsmod | grep dm_mod

出现如下输出,即表示加载成功:

  1. dm_mod                 63097  4 dm_mirror,dm_multipath,dm_raid45,dm_log

如果你的内核高于2.6.9却没有此模块,可以使用yum install device-mapper命令安装。
如果你的内核低于2.6.9,则需要编译安装device-mapper模块,地址ftp://sources.redhat.com/pub/dm/

LVM2安装

直接yum安装:

  1. yum install lvm2

LVM的使用

创建PV(物理卷)

这个阶段有几个可用命令:
pvcreate :将实体partition创建成为PV;
pvscan :搜索目前系统里面任何具有PV的磁盘或分区;
pvdisplay :显示出目前系统上面的PV状态;
pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性。
1、在磁盘上创建PV

  1. pvcreate /dev/hdb

2、在分区上创建PV
在分区上创建PV,首先得使用fdisk设置分区类型为8e。然后执行以下命令:

  1. pvcreate /dev/hdb1

创建VG(卷组)

这一阶段有如下命令:
vgcreate :创建vg命令;
vgscan :搜索系统上面是否有 VG 存在?
vgdisplay :显示目前系统上面的 VG 状态;
vgextend :在 VG 内添加额外的 PV ;
vgreduce :在 VG 内移除 PV;
vgchange :配置 VG 是否启动 (active);
vgremove :删除一个 VG
把物理卷/dev/hda1和/dev/hdb1添加进my_volume_group卷组:

  1. vgcreate myvg /dev/hda1 /dev/hdb1

创建LV(逻辑卷)

LV阶段几个命令:
lvcreate :创建 LV
lvscan :查询系统上面的 LV ;
lvdisplay :显示系统上面的 LV 状态
lvextend :在 LV 里面添加容量!
lvreduce :在 LV 里面减少容量;
lvremove :删除一个 LV !
lvresize :对 LV 进行容量大小的调整!

  1. [root@www ~]# lvcreate [-L N[mgt]] [-n LV名称] VG名称
  2. [root@www ~]# lvcreate [-l N] [-n LV名称] VG名称
  3. 选项与参数:
  4. -L  :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为 PE,
  5.       因此这个数量必须要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。
  6. -l  :后面可以接 PE 的『个数』,而不是容量。若要这么做,得要自行计算 PE 数。
  7. -n  :后面接的就是 LV 的名称。
  8. 更多的说明应该可以自行查阅! man lvcreate

在myvg创建1500M,名称为mylv的LV:

  1. lvcreate -L 1500M -n mylv myvg

在myvg创建一个名称为mylv,PE个数为100的LV:

  1. lvcreate -l 100 -n mylv myvg

格式化并挂载LV

我们格式化成为ext3,并挂载到/mylv目录

  1. mkdir /mylv
  2. mkfs -t ext3 /dev/my_volume_group/mylv
  3. mount /dev/my_volume_group/mylv /mylv

通过df -h检查发现,/dev/my_volume_group/mylv已经成功挂载到/mylv目录。

LVM其它功能

删除一个vg

停止vg:

  1. vgchange -a n my_volume_group

删除vg:

  1. vgremove my_volume_group

添加pv到vg

  1. vgextend my_volume_group /dev/hdc1

从vg中删除pv

使用pvdisplay命令确保pv不被lv使用:

  1. # pvdisplay /dev/hda1
  2.  
  3. — Physical volume —
  4. PV Name               /dev/hda1
  5. VG Name               myvg
  6. PV Size               1.95 GB / NOT usable 4 MB [LVM: 122 KB]
  7. PV#                   1
  8. PV Status             available
  9. Allocatable           yes (but full)
  10. Cur LV                1
  11. PE Size (KByte)       4096
  12. Total PE              499
  13. Free PE               0
  14. Allocated PE          499
  15. PV UUID               Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7

如果pv已经被使用,需要使用pvmove命令把pv的数据迁移到另外空闲的pv。
然后使用vgreduce命令删除pv:

  1. vgreduce my_volume_group /dev/hda1

删除一个LV

  1. # umount /dev/myvg/homevol
  2. # lvremove /dev/myvg/homevol
  3. lvremove — do you really want to remove "/dev/myvg/homevol"? [y/n]: y
  4. lvremove — doing automatic backup of volume group "myvg"
  5. lvremove — logical volume "/dev/myvg/homevol" successfully removed

扩展LV容量

扩展lv容量到12G:

  1. # lvextend -L12G /dev/myvg/homevol
  2. lvextend — extending logical volume "/dev/myvg/homevol" to 12 GB
  3. lvextend — doing automatic backup of volume group "myvg"
  4. lvextend — logical volume "/dev/myvg/homevol" successfully extended

增加LV容量1G:

  1. # lvextend -L+1G /dev/myvg/homevol
  2. lvextend — extending logical volume "/dev/myvg/homevol" to 13 GB
  3. lvextend — doing automatic backup of volume group "myvg"
  4. lvextend — logical volume "/dev/myvg/homevol" successfully extended

下一步还需要修改文件系统的大小:
对于ext2/ext3格式的文件系统:

  1. # umount /dev/myvg/homevol
  2. # resize2fs /dev/myvg/homevol
  3. # mount /dev/myvg/homevol /home

对于reiserfs格式的文件系统:
在线扩展:

  1. # resize_reiserfs -f /dev/myvg/homevol

离线扩展:

  1. # umount /dev/myvg/homevol
  2.  # resize_reiserfs /dev/myvg/homevol
  3.  # mount -treiserfs /dev/myvg/homevol /home

缩小LV容量

对于ext2/ext3格式的文件系统:

  1. umount /mylv
  2. e2fsck -f /dev/my_volume_group/mylv
  3. resize2fs /dev/my_volume_group/mylv 800M
  4. lvreduce -L -200M /dev/my_volume_group/mylv
  5. mount /dev/my_volume_group/mylv /mylv

800M为减小容量后最终的大小。
对于reiserfs格式的文件系统:

  1. # umount /home
  2. # resize_reiserfs -s-1G /dev/myvg/homevol
  3. # lvreduce -L-1G /dev/myvg/homevol
  4. # mount -treiserfs /dev/myvg/homevol /home

参考:http://www.tldp.org/HOWTO/LVM-HOWTO/

DRBD编译安装与配置

DRBD介绍

DRBD是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。 DRBD Logo数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)。DBRD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。DBRD的位置处于文件系统以下,比文件系统更加靠近操作系统内核及IO栈。

DRBD编译安装

安装所需依赖:

  1. yum -y install gcc kernel-devel kernel-headers flex

开始安装drbd,下载地址:http://oss.linbit.com/drbd/
安装用户空间工具:

  1. cd /tmp
  2. wget http://oss.linbit.com/drbd/8.4/drbd-8.4.1.tar.gz
  3. tar xzf drbd-8.4.1.tar.gz
  4. cd drbd-8.4.1
  5. ./configure –prefix=/usr/local/drbd –with-km
  6. make KDIR=/usr/src/kernels/2.6.18-274.18.1.el5-i686/
  7. make install
  8. mkdir -p /usr/local/drbd/var/run/drbd
  9. cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d
  10. chkconfig –add drbd
  11. chkconfig drbd on

安装drbd模块:

  1. cd drbd
  2. make clean
  3. make KDIR=/usr/src/kernels/2.6.18-274.18.1.el5-i686/
  4. cp drbd.ko /lib/modules/`uname -r`/kernel/lib/
  5. depmod

注:usr/src/kernels/2.6.18-274.18.1.el5-i686/这个内核源码树路径需要根据自己的系统修改。

DRBD配置

建立分区

假如现在有第二块硬盘hdb,两个node都要分区。

  1. #fdisk /dev/hdb                                                      //准备为 hdb 建立分区
  2.  The number of cylinders for this disk is set to 20805.
  3.  There is nothing wrong with that, but this is larger than 1024,
  4.  and could in certain setups cause problems with:
  5.  1) software that runs at boot time (e.g., old versions of LILO)
  6.  2) booting and partitioning software from other OSs
  7.    (e.g., DOS FDISK, OS/2 FDISK)
  8.  Command (m for help): n                                              //键入 n 表示要建立分区
  9.  Command action
  10.     e   extended
  11.     p   primary partition (1-4)
  12.  p                                                                    //键入 p 表示建立主要分区
  13.  Partition number (1-4): 1                                            //键入 1 为此主要分区代号
  14.  First cylinder (1-20805, default 1):                                 //开始磁柱值,按下 enter 即可
  15.  Using default value 1
  16.  Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805): //结束磁柱值,按下 enter 即可
  17.  Using default value 20805
  18.  Command (m for help): w                                              //键入 w 表示确定执行刚才设定
  19.  The partition table has been altered!
  20.  Calling ioctl() to re-read partition table.
  21.  Syncing disks.
  22.  [root@node1 yum.repos.d]# partprobe                                  //使刚才的 partition table 变更生效

建立分区完成后使用指令 fdisk -l 确定 partition talbe 状态

  1. #fdisk -l
  2.  Disk /dev/hda: 21.4 GB, 21474754560 bytes
  3.  255 heads, 63 sectors/track, 2610 cylinders
  4.  Units = cylinders of 16065 * 512 = 8225280 bytes
  5.     Device Boot      Start         End      Blocks   Id  System
  6.  /dev/hda1   *           1          13      104391   83  Linux
  7.  /dev/hda2              14        2610    20860402+  8e  Linux LVM
  8.  Disk /dev/hdb: 10.7 GB, 10737377280 bytes
  9.  16 heads, 63 sectors/track, 20805 cylinders
  10.  Units = cylinders of 1008 * 512 = 516096 bytes
  11.     Device Boot      Start         End      Blocks   Id  System
  12.  /dev/hdb1               1       20805    10485688+  83  Linux

建立分区完成后请建立 /db 目录。 (Node1 及 Node2 都必须建立)

  1. #mkdir /db

建立drbd配置文件

主要定义两块global和resource。

  1. vi /usr/local/drbd/etc/drbd.conf

写入:

  1. include "drbd.d/global_common.conf";
  2. include "drbd.d/*.res";
  1. vi /usr/local/drbd/etc/drbd.d/global_common.conf

写入:

  1. global {
  2.   usage-count yes;
  3. }
  4. common {
  5.   net {
  6.     protocol C;
  7.   }
  8. }
  1. vi /usr/local/drbd/etc/drbd.d/r0.res

写入:

  1. resource r0 {
  2.   on node1 {
  3.     device    /dev/drbd1;
  4.     disk      /dev/hdb1;
  5.     address   192.168.1.101:7789;
  6.     meta-disk internal;
  7.   }
  8.   on node2 {
  9.     device    /dev/drbd1;
  10.     disk      /dev/hdb1;
  11.     address   192.168.1.103:7789;
  12.     meta-disk internal;
  13.   }
  14. }

设置hostname

根据上面的resource配置文件,需要对192.168.1.101和192.168.1.103分别设置hostname为node1和node2,设置方法如下:

  1. vi /etc/sysconfig/network

修改HOSTNAME为node1

  1. vi /etc/hosts

填入:

  1. 192.168.1.101 node1
  2. 192.168.1.103 node2

使node1 hostnmae临时生效

  1. hostname node1

node2机器设置类似。

设置resource

以下操作需要在node1和node2操作。

  1. #modprobe drbd                                    //载入 drbd 模块
  2. #lsmod|grep drbd                                  //确认 drbd 模块是否载入
  3.  drbd                  228528  0
  4.  #dd if=/dev/zero of=/dev/hdb1 bs=1M count=100     //把一些资料塞到 hdb 內 (否则 create-md 时有可能会出现错误)
  5.  #drbdadm create-md r0                             //建立 drbd resource
  6.  #drbdadm up r0                                  //启动 resource r0

查看node1和node2的状态应该类似下面的:

  1. cat /proc/drbd
  1. version: 8.4.1 (api:1/proto:86-100)
  2. GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by [email protected], 2012-02-12 06:05:36
  3.  m:res  cs         ro                   ds                         p  mounted  fstype
  4.  0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C

表明现在已经启动服务,但还没有设置同步(即需要设置Primary Node)

设置Primary Node

以下操作仅在node1执行。
设置node1为primary node:

  1. drbdadm primary –force r0

再次查看node1的状态:

  1. #cat /proc/drbd
  2. version: 8.4.1 (api:1/proto:86-100)
  3. GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by [email protected], 2012-02-12 06:47:37
  4.  
  5.  1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—–
  6.     ns:52892 nr:0 dw:0 dr:52892 al:0 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

我们看到状态已经变成Primary/Secondary,即设置primary node成功。

创建DRBD文件系统

以下操作仅在node1执行。
上面已经完成了/dev/drbd1的初始化,现在来把/dev/drbd1格式化成ext3格式的文件系统。

  1. #mkfs.ext3 /dev/drbd1

然后将/dev/drbd1挂载到之前创建的/db目录。

  1. #mount /dev/drbd1 /db

现在你只要把数据写入/db目录,drbd即会立刻把数据同步到备机192.168.1.103的/dev/hdb1分区上。

drbd同步测试

当在备机node2启动drbd时,它是无法挂载/dev/hdb1分区的,我们可以尝试写些数据到node1的目录/db上,然后停止node2的drbd。

  1. drbdadm down r0

之后就可以把node2的/dev/hdb1挂载到目录/db

  1. mount -t ext3 /dev/hdb1 /db

我们就可以查看node2的/db目录是否有node1的数据。

手动切换主备机

我们可以把node1改变为备机,而node2改变为主机。
在node1上操作:

  1. umount /dev/drbd1
  2. drbdadm secondary r0

在node2上操作:

  1. drbdadm primary r0

此时应该已经切换成功。
如果配置过程中出现错误,可以参考http://devops.webres.wang/2012/02/drbd-erros-faq/

配置DRBD出现错误总结

Q1.’ha’ ignored, since this host (node2.webres.wang) is not mentioned with an ‘on’ keyword.?

Error Meaage:

执行指令 drbdadm create-md ha 时出现如下错误信息

  1. ‘ha’ ignored, since this host (node2.webres.wang) is not mentioned with an ‘on’ keyword.
  2. Ans:

因为在 drbd 设定 drbd.conf 中 on 本来写的是 node1、node2 而以,将node1和node2分别改为node1.webres.wang,node2.webres.wang。

Q2.drbdadm create-md ha: exited with coolcode 20?

Error Meaage:

执行指令 drbdadm create-md ha 时出现如下错误信息

  1. open(/dev/hdb1) failed: No such file or directory
  2.  Command ‘drbdmeta 0 v08 /dev/hdb1 internal create-md’ terminated with exit coolcode 20
  3.  drbdadm create-md ha: exited with coolcode 20

Ans:

因为忘了执行 fdisk /dev/hdb 指令建立分割区所造成,如下将 /dev/hdb 建立分割区后指令即可正常执行

#fdisk /dev/hdb //准备为 hdb 建立分割区
The number of cylinders for this disk is set to 20805.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): n //键入 n 表示要建立分割区
Command action
e extended
p primary partition (1-4)
p //键入 p 表示建立主要分割区
Partition number (1-4): 1 //键入 1 为此主要分割区代号
First cylinder (1-20805, default 1): //开始磁柱值,按下 enter 即可
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805): //结束磁柱值,按下 enter 即可
Using default value 20805
Command (m for help): w //键入 w 表示确定执行刚才设定
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@node1 yum.repos.d]# partprobe //使刚才的 partition table 变更生效
Q3.drbdadm create-md ha: exited with coolcode 40?

Error Meaage:

执行指令 drbdadm create-md ha 时出现如下错误信息

  1. Device size would be truncated, which
  2.  would corrupt data and result in
  3.  ‘access beyond end of device’ errors.
  4.  You need to either
  5.     * use external meta data (recommended)
  6.     * shrink that filesystem first
  7.     * zero out the device (destroy the filesystem)
  8.  Operation refused.
  9.  Command ‘drbdmeta 0 v08 /dev/hdb1 internal create-md’ terminated with exit coolcode 40
  10.  drbdadm create-md ha: exited with coolcode 40

Ans:

使用 dd 指令将一些资料塞到 /dev/hdb 后再执行 drbdadm create-md ha 指令即可顺利执行

#dd if=/dev/zero of=/dev/hdb1 bs=1M count=100
Q4.DRBD 状态始终是 Secondary/Unknown?

Error Meaage:

  1. Node1、Node2 主机启动 DRBD 后状态始终是 Secondary/Unknown

#service drbd status
drbd driver loaded OK; device status:
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by [email protected], 2010-06-04 08:04:16
m:res cs ro ds p mounted fstype
0:ha WFConnection Secondary/Unknown Inconsistent/DUnknown C
Ans:

1、Node1、Node2 没有打开相对应的 Port,请开启相对应的 Port 或先把 IPTables 服务关闭即可。
2、可能发生了脑裂行为,一般出现在ha切换时,解决方法:
在一节点执行:
drbdadm secondary resource
drbdadm connect –discard-my-data resource
另一节点执行:
drbdadm connect resource
Q5.1: Failure: (104) Can not open backing device

Error Meaage:
执行drbdadm up r0时出现:

  1. 1: Failure: (104) Can not open backing device.
  2. Command ‘drbdsetup attach 1 /dev/sdb1 /dev/sdb1 internal’ terminated with exit code 10

Ans:
可能因为你挂载了/dev/sdb1,执行umount /dev/sdb1即可。