月度归档:2014年01月

RHEL 上搞定 HP MicroServer 的 Smart Array Controller B120i 磁盘阵列

MicroServer Gen8 是 HP 服务器里较新的一个系列, 其所配备的磁盘阵列卡 — Smart Array Controller B120i, 也是比较新的一种阵列卡, 目前 HP 仅提供了 RHEL, OpenSUSE, Microsoft 的驱动程序.

我们就是要在 MicroServer Gen8 上安装 RHEL6.

MicroServer Gen8 的主板上的 ROM 上搭在了一个小型的配置系统, 叫做 Intelligence Provisioning, 在这里你可以对磁盘阵列进行分区(正如 hardware raid 都会带有一个控制系统来管理自己的说法一样), 还可以配置你要安装的操作系统(不过在通过这个配置你可以安装的系统有限, 仅限于 HP 提供了阵列卡驱动的那些系统), 还带了一些系统健康状态监控的功能.

对于上述的几个可以在 Intelligence Provisoning 中配置的操作系统, MicroServer Gen8 似乎都提供了他们的安装程序, 这点比较方便, 因为在 Intelligence Provisioning 中配置好我们想安装的操作系统之后, 重启机器就回进入这个操作系统的安装界面, 然后你只需要提供操作系统的镜像就可以继续你的安装. 但是 Gen8 预置的 RHEL 操作系统安装程序却是有一个严重的不如人意的地方, 稍候我会说明这一点.

众所周知, 安装软件时, 一般来说这个软件会提供一个安装程序, 我记得 windows 下以前最火的制作安装程序的软件叫 InstallShield 不知现在还是不是最火的, 使用这个软件就可以制作出那种傻瓜化的一路下一步的软件安装程序, 而 linux 下的安装程序, 应该就得算各种包管理系统或者是./configure, make, make install 三步曲了吧. 那么安装操作系统的话, 也是需要一个操作系统安装程序的, 操作系统安装程序可谓多种多样, 甚至有些已经超越了”操作系统安装程序”这个界限, 自己直接提供了一个操作系统, 比如通过制作 Ubuntu Live CD/USB 安装盘, 你都可以直接使用在安装盘上的系统而不用把它安装到你的硬盘上 — 当然, 这似乎已经不属于”操作系统安装程序”了. 这么分吧, 一般来说, 操作系统安装程序分为两种, 带图形界面的和不带图形界面的. 不管带不带图形界面, 操作系统安装程序都会包含一些安装过程中必备的硬件驱动程序, 比如硬盘的驱动程序, 这样安装系统的时候, 操作系统安装程序才能识别出你的硬盘然后让你选择将系统安装到哪个硬盘上; 可能还有网卡驱动程序, 这样你在安装的过程中就能联网获取更新.

一般来说, 操作系统安装程序中所带的驱动已经够了, 但是现在不行, 我们想把系统安装在 raid 上, 也就是 Smart Array Controller B120i 上, 这是一种 Hardware RAID, 这就需要我们的 RHEL6 系统安装程序具备识别 Smart Array Controller B120i 的驱动, 但是不幸的是 Redhat 尚未提供这个驱动, 用在 Redhat 官网下载的系统引导镜像(系统安装程序镜像)制作成的系统安装盘里, 并不具备 Smart Array B120i 的驱动, 无论哪个版本. 幸运的是, HP 提供了适用于 RHEL6.x 各个版本的驱动程序. 这样我们就可以在安装过程中加载这个驱动程序.

对了, 我们安装的 RHEL 版本是 RHEL6.2

Ok, 下面我们就开始正式的安装过程.

1. 制作操作系统安装盘

这个参考了 redhat 官方文档, 我们制作了一个 BIOS-based 的 USB 启动盘, 注意不要用 UEFI, MicroServer Gen8 还不支持 UEFI, 我试验过, 制作了 UEFI-based 的启动盘, 不被识别, BIOS 中没有选项可以启用 UEFI, HP 官网一篇文章也说了 MicroServer Gen8 不支持 UEFI, 链接我暂时找不到了.

需要的镜像 rhel-server-6.2-x86_64-boot.iso 可以在网上下载到. 制作时需要一个 U 盘.

上面我们也说了 Gen8 预置了各种系统的安装程序, 为什么我们这里还要制作系统安装盘呢, 因为 Gen8 预置的安装程序不能进入 boot prompt 界面, 而我们后面要进入这个界面手动加载 HP 提供的 Smart Array B120i 驱动. 这就是 Gen8 预置系统安装程序不尽人意的地方.

