刷新Mellanox ConnectX-3 40G网卡固件

最近为了升级机房服务器 买了一块Mellanox MCX354A-QCBT ConnectX-3网卡。默认的固件是InfiniBand的,所以在把它当成40G QSFP网卡用之前需要把它刷成同系列FCBT版本的固件。

  1. nVidia官网下载固件工具 mst https://network.nvidia.com/products/adapter-software/firmware-tools/
  2. 同样是官网下载固件 https://network.nvidia.com/support/firmware/connectx3ib/ 这里我选的是 MCX354A-FCBT的固件。注意这里的PSID 是 MT_1090120019 后面还会用到这串字符

安装固件下载工具后首先确定卡的device id,可以用 ls pci 也可以用 mst status

# mst status
MST modules:
------------
    MST PCI module is not loaded
    MST PCI configuration module is not loaded

PCI Devices:
------------

03:00.0

这里 03:00.0 就是device id

接下来先备份卡上的旧配置和固件以防万一

flint -d 03:00.0 query full > flint_query.txt
flint -d 03:00.0 hw query > flint_hwinfo.txt
flint -d 03:00.0 ri orig_firmware.mlx
flint -d 03:00.0 dc orig_firmware.ini
flint -d 03:00.0 rrom orig_rom.mlx
mlxburn -d 03:00.0 -vpd > orig_vpd.txt

备份过后可以刷新新卡的固件

$flint -d 03:00.0 -i fw-ConnectX3-rel-2_42_5000-MCX354A-FCB_A2-A5-FlexBoot-3.4.752.bin -allow_psid_change burn

注意这里我们要改变卡的PSID (即我们把一块QCBT的卡刷成FCBT)程序会问你 You are about to replace current PSID on flash - "MT_1090120018" with a different PSID - "MT_1090110019". 这里的 MT_1090120019 就是前面我们下载固件时候同样的PSID

刷卡的过程很快。刷完后记得还要把卡的link改成Ethernet

mlxconfig -d 03:00.0 set LINK_TYPE_P1=2 LINK_TYPE_P2=2

这里 2 就是指Ethernet, 1是InfiniBand。改完后可以用 mlxconfig -d 03:00.0 query 查看新的状态

# mlxconfig -d 03:00.0 query

Device #1:
----------

Device type:    ConnectX3
Device:         03:00.0

Configurations:                                      Next Boot
         SRIOV_EN                                    False(0)
         NUM_OF_VFS                                  8
         LINK_TYPE_P1                                ETH(2)
         LINK_TYPE_P2                                ETH(2)
         LOG_BAR_SIZE                                3
         BOOT_PKEY_P1                                0
         BOOT_PKEY_P2                                0
         BOOT_OPTION_ROM_EN_P1                       True(1)
         BOOT_VLAN_EN_P1                             False(0)
         BOOT_RETRY_CNT_P1                           0
         LEGACY_BOOT_PROTOCOL_P1                     PXE(1)
         BOOT_VLAN_P1                                1
         BOOT_OPTION_ROM_EN_P2                       True(1)
         BOOT_VLAN_EN_P2                             False(0)
         BOOT_RETRY_CNT_P2                           0
         LEGACY_BOOT_PROTOCOL_P2                     PXE(1)
         BOOT_VLAN_P2                                1
         IP_VER_P1                                   IPv4(0)
         IP_VER_P2                                   IPv4(0)
         CQ_TIMESTAMP                                True(1)

重启机器后 ip link 就能看到新的2个ethernet端口。同时 mst status -v 也可以告诉你新卡的端口

# mst status -v
MST modules:
------------
    MST PCI module is not loaded
    MST PCI configuration module is not loaded
PCI devices:
------------
DEVICE_TYPE             MST      PCI       RDMA            NET                       NUMA
ConnectX3(rev:1)        NA       03:00.0   mlx4_0          net-enp3s0d1,net-enp3s0   0

到这里整个刷卡过程就顺利完成了

Aruba Mobility Conductor 配置

