FreeBSD 10.0 正式版发布

经过 5 个 RC 版本后,FreeBSD 10.0 正式版终于发布了!!!

下载地址:http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/10.0/

这一版本包含的重要改进包括:

* 在支持的平台上, clang(1) 取代 GCC 成为了默认的系统编译器。
* 系统中引入了 Unbound 作为本地的缓存 DNS 服务器。
* 基本系统中删除了 BIND。
* 使用来自 NetBSD 的 bmake(1) 取代了原有的 make(1)。
* 使用了新的 pkg(7) 作为包管理工具。
* 删去了旧式的包管理工具 pkg_add(1)、 pkg_delete(1), 及其相关工具。
* 对虚拟化支持进行了大幅强化,新增了 bhyve(8) 虚拟机,以及 virtio(4) 和对微软 Hyper-V 的原生半虚拟化支持。
* 为 ZFS 添加了用于 SSD 的 TRIM 支持。
* 为 ZFS 添加了高性能的 LZ4 压缩算法支持。

FreeBSD 下双显示器的设置

双显示器的好处,除了吸引妹妹羡慕的眼光,的确还是有一些的。譬如,同时使用多个显示器进行工作的好处和不利

实验室的朋友们都转向大屏幕了,淘汰了一些同类型的显示器被我捡了来。我想在FreeBSD下搞一个双显示器来娱乐一下自己,活跃一下单调乏味的码字生活。

Windows 下设置双显示器只需要点点鼠标,FreeBSD 下则需要修改 xorg.conf。当然,过程并不复杂。这个帖子就是我设置双显示器的经验记录,希望对您有所帮助。

第一步:观察显卡和显示器接口

一般台式机的显卡和显示器都提供VGA和DVI接口,或者两个VGA,或者两个DVI,或者一个VGA一个DVI。根据实际情况,选择连线。我的DELL机器是一个VGA一个DVI,所以我准备了一条 Male-Male VGA 线,一条 Male-Male DVI-D 线。(看完这一段,明白了你的码字生活真的好乏味)

DVI线有三种,科普知识见DVI接口。例如,“DVI-I支持数字/模拟转换的接口类型,倘若显示器只有一个DVI接口,那就会搭配支持数字/模拟两种模式的DVI-I。假如显示器有DVI和VGA两种接口,则搭配DVI-D。”

第二步:在 FreeBSD 下查看接口信息

把线连上以后,要查看一下接口的信息,可以用 xrandr 命令。我的机器显示如下信息:

IOU@~$ xrandr 
Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 2560 x 1024
VGA-0 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm
   1280x1024      60.0*+   75.0  
   1152x864       75.0  
   1024x768       75.0     60.0  
   800x600        75.0     60.3  
   640x480        75.0     59.9  
   720x400        70.1  
DVI-0 connected 1280x1024+1280+0 (normal left inverted right x axis y axis) 338mm x 270mm
   1280x1024      60.0*+   75.0  
   1152x864       75.0  
   1024x768       75.0     60.0  
   800x600        75.0     60.3  
   640x480        75.0     59.9  
   720x400        70.1  
S-video disconnected (normal left inverted right x axis y axis)

第三步:设置 xorg.conf

两个显示器分别起名为 VGA-0 和 DVI-0。有些配置文档说,要设置两个显示器的位置关系,哪个在哪个的左边。在 xorg.conf 里我尝试着没设置,结果是缺省地,VGA-0 应该放在 DVI-0 的左侧,这样鼠标在两个显示器里移动才符合正常人的习惯。如果非要设置,可以

root@~# xrandr --output DVI-0 --right-of VGA-0

我的 xorg.conf 设置如下,根据实际情况,你可能需要局部地修改。Have fun with your dual monitors!

Section "ServerFlags"
        Option         "AutoAddDevices" "Off"
        Option         "Xinerama" "True"
EndSection

