制作便携式系统维护盘

本文主要描述如何在FreeBSD系统下使用独立的USB存储设备制作便携式系统维护盘。
制作完成的系统维护盘除了包含完整的FreeBSD操作系统外,还能够实现以下主要功能:

  • 修复或安装FreeBSD
  • 引导进入其他各种LiveCD
  • 安装其他操作系统

考虑到实用及便携性需求,建议使用大小为32G、接口为USB 3.0的U盘制作(以下简称U盘)。

1. 准备分区

 

1.1 获取设备信息

插上U盘后,首先确认其设备路径:

# camcontrol devlist 
<ST31000528AS CC46>                at scbus0 target 0 lun 0 (ada0,pass0)
<ST31000528AS CC46>                at scbus4 target 0 lun 0 (ada1,pass1)
<ALPHACHI USB DISK>                at scbus7 target 0 lun 0 (da0,pass2)

在这里,U盘对应的设备路径为/dev/da0;由此可以获取U盘的基本信息:

# diskinfo -v /dev/da0
/dev/da0
        512             # sectorsize
        31610372096     # mediasize in bytes (29G)
        61739008        # mediasize in sectors
        0               # stripesize
        0               # stripeoffset
        3843            # Cylinders according to firmware.
        255             # Heads according to firmware.
        63              # Sectors according to firmware.
        1292621180710063        # Disk ident.

这里需要注意sectorsize与stripesize的数值:前者为逻辑扇区大小,后者为物理扇区大小,两者单位均为字节;而只有stripesize为4096的设备在分区时才需要设置4K对齐。

1.2 创建分区

有了这些信息,即可开始分区:

# gpart destroy -F /dev/da0         清除U盘之前的分区信息
da0 destroyed
# gpart create -s MBR /dev/da0      创建新的MBR分区表
da0 created
# gpart add -t fat32 -s 4g da0      添加一个大小为4GB的FAT32分区    
da0s1 added
# gpart add -t freebsd da0          剩余分区将用于安装FreeBSD
da0s2 added
# gpart create -s BSD /dev/da0s2    在剩余分区上创建新的BSD分区表
da0s2 created
# gpart add -t freebsd-ufs da0s2    添加UFS分区
da0s2a added
# gpart show da0                    查看创建的MBR分区表
=>      63  62530561  da0  MBR  (29G)
        63   8388576    1  fat32  (4G)
   8388639  54141948    2  freebsd  (25G)
  62530587        37       - free -  (18k)

# gpart show da0s2                  查看创建的BSD分区表
=>       0  54141948  da0s2  BSD  (25G)
         0  54141948      1  freebsd-ufs  (25G)0

这里需要注意两点:

  • 为了使第一个FAT32分区能够在绝大多数Windows系统下使用,应该创建MBR分区表而非GPT分区表。
  • 直接将FreeBSD安装至第二个分区上会无法引导,需要在第二个分区中嵌套一个BSD分区表。

更多有关分区的信息,详见分配磁盘空间

2. 安装引导管理器

由于FreeBSD自带的引导管理器无法满足稍后的需求,在这里需要使用GRUB 2。

2.1 安装GRUB 2

首先通过Ports安装GRUB 2:

# portsnap fetch update
...    (省略无关输出,下同)
# cd /usr/ports/sysutils/grub2/
# make install clean
...

然后将GRUB 2的引导管理器安装至U盘:

# newfs_msdos -L USB /dev/da0s1                  格式化分区并添加卷标USB以便于之后挂载
...
# mount_msdosfs /dev/da0s1 /mnt/                 这里不能使用卷标挂载,否则GRUB 2安装后会无法引导
# grub-install --root-directory=/mnt /dev/da0    安装GRUB 2的引导管理器
...

2.2 基本配置

安装完成后,创建配置文件/mnt/boot/grub/grub.cfg:

set timeout=60            引导菜单超时秒数
set pager=1               输出内容过多时自动分屏
insmod part_gpt           预读模块part_gpt以识别使用GPT分区方案的存储设备

menuentry "Continue" {    跳过GRUB 2引导管理器
    set root=(hd1)
    chainloader +1
}

menuentry "Reboot" {      重启
    reboot
}

menuentry "Shutdown" {    关机
    halt
}

目前仅需以上这些配置即可,编辑完成后执行下列命令:

# rm /mnt/boot/grub/device.map    device.map是根据当前机器自动生成的,可以删除
# mkdir /mnt/iso/                 此目录用于放置各LiveCD对应的映像文件
# umount /mnt/                    安全卸除挂载的分区

3. 安装系统

默认情况下,FreeBSD系统的安装是通过sysinstall(9.0之前)或bsdinstall(9.0开始)所开启的交互模式进行的;但在这里,直接使用分发包安装会更加方便。下面以9.1-RELEASE amd64为例具体说明。

3.1 使用分发包安装

如果之前已经下载过安装映像文件FreeBSD-9.1-RELEASE-amd64-memstick.img,那么可以从其中直接提取分发包进行安装:

# newfs -L usb -j /dev/da0s2a                             格式化分区并添加卷标usb以便于之后挂载
...                                                       -j表示为UFS文件系统开启soft updates journaling
# mount /dev/da0s2a /mnt/
# mdconfig memstick.img                                   文件memstick.img对应于之前下载的安装映像文件
md0                                                       通过mdconfig命令用其创建内存盘
# mount /dev/md0a /media/                                 挂载创建的内存盘
# tar -C /mnt/ -xvf /media/usr/freebsd-dist/base.txz      解包并写入系统文件
...                                                       作为基系统的base.txz与kernel.txz必须安装
# tar -C /mnt/ -xvf /media/usr/freebsd-dist/kernel.txz    同目录下的其他包则可以根据需要选择安装
...
# cp -Riv /media/usr/freebsd-dist/ /mnt/install/          将分发包复制到U盘以用于在其他机器上安装系统
...
# umount /media/
# mdconfig -d -u 0                                        安全移除创建的内存盘

如果还没有下载过安装映像文件,可以通过FTP直接获取需要的分发包:

# ftp -a ftp.freebsd.org    若访问速度过慢,可更换为ftp.cn.freebsd.org
...
ftp> cd pub/FreeBSD/releases/amd64/amd64/9.1-RELEASE/
250 CWD command successful.
ftp> ls
229 Entering Extended Passive Mode (|||63772|)
150 Opening ASCII mode data connection for '/bin/ls'.
total 307588
-rw-r--r--  1 1006  1006       782 Dec  4 10:10 MANIFEST
-rw-r--r--  1 1006  1006  59854248 Dec  4 10:09 base.txz
-rw-r--r--  1 1006  1006   1443284 Dec  4 10:10 doc.txz
-rw-r--r--  1 1006  1006   1117428 Dec  4 10:10 games.txz
-rw-r--r--  1 1006  1006  58045476 Dec  4 10:10 kernel.txz
-rw-r--r--  1 1006  1006   9743636 Dec  4 10:10 lib32.txz
-rw-r--r--  1 1006  1006  87926876 Dec  4 10:10 ports.txz
-rw-r--r--  1 1006  1006  96450488 Dec  4 10:10 src.txz
226 Transfer complete.
ftp> mget base.txz kernel.txz    下载基系统包,其他包可根据需要选择下载
mget base.txz [anpqy?]? a        输入a后回车以全部确认
...

有关各分发包的说明,详见介绍bsdinstall

3.2 系统配置

经过以上操作,当前系统中的/mnt/即为将来U盘系统的根目录。现在仅需做一些必要的配置即可完成安装,而其他额外的配置可以在进入新系统后再做。
1) 创建交换文件:

# dd if=/dev/zero of=/mnt/swap bs=256m count=1
...
# chmod 0600 /mnt/swap

在这里使用交换文件替代传统的交换分区。因为空间有限,与单独的交换分区相比,能够按需调整大小的交换文件会更具弹性;注意交换文件不应小于256MB。
2) 创建/mnt/boot/loader.conf并添加以下内容:

tmpfs_load="YES"    开启内存文件系统

3) 创建/mnt/etc/fstab并添加以下内容:

/dev/ufs/usb        /         ufs        rw    1    1
/dev/msdosfs/USB    /media    msdosfs    rw    0    0
tmpfs               /tmp      tmpfs      rw    0    0

4) 创建/mnt/etc/make.conf并添加以下内容:

WRKDIRPREFIX=/tmp    在内存文件系统中编译Ports;不仅能够显著提升编译速度,更能够避免对U盘不必要的读写
                     但需注意及时make clean以防止空间耗尽

5) 创建/mnt/etc/rc.conf并添加以下内容:

swapfile="/swap"    使用交换文件
powerd_enable="YES"
hostname="FreeBSD"

更多内容可以参考/etc/defaults/rc.conf。
6) 使用命令chroot /mnt/切换根目录后,通过命令tzsetup设置时区,通过命令passwd设置root密码。操作完成后退出并卸除/mnt/上挂载的分区。

3.3 添加引导信息

挂载之前的FAT32分区以编辑GRUB 2配置文件:

# mount_msdosfs /dev/msdosfs/USB /mnt/
# vi /mnt/boot/grub/grub.cfg

在grub.cfg中为U盘系统添加对应的引导菜单:

menuentry "FreeBSD" {        设置所显示的菜单名称
    set root=(hd0,2,a)       指定系统根目录所在分区
    kfreebsd /boot/loader    指定系统加载器
}

4. 安装LiveFS

虽然之前安装的系统已经完全可以实现LiveFS的功能,但在这里仍会添加一个基于mfsBSD的LiveFS,原因在于:

  • 如果U盘本身的系统出现了故障,进入此LiveFS即可进行修复
  • mfsBSD能够被完全读入内存,非常适合大批量本地或远程部署FreeBSD

安装此LiveFS的操作非常简单,首先下载对应版本的mfsBSD映像文件并将其复制到/mnt/iso/,然后在/mnt/boot/grub/grub.cfg中添加对应的引导菜单:

