FreeBSD下通过smartcl和sendEmail实现硬盘健康监控通知

FreeBSD下通过smartcl和sendEmail实现硬盘健康监控通知

通过smatctl检查硬盘的S.M.A.R.T.状态,并通过sendEmail向管理员发送邮件报告。

安装相关软件

smartctl

smartctl是非常全面的硬盘S.M.A.R.T.检查工具

cd /usr/ports/sysutils/smartmontools/ && make install clean

sendEmail

sendEmail是一款小巧便捷的邮件工具,支持smtp

cd /usr/ports/net/sendemail/&& make install clean && rehash

这2个软件安装后均无需额外配置即可实现本文功能

编写脚本

#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

  ##变量根据自己情况修改##
  #smtp服务器地址#
smtpadd="smtp.yourmail.com"
  #smtp登录用户#
smtpusr="username"
  #smtp用户密码#
smtppass="password"
  #发件人邮箱#
sender="sneder@yourmail.com"
  #收件人邮箱#
rcver="rcver@yourmail.com"
  #临时日志,用于记录smartctl输出信息#
tmplog="/tmp/my_disks_smart.log"
  #获取主机名,对服务器加以区分#
myhost=`hostname`

  ##列出本机所有硬盘##
dsks=`geom disk status\
| grep -Ev ‘cd[0-9]|^Name.*’\
| awk ‘{print "/dev/" $1}’`

  ##查询每个硬盘的S.M.A.R.T.健康简况,并保存在临时日志中##
for i in ${dsks}
do
smartinfo=`smartctl -H ${i}\
  | grep -Ev ‘^$|===|^smartctl|^Copyright’`
echo ${i} : ${smartinfo} >> ${tmplog}
done

  ##通过邮件报告硬盘健康简况##
email_notify=`sendEmail\
-f ${sender}\
-s ${smtpadd}\
-xu ${smtpusr}\
-xp ${smtppass}\
-t ${rcver}\
-u "disks_smart of ${myhost} at $(date +%Y-%m-%d)"\
-o message-file=${tmplog}\
| grep  sent\ successfully!`

  ##发送后的处理,成功即删除临时日志,失败则添加记录##
if [ ! "${email_notify}" ]
then
  echo "email send fail" >> ${tmplog}
  chmod 600 ${tmplog}
else
  rm ${tmplog}
fi
exit 0

给脚本执行权限

加入cron执行

编辑/etc/crontab

@daily root /path/to/your/script

原文链接:http://wiki.freebsdchina.org/howto/s/smartctl_sendemail

FreeBSD搭建PXE + ISCSI无盘站

FreeBSD搭建PXE + ISCSI无盘站

本示例通过PXE启动ISCSI TARGER磁盘上的WINDOWS XP SP3系统

注: tftp的目录为 /data/tftproot iscsi tagate目录为 /data/iscsi TFTP服务器IP为192.168.1.253 路由器为:192.168.1.254 ISCSI服务器为192.168.1.253

初始化以上目录

test# mkdir -p /data/tftproot
test# mkdir -p /data//data/iscsi

一、安装相关软件

1、配置TFTP

test# ee /etc/inetd.conf

增加

tftp    dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /data/tftproot
tftp    stream  tcp     wait    root    /usr/libexec/tftpd      tftpd -l -s /data/tftproot

修改 rc.conf

test# ee /etc/rc.conf

增加

inetd_enable="YES"

2、安装isc-dhcp服务

test#  cd /usr/ports/net/isc-dhcp41-server/
test#  make install clean

配置isc-dhcp

test#cd /usr/local/etc/ 
test#cp dhcpd.conf.sample dhcpd.conf
test#ee dhcpd.conf

增加

option space gpxe;
option gpxe-encap-opts code 175 = encapsulate gpxe;
option gpxe.bus-id code 177 = string;
subnet 192.168.1.0 netmask 255.255.255.0 {
  range dynamic-bootp 192.168.1.40 192.168.1.60;
  option broadcast-address 192.168.1.255;
  option routers 192.168.1.254;
  option root-path "192.168.1.253:/"; #TFTP的下载地址,这里主要为了下载一些初始化文件如 boot.kpxe和boot.gpxe文件
  next-server 192.168.1.253; #此为TFTP的服务器地址,如果不写,客户端就会出现tftp://0.0.0.0/xxx的下载地址
  if not exists gpxe.bus-id {
  filename "boot.kpxe"; #boot.kpxe是带带ISCSI驱动的启动文件,从http://www.rom-o-matic.net/gpxe/gpxe-1.0.1/contrib/rom-o-matic/下载
  }else{
  filename "boot.gpxe";#启动脚本
  }
  server-name "test";
  server-identifier 192.168.1.253;}

在/etc/rc.conf 增加

dhcpd_enable="YES"
dhcpd_ifaces="bge0" #bge0为你使用的网卡,我这里是bge0,使用ifconfig 来查找