Section "Files"
        ModulePath   "/usr/local/lib/xorg/modules"
        FontPath     "/usr/local/lib/X11/fonts/wqy/"
        FontPath     "/usr/local/lib/X11/fonts/misc/"
        FontPath     "/usr/local/lib/X11/fonts/TTF/"
        FontPath     "/usr/local/lib/X11/fonts/OTF"
        FontPath     "/usr/local/lib/X11/fonts/Type1/"
        FontPath     "/usr/local/lib/X11/fonts/100dpi/"
        FontPath     "/usr/local/lib/X11/fonts/75dpi/"
EndSection

Section "Module"
        Load  "extmod"
        Load  "record"
        Load  "dbe"
        Load  "dri"
        Load  "dri2"
        Load  "glx"
EndSection

Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
EndSection

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/sysmouse"
        Option      "ZAxisMapping" "4 5 6 7"
EndSection

Section "Device"
        Identifier  "Card0"
        Driver      "radeon"
        VendorName  "Advanced Micro Devices, Inc. [AMD/ATI]"
        BoardName   "RV370 [Radeon X300]"
        BusID       "PCI:1:0:0"
EndSection

Section "Monitor"
        Identifier   "VGA-0"
        VendorName   "DEL"
        ModelName    "DELL 1703FP"
        Option       "DPMS"
EndSection

Section "Monitor"
        Identifier   "DVI-0"
        VendorName   "DEL"
        ModelName    "DELL 1703FP"
        Option       "RightOf" "VGA-0"
        Option       "DPMS"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "VGA-0"
        SubSection "Display"
                Viewport   0 0
                Virtual   2560 1024
                Depth     24
                Modes     "1280x1024"
        EndSubSection
EndSection

Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen         "Screen0"
        InputDevice    "Mouse0" "CorePointer"
        InputDevice    "Keyboard0" "CoreKeyboard"
        Option         "AIGLX" "True"
        Option         "DRI2" "True"
EndSection

Section "DRI"
        Group 0
        Mode 0660
EndSection

Section "Extensions"
        Option  "Composite" "Enable"
EndSection

补充

后来,换了台主机,intel 的显卡。还是同样的步骤,只是 BusID 不太一样,需要改一下。其他的就没有什么要补充的了。

效果图

效果图以后有机会再上。

小屏幕练就斗鸡眼,宽屏幕练就散光眼。双显示器的确锻炼使用者的注意力,初级阶段是左眼看左屏幕,右眼看有屏幕;高级阶段是左眼看右屏幕,右眼看左屏幕。我希望通过锻炼,能够练就两只火眼金睛,有助于我申请保安里的高档职业—盯监视器。一大堆屏幕摆在面前,保证不放过一个美女。

制作便携式系统维护盘

本文主要描述如何在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 cshrc tips

cshrc tips
作为csh/tcsh的配置文件,常用的包括系统级的/etc/csh.cshrc与用户级的~/.cshrc,后者的优先级高于前者。这里为便于描述,统称cshrc。

1. umask

umask称作用户权限屏蔽位,用于在创建文件或目录时设置默认权限。这里用一些操作来具体说明umask的用法:

> umask                                       # 查看当前umask值
22                                            # 22是csh的默认值
> touch file_umask22 && mkdir dir_umask22/
> ls -lod *_umask22
drwxr-xr-x  2 alphachi  alphachi  – 2 Oct 19 09:51 dir_umask22
-rw-r–r–  1 alphachi  alphachi  – 0 Oct 19 09:51 file_umask22

可以看到,当umask=22时,创建的文件默认权限为rw-r–r–(即644),创建的目录默认权限为rwxr-xr-x(即755)。
在这里,644和755这两个数字是根据“创建默认权限 = 系统默认权限 – umask取值”得出的:
644 = 系统默认权限(文件) – 22
755 = 系统默认权限(目录) – 22
也就是说,文件的系统默认权限为644 + 22 = 666(即rw-rw-rw-),目录的系统默认权限为755 + 22 = 777(即rwxrwxrwx)。这点可以通过将umask设置为0来验证:

> umask 0    # 将umask设置为0
> umask
0
> touch file_umask0 && mkdir dir_umask0/
> ls -lod *_umask0
drwxrwxrwx  2 alphachi  alphachi  – 2 Oct 19 09:52 dir_umask0
-rw-rw-rw-  1 alphachi  alphachi  – 0 Oct 19 09:52 file_umask0