menuentry "LiveFS" {
    loopback loop (hd0,1)/iso/mfsbsd-9.1-RELEASE-amd64.iso    使用loopback功能将ISO文件“模拟”为分区(loop)
    kfreebsd (loop)/boot/kernel/kernel.gz                     由于系统被读入内存,因此启动完成后可直接拔掉U盘
    kfreebsd_module (loop)/mfsroot.gz type=mfs_root
}

mfsBSD登录时root密码为mfsroot,其他相关信息请参见其官方网站
[注] 目前测试发现,9.1版本的iso文件使用此种方式引导某些机器时会报错,此问题修正前可暂时使用9.0版本。

5. 添加LiveCD

完整的系统及各种Ports,已经足以满足FreeBSD的维护需求,但对于其他的操作系统,可能还需要各种LiveCD作为补充。
有别于传统的刻录或dd命令写入方式,这里通过GRUB 2自带的loopback功能,能够非常容易的实现多个LiveCD共存:只要将LiveCD对应的iso文件置于/media/iso/,然后在/media/boot/grub/grub.cfg中添加引导菜单即可;而/media/位于FAT32分区,可以在任何系统下操作。
以下将列出一些常用的LiveCD所对应的引导菜单,未列出的可以在其对应的网站上查询。对于很多采用Syslinux引导的LiveCD,可能需要将其引导菜单手动转换为GRUB 2引导菜单。

5.1 独立式LiveCD

1) GParted(分区操作)

menuentry "GParted" {
    set root=(hd0,1)
    set file="/iso/gparted.iso"    将下载后的iso文件更名为gparted.iso
    loopback loop $file
    linux (loop)/live/vmlinuz boot=live config union=aufs noswap noprompt ip=frommedia toram=filesystem.squashfs findiso=$file
    initrd (loop)/live/initrd.img
}

这里更名文件的目的在于:新版本的LiveCD发布时,只要下载对应的iso文件并覆盖即可完成升级,无需再次修改引导菜单。
2) Clonezilla(磁盘镜像与克隆)

menuentry "Clonezilla" {
    set root=(hd0,1)
    set file="/iso/clonezilla.iso"
    loopback loop $file
    linux (loop)/live/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"\" ip=frommedia nosplash toram=filesystem.squashfs findiso=$file
    initrd (loop)/live/initrd.img
}

3) DBAN(数据擦除)

menuentry "DBAN" {
    loopback loop (hd0,1)/iso/dban.iso
    linux (loop)/DBAN.BZI nuke="dwipe"
}

5.2 集成式LiveCD

1) SystemRescueCd(基于Gentoo Linux)

menuentry "SystemRescueCd" {
    set root=(hd0,1)
    set file="/iso/systemrescuecd.iso"
    loopback loop $file
    linux (loop)/isolinux/rescue64 isoloop=$file docache setkmap=us dostartx
    #linux (loop)/isolinux/altker64 isoloop=$file nomodeset
    initrd (loop)/isolinux/initram.igz
}

2) Parted Magic OS(基于Slackware)

 
menuentry "PartedMagicOS" {
    set root=(hd0,1)
    set file="/iso/pmagic.iso"
    loopback loop $file
    linux (loop)/pmagic/bzImage edd=off load_ramdisk=1 prompt_ramdisk=0 rw loglevel=9 max_loop=256 vmalloc=320MiB iso_filename=$file
    initrd (loop)/pmagic/initrd.img
}

6. 维护实例

 

6.1 安装FreeBSD

安装FreeBSD时若无需多系统共存,强烈建议使用GPT而非MBR分区表,因为GPT不仅结构简练,而且没有2T容量的限制。以下为具体步骤:
1) 使用此U盘启动机器,选择FreeBSD菜单后以root登录。
2) 通过获取设备信息一节的方法获取硬盘信息,以下假设目标硬盘为/dev/ada0。
3) 输入gpart destroy -F /dev/ada0清空之前的分区信息,注意如果存在嵌套的子分区表(可通过命令gpart show检查)也应一并删除。
4) 输入gpart create -s GPT /dev/ada0创建新的GPT分区表。
5) 输入gpart add -t freebsd-boot -s 64k ada0添加大小为64KB的引导分区,若需要设置4K对齐可在命令中添加参数-a 4k。
6) 输入gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada0在引导分区中写入引导记录。
7) 输入gpart add -t freebsd-swap -s 4g -l swap ada0添加大小为4GB(可按需设置)的交换分区,若需要设置4K对齐可在命令中添加参数-a 4k;注意这里通过-l swap给分区添加了标签swap以便于挂载。
8) 输入gpart add -t freebsd-ufs -l sys ada0将剩余空间全部划分给系统,若需要设置4K对齐可在命令中添加参数-a 4k;注意这里通过-l sys给分区添加了标签sys以便于挂载。
9) 输入newfs -j /dev/ada0p3格式化系统分区,其中-j表示开启soft updates journaling;若为固态硬盘还可添加参数-t以开启TRIM。
10) 输入mount /dev/ada0p3 /mnt/将格式化好的系统分区挂载至/mnt/后,依次执行tar -C /mnt/ -xvf /install/base.txz与tar -C /mnt/ -xvf /install/kernel.txz安装基系统;注意/install/下的其他分发包也可根据需要酌情安装。
11) 参考系统配置一节进行必要的系统配置;因为这里已经添加了独立的交换分区,所以无需再配置交换文件,另外注意/mnt/etc/fstab应写为:

/dev/gpt/sys    /       ufs     rw    1    1
dev/gpt/swap    none    swap    sw    0    0
tmpfs           /tmp    tmpfs   rw    0    0

12) 配置完成后,重新启动并从硬盘引导,即可进入安装好的系统。

6.2 安装Linux

绝大多数Linux发行版都会提供ISO格式的LiveCD,同时支持从LiveCD安装系统;也就是说,只要通过添加LiveCD一节的方法引导至LiveCD即可。
例如,使用此U盘安装Gentoo Linux时,对应的GRUB 2引导菜单可写作:

menuentry "Install Gentoo" {
    set root=(hd0,1)
    set file="/iso/gentoo.iso"    将下载后的iso文件更名为gentoo.iso
    loopback loop $file
    linux (loop)/isolinux/gentoo root=/dev/ram0 init=/linuxrc dokeymap looptype=squashfs loop=/image.squashfs cdroot initrd=gentoo.igz isoboot=$file
    initrd (loop)/isolinux/gentoo.igz
}

使用此种方式引导个别Linux发行版所提供的LiveCD可能会出现一些问题,需要执行额外的修正操作。例如,下面的菜单用于引导openSUSEKDE LiveCD:

menuentry "openSUSE KDE LiveCD" {
    set root=(hd0,1)
    set file="/iso/opensuse-kde.iso"    将下载后的iso文件更名为opensuse-kde.iso
    loopback loop $file
    linux (loop)/boot/x86_64/loader/linux kiwidebug=1
    initrd (loop)/boot/x86_64/loader/initrd
}

但此菜单仅能引导至LiveCD的的Debug模式(命令行界面),必须继续手动输入以下命令来引导至图形界面:

# mkdir /livecd/
# mount /dev/sdb1 /mnt/
# mount -o loop /mnt/iso/opensuse-kde.iso /cdrom/
# mount -o loop /mnt/iso/opensuse-kde.iso /livecd/
# exit

6.3 安装Windows

由于GRUB 2并不能直接引导Windows安装所用的iso文件,因此需要使用另外一种方式。这里假设iso文件名为win.iso,目标硬盘为/dev/ada0,以下为具体步骤:
1) 使用独立式LiveCD一节的方法为此U盘添加GParted并引导进入。
2) 使用GParted为/dev/sda(即FreeBSD下的/dev/ada0)创建msdos分区表,然后划分出系统所在分区并格式化为ntfs,最后将其flag设置为boot。
3) 重启并引导进入U盘上的FreeBSD系统,使用Ports安装p7zip与fusefs-ntfs。
4) 挂载之前创建的Windows系统分区并写入Windows安装文件:

# kldload /usr/local/modules/fuse.ko    加载ntfs-3g所需的模块
# ntfs-3g /dev/ada0s1 /mnt/             这里假设之前创建的Windows系统所在分区为/dev/ada0s1
# 7z x win.iso -o{/mnt/}                由于绝大部分Windows安装盘均为UDF格式,因此无法使用tar解压
...

5) 重启并选择Continue菜单从目标硬盘引导后,即可正常安装Windows。
整个过程中需要注意两点:

  • 之所以使用GParted,是因为在FreeBSD中无法格式化NTFS分区(fusefs-ntfs自带的mkntfs命令格式化时会卡在99%)。
  • 一旦引导进入了Windows安装环境,系统分区下除sources文件夹外的所有内容均可删除,而安装完成后sources文件夹也可删除。

6.4 多系统共存

以上分别描述了如何单独安装FreeBSD、Linux与Windows,本节将说明怎样使用此U盘实现多系统共存。
使用传统方式在同一硬盘上安装多系统的难点在于:为了协调各系统启动管理器之间的关系,必须谨慎考虑安装的先后次序。使用此U盘安装则会简单很多:首先以任意顺序单独安装各系统,最后统一调整引导信息;除此之外,在任何时刻均可非常容易的修改甚至替换引导管理器。
以下为具体的安装步骤,最终实现的效果为:一块硬盘包括三个分区,使用FreeBSD自带的MBR启动管理器引导,F1、F2、F3分别对应于FreeBSD、Linux、Windows。
1) 执行安装FreeBSD一节的前3步以初始化目标硬盘,这里假设其为/dev/ada0,容量250GB。
2) 输入gpart create -s MBR /dev/ada0创建新的MBR分区表。
3) 输入gpart add -t freebsd -s 100g ada0添加大小为100GB的freebsd分区以安装FreeBSD,若需要设置4K对齐可在命令中添加参数-a 4k。
4) 输入gpart create -s BSD /dev/ada0s1嵌套BSD分区表后,输入gpart add -t freebsd-ufs ada0s1在其中添加freebsd-ufs分区,若需要设置4K对齐可在命令中添加参数-a 4k。
5) 输入gpart add -t linux-data -s 64g ada0添加大小为64GB的linux-data分区以安装Linux,若需要设置4K对齐可在命令中添加参数-a 4k。
6) 输入gpart add -t ntfs ada0将剩余空间划分为ntfs分区以安装Windows。
7) 使用安装Linux一节的方法在硬盘的第2个分区(即Linux下的/dev/sda2)上安装Linux。
8) 使用独立式LiveCD一节的方法为此U盘添加GParted并引导进入后,将硬盘的第3个分区(即GParted下的/dev/sda3)格式化为ntfs,并将其flag设置为boot。
9) 执行安装Windows一节的后3步以在ntfs分区上安装Windows。
10) 重启并引导进入U盘上的FreeBSD系统后,在硬盘的第1个分区上安装FreeBSD:

# newfs -L sys -j /dev/ada0s1a             格式化分区并添加卷标sys以便于之后挂载
...                                        若为固态硬盘还可添加-t以开启TRIM
# mount /dev/ada0s1a /mnt/
# tar -C /mnt/ -xvf /install/base.txz      解包并写入系统文件
...                                        作为基系统的base.txz与kernel.txz必须安装
# tar -C /mnt/ -xvf /install/kernel.txz    同目录下的其他包则可以根据需要选择安装
...

11) 参考系统配置一节进行必要的系统配置;注意为简化分区结构这里并未划分单独的交换分区,所以应按需设置交换文件(普通使用4GB即可),当然也可直接拆出freebsd-swap分区。
12) 安装FreeBSD自带的MBR启动管理器:

# gpart bootcode -b /boot/boot0 ada0     安装boot0引导管理器
bootcode written to ada0
# gpart set -a active -i 1 ada0          激活引导
active set on adaos1
# gpart bootcode -b /boot/boot ada0s1    写入bootstrap
bootcode written to ada0s1
# boot0cfg -t 182 /dev/ada0              设置引导菜单等待时间,注意数字单位为tick(即滴答,18.2滴答约为1秒)

整个过程中需要注意两点:

  • 各系统所在分区及安装顺序随意,只要最后安装启动管理器即可,另外F1、F2、F3键始终依次对应第1、2、3分区。
  • 一般硬盘的每磁道为63个扇区,MBR信息位于编号为0的首个扇区,而gpart会要求分区按照柱面对齐(不跨磁道),因此首个分区至少应跳过MBR所在磁道(第0至62扇区)从第63扇区开始,也就是说添加首个分区时需要在gpart命令中使用-b 63;对于支持4K对齐的硬盘,则应使用-b 504 -a 4k,其中504为4096/512与63的最小公倍数。

6.5 固件更新

对于以iso文件提供的固件更新,也可以使用类似的方式进行,但可能需要MEMDISK辅助(下载Syslinux分发包后将文件memdisk解压至/media/iso/)。
1) 更新Seagate硬盘Firmware(所需文件*.iso可从Seagate Download Finder页面查询并下载)