注意, 如果安装的是 rhel6.2, 就老老实实用 rhel-server-6.2-x86_64-boot.iso 这个镜像制作安装盘, 不要用 rhel-server-6.3-x86_64-boot.iso, 我一开始因为找不到 6.2 的boot 镜像, 但是找到了 6.3 的就用了 6.3 的 boot 来安装 rhel6.2, 但是在加载 Smart Array B120i 驱动那里折腾了好久 — hpvsa-1.2.8-140.rhel6u2.x86_64.dd 无论如何都加载不上.

要用 6.3 的 boot 就只能加载 hpvsa-1.2.8-140.rhel6ur3.x86_64.dd 这个驱动, 但这是没道理的, 为何要用 6.3 的 boot 加载 6.3 的 Smart Array B120i 驱动然后安装 6.2 的 rhel? 这完全是找折腾受.

2. 系统镜像盘制作

系统镜像 rhel-server-6.2-x86_64-dvd.iso 网上可以下到, 下载之后要严格按照 redhat 官方的文档 制作系统镜像盘, 这里我们需要另一个 U 盘.

3. 下载 HP 提供的 Smart Array B120i 驱动

HP 提供的驱动在 HP 官网下载, 要下载与自己系统对应的版本, 我们这里是 hpvsa-1.2.8-140.rhel6u2.x86_64.dd, 下载之后这个驱动程序放在另一个 U 盘, 这个 U 盘不必是空的, 总之目前为止我们需要第三个 U 盘.

4. 开始安装

  1. 插入第一个 U 盘, 启动 MicroServer Gen8, 首先进入 BIOS Setup 界面, 选择 Embedded SATA Configuration -> Enabel Dynamic HP Smart Array B120i RAID Support, 然后重启
  2. 选择临时启动介质为 USB Key 启动
  3. 进入 rhel server 的安装界面, 这个界面让你选择安装方式, 让光标停留在 “Install or Upgrade exsiting system” 这一项上, 然后按下 TAB 键直接在当前界面编辑引导参数, 或者是按下 ESC 键进入 boot prompt 界面, 插入第二和第三个 U 盘(包含 HP Smart Array B120i 驱动的那个)
  4. 无论你在哪个界面, 输入 “linux dd blacklist=ahci”, linux dd 命令使得你可以附加额外的驱动给系统安装程序, blacklist=ahci 这句是为了防止安装程序加载了普通的硬盘驱动将磁盘阵列识别为多个硬盘而不是一个阵列, 个人觉得可能不加 blacklist=ahci 也能成功但最好加上
  5. 安装程序会询问你是否有包含驱动的磁盘, 选 Yes, 然后找到你刚才插入的 U 盘(不知道是那个的话就挨个打开看看), 找到里面的 hpvsa-1.2.8-140.rhel6u2.x86_64.dd, 按 Enter, 等安装完了之后, 安装程序会问你还有没有别的驱动要安装, 我们没有别的驱动要装了, 选 No.
  6. 安装程序会正式进入安装界面, 让你选则安装语言等, 在选择安装介质的时候, 选择第二个 U 盘, 继续, 会出现一个界面, 里面会显示安装程序检测到的所有连接到机器的上的存储介质, 不出意外的话, 你就会看到你的 RAID 阵列也在里面.
  7. 接下来就是常规的系统安装操作, 调整分区, 下一步, 下一步….

至此, 安装安成.

GNU Screen Tutorial

概念

  • 会话, screen 有自己的会话的概念, 当你运行 screen 命令后, 你就启动了一个 “会话”. 下文中的”会话”都是指 screen 会话.
  • 窗口, 每一个会话可以包含一至多个窗口, 在每一个窗口中, 你可以做单独的工作. 比如说在窗口1 中开着 vim 写作, 在窗口2 中运行 netstat 监控网络, 而第三个窗口保持 bash shell 不做其他的事

默认情况下, 当你运行 screen 之后, screen 将为你建立一个会话, 并且为你建立一个默认的窗口, 并且, 为你在这个窗口中运行 bash shell.

优点

使用 screen 的优点是很多的, 尤其是你需要 ssh 登录到远程主机进行工作的时候, screen 可以帮助你使你即使从远程主机退出了, 你的工作也能够继续, 这是其一, 另一点就是它可以帮你”节省终端” – 当你需要登录远程做多个工作的时候, 你不必开多个终端分别 ssh 登录远程, 然后分别做各自的工作. 这在 多个窗口 这一节会分析.

