my blog my blog

Tag: Linux
Linux下使用tar进行差异备份

说实话,奶牛这些年来一直都是手动完整备份文件,而且每次都是完整备份,其实很早之前就知道有增量备份这种东西了,可能是不太习惯吧,还是一直都是完整备份。今天就记录下tar进行差异备份和增量备份的一些心得。

首先说怎么做一个完整的备份

tar -czvf filename.tgz filename

这是普通的打包命令,没什么特别,下面我们使用一个-g参数

tar -g snapshot -czvf filename.tgz filename

执行完成后会生成一个snapshot文件,里面记录着备份信息。

这里插个分割线,说说增量备份和差异备份。

如果我们想进行增量备份,那么这个snapshot就需要一直更新,每次增量过后这个snapshot文件都会发生改变,如果我们需要还原,则需要把所有增量备份和完整备份一起还原。

如果我们想进行差异备份,那么我们需要把这个snapshot保护起来,然后每次都做针对完整备份的增量备份,那么恢复的时候我们只需要把最后一次增量备份和完整备份一起还原。

优缺点:增量备份占用的空间要小于差异备份,但是恢复起来非常麻烦,特别是比如一个月内只做一次完整备份,其它每天只做增量备份,那么恢复的时候要恢复很多个增量备份文件。

差异备份占用空间要比增量备份大一些,但是如果备份文件修改较少,则差异备份的文件也不会很大,恢复的时候只需要恢复完整备份和差异备份即可,工作量会小很多。

好了,回归正题,我们这里就讲差异备份,增量备份网上一堆参考,不多介绍了。

cp snapshot snapshot.backup
tar -g snapshot -czvf filename-1.tgz filename
mv snapshot snapshot-1.backup
cp snapshot.backup snapshot

这样一来,我们就在snapshot-1.backup中记录了这次差异备份的变化信息了,然后差异备份文件是filename-1.tgz

如果我们要备份的文件或目录里面存在软链接,而我们又需要备份其中软链接对应的文件或目录的源文件,我们则需要增加一个-h属性

tar -czvhf filename.tgz filename

查看tgz文件内容

tar -tvf filename.tgz

好了,奶牛今天的记录至此。

Linux下挂载VisualBox的共享目录

奶牛最近还是切换到了虚拟机下的linux,因为windows还得玩儿游戏,ps:游戏毁一生,吃鸡都是挂。

好了,方法:

1.安装Vbox的增强工具,方法不讲了

2.mount

mount -t vboxsf shared_dir_name /location_name
使用ab在linux下进行网站压力测试

ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。原理就是模拟并发请求访问指定次数,如果并发很大就相当于cc攻击了。

安装:我们当然不要安装一整套apache来用这么一个工具了,只安装相应套件就可以了。

sudo apt-get install apache2-utils  
sudo yum -y install httpd-tools

在ubuntu里面用apache2-utils,在centos里面用httpd-tools.

测试:

ab -n 1000 -c 10 https://www.xxx.com/

其中-n是指定总的访问次数,总的访问次数,总的访问次数,重要的事儿说三遍。

-c是指定并发数。

https://www.xxx.com/后面的/不能省略,或者需要指定完整的页面路径

上面命令的解释就是用10个并发访问https://www.xxx.com/,每个并发访问100次,总共访问了1000次。

自己玩儿了下,发现缓存插件真的能有效降低cpu的压力,提高网站性能,如果不用缓存cpu占用率简直不要飞到天上去。

Linux使用Curl并启用cookie功能

奶牛最近发现有的网站为了阻止第7层网络的攻击,选择了使用cookie进行阻止恶意攻击。比如Voxility在防护启用的时候,就会用如下的方式:

