shell采集系统cpu 内存 磁盘 网络信息

cpu信息采集


cpu使用率

采集算法
通过/proc/stat文件采集并计算CPU总使用率或者单个核使用率。以cpu0为例,算法如下:
1. cat /proc/stat | grep ‘cpu0’得到cpu0的信息
2. cpuTotal1=user+nice+system+idle+iowait+irq+softirq
3. cpuUsed1=user+nice+system+irq+softirq
4. sleep 30秒
5. 再次cat /proc/stat | grep ‘cpu0’ 得到cpu的信息
6. cpuTotal2=user+nice+system+idle+iowait+irq+softirq
7. cpuUsed2=user+nice+system+irq+softirq
8. 得到cpu0 在30秒内的单核利用率:(cpuUsed2 – cpuUsed1) * 100 / (cpuTotal2 – cpuTotal1)
相当于使用top –d 30命令,把user、nice、system、irq、softirq五项的使用率相加。
shell代码:

  1. a=(`cat /proc/stat | grep -E "cpub" | awk -v total=0 ‘{$1="";for(i=2;i<=NF;i++){total+=$i};used=$2+$3+$4+$7+$8 }END{print total,used}’`)
  2. sleep 30
  3. b=(`cat /proc/stat | grep -E "cpub" | awk -v total=0 ‘{$1="";for(i=2;i<=NF;i++){total+=$i};used=$2+$3+$4+$7+$8 }END{print total,used}’`)
  4. cpu_usage=(((${b[1]}-${a[1]})*100/(${b[0]}-${a[0]})))

cpu负载

采集算法:
读取/proc/loadavg得到机器的1/5/15分钟平均负载,再乘以100。
shell代码:

  1. cpuload=(`cat /proc/loadavg | awk ‘{print $1,$2,$3}’`)
  2. load1=${cpuload[0]}
  3. load5=${cpuload[1]}
  4. load15=${cpuload[2]}

内存采集


应用程序使用内存

采集算法:
读取/proc/meminfo文件,(MemTotal – MemFree – Buffers – Cached)/1024得到应用程序使用内存数。
shell代码:

  1. awk ‘/MemTotal/{total=$2}/MemFree/{free=$2}/Buffers/{buffers=$2}/^Cached/{cached=$2}END{print (total-free-buffers-cached)/1024}’  /proc/meminfo

MEM使用量

采集算法:
读取/proc/meminfo文件,MemTotal – MemFree得到MEM使用量。
shell代码:

  1. awk ‘/MemTotal/{total=$2}/MemFree/{free=$2}END{print (total-free)/1024}’  /proc/meminfo

SWAP使用大小

采集算法:
通过/proc/meminfo文件,SwapTotal – SwapFree得到SWAP使用大小。
shell代码:

  1. awk ‘/SwapTotal/{total=$2}/SwapFree/{free=$2}END{print (total-free)/1024}’  /proc/meminfo

磁盘信息采集


disk io

1、IN:平均每秒把数据从硬盘读到物理内存的数据量
采集算法:
读取/proc/vmstat文件得出最近240秒内pgpgin的增量,把pgpgin的增量再除以240得到每秒的平均增量。
相当于vmstat 240命令bi一列的输出。
shell代码:

  1. a=`awk ‘/pgpgin/{print $2}’ /proc/vmstat`
  2. sleep 240
  3. b=`awk ‘/pgpgin/{print $2}’ /proc/vmstat`
  4. ioin=$(((b-a)/240))

2、OUT:平均每秒把数据从物理内存写到硬盘的数据量
采集算法:
读取/proc/vmstat文件得出最近240秒内pgpgout的增量,把pgpgout的增量再除以240得到每秒的平均增量。
相当于vmstat 240命令bo一列的输出。
shell代码:

  1. a=`awk ‘/pgpgout/{print $2}’ /proc/vmstat`
  2. sleep 240
  3. b=`awk ‘/pgpgout/{print $2}’ /proc/vmstat`
  4. ioout=$(((b-a)/240))

网络


流量