运行 screen

只需要简单的执行 screen 命令:

$ screen

一般来说, 你会看到一屏关于 screen 程序的介绍和版权信息, 根据按空格或回车就能跳过. 此时, 你便处于 screen 的”会话中”了, 之所以要加引号是因为你还可以处于会话之外, 稍候会提到.

会话之中

当你处于会话之中的时候, 你需要一种特殊的指令格式来给 screen 会话下达指令, 这种特殊的格式就是每当你想下达指令时, 你要先按一下 “Command Key”, “Command Key” 在 screen 中被默认设定为 ^A(Ctrl-A), 也就是说, 每一步操作你都要先按一下 ^A. 比如想新建一个窗口, 那么就需要按下 Ctrl-a, c.

处于会话中时, 你可以对 screen 会话下达的指令很多, 你可以通过 Ctrl-A, ? 来列出所有可以执行的指令.

多个窗口

默认情况下, 当你开启一个 screen 会话后, 会话中是只有一个窗口的, 拥有多个窗口可以为我们带来极大的方便, 尤其是在用 ssh 登录到远程主机的时候. 比如说我们需要登录到远程主机同时开着 iostat 和 netstat 来实时监控远程主机的运行状态. 我们有如下两种方式:

  • 如果不使用 screen, 我们就需要开两个终端, 运行两次 ssh 登录到远程, 然后一个终端运行 iostat, 另一个终端运行 netstat;

    这种方式无疑要麻烦许多, 你要登录两次远程, 还浪费了你本地的终端…

  • 如果我们使用 screen 但是不使用多窗口, 我们固然可以只开一个终端 ssh 到远程, 然后开一个 screen 会话, 运行 iostat, 然后 detach 这个会话(后面介绍), 再开一个 screen 会话, 运行 netstat.

    这种方式比上面那种好不了多少, 甚至更差, 因为你没法同时检测磁盘运行和网络运行状况, 你要查看磁盘运行, 就要 detach 掉运行 netstat 的那个 screen 会话, retach 到运行 iostat 的那个会话, 反之亦然.

然而当你在一个会话中使用多窗口后, 一切都变得那么优雅, 而创建新的窗口又是那么的简单, 下面我们来看一下与窗口相关的几个指令:

  • Ctrl-A, c, 创建一个新的窗口, 以这种方式创建的窗口会默认的运行 bash shell
  • Ctrl-A, w, 显示会话中的所有窗口, 会显示窗口的标号, 当前的窗口会以星号标识
  • Ctrl-A, 0/Ctrl-A, 1…, 切换到标号为 0/1 的窗口
  • Ctrl-A, ", 显示会话中的所有窗口, 并且可以通过方向键和回车键选择切换窗口
  • Ctrl-A, p/Ctrl-A, n, 切换到前一个/后一个窗口

如此一来, 我们就可以在一个窗口中运行 iostat, 然后 Ctrl-A, c 创建另一个窗口运行 netstat, 不过慢着, 以这种方式创建出来的新窗口, 其显示区域是会覆盖之前的窗口的, 这样一来, 岂不是也不能同时查看 iostatnetstat 的监控情况吗? 别急, screen 还有另一个功能.

多显示区域

我觉得 screen 最方便的地方就是支持将会话分成多个显示区域, 并且每个显示区域都可以显示任意的一个窗口.

我们可以在会话中创建两个窗口, 分别运行 iostat 和 netstat, 然后将会话分成左右两个显示区域, 每个区域显示一个窗口的内容, perfect right?

  • Ctrl-A, S, 水平分割会话中的显示区域
  • Ctrl-A, |, 垂直分割
  • Ctrl-A, TAB, 切换到下一个显示区域

分割出来的新的显示区域默认是什么都不运行也什么都不显示的, 我们可以在切换到新的显示区域后, 结合 Ctrl-A, n/Ctrl-A, p/Ctrl-A, 0/Ctrl-A, " 来让这个新的区域显示已有的窗口, 通过 Ctrl-A, c 等来在这个区域新建一个窗口(并运行 bash shell).

会话之外

脱离(detach)会话

当我们按下 Ctrl-A, d, 我们就能够从会话中脱离, 这也就使我们回到了正常的 shell 环境中.