3、安装iscsi服务 具本教程可以查看http://people.freebsd.org/~rse/iscsi/iscsi.txt

这里要注意的是生成的iscsi的文件不要超过4G,因为gpxe暂时只支持到4G以下的分区

修改 istgt.conf

ee /usr/local/etc/istgt/istgt.conf

[Global]
  Comment "Global section"
  NodeBase "192.168.1.253"
  PidFile /var/run/istgt.pid
  AuthFile /usr/local/etc/istgt/auth.conf
  #文件存放的目录我们这里为/data/iscsi
  MediaDirectory /data/iscsi
  LogFacility "local7"
  Timeout 30
  NopInInterval 20
  DiscoveryAuthMethod Auto
  MaxSessions 16
  MaxConnections 6
  MaxR2T 32
  MaxOutstandingR2T 16
  DefaultTime2Wait 2
  DefaultTime2Retain 60
  FirstBurstLength 262144
  MaxBurstLength 1048576
  MaxRecvDataSegmentLength 262144
  InitialR2T Yes
  ImmediateData Yes
  DataPDUInOrder Yes
  DataSequenceInOrder Yes
  ErrorRecoveryLevel 0
[UnitControl]
  Comment "Internal Logical Unit Controller"
  AuthMethod CHAP Mutual
  AuthGroup AuthGroup10000
  Portal UC1 127.0.0.1:3261
  Netmask 127.0.0.1
[PortalGroup1]
  Comment "ANY IP"
  Portal DA1 0.0.0.0:3260
[InitiatorGroup1]
  Comment "Initiator Group1"
  InitiatorName "ALL"
  Netmask 192.168.1.0/24
[LogicalUnit1]
  Comment "OS VM XP"
  #TargetName 的内容就是gPxe后面用到指令的 iscsi:192.168.1.253::::192.168.1.253:vmwinxp 一至
  TargetName vmwinxp
  TargetAlias "VM WIN XP"
  Mapping PortalGroup1 InitiatorGroup1
  AuthMethod None
  AuthGroup AuthGroup1
  UseDigest Auto
  UnitType Disk
  LUN0 Storage /data/iscsi/vmwinxp 3GB

二、配置相关文件

1、在/data/tftpboot目录下创建boot.gpxe文件,内容如下

#!gpxe
sanboot iscsi:192.168.1.253::::192.168.1.253:vmwinxp

第一个192.168.1.253表示ISCSI服务所在的服务器
第二个192.168.1.253其实我这里取巧了,为了实验成功,避免使用了Initiator node name

2、从http://www.rom-o-matic.net/gpxe/gpxe-1.0.1/contrib/rom-o-matic/下载kpxe

此网页里有多个选择,我们选择kpxe,并选择undi,然后[get image]

把下载的文件改名成boot.gpxe上传到/data/tftproot目录

3、生成/data/iscsi/vmwinxp文件(3G)

test# dd if=/dev/zero of=/data/iscsi/vmwinxp bs=512 count=6291456

每块512个字节,共6291456块,合计3G

三、使用vm搭建一个XP

使用VM创建一个3G大小空间的虚拟机,并正常安装XP

安装完后,需要在XP上再加装 Initiator-2.08-boot-build3825-x86chk.exe (从微软官网上下载,记得是chk不是fre)

再加装sanbootconf.msi,从http://etherboot.org下载

安装完后,去掉的VM的硬盘,从网络启动就可以了

原文链接:http://wiki.freebsdchina.org/doc/pxe/gpxe/iscsi

在GPT盘的ZFS上安装FreeBSD8

在GPT盘的ZFS上安装FreeBSD8

本文参考了Installing FreeBSD Root on ZFS using GPT

通过DVD或者Memstick启动,选择Fixit。

硬盘gpt分区

创建gpt盘

gpart create -s gpt ad0

创建引导区

gpart add -s 64K -t freebsd-boot ad0

创建swap分区(标记label,避免将来硬盘接口改变导致无法识别)

gpart add -s 8G -t freebsd-swap -l swap0 ad0

创建用于zfs的分区

gpart add -t freebsd-zfs ad0

写入freebsd的zfs引导

gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad0

创建zpool

加载zfs模块

kldload /mnt2/boot/kernel/opensolaris.ko
kldload /mnt2/boot/kernel/zfs.ko

创建zpool

mkdir /boot/zfs
zpool create zroot ad0p3
zpool set bootfs=zroot zroot

创建zfs分区(计划通过md加载/tmp,所以在这里没有建立/tmp)

zfs create zroot/var
zfs create zroot/usr
zfs create zroot/home

安装系统