<html>
<head><meta http-equiv="refresh" content="1" /><meta http-equiv="cache-control"                                                                                                                                                              content="max-age=0" /><meta http-equiv="cache-control" content="no-cache" /><met                                                                                                                                                             a http-equiv="expires" content="-1" /><meta http-equiv="expires" content="Tue, 0                                                                                                                                                             1 Jan 1980 1:00:00 GMT" /><meta http-equiv="pragma" content="no-cache" /></head>
<script type="text/javascript">
<!--
function getCookie(w){
        cName = "";
        pCOOKIES = new Array();
        pCOOKIES = document.cookie.split('; ');
        for(bb = 0; bb < pCOOKIES.length; bb++){
                NmeVal  = new Array();
                NmeVal  = pCOOKIES[bb].split('=');
                if(NmeVal[0] == w){
                        cName = unescape(NmeVal[1]);
                }
        }
        return cName;
}
function printCookies(w){
        cStr = "";
        pCOOKIES = new Array();
        pCOOKIES = document.cookie.split('; ');
        for(bb = 0; bb < pCOOKIES.length; bb++){
                NmeVal  = new Array();
                NmeVal  = pCOOKIES[bb].split('=');
                if(NmeVal[0]){
                        cStr += NmeVal[0] + '=' + unescape(NmeVal[1]) + '; ';
                }
        }
        return cStr;
}
function setCookie(name, value, expires, path, domain, secure){
        var vlad = name + "=" + escape(value);
        if(expires){
                expires = setExpiration(expires);
                vlad += ";expires=" + expires;
        }
        if(path){
                vlad += ";path=" + path;
        }
        if(domain){
                vlad += ";domain=" + domain;
        }
        if(secure){
                vlad += ';secure';
        }
document.cookie = vlad;
}
function setExpiration(cookieLife){
    var today = new Date();
    var expr = new Date(today.getTime() + cookieLife * 24 * 60 * 60 * 1000);
    return  expr.toGMTString();
}
function delete_cookie(name){
  document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}
// -->
</script>
<script type="text/javascript">
<!--
delete_cookie('hasVisitedSite');
setCookie('hasVisitedSite', 'Yes', '3', '/', '300', '');
delete_cookie('fb624561f4f8b25819e9b3c4fad70f85');
setCookie('fb624561f4f8b25819e9b3c4fad70f85', 'Yes', '3', '/', '300', '');
-->
</script><body></body></html>

如果我们直接curl加网址的话得到的就是这种情况。如果我们想访问真实内容需要启用cookie。

curl -c cookie.txt www.nenew.net
curl -b cookie.txt www.nenew.net

当第一次访问的时候,奶牛保存cookie信息在cookie.txt中,第二次访问包含cookie.txt中的信息,就可以访问到真实页面了。

Ubuntu安装配置Linux性能实时监测工具NetData

最近测试了ntopng,虽然普通版本的也还凑合,但是还是企业版的实时展示奶牛更喜欢,可是普通版本就没有实时功能了,所以就又找了一下,发现在github上这个netdata的star最多,目前已经达到了28.9K,感兴趣的朋友可以去https://github.com/topics/monitor看看。

言归正传,奶牛来说说netdata的安装过程。

安装:

curl -Ss 'https://raw.githubusercontent.com/firehol/netdata-demo-site/master/install-required-packages.sh' >/tmp/kickstart.sh && bash /tmp/kickstart.sh -i netdata-all

安装netdata编译所需组件,这里奶牛以全监控安装方式安装

git clone https://github.com/firehol/netdata.git --depth=1
cd netdata
./netdata-installer.sh --dont-start-it

这里根据提示进行安装即可,安装完成后我们可以通过service netdata start 来启动。

配置:

这里有个有趣的现象,在/etc/netdata/netdata.conf文件中并没有配置选项,而是需要从web下载配置文件,当然这个web是localhost了。

#  wget -O /etc/netdata/netdata.conf http://localhost:19999/netdata.conf
#  curl -o /etc/netdata/netdata.conf http://localhost:19999/netdata.conf

所以呢,就按照这个说明把netdata.conf文件下载下来就可以配置了。

在此,奶牛更希望我们以反向代理的方式进行访问netdata,所以奶牛并不推荐直接将netdata端口暴露出来,所以我们将netdata.conf文件中的

[web]
	bind to = 127.0.0.1

修改为绑定到本地地址。最后我们可以通过Nginx反向代理来进行访问,或者如果你不介意,不这样配置也无所谓。

VPS磁盘空间大小调整小记

MySQL的日志文件又一次把奶牛博客的磁盘撑爆了,今天一下班发现网站挂了,然后ping还可以通,就进ssh看看究竟,然后很无语,mysql无法关闭也无法启动,df -h看了一下,发现/目录已经爆满。之前已经遇到过一次这种情形了,所以直接去看MySQL的日志文件,果然,几个G在那里堆着,删删删,反正也懒得去分析日志找原因了。删了之后发现/目录还是占用了近80%的空间,呃,这就有点儿纠结了吧,然后仔细看了一下df -h,我去,VPS还自带分区的,两块盘,一块30G的盘竟然挂载到了/mnt目录下,好吧,还有这种玩儿法。然后就想把这个vdb的硬盘给挂载到/目录下,但是回头一想,LVM貌似也不合适,没法直接加的,因为/是vda1这个主分区在挂载,所以,好吧,直接把vdb分给/usr目录吧,反正一般的东西也就扔这里面的,比如那个可恶的MySQL日志文件。

