博客也是好久没更新了,说说最近的折腾吧。

原有服务器是E3-1245 v2 + P8B-C/SAS/2L,16GB 纯ECC,千兆局域网。由于担心NAS数据安全,没做 RAID 5,板载RAID控制器不支持RAID 6,索性刷了直通,各个单盘独自运行,重要数据通过 powershell + fastcopy 定期备份。机械硬盘速度平均也就100+MB,千兆局域网可正好够用。期间也使用过两块SSD给分别给机械硬盘做读,写缓存。用以提升4K读写性能。

但也只是够用,也限制了进一步的折腾空间,想要提升NAS的数据读写速度,就得考虑两个问题:1,硬盘速度 2,网速

  1. 要提升硬盘速度,固态硬盘是别想了,太贵,而且容量也不大,还有磁盘快满时的性能严重下降、擦写加剧的问题,还是考虑机械硬盘,而机械硬盘速度提升也还是组RAID模式,(ZFS及各种文件系统比较小众,出问题也不好解决)组RAID 5数据又不放心,组RAID 6还得换硬件。
  2. 要提升网速,也有两个思路,(1)千兆网卡链路聚合(2)上万兆。链路聚合的话还需要交换机支持,而且特定情况也不一定有效,而且NAS和PC分别还要再加网卡,两个千兆口汇聚也还才最高250MB,这时就已经是4块网卡了,继续加网卡3口汇聚,成效不大,而且网卡越多,坏的几率也更高。

既然硬盘速度提升要换硬件,网速提升也要换硬件,干脆直接一步到位吧。于是。。。

以下是新入手的装备:

  1. ASUS XG-C100C 万兆网卡
  2. NETGEAR Nighthawk SX10(GS810EMX) 双万兆交换机,
  3. 二手Dell R720xd + E5 2690v2 + 16GB 1866 REG ECC *4 + H710P + 原装万兆网卡 +后置硬盘模块 + SD卡模块
  4. 当然还有两块SD卡

上万兆对到底用光口还是电口也纠结了好久。光口的话有好多便宜的垃圾可捡,无论是网卡、光模块还是交换机,但是光模块分厂家和类别,非常麻烦,而且二手交换机噪音功耗也比较大。电口的话,几乎没有二手交换机可捡,全新的又好贵。

决定用电口时,最初交换机的选择是华硕的XG-U2008,但是阉割了端口聚合、组播控制功能,售价2000,这就有点不厚道了,我可能不用,但你不能没有,因为谁知道我以后用不用得到呢?最终在亚马逊上海淘了现在的 SX10 ,有上述的功能,而且算上海关税也才1600+,算是厚道了。到手后全金属外壳,很厚重。一直以为是塑料的,用了几天才知道为什么是全金属外壳了,发热好高,摸上去都烫手。万兆网卡也是如此,拆下散热片,重新涂了硅脂,换了新的导热贴。不过就有有点纳闷为什么散热片和芯片中间还有个导热贴,不是直接接触呢?

前前后后折腾了20几天,也碰到了很多烦心事:

  1. 后置硬盘模块到手有问题不能识别
  2. 服务器到手不能识别内存,而且风扇直接跑到一万转,真的是飞机起飞,妥妥的有问题
  3. 发回来的服务器CPU散热器,每个都有3个坑洼,联系客服发回来的还是有坑洼,最后直接让我从别的地方买吧。也是够了。

换了服务器风扇转速明显正常了,开机也就5、6千的转速,虽说噪音还是大,那些说开机风扇起飞的,你们是没碰到100%风扇转速的情况

Anyway,不管怎么样,东西到齐了,也算是搞得差不多了,除了预期的4块4TB机械硬盘还没入手。

一共12个3.5英寸盘位 + 2个2.5英寸盘位。

新服务器 ESXi 装在了SD卡模块上,两块SD卡做了镜像,这样的好处是更加方便了,(1、节省硬盘位;2、vmfs升级时不能升级ESXI系统本身所在的硬盘)。

然后用两块 128GB 的 SSD 组了 RAID 1,作为ESXi的数据盘。 直写,关闭预读。

