Quantcast
Channel: 钻戒 and 仁豆米
Viewing all 290 articles
Browse latest View live

Centreon的CLAPI应用

$
0
0

公司的监控系统是Centreon+nagios。

其实无论是nagios或者zabbix,用习惯了用顺了都一样。

如何在命令行给一个主机增加一个服务监控呢?

首先,查查都有什么服务模板:

centreon -uadmin -ppassword  -o STPL -a show  
2549;nrpe_check_http;nrpe_check_http;check_nrpe;!check_http;;;;2;2  

看结果:
1是服务ID,2是服务描述,3是服务命令,4是命令参数,......倒数第2是Active check enable,倒数第1是Passive check enable

我们记住nrpe_check_http

我们查查要添加监控服务的机器:

centreon -uadmin -ppassword -o SERVICE -a show|grep 172.16.9.101  
143;172.16.9.101;1425;nrpe_check_cpu;;;;;;2;2;1  
143;172.16.9.101;1424;nrpe_check_disk;;;;;;2;2;1  
143;172.16.9.101;1430;nrpe_check_io;;;;;;2;2;1  
143;172.16.9.101;1428;nrpe_check_load;;;;;;2;2;1  
143;172.16.9.101;1426;nrpe_check_mem;;;;;;2;2;1  
143;172.16.9.101;1427;nrpe_check_net;;;;;;2;2;1  
143;172.16.9.101;1429;nrpe_check_open_file;;;;;;2;2;1  
143;172.16.9.101;1431;nrpe_check_procs;;;;;;2;2;1  
143;172.16.9.101;1432;nrpe_check_socket;;;;;;2;2;1  
143;172.16.9.101;1433;nrpe_check_uptime;;;;;;2;2;1  
143;172.16.9.101;1423;ping;;;;;;2;2;1  

1是Host ID,2是主机名host name,3是服务id,4是服务描述,......,倒数第3是Active check enable,倒数第2是Passive check enable,倒数第1是服务是否激活。

我们记下来hostname,是1721.6.9.101.

添加:

centreon -uadmin -ppassword -o SERVICE -a add -v "172.16.9.102;nrpe_check_http;nrpe_check_http"  

3个参数,1是主机名hostname,2是服务描述,3是服务的模板service template

ok, 这样就添加好了。

删除的命令如下:

centreon -uadmin -ppassword -o SERVICE -a del -v "172.16.8.1;nrpe_check_bgp2"  

最后到Centreon里,重启nagios服务,就好了。


syslog详解

$
0
0

首先是:

[facility].[priority]

facility表示来源:

auth      # 认证相关的  
authpriv  # 权限,授权相关的  
cron      # 任务计划相关的  
daemon    # 守护进程相关的  
kern      # 内核相关的  
lpr       # 打印相关的  
mail      # 邮件相关的  
mark      # 标记相关的  
news      # 新闻相关的  
security  # 安全相关的,与auth 类似  
syslog    # syslog自己的  
user      # 用户相关的  
uucp      # unix to unix cp 相关的  
local0 到 local7 # 用户自定义使用  
*         # *表示所有的facility

一定要注意上面的,local0 到 local7 # 用户自定义使用

priority表示日志级别 (log level),一般有以下几种级别(从低到高):

debug           # 程序或系统的调试信息  
info            # 一般信息,  
notice          # 不影响正常功能,需要注意的消息  
warning/warn    # 可能影响系统功能,需要提醒用户的重要事件  
err/error       # 错误信息  
crit            # 比较严重的  
alert           # 必须马上处理的  
emerg/oanic     # 会导致系统不可用的  
*               # 表示所有的日志级别
none            # 跟* 相反,表示啥也没有  

如何禁掉Rsyslog的dns解析

$
0
0

网管检查流量图的时候发现,udp的流量很多

看了看日志:

Jun 28 00:39:28 172.16.0.1 %ASA-6-305011: Built dynamic UDP translation from inside:172.16.36.2/2160 to outside:124.243.230.6/2160  
Jun 28 00:39:28 172.16.0.1 %ASA-6-302015: Built outbound UDP connection 1369422617 for outside:223.5.5.5/53 (223.5.5.5/53) to inside:172.1...  

发现一大堆是查询dns 53的

杀了无关进程,继续,还有是那么多的udp 53 dns查询

于是明白,是rsyslog记录日志的时候反查ip的域名导致的,由于是内网ip查不到,所以不停的往公网dns发查询,导致udp流量激增。

知道原因就知道如何解决了

Centos下,rsyslog增加-x -Q禁止解析的参数:

vi /etc/sysconfig/rsyslog  
# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-c 5 -x -Q"  

Ubuntu下,方法一样,文件不一样

vi /etc/defaults/rsyslog  
RSYSLOGD_OPTIONS="-x -Q"  

然后重启就可以了。

如果禁止libvirtd自带的dnsmasq启动

$
0
0

自己建了个dnsmasq,和libvirtd自带的冲突了,需要禁掉libvirtd的。

方法如下:

virsh net-list

Name                 State      Autostart     Persistent  
--------------------------------------------------
default              active     yes           yes

virsh net-autostart --disable default  
virsh net-destroy default

搞定.

ssh证书登录之ecdsa

$
0
0

同事给了个公钥证书文件pub,让做ssh的证书登录

pub内容如下:

ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOoPPzVZkUUTPEEFueJzAxxxxxxxxEjiaskInSoMzJjEuo0zMZHVK8UqQPlFQcXPnW2+GgYigL2Q=  

傻眼了一下,一般证书的公钥都是如下的格式:

ssh-rsa AAAAB3NzaC1......  

查了一下,这个pub key原来是这么gen出来的:

ssh-keygen -t ecdsa  

剩下就简单了,证书登录方法和rsa的做法一样,放入~/.ssh/authorized_keys即可

ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOoPPzVZkUUTPEEFueJzAxxxxxxxxEjiaskInSoMzJjEuo0zMZHVK8UqQPlFQcXPnW2+GgYigL2Q= root@localhost  

就可以凭密码登录了。

远程最好配一下登录所使用的key,跟rsa gen出的id_pub.key区分开来

vi ~/.ssh/config  
Host g git.coding.net  
    HostName git.coding.net
    IdentityFile ~/.ssh/coding.key
    User root

kvm动态调整虚机内存

$
0
0

nagios报警,有一台实机的内存使用率达到极限了,告警信息如下:

MEMORY CRITICAL : Mem used: 99.61%, Swap used: 95.98%  

上帝啊,128G的内存居然被用光了!!!

登上这台机器,验证一下,发现确实啥也不剩了,没有任何缓存,而且连交换分区都用了

# free -g
             total       used       free     shared    buffers     cached
Mem:           125        125          0          0          0          0  
-/+ buffers/cache:        125          0
Swap:            8          7          0  

看看上面跑了什么,居然跑了12台虚机

virsh list --all  
 Id    Name                           State
----------------------------------------------------
 1     vis-16-13-27                   running
 2     vis-16-13-29                   running
 3     vis-16-13-74                   running
 4     vis-16-13-26                   running
 5     vis-16-13-25                   running
 6     vis-16-13-30                   running
 7     vis-16-13-28                   running
 15    vis-16-13-33                   running
 41    vis-16-13-75                   running
 44    vis-16-13-24                   running
 45    vis-16-13-22                   running
 46    vis-16-13-23                   running

检测一下每个虚机的内存使用情况

virsh dominfo vis-16-13-28  
d:             7  
Name:           vis-16-13-28  
UUID:           083bde71-764a-23ad-a593-e81edc7adde1  
OS Type:        hvm  
State:          running  
CPU(s):         4  
CPU time:       2515172.9s  
Max memory:     7864320 KiB  
Used memory:    7864320 KiB  
Persistent:     yes  
Autostart:      enable  
Managed save:   no  
Security model: none  
Security DOI:   0  

居然也都是全满

于是登录到虚机,用free -g查看