列出存在的 screen 会话

命令 $ screen -ls 能够列出当前系统中存在的会话, 这会显示出会话的名字.

依附到(retach)会话

命令 $ screen -r [session_name] 可以是我们依附到某个存在的会话中. 我们可以先使用 screen -ls 获得当前的会话列表, 然后依附到某个会话.

退出 screen

在会话中的 shell 提示符下输入 exit 命令就可以退出会话, 不过, 如果你开了多个窗口, 那么每执行一次 exit, 只是会退出一个窗口, 直到最后一个窗口退出, 会话才会退出.

PPTP VPN 基础与搭建

我们知道 VPN 全称是虚拟专用网(Virtual Private Network), 就像很多计算机名词一样, 这个词也已经被过分使用, 而导致很多人知道它的全称却不知道它具体代表什么意思了. 在这里我们先好好复习一下 VPN 的定义.

我不喜欢肢解名字来解释一件东西, 但这里还是挺适用的, 首先从名字可以看出来, VPN 有两个特点:

专用 (Private)

之所以称为专用网, 是因为这种网络只是用于本机构的主机和本机构的主机之间进行通信. 而不是用于本机构内的主机和外界网络通信.

虚拟 (Virtual)

而之所以称之为虚拟, 则是因为实际上并没有使用专用的物理的线路来连接分散于各地的本机构的网络. 而是使用了现有的互联网的线路.

我们发现, 实际上虚拟专用网和我们接触最多的局域网很像:

  • 首先, 它们使用的都是专用地址
    • 10.0.0.0 — 10.255.255.255
    • 172.16.0.0 — 172.31.255.255
    • 192.168.0.0 — 192.168.255.255
  • 其次, 它们都能划分不同的子网

实际上, 我们平常所说的局域网也可以说成是专用网, 因为严格来讲, 局域网中的主机是不能直接和外界通信的, 只能直接和自己网络的主机进行通信. 要和外界通信, 首先要有一个公网的地址, 这要借助 NAT, 那就是间接和外界通信了.

我们来看一下不同的地方, 不同的是, 在局域网中, 不管划分多少个子网, 子网中的主机物理位置都不会里的太远, 而在虚拟专用网中就不同了, 主机的距离离的非但远, 还不是一般的远, 可能跨国跨海.

在局域网中, 不同的主机通过物理专线连接路由器然后主机之间进行交流, 这在虚拟专用网中就不太实际了, 总不能我在太平洋东岸放个路由器连几台主机, 然后拉个海底电缆到西岸连几台主机吧, 虽然理论上是可行的. 于是, 借助现有的因特网线路资源, 就造就了虚拟专用网的”虚拟”特性.

数据安全

但是, 使用了因特网的线路, 数据也就暴露给了整个因特网, 一般机构内部的通信是不希望泄漏给外界的, 所以一般 VPN 网络都有加密的要求.

GRE 协议

待续…

搭建 VPN (PPTP)

  1. 安装 PPTPD
    • RHEL/CentOS
      rpm -i http://poptop.sourceforge.net/yum/stable/rhel6/pptp-release-current.noarch.rpm
      yum -y install pptpd
      

      实际上, 我也不知道为什么 CentOS 自己的源里没有 pptp 这个软件包.

    • Debian/Ubuntu

      # apt-get install pptpd
      
  2. 稍加配置
    • /etc/pptpd.conf

      添加如下两行:

      localip 192.168.80.1
      remoteip 192.168.80.224-238,192.168.80.245
      

      这里 localip 是 pptp server 的 ip 地址, remoteip 是每一个连接到 pptp server 的客户端能够获得的地址. 这里我故意使用了两种语法来指定 remoteip, 目的是向你展示一下.

    • /etc/ppp/chap-secrets

      添加几个用户吧

      # Secrets fro authentication using CHAP
      # client    server  secret      IP address
        username1 pptpd   passwd1      *
      

      这里 client 是用户名, server 是服务类型 — 我们这里是 pptpd, secret 是密码, IP address 允许连接到此 pptp server 的 IP, * 在这里表示任何.

    • /etc/ppp/options.pptpd

      添加如下两行:

      ms-dns 8.8.8.8
      ms-dns 8.8.4.4
      

      顺便解释一下, /etc/ppp/options.pptpd 这个文件是会被 /etc/pptpd.conf 包含的, /etc/ppp/options.pptpd 里有两个比较重要的两个参数:

      # Require the peer to authenticate itself using MS-CHAPv2 [Microsoft
      # Challenge Handshake Authentication Protocol, Version 2] authentication.
      require-mschap-v2
      # Require MPPE 128-bit encryption
      # (note that MPPE requires the use of MSCHAP-V2 during authentication)
      require-mppe-128
      # }}}
      

      启用了这两个参数后, 客户端也要启用这两个参数. 其中 mppe 需要响应的内核模块的支持. 如果你发现连接失败的话, 你可能需要安装并载入响应的模块.