以http://devops.webres.wang/为例,eth0是内网,eth1外网,获取60秒的流量。
机器网卡的平均每秒流量
采集算法:
读取/proc/net/dev文件,得到60秒内发送和接收的字节数(KB),然后乘以8,再除以60,得到每秒的平均流量。
shell代码:

  1. traffic_be=(`awk -F'[: ]+’ ‘BEGIN{ORS=" "}/eth0/{print $3,$10}/eth1/{print $3,$11}’ /proc/net/dev`)
  2. sleep 60
  3. traffic_af=(`awk -F'[: ]+’ ‘BEGIN{ORS=" "}/eth0/{print $3,$10}/eth1/{print $3,$11}’ /proc/net/dev`)
  4. eth0_in=$(( (${traffic_af[0]}-${traffic_be[0]})/60 ))
  5. eth0_out=$(( (${traffic_af[1]}-${traffic_be[1]})/60 ))
  6. eth1_in=$(( (${traffic_af[2]}-${traffic_be[2]})/60 ))
  7. eth1_out=$(( (${traffic_af[3]}-${traffic_be[3]})/60 ))

包量

机器网卡的平均每秒包量
采集算法:
读取/proc/net/dev文件,得到60秒内发送和接收的包量,然后除以60,得到每秒的平均包量。
shell代码:

  1. packet_be=(`awk -F'[: ]+’ ‘BEGIN{ORS=" "}/eth0/{print $4,$12}/eth1/{print $4,$12}’ /proc/net/dev`)
  2. sleep 60
  3. packet_af=(`awk -F'[: ]+’ ‘BEGIN{ORS=" "}/eth0/{print $4,$12}/eth1/{print $4,$12}’ /proc/net/dev`)
  4. eth0_in=$(( (${packet_af[0]}-${packet_be[0]})/60 ))
  5. eth0_out=$(( (${packet_af[1]}- ${packet_be[1]})/60 ))
  6. eth1_in=$(( (${packet_af[2]}- ${packet_be[2]})/60 ))
  7. eth1_out=$(( (${packet_af[3]}- ${packet_be[3]})/60 ))

shell脚本通过日志来统计网站pv 404 500状态码

下面的脚本能统计出网站的总访问量,以及404,500出现的次数。统计出来后,我们可以结合监控宝来进行记录,进而可以看出网站访问量是否异常,是否存在攻击,一目了然。还可以根据查看500出现的次数,进而判断网站程序是否出现异常。

  1. #!/bin/bash
  2. #purpose:count nginx or apache or other webserver status code using jiankongbao
  3. #how to:run the script every 5 minutes with crontab
  4. #write by zhumaohai.
  5. #blog: http://devops.webres.wang/
  6.  
  7. log_path="/var/log/nginx/devops.webres.wang/access.log"
  8. becur=`date -d "5 minute ago" +%H%M%S`
  9. code=(`tac $log_path  | awk  -v a="$becur" -v total=0 -F [‘ ‘:] ‘{
  10. t=$5$6$7
  11. if (t>=a){
  12. code[$12]++
  13. total++
  14. }
  15. else {
  16. exit;
  17. }
  18. }END{
  19. print code[404]?code[404]:0,code[500]?code[500]:0,total
  20. }’
  21. `)
  22. c404=${code[0]}
  23. c500=${code[1]}
  24. total=${code[2]}
  25. echo -e "<pre>nc404:${c404}nc500:${c500}ntotal:${total}n</pre>" > /data/www/status/devops.webres.wang.html

脚本最后一行是以:

  1. <pre>
  2. c404:1102
  3. c500:545
  4. total:55463
  5. </pre>

的格式写入到一个devops.webres.wang html文件,再结合监控宝的自定义监控来收集这些信息。
非常的方便,监控宝会自动出图表。

同时管理多台服务器的expect脚本