[root@vis-16-13-28 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          7366       7233        132          0        148       3359  
-/+ buffers/cache:       3726       3640
Swap:            0          0          0  

分明是只用了4G,空闲3G

调整一下,给虚机分5G内存

virsh setmem vis-16-13-28 5120m  

再看实体机的内存

free -g  
             total       used       free     shared    buffers     cached
Mem:           125        123          2          0          0          0  
-/+ buffers/cache:        122          3
Swap:            8          7          0  

放出来了3G,警报消除

看虚机的内存

[root@vis-16-13-28 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          4806       4129        676          0         71        723  
-/+ buffers/cache:       3335       1471
Swap:            0          0          0  

也正常。ok,搞定。

CenoOS6下做无线AP

$
0
0

自己的笔记本是装了个CentOS 6的系统,然后上面跑了个Vmware,又装了Win7,然后接两个屏幕,小的是linux跑gnome,大的是Win7屏幕,这样干活的。

路由更是混乱无比,网卡有tun0 / wlan0 / eth0 ,没有弄br0,这是大前提。如果弄br0的话,得改一堆东西。

这样的话wlan0无线网卡不联网就空闲了,于是想把无线网卡做AP共享出来,给手机用,做法真是比较复杂,弄了2天才弄好,网上的教程都是莫名啊,不太适合CentOS。把做法记录一下:

首先不想改动已有的网络,那么桥接这条路就彻底断了,只能在无线网卡上做DHCP+NAT一条路了。

先检查网络:

lspci -k | grep -A 3 -i "network"  
03:00.0 Network controller: Qualcomm Atheros QCA9565 / AR9565 Wireless Network Adapter (rev 01)  
    Subsystem: Lite-On Communications Inc Device 0662
    Kernel driver in use: ath9k
    Kernel modules: ath9k

看到自己的网卡是ath9k,再看看驱动

modinfo ath9k | grep 'depend'  
depends:        mac80211,ath9k_hw,ath9k_common,cfg80211,ath  

mac80211, cfg80211看到这个就放心了,driver就是nl80211

再确认一下,里面有* AP 字样这样就没问题了:

iw list|grep -A8 "Supported interface modes:"  
    Supported interface modes:
         * IBSS
         * managed
         * AP
         * AP/VLAN
         * WDS
         * monitor
         * P2P-client
         * P2P-GO

首先看看自己的无线网卡物理地址,30:10:B3:6A:22:AA记下来

ifconfig -a  
......
wlan0     Link encap:Ethernet  HWaddr 30:10:B3:6A:22:AA  
......

再看看自己的缺省路由网卡,是虚拟网卡tun0,也记下来

route -n  
......
0.0.0.0         10.10.0.9       0.0.0.0         UG    0      0        0 tun0  
......

下载hostapd并安装,如果提示libnl没装,那就补装一下

wget http://mirrors.ustc.edu.cn/epel/6/x86_64/hostapd-2.0-7.el6.x86_64.rpm  
yum -y install hostapd-2.0-7.el6.x86_64.rpm  

禁止掉NetworkManager对无线网卡的管理

vi /etc/NetworkManager/NetworkManager.conf  
......
#在文件最后加两行
[keyfile]
unmanaged-devices=mac:30:10:B3:6A:22:AA  

然后瞬间大家就可以在gnome的桌面网卡里看到无线网卡失联了,这就对了!

编辑/etc/hostapd/hostapd.conf

vi /etc/hostapd/hostapd.conf  
interface=wlan0  
driver=nl80211  
ssid=dontMessWithVincentValentine  
hw_mode=g  
channel=6  
macaddr_acl=0  
auth_algs=1  
ignore_broadcast_ssid=0  
wpa=3  
wpa_passphrase=KeePGuessinG  
wpa_key_mgmt=WPA-PSK  
wpa_pairwise=TKIP  
rsn_pairwise=CCMP  

注意,上面hwmode是无线工作的模式,g、b、a都可以,一般是g,channel是信道,找个没多少人用的信道最好,11、6、3、1都可以。interface就是无线网卡了,wlan0。ssid和wpapassphrase按你的需求来设置即可。

ok,然后运行:

rfkill unblock all  

rfkill是控制无线和蓝牙的开关,我们放行一切,否则hostapd无法启动。

现在,启动hostapt测试一下

hostapd /etc/hostapd/hostapd.conf  

没有意外的话,就应该成功了。但这只是做了一半,首先改改dnsmasq,给无线网卡分配地址

vi /etc/dnsmasq.conf  
interface=wlan0  
bind-interfaces  
listen-address=192.168.0.1  
#no-dhcp-interface= 
dhcp-range=192.168.0.2,192.168.0.224,12h  
dhcp-option=3,192.168.0.1  
dhcp-option=6,223.5.5.5  

注意,我的dnsmasq.conf就只有这么7行,没有别的了。里面很简单,首先dhcp是放到了wlan0上并分配地址,dhcp-option中3表示网关,gateway;6表示dns,这里设置的是阿里的公共dns 223.5.5.5。

剩下的我们就写个脚本来完成吧: 内容其实就是

  • 解除无线block
  • 配置wlan0的ip为192.168.0.1
  • 启动dnsmasq
  • 做iptable的nat 注意里面我是用的tun0,如果你的缺省路由是eth0,改了即可。
vi /usr/local/bin/initSoftAP.sh  
#!/bin/bash

start() {  
rfkill unblock all  
ifconfig wlan0 up 192.168.0.1 netmask 255.255.255.0  
sleep 2

if [ -z "$(ps -e | grep dnsmasq)" ]  
then  
 dnsmasq
fi

#Enable NAT
iptables -F  
iptables -X  
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

#Thanks to lorenzo
#Uncomment the line below if facing problems while sharing PPPoE, see lorenzo's comment for more details
#iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

sysctl -w net.ipv4.ip_forward=1

#start hostapd
hostapd -B /etc/hostapd/hostapd.conf  
}

stop() {  
service iptables stop  
service dnsmasq stop  
pkill hostapd  
/sbin/ip link set down dev wlan0
}

case $1 in  
        start)
                start
        ;;
        stop)
                stop
        ;;
        *)
        echo "Usage: $0 {start|stop}"
        exit 2