cp -Rf -p /usr /mnt

其中的-p参数是为了保证文件的uid和gid都保持不变,当然,这里是使用root帐号来操作的。

然后

umount /dev/vdb
mount /dev/vdb /usr
df -h

查看下确实挂载没有问题了,然后程序也都正常运行,之后再修改fstab

vim /etc/fstab

将原先挂载在/mnt目录下的vdb修改为挂载在/usr目录下。

最后再说下MySQL的日志,配置文件在/etc/my.cnf下,可以进行自动过期处理等操作,也可以直接注释掉不记录日志。

军哥LNMP下typecho的rewrite配置隐藏index.php

最近新建了站点优推网并且开始使用typecho,安装配置过程中发现自带的rewrite无法隐藏index.php,解决方案是修改

/usr/local/nginx/conf/vhost/www.affu.net.conf

配置文件,将include enable-php.conf;修改为include enable-php-pathinfo.conf;

然后再在typecho的设置中启用固定链接即可正常显示。

最近打算将博客转入Sharktech的服务器,并且将使用7年的wordpress更换为typecho,wordpress不可说不好,但是现在感觉太臃肿了,对于一个写博客的感觉还是不太需要这么臃肿,轻便最好,再续…

Ubuntu下安装Intel 9260AC无线网卡教程

奶牛很久没有写ubuntu的文章了,虽然自己的服务器依然是使用ubuntu server,但是比较懒,也没有太多折腾,今天记录一下intel最新的9260ac无线网卡在ubuntu下的安装与使用。

Intel的中文支持页面更新还是有些缓慢,所以驱动程序我们可以在英文页面找到。Linux* Support for Intel® Wireless Adapters

官方页面给出的安装介绍如下

To install firmware:

    Copy the files into the distribution-specific firmware directory, /lib/firmware.
    If the directory does not work, consult your distribution documentation.
    If you configure the kernel yourself, make sure firmware loading is enabled.

首先是下载驱动程序:Intel 9260AC驱动

官方提到intel无线网卡驱动是依赖iwlwifi来加载驱动的,但是安装官方的方法将驱动文件解压后拷贝至/lib/firmware文件夹中重启是无法实现加载的,至少奶牛这里不行,也许你们把内核更新到最新大概可能会实现自动识别吧,但是奶牛把自己折腾的过程分享下。

DeviceKernelsFirmware
Intel® Wireless-AC 92604.14+iwlwifi-9260-th-b0-jf-b0-34.618819.0.tgz

官方的说明是内核要在4.14+,现在内核已经到了4.15RC版本了,4.14也更新到了4.14.10,奶牛第一次是安装的4.14版本内核,结果发现设备可以识别了,但是无法使用。然后找到iwlwifi的支持页面

页面中又说到iwlwifi-fixes with fixes for the current kernel release cycle,所以我们又去看iwlwifi-fixes,在2017-12-05这天更新了内容iwlwifi: add new cards for 9260 and 22000 series

好吧,看样子内核需要在12.05之后,奶牛这里安装的是4.14.10,看日期4.14.04也是12.05日,所以就索性当4.14.04之后的内核版本才支持吧。更新内核也很简单

mkdir kernel
cd kernel
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.10/linux-headers-4.14.10-041410_4.14.10-041410.201712291810_all.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.10/linux-headers-4.14.10-041410-generic_4.14.10-041410.201712291810_amd64.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.10/linux-image-4.14.10-041410-generic_4.14.10-041410.201712291810_amd64.deb
dpkg -i *.deb

奶牛这里是安装的64位ubuntu操作系统,32位操作系统的同志自己去http://kernel.ubuntu.com/~kernel-ppa/mainline下面找对应的内核版本就好了。

更新内核后重启系统,安装wicd进行无线网卡管理,不要问奶牛为啥要装wicd,因为奶牛发现系统自带的那个管理器还是识别不了。。。好吧,就此折腾完毕。

 

 

关于iptables过滤关键词网站的原理和方法解读

服务器上有时候难免做些限制,比如说一个游戏加速器可能会禁止用来网站访问,但是问题来了,我们并不能简单的禁止一个80或者443来达到目的,因为有些游戏会从网站上去获取一些信息,比如现在最火的绝地求生大逃杀,吃个鸡却要先从一个网页进行登录,所以禁止80/443端口的方案我们可以直接否掉,奶牛的方法是用iptables进行关键词和网站过滤。

iptables过滤关键词网站的原理解读

INPUT,OUTPUT,FORWARD选哪个?