menuentry "Seagate Firmware" {
    set root=(hd0,1)
    loopback loop (hd0,1)/iso/*.iso
    linux16 /iso/memdisk
    initrd16 (loop)/*.ima;1    *.ima;1位于*.iso根目录中,具体名称可通过tar -tvf *.iso获取
}

2) 更新ThinkPad笔记本BIOS(所需文件*.iso可从ThinkPad网站查询并下载)

menuentry "ThinkPad BIOS" {
    set root=(hd0,1)
    linux16 /iso/memdisk iso    注意这里需添加引导参数iso
    initrd16 /iso/*.iso
}

3) 某些固件的更新可能仅提供了DOS方式,此时可使用FreeDOS

menuentry "FreeDOS" {
    set root=(hd0,1)
    linux16 /iso/memdisk iso     注意提前将固件更新所需的相关文件置于/media/
    initrd16 /iso/freedos.iso    引导成功后需要在安装过程中取消安装才能够进入Live模式执行固件更新
}

扩展信息

Thinkpad 笔记本电脑上的 FreeBSD 内核

在这个wiki帖子中,公布了Thinkpad笔记本电脑上FreeBSD内核配置和一些基本的设置,目的是为了让更多的初学者能在最短的时间上手FreeBSD。FreeBSD是目前最好的免费OS之一,但愿它在开源之路上不断壮大。

在学习使用FreeBSD的过程中,我受益于网上众多的科普贴和坛子里朋友们的帮助。作为回馈,但愿我的这些小小的心得体会也能对他人有所帮助。

为什么选 Thinkpad?

FreeBSD 似乎比较青睐 Thinkpad, 提供了很多驱动和应用,例如 tpb 等。另外,在 /boot/loader.conf 里加入

acpi_video_load="YES"
acpi_ibm_load="YES"

就可以加载 acpi 支持。众所周知,FreeBSD 对 acpi 的支持一直是其诟病。可见 FreeBSD 对 Thinkpad 的“爱护”。当然,其他品牌的笔记本电脑,FreeBSD 也是相当支持的(我不是 Lenovo 的托儿)。我看 freebsd 对笔记本电脑的支持列表 http://laptop.bsdgroup.de/freebsd/,其中 Thinkpads 较多。而 FreeBSD 对 T42 的支持是 100%(不过休眠待机功能不work。。。)。所以,网上有人问买什么笔记本装 FreeBSD 最合适,一般的回答是 old Thinkpads of T, X, R series.

从做工上看,实话实说,现在的 Thinkpad 大不如从前了。Thinkpad T42 曾数次掉到地上,啥事也没有,捡起来接着用。2011 年底,我刚买了台 X220,看它的样子,我担心摔一次就彻底完蛋。不知 X220 能否像 T42 一样让我从来不为机器和操作系统担心,但愿事遂人愿。

FreeBSD 9.1 内核文件

为了初学者装机方便,我把我的Thinkpad笔记本电脑上的 FreeBSD 9.1 内核文件贴出来。该配置还在Thinkpad X61、X200上试验过,都是没问题的。

#cpu        I486_CPU
#cpu        I586_CPU
cpu     I686_CPU
ident   X200

#makeoptions    DEBUG=-g        # Build kernel with gdb(1) debug symbols
#makeoptions    WITH_CTF=1      # Run ctfconvert(1) for DTrace support

options     SCHED_ULE       # ULE scheduler
options     PREEMPTION      # Enable kernel thread preemption
options     INET            # InterNETworking
options     INET6           # IPv6 communications protocols
options     SCTP            # Stream Control Transmission Protocol
options     FFS         # Berkeley Fast Filesystem
options     SOFTUPDATES     # Enable FFS soft updates support
options     UFS_ACL         # Support for access control lists
options     UFS_DIRHASH     # Improve performance on big directories
options     UFS_GJOURNAL        # Enable gjournal-based UFS journaling
options     QUOTA           # Enable disk quotas for UFS
#options    MD_ROOT         # MD is a potential root device
#options    NFSCL           # New Network Filesystem Client
#options    NFSD            # New Network Filesystem Server
#options    NFSLOCKD        # Network Lock Manager
#options    NFS_ROOT        # NFS usable as /, requires NFSCL
#options    MSDOSFS         # MSDOS Filesystem
#options    CD9660          # ISO 9660 Filesystem
options     PROCFS          # Process filesystem (requires PSEUDOFS)
options     PSEUDOFS        # Pseudo-filesystem framework
options     GEOM_PART_GPT       # GUID Partition Tables.
options     GEOM_RAID       # Soft RAID functionality.
options     GEOM_LABEL      # Provides labelization
#options    COMPAT_FREEBSD4     # Compatible with FreeBSD4
#options    COMPAT_FREEBSD5     # Compatible with FreeBSD5
#options    COMPAT_FREEBSD6     # Compatible with FreeBSD6
#options    COMPAT_FREEBSD7     # Compatible with FreeBSD7
#options    SCSI_DELAY=5000     # Delay (in ms) before probing SCSI
#options    KTRACE          # ktrace(1) support
options     STACK           # stack(9) support
options     SYSVSHM         # SYSV-style shared memory
options     SYSVMSG         # SYSV-style message queues
options     SYSVSEM         # SYSV-style semaphores
options     _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options     PRINTF_BUFR_SIZE=128    # Prevent printf output being interspersed.
options     KBD_INSTALL_CDEV    # install a CDEV entry in /dev
options     HWPMC_HOOKS     # Necessary kernel hooks for hwpmc(4)
options     AUDIT           # Security event auditing
#options    MAC         # TrustedBSD MAC Framework
#options    KDTRACE_HOOKS       # Kernel DTrace hooks
options     INCLUDE_CONFIG_FILE     # Include this file in kernel
options     KDB         # Kernel debugger related code
options     KDB_TRACE       # Print a stack trace for a panic
options     DDB_CTF         # kernel ELF linker loads CTF data

# To make an SMP kernel, the next two lines are needed
options     SMP         # Symmetric MultiProcessor Kernel
device      apic            # I/O APIC

# CPU frequency control
#device     cpufreq

# Bus support.
device      acpi
#device     eisa
device      pci

# Floppy drives
#device     fdc

# ATA controllers
device      ahci        # AHCI-compatible SATA controllers
#device     ata     # Legacy ATA/SATA controllers
#options    ATA_CAM     # Handle legacy controllers with CAM
#options    ATA_STATIC_ID   # Static device numbering
#device     mvs     # Marvell 88SX50XX/88SX60XX/88SX70XX/SoC SATA
#device     siis        # SiliconImage SiI3124/SiI3132/SiI3531 SATA

# SCSI Controllers
#device     ahb     # EISA AHA1742 family
#device     ahc     # AHA2940 and onboard AIC7xxx devices
#options    AHC_REG_PRETTY_PRINT    # Print register bitfields in debug
                    # output.  Adds ~128k to driver.
#device     ahd     # AHA39320/29320 and onboard AIC79xx devices
#options    AHD_REG_PRETTY_PRINT    # Print register bitfields in debug
                    # output.  Adds ~215k to driver.
#device     esp     # AMD Am53C974 (Tekram DC-390(T))
#device     hptiop      # Highpoint RocketRaid 3xxx series
#device     isp     # Qlogic family
#device     ispfw       # Firmware for QLogic HBAs- normally a module
#device     mpt     # LSI-Logic MPT-Fusion
#device     ncr     # NCR/Symbios Logic
#device     sym     # NCR/Symbios Logic (newer chipsets + those of `ncr')
#device     trm     # Tekram DC395U/UW/F DC315U adapters

#device     adv     # Advansys SCSI adapters
#device     adw     # Advansys wide SCSI adapters
#device     aha     # Adaptec 154x SCSI adapters
#device     aic     # Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
#device     bt      # Buslogic/Mylex MultiMaster SCSI adapters

#device     ncv     # NCR 53C500
#device     nsp     # Workbit Ninja SCSI-3
#device     stg     # TMC 18C30/18C50
#device     isci        # Intel C600 SAS controller

# ATA/SCSI peripherals
device      scbus       # SCSI bus (required for ATA/SCSI)
#device     ch      # SCSI media changers
device      da      # Direct Access (disks)
#device     sa      # Sequential Access (tape etc)
#device     cd      # CD
device      pass        # Passthrough device (direct ATA/SCSI access)
#device     ses     # Enclosure Services (SES and SAF-TE)
#device     ctl     # CAM Target Layer

# RAID controllers interfaced to the SCSI subsystem
#device     amr     # AMI MegaRAID
#device     arcmsr      # Areca SATA II RAID
#device     asr     # DPT SmartRAID V, VI and Adaptec SCSI RAID
#device     ciss        # Compaq Smart RAID 5*
#device     dpt     # DPT Smartcache III, IV - See NOTES for options
#device     hptmv       # Highpoint RocketRAID 182x
#device     hptrr       # Highpoint RocketRAID 17xx, 22xx, 23xx, 25xx
#device     hpt27xx     # Highpoint RocketRAID 27xx
#device     iir     # Intel Integrated RAID
#device     ips     # IBM (Adaptec) ServeRAID
#device     mly     # Mylex AcceleRAID/eXtremeRAID
#device     twa     # 3ware 9000 series PATA/SATA RAID
#device     tws     # LSI 3ware 9750 SATA+SAS 6Gb/s RAID controller

# RAID controllers
#device     aac     # Adaptec FSA RAID
#device     aacp        # SCSI passthrough for aac (requires CAM)
#device     ida     # Compaq Smart RAID
#device     mfi     # LSI MegaRAID SAS
#device     mlx     # Mylex DAC960 family
#device     pst     # Promise Supertrak SX6000
#device     twe     # 3ware ATA RAID

# atkbdc0 controls both the keyboard and the PS/2 mouse
device      atkbdc      # AT keyboard controller
device      atkbd       # AT keyboard
device      psm     # PS/2 mouse

device      kbdmux      # keyboard multiplexer

device      vga     # VGA video card driver
options     VESA        # Add support for VESA BIOS Extensions (VBE)

device      splash      # Splash screen and screen saver support

# syscons is the default console driver, resembling an SCO console
device      sc
options     SC_PIXEL_MODE   # add support for the raster text mode

device      agp     # support several AGP chipsets

# Power management support (see NOTES for more options)
#device     apm
# Add suspend/resume support for the i8254.
device      pmtimer

# PCCARD (PCMCIA) support
# PCMCIA and cardbus bridge support
device      cbb     # cardbus (yenta) bridge
device      pccard      # PC Card (16-bit) bus
device      cardbus     # CardBus (32-bit) bus

# Serial (COM) ports
#device     uart        # Generic UART driver

# Parallel port
device      ppc
device      ppbus       # Parallel port bus (required)
#device     lpt     # Printer
#device     plip        # TCP/IP over parallel
#device     ppi     # Parallel port interface device
#device     vpo     # Requires scbus and da

#device     puc     # Multi I/O cards and multi-channel UARTs

# PCI Ethernet NICs.
#device     bxe     # Broadcom BCM57710/BCM57711/BCM57711E 10Gb Ethernet
#device     de      # DEC/Intel DC21x4x (``Tulip'')
device      em      # Intel PRO/1000 Gigabit Ethernet Family
#device     igb     # Intel PRO/1000 PCIE Server Gigabit Family
#device     ixgb        # Intel PRO/10GbE Ethernet Card
#device     le      # AMD Am7900 LANCE and Am79C9xx PCnet
#device     ti      # Alteon Networks Tigon I/II gigabit Ethernet
#device     txp     # 3Com 3cR990 (``Typhoon'')
#device     vx      # 3Com 3c590, 3c595 (``Vortex'')

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device      miibus      # MII bus support
#device     ae      # Attansic/Atheros L2 FastEthernet
#device     age     # Attansic/Atheros L1 Gigabit Ethernet
#device     alc     # Atheros AR8131/AR8132 Ethernet
#device     ale     # Atheros AR8121/AR8113/AR8114 Ethernet
#device     bce     # Broadcom BCM5706/BCM5708 Gigabit Ethernet
#device     bfe     # Broadcom BCM440x 10/100 Ethernet
#device     bge     # Broadcom BCM570xx Gigabit Ethernet
#device     cas     # Sun Cassini/Cassini+ and NS DP83065 Saturn
#device     dc      # DEC/Intel 21143 and various workalikes
#device     et      # Agere ET1310 10/100/Gigabit Ethernet
#device     fxp     # Intel EtherExpress PRO/100B (82557, 82558)
#device     gem     # Sun GEM/Sun ERI/Apple GMAC
#device     hme     # Sun HME (Happy Meal Ethernet)
#device     jme     # JMicron JMC250 Gigabit/JMC260 Fast Ethernet
#device     lge     # Level 1 LXT1001 gigabit Ethernet
#device     msk     # Marvell/SysKonnect Yukon II Gigabit Ethernet
#device     nfe     # nVidia nForce MCP on-board Ethernet
#device     nge     # NatSemi DP83820 gigabit Ethernet
#device     nve     # nVidia nForce MCP on-board Ethernet Networking
#device     pcn     # AMD Am79C97x PCI 10/100 (precedence over 'le')
#device     re      # RealTek 8139C+/8169/8169S/8110S
#device     rl      # RealTek 8129/8139
#device     sf      # Adaptec AIC-6915 (``Starfire'')
#device     sge     # Silicon Integrated Systems SiS190/191
#device     sis     # Silicon Integrated Systems SiS 900/SiS 7016
#device     sk      # SysKonnect SK-984x & SK-982x gigabit Ethernet
#device     ste     # Sundance ST201 (D-Link DFE-550TX)
#device     stge        # Sundance/Tamarack TC9021 gigabit Ethernet
#device     tl      # Texas Instruments ThunderLAN
#device     tx      # SMC EtherPower II (83c170 ``EPIC'')
#device     vge     # VIA VT612x gigabit Ethernet
#device     vr      # VIA Rhine, Rhine II
#device     vte     # DM&P Vortex86 RDC R6040 Fast Ethernet
#device     wb      # Winbond W89C840F
#device     xl      # 3Com 3c90x (``Boomerang'', ``Cyclone'')

# ISA Ethernet NICs.  pccard NICs included.
#device     cs      # Crystal Semiconductor CS89x0 NIC
# 'device ed' requires 'device miibus'
#device     ed      # NE[12]000, SMC Ultra, 3c503, DS8390 cards
#device     ex      # Intel EtherExpress Pro/10 and Pro/10+
#device     ep      # Etherlink III based cards
#device     fe      # Fujitsu MB8696x based cards
#device     ie      # EtherExpress 8/16, 3C507, StarLAN 10 etc.
#device     sn      # SMC's 9000 series of Ethernet chips
#device     xe      # Xircom pccard Ethernet

# Wireless NIC cards
#device     wlan        # 802.11 support
#options    IEEE80211_DEBUG # enable debug msgs
#options    IEEE80211_AMPDU_AGE # age frames in AMPDU reorder q's
#options    IEEE80211_SUPPORT_MESH  # enable 802.11s draft support
#device     wlan_wep    # 802.11 WEP support
#device     wlan_ccmp   # 802.11 CCMP support
#device     wlan_tkip   # 802.11 TKIP support
#device     wlan_amrr   # AMRR transmit rate control algorithm
#device     an      # Aironet 4500/4800 802.11 wireless NICs.
#device     ath     # Atheros NICs
#device     ath_pci     # Atheros pci/cardbus glue
#device     ath_hal     # pci/cardbus chip support
#options    AH_SUPPORT_AR5416   # enable AR5416 tx/rx descriptors
#device     ath_rate_sample # SampleRate tx rate control for ath
#device     bwi     # Broadcom BCM430x/BCM431x wireless NICs.
#device     bwn     # Broadcom BCM43xx wireless NICs.
#device     ipw     # Intel 2100 wireless NICs.
#device     iwi     # Intel 2200BG/2225BG/2915ABG wireless NICs.
#device     iwn     # Intel 4965/1000/5000/6000 wireless NICs.
#device     malo        # Marvell Libertas wireless NICs.
#device     mwl     # Marvell 88W8363 802.11n wireless NICs.
#device     ral     # Ralink Technology RT2500 wireless NICs.
#device     wi      # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
#device     wl      # Older non 802.11 Wavelan wireless NIC.
#device     wpi     # Intel 3945ABG wireless NICs.

# Pseudo devices.
device      loop        # Network loopback
device      random      # Entropy device
#options    PADLOCK_RNG # VIA Padlock RNG
#options    RDRAND_RNG  # Intel Bull Mountain RNG
device      ether       # Ethernet support
device      vlan        # 802.1Q VLAN support
device      tun     # Packet tunnel.
device      pty     # BSD-style compatibility pseudo ttys
device      md      # Memory "disks"
device      gif     # IPv6 and IPv4 tunneling
device      faith       # IPv6-to-IPv4 relaying (translation)
device      firmware    # firmware assist module

# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device      bpf     # Berkeley packet filter

# USB support
options     USB_DEBUG   # enable debug msgs
device      uhci        # UHCI PCI->USB interface
device      ohci        # OHCI PCI->USB interface
device      ehci        # EHCI PCI->USB interface (USB 2.0)
device      xhci        # XHCI PCI->USB interface (USB 3.0)
device      usb     # USB Bus (required)
#device     udbp        # USB Double Bulk Pipe devices (needs netgraph)
#device     uhid        # "Human Interface Devices"
#device     ukbd        # Keyboard
#device     ulpt        # Printer
device      umass       # Disks/Mass storage - Requires scbus and da
#device     ums     # Mouse
#device     urio        # Diamond Rio 500 MP3 player
# USB Serial devices
#device     u3g     # USB-based 3G modems (Option, Huawei, Sierra)
#device     uark        # Technologies ARK3116 based serial adapters
#device     ubsa        # Belkin F5U103 and compatible serial adapters
#device     uftdi       # For FTDI usb serial adapters
#device     uipaq       # Some WinCE based devices
#device     uplcom      # Prolific PL-2303 serial adapters
#device     uslcom      # SI Labs CP2101/CP2102 serial adapters
#device     uvisor      # Visor and Palm devices
#device     uvscom      # USB serial support for DDI pocket's PHS
# USB Ethernet, requires miibus
#device     aue     # ADMtek USB Ethernet
#device     axe     # ASIX Electronics USB Ethernet
#device     cdce        # Generic USB over Ethernet
#device     cue     # CATC USB Ethernet
#device     kue     # Kawasaki LSI USB Ethernet
#device     rue     # RealTek RTL8150 USB Ethernet
#device     udav        # Davicom DM9601E USB
# USB Wireless
#device     rum     # Ralink Technology RT2501USB wireless NICs
#device     run     # Ralink Technology RT2700/RT2800/RT3000 NICs.
#device     uath        # Atheros AR5523 wireless NICs
#device     upgt        # Conexant/Intersil PrismGT wireless NICs.
#device     ural        # Ralink Technology RT2500USB wireless NICs
#device     urtw        # Realtek RTL8187B/L wireless NICs
#device     zyd     # ZyDAS zd1211/zd1211b wireless NICs

# Sound support
#device     sound       # Generic sound driver (required)
#device     snd_cmi     # CMedia CMI8338/CMI8738
#device     snd_csa     # Crystal Semiconductor CS461x/428x
#device     snd_emu10kx # Creative SoundBlaster Live! and Audigy
#device     snd_es137x  # Ensoniq AudioPCI ES137x
#device     snd_hda     # Intel High Definition Audio
#device     snd_ich     # Intel, NVidia and other ICH AC'97 Audio
#device     snd_uaudio  # USB Audio
#device     snd_via8233 # VIA VT8233x Audio

# VirtIO support
#device     virtio      # Generic VirtIO bus (required)
#device     virtio_pci  # VirtIO PCI Interface
#device     vtnet       # VirtIO Ethernet device
#device     virtio_blk  # VirtIO Block device
#device     virtio_scsi # VirtIO SCSI device
#device     virtio_balloon  # VirtIO Memory Balloon device

/boot/loader.conf 配置

有些硬件的驱动没有写入内核文件,而是通过模块引导,像无线网卡、蓝牙、SD卡等。X61的无线网卡是iwn,X200的无线网卡是ath,用户根据机器的具体情况改写下面的 /boot/loader.conf 配置。

#boot_verbose="-v"        # provide more dmesg information
autoboot_delay="1"        # Set wait time to 1 second
loader_logo="beastie"     # The color logo of FreeBSD
cuse4bsd_load="YES"

############################
## Load necessary modules ##
############################
cpuctl_load="YES"         # CPU Throttling 
coretemp_load="YES"       # Thermal Monitoring
#linprocfs_load="YES"      # Linux proc
#linsysfs_load="YES"       # Linux sysfs
acpi_ibm_load="YES"       # acpi for IBM ThinkPad
acpi_video_load="YES"     # ACPI Video Extensions driver
snd_hda_load="YES"        # sound card, comment out if in kernel
speaker_load="YES"        # console speaker device driver

#####################
### Bluetooth USB ###
#####################
#ubtbcmfw_load="YES       # Firmware loader for Broadcom Bluetooth 
#ng_ubt_load="YES"        # Bluetooth driver

################
### Wireless ###
################
wlan_scan_ap_load="YES"   # Wireless 
wlan_scan_sta_load="YES"  # Wireless 
if_ath_load="YES"         # Internal LAN module
if_ath_pci_load="YES"     # For Thinkpad X61
wlan_wep_load="YES"
wlan_ccmp_load="YES"
wlan_tkip_load="YES"

####################
## SD card reader ##
####################
#sdhci_load="YES"
#mmcsd_load="YES"
#mmc_load="YES"

##########################
### End of loader.conf ###
##########################

有关声卡的一点小注记

在 /boot/device.hints 里添加

# snd_hda
hint.pcm.0.vol="85"
hint.hdac.0.cad0.nid26.config="as=1"
hint.hdac.0.cad0.nid22.config="as=1 seq=15"
hint.hdac.0.cad0.nid29.config="as=2"
hint.hdac.0.cad0.nid24.config="as=3"

后记

Thinkpad T42(CPU: Intel(R) Pentium(R) M processor 1.70GHz,内存 1G)是我的 workhorse,它是 IBM Thinkpad 被 Lenovo 收购前最后一批机器,我是 2005 年买的,一直用到2011年底才换掉。除了光驱和电池(只能坚持15分钟了)之外,一切都牛X如初。“好马配好鞍”,FreeBSD + T42 非常地争气,它们从来没让我失望过。有人把机器和 OS 看作玩具,有人把它们看作事业,而它们对于我就是养家糊口的工具(有点世俗……),我不知该用什么形容。

题外话:鸡肋是“食之无味,弃之可惜”,光驱连鸡肋都不如。在北美、欧洲,由于对媒体版权的保护,光驱还在残喘,一旦网络媒体发行发生革命,光驱就会被历史淘汰。平时,我几乎不用光驱。考虑到FreeBSD对硬件的支持的滞后性,以及USB安装已经成为FreeBSD的主流安装方式,我建议大家买不带光驱的二手笔记本电脑。当然,事先必须上网调查一下FreeBSD对该款电脑的硬件支持是否好,否则买了后悔。

原文链接:https://wiki.freebsdchina.org/doc/k/kernel

设置网络打印机

在 FreeBSD 下使用网络打印机有很多的选择。譬如,Opera 的用户,可以直接输入网络打印机的IP地址,然后选择要打印的pdf或ps文件,点点鼠标就搞定。遗憾的是,Opera 经常为此崩溃,它的打印功能一直被诟病。

下面介绍的网络打印的方法是在终端用 lpr 命令完成的。设置很简单,但必须知道网络打印机的 IP 地址先,譬如,设其为 168.13.30.122(这个地址是我捏造的)。

[1] 在 /etc/rc.conf 里添加:

lpd_enable="YES"        ## start lpd when starting system

[2] 在 /etc/hosts 里添加

168.13.30.122   IOU_Office_Printer

[3] 在 /etc/printcap 里设置

lp:\
        :lp=9100@IOU_Office_Printer:\
        :sh:\
        :mx#0:\
        :sd=/var/spool/lpd/lp:\
        :lf=/var/log/lpd-errs:

IOU_Office_Printer 是我给这台网络打印机起的名字,9100是端口。

重新启动机器……

使用 IOU_Office_Printer 打印,只需在终端输入

lpr 需要打印的文件名

这样设置好后,再在 opera 里打印,选“打印到 LPR”来打印页面,一切 OK。

FreeBSD 加密盘的使用

FreeBSD 加密盘的使用

yarshure@gmail.com

本文通过FreeBSD geom 框架gbde 和geli 对磁盘,文件的加密,保护计算机系统数据,使数据免受攻击者获得有用的资源。

一使用gbde对磁盘进行加密

1 添加内核选项

options GEOM_BDE

重新编译,安装内核

2 准备imgfile

#dd if=/dev/zero of=newimage bs=1k count=50k

生成1个50MB的image,文件大小=bs*count

3 使用newimage 生成文件系统

#mdconfig -a -t vnode -f newimage -u 0
# ls /dev/md0

验证是否生成

4 创建一个目录来保存 gbde Lock 文件

# mkdir /etc/gbde

初始化 gbde 分区

# gbde init /dev/md0 -I -L /etc/gbde/md0

5把加密分区和内核进行关联

# gbde attach /dev/md0 -l /etc/gbde/md0

6在加密设备上创建文件系统

#newfs -U -O2 /dev/md0.gbde
# mkdir /mnt/md0
#mount /dev/md0.gbde /mnt/md0

#df -H 验证

备份: 备份 newimage,/etc/gbde/md0

卸载:

#umount /mnt/md0
#gbde detach /dev/md0
#mdconfig -d 0

二使用geli加密磁盘

内核选项:

options GEOM_ELI
device crypto

重新编译内核,安装新内核,就可以了。
另外如果想通过模块方式加载,则可以在/boot/loader.conf文件里添加以下内容:
geom_eli_load="YES"

1 准备imgfile

#dd if=/dev/zero of=newimage bs=1k count=50k

生成1个50MB的image,文件大小=bs*count

2使用newimage 生成文件系统

#mdconfig -a -t vnode -f newimage -u 0

# ls /dev/md0 验证是否生成

3 生成主密钥:

#dd if=/dev/random of=/root/md0.key bs=64 count=1
# geli init -s 4096 -K /root/md0.key /dev/md0

如果密钥文件写作 “-”, 则表示使用标准输入。 下面是关于如何使用多个密钥文件的例子:

# cat keyfile1 keyfile2 keyfile3 | geli init -K – /dev/md0

4将md0和密钥关联

# geli attach -k /root/md0.key /dev/md0
Enter passphrase:

新的明文设备将被命名为 /dev/md0.eli。

# ls /dev/md0*
/dev/md0 /dev/md0.eli

5创建文件系统

# dd if=/dev/random of=/dev/md0.eli bs=1m
# newfs /dev/md0.eli
# mount /dev/md0.eli /mnt/md0

使用df -h 检查

6卸下卷并断开

# umount /mnt/md0
# geli detach md0.eli
#mdconfig -d 0

备份:备份newimage, /root/md0.key

详细参考:

FreeBSD 使用手册 17.6, 17.13.1 Manpage: gbde(8), newfs(8), geli(8), crypto(9), mdconfig(8)

原文链接:https://wiki.freebsdchina.org/doc/s/crypto_disk

FreeBSD 无控制台远程安装 – mfsBSD

FreeBSD 无控制台远程安装 – mfsBSD

主要参考:

FreeBSD 无远程控制台下的远程安装(中文)

Remote Installation of FreeBSD without a Remote Console(英文)

但是需要注意,这两篇文章是比较老的版本。mfsbsd-2.0的配置参数发生了变化。确定好静态IP信息以后,不知道网卡名字的前提下,需要自动探测网卡驱动

编辑 conf/interfaces.conf

mac_interfaces="ext1"
ifconfig_ext1_mac="00:15:5d:59:05:df"
ifconfig_ext1="inet 192.168.1.108 netmask 255.255.255.0 broadcast 192.168.1.255"

编写MAC地址的时候,FreeBSD探测出来的是小写字符,所以,如果写成类似,00:15:5D:59:05:DF, script/interfaces脚本中的 if [ “$_mac” = “$_cmac” ]; 就会失败,网卡就无法设置成功。

在conf/rc.conf中,不需要加入ifconfig_{$if}配置,当然不能忘记缺省路由:

defaultrouter="192.168.1.1"

在conf/loader.conf文件中,关闭hdcp

#mfsbsd.autodhcp="YES"
其他配置,authorized_keys,resolv.conf,ttys。。。。。。

最后:

# cd /root/mfsbsd-2.0
# make 或 make iso
FreeBSD 9.0以上版本,用bsdinstall安装,其他不再赘述。

原文链接:https://wiki.freebsdchina.org/howto/i/remote_installation_without_console

FreeBSD 9.0 的 GPT 纯 ZFS 安装

FreeBSD 9.0 的 GPT 纯 ZFS 安装

注意

由于 FreeBSD 9.0 采用了新的 bsdinstall,官方的 WIKI 指出,原先的 GPT ZFS boot 安装方法可能会不适用(未验证),故有此文。

本文介绍的是基于 GPT 以 ZFS 为根分区安装 FreeBSD 9.0-Release。
本文基于 官网这篇文章 翻译而来,并且实际操作过。
原文修订日期(注意更新): 2012-05-01 19:57:09 by PaulChvostek

4K对齐:

下文出现 gpart add 的地方增加参数 -a 4k
创建 zpool 之前,执行 gnop create -S 4096 ada0p3(第三个分区,-S为大写)
创建 zpool 时,/dev/gpt/disk0 改为 ada0p3.nop
zpool export 之后 import 之前,执行 gnop destroy ada0p3.nop

步骤

1.从 FreeBSD 的 CD1安装盘/DVD安装盘/USB Memstick 启动

2.进入安装界面后,到了 「Partitioning」(分区)这一步时,选择 「Shell」 选项

3.创建分区

#1.将硬盘设为 GPT 分区格式。
#
gpart create -s gpt ada0 #假设你有两块硬盘,这是第一块。
gpart create -s gpt ada1 #没有第二块硬盘则略过。
#2.在第一块硬盘上,分别创建标签(label)名为 boot0, swap0, disk0 这三个分区,最后把引导码写入第1个分区,即 boot0。
#
#gpart add:添加分区
#    -s 指定分区大小,-t 指定分区类型,
#    -l 指定标签名字,可以自由取名,记得前后一致,
#    ada0 是 /dev 下面的设备名字,这里是第一块硬盘。
#
#gpart bootcode: 安装引导码
#    -b -p (无需改动,照抄即可)
#    -i 指定分区的编号,从1开始。这里第一个创建的是 boot0,要写入 boot0, 所以是1。
#
gpart add -s 64K -t freebsd-boot -l boot0 ada0
gpart add -s 8G -t freebsd-swap -l swap0 ada0
gpart add -t freebsd-zfs -l disk0 ada0
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
#针对第二块硬盘,没有则略过。
gpart add -s 64K -t freebsd-boot -l boot1 ada1
gpart add -s 8G -t freebsd-swap -l swap1 ada1
gpart add -t freebsd-zfs -l disk1 ada1
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
#3.创建 zpool 和 zfs
#
#「zroot」是zpool的名字,可随意起名,注意保持一致。
#如果你有两块硬盘,可用 mirror(RAID 1) 模式组建。
zpool create -o altroot=/mnt zroot mirror /dev/gpt/disk0 /dev/gpt/disk1
#如果你只有一块硬盘
zpool create -o altroot=/mnt zroot /dev/gpt/disk0
#下列分区跟据需要自行修改
zfs create zroot/tmp
chmod 1777 /mnt/tmp
zfs create zroot/usr
zfs create zroot/var
zfs create zroot/home
exit

4.退出 shell 之后,继续安装

5.当问及「create partitions」(创建分区)时,选择「Shell」,然后直接输入 exit (刚才我们已经分好了)

6.安装和配置结束后,选择「Live CD」选项,以用户名 root 登录

7.修正挂载点和 cachefile(zpool缓存文件,记录了存储池的所有配置信息)

echo ‘zfs_enable="YES"’ >> /mnt/etc/rc.conf
echo ‘zfs_load="YES"’ >> /mnt/boot/loader.conf
echo ‘vfs.root.mountfrom="zfs:zroot"’ >> /mnt/boot/loader.conf
zfs unmount -a
zpool export zroot
zpool import -o cachefile=/tmp/zpool.cache -o altroot=/mnt zroot
zfs set mountpoint=/ zroot
cp /tmp/zpool.cache /mnt/boot/zfs/
zfs unmount -a
zpool set bootfs=zroot zroot
zpool set cachefile=” zroot
zfs set mountpoint=/tmp zroot/tmp
zfs set mountpoint=/usr zroot/usr
zfs set mountpoint=/var zroot/var
zfs set mountpoint=/home zroot/home

8.输入 reboot,完成安装

 

原文链接:https://wiki.freebsdchina.org/doc/z/gptzfsboot

安装与配置nginx下的php (PHP-FPM模式)

如何:安装与配置nginx下的php (PHP-FPM模式)

准备工作

使用FreeBSD的Ports安装软件时,请一定先把Ports更新到最新版本

#portsnap fetch update

如果你是第一次使用portsnap,可能需要先执行

#portsnap extract

安装并启用nginx服务

首先,安装nginx:

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

在出现的选项中,可能有一些你不熟悉的选项存在,如果你不明白各个选项的含义,可以用下面的默认值:

[X] HTTP_MODULE               Enable HTTP module
[X] HTTP_ADDITION_MODULE      Enable http_addition module
[X] HTTP_CACHE_MODULE         Enable http_cache module
[X] HTTP_DAV_MODULE           Enable http_webdav module
[X] HTTP_FLV_MODULE           Enable http_flv module
[X] HTTP_GEOIP_MODULE         Enable http_geoip module
[X] HTTP_GZIP_STATIC_MODULE   Enable http_gzip_static module
[X] HTTP_IMAGE_FILTER_MODULE  Enable http_image_filter module
[X] HTTP_PERL_MODULE          Enable http_perl module
[X] HTTP_RANDOM_INDEX_MODULE  Enable http_random_index module
[X] HTTP_REALIP_MODULE        Enable http_realip module
[X] HTTP_REWRITE_MODULE       Enable http_rewrite module
[X] HTTP_SECURE_LINK_MODULE   Enable http_secure_link module
[X] HTTP_SSL_MODULE           Enable http_ssl module
[X] HTTP_STATUS_MODULE        Enable http_stub_status module
[X] HTTP_SUB_MODULE           Enable http_sub module
[X] HTTP_XSLT_MODULE          Enable http_xslt module

在命令执行完成后,使用编辑器把下面的内容添加到/etc/rc.conf中

nginx_enable="YES"

安装PHP-FPM及相关连的包

以root身份继续执行下面的操作

#cd /usr/ports/devel/pcre
#make install clean
#cd /usr/ports/devel/libtool
#make install clean
#cd /usr/ports/lang/php5
#make install clean
#cd /usr/ports/lang/php5-extensions
#make install clean

在php5-extensions的config页面中,需要勾选PHP-FPM项。

执行完成后,把下面的代码加入/etc/rc.conf以启用PHP-FPM

php_fpm_enable="YES"

同时还要创建一个php.ini文件:

#cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini

同时可以编辑php.ini,把里面的timezone设置为Asia/Shanghai或者需要使用的时区。

启动服务

#/usr/local/etc/rc.d/php-fpm start
#/usr/local/etc/rc.d/nginx start

这样就成功启动了服务

配置虚拟主机运行PHP程序

准备网站目录

首先建立网站的目录和日志存放目录,日志即可以配置到/var/logs/nginx下面,也可以配置到任何你希望存放的位置。

mkdir /home/saharabear.com/public_html
mkdir /home/saharabear.com/logs

配置nginx.conf

可以直接参考下面的配置文件来修改/usr/local/etc/nginx/nginx.conf

user  nobody;
worker_processes  1;

error_log  logs/error.log;

pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

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

    log_format  main  ‘$remote_addr – $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"’;

    sendfile        on;

    keepalive_timeout  65;

    gzip  on;

    # We define the virtual host here
    server {
        listen       208.62.123.122:80;
        server_name  saharabear.com www.saharabear.com;

        access_log  /home/saharabear.com/logs/access.log  main;

        location / {
            root   /home/saharabear.com/public_html;
            index  index.html index.htm index.php;
        }
    # Let nginx know how to handle PHP using fastcgi
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/saharabear.com/public_html$fastcgi_script_name;
            # 上面这一行很重要,别忘了修改这里
            include        fastcgi_params;
        }

        location ~ /\.ht {
            deny  all;
        }
    }
}

重新启动nginx服务器就可以了

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

配置虚拟主机运行使用Symfony2框架的PHP程序

对于PHP的Symfony2框架,配置nginx可能会有一些不同,比如Symfony2使用app.php和app_dev.php作为前端入口等等,可以参考下面的代码配置Symfony2的PHP程序

    server {
        listen       80;
        server_name  test.saharabear.com ;
        root /home/test.saharabear.com/symfony/web;
        charset utf-8;

        access_log  /home/test.saharabear.com/logs/access.log  main;
        error_log /home/test.saharabear.com/logs/errors.log;
        # strip app.php/ prefix if it is present
        rewrite ^/app\.php/?(.*)$ /$1 permanent;

        location / {
          index app.php;
          try_files $uri @rewriteapp;
        }

        location @rewriteapp {
          rewrite ^(.*)$ /app.php/$1 last;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ ^/(app|app_dev)\.php(/|$) {
          fastcgi_pass   127.0.0.1:9000;
          fastcgi_split_path_info ^(.+\.php)(/.*)$;
          include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
          fastcgi_param  HTTPS              off;
        }

        # deny access to .htaccess files, if Apache’s document root
        # concurs with nginx’s one
        #
        location ~ /\.ht {
            deny  all;
        }
    }

原文链接:https://wiki.freebsdchina.org/howto/n/php_php-fpm_nginx

FreeBSD下简易Http代理服务器安装笔记(Squid)

FreeBSD下简易Http代理服务器安装笔记(Squid)

一、更新ports
# csup -L 2 -h cvsup.freebsdchina.org /usr/share/examples/cvsup/ports-supfile

二、安装Squid
# cd /usr/ports/www/squid
# make install clean

三、生成密码文件
# htpasswd -c /usr/local/etc/squid/password username
输入两次密码即可生成密码文件

四、配置
# vi /usr/local/etc/squid/squid.conf

http_port 3128
cache_dir null /var/squid/cache/
cache_access_log /var/squid/logs/access.log
cache_log /var/squid/logs/cache.log
cache_store_log /var/squid/logs/store.log

acl all src 0.0.0.0/0

auth_param basic program /usr/local/libexec/squid/ncsa_auth /usr/local/etc/squid/password
auth_param basic children 5
auth_param basic credentialsttl 2 hours
auth_param basic realm bsdart.org
acl auth_user proxy_auth REQUIRED
http_access allow auth_user

五、建立缓存
# /usr/local/sbin/squid -z

六、启动服务
# vi /etc/rc.conf

squid_enable="YES"

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

原文链接:http://dinggd.com/2012/11/freebsd%E4%B8%8B%E7%AE%80%E6%98%93http%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E8%A3%85%E7%AC%94%E8%AE%B0squid/

FreeBSD下安装lighttpd

安装 lighttpd 於 FreeBSD

作者:zeissoctopus

以下是我安装和配置 lighttpd 1.4.29 万维网服务器於 FreeBSD 8-Stable 的笔记。我会启动以下几项功能:

SSL
lighttpd 的 simple namebase virtualhost
FastCGI 支援 PHP

1: 安装软件

从 ports 编译安装 lighttpd 入 FreeBSD

% cd /usr/ports/www/lighttpd
% su root
# make install
# make clean
# exit

以下是我用 ports 编译 lighttpd 时所选择的选项

WITHOUT_BZIP2    true
WITHOUT_CML    true
WITHOUT_FAM    true
WITHOUT_GDBM    true
WITH_IPV6    true
WITHOUT_LIBEV    true
WITHOUT_MAGNET    true
WITHOUT_MEMCACHE    true
WITHOUT_MYSQL    true
WITHOUT_MYSQLAUTH    true
WITHOUT_NODELAY    true
WITHOUT_OPENLDAP    true
WITH_OPENSSL    true
WITHOUT_SPAWNFCGI    true
WITHOUT_VALGRIND    true
WITHOUT_WEBDAV    true
FreeBSD 默认 Httpd 使用者身份是 www:www

2: 安排网站的文件目录

lighttpd 执行时,会产生一些文件。lighttpd 也会找寻网站实际放置的位置。因此需要事先安排妥当。因为我只需要 lighttpd 为一个 domain 服务,所以我只需要依 从 simple virtualhost 规则建立网站的目录结构。然而所有文件位置皆可以自由安排,本例子是依从我个人喜好来决定而已。

lighttpd 执行时产生的文件

image

lighttpd 的 simple namebase virtualhost 目录安排

除了根目录外,其余皆以 virtual host 网站名称来命名目录

image

3: 配置 FreeBSD ports 里的 lighttpd

在 FreeBSD 里默认配置文件的位置

image

有关本例子载入配置文件的次序

本例子会启动 Lighttpd 的 ssl、fastcgi 和 simple_vhost 模块,因此有关配置文件会按以 下次序读入:

/usr/local/etc/lighttpd/lighttpd.conf
/usr/local/etc/lighttpd/modules.conf
/usr/local/etc/lighttpd/conf.d/fastcgi.conf
/usr/local/etc/lighttpd/conf.d/simple_vhost.conf
换言之,本例子只需要适当修改以上4个配置文件。

lighttpd.conf 内容

#######################################################################
##
## /usr/local/etc/lighttpd/lighttpd.conf
##
#######################################################################
 
#######################################################################
##
## 定义有些有关目录的变量
##
var.log_root    = "/var/log/lighttpd"
var.state_dir   = "/var/run"
var.home_dir    = "/var/spool/lighttpd"
var.conf_dir    = "/usr/local/etc/lighttpd"
 
##
## Virutal Hosts 的根目录
##
## 用于以下模块:
## conf.d/evhost.conf
## conf.d/simple_vhost.conf
## vhosts.d/vhosts.template
##
var.vhosts_dir  = "/home/www"
 
##
## CGI/FastCGI socket 目录
##
## 用于以下模块:
## conf.d/fastcgi.conf
## conf.d/scgi.conf
##
var.socket_dir  = "/var/lib/lighttpd/sockets"
 
##
#######################################################################
 
#######################################################################
##
## 载入模块定义文件
include "modules.conf"
 
##
#######################################################################
 
#######################################################################
##
##  Lighttpd 基本设定
## ———————
##
server.port = 80
 
## 用否 IPv6?
server.use-ipv6 = "disable"
 
## 缚紧 IP
server.bind = "127.0.0.1"
 
## Lighttpd 以什么身份执行.
server.username  = "www"
server.groupname = "www"
 
## Server: 回应字串
server.tag = "lighttpd"
 
## Lighttpd 的 pid 文件
server.pid-file = state_dir + "/lighttpd.pid"
 
## 默认文件目录
server.document-root = "/home/www/example.org/htdocs/"
 
##
#######################################################################
 
#######################################################################
##
##  Logging 选项
## ——————
##
server.errorlog             = log_root + "/lighttpd-error.log"
 
##
## Access log config
##
include "conf.d/access_log.conf"
 
##
## The debug options are moved into their own file.
## see conf.d/debug.conf for various options for request debugging.
##
include "conf.d/debug.conf"
 
##
#######################################################################
 
#######################################################################
##
##  Tuning/Performance
## ——————–
##
server.event-handler = "freebsd-kqueue"
 
##
## The basic network interface for all platforms at the syscalls read()
## and write(). Every modern OS provides its own syscall to help network
## servers transfer files as fast as possible
##
## linux-sendfile – is recommended for small files.
## writev         – is recommended for sending many large files
##
server.network-backend = "writev"
 
##
## As lighttpd is a single-threaded server, its main resource limit is
## the number of file descriptors, which is set to 1024 by default (on
## most systems).
##
## If you are running a high-traffic site you might want to increase this
## limit by setting server.max-fds.
##
## Changing this setting requires root permissions on startup. see
## server.username/server.groupname.
##
## By default lighttpd would not change the operation system default.
## But setting it to 2048 is a better default for busy servers.
##
server.max-fds = 2048
 
##
## Stat() call caching.
##
## lighttpd can utilize FAM/Gamin to cache stat call.
##
## possible values are:
## disable, simple or fam.
##
server.stat-cache-engine = "simple"
 
##
## Fine tuning for the request handling
##
## max-connections == max-fds/2 (maybe /3)
## means the other file handles are used for fastcgi/files
##
server.max-connections = 1024
 
##
## How many seconds to keep a keep-alive connection open,
## until we consider it idle.
##
## Default: 5
##
server.max-keep-alive-idle = 5
 
##
## How many keep-alive requests until closing the connection.
##
## Default: 16
##
server.max-keep-alive-requests = 16
 
##
## Maximum size of a request in kilobytes.
## By default it is unlimited (0).
##
## Uploads to your server cant be larger than this value.
##
server.max-request-size = 0
 
##
## Time to read from a socket before we consider it idle.
##
## Default: 60
##
server.max-read-idle = 60
 
##
## Time to write to a socket before we consider it idle.
##
## Default: 360
##
server.max-write-idle = 360
 
##
##  Traffic Shaping
## —————–
##
## see /usr/share/doc/lighttpd/traffic-shaping.txt
##
## Values are in kilobyte per second.
##
## Keep in mind that a limit below 32kB/s might actually limit the
## traffic to 32kB/s. This is caused by the size of the TCP send
## buffer.
##
## per server:
##
server.kbytes-per-second = 128
 
##
## per connection:
##
connection.kbytes-per-second = 32
 
##
#######################################################################
 
#######################################################################
##
##  Filename/File handling
## ————————
 
##
## files to check for if …/ is requested
## index-file.names            = ( "index.php", "index.rb", "index.html",
##                                 "index.htm", "default.htm" )
##
index-file.names += (
  "index.xhtml", "index.html", "index.htm", "index.php"
)
 
##
## deny access the file-extensions
##
## ~    is for backupfiles from vi, emacs, joe, …
## .inc is often used for code includes which should in general not be part
##      of the document-root
url.access-deny             = ( "~", ".inc" )
 
##
## disable range requests for pdf files
## workaround for a bug in the Acrobat Reader plugin.
##
$HTTP["url"] =~ "\.pdf$" {
  server.range-requests = "disable"
}
 
##
## which extensions should not be handle via static-file transfer
##
## .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi
##
static-file.exclude-extensions = ( ".php", ".php5", ".pl", ".fcgi", ".scgi" )
 
##
## mimetype mapping
##
include "conf.d/mime.conf"
 
##
## directory listing configuration
##
include "conf.d/dirlisting.conf"
 
##
## Should lighttpd follow symlinks?
##
server.follow-symlink = "disable"
 
##
## force all filenames to be lowercase?
##
server.force-lowercase-filenames = "disable"
 
##
## defaults to /var/tmp as we assume it is a local harddisk
##
server.upload-dirs = ( "/var/tmp" )
 
##
#######################################################################
 
#######################################################################
##
## SSL Settings
##
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/usr/local/etc/ssl/crt/YourHost.pem"
ssl.use-sslv3 = "enable"
ssl.cipher-list = "TLSv1+HIGH:SSLv3+HIGH:!aNULL:!eNULL:!3DES:@STRENGTH"
}
 
##
#######################################################################
 
#######################################################################
##
## Simple virtual host
##
 
$HTTP["host"] != "wiki.example.org" {
accesslog.filename = log_root + "/example.org-access.log"
}
 
 
$HTTP["host"] == "wiki.example.org" {
accesslog.filename = log_root + "/wiki.example.org-access.log"
}

modules.conf 内容

#######################################################################
##
##  Modules to load
## —————–
##
## at least mod_access and mod_accesslog should be loaded
## all other module should only be loaded if really neccesary
##
## – saves some time
## – saves memory
##
## the default module set contains:
##
## "mod_indexfile", "mod_dirlisting", "mod_staticfile"
##
## you dont have to include those modules in your list
##
## Modules, which are pulled in via conf.d/*.conf
##
## NOTE: the order of modules is important.
##
## – mod_accesslog     -> conf.d/access_log.conf
## – mod_compress      -> conf.d/compress.conf
## – mod_status        -> conf.d/status.conf
## – mod_webdav        -> conf.d/webdav.conf
## – mod_cml           -> conf.d/cml.conf
## – mod_evhost        -> conf.d/evhost.conf
## – mod_simple_vhost  -> conf.d/simple_vhost.conf
## – mod_mysql_vhost   -> conf.d/mysql_vhost.conf
## – mod_trigger_b4_dl -> conf.d/trigger_b4_dl.conf
## – mod_userdir       -> conf.d/userdir.conf
## – mod_rrdtool       -> conf.d/rrdtool.conf
## – mod_ssi           -> conf.d/ssi.conf
## – mod_cgi           -> conf.d/cgi.conf
## – mod_scgi          -> conf.d/scgi.conf
## – mod_fastcgi       -> conf.d/fastcgi.conf
## – mod_proxy         -> conf.d/proxy.conf
## – mod_secdownload   -> conf.d/secdownload.conf
## – mod_expire        -> conf.d/expire.conf
##
 
server.modules = (
  "mod_access",
  "mod_alias",
  "mod_auth",
#  "mod_evasive",
  "mod_redirect",
  "mod_rewrite",
  "mod_setenv",
#  "mod_usertrack",
)
 
##
#######################################################################
 
#######################################################################
##
##  Config for various Modules
##
 
##
## mod_ssi
##
#include "conf.d/ssi.conf"
 
##
## mod_status
##
#include "conf.d/status.conf"
 
##
## mod_webdav
##
#include "conf.d/webdav.conf"
 
##
## mod_compress
##
#include "conf.d/compress.conf"
 
##
## mod_userdir
##
#include "conf.d/userdir.conf"
 
##
## mod_magnet
##
#include "conf.d/magnet.conf"
 
##
## mod_cml
##
#include "conf.d/cml.conf"
 
##
## mod_rrdtool
##
#include "conf.d/rrdtool.conf"
 
##
## mod_proxy
##
#include "conf.d/proxy.conf"
 
##
## mod_expire
##
#include "conf.d/expire.conf"
 
##
## mod_secdownload
##
#include "conf.d/secdownload.conf"
 
##
#######################################################################
 
#######################################################################
##
## CGI modules
##
 
##
## SCGI (mod_scgi)
##
#include "conf.d/scgi.conf"
 
##
## FastCGI (mod_fastcgi)
##
include "conf.d/fastcgi.conf"
 
##
## plain old CGI (mod_cgi)
##
#include "conf.d/cgi.conf"
 
##
#######################################################################
 
#######################################################################
##
## VHost Modules
##
##  Only load ONE of them!
## ========================
##
 
##
## You can use conditionals for vhosts aswell.
##
## see http://www.lighttpd.net/documentation/configuration.html
##
 
##
## mod_evhost
##
#include "conf.d/evhost.conf"
 
##
## mod_simple_vhost
##
include "conf.d/simple_vhost.conf"
 
##
## mod_mysql_vhost
##
#include "conf.d/mysql_vhost.conf"
 
##
#######################################################################

fastcgi.conf 内容

以下 fastcgi.conf 仅支援 PHP5,并以 socket 方式来连接 Lighttpd 和 FastCGI Daemon,在 FreeBSD 里,php-cgi 是放在 /usr/local/bin 目录。

#######################################################################
##
##  FastCGI Module
## —————
##
## http://www.lighttpd.net/documentation/fastcgi.html
##
server.modules += ( "mod_fastcgi" )
 
##
## PHP Example
## For PHP don’t forget to set cgi.fix_pathinfo = 1 in the php.ini.
##
## The number of php processes you will get can be easily calculated:
##
## num-procs = max-procs * ( 1 + PHP_FCGI_CHILDREN )
##
## for the php-num-procs example it means you will get 17*5 = 85 php
## processes. you always should need this high number for your very
## busy sites. And if you have a lot of RAM. 🙂
##
fastcgi.server = ( ".php" =>
                   ( "php-local" =>
                     (
                       "socket" => socket_dir + "/php-fcgi.socket",
                       "bin-path" => "/usr/local/bin/php-cgi",
                       "bin-environment" => (
                         "PHP_FCGI_CHILDREN" => "8",
                         "PHP_FCGI_MAX_REQUESTS" => "10000",
                       ),
                       "max-procs" => 1,
                       "broken-scriptfilename" => "enable",
                     )
                   ),
                )
simple_vhost.conf 内容

simple_vhost.conf
#######################################################################
##
##  Simple Virtual hosting
## ————————
##
## http://www.lighttpd.net/documentation/simple-vhost.html
##
server.modules += ( "mod_simple_vhost" )
 
##  If you want name-based virtual hosting add the next three settings and load
##  mod_simple_vhost
##
## document-root =
##   virtual-server-root + virtual-server-default-host + virtual-server-docroot
## or
##   virtual-server-root + http-host + virtual-server-docroot
##
simple-vhost.server-root   = vhosts_dir + "/"
simple-vhost.default-host  = "example.org"
simple-vhost.document-root = "htdocs"
 
##
## Print some errors for finding the document-root
##
#simple-vhost.debug = "enable"
 
##
#######################################################################

4: 启动 Lighttpd 服务

请在 /etc/rc.conf 加入以下一行。那么每次重启 FreeBSD 皆会自动启动 Lighttpd

lighttpd_enable="YES"

不想重启 FreeBSB,立即启动 Lighttpd 的话,按上面修改 /etc/rc.conf 后输入以下命令便可。

% su –
# service lighttpd start
# exit

原文链接:http://wiki.freebsdchina.org/doc/l/lighttpd_1_14_29

FreeBSD PostgreSQL 9 Hot Standby 实践

FreeBSD PostgreSQL 9 Hot Standby 实践

注:PostgreSQL 9 Hot Standby的关键点有2个,工作模式和操作顺序,除了概念的理解。

一、安装PostgreSQL 9

portmaster -d databases/postgresql90-server
修改/etc/login.conf
postgres:\
:lang=en_US.UTF-8:\
:setenv=LC_COLLATE=C:\
:tc=default:
执行cap_mkdb /etc/login.conf

二、初始化主数据库

su pgsql
/usr/local/bin/initdb -D /usr/local/pgsql/data –locale=C -E UTF8 初始化
修改postgresql.conf:
wal_level = hot_standby
max_wal_senders = 1
wal_keep_segments = 32
log_destination = ‘stderr’
logging_collector = on
log级别根据需要设置,建议debug1下一级别即可(log,info)
修改pg_hba.conf:
host replication pgsql 127.0.0.1/32 trust

三、启动主数据库

/usr/local/bin/postmaster -D /usr/local/pgsql/data
看看日志,已经起来:
LOG: database system is ready to accept connections
LOG: autovacuum launcher started

四、基础备份:

流程:在主数据库服务器执行 pg_start_backup(),复制data目录,再执行
pg_stop_backup()。
$ psql -d postgres
postgres=# select pg_start_backup(”);
这个时候,所有请求在写日志之后不会再刷新到磁盘。除非pg_stop_backup()这个函数
被执行。
接下来,把data目录直接复制data2,这个目录将通过scp、rsync等工具同步到节点服
务器,data2就是基础备份的内容。
cd /usr/loca/pgsql
cp -R data/ data2

五、创建节点数据库(Standby)

cd data2
修改postgres.conf
port = 54321
hot_standby = on
增加recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘host=127.0.0.1 port=5432 user=pgsql’
rm postmaster.pid

六、停止主数据库基础备份

postgres=# select pg_stop_backup();
现在数据会写入磁盘,当节点服务器启动后,他会自动连接到主服务器,拉取主服务器
自基础备份后的事务日志。然后,对事务日志进行重演,从而达到恢复数据的效果。

七、启动节点数据库

/usr/local/bin/postmaster -D /usr/local/pgsql/data2
看看日志:
DEBUG: initializing for hot standby
LOG: streaming replication successfully connected to primary
DEBUG: end of backup reached
LOG: consistent recovery state reached at 0/3000000
LOG: database system is ready to accept read only connections

八、测试。