esac  

ok, 这么就搞定了。

/usr/local/bin/initSoftAP.sh start就是启动。

/usr/local/bin/initSoftAP.sh stop就停了

打造一个好用的vim

$
0
0

人生就是没玩没了的杯具啊!

用了太多的东西,php/python/shell/rails,结果总是在服务器上/bin/bash,cd来cd去,目录结构复杂的话分分钟要崩溃的说,这里没提java,如果在服务器上用缺省的vi来编辑java代码,死掉的说!!!

没办法,打造一个至少可用的vim吧。

首先就是不能彻底替换掉原有的vi,原因如下:有的时候会用手机登陆服务器,那将情何以堪啊。

所以必须手动编译一个

wget ftp://ftp.vim.org/pub/vim/unix/vim-8.0.tar.bz2  
tar xf vim-8.0.tar.bz2  
cd vim80  
./configure --prefix=/export/servers/vim --with-features=huge --enable-rubyinterp --enable-pythoninterp  --enable-luainterp
make  
make install  

注意,我把新的vim装到了/export/servers/vim,而且装了ruby/python/lua的支持。

第二,装好vundle

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim  

第三,编辑~/.vimrc8文件

cat <EOF> ~/.vimrc8  
set nocompatible              " be iMproved, required  
filetype off                  " required

set rtp+=~/.vim/bundle/Vundle.vim  
call vundle#begin()  
Plugin 'VundleVim/Vundle.vim'

Plugin 'https://github.com/scrooloose/nerdtree'  
Plugin 'https://github.com/jistr/vim-nerdtree-tabs'  
Plugin 'https://github.com/ervandew/supertab'

call vundle#end()            " required  
filetype plugin indent on    " required

map <leader>n <plug>NERDTreeTabsToggle <CR>  
map <C-l> :tabn<CR>  
map <C-n> :tabnew<CR>  
map <C-k> :bp<CR>  
map <C-j> :bn<CR>

let NERDTreeIgnore=['\.pyc', '~$', '\.swo$', '\.swp$', '\.git', '\.hg', '\.svn', '\.bzr', '\.class']  
let g:NERDTreeChDirMode=0  
let g:NERDTreeQuitOnOpen=0  
let g:NERDTreeMouseMode=2  
let g:NERDTreeShowHidden=1  
let g:NERDTreeWinSize=20  
let g:NERDTreeShowLineNumbers=1  
let g:NERDTreeShowBookmarks=1  
let g:NERDTreeKeepTreeInNewTab=1  
let g:NERDTreeDirArrowExpandable = '▸'  
let g:NERDTreeDirArrowCollapsible = '▾'  
let g:nerdtree_tabs_open_on_console_startup=1  
let g:nerdtree_tabs_autofind=1 

autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif 

EOF  

解释一下:

  • map都是快捷键,缺省是\
  • \n 打开树
  • \e 是在编辑文件时,调到左边目录,并定位到文件名
  • ctrl+n 新建一个文件标签
  • ctrl+l 在标签文件间转换
  • ctrl+k 编辑文件时,打开上一个编辑的历史文件
  • ctrl+p 编辑文件时,打开下一个编辑的历史文件
  • autocmd那行:关闭vim时,如果打开的文件除了NERDTree没有其他文件时,它自动关闭,减少多次按:q!。

另外NERDTree还有一些缺省键,在左边的目录窗口键入?,就可以看到

  • o 在已有窗口中打开文件、目录或书签,并跳到该窗口
  • t 在新 Tab 中打开选中文件/书签,并跳到新 Tab
  • i split 横向劈开一个新窗口,打开选中文件,并跳到该窗口
  • s vsplit 竖向劈开一个新窗口,打开选中文件,并跳到该窗口
  • ctrl+w+w 光标自动在左右侧窗口切换
  • A 放大左侧目录窗口
  • m 在左下显示文件操作模式

这就基本能用了,第一次初始化:

/export/servers/vim/bin/vim -u ~/.vimrc8
:PluginInstall

最后别忘记编辑~/.bashrc,增加一个alias,避免跟老的vi冲突

vi ~/.bashrc  
......
alias nvi="/export/servers/vim/bin/vim -u ~/.vimrc8"  

使用方法:

nvi 文件  

React+es6入门

$
0
0

首先,React肯定是跑在服务器端,要求用到es6语法。

一、装nvm

git clone https://github.com/creationix/nvm.git ~/.nvm  
export NVM_DIR="$HOME/.nvm"  
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

二、装npm和node

nvm ls-remote  
nvm install v7.10.1  

三、初始化一个项目,生成的package.json,保留三行主要内容,无关的可以删除掉

mkdir project1  
cd project1  
npm init  
...
  "name": "my-tutorial-react",
  "version": "0.0.1",
  "description": "my tutorial slim and react",
...

四、装各种库,babel是转换es6到es2015用的,浏览器还没有都支持到es6那么先进,所以要编译到es2015来普适浏览器。webpack是打包工具,来完成这些转换工作.

npm i --save react react-dom babel-core babel-loader webpack babel-preset-es2015 babel-preset-react  

五、配置webpack

vi webpack.config.js

var path = require('path');

module.exports = {  
    entry: './app/js/app.jsx',
    output: {
        path: __dirname,
        filename: './static/build.js'
    },
    module: {
        loaders: [
            {
                test: /.jsx?$/,
                loader: 'babel-loader',
                exclude: /(node_modules)/,
                query: {
                   presets: ['es2015', 'react'] 
                }
            }
        ]
    }
};

六、准备个html文件

<!DOCTYPE html>  
<html>  
<head>  
    <meta charset="UTF-8"/>
    <title>TEST</title>
</head>  
<body>

<div id="app"></div>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>  
<script src="./static/build.js" ></script>  
</body>  
</html>  

七、撰写jsx

mkdir app/js  
vi app/js/app.jsx

import React from 'react'  
import ReactDOM from 'react-dom'

class App extends React.Component {  
    constructor(props) {
        super(props);
        this.state = {
             users: []
        }
    }

    componentDidMount() {
        $.ajax({
            url: '/dapan/slim/index.php',
            type: 'GET',
            dataType: 'json',
            cache: 'false',
            success: function (res) {
                this.setState({ users: res });
            }.bind(this),
            error: function (xhr, status, err) {
                console.log(status, err.toString());
            }.bind(this)
        })
    }

    render() {
        return (
            <ul>
            {
                this.state.users.map(result=>{
                    return (
                        <li key={result.user_id}>
                            {result.username}
                        </li>
                    )
                })
            }
            </ul>
        )
    }
}

ReactDOM.render(<App />, document.getElementById('app'))  

注意上面的例子,用到了es6特有的=>箭头函数

八、用webpack打包

./node_modules/webpack/bin/webpack.js

最后在浏览器打开对应的网址即可。

supervisord与ghost博客

$
0
0

之前有一篇文章讲过用supervervisord怎么都无法将环境变量传到supervisord的command中去。

文章地址:http://www.rendoumi.com/supervisordlai-kong-zhi-nodejs/

现在同样的问题反复,我们仔细研究下,不能粗暴的去动supervisord的启动脚本。

[program:ghost]
command=env NODE_ENV="production" /root/.nvm/versions/node/v0.12.12/bin/node /root/www/index.js  
user=root  
autostart=true  
autorestart=true  

最终方案是在command命令行之前加上env NODE_ENV="production"就可以了

古怪的是环境变量无法通过environment来设置,以及directory也无法生效。估计跟root的身份有关。

MySQL的备份优化

$
0
0

公司的MySQL服务器定时在凌晨4:00准时开始备份。

结果是会触发报警,net流量增高,cpu增高,磁盘io增高,这个是属于正常的,如何避免触发警报呢?

有4种方法:

一、优化io和cpu,让备份写磁盘的速度降下来,平稳的写入

nice -n 10 ionice -c2 -n 7 /usr/bin/mysqldump -S /var/lib/mysql/mysql.sock -uroot --single-transaction --quick\  
  --triggers -R --hex-blob --log-error=$db.log --databases $db > $basedir/$backdir/$db.sql

二、加快备份速度,多线程,让报警触发之前就结束备份

COMMIT_COUNT=0  
COMMIT_LIMIT=10  
for DB in `cat ListOfDatabases.txt`  
do  
    mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        COMMIT_COUNT=0
        wait
    fi