使用iptables过滤关键词和网站,我们需要对进出服务器的流量都进行过滤,当然也有人建议在传输层过滤,那奶牛就来谈谈自己的理解。首先INPUT,OUTPUT,FORWARD三个分别对应进、出、传输。如果我们在FORWARD过滤,应该可以达到预期效果,但是如果我们的服务器是用作转发的呢?比如一个请求发送过来,我们允许INPUT进入,然后我们的转发服务器会先将请求转发出去,再接收转发内容,最后在转发回程的过程中过滤拦截,这样子,服务器的流量带宽资源就会被浪费,也许你会说在接收到请求之后关键词和网站就已经过滤了,其实不然,很多关键词是包含在请求获得的内容中的,所以不可能在转发之前就过滤掉,我们需要的结果是在转发之前过滤掉。那么我们就用INPUT进行限制?通过实测,发现单单用INPUT也不能过滤干净,奶牛的理解是INPUT不会拒绝请求的结果,所以我们还需要和OUTPUT配合使用。

DROP,REJECT选哪个?

奶牛选择的是DROP。我们说说DROP和REJECT的区别,当我们使用REJECT的时候,如果拒绝请求,在iptables中输入

iptables -L -nv

可以看到拒绝的请求会reject-withicmp-port-unreachable,也就是会通过一个icmp包来告诉目标请求被拒绝了,这个资源也是属于浪费的,如果我们直接用DROP丢弃,则不会有这个回包。

iptables过滤关键词网站的方法

首先备份好我们的iptables规则,避免操作失误。备份和还原的命令如下:

iptables-save > iptables_origin_rules
iptables-restore > iptables_origin_rules

然后我们的规则这样写

iptables -A INPUT -m string --string "xxx.com" --algo bm --to 65535 -j DROP
iptables -A OUTPUT -m string --string "xxx.com" --algo bm --to 65535 -j DROP

其中的xxx.com就是关键词,可以写网站域名,也可以写关键词,但是关键词一定要想好,否则可能会导致很多东西都无法访问的。如果规则写错了,可以通过命令删除规则:

iptables -D INPUT -m string --string "xxx.com" --algo bm --to 65535 -j DROP
iptables -D OUTPUT -m string --string "xxx.com" --algo bm --to 65535 -j DROP

过滤需谨慎,特别是一些国cdn、公共库、ssl、dns等一定要谨慎处理,否则可能会导致很多服务无法访问严重后果。

黑群辉Docker折腾记

 

同事年前入了一个群晖NAS,前两天看H大大也入了群晖,好吧,奶牛就黑一个吧,淘宝买了一个黑群晖机,2*4T西数红盘,开始折腾。

黑群晖是要有引导U盘来带着启动的,机器自带,无非就是改改vid pid什么的小操作,不讨论,装系统也不讨论。奶牛想讨论下Docker,对Docker!

系统软件版本:DSM 5.2-5592

NAS> docker version
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): a263667
OS/Arch (client): linux/amd64
Server version: 1.6.2
Server API version: 1.18
Go version (server): go1.4.2
Git commit (server): a263667
OS/Arch (server): linux/amd64
NAS> cat /proc/version
Linux version 3.10.35 ([email protected]) (gcc version 4.7.3 20130102 (prerelease) (crosstool-NG 1.18.0) ) #1 SMP Mon Aug 3 15:44:49 UTC 2015

群晖就是个linux系统,所以回归老本行。奶牛也是这周才接触Docker的,这个虚拟机很给力,奶牛欣喜之极,因为比起VM啊KVM之类的虚拟机,这个简直就是资源压缩机,因为共用系统的内核,所以,一个ubuntu的bash才耗费几M的系统资源,而且只要有个镜像,自己创建一个容器,可以算是无所不能了吧。对于网上有的那些迅雷远程下载xware啊,迅雷快鸟加速啊,还有那些bt下载奶牛不想讨论,没什么意思,因为有一个虚拟机系统了,你可以完成linux下的所有操作了。

先说说这个版本Docker的一个bug,就是在pull官方源的时候有的源没法在网页版中pull,提示命令执行错误。奶牛在6.X版本中测试发现没有此问题。不过,这都是小事儿不是?

开启NAS的ssh,直接命令行上去,默认的用户名和密码就是你设置的用户名和密码,而我们需要的是root,root密码其实也是你用户设置的那个密码。。。。汗。用root登录,可以直接用linux命令来操作docker。奶牛现在跑着kcptun来不间断代理ss,效果不错。再实现什么功能呢?还没想好,现在是只做了ddns到自有域名然后设置好了kcptun的客户端。这个Docker真的是太强大了,强烈推荐。