因此可以根据需要在创建文件或目录前临时修改umask取值,例如:

> umask 2
> umask
2
A-desktop > touch file_umask2 && mkdir dir_umask2/
A-desktop > ls -lod *_umask2
drwxrwxr-x  2 alphachi  alphachi  – 2 Oct 19 09:56 dir_umask2     # 775 = 777 – 2
-rw-rw-r–  1 alphachi  alphachi  – 0 Oct 19 09:56 file_umask2    # 664 = 666 – 2

在cshrc中,默认会存在以下配置:

umask 22

需要注意的是,若在cshrc中无此条配置,umask的取值仍然为22,而不是0。

2. PAGER

PAGER是csh/tcsh的常见环境变量,用于设置默认的页面调度程序。以下为cshrc中的默认配置:

setenv PAGER more

将PAGER设置为more的缺点在于:页面输出完毕后若要重新阅读,必须重新调用页面或滚动终端。为了避免这些问题,可以将more更改为功能更为强大的less,即:

setenv PAGER less

与more相比,less的唯一“缺点”在于页面输出完毕后会高亮显示(END)标记,若要退出则需要额外多按一次q键。

3. autorehash

rehash是csh/tcsh的一条内部命令,可以重新计算与环境变量PATH相关的目录的哈希值;在这些目录中添加了新的可执行程序后,往往都需要执行此命令以刷新索引列表,否则系统将无法找到这些程序。
rehash经常在通过Ports安装了新的软件包后使用,例如:
# whereis zsh                          # 这里以通过Ports安装zsh为例
zsh: /usr/ports/shells/zsh
# cd /usr/ports/shells/zsh/
# make BATCH=yes install clean         # BATCH=yes表示使用默认配置编译而跳过编译选项的显示

# zs                                   # 输入zs后按Ctrl+d尝试补全
zstreamdump                            # 没有执行rehash前找不到zsh的相关命令
# rehash
# zs                                   # 再次输入zs后按Ctrl+d尝试补全
zsh         zsh-5.0.0   zstreamdump    # 执行rehash后即可找到相关命令

从版本6.18开始,csh/tcsh引入了新的特殊Shell变量autorehash,用于自动执行rehash操作。若要开启此功能,只需要在cshrc中添加:

set autorehash = always

取值always是指在命令补全和拼写校正时均自动执行rehash操作。若仅需在命令补全时自动执行,可将always更换为complete;若仅需在拼写校正时自动执行,可将always更换为correct。
需要注意的是,默认情况下此功能至少需要在FreeBSD 9.0-STABLE中才能开启,因为之前版本(如9.0-RELEASE)中tcsh的版本均低于6.18。

4. listjobs

listjobs是另一个有用的特殊Shell变量,用于控制任务挂起时的显示方式,以下举例说明:

> set | grep listjobs    # 命令无输出结果表示当前未设置listjobs
> ping www.freebsd.org
PING red.freebsd.org (69.147.83.34): 56 data bytes
64 bytes from 69.147.83.34: icmp_seq=0 ttl=49 time=332.853 ms
^Z                       # 按Ctrl+z挂起
Suspended
> set listjobs           # 仅开启变量listjobs(等于在cshrc中添加配置set listjobs)
> ping www.freebsdchina.org
PING www.freebsdchina.org (222.73.165.29): 56 data bytes
64 bytes from 222.73.165.29: icmp_seq=0 ttl=50 time=73.343 ms
^Z
[1]  – Suspended                     ping www.freebsd.org
[2]  + Suspended                     ping www.freebsdchina.org
> set listjobs = long    # 设置变量listjobs(等于在cshrc中添加配置set listjobs = long)
> ping www.google.com
PING www.google.com (74.125.128.106): 56 data bytes
64 bytes from 74.125.128.106: icmp_seq=1 ttl=45 time=35.502 ms
^Z
[1]    57930 Suspended                     ping www.freebsd.org
[2]  – 57946 Suspended                     ping www.freebsdchina.org
[3]  + 57951 Suspended                     ping www.google.com

可以看到,对于未设置、仅开启、设置变量listjobs这三种情况,任务挂起时的显示信息依次会更加详细。