export DESTDIR="/zroot"
cd /dist/8.*
cd base && ./install.sh
cd ../lib32 && ./install.sh
cd ../manpages && ./install.sh
cd ../src && ./install.sh all
cd ../kernels && ./install.sh generic
cp -Rlpv /zroot/boot/GENERIC/* /zroot/boot/kernel/

配置基础系统和zfs引导配置

chroot /zroot

基础配置文件

/etc/src.conf

LOADER_ZFS_SUPPORT=YES

/boot/loader.conf

zfs_load="YES"
vfs.root.mountfrom="zfs:zroot"
vfs.root.mountfrom.options="rw"
vfs.zfs.prefetch_disable=0

/etc/rc.conf

hostname="gptzfsboot.freebsd.org"
defaultrouter="10.0.0.1"
ifconfig_re0="inet 10.0.0.1 netmask 255.255.255.0"
tmpmfs="YES"
tmpsize="512M"
zfs_enable="YES"

/etc/resolv.conf

nameserver 8.8.8.8

/etc/fstab

/dev/gpt/swap0 none swap sw 0 0

编译安装支持zfs的bootloader

mount -t devfs devfs /dev
export DESTDIR=""
cd /usr/src/sys/boot/
make obj && make depend && make
cd i386/loader
make install

基础的设置命令

passwd

tzsetup

cd /etc/mail && make aliases

退出chroot

umount /dev
exit

完成安装

cp /boot/zfs/zpool.cache /zroot/boot/zfs/
export LD_LIBRARY_PATH=/mnt2/lib
zfs unmount -a
zfs set mountpoint=legacy zroot
zfs set mountpoint=/usr zroot/usr
zfs set mountpoint=/var zroot/var
zfs set mountpoint=/home zroot/home
exit

原文链接:http://wiki.freebsdchina.org/doc/z/8_gpt_zfs

FreeBSD下安装lighttpd支持php

FreeBSD下安装lighttpd支持php

有不恰当的地方欢迎指正By:ghw(gehaowu@gmail.com)

安装lighttpd

记得在SPAWNFCGI前打勾

[X] SPAWNFCGI  Depend on spawn-fcgi utility
#cd /usr/ports/www/lighttpd
#make config
#make install clean

安装php

模块自己看自己需要

#cd /usr/ports/lang/php5/ && make install clean
#cd /usr/ports/lang/php5-extensions/ && make install clean

配置lighttpd

编辑/usr/local/etc/lighttpd/lighttpd.conf,添加以下内容:

server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
  (( "socket" => "/tmp/php-fastcgi.socket",
    "bin-path" => "/usr/local/bin/php-cgi",
     "min-procs" => 1,
     "max-procs" => 1,
     "max-load-per-proc" => 4,
     "bin-environment" => (
     "PHP_FCGI_CHILDREN" => "2",
    #"PHP_FCGI_CHILDREN" => "64",//这里进程数自己看着办
        "PHP_FCGI_MAX_REQUESTS" => "10000" ),
      "bin-copy-environment" => (
        "PATH", "SHELL", "USER" ),
      "broken-scriptfilename" => "enable",
     "idle-timeout" => 20
  ))
)

设置服务

启动lighttpd

#echo ‘lighttpd_enable="YES"’ >> /etc/rc.conf
#/usr/local/etc/rc.d/lighttpd start

网站跟目录是修改这行

server.document-root = "/usr/local/www/data/"

原文链接:http://wiki.freebsdchina.org/howto/n/php_fastcgi_lighttpd

在FreeBSD上运行PostgreSQL数据库

在 FreeBSD 上运行PostgreSQL数据库

概要

* PostgreSQL是自由的对象-关系数据库服务器(数据库管理系统),在灵活的BSD-风格许可证下发行。它在其他开放源代码数据库系统(比如MySQL和Firebird),和专有系统比如Oracle、Sybase、IBM的DB2和Microsoft SQL Server之外,为用户又提供了一种选择。本文主要整理了在 FreeBSD 上运行PostgreSQL数据库的详细安装过程。

配置FreeBSD内核

  options         SYSVSHM
  options         SYSVSEM
  options         SYSVMSG
  options         SHMMAXPGS=65536
  options         SEMMNI=40
  options         SEMMNS=240
  options         SEMUME=40
  options         SEMMNU=120

从Posts安装PostgreSQL

#cd /usr/ports/databases/postgresql90-server/ && make install

配置PostgreSQL

往rc.conf里增加启动项

postgresql_enable="YES"

初始化数据库

# /usr/local/etc/rc.d/postgresql initdb

终端回显

tomato# /usr/local/etc/rc.d/postgresql initdb
属于此数据库系统的文件宿主为用户 "pgsql".
此用户也必须为服务器进程的宿主.
数据库簇将带有一下 locales 初始化
  COLLATE:  C
  CTYPE:    zh_CN.UTF-8
  MESSAGES: zh_CN.UTF-8
  MONETARY: zh_CN.UTF-8
  NUMERIC:  zh_CN.UTF-8
  TIME:     zh_CN.UTF-8
initdb: 无法为语言环境"zh_CN.UTF-8" 找到合适的编码配置
缺省的文本搜索配置将会被设置到"simple"

创建目录 /usr/local/pgsql/data … 成功
正在创建子目录 … 成功
选择默认最大联接数 (max_connections) … 100
选择默认共享缓冲区大小 (shared_buffers) … 32MB
创建配置文件 … 成功
在 /usr/local/pgsql/data/base/1 中创建 template1 数据库 … 成功
初始化 pg_authid …  成功
初始化dependencies … 成功
创建系统视图 … 成功
正在加载系统对象描述 … 成功
创建字符集转换 … 成功
正在创建字典 … 成功
对内建对象设置权限 … 成功
创建信息模式 … 成功
loading PL/pgSQL server-side language … 成功
清理数据库 template1 … 成功
拷贝 template1 到 template0 … 成功
拷贝 template1 到 template0 … 成功

警告: 为本地连接启动了 "trust" 认证.
你可以通过编辑 pg_hba.conf 更改或你下
次运行 initdb 时使用 -A 选项.

成功. 您现在可以用下面的命令运行数据库服务器:

    /usr/local/bin/postmaster -D /usr/local/pgsql/data
或者
    /usr/local/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start

tomato#

运行PostgreSQL服务

# /usr/local/etc/rc.d/postgresql start

允许其他非本地IP链接

vi /usr/local/pgsql/data/postgresql.conf
   listen_addresses = ‘*’

修改用户密码加密方式

vi /usr/local/pgsql/data/pg_hba.conf
    host  all  all  10.0.1.0/24  md5

增加数据库用户

    #su pgsql
    $ createuser -sdrP pgsqldb

安装phpPgAdmin,网页版PGSQL管理工具

    #cd /usr/ports/databases/phppgadmin
    #make install clean
    #ln -s /usr/local/www/phpPgAdmin /usr/local/www/data/

通过http://localhost/phppgadmin访问

原文链接:http://wiki.freebsdchina.org/doc/d/pgsql_running

FreeBSD中VirtualBox安装手册

本文摘自FreeBSD手册

在过去的几年中 FreeBSD 并没有任何可用的并被官方支持的虚拟化解决方案。 一些用户曾时使用过利用 Linux 二进制兼容层运行的 VMware 陈旧并多半已过时的版本 (比如 emulators/vmware3)。 在 FreeBSD 7.2 发布不久, Sun 开源版本 (Open Source Edition OSE) 的 VirtualBox 作为一个 FreeBSD 原生的程序出现在了 Ports Collection 中。

VirtualBox 是一个开发非常活跃, 完全虚拟化的软件, 并且可在大部份的操作系统上使用, 包括 Windows, Mac OS, Linux 和 FreeBSD。同样也能把 Windows 或 UNIX 作为客户系统运行。 它有一个开源和一个私有两种版本。 从用户的角度来看, OSE 版本最主要的限制也许是缺乏 USB 的支持。 其他更多的差异可以通过链接 http://www.virtualbox.org/wiki/Editions 查看 “Editions” 页面。 目前, FreeBSD 上只有 OSE 版本可用。

安装 VirtualBox

VirtualBox 已作为一个 FreeBSD port 提供, 位于 emulators/virtualbox-ose, 可使用如下的命令安装:

# cd /usr/ports/emulators/virtualbox-ose
# make install clean

在配置对话框中的一个有用的选项是 GusetAdditions 程序套件。 这些在客户操作系统中提供了一些有用的特性, 比如集成鼠标指针 (允许在宿主和客户系统间使用鼠标, 而不用事先按下某个特定的快捷键来切换) 和更快的视频渲染, 特别是在 Windows 客户系统中。 在安装了客户操作系统之后, 客户附加软件可在 Devices 菜单中找到。

在第一次运行 VirtualBox 之前还需要做一些配置上的修改。port 会安装一个内核模块至 /boot/modules 目录, 此模块需要事先加载:

# kldload vboxdrv

可以在 /boot/loader.conf 中加入以下的配置使此模块在机器重启之后能自动加载:

vboxdrv_load="YES"

在 3.1.2 之前版本的 VirtualBox 需要挂接 proc 文件系统。 在新版本中不再有此要求, 因为它们使用了由 sysctl(3) 库提供的功能。

当使用旧版本的 port 时, 需要使用下面的步骤来挂载 proc:

# mount -t procfs proc /proc

为了使配置能在重启后始终生效, 需要在 /etc/fstab 中加入以下这行:

proc   /proc   procfs  rw  0   0

注意: 如果在运行 VirtualBox 的终端中发现了类似如下的错误消息:

VirtualBox: supR3HardenedExecDir: couldn’t read "", errno=2 cchLink=-1
此故障可能是由 proc 文件系统导致的。 请使用 mount 命令检查文件系统是否正确挂载。

在安装 VirtualBox 时会自动创建 vboxusers 组。 所有需要使用 VirtualBox 的用户必须被添加为此组中的成员。 可以使用 pw 命令添加新的成员:

# pw groupmod vboxusers -m yourusername

运行 VirtualBox, 可以通过选择你当前图形环境中的 Sun VirtualBox, 也可以在虚拟终端中键入以下的命令:

% VirtualBox

获得更多有关配置和使用 VirtualBox 的信息, 请访问官方网站 http://www.virtualbox.org。 鉴于 FreeBSD port 非常新, 并仍处于开发状态。请查看 FreeBSD wiki 上的相关页面 http://wiki.FreeBSD.org/VirtualBox 以获取最新的信息和故障排查细则。

FreeBSD 8.0开始官方支持VirtualBox虚拟机了

FreeBSD 从8.0开始终于有官方支持的宿主虚拟服务了VirtualBox。 VirtualBox有一个开源版本和一个私有版本。

FreeBSD运行的是开源版本(OSE 版本),这个版本不支持的功能主要是:

    USB
    OpenGL support

基本安装见 FreeBSD操作手册[URL:http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/virtualization-host.html]。

CD/DVD使用:

在/etc/devfs.conf中设置:

  perm cd0 0666
  perm xpt0 0666
  perm pass0 0666

网络配置:
默认为NAT模式;在/boot/loader.conf配置如下;

    vboxdrv_load="YES"
    atapicam_load="YES" 

如果使用网桥模式,在/boot/loader.conf配置如下:

    vboxdrv_load="YES"
    vboxnetflt_load="YES"
    atapicam_load="YES"

atapicam模块作用是启动CD/DVD支持,apapicam模块需要在vboxdrv模块之后运行。

原文链接:http://wiki.freebsdchina.org/software/v/virtualbox

ZFS v13 在FreeBSD 8.0 rc2中的实践

ZFS v13 在FreeBSD 8.0 rc2中的实践

属主:ZoomQuiet

参考:存储的规划[URL:http://www.bsdart.org/archives/20101226/518.html]

概述

本文包含 FreeBSD 8.0rc2 环境中一个 raidz-2+hot spares 配置和测试实例,为其它有意使用 ZFS 代替raid* 来保卫数据安全的SA, 在进行硬盘和 zpool 规划时,提供了一个足够友好的参考。

条件

* OS: FreeBSD svnmain.s.kingsoft.net 8.0-RC1 FreeBSD 8.0-RC1 #0: Thu Sep 17 18:50:57 UTC 2009 root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64

目标

在足够的硬盘数量支持下:

1,尽可能的使用多的空间
2,运用双奇偶检验来确保数据写安全
3,附加一个热备硬盘来冗灾数据盘的坏损
4,系统分区坏损时也可以立即恢复

硬件

Dell? PowerEdge? 2900 III
6x500G SAS 硬盘
6G 内存

规划

ZFS v13 在FreeBSD 8.0 rc2中的实践

意图

6x300G SAS 空间划分相同=>4G+496G 两部分

    6x4G 空间
    >>3组作系统空间,进行相同的分区,并定期进行 dd 备份
    >>3组作swap 给系统提供 16G 缓存,刚好是内存的两倍
    6x496G 空间
    >>1.5T 可用(3+2) RAID-Z2+1 hot spare

部署

简要说明在部署过程中的关键操作和思路

BIOS

    因为,下单时考虑不周,主机带了个绕不过去的 RAID 卡
    所以,必须先在 BIOS 中使用 raid0 策略对所有硬盘进行配置,否则 FreeBSD 安装程序无法加载硬盘

FreeBSD

* 使用 sysinstall 标准的进行 BSD 安装 * 注意对预备进行系统冗灾备份的分区要进行大小一致的划分(bsdlabel) * 每个分区的大小是精心测算过的:

1,/ → ??Mb 因为
2,/tmp → ??Mb 因为
3,/var → ??Mb 因为
4,/usr → ??Mb 因为

* 这样确保系统在4G 空间中就可以完全运行起来!

geom label

因为将来各个硬盘都有可能先杯具,所以,不能依赖盘序会孬 BIOS 自动调整的 bsd卷标
使用 geom label 进行固化!

##重启系统,在 loader 提示符下键入 4 启动到单用户模式
# glabel label rootfs /dev/mfid0s1a
GEOM_LABEL: Label for provider /dev/mfid0s1a is label/rootfs
# glabel label var /dev/mfid0s1d
GEOM_LABEL: Label for provider /dev/mfid0s1d is label/var
# glabel label usr /dev/mfid0s1f
GEOM_LABEL: Label for provider /dev/mfid0s1f is label/usr
# glabel label tmp /dev/mfid0s1e
GEOM_LABEL: Label for provider /dev/mfid0s1e is label/tmp
# glabel label swap /dev/mfid0s1b
GEOM_LABEL: Label for provider /dev/mfid0s1b is label/swap
# glabel label disk0 /dev/mfid0s2
GEOM_LABEL: Label for provider /dev/mfid0s2 is label/disk0

## 根据规划对所有硬盘的所有分区进行固定卷标
# cat /etc/fstab
… 类似
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/label/swap         none            swap    sw              0       0
/dev/label/rootfs       /               ufs     rw              1       1
/dev/label/tmp          /tmp            ufs     rw              2       2
/dev/label/usr          /usr            ufs     rw              2       2
/dev/label/var          /var            ufs     rw              2       2
##正常重启后观察:
$ sudo mount
/dev/label/rootfs on / (ufs, local)
/dev/label/tmp on /tmp (ufs, local, soft-updates)
/dev/label/usr on /usr (ufs, local, soft-updates)
/dev/label/var on /var (ufs, local, soft-updates)

系统的 dd 备份

为确保备用系统分区随时可用,需要进行精密的复制:

#格式
sudo dd if= “系统分区全路径” of=“备份分区全路径”
#本例
sudo dd if=rootfs of=rootfs1
sudo dd if=rootfs of=rootfs2

要将所有系统分区都进行复制

ZFS

建立 3+2 RAID-Z2+1 host spare

$sudo zfs create svnpool raidz2 disk[0-4] spare disk5
$ zpool status
  pool: svnpool
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Thu Nov 12 17:35:09 2009
config:

    NAME             STATE     READ WRITE CKSUM
    svnpool          ONLINE       0     0     0
      raidz2         ONLINE       0     0     0
        label/disk0  ONLINE       0     0     0  27.5K resilvered
        label/disk1  ONLINE       0     0     0  29K resilvered
        label/disk5  ONLINE       0     0     0  44K resilvered
        label/disk3  ONLINE       0     0     0  28.5K resilvered
        label/disk4  ONLINE       0     0     0  28K resilvered
    spares
      label/disk2    AVAIL 

$ zpool upgrade -v
This system is currently running ZFS pool version 13.

演习

通过实地热插拔硬盘来模拟实际常见灾难来明确在 ZFS 保卫中的系统和数据恢复

系统盘崩溃

模拟

1,先关机,拔除系统硬盘
2,开机后,无法引导

模拟成功…

处置

1,重启,进入 BIOS
2,调整硬盘启动顺序,指定 disk4/5 任意一块(有系统分区在的)
3,用光盘重启,使用 sysinstall—label功能手动挂载分区表 并写入启动硬盘 M键挂载分区,W写入更改
    第1分区 → /
    第2分区 → /tmp
    第3分区 → /var
    第4分区 → /usr
4,重启,将正常引导,而且使用 zpool status 测试,明确存储池也正常

处置成功,总用时 < 25分钟

数据盘崩溃

模拟

1,拔除任何一颗数据硬盘 (disk1~5)
2,系统丢出错误,重启
3,zfs 将观察到 DEGRADED 状态

模拟成功…

处置

1,先撤出故障盘

$ sudo zpool detach svnpool /dev/label/disk2
zpool status
  pool: svnpool
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Thu Nov 12 17:35:09 2009
config:

        NAME             STATE     READ WRITE CKSUM
        svnpool          ONLINE       0     0     0
          raidz2         ONLINE       0     0     0
            label/disk0  ONLINE       0     0     0  27.5K resilvered
            label/disk1  ONLINE       0     0     0  29K resilvered
            label/disk5  ONLINE       0     0     0  44K resilvered
            label/disk3  ONLINE       0     0     0  28.5K resilvered
            label/disk4  ONLINE       0     0     0  28K resilvered
        spares
          label/disk5      INUSE     currently in use

2,FreeBSD 中的ZFS 当前无法自动激活热备件启用,手动替换之
格式: zpool replace svnpool ‘故障盘’ ‘热备件’

$ sudo zpool replace svnpool /dev/label/disk2 /dev/label/disk5
$ zpool status
  pool: svnpool
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Thu Nov 12 17:35:09 2009
config:

        NAME             STATE     READ WRITE CKSUM
        svnpool          ONLINE       0     0     0
          raidz2         ONLINE       0     0     0
            label/disk0  ONLINE       0     0     0  27.5K resilvered
            label/disk1  ONLINE       0     0     0  29K resilvered
            label/disk5  ONLINE       0     0     0  44K resilvered
            label/disk3  ONLINE       0     0     0  28.5K resilvered
            label/disk4  ONLINE       0     0     0  28K resilvered

3,待修复故障硬盘或在同一物理位置替换(同大小)物理硬盘之后,手工追加热备件

$ sudo zpool add svnpool spare /dev/label/disk2
$ zpool status
  pool: svnpool
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Thu Nov 12 17:35:09 2009
config:

        NAME             STATE     READ WRITE CKSUM
        svnpool          ONLINE       0     0     0
          raidz2         ONLINE       0     0     0
            label/disk0  ONLINE       0     0     0  27.5K resilvered
            label/disk1  ONLINE       0     0     0  29K resilvered
            label/disk5  ONLINE       0     0     0  44K resilvered
            label/disk3  ONLINE       0     0     0  28.5K resilvered
            label/disk4  ONLINE       0     0     0  28K resilvered
        spares
          label/disk2    AVAIL

4,安全起见 zpool clear ,并zpool status -x检查

处置完毕, 用时 10~15分钟

TODO

1,如何对 zpool 的变化进行自动报警?
2,如何自动使用 hot spare 替代离线的硬盘?
3,4G 的系统空间不足时,如何将耗空间的 目录链接到 zpool 中,而又保障依然可以正常用后备系统盘快速恢复?

讨论

这样是否最合理?
如果该主机只用以提供 SVN 服务,还有什么可以优化的?
如果该主机只用以提供 Samba 服务,还有什么可以优化的?
如果该主机只用以提供 ftp 服务,还有什么可以优化的?
如果该主机只用以提供 PostgreSQL 服务,还有什么可以优化的?
如果该主机用以提供 综合 服务,还有什么需要注意的?

原文链接:http://wiki.freebsdchina.org/doc/z/zfsusageforbsd8.0

FreeBSD ZFS存储服务器的规划

FreeBSD ZFS存储服务器的规划

注意:本文内容已经过时。TODO:需要进行一部分改写,包括:zpool根fs不应挂载、关于如何配置纯ZFS系统的介绍、4K扇区等话题。

FreeBSD 7.0具备以 ZFS 作为根文件系统的能力。本文将以一台有6块硬盘的服务器介绍从FreeBSD/amd64 7.0 LiveFS光盘(随发行版发行的LiveCD系统)全新安装一份FreeBSD,并使用ZFS作为根目录的具体方法。

存储的规划

我们假定有6块750GB的SATA硬盘,ad0-ad5;系统有8GB RAM,希望作为存储服务器。在尽量保证数据完整性和性能的前提下,我们会希望有:

    使用五块硬盘作为RAIDZ1或RAIDZ2卷;一块硬盘作为备盘;
    系统的引导和配置信息保存2份,以便当系统无法引导时进行灾难恢复;
    适当大小的 swap 空间,在本例中,我们选择的容量是 8GB。

分区如下所示:

FreeBSD ZFS存储服务器的规划

说明:对于新系统,可以使用 GPT 分区、纯ZFS。此时,分配格局大致如下:

FreeBSD ZFS存储服务器的规划

初始化命令为:

gpart create -s gpt ad0
gpart add -s 94 -t freebsd-boot ad0
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ad0
gpart add -s 4194304 -t freebsd-swap -l swap0 ad0
gpart add -t freebsd-zfs -l disk0 ad0

准备

使用 LiveFS 光盘引导之后会自动进入sysinstall,选择 Fixit → CDROM。进入Fixit shell,会看到这样的提示符:

Fixit#

这时,我们可以开始分区了。首先,初始化覆盖所有磁盘的slice:

fdisk -IB /dev/ad0
fdisk -I /dev/ad1
fdisk -I /dev/ad2
fdisk -I /dev/ad3
fdisk -I /dev/ad4
fdisk -IB /dev/ad5

接下来在这些磁盘上初始化bsdlabel。由于 bsdlabel 需要调用 vi(透过 EDITOR 环境变量),而 sysinstall会将这个环境变量设置为 /mnt2/stand/vi,因此需要改一下:

unsetenv EDITOR
bsdlabel -wB /dev/ad0s1
bsdlabel -w /dev/ad1s1
bsdlabel -w /dev/ad2s1
bsdlabel -w /dev/ad3s1
bsdlabel -w /dev/ad4s1
bsdlabel -wB /dev/ad5s1

分别编辑这些labels。对于ad0和ad5,类似这样:

8 partitions:
#           size        offset        fstype
a:  4194304              16      unused
c:              *                0       unused
d:             *                 *       unused

对于ad1-ad4,类似这样:

8 partitions:
#           size        offset        fstype
b:  4194304              16      unused
c:              *                0       unused
d:             *                 *       unused

我们希望不因为盘序问题导致混乱,因此会用到 geom label。在本次启动时,我们并不立即创建 ZFS,而只是初始化一个用于启动的 UFS 分区:

newfs -L boot /dev/ad0s1a
mount -o async /dev/ufs/boot /mnt

下面,从光盘上复制一系列文件到这个分区上:

cd /mnt
cp -pR /mnt2/*bin /mnt2/boot /mnt2/etc /mnt2/lib* /mnt2/usr /mnt2/var .
mkdir dev

接下来进行初步的配置:

cd /mnt/boot
rm loader.conf mfsroot.gz
echo "/dev/ufs/boot / ufs rw 0 0" > /mnt/etc/fstab
echo "/dev/ad1s1b none swap sw 0 0" >> /mnt/etc/fstab
echo "/dev/ad2s1b none swap sw 0 0" >> /mnt/etc/fstab
echo "/dev/ad3s1b none swap sw 0 0" >> /mnt/etc/fstab
echo "/dev/ad4s1b none swap sw 0 0" >> /mnt/etc/fstab
touch /etc/rc.conf
cd /
umount /mnt
tunefs -n enable /dev/ufs/boot

现在就可以从硬盘引导系统了。

创建 ZFS

从硬盘引导之后,以 root 身份登录。首先,我们为将要加入 zpool 的磁盘指定 GEOM label:

glabel label disk0 /dev/ad0s1d
glabel label disk1 /dev/ad1s1d
glabel label disk2 /dev/ad2s1d
glabel label disk3 /dev/ad3s1d
glabel label disk4 /dev/ad4s1d
glabel label disk5 /dev/ad5s1d

然后,在其上建立 zpool,我们将这个zpool命名为tank,将disk0-4作为其raidz1成员,并使用disk5作为热备盘:

zpool create tank raidz /dev/label/disk[0-4] spare /dev/label/disk5

此时,这个zpool会被自动挂接到 /tank。如果CPU比较快,通常启用压缩会改善性能:

zfs set compression=on tank

复制文件

首先需要为现在我们用来引导的这个 UFS 卷指定一个归宿:

mkdir /tank/bootdir

系统引导之后,需要访问某些 /boot 的内容:

cd /tank
ln -s bootdir/boot boot

复制 / 到 /tank:

cd /
cp -pR /*bin /etc /lib* /usr /var /tank
mtree -deUf /etc/mtree/BSD.root.dist -p /tank
mtree -deUf /etc/mtree/BSD.var.dist -p /tank/var
chmod u+s,g+s /tank/usr/bin/su

配置以ZFS作为 / 启动,修改 /boot/loader.conf 使其包含:

zfs_load="YES"
vfs.root.mountfrom="zfs:tank"

将 zpool 上的 ZFS 挂接方式改为 legacy:

zfs set mountpoint=legacy tank

在重启之前,需要修改 /etc/fstab:

/dev/ufs/boot /bootdir ufs rw 0 0

重新启动系统。此时根目录应该就是 zfs 了,接下来,可以在 /etc 中进行配置。

此后,建议使用通常的方式联编系统,以确保文件/目录权限的正确性。

配置的备份和同步

我们前面将 /dev/ad5s1a 留作配置备份卷。这个卷在未来出问题的时候应该是可以帮助你启动的,现在我们来对它进行初始化:

newfs -U -L altboot /dev/ad5s1a
mkdir -p /altbootdir

接下来我们需要将 /bootdir 的内容复制过去:

mount /dev/ufs/altboot /altbootdir
cd /bootdir
tar cf – * | tar xf – -C /altbootdir

平时将 /altbootdir 卷卸下即可。当对系统的配置进行较大的变动,特别是对 zpool 内容进行变动或升级内核之后,应再次重复前面的复制步骤。

原文链接:http://wiki.freebsdchina.org/doc/z/zfs_root

FreeBSD 7.3下Nginx+PHP(php-fpm)配置笔记

FreeBSD 7.3下Nginx+PHP(php-fpm)配置笔记

都说Nginx的性能比Apache NB,找了很多相关的安装资料,终于实现完成了FreeBSD+Nginx+PHP的配置。网上多数Nginx+PHP的配置都是使用的spawn-fcgi,需要额外安装lighttpd或者单独安装spawn-fcgi,其实PHP自带的php-fpm也挺好用的。

一、安装Nginx

# cd /usr/ports/www/nginx
# make install clean

选上自己需要的模块

FreeBSD Nginx安装

二、安装PHP

# cd /usr/ports/lang/php52
# make install clean

记得选择FASTCGI和FPM模块

FreeBSD PHP5安装

然后安装php52-extensions

# cd /usr/ports/lang/php52-extensions
# make install clean

根据需要选择相关的模块

三、配置php-fpm

# vi /usr/local/etc/php-fpm.conf
根据实际环境修改如下参数:

<value name=”listen_address”>127.0.0.1:9000</value>
<value name=”owner”>www</value>
<value name=”group”>www</value>
<value name=”mode”>0666</value>
<value name=”max_children”>5</value>
<value name=”request_slowlog_timeout”>0s</value>
<value name=”max_requests”>500</value>

四、启动php-fpm

# vi /etc/rc.conf

php_fpm_enable=”YES”

# /usr/local/etc/rc.d/php_fpm start

五、配置Nginx

user  www www;
worker_processes  8;

events {
use kqueue;
worker_connections  51200;
}

http {
include       mime.types;
default_type  application/octet-stream;

server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;

sendfile        on;
tcp_nopush     on;
keepalive_timeout  65;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

gzip  on;
gzip_min_length  1k;
gzip_buffers     4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types       text/plain application/x-javascript text/css application/xml;
gzip_vary on;

tcp_nodelay on;

server {
listen      80;
server_name  www.bsdart.org;
root  /data/web/htdocs;
index index.htm index.html index.php;

location ~ .*\.(php|php5)?$ {
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
include        fastcgi.conf;
}

error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   html;
}
}
}

五、启动Nginx

# vi /etc/rc.conf

nginx_enable=”YES”

# /usr/local/etc/rc.d/nginx start