Okay, 现在可以这样了: /etc/init.d/pptpd restart

  1. 还没完呢

    还要让系统允许 IP forward, 编辑 /etc/sysctl.conf 这个文件, 确保有这一行:

    net.ipv4.ip_forward = 1
    

    然后, 运行 sysctl -p.

  2. 路由配置

    这是最重要的一步, 因为这一步把我绊住过. 路由配置其实也很简单, 运行下面的命令就可以:

    # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 
    # iptables-save
    

    但不幸的是, 很多 openvz 因为缺少内核模块, 导致第一条命令无法使用, MASQUERADE 这个 taget 不被支持(相关的解释可以看我的有关 OpenVZ 的那片日志). 运行第一条命令就返回 no target/match 之类的错误. 因此我们采取的是另一种效果基本一样的写法:

    # iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -j SNAT --to-source _PUBLIC IP_
    

    这里, 192.168.80.0/24 是你为 vpn 分配的内网段, PUBLIC IP 就是你的 vpn server 的公网地址.

    另外, 你很可能还要加上这一句:

    # iptables -A FORWARD -p tcp --syn -s 192.168.80.0/24 -j TCPMSS --set-mss 1356
    

    这一句用来调整 TCP 报文的大小, 当你发现 vpn 无法正常工作时不妨加上这句试试.

客户端配置

  1. 安装 pptp 软件

    yum -y install pptp
    
  2. 加载 ppp_mppe 模块(没有的话则要先安装)

    这一步是因为服务器端启用了 mppe 加密, 如果上面配置服务器端时没有启用 mppe 加密, 可以不用加载这个模块.

    modprobe ppp_mppe
    
  3. 创建一个 /etc/ppp/peers/younameit 文件, 加入 pptp 连接参数:
    pty "pptp 198.211.104.17 --nolaunchpppd"
    name username1
    password passwd1
    remotename PPTP
    require-mppe-128
    

    其中, 198.211.104.17 为你的 pptp server 的公网 IP, name 为你在 pptp server 上配置的用户名, password 是该用户的密码, 其它参数不必修改.

  4. 拨号

    # pon younameit
    

    连接成功后, 运行 ifconfig 你就能看到一个新增的 ppp0 接口, 地址处于你在服务器上所配置的地址段(这里是 192.168.80.0/24)

  5. 修改默认路由

    # route del default
    # route add default gw 192.168.80.1
    

后记

由于数据是 128 bit 加密的, 所以与 OpenVPN 比起来 PPTP 更省 CPU, 而且你仍然可以通过额外的加密手段来使通信更安全.

Troubleshooting

  1. “Protocol not available” 的可能原因:
    • 客户端或者你的路由器没有开放 1723 端口权限.
    • GFW
  2. 依然上不了 twiiter, facebook 等网站

    这个可能是 dns 的问题.

    这个问题一般如果你在 linux 下使用 pon 连解 pptp 时会出现, pon 这样的工具不会自动设置我们提供的 dns (虽然上面我们在 pptp server 配置文件里提供的 dns), 而是仍然使用你的原始连接的运营商的 dns, 这些 dns 自然一般是不会解析 twitter 这些网站的

参考

  1. DigitalOcean 的 VPN 搭建教程: https://www.digitalocean.com/community/articles/how-to-setup-your-own-vpn-with-pptp
  2. 很经典的教程: http://www.putdispenserhere.com/pptp-vpn-setup-guide-for-a-debian-openvz-vps/
  3. Arch Linux Wiki 的教程, 我没有参考, 但是它的配置方式有些特别: https://wiki.archlinux.org/index.php/PPTP_Server
  4. 早期的 redhat 下的 pptp 教程, 具有历史意义: http://poptop.sourceforge.net/dox/redhat-howto.phtml
  5. 阐述了 Protocol not available 错误的可能原因: http://poptop.sourceforge.net/dox/gre-protocol-unavailable.phtml