最近通过exploring expect书籍,简单学了下expect脚本语言,这个脚本语言是tcl语言的扩展,用来解决一些工具无法自动交互的问题,如ssh登录时,无法在命令就指定密码等。下面是利用expect来实现管理多台服务器的简单例子:

  1. #!/usr/bin/expect
  2. #purpose:auto run command on multiple servers
  3. #how to:  mms <user> <cmd>
  4. #write by zhumaohai.
  5. #blog:http://devops.webres.wang/
  6.  
  7. if {$argc < 2} {
  8. puts "usage: mms <user> <cmd>"
  9. exit 1
  10. }
  11.  
  12. #set servers
  13. set SERVERS {"192.168.0.100" "192.168.0.101" "192.168.0.102"}
  14.  
  15. #set password
  16. set PASSWORDS(user1) "passwd1"
  17. set PASSWORDS(user2) "passwd2"
  18.  
  19. #get virables
  20. set USER [lindex $argv 0]
  21. set CMD [lrange $argv 1 end]
  22.  
  23. set passwd $PASSWORDS($USER)
  24.  
  25. foreach x $SERVERS {
  26. eval spawn ssh -l $USER $x $CMD
  27. expect {
  28. "password" { send "$passwdr" }
  29. "yes/no" { send "yesr";exp_continue; }
  30. }
  31. expect eof
  32. }

1、这里定义了三台服务器192.168.0.100 192.168.0.101 192.168.0.102,定义了用户user1的密码为passwd1,用户user2的密码为passwd2,假如脚本文件名为ms,用法为:
./ms 用户 命令
如./ms user1 date
2、在使用脚本时,请确认系统已经安装有expect命令,centos使用yum install expect安装,ubuntu使用apt-get install expect安装。

expect spawn、linux expect 用法小记

使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。
  脚本代码如下:

  1.   ##############################################
  2.   #!/usr/bin/expect
  3.   set timeout 30
  4.   spawn ssh -l username 192.168.1.1
  5.   expect "password:"
  6.   send "ispassr"
  7.   interact
  8.   ##############################################

  1. [#!/usr/bin/expect]
  这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。
  注意:这一行需要在脚本的第一行。
  2. [set timeout 30]
  基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒
  3. [spawn ssh -l username 192.168.1.1]
  spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。
  它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
  4. [expect “password:”]
  这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒
  5. [send “ispassr”]
  这里就是执行交互动作,与手工输入密码的动作等效。
  温馨提示: 命令字符串结尾别忘记加上“r”,如果出现异常等待的状态可以核查一下。
  6. [interact]
  执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行

  1.   #!/usr/bin/expect #注意安装的路径,不确定 whereis expect 一下
  2.   # Change a login shell to bash
  3.   set user [lindex $argv 0]
  4.   spawn bash $user
  5.   expect "]:"
  6.   send "/bin/bash "
  7.   expect eof
  8.   exit

转自:http://sysop.blogbus.com/logs/70787883.html

shell数组小结

数组作为一种特殊的数据结构在任何一种编程语言中都有它的一席之地,当然bash shell也不例外。本文就shell数组来做一个小的总结。
在这里只讨论一维数组的情况,关于多维数组(事实上,你得用一维数组的方法来模拟),不涉及。这里包括数组的复制,计算,删除,替换。

数组的声明:

  1. 1)array[key]=value # array[0]=one,array[1]=two
  1. 2)declare -a array # array被当作数组名
  1. 3)array=( value1 value2 value3 … )
  1. 4)array=( [1]=one [2]=two [3]=three … )
  1. 5)array="one two three" # echo ${array[0|@|*]},把array变量当作数组来处理,但数组元素只有字符串本身

数组的访问:

  1. 1)${array[key]} # ${array[1]}

数组的删除

  1. 1)unset array[1] # 删除数组中第一个元素
  1. 2)unset array # 删除整个数组