删除所有旧配置

 # write erase

先配置远端的MCR 再配置本地local controller。在远端MCR的Configuration – Controllers – Add Mac based PSK 加入本地local controller的Mac地址(设备标签上有)并配置IPSec Key

本地local controller同样删除旧配置。第一次启动选择

Switch Role=md
Conduct Switch Type=MCR
Conductor switch Authentication method (PSKwithIP|PSKwithMAC) = PSKwithMac
Enter Conductor switch MAC address: # 这里是远程mcr上的mgmt口Mac地址,可以通过show switchinfo查看

重启后应该可以在远端mcr上运行 show switches 看到本地local controller。之后配置无线网络需要注意的地方有

Configuration – System – Profiles

  • Wireless LAN – 802.11k – default – Advertise 802.11k Capability
  • Wireless LAN – 802.11r – default – Advertise 802.11r Capability
  • RF Management – 2.4 GHz radio – default – Advanced – Advertise 802.11d and 802.11h Capabilities
  • RF Management – 5 GHz radio – default – Advanced – Advertise 802.11d and 802.11h Capabilities

Traefik v2 下设置反向代理及https redirect

为了解决docker前端的反向代理,在尝试了传统的haproxy后打算试一试新产品。Traefik的吸引力在于

  • v1和v2版本的配置语法不一样,阅读文档需注意
  • 配置可以通过启动参数或配置文件传入,但前者并没有完全实现后者的功能
  • 文档过于简陋
  • 可以自行更新 Let’s encrypt证书,避免3个月手工操作(即使用acme.sh 还是需要配置cron job)
  • 自动发现同一个docker instance上的服务并通过label来定义route/service
  • 多种多样的middleware 可以简单实现ratelimit或者replace path

缺点在于

下面是一个简单例子。docker-compose.yml 中有2个container,其中trafik找到了nginx的服务并且自动issue/renew了证书。

nginx:
    command: nginx -c /etc/netbox-nginx/nginx.conf
    image: nginx:1.17-alpine
    depends_on:
    - netbox
      #ports:
    expose:
      - 8080
    volumes:
    - netbox-static-files:/opt/netbox/netbox/static:ro
    - netbox-nginx-config:/etc/netbox-nginx/:ro
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.netbox_http.rule=Host(`netbox.fastobject.net`)"
      - "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"
      - "traefik.http.middlewares.https-redirect.redirectscheme.permanent=true"
      - "traefik.http.routers.netbox_http.middlewares=https-redirect"
      - "traefik.http.routers.netbox_https.rule=Host(`netbox.fastobject.net`)"
      - "traefik.http.routers.netbox_https.tls=true"
      - "traefik.http.routers.netbox_https.tls.certresolver=le"
      - "traefik.http.services.netbox-service.loadbalancer.server.port=8080"
  traefik:
    image: traefik:v2.1
    container_name: "traefik"
    command:
      --log.level=INFO
      --providers.docker=true
      --providers.docker.exposedbydefault=false
      --entryPoints.web.address=:80
      --entryPoints.websecure.address=:443
      --certificatesResolvers.le.acme.email=henryxxxxx@gmail.com
      --certificatesResolvers.le.acme.storage=acme.json
      --certificatesResolvers.le.acme.httpChallenge.entryPoint=web
    ports:
      - 443:443
      - 80:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

这里还实现了http 80 -> http 443 的自动302跳转。这个配置通过middleware实现,坑点在于需要配置2个route,分别针对http和https,否则跳转是404 not found。另一个容易被忽略的地方是需要被反向代理的container使用expose而不是ports来暴露端口。expose只会把端口暴露给其他container 而ports会把这个端口绑定在host上。在这个例子里只需要把端口expose给trafik即可。

Keepalived实现廉价HA

最近在dockerize各种home lab上的服务,其中遇到的一个问题就是如何实现HA。最方便的实现方式是打开eBay.com搜索F5 Big IP 购买硬件Load Balancer。最廉价的方式是多个设备间跑VRRP协议实现自动Fail over切换。Keepalived 就是一个精细生活VRRP的软件实现。