done  
if [ ${COMMIT_COUNT} -gt 0 ]  
then  
    wait
fi  

三、用cstream来控制流速
-t = throughput in bytes/sec
1000000是一兆,每秒只允许写一兆

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql  

四、用pv来控制流速
--rate-limit Limit the transfer to a maximum of RATE bytes per second.
单位可以是:1k 1m 1g 1t

mysqldump --single-transaction --quick -u -p | pv --rate-limit 1m > db.sql  

CentOS 6之下Rabbitmq的安装

$
0
0

之前有一篇是从源码安装的,那是没问题的。

这篇是如何从CentOS下用rpm安装

首先去http://www.rabbitmq.com/releases/erlang/

这里是Rabbitmq的官网,里面有现成的erlang

挑个最新的64位的centos 6的包:

erlang-19.0.4-1.el6.x86_64.rpm

安装它:

yum localinstall -y erlang-19.0.4-1.el6.x86_64.rpm  

然后再到:http://www.rabbitmq.com/install-rpm.html

看看最新的rabbitmq的版本: rabbitmq-server-3.6.9-1.el6.noarch.rpm

注意后面有个 (Signature) 的链接

安装:

装签名:
rpm --import http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.9/rabbitmq-server-3.6.9-1.el6.noarch.rpm.asc  
装包:yum install -y http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.9/rabbitmq-server-3.6.9-1.el6.noarch.rpm

生成配置:

查找默认配置位置:

find / -name "rabbitmq.config.example",  

我这边搜索结果是:

/usr/share/doc/rabbitmq-server-3.9.1/rabbitmq.config.example

复制默认配置:

cp /usr/share/doc/rabbitmq-server-3.9.1/rabbitmq.config.example /etc/rabbitmq/  

修改配置文件名:

cd /etc/rabbitmq  
mv rabbitmq.config.example rabbitmq.config  

编辑配置文件,开启用户远程访问:vi rabbitmq.config 在 64 行,改为:{loopback_users, []}

开启 Web 界面管理:

rabbitmq-plugins enable rabbitmq_management  

重启 RabbitMQ 服务:

service rabbitmq-server restart  

开放防火墙端口:

iptables -I INPUT -p tcp -m tcp --dport 15672 -j ACCEPT  
iptables -I INPUT -p tcp -m tcp --dport 5672 -j ACCEPT  
service iptables save  
service iptables restart  

浏览器访问:http://192.168.1.114:15672 默认管理员账号:guest 默认管理员密码:guest

添加新授权用户(如下图所示):

添加 Host(如下图所示):

给添加的 Host 设置权限(如下图所示):

交换机绑定队列(如下图所示):

MySQL的备份优化

$
0
0

公司的MySQL服务器定时在凌晨4:00准时开始备份。

结果是会触发报警,net流量增高,cpu增高,磁盘io增高,这个是属于正常的,如何避免触发警报呢?

有4种方法:

一、优化io和cpu,让备份写磁盘的速度降下来,平稳的写入

nice -n 10 ionice -c2 -n 7 /usr/bin/mysqldump -S /var/lib/mysql/mysql.sock -uroot --single-transaction --quick\  
  --triggers -R --hex-blob --log-error=$db.log --databases $db > $basedir/$backdir/$db.sql

二、加快备份速度,多线程,让报警触发之前就结束备份

COMMIT_COUNT=0  
COMMIT_LIMIT=10  
for DB in `cat ListOfDatabases.txt`  
do  
    mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        COMMIT_COUNT=0
        wait
    fi
done  
if [ ${COMMIT_COUNT} -gt 0 ]  
then  
    wait
fi  

三、用cstream来控制流速
-t = throughput in bytes/sec
1000000是一兆,每秒只允许写一兆

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql  

四、用pv来控制流速
--rate-limit Limit the transfer to a maximum of RATE bytes per second.
单位可以是:1k 1m 1g 1t

mysqldump --single-transaction --quick -u -p | pv --rate-limit 1m > db.sql  

supervisorctl的用法

$
0
0

直接执行 supervisorctl 会进入 shell 界面:

supervisorctl  
> status    # 查看程序状态
> stop usercenter   # 关闭 usercenter 程序
> start usercenter  # 启动 usercenter 程序
> restart usercenter    # 重启 usercenter 程序
> reload    # 读取有更新(增加)的配置文件,不会启动新添加的程序

除了进入 supervisorctl 的 shell 界面,也可以直接在 bash 终端运行:

$ supervisorctl status
$ supervisorctl stop usercenter
$ supervisorctl start usercenter
$ supervisorctl restart usercenter
$ supervisorctl reload

qcow2映像文件的碎片整理

$
0
0

虚机运行久了,碎片漫天飞,导致整个qcow2文件变大,删除了虚机内的文件,qcow2不会随着变小,浪费了不少空间,如何做一下碎片整理呢?

很简单,首先停了虚机

mv myqcow2file.qcow2 myqcow2file.qcow2.bak  
qemu-img convert -O qcow2 myqcow2file.qcow2.bak myqcow2file.qcow2  

这么转换一下即可。


如何批量查询Dell服务器的保修期

$
0
0

公司有100多台Dell的服务器,保修期参差不齐,什么日子都有。

麻烦来了,怎么查询一下服务器的保修期呢?

首先是批量发service tag号给dell官方问问,结果是给了一个网址,让自己查!!!

http://www.dell.com/support/home/cn/zh/cnbsd1?c=cn&l=zh&~ck=mn

这个网址适合单台查,没有批量的入口,更糟糕的是,必须输入验证码。

没办法,先去注册个dell的账号,然后登陆。

打开chrome,登陆dell账号后,按F12打开调试,然后打开下面的网址:

http://www.dell.com/support/home/cn/zh/cnbsd1/product-support/servicetag/FTQJY01/warranty

点到network,然后看左侧的下载资源

在wrapper.js下面,有个非常长的资源,点击之

点到右边的Header,往下拉就看到Header里面的Cookie了,拷贝下来。

首先编辑一个servicecode.txt文件,把所有机器的Service Tag号逐行粘贴进去。

然后编辑个python文件,注意把保存的Cookie内容替换到文件中'Cookie': 'XXXX'的XXXX部分。

然后运行即可,结果保存在result.txt中。

注意,这个程序比较脆弱,cookie过期,或者网络状况不好,都会出现read socket timout的现象。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2017-2-15
# @Author  : 独自等待 (xliang@vip.qq.com)
# @Link    : https://www.waitalone.cn/
# @Version : v2.0

try:  
    from lxml import html
except ImportError:  
    raise SystemExit("未找到lxml模块,请使用pip安装后运行!")

import urllib2

headers = {  
    'Upgrade-Insecure-Requests': '1',
    'Cache-Control': 'max-age=0',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
    'Cookie': 'XXXX'
}


def ServiceCode(sc):  
    "Dell保修详情自动查询函数"
    sc_url = 'http://www.dell.com/support/home/cn/zh/cnbsd1/product-support/servicetag/%s/warranty' % sc
    towrite = u'您的 %s 的保修详情:\n' % sc
    result_file = open('results.txt', 'ab+')
    try:
        req = urllib2.Request(sc_url, headers=headers)
        res = urllib2.urlopen(req, timeout=30).read().decode('utf-8')
    except Exception as e:
        raise e
    else:
        ll = html.fromstring(res)
        tags = ll.xpath('//span[@class="not-bold"]/text()')
        stoptime = ll.xpath('//table[2]/tbody/tr/td[3]/text()')[0]
        stag = tags[0]
        sdeliver = tags[1]
        print u'\n服务标签:%s 发货日期:%s 结束日期:%-10s\n' % (stag, sdeliver, stoptime)
        towrite += u'\n服务标签:%s 发货日期:%s 结束日期:%-10s\n' % (stag, sdeliver, stoptime)
    result_file.write(towrite.encode('utf-8') + '\n')
    result_file.close()


def ReadCode(sfile):  
    "读取服务代码函数"
    with open(sfile) as sfiles:
        lines = sfiles.readlines()
        for line in lines:
            ServiceCode(line.strip())


if __name__ == '__main__':  
    scfile = 'servicecode.txt'  # 指定servicecode文件名称
    ReadCode(scfile)

kvm直接拷贝qcow2虚机文件到另一个虚机启动的问题

$
0
0

场景是这样的:

实体机是kvm,上面跑了A和B两台虚机。

A 机 IP 是 192.168.85.40,然后胡乱鼓捣,里面乱作一团,然后想恢复。

B 机 IP 是 192.168.85.47,全新安装。

想直接把 B 机的qcow2文件翻版覆盖A机,然后启动改个 ip 即可。

结果是不行,用 virsh console A 上去查看,发现 eth0 没了,多了一个 eth1 。

于是明白,网卡冲突了,解决方法如下:

vi /etc/udev/rules.d/70-persistent-net.rules  
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x1af4:0x1000 (virtio-pci)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="f0:00:c0:a8:55:2f", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x1af4:0x1000 (virtio-pci)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="f0:00:c0:a8:55:28", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"  