剩下几块容量不等的硬盘,不好组RAID,暂时还是单盘使用,因为还是单盘,索性直接打开了磁盘缓存。回写,自适应预读

然后用一块 512GB 的 SSD 做了 CachaCade,用于加速机械硬盘,H710P 最大只支持 512GB 的 CacheCade。

测试数据盘的顺序读写可到 600MB ,这还是单盘没组 RAID 的情况下,当然随机读写就低了,也是没办法的事。

机器到手后一步一步将各个固件升到最新,没想到电源都有固件。

感觉默认的自动风扇转速还是高,于是网上找了下 ipmi 控制风扇转速的脚本,都是放到 cron 里执行的, 因为 cron 最小执行粒度是一分钟,对于突然升高的负载 温度急剧升高的情况根本没有办法,要么直接过热关机,要么就有损寿命。于是就改了下,作为守护进程启动,轮询,自动注册成 systemd 的服务,自动开机启动,当然还保留了 cron 执行作为备用, cron 执行时会检测服务进程是否运行,运行则退出,没有运行的话再进行温度控制。

另外也写了脚本自动上传ssl秘钥和证书到idrac(因为是 let'sencrypt 签发),再也不用看到idrac的不安全警告了。

#!/bin/bash

# 守护进程
# 自动添加到 systemd 服务,自动启动,自动开机启动
# 自动添加 cron 任务作为备用,两者不冲突,当服务启动失败时 cron 任务生效
# 仅支持使用 systemd 的linux发行版


DATE=$(date "+%Y-%m-%d %H:%M.%S")
echo "$DATE"

PID_FILE="/run/dell_ipmi_fan_control.pid"
IDRACIP="IP地址"
IDRACUSER="用户名"
IDRACPASSWORD="密码"
TEMPTHRESHOLD="55"


DIR=$(cd "$(dirname "$0")";pwd)
FILENAME=$(echo $0 | awk -F "/" '{print $NF}')

if [ -f /etc/os-release ]; then
    source /etc/os-release
    if [ "$ID" == "centos" ]; then
        grep $FILENAME /var/spool/cron/root
		if [ "$?" != "0" ]; then
			echo "*/1 * * * * /bin/bash $DIR"/"$FILENAME >> /tmp/dell_ipmi_fan_control.log" >> /var/spool/cron/root
		fi
    elif [ "$ID" == "ubuntu" ]; then
		grep $FILENAME /var/spool/cron/crontabs/root
		if [ "$?" != "0" ]; then
			echo "*/1 * * * * /bin/bash $DIR"/"$FILENAME >> /tmp/dell_ipmi_fan_control.log" >> /var/spool/cron/crontabs/root
		fi
    fi
else
    echo "系统版本过低"
    exit
fi

if [ "$ID" == "centos" ]; then
    if [ "$VERSION_ID" -ge "7" ]; then
        HAS_SYSTEMD=true
    fi
elif [ "$ID" == "ubuntu" ]; then
    if [ $(echo "$VERSION_ID >= "16.04"" | bc) -eq 1 ]; then
        HAS_SYSTEMD=true
    fi
fi

echo 
if [ "$HAS_SYSTEMD" == true ]; then
    SERVICE_PATH="/etc/systemd/system/dell_ipmi_fan_control.service"

    if [ ! -f $SERVICE_PATH ]; then
        FIRST_RUN=true
        cat>$SERVICE_PATH<<EOF
[Unit]
Description= dell fan control with ipmi
After=network.target
Wants=network.target

[Service]
Type=simple
PIDFile=/run/dell_ipmi_fan_control.pid
ExecStart=$DIR"/"$FILENAME

[Install]
WantedBy=multi-user.target
EOF

    systemctl daemon-reload
    systemctl start dell_ipmi_fan_control.service
    systemctl enable dell_ipmi_fan_control.service

    fi
fi


if [ "$FIRST_RUN" == true ]; then
    exit
fi

if [ -s $PID_FILE ]; then
    PID=$(cat $PID_FILE)
    echo "服务运行,pid=$PID,退出"
    exit
else
    echo $$ > $PID_FILE
fi

while true; do
    T=$(ipmitool -I lanplus -H $IDRACIP -U $IDRACUSER -P $IDRACPASSWORD sdr type temperature | grep -E "^Temp" | cut -d"|" -f5 | cut -d" " -f2 | grep -v "Disabled")

    if [[ $T =~ ^\d* ]]; then
        echo "$IDRACIP: -- 当前温度为 $T度 --"

        if [[ $T > $TEMPTHRESHOLD ]]; then
            echo "--> 温度高于55度,启用自动风扇控制"
            ipmitool -I lanplus -H $IDRACIP -U $IDRACUSER -P $IDRACPASSWORD raw 0x30 0x30 0x01 0x01
        else
            echo "--> 温度低于50度,启用手动风扇控制"
            ipmitool -I lanplus -H $IDRACIP -U $IDRACUSER -P $IDRACPASSWORD raw 0x30 0x30 0x01 0x00

            if [[ $T > 45 ]]; then
                echo "--> 温度高于45度,设定风扇转速为16%"
                ipmitool -I lanplus -H $IDRACIP -U $IDRACUSER -P $IDRACPASSWORD raw 0x30 0x30 0x02 0xff 0x10
            else
                echo "--> 温度低于40度,设定风扇转速为 10%"
                ipmitool -I lanplus -H $IDRACIP -U $IDRACUSER -P $IDRACPASSWORD raw 0x30 0x30 0x02 0xff 0x0a
            fi  
        fi  
    else
        continue
    fi  
done

像往常一样,偶尔想起看看本站的访问情况,发现点击量高的可怕,并且不断再升高。

查看nginx日志,发现全都是来自不同地址的同一个请求,看来是遭到CC攻击了。最早的攻击来自于2月20日上午10点47分50秒,然后便像洪水一样持续到了现在。

Nginx日志在26日凌晨自动进行了分割,单单对26日的部分日志进行过滤就得到了1万3千多个攻击IP,这还是去重之后的。

令我自己都吃惊的是,遭受到攻击后本站一直正常运行,甚至访问速度都未减慢,这几天照常编辑了几篇文章,都没感觉到异常。看来平时的优化没白做。

在采取了多种不同的措施来缓解了攻击压力之后,CPU从百分之5/6十,下降到了正常水平。

然而攻击还在持续。本人在网上也没什么仇人,甚至都不怎么评论,是谁手里有这么多的肉鸡呢?或者是伪造的TCP数据包?这就无从得知了。

非常抱歉回复晚了

原荒野无灯的脚本修改返回值,脚本如下:


#!/bin/sh

#################################################
# AnripDdns v5.08
# 基于DNSPod用户API实现的动态域名客户端
# 作者: 若海[mail@anrip.com]
# 介绍: http://www.anrip.com/ddnspod
# 时间: 2016-02-24 16:25:00
# Mod: 荒野无灯 http://ihacklog.com  2016-03-16
#################################################

# 使用Token认证(推荐) 请去 https://www.dnspod.cn/console/user/security 获取
arToken="*****,***************"
# 使用邮箱和密码认证
arMail=""
arPass=""

# 获得外网地址
arIpAdress() {
    local inter=`nvram get wan0_ipaddr`
    echo $inter
}

# 查询域名地址
# 参数: 待查询域名
arNslookup() {
    local inter="http://119.29.29.29/d?dn="
    wget --quiet --output-document=- $inter$1
}

# 读取接口数据
# 参数: 接口类型 待提交数据
arApiPost() {
    local agent="AnripDdns/5.07(mail@anrip.com)"
    local inter="https://dnsapi.cn/${1:?'Info.Version'}"
    if [ "x${arToken}" = "x" ]; then # undefine token
        local param="login_email=${arMail}&login_password=${arPass}&format=json&${2}"
    else
        local param="login_token=${arToken}&format=json&${2}"
    fi
    wget --quiet --no-check-certificate --output-document=- --user-agent=$agent --post-data $param $inter
}

# 更新记录信息
# 参数: 主域名 子域名
arDdnsUpdate() {
    local domainID recordID recordRS recordCD
    # 获得域名ID
    domainID=$(arApiPost "Domain.Info" "domain=${1}")
    domainID=$(echo $domainID | sed 's/.\+{"id":"\([0-9]\+\)".\+/\1/')
    # 获得记录ID
    recordID=$(arApiPost "Record.List" "domain_id=${domainID}&sub_domain=${2}")
    recordID=$(echo $recordID | sed 's/.\+\[{"id":"\([0-9]\+\)".\+/\1/')
    # 更新记录IP
    recordRS=$(arApiPost "Record.Ddns" "domain_id=${domainID}&record_id=${recordID}&sub_domain=${2}&record_line=默认")
    recordCD=$(echo $recordRS | sed 's/.\+{"code":"\([0-9]\+\)".\+/\1/')
    # 输出记录IP
    if [ "$recordCD" == "1" ]; then
        echo $recordRS | sed 's/.\+,"value":"\([0-9\.]\+\)".\+/\1/'
        return 1
    fi
    # 输出错误信息
    echo $recordRS | sed 's/.\+,"message":"\([^"]\+\)".\+/\1/'
}

# 动态检查更新
# 参数: 主域名 子域名
arDdnsCheck() {
    local postRS
    local hostIP=$(arIpAdress)
    local lastIP=$(arNslookup "${2}.${1}")
    echo "hostIP: ${hostIP}"
    echo "lastIP: ${lastIP}"
    if [ "$lastIP" != "$hostIP" ]; then
        postRS=$(arDdnsUpdate $1 $2)
        echo "postRS: ${postRS}"
        if [ $? -ne 1 ]; then
            return 1
        fi
    fi
    return 0
}

###################################################
# 检查更新域名

arDdnsCheck "frostfall.cn" ""

if [ $? -eq 1 ]; then
    /sbin/ddns_custom_updated 1
else
    /sbin/ddns_custom_updated 0
fi


1.恢复时 gitlab 版本应与备份时版本一致

2.默认卸载不完全,最好同时删除以下目录


# 同时删除备份目录,注意将备份文件保存至别处,/etc/gitlab/目录最好也备份下

rm -r /opt/gitlab/sv /opt/gitlab/service /opt/gitlab/init /opt/gitlab/etc /opt/gitlab/embedded/ssl/certs /opt/gitlab/embedded/service/gitlab-shell /opt/gitlab/embedded/service/gitlab-rails/public /opt/gitlab/embedded/service/gitlab-rails/config/initializers /opt/gitlab/embedded/cookbooks /var/opt/gitlab /opt/gitlab /etc/gitlab

# 删除 systemd 启动文件,否则安装新版本后执行 gitlab-ctl reconfigure 会卡住

rm /usr/lib/systemd/system/gitlab-runsvdir.service

3. gitlab 恢复后如果进入项目 返回500错误,db_key_base 问题,将之前的 /etc/gitlab/gitlab-secrets.json 文件拿过来替换(最好备份时一同备份),然后执行 gitlab-ctl reconfigure

迅雷是越来越不能用了,卸了好多次又装,这次是终于下决心不再用了,年费超级会员就当白扔了,祝早亡。

作为替代的下载工具,qbittorrent 着实不错,代码开源,一般的做种功能就不说了。有 Web UI,可根据 Client IP 设定白名单免密码访问,觉得原版 Web UI 丑的话,甚至可以替换成自己的 Web UI,支持动态域名,提供 WebAPI,支持导入 TLS 证书,支持RSS订阅,下载完成后可以电子邮件通知,也可执行外部程序(这里我使用windows 局域网通知功能),另外Wiki 也很详细。作为 NAS 上的下载工具非常不错。

qbittorrent 支持导入外部 Tracker 功能,玩BT下载的都知道 Tracker 的重要性,但是 Tracker 地址的维护却一直是个问题,Github 上一直在维护的的 trackerslist 数目终归是太少。

想要提高下载速度,只能自己维护了。

于是自己写了个 Tracker 维护脚本,通过遍历目录下的 Torrent 文件,提取出 Tracker 地址,做连通性测试,记录有效的地址到 txt 文件中,然后去重。

代码不多,100来行,做了多线程优化,速度也还行。放在了 Github 上。

可惜的是 qbittorrent 本身的 API 不支持永久导入 Tracker 功能,只能手动,也不支持插件的方式来实现,目前只支持搜索功能的插件,当然因为开源的原因,可以理解。

当然也不是没办法,配置文件是明文,可以通过替换特定行的方式来实现,以后再说了。

 

原 E5 双路,E7 系列:铂金(Platinum)、金(Gold)、银(Silver)、铜(Bronze)。

第一位数字:8(铂金)、6/5(黄金)、4(白银)、3(青铜)

第二位数字:代表第N代

第三四位数字:具体 SKU(库存单位)编号

第五位字母后缀:

F : Fabric;集成Intel OmniPath Fabric

T :高 Tcase/扩展可靠性;

M :每 CPU 插槽支持 1.5TB 内存容量,无则为 768GB

P:采用 FPGA 封装

E5 单路,为工作站用途,命名为 Xeon W

E3 命名为 XEON E 代表Entry,入门级工作站处理器

原 Xeon D 保持不变

 

NAS一直没有做备份

当初考虑成本、安全与性能,没有组RAID,只对重要文件做备份

然而一直没有找到好用的备份软件,就此搁置了。

最近用了FastCopy ,支持命令行,就打算用此做下备份。考虑定时备份,使用 Windows 计划任务来实现。

以下为脚本,执行一次后就不用管了

cmd版


@echo off

schtasks /Query /tn AutoBackup

if not {%errorlevel%} == {0} SCHTASKS /Create /TN AutoBackup /TR "'C:\Program Files\FastCopy\FastCopy64.exe' /cmd=diff /verify /auto_close /speed=autoslow 'D:\软件' 'D:\图片' 'D:\文档' 'D:\歌曲' /to='E:\BACKUP'" /SC WEEKLY /D SAT /ST 02:05:00

echo 按任意键退出
pause 
exit 

PowerShell版


# $src:要备份的文件(夹),$dst:备份存储路径

$src='D:\软件','D:\图片','D:\文档','D:\歌曲'
$dst='E:\BACKUP'

echo 检测任务是否已注册
schtasks /Query /tn AutoBackup

if ($? -eq 0) {
SCHTASKS /Create /TN AutoBackup /TR "'C:\Program Files\FastCopy\FastCopy64.exe' /cmd=diff /verify /auto_close /speed=autoslow $src /to=$dst" /SC WEEKLY /D SAT /ST 02:05:00
}
elseif ($? -eq 1) {
echo 任务已注册
SCHTASKS /Create /TN AutoBackup /TR "'C:\Program Files\FastCopy\FastCopy64.exe' /cmd=diff /verify /auto_close /speed=autoslow $src /to=$dst" /SC WEEKLY /D SAT /ST 02:05:00
}

echo 注册完成,按任意键退出
cmd /c "pause"
exit

最近又折腾了下自用的esxi服务器,记录下

最近搬家,esxi机器搬过来后,一虚拟机不能启动,提示硬盘空间不足,情急之下又插上一块SSD,增加存储空间才得以开机。

开机后发现一软件的日志文件居然有90+GB大小,始料未及,清除后虚拟机剩余可用空间并未回收(精简制备),执行命令手动空间回收。


esxcli storage vmfs unmap -u 5ad5cfdc-0106ea44-5a30-c860008c9329
vmkfstools -K Dev-Server.vmdk

然后把 ESXI 从 6.5 升级到了 6.7,数据存储由 VMFS 5 升级到了 VMFS 6 ,VMFS 6 是 vSphere 6.5 的新文件系统。该新文件系统支持 512e 高级格式化驱动器,并且采用 4098 扇区 (4K) 对齐。它还支持自动 UNMAP,其异步跟踪已释放的块并在后台将 UNMAP 发送到后端存储。

简单来说,就是支持了 4K 对齐,这对我本来就是 SSD 的情况来说性能会有明显提升,而且支持后台异步回收空间。