计算数组的长度:

  1. 1)${#array}
  1. 2)${#array[0]} #同上。 ${#array[*]} 、${#array[@]}。注意同#{array:0}的区别

数组的提取
从尾部开始提取:

  1. array=( [0]=one [1]=two [2]=three [3]=four )
  2. ${array[@]:1} # two three four,除掉第一个元素后所有元素,那么${array[@]:0}表示所有元素
  3. ${array[@]:0:2} # one two
  4. ${array[@]:1:2} # two three

子串删除

  1. [root@localhost dev]# echo ${array[@]:0}
  2. one two three four
  3.  
  4. [root@localhost dev]# echo ${array[@]#t*e} # 左边开始最短的匹配:"t*e",这将匹配到"thre"
  5. one two e four
  6.  
  7. [root@localhost dev]# echo ${array[@]##t*e} # 左边开始最长的匹配,这将匹配到"three"
  8.  
  9. [root@localhost dev]# array=( [0]=one [1]=two [2]=three [3]=four )
  10.  
  11. [root@localhost dev]# echo ${array[@] %o} # 从字符串的结尾开始最短的匹配
  12. one tw three four
  13.  
  14. [root@localhost dev]# echo ${array[@] %%o} # 从字符串的结尾开始最长的匹配
  15. one tw three four

子串替换

  1. [root@localhost dev]# array=( [0]=one [1]=two [2]=three [3]=four )

第一个匹配到的,会被删除

  1. [root@localhost dev]# echo ${array[@] /o/m}
  2. mne twm three fmur

所有匹配到的,都会被删除

  1. [root@localhost dev]# echo ${array[@] //o/m}
  2. mne twm three fmur

没有指定替换子串,则删除匹配到的子符

  1. [root@localhost dev]# echo ${array[@] //o/}
  2. ne tw three fur

替换字符串前端子串

  1. [root@localhost dev]# echo ${array[@] /#o/k}
  2. kne two three four

替换字符串后端子串

  1. [root@localhost dev]# echo ${array[@] /%o/k}
  2. one twk three four

转自:http://bbs.chinaunix.net/thread-1779167-1-1.html

Ubuntu 12.04安装配置Postfix dovecot cyrus sasl(mysql虚拟用户)

本文是基于ubuntu 12.04配置的邮件服务器,利用postfix提供邮件smtp服务,dovecot提供pop3或imap代理收信服务。使用mysql管理和验证邮件用户。以下操作经本人亲试通过,涉及域名webres.wang的请替换为自己的。

一、安装必要包

  1. apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server dovecot-common dovecot-imapd dovecot-pop3d libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl telnet mailutils dovecot-mysql

二、设置MySQL数据库

  1. mysql -u root -p
  1. mysql> CREATE DATABASE mail;
  2. mysql> USE mail;
  3. mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO ‘mail_admin’@’localhost’ IDENTIFIED BY ‘password-for-mail_admin’;
  4. mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO ‘mail_admin’@’127.0.0.1’ IDENTIFIED BY ‘password-for-mail_admin’;
  5. mysql> FLUSH PRIVILEGES;
  6. mysql> CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
  7. mysql> CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
  8. mysql> CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
  9. mysql> CREATE TABLE transport ( domain varchar(128) NOT NULL default ”, transport varchar(128) NOT NULL default ”, UNIQUE KEY domain (domain) );
  10. mysql> quit

注:请替换password-for-mail_admin为用户mail_admin的密码,以下出现password-for-mail_admin的也请替换下。

三、配置Postfix使用MySQL

文件:/etc/postfix/mysql-virtual_domains.cf

  1. user = mail_admin
  2. password = password-for-mail_admin
  3. dbname = mail
  4. query = SELECT domain AS virtual FROM domains WHERE domain=’%s’
  5. hosts = 127.0.0.1

文件:/etc/postfix/mysql-virtual_forwardings.cf

  1. user = mail_admin
  2. password = password-for-mail_admin
  3. dbname = mail
  4. query = SELECT destination FROM forwardings WHERE source=’%s’
  5. hosts = 127.0.0.1

文件:/etc/postfix/mysql-virtual_mailboxes.cf

  1. user = mail_admin
  2. password = password-for-mail_admin
  3. dbname = mail
  4. query = SELECT CONCAT(SUBSTRING_INDEX(email,’@’,-1),’/’,SUBSTRING_INDEX(email,’@’,1),’/’) FROM users WHERE email=’%s’
  5. hosts = 127.0.0.1

文件:/etc/postfix/mysql-virtual_email2email.cf

  1. user = mail_admin
  2. password = password-for-mail_admin
  3. dbname = mail
  4. query = SELECT email FROM users WHERE email=’%s’
  5. hosts = 127.0.0.1

设置权限:

  1. chmod o= /etc/postfix/mysql-virtual_*.cf
  2. chgrp postfix /etc/postfix/mysql-virtual_*.cf

建立用户:

  1. groupadd -g 5000 vmail
  2. useradd -g vmail -u 5000 vmail -d /home/vmail -m

配置postfix:

  1. postconf -e ‘myhostname = webres.wang’
  2. postconf -e ‘mydestination = webres.wang, localhost, localhost.localdomain’
  3. postconf -e ‘mynetworks = 127.0.0.0/8’
  4. postconf -e ‘message_size_limit = 30720000’
  5. postconf -e ‘virtual_alias_domains =’
  6. postconf -e ‘virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf’
  7. postconf -e ‘virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf’
  8. postconf -e ‘virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf’
  9. postconf -e ‘virtual_mailbox_base = /home/vmail’
  10. postconf -e ‘virtual_uid_maps = static:5000’
  11. postconf -e ‘virtual_gid_maps = static:5000’
  12. postconf -e ‘smtpd_sasl_auth_enable = yes’
  13. postconf -e ‘broken_sasl_auth_clients = yes’
  14. postconf -e ‘smtpd_sasl_authenticated_header = yes’
  15. postconf -e ‘smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination’
  16. postconf -e ‘smtpd_use_tls = yes’
  17. postconf -e ‘smtpd_tls_cert_file = /etc/postfix/smtpd.cert’
  18. postconf -e ‘smtpd_tls_key_file = /etc/postfix/smtpd.key’
  19. postconf -e ‘proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps’
  20. postconf -e ‘virtual_transport = dovecot’
  21. postconf -e ‘local_transport = dovecot’

四、为postfix创建证书:

  1. cd /etc/postfix
  2. openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

更改证书权限:

  1. chmod o= /etc/postfix/smtpd.key

五、配置saslauthd

  1. mkdir -p /var/spool/postfix/var/run/saslauthd
  2. cp -a /etc/default/saslauthd /etc/default/saslauthd.bak

编辑文件:/etc/default/saslauthd,按以下内容修改:

  1. START=yes
  2. DESC="SASL Authentication Daemon"
  3. NAME="saslauthd"
  4. MECHANISMS="pam"
  5. MECH_OPTIONS=""
  6. THREADS=5
  7. OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

文件:/etc/pam.d/smtp

  1. auth    required   pam_mysql.so user=mail_admin passwd=password-for-mail_admin host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
  2. account sufficient pam_mysql.so user=mail_admin passwd=password-for-mail_admin host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1

文件:/etc/postfix/sasl/smtpd.conf

  1. pwcheck_method: saslauthd
  2. mech_list: plain login
  3. allow_plaintext: true
  4. auxprop_plugin: sql
  5. sql_engine: mysql
  6. sql_hostnames: 127.0.0.1
  7. sql_user: mail_admin
  8. sql_passwd: password-for-mail_admin
  9. sql_database: mail
  10. sql_select: select password from users where email = ‘%u@%r’

设置权限:

  1. chmod o= /etc/pam.d/smtp
  2. chmod o= /etc/postfix/sasl/smtpd.conf

重启服务:

  1. adduser postfix sasl
  2. service postfix restart
  3. service saslauthd restart

六、配置Dovecot

文件:/etc/postfix/master.cf,按如下修改

取消submission配置的注释:

  1. #submission inet n       –       –       –       –       smtpd
  2. #  -o syslog_name=postfix/submission
  3. #  -o smtpd_tls_security_level=encrypt
  4. #  -o smtpd_sasl_auth_enable=yes
  5. #  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  6. #  -o milter_macro_daemon_name=ORIGINATING
  7.  改为
  8. submission inet n       –       –       –       –       smtpd
  9.   -o syslog_name=postfix/submission
  10.   -o smtpd_tls_security_level=encrypt
  11.   -o smtpd_sasl_auth_enable=yes
  12.   -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  13.   -o milter_macro_daemon_name=ORIGINATING

文件尾增加:

  1. dovecot   unix  –       n       n       –       –       pipe
  2.     flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
  1. cp -a /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.bak

清空文件/etc/dovecot/dovecot.conf,加入如下:

  1. log_timestamp = "%Y-%m-%d %H:%M:%S "
  2. mail_location = maildir:/home/vmail/%d/%n/Maildir
  3. namespace {
  4.   inbox = yes
  5.   location =
  6.   prefix = INBOX.
  7.   separator = .
  8.   type = private
  9. }
  10. passdb {
  11.   args = /etc/dovecot/dovecot-sql.conf
  12.   driver = sql
  13. }
  14. protocols = imap pop3
  15. disable_plaintext_auth = no
  16. auth_mechanisms = plain login
  17. service auth {
  18.   unix_listener /var/spool/postfix/private/auth {
  19.     group = postfix
  20.     mode = 0660
  21.     user = postfix
  22.   }
  23.   unix_listener auth-master {
  24.     mode = 0600
  25.     user = vmail
  26.   }
  27.   user = root
  28. }
  29. ssl = required
  30. ssl_cert = </etc/ssl/certs/dovecot.pem
  31. ssl_key = </etc/ssl/private/dovecot.pem
  32. userdb {
  33.   args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
  34.   driver = static
  35. }
  36. protocol lda {
  37.   auth_socket_path = /var/run/dovecot/auth-master
  38.   log_path = /home/vmail/dovecot-deliver.log
  39.   postmaster_address = [email protected]
  40. }
  41. protocol pop3 {
  42.   pop3_uidl_format = %08Xu%08Xv
  43. }
  1. cp -a /etc/dovecot/dovecot-sql.conf /etc/dovecot/dovecot-sql.conf.bak

文件:/etc/dovecot/dovecot-sql.conf

  1. driver = mysql
  2. connect = host=127.0.0.1 dbname=mail user=mail_admin password=password-for-mail_admin
  3. default_pass_scheme = CRYPT
  4. password_query = SELECT email as user, password FROM users WHERE email=’%u’;
  1. service dovecot restart
  2.  
  3.  
  4. chgrp vmail /etc/dovecot/dovecot.conf
  5. chmod g+r /etc/dovecot/dovecot.conf

七、设置Mail Aliases

文件/etc/aliases

  1. postmaster: root
  2. root: [email protected]

八、测试

  1. mysql -u root -p
  1. USE mail;
  2. INSERT INTO domains (domain) VALUES (‘webres.wang’);
  3. INSERT INTO users (email, password) VALUES (‘[email protected]’, ENCRYPT(‘password-for-sales’));
  4. quit

这里添加了一个[email protected]的用户,密码为password-for-sales

最后,可以使用邮件客户端,如foxmail进行收信和发信的测试。

Ubuntu 12.04安装PPTP

1、安装软件

  1. sudo apt-get install pptpd ufw

2、编辑/etc/ppp/pptpd-options

找到

  1. refuse-pap
  2. refuse-chap
  3. refuse-mschap

注释掉这三行,即在前面加#

3、接着同样的文件,添加DNS

  1. ms-dns 8.8.8.8
  2. ms-dns 8.8.4.4

4、编辑/etc/pptpd.conf

增加或修改:

  1. localip 10.99.99.99
  2. remoteip 10.99.99.100-199

5、编辑/etc/ppp/chap-secrets

添加用户和密码,格式为:

  1. [Username] [Service] [Password] [Allowed IP Address]

如:

  1. sampleusername pptpd samplepassword *

6、重启pptpd

  1. sudo /etc/init.d/pptpd restart

7、编辑/etc/sysctl.conf

增加:

  1. net.ipv4.ip_forward=1

立即生效:

  1. sudo sysctl -p

8、编辑/etc/default/ufw

把所有的默认策略更改为ACCEPT:

  1. DEFAULT_FORWARD_POLICY由DROP更改为ACCEPT
  2. DEFAULT_INPUT_POLICY由DROP更改为ACCEPT

9、编辑/etc/ufw/before.rules

增加:

  1. # NAT table rules
  2. *nat
  3.  
  4. :POSTROUTING ACCEPT [0:0]
  5. # Allow forward traffic to eth0
  6. -A POSTROUTING -s 10.99.99.0/24 -o eth0 -j MASQUERADE
  7.  
  8. # Process the NAT table rules
  9. COMMIT

10、启动ufw

  1. sudo ufw enable

11、使用客户端进行测试
如windows7,打开控制面板->网络和internet->网络和共享中心同,点击“设置新的连接和网络”,选择连接到工作区,接下来就按提示操作就好。

ubuntu mysql更改tmp路径

因为mysql经常要把文件定入tmp目录,而tmp的目录为/tmp,为了提高性能,所以考虑更改tmpdir目录为/run/shm,即使用内存来存储。
1、打开/etc/mysql/my.cnf
更改tmpdir = /tmp为

  1. tmpdir = /run/shm

2、更改/etc/apparmor.d/usr.sbin.mysqld添加:

  1. /run/shm/* rw,

3、重启mysql和apparmor

  1. /etc/init.d/apparmor restart
  2. /etc/init.d/mysql restart

分布式存储MooseFS的搭建

MooseFS介绍

mooseFS是一款网络分布式文件系统。它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS也像其他类unix文件系统一样,包含了层级结构(目录树),存储着文件属性(权限,最后访问和修改时间),可以创建特殊的文件(块设备,字符设备,管道,套接字),符号链接,硬链接。
MooseFS文件系统结构包括以下四种角色:
1 管理服务器managing server (master)
2 元数据日志服务器Metalogger server(Metalogger)
3数据存储服务器data servers (chunkservers)
4 客户机挂载使用client computers
原理图:
存储

存储

搭建的环境介绍

Master server: 10.96.153.223
Metalogger server : 10.96.153.224
chunk server : 10.96.153.221 10.96.153.222
client server : 10.96.153.225
这里使用两台chunk server,master、metalogger和client各一台进行测试,当然,如果由于服务器有限,可以把master和metalogger分别放在chunkserver上。

Master Server安装

1、下载解压

  1. #cd /usr/src
  2. #wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.26/mfs-1.6.26.tar.gz
  3. #tar xzf mfs-1.6.26.tar.gz

2、配置编译参数

  1. #groupadd mfs
  2. #useradd -g mfs mfs
  3. #cd mfs-1.6.26/
  4. #./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –disable-mfsmount –disable-mfschunkserver

3、编译并安装

  1. #make
  2. #make install

4、配置文件

  1. #cd /usr/local/mfs/etc
  2. #cp mfsmaster.cfg.dist mfsmaster.cfg
  3. #cp mfsexports.cfg.dist mfsexports.cfg

更改配置文件mfsexports.cfg

  1. 10.96.153.0/24 / rw,alldirs,maproot=0

5、启动前准备

  1. #cd /usr/local/mfs/var/mfs
  2. #cp metadata.mfs.empty metadata.mfs
  3. #echo "10.96.153.221 mfsmaster" >> /etc/hosts

6、启动mfsmaster

  1. #/usr/local/mfs/sbin/mfsmaster start

7、监控服务

  1. #/usr/local/mfs/sbin/mfscgiserv

浏览器输入10.96.153.221:9425

mfsmetalogger搭建

1、下载解压

  1. #cd /usr/src
  2. #wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.26/mfs-1.6.26.tar.gz
  3. #tar xzf mfs-1.6.26.tar.gz

2、配置编译参数

  1. #groupadd mfs
  2. #useradd -g mfs mfs
  3. #cd mfs-1.6.26/
  4. #./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –disable-mfsmount –disable-mfschunkserver

3、编译并安装

  1. #make
  2. #make install

4、配置文件

  1. #cd /usr/local/mfs/etc
  2. #cp mfsmetalogger.cfg.dist mfsmetalogger.cfg

5、启动前准备

  1. #echo "10.96.153.221 mfsmaster" >> /etc/hosts

6、启动mfsmetalogger

  1. ##/usr/local/mfs/sbin/mfsmetalogger start

Chunk servers 安装

1、下载解压

  1. #cd /usr/src
  2. #wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.26/mfs-1.6.26.tar.gz
  3. #tar xzf mfs-1.6.26.tar.gz

2、配置编译参数

  1. #groupadd mfs
  2. #useradd -g mfs mfs
  3. #cd mfs-1.6.26/
  4. #./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –disable-mfsmount –disable-mfsmaster

3、编译并安装

  1. #make
  2. #make install

4、创建磁盘(100G)

  1. #dd if=/dev/zero of=/mnt/storage/mfschunks1 bs=1024 count=1 seek=$((100*1024*1024-1))
  2. #mkfs -t ext3 /mnt/storage/mfschunks1
  3. #mkdir -p /mnt/mfs1
  4. #mount -t ext3 -o loop /mnt/storage/mfschunks1 /mnt/mfs1

5、配置文件

  1. #cd /usr/local/mfs/etc
  2. #cp mfschunkserver.cfg.dist mfschunkserver.cfg
  3. #cp mfshdd.cfg.dist mfshdd.cfg

更改配置文件mfshdd.cfg,加入:

  1. /mnt/mfs1

6、启动前准备

  1. #echo "10.96.153.221 mfsmaster" >> /etc/hosts
  2. #chown -R mfs:mfs /mnt/mfs1

7、启动chunkserver

  1. ##/usr/local/mfs/sbin/mfschunkserver start

mfsclient安装

1、下载解压

  1. #cd /usr/src
  2. #wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.26/mfs-1.6.26.tar.gz
  3. #tar xzf mfs-1.6.26.tar.gz

2、配置编译参数

  1. #groupadd mfs
  2. #useradd -g mfs mfs
  3. #cd mfs-1.6.26/
  4. #./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –disable-mfsmaster–disable-mfschunkserver

3、编译并安装

  1. #make
  2. #make install

4、启动前准备

  1. mkdir /mnt/mfs
  2. #echo "10.96.153.221 mfsmaster" >> /etc/hosts

5、开始挂载

  1. #/usr/local/mfs/bin/mfsmount /mnt/mfs -H mfsmaster

6、检查
df -h查看输出

MFS维护

5.1、启动MFS集群

  • 1、启动mfsmaster 进程
  • 2、启动所有的mfschunkserver 进程
  • 3、启动mfsmetalogger 进程(如果配置了mfsmetalogger)
  • 4、当所有的chunkservers 连接到MooseFS master 后,任何数目的客户端可以利用mfsmount 去挂接被export 的文件系统。(可以通过检查master 的日志或是CGI 监视器来查看是否所有的chunkserver被连接)。

5.2、停止MFS集群

  • 1、在所有的客户端卸载MooseFS 文件系统(用umount 命令或者是其它等效的命令)
  • 2、用mfschunkserver stop 命令停止chunkserver 进程
  • 3、用mfsmetalogger stop 命令停止metalogger 进程
  • 4、用mfsmaster stop 命令停止master 进程

5.3、MFS chunkservers 的维护

若每个文件的goal(目标)都不小于2,并且没有under-goal 文件(这些可以用mfsgetgoal –r和mfsdirinfo 命令来检查),那么一个单一的chunkserver 在任何时刻都可能做停止或者是重新启动。以后每当需要做停止或者是重新启动另一个chunkserver 的时候,要确定之前的chunkserver 被连接,而且要没有under-goal chunks。

5.4、MFS元数据备份

用rsync定时备份/usr/local/app/soft/mfs/var/mfs/metadata.mfs.back

5.5、MFS Master的恢复

  1. mfsmetarestore -a

5.6、从MetaLogger中恢复Master

  1. mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog_ml.*.mfs

cx_Freeze给python(pyqt)程序打包成exe过程

  1. 1、下载cx_frezze,安装。安装后会在 python目录 D:Python27Libsite-packagescx_FreezesamplesPyQt4 下有一个 setup.py
  2.  
  3. 2、把这个setup.py拷贝到需要打包的pyqt程序所在的目录,假设要打包的pyqt程序叫 main_window.py
  4.  
  5. 3、修改setup.py,将默认的“PyQt4app.py"替换成“main_window.py”
  6.  
  7. 4、cmd 切换到当前路径,运行 python setup.py build 即可
  1. BTW:今天打包了用pyqt写的版本发布工具,打包后运行程序出现"driver not loaded"
  2. 解决方法如下:
  3. 在程序的根目录新建子目录"sqldrivers",到C:Python27Libsite-packagesPyQt4pluginssqldrivers复制所需驱动到此目录,比如我用的是mysql,所以就复制了qsqlmysql4.dll。

转自:oldman的博客