具体用例为两台Docker node上各跑了一个container运行unbound提供recursive DNS服务。任意一台机器下线(不管是container下线或是node下线)都由另一台机器在同一个IP地址下继续提供服务。切换期间网络不不会中断。

既然已经有了两台运转正常的Docker node,显然Keepalived跑在Container里是最经济且便于管理的。这里用到的docker image是 https://github.com/osixia/docker-keepalived

需要注意的是两台机器的sysctl需要设置 net.ipv4.ip_nonlocal_bind=1 在Ubuntu上可以通过修改 /etc/sysctl.conf 并运行 sysctl -p /etc/sysctl.conf 实现。在RancherOS上需要修改cloud-config.yml 具体参考官方文档

并且这两个container需要跑在host network上且赋予 CAP_NET_ADMIN (--cap-add NET_ADMIN

以下是用docker-composer 和直接运行docker run的两种配置。

# docker-composer.yml

keepalived:
     container_name: keepalived
     image: arcts/keepalived:latest
     environment:
       - KEEPALIVED_AUTOCONF=true
       - KEEPALIVED_STATE=MASTER
       - KEEPALIVED_INTERFACE=eth0
       - KEEPALIVED_VIRTUAL_ROUTER_ID=2
       - KEEPALIVED_UNICAST_SRC_IP=10.2.1.10
       - KEEPALIVED_UNICAST_PEER_0=10.2.1.11
       - KEEPALIVED_TRACK_INTERFACE_1=eth0
       - KEEPALIVED_VIRTUAL_IPADDRESS_1="10.2.1.12/24 dev eth0"
     network_mode: "host"
     cap_add:
       - NET_ADMIN
# docker run command
docker run -d --name keepalived --net=host --cap-add NET_ADMIN \
-e KEEPALIVED_AUTOCONF=true               	\
-e KEEPALIVED_STATE=BACKUP           		\
-e KEEPALIVED_INTERFACE=eth0                \
-e KEEPALIVED_VIRTUAL_ROUTER_ID=2           \
-e KEEPALIVED_UNICAST_SRC_IP=10.2.1.11    	\
-e KEEPALIVED_UNICAST_PEER_0=10.2.1.10     \
-e KEEPALIVED_TRACK_INTERFACE_1=eth0        \
-e KEEPALIVED_VIRTUAL_IPADDRESS_1="10.2.1.12/24 dev eth0" \
arcts/keepalived

至此 IP地址 10.2.1.12 就由 10.2.1.10 为master ,10.2.1.10下线 则10.2.1.11 自动由backup转为master继续提供服务

在Cisco路由器上使用Let’s encrypt 证书

以下是一个笔记,用来更新Cisco 28xx系列路由器上的Anyconnect 证书

1. 生成Let’s encrypt 证书。我习惯用getssl

2. 加密private key 这台设备较老,只接受des加密的格式
openssl rsa -des -in privkey.pem -out privkey-enc.pem
这时候会要求输入一个密码,在下文会用到

3. 从private key中提取public key
openssl pkey -in privkey.pem -pubout -out pubkey.pem

4. 登陆到路由器并切换到配置模式

enable
configure terminal

5. 创建ISRG Root certificate trustpoint

crypto pki trustpoint ISRG_Root_X1
chain-validation stop
revocation-check none
enrollment terminal pem
exit

6. 导入ISRG Root certificate (从 https://letsencrypt.org/certs/ 下载)
crypto pki authenticate ISRG_Root_X1
粘帖复制证书后回车在新的一行键入quit

7. 创建中间证书 Let’s Encrypt Authority X3 (Signed by ISRG Root X1) 的trustpoint

crypto pki trustpoint Lets_Encrypt_Authority_X3_signed_by_ISRG_Root_X1
chain-validation continue ISRG_Root_X1
revocation-check none
enrollment terminal pem
exit

8. 同样粘帖复制中间证书 (从 https://letsencrypt.org/certs/ 下载)
crypto pki authenticate Lets_Encrypt_Authority_X3_signed_by_ISRG_Root_X1
粘帖复制证书后回车在新的一行键入quit

9. 导入路由器证书
crypto pki import host.domain.com-cert pem terminal @Password@
这里的@Password@ 替换为 #2 中自定义的密码
粘帖复制 Let’s Encrypt Authority X3 的中级证书,也就是在#8 中用过的。在换行后输入quit
粘帖复制 privkey-enc.pem 中的内容,注意不要有空行。在换行后输入quit
最后粘帖复制 #1 中创建的证书。在换行后输入quit
如果一切正常的话应该能看到
"% PEM files import succeeded."

10. 替换原有的证书
这里用到的gateway名字是我本机的,请根据实际情况输入

webvpn gateway gateway_1
ssl trustpoint host.domain.com-cert

90天过期前需要重新更新服务器证书并且重复 #10 步

参考文献
Tutorial: Get Let’s Encrypt on Cisco routers/switches

搭建个人家用NAS网络存储服务器 [三]

上文 搭建个人家用NAS网络存储服务器 [二] 里讲了这次新NAS server的硬件,这篇讲讲软件。

首先,这次组home server的目的已经不仅仅是NAS,还想用虚拟化做几台VM跑一些web应用,所以在用何种虚拟化技术上动了点脑筋。
考虑过以下几种

  • ESXi
  • Xen
  • Solaris Zones

第一种ESXi安装起来最简单,VMWare的图形化配置简单易用,客户端还有中文版。但问题就在这个客户端上,它只有Windows版本(就算web client也是需要一台windows机器做web server)这给我造成了很大的不便,家里都是Mac和Linux。
第二种Xen的安装需要对Linux系统比较熟悉,并且配置大量依赖命令行(我没有装libvirt图形界面,用xl这个stack tool足够了)
第三种Solaris Zones我也曾经考虑过,那时候曾经想主机(Dom0)就直接跑OpenIndiana然后用Zones作虚拟化,最后作罢的的原因还是对Solaris不熟悉。

在决定采用Xen虚拟化技术的同时还有一点需要注意的就是CPU和主板都支持vt-d,这样可以直接把SAS控制卡和网卡直接pci passthrough给位于DomU的NAS系统,以达到接近于native的性能。Intel带K结尾的CPU都不支持vt-d技术(可惜了我的3770K),Z77主板除了Asrock的一款外也都不支持vt-d(又可惜了我的ROG M5G)

NAS本身的系统我还是选择了自己相对熟悉的FreeNas。曾经列入考虑范围的还有OpenIndiana(也就是OpenSolaris folk出的开源版本),最后由于对Solariz系统不熟悉和对FreeNAS漂亮GUI的依赖而作罢。

最终系统中软件的版本如下
Dom0:
Gentoo Linux 3.8.13-gentoo (我尝试过3.10.7 内核,Xen配置不成功)
Xen-4.2.1-r4 (4.2.2 下配合Xen-tools 有点问题,hvm DomU跑不起来)
Xen-tools-4.2.1-r5 (4.2.2-r3 下hvm和qemu被mask,遂降级至4.2.1-r4)

DomU:
FreeNAS我尝试过两个版本 (8.3.1-p2-X64, 9.1.1-X64) 可以顺利跑在DomU HVM下并且Dom0 pci passthrough LSI 9211-8i HBA controller和Intel 82579LM Gigabit ethernet card。
这里面有一个tricky的地方就是LSI 9211-8i 这块用SAS 2008芯片的HBA卡在通过Xen passthrough给FreeNAS的时候需要修改FreeNAS系统里的2个配置问题,否则系统启动中会遇到超时问题(如下)

run_interrupt_driven_hooks: still waiting after 60 seconds for xpt_config mps_startup
run_interrupt_driven_hooks: still waiting after 120 seconds for xpt_config mps_startup

解决办法就是修改FreeNAS上的/boot/loader.conf,加入以下两行 (默认情况下/boot 是readonly的,需要 mount -uw / 加载为可读写)

hw.pci.enable_msi="0"
hw.pci.enable_msix="0"

这个问题托 @delphij 的福已经开了bug ticket

至此我的第二台NAS server + home server顺利运转,并且主机上还能再跑几台VM弄点web应用。

如果还写第四篇的话,我估计玩的就是链路聚合 Link aggregation control protocol 或者是10GBase-T网络了

搭建个人家用NAS网络存储服务器 [二]

不知不觉距上文 搭建个人家用NAS网络存储服务器 [一] 发布已经快三年了。
第一篇中的主机后来给家人当做桌面机上网炒股打游戏,作为替换我尝试了HP N40L MicroServe (主要是捡到一台非常便宜的N40L) 加FreeNAS系统的组合,主要考量还是FreeNAS提供的ZFS磁盘格式比较吸引人,ZFS Snapshot是超越Mac OSX上时光机的终极快照备份工具。可惜的是N40L只有4个不可热插拔硬盘位,4个盘位跑RaidZ2略显尴尬,外加N40L的集成CPU性能较弱,应付RaidZ2略显吃力,在全负载读写数据下网络数据传输曲线惨不忍睹。加上最近家里宽带套餐换成了Business Class Internet,ISP提供了一个固定IP,于是想装一台新的home server在提供NAS的同时也可以跑一些web服务。于是再一次开始DIY…

这次装机考虑的主要是一机多用即主机上能跑多个虚拟机应付不同的应用,于是虚拟化能力成了选购主板和CPU的首要因素。Intel的VT-x和VT-d是必须的,前者在主流CPU上都有提供,后者是为了PCI device passthrough (Direct I/O)以保证提供NAS服务的虚拟机能直接操纵硬件以提供最佳性能。为了能将服务器仍在角落运转而不用担心死机重启,主板支持IPMI就显得非常重要。至于主板SATA的数量到不是最关键因素,决定上HBA控制卡来保证足够多的SATA/SAS接口。

于是乎有了下面的配置
Supermicro X9SCM-F (只有带F的型号支持IPMI)
Intel Xeon E3-1220 V2 (没有选择V3 Haswell平台主要是从功耗和价格上考虑,V2设计TDP 69w,V3居然要80W)
Kingston DDR3-1333 ECC unbuffered Memory 8Gx2 (主板只支持ECC内存)
LSI 9211-8I HBA 扩展卡
Seasonic 650W 80 Plus Gold (主要遇到打折,65美金实惠价,80+金牌能效比高一些)
OCZ Vertex2 128G SSD (以前机器淘汰下来的,仅作为系统盘够用了)
机箱这次用了Fractal Design Define XL R2,全塔ATX机箱,提供8个3.5寸,4个5.25寸驱动位,这个情况下应该足够了。
磁盘还没有全部到位,基本上准备上WD Red NAS driver红盘。

关于CPU的选择还有个插曲。我中途一度考虑过Xeon E3-1220L V2 这款2012二季度发布的CPU设计TDP只有17w,并且双核四线程带Vt-d简直是家用服务器首选。可惜这款CPU根本不针对零售市场,不管在美国还是中国都很难买到。淘宝上一度出现过一些ES版本的V1版喊价都在1200人民币以上,个别日本代购还喊出了1999人民币的匪夷所思价格。最终还是选择了Xeon E3-1220 V2这款好买又不算太贵的CPU,我买的价格是233美金不含税,如果最终感觉功耗过大可以在BIOS里关掉两个核以降低功耗。

主板的选择余地并不大,考虑到需要IPMI和虚拟KVM支持,基本上只有supermicro,Intel和ASUS这几家,考虑到名气和市场占有率选择Supermicro就不意外了。至于HBA扩展卡而不是硬件RAID卡,主要考虑因素是FreeNAS(或OpenSolaris)跑ZFS需要对硬盘的直接控制,用一款硬件RAID控制卡的话就等于中间额外架了一层,此外纯硬件RAID卡如果要支持RAID 6价格不菲。从性能上讲现代CPU已经严重性能过剩,以前硬件RAID的专用RISC处理器速度快,现在都已经可以完全靠软件Raid来提供同等性能。另外一个不得不考虑的地方就是硬件RAID卡坏了得找一块同厂家同型号的卡来把数据救回来,软件的就比较简单,接哪台机器上都一样用。选择这个型号是因为根据网上的评测,LSA 9211-8i这块卡上用的SAS 2008 芯片系统兼容性比较好。再次不得不说taobao神店多,这卡在淘宝上400-600人民币选择一大堆,在eBay/Amazon上都起码是200+美金,还是祖国好啊。

电源机箱没啥特别的,看到打折外加造型还可以就买了。电源唯一需要注意的就是实际运行中并不需要650w那么大功率,每个硬盘差不多十多w就搞定了,但是开机一瞬点启动电流会比较大,电源不能提供12V下足够电流就容易挂硬盘。我想也没有人会一个个慢慢热插拔硬盘来启动,所以还是选择名牌电源比较靠谱。

下文会讲具体的OS选择和虚拟化技术选择,提前预告下牵涉到了Xen的安装和具体PCI passthrough的配置…. 我想应该不用再等三年了

CentOS5上安装Redmine的常见问题

因为项目需求,需要安装一套集成Issue tracking/task management /SCM/wiki/forum的系统。如果单独安装,那么可以有Jira,Wikipedia,Phpbb之类的候选人。如果想要all in one solution那显然Redmine是最好的选择。Redmine本身是由ROR写的,看到这里估计大家心里有数了,这东西的安装在老系统上必然不会是那么顺利,曲折是难免的,尤其是在一台CentOS 5.6的机器上。常规的Install Guide 暂且不表,可以参考 http://www.redmine.org/projects/redmine/wiki/HowTo_install_Redmine_on_CentOS_5

这里就说下可能遇到的常见问题。

1. 软件版本。根据官方的说法,即使是最新的Redmine 1.2.x也暂时不支持Ruby 1.9,推荐使用Ruby 1.8.6 or 1.8.7。我尝试过CentOS官方repo里自带的1.8.5以失败而告终。所以耐心地现在source code自己编译吧。Gem的版本也有讲究,比如1.7.0之前的,显然那就只有1.6.2可用。同理还有Rake必须0.8.7,我尝试过0.9.1的结果就是失败。Rack用1.1.0。

2. 在执行rake db:migrate的时候你可能遇到一个错误消息 ‘no such file to load –openssl’。那就需要先
[code lang=”bash”]# yum install openssl openssl-devel[/code]
然后在已经解压的ruby source code中
[code lang=”bash”]
# cd /ruby_install_dir/ext/openssl
# ruby extconf.rb
# make & make install
[/code]

3. 如果用mysql数据库存储,可能会遇到错误 ‘No such file or directory – /tmp/mysql.sock’ 这是因为在config/database.yml中默认没有指定socket路径,解决方案即加一行参数把实际的sock路径指定,如[code lang=”bash”]socket: /var/lib/mysql/mysql.sock[/code]

4. 如果用Passenger 配合Nginx,那可能会在用passenger-install-nginx-module的时候遇到错误提示 ‘configure: error: C compiler gcc is not found’。问题原因不详,解决方案就是在安装的第二部不要选择1 用默认的下载地址把Nginx源码下载到/tmp然后选择2,手工指定已经下载并解压的nginx源码(放在非/tmp目录下)即解决问题。

下篇会讲到Redmine和Gitosis集成

搭建个人家用NAS网络存储服务器 [一]

随着家用宽带的不断提速和高清电影的普及外带单反的家庭占有率越来越搞,仅靠台式机里那几块硬盘越来越不够用了。
简单的计算了一下,家里的台式机上2T的容量(1T+640G+320G)已经接近于80%满,外接一个1.5T的移动硬盘也不是办法。同时还有笔记本上零散的一些数据文件(诸如写的文档),外加数码相机前后拍摄了几个G的照片(尽管我不是Teacher Chan),这些数据如何存放一直都是一个让人不安的话题。考虑再三,决定上一台个人用的NAS(Network attached storage)服务器。

在市场上考察了一番,先是考虑了成品的NAS服务器。比较看得中的有Netgear的ReadyNAS系列,2槽和4槽都比较感兴趣。首先排除的是2槽的机器,因为2槽不足以实现Raid5,并且最大4T的容量也略嫌小了一些。

4槽的机器里还是以Netgear为首选,这一系列产品正处于换代时期,老的NV+ RND4000 4槽服务器是用的600~800mhz的Risc CPU,性能不足以实现诸如Time capsule和DLNA服务,并且传输速率在千兆环境下也只有30余兆。新的ULTRA系列RNDU4000倒是都满足要求,样子也很不错,可惜国内还没有铺货,国外在eBay上是600美金。这东西要运回来可不容易,包装好足有16磅的重量。再考虑到最近海关的丧心病狂,从eBay搞一套回来成本起码在6000以上,太贵了。对于性能不太讲究的话倒是可以考虑上一代的NV+ RND4000,eBay上已经在清仓,全新的机器只要300刀,有路子机场托运一台回来的朋友可以考虑。

Netgear之后考虑了QNAP,但还是觉得价钱不太实惠。这里要提的一点是,对于WD或者Buffalo这样玩票性质的NAS最好不予考虑,他们提供那只能算是带网络服务的外置硬盘。对于数据安全性和扩展性是在是差了点。QNAP这个牌子有所考虑,但我对于它所提供的花里胡哨的Mysql/PHP/Apache服务不感兴趣,我是买NAS的又不是买共享web主机,先把数据安全性做好吧。

一番考量之后,4槽的机器正规渠道最低也要3700,用的还不是X86的CPU,千兆网下性能有瓶颈。一般大厂的机器都要在4500以上,于是萌发了自己动手组装的想法。

自己动手首先想到的是采用ATOM的CPU+主板一体的板子,功耗低而且价钱便宜。可惜INTEL为了保证低端C2D产品线的销量,对NM11芯片组采取了限制,一般都只提供了2个SATA口。即使有像技嘉这样大厂通过外接JMicro的芯片额外提供了2个SATA,也最多不过4口,并且第三方芯片提供的串口稳定性也有待商榷。只有超微Supermicro的一款X7SPA-H服务器用的ATOM主板提供了6个板载SATA(ICH9R)。可惜那块主板在国内的渠道又是个问题,工包也要1500左右,遂放弃。

在找主板的同时机箱倒是很方便的确定好了,联力的一款PC-Q08 ITX小机箱是个不错的选择,支持ITX规格主板,全尺寸ATX电源,并且还能支持6个横置的3.5寸硬盘。这简直就是为了做NAS而设计的。价钱的话淘宝差不多780的样子,不管太贵。当然,如果能接受全尺寸塔式机箱的话那三四百可以买很多提供6个3.5寸槽的机箱了。这里要提的是电源,如果你打算接4个或更多的硬盘,电源最好别考虑那种DC-ATX的小电源(无论内置外置混合置),多个硬盘在启动的时候瞬间电流很大,如果供电不足硬盘寿命大大缩短。我们弄NAS是为了数据存储,不是为了搭个硬盘棺材。全尺寸ATX电源可供选择的就太多了。这里我还是按照传统选了Antec ECO 400w。

机箱确定后,主板也只能买ITX的了。考虑INTEL H55芯片组 + i3 CPU。这样功耗比ATOM约高出30~50w,但性能强很多,万一以后不搞nas了还能做个播放器或压片机之类的。第一考虑的目标还是技嘉,但它只提供4个SATA,有点浪费机箱。最后选择了索泰H55U3,提供6个SATA,还有USB3.0口(极品,将来接外置硬盘拷贝数据太方便了)和WIFI(这个非必需),机器背板自带一个eSata口。我只能说这板子简直就是为了做NAS而设计的,6个串口和机箱配合完美。这块主板也是全固态电容,做工也还可以。WIFI是通过主板上的mini PCIE接口提供的,可以拆卸,将来换个mini PCIE的固态硬盘也不是没可能。同时主板也提供了板载千兆网卡,DVI/HDMI,接口该有的都有了。

CPU没啥好挑的,就INTEL i3 530,双核四线程,做NAS足够了。内存2G也够了(注意,上ZFS的话内存2G是有必要的)硬盘暂时就先上了一块WD的20EARS绿盘,这块硬盘用的4k sector和AFD (Advanced Format Driver)后来给我带来了不少麻烦,下文会提到。

综上所述,最后的配置如下
索泰 H55U3
INTEL i3 530
联力 PC-Q08
OCZ DDR3 1333 2G
WD 20EARS 2T
Antec Eco 400w
不带硬盘的价钱差不多是2900,可以实现6槽最大12T的容量。系统配置会在下文提到。

ProFTP 在MySQL中配置用户信息

服务器运行2个月了一直靠着sftp在传文件,决定还是配个ftp server方便下其他需要文件传输的朋友。

根据版本号原则(选择版本号最丰富最高的那个),在ProFTP/Pure-ftp/vsftp中选择了ProFTP,部分原因也是为了能搭配Mysql来保存用户信息。
这样做的好处在于可以不必暴露服务器上真实的用户名密码,即使信息外泄也不会引发严重安全问题,而且修改用户信息定义也方便,无需root登录只要修改下数据库就生效了。

在Gentoo上安装时需要USE参数中有mysql才会编译proftpd的mysql支持。
下面就是proftpd.conf里的配置,辅以简单说明
[code lang=”bash”]
# 申明从mysql中读取用户信息
AuthOrder mod_sql.c
# SQL信息log输出,方便调试
SQLLogFile /var/log/proftpd.sqllog
# 指定验证方法,Backend即调用特定数据库的密码加密方法,如Mysql下的password()函数
SQLAuthTypes Backend
SQLBackend mysql
SQLAuthenticate users groups
#用户库连接信息 数据库名@主机名 用户名 密码
SQLConnectInfo dbname@localhost dbuser dbpassword
# 数据库表的结构,如果你采用后文给出的db schema则无需更改
SQLUserInfo ftpusers userid passwd uid gid homedir shell
SQLGroupInfo ftpgroups groupname gid members
# 当用户登录时更新数据库表中count字段的值+1并且更新accessed字段值为当前时间。
#这两条并非必须,只是为了记录下用户登录时间次数。同理,可以将用户执行STOR或DELE的信息输出到日志
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE “count=count+1,accessed=now() WHERE userid=’%u'” ftpusers
[/code]

[code lang=”sql”]
# 数据表结构如下
CREATE TABLE IF NOT EXISTS `ftpusers` (
`userid` varchar(40) NOT NULL,
`passwd` varchar(50) NOT NULL,
`uid` int(11) NOT NULL default ‘0’,
`gid` int(11) NOT NULL default ‘0’,
`homedir` text NOT NULL,
`shell` text NOT NULL,
`count` int(11) NOT NULL default ‘0’,
`accessed` datetime default NULL,
PRIMARY KEY (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `ftpgroups` (
`groupname` varchar(50) NOT NULL,
`gid` int(11) NOT NULL,
`members` text NOT NULL,
PRIMARY KEY (`groupname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
[/code]

这里需要注意的是,user表中每个user的uid和gid字段值必须是系统中存在的并且有足够权限读写homedir指向的路径。举个例子,如果有虚拟用户ayue且homedir指向/var/ftp/ayue,并且/var/ftp/ayue实际上是由用户Juda拥有,则ayue的uid和gid必须和/etc/passwd中Juda的一样才能正常读写该目录。也就是说,我们在数据库中创建的虚拟用户ayue可以理解为系统中真实存在的用户Juda的一个映射,ayue上传的文件在系统里就是Juda(同uid,同gid)所拥有的。