5. 关于alias

alias为csh/tcsh引入的别名功能非常强大,详见一切皆alias。
虽然alias一般仅出现在cshrc中,但实际上它是csh/tcsh自带的内部命令,因此可以单独使用,例如:
> alias                             # 不使用任何参数则列出所有的别名条目
h       (history 25)
j       (jobs -l)
la      (ls -a)
lf      (ls -FA)
ll      (ls -lA)
> unalias h                         # 删除指定的别名条目
> alias reboot ‘shutdown -r now’    # 添加新的别名条目:
                                    # 在这里系统自带的reboot命令将不再生效,因为alias的优先级更高
j       (jobs -l)
l       (ls -alo)
la      (ls -a)
lf      (ls -FA)
ll      (ls -lA)
reboot  (shutdown -r now)
> \reboot                           # 在命令前添加转义字符\可以忽略alias设置而直接运行原始命令

注意手动输入的alias/unalias仅对当前Shell进程有效,若要始终生效应将其写入cshrc。
无论是采用何种方式配置alias,为防止其可能被Shell曲解,应该为真实命令部分(如上例中的shutdown -r now)的两端添加单引号,若在真实命令部分中存在变量替换,则应将单引号改为双引号。

6. 关于complete

与alias类似,complete也是csh/tcsh自带的内部命令;因此既可以单独使用,也可以写入cshrc。
顾名思义,complete是用于命令补全的,但与普通补全相比其功能更加强大,可以称之为高级补全。
在cshrc中,可以配置以下的普通补全:

if ($?prompt) then            # 仅对交互式Shell生效
    set autolist              # 按下Tab键直接补全
    set complete = enhance    # 补全时忽略大小写,认为-与_相同,将.、-、_作为单词分隔符;
                              # 若将enhance更换为igncase则仅忽略大小写
    set autoexpand            # 补全时参考history命令的输出
endif

配置生效后,将其与complete设置的高级补全进行比较:

> su                                   # 输入su后按Tab键的结果如下
su      sum     suspend                # 注意机器不同可能会出现更多输出
> complete -su* ‘p/0/(su suspend)/’    # 对关键字su设置高级补全:
                                       # -su*表示仅作用于关键字su,例如输入su空格后按Tab键是没有效果的
                                       # p表示作用位置,例如p/0在这里表示作用于su本身
                                       # ()用于限定补全条目,例如这里将补全条目限定于su与suspend
> complete                             # 查看高级补全条目
-su*    ‘p/0/(su suspend)/’
> su                                   # 高级补全下,输入su后按Tab键的结果如下
su      suspend
> uncomplete -su*                      # 删除高级补全条目

可以看到,两者的最大区别在于:在普通补全的基础上,高级补全能够实现更多的条件输出。除此之外,高级补全还能够实现很多普通补全难以实现的补全操作,例如:

> complete man ‘p/*/c/’    # 针对man命令的高级补全:
                           # p表示作用位置,p/*表示对输入的man空格后的任意位置的参数执行补全
                           # c表示补全候选项为当前系统内存在的所有命令
> man a                    # 输入man a后按Tab键的结果如下(此时p/*/c中*为1)
ac          addr2line   amd         ar          at          audit
accton      adduser     amq         arp         atacontrol  auditd
acpiconf    adjkerntz   ancontrol   arpaname    ath3kfw     auditreduce
acpidb      afmtodit    apm         as          atmconfig   authpf
acpidump    alias       apply       asa         atq         awk
addftinfo   alloc       apropos     asf         atrm
> man -w p                 # 输入man -w p后按Tab键的结果如下(此时p/*/c中*为2)
pac           pfbtops       pkg_info      powerd        ps
pagesize      pfctl         pkg_updating  poweroff      psroff
passwd        pflogd        pkg_version   ppp           pstat
paste         pftp          pkill         pppctl        purgestat
patch         pgrep         pmcannotate   pr            pushd
pathchk       pic           pmccontrol    praliases     pw
pawd          ping          pmcstat       praudit       pwait
pax           ping6         popd          pre-grohtml   pwd
pc-sysinstall pkg_add       portaudit     printenv      pwd_mkdb
pciconf       pkg_cleanup   portmaster    printf
periodic      pkg_create    portsnap      procctl
perror        pkg_delete    post-grohtml  procstat

