Total Pageviews

Tuesday 17 January 2012

一步步安装FreeBSD-9.0-RC1于GPT + ZFS

觉得Linux频繁的内核升级实在让人不爽,于是动了把Linux请出硬盘的念头。经过不懈努力,终于完成了这个浩大的工程,特此把安装记录分享如下。

已知问题
FreeBSD-9.0-RC1 虽然以全新 bsdinstaller 来安装,它可以通过gpart来把硬盘格式化成 GPT+freebsd-zfs,但可惜它仍不支持直接安装在ZFS。简单来说,FreeBSD-9.0-RC1仍不支持GPT+ZFS直接安装。

本文范围
重新划分分区表,把所有旧资料清空。
使用gpt规划硬盘分区表。
使用Single Pool规划ZFS。
使用 ZFS 来规划SWAP,不必另加独立SWAP分区。
最少安装 FreeBSD Base,reboot后可以成功从ZFS启动FreeBSD。
系统设置和软件安装可参考本人之前的《FreeBSD桌面笔记》。

本文参考 2 个网页
本篇 97% 翻译这里,但发现有次序错误,本文已修正:http://www.aisecure.net/?p=132
直接用 ZFS 来建立 SWAP,主要参考这里的方法:http://wiki.freebsd.org/RootOnZF ... 2a59c9ef6a8e183a361

硬件环境
Asus N73SV笔记本电脑
CPU:Intel Core i7 2630QM
12GB DDR3 RAM(注意,ZFS文件系统对内存要求较高,最好保证有4GB以上RAM,安装完成后,我的系统空载时候内存占用就有2GB)
750GB硬盘

安装介质
FreeBSD-9.0-RC1-amd64-memstick.img

硬件准备
BIOS中把SATA设为AHCI模式。
BIOS设定由U盘启动。

安装介质准备
下载FreeBSD-9.0-RC1-amd64-memstick.img,把它写入U盘。

U盘启动FreeBSD 9.0

进入LiveCD模式
不要选install选LiveCD
输入root 按 ENTER 进入Live系统(不用密码)

创建一个RAMDISK,挂载于/tmp,用来暂存下文提及的必要文件/tmp/zpool.cache(可不做)
umount /dev/md1
mdmfs -s 512M md1 /tmp
建立GPT+ZFS分区
找出硬盘的名称,第一个AHCI硬盘通常是 /dev/ada0(FreeBSD-9.0内核内建AHCI支持)。
ls /dev/ad*
检查硬盘是否有分区
gpart show ada0

如果有分区,使用gpart清空。
由于每部电脑情况不同,这部份请自行man gpart学习有关gpart delete和gpart erase的语法。
清空旧资料后,现在可以重新划分gpt分区表。
gpart create -s gpt ada0

给FreeBSD分出一个分区用于启动,注意,如果是物理扇区为4KB的高级格式硬盘,要加入-a 4K参数以保证扇区对齐
gpart add -s 64k -t freebsd-boot ada0

剩下的容量都给ZFS作为第二个分区,注意,如果是物理扇区为4KB的高级格式硬盘,要加入-a 4K参数以保证扇区对齐
gpart add -t freebsd-zfs ada0

把FreeBSD gpt+zfs的boot loader写入第一分区。
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

在第二个分区中,创建Single Pool模式的ZFS,把它命令为zroot。
zpool create zroot /dev/ada0p2
zpool set bootfs=zroot zroot
zfs set checksum=fletcher4 zroot

使用zfs create命令,在ZFS中创建SWAP,我建立了8GB的SWAP。
zfs create -V 10G zroot/swap
zfs set checksum=off zroot/swap
zfs set org.freebsd:swap=on zroot/swap

使用zfs create命令,创建系统目录结构。
zfs set mountpoint=/mnt zroot
zfs create zroot/usr
zfs create zroot/usr/home
zfs create zroot/var
zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
zfs create -o compression=lzjb -o setuid=off  zroot/usr/ports
zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
zfs create -o compression=lzjb -o exec=off -o setuid=off  zroot/usr/src
zfs create -o compression=lzjb  -o exec=off     -o setuid=off   zroot/var/crash
zfs create -o exec=off -o setuid=off zroot/var/db
zfs create -o compression=lzjb  -o exec=on -o setuid=off  zroot/var/db/pkg
zfs create -o exec=off -o setuid=off   zroot/var/empty
zfs create -o compression=lzjb  -o exec=off -o setuid=off  zroot/var/log
zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
zfs create -o exec=off -o setuid=off   zroot/var/run
zfs create -o compression=lzjb  -o exec=on -o setuid=off   zroot/var/tmp

使用zpool export和zpool import把刚才规划的ZFS挂载到/mnt,以便下一步安装系统。
zpool export zroot
zpool import -o cachefile=/tmp/zpool.cache zroot

现在,你所规划的ZFS已挂载到 /mnt,你可以ls /mnt,会发现有/mnt/usr /mnt/var /mnt/tmp,此时请完成以下命令。
chmod 1777 /mnt/tmp
chmod 1777 /mnt/var/tmp

正式把FreeBSD 9.0-RC1安装进/mnt 中的ZFS,此时以转用sh做SHELL为佳,请留意for那一行,因为太长,宜使用\分行输入。
sh
cd /usr/freebsd-dist
export DESTDIR=/mnt
for file in base.txz lib32.txz kernel.txz doc.txz games.txz ports.txz src.txz; \ do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done

你已把所有基本系统安装进/mnt中的ZFS了,以下一步必需要做,否则你重启电脑会失败,把zpool.cache拷贝到指定位置。
cp /tmp/zpool.cache /mnt/boot/zfs/zpool.cache

最后,为新系统编写相关的/etc/rc.conf /etc/fstab /boot/loader.conf,指示新系统由ZFS启动。注意,未重新启动之前,有关文件是放在/mnt下。
编写 rc.conf
echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf

编写 loader.conf
echo 'zfs_load="YES"' >> /mnt/boot/loader.conf
echo 'vfs.root.mountfrom="zfs:zroot"' >> /mnt/boot/loader.conf

编写fstab(其实这个文件一般是空的,因为一切挂载点和swap都会在启动ZFS时自动挂载好,这个空fstab是为了满足一些系统脚本而存在而已)。
touch /mnt/etc/fstab

还有最后一步!把ZFS的挂载点指定为/。
zfs set readonly=on zroot/var/empty
zfs unmount -a
zfs set mountpoint=legacy zroot
zfs set mountpoint=/tmp zroot/tmp
zfs set mountpoint=/usr zroot/usr
zfs set mountpoint=/var zroot/var

然后进行重启,就可以顺利进入新装好的FreeBSD-9.0 based on ZFS了,当然,为了方便起见,可以把/usr/home连接到/。
ln -s /usr/home /home

经过一晚上的编译,本人的桌面已经完成.

No comments:

Post a Comment