看到了吧,eth1 的地址是 f0:00:c0:a8:55:28 ,把这行删掉,把上面 eth0 的地址改成 f0:00:c0:a8:55:28即可。

顺手改了ifcfg-eth0和network,重启一切搞定

kvm的snapshot的管理

$
0
0

不行啊,需要不停的安装测试软件。

不停的反复回到初始的状态,没办法用快照把。

首先需要 shutdown kvm 虚机

virsh destory vis-168-85-40  

先查查都有什么命令:

virsh --help|grep snapshot  
 Snapshot (help keyword 'snapshot')
    snapshot-create                Create a snapshot from XML
    snapshot-create-as             Create a snapshot from a set of args
    snapshot-current               Get or set the current snapshot
    snapshot-delete                Delete a domain snapshot
    snapshot-dumpxml               Dump XML for a domain snapshot
    snapshot-edit                  edit XML for a snapshot
    snapshot-info                  snapshot information
    snapshot-list                  List snapshots for a domain
    snapshot-parent                Get the name of the parent of a snapshot
    snapshot-revert                Revert a domain to a snapshot

如果想知道单独命令的用法:

virsh snapshot-create-as --help  

新建立个快照

virsh snapshot-create-as --domain vis-168-86-40 --name init  

看看虚机都有什么快照

virsh snapshot-list --domain vis-168-86-40  

快照多了如何删除:

virsh snapshot-delete --domain vis-168-86-40 init  

回到快照的状态:

virsh snapshot-revert --domain vis-168-85-40 --snapshotname init --running  

Debian系嵌入式Linux内核编译

$
0
0

不谈过程,谈结果。Nanopi-neo的内核编译。

现在的内核和设备树已经分离了,所以可以某架构的通用一个核,而设备树不一样,单独编译。 比如Nanopi-neo和Orangepi-zero就可以通用一个核,尤其是嵌入式设备,通用核的机率更大。

有好几种内核文件:

  • vmlinux 编译出来的最原始的内核文件,未压缩。
  • zImage 是vmlinux经过gzip压缩后的文件。
  • bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。
  • uImage U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。
  • vmlinuz 是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。
  • initrd 是“initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。

一般情况下make有好几个参数

单独编译zImage内核、模块以及设备树,zImage是压缩过的内核,dtbs是设备树(device-tree):

make zImage dtbs modules -j8  
make INSTALL_MOD_PATH=/tmp/nanopi-modules modules_install  

这种情况下,把zImage和dtb放到/boot区 把模块放到/lib/modules/下,就可以准备下一步了。

https://github.com/armbian/build/tree/master/config/fex找到所属的fex,生成script.bin

比如nanopi_neo

fex2bin nanopi_neo.fex script.bin  

从zImage生成uImage

mkimage -A arm -O linux -T kernel -C none -a 0x40008000 -e 0x40008000 -n linux-4.10.4-image -d zImage uImage  

从zImage生成uImage很麻烦吧,其实可以在make核心的时候一句解决

make LOADADDR=0x40008000 uImage  

然后再造个uInitrd的ramdisk

cd /  
mkimage -A arm -O linux -T ramdisk -C none -a 0x48000000 -e 0x48000000 -n linux-4.10.4-initrd -d initrd.img uInitrd  

弄好u-boot的boot.cmd,mainline内核基本都是这样

cat boot.cmd  
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10  
load mmc 0:1 0x43000000 script.bin || load mmc 0:1 0x43000000 boot/script.bin  
load mmc 0:1 0x42000000 uImage || load mmc 0:1 0x42000000 boot/uImage  
bootm 0x42000000 - 0x43000000  

由booot.cmd生成boot.csr

mkimage -A arm -O linux -T script -C none -n uboot -d boot.cmd boot.scr  

把uImage、boot.csr、uInitrd、dtb都放到/boot分区下,就算弄好了

给老旧的CentOS系统设置yum

$
0
0

同事N年前买了个linode的主机,一直用,系统是CentOS 5.6 x86_64的。

现在想在上面装个软件,结果yum失效了,重装系统不可能,只能找个旧的yum源设置一下了。

源: http://vault.centos.org ,找到子目录

cat /etc/yum.repos.d/base.repo  
[base]
name=base  
baseurl=http://vault.centos.org/5.6/os/x86_64/  
gpgcheck=0  
enabled=1  

最后清掉一下缓存就可以了

yum clean all  
Viewing all 290 articles
Browse latest View live