再看一个非常实用的高级补全范例:在csh/tcsh中快速ssh到已保存主机。
1)创建或编辑~/.ssh/config,此文件可以为多个SSH主机保存不同的配置参数(详见man ssh_config):

Host firewall
    HostName     192.168.0.1     # 主机地址
    User         froot           # 登录用户名
    Port         50000           # 连接端口
    IdentityFile ~/.ssh/id/fw    # 调用的私钥文件
    Compression  yes             # 开启压缩
Host router
    HostName            192.168.10.1
    User                root
    Port                51000
    IdentityFile        ~/.ssh/id/router
    ServerAliveInterval 60       # 每60秒发送一次alive包以防止空闲掉线
Host switch
    HostName 192.168.100.1
    User     admin
    Port     54321

2)在cshrc中添加以下内容:

if (-e ~/.ssh/config) then     # 若~/.ssh/config存在则执行以下命令:
                               # 变量sshlist为由~/.ssh/config获取并格式化的主机列表
                               # p/1/($sshlist)将ssh空格后的第一个参数的补全内容限制在($sshlist)中
    set sshlist = `grep Host\  ~/.ssh/config | cut -d \  -f 2`
    complete ssh "p/1/($sshlist)/"
endif

3)通过source cshrc命令使编辑后的cshrc即时生效,然后查看补全效果:

> ssh                       # 输入ssh空格后按Tab键的结果如下
firewall router   switch    # 选择所需补全即可开始连接至对应主机
                            # 若在~/.ssh/config中添加了新的主机,也需要通过source cshrc命令即时生效

当然,complete命令的功能远不止于此,详见man tcsh中REFERENCE > Builtin command > complete一节。
注意与alias相同,手动输入的complete/uncomplete仅对当前Shell进程有效,若要始终生效应将其写入cshrc,此外引号的使用规则也是一样的。

7. 快捷键绑定

csh/tcsh中的快捷键设置实际上也是通过内部命令实现的,例如:

> bindkey -a    # 列出已绑定的快捷键("^"表示Ctrl,"^["表示Alt)
> bindkey -v    # 按照vi方式绑定快捷键
> bindkey -e    # 按照emacs方式绑定快捷键
> bindkey -h    # 显示所有帮助信息

与所有内部命令相同,bindkey既可以手动配置也可以写入cshrc中。
在控制台下,若需使用左Alt作为快捷键前缀,除了根据bindkey命令配置外,还应执行以下操作:
1)编辑/usr/share/syscons/keymaps/us.iso.kbd,将056行的首个lalt修改为meta;
2)执行kbdcontrol -l us.iso.kbd,也可在/etc/rc.conf中添加keymap=“us.iso.kbd”以使其永久生效。
注意此设置会带来一些“副作用”,例如无法再通过左Alt配合F功能键切换控制台,不过可以使用Ctrl+左Alt或右Alt替代。
8. 个性化提示符

提示符一节中已经对此做了详细的描述,这里仅说明如何针对X与控制台设置不同的提示符。
在cshrc中添加以下内容:

if ($?prompt) then
    if ($?DISPLAY) then    # 针对X:
                           # 特殊字符串%{\e]0;加\a%}的组合可以将两者中间的字符发送至终端模拟器
                           # 其他的%相关含义详见man tcsh中REFERENCE > Special shell variables > prompt一节
        set prompt = "%{\e]0;%l = %~\a%}%B%m %# %b"
    else                   # 针对控制台
        set prompt = "%B%m:%l%b %~ %B%# %b"
    endif
endif

以上设置生效后,在X下类似于XTerm的终端模拟器里,csh/tcsh的提示符中被发送的字符会显示于窗口标题栏,而在控制台下则会全部显示。

附:更多的cshrc范例

在Ports中提供了一个关于cshrc的包,位于/usr/ports/shells/tcshrc;安装之后,可以学到一些更高级的配置写法。

原文链接:https://wiki.freebsdchina.org/doc/c/cshrc_tips

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