电脑报官方论坛

 找回密码
 注册
查看: 23054|回复: 6

[教程分享] 这几天的成果——基于UFS+ZFS的FreeBSD混合分区方案 [复制链接]

自成一派

BSD Lover

Rank: 11Rank: 11Rank: 11Rank: 11

树叶
1061
金币
1592
积分
1080

斑竹纪念章 系统名医(操作系统)

发表于 2012-7-20 19:12:24 |显示全部楼层
本帖最后由 woodelf 于 2012-7-21 10:37 编辑

我的FreeBSD和Funtoo Linux装在同一个硬盘上(GPT)。为了和Grub2兼容(Funtoo Linux的Grub2不包含ZFS模块,因此无法用之前的方法启动FreeBSD),于是决定把FreeBSD的/boot或者/单独分出来,使用ufs文件系统。但是考虑到如果把/作为ufs,那么其他挂载点就必须每个挂载点单独做一个zpool,会丧失很多灵活性,因此最终决定把/boot作为ufs,用Grub2引导来引导FreeBSD的loader,达到兼容的目的。网上找到的都是基于MBR分区表的教程,经过一番摸索,终于顺利达成目标。

我的硬盘分区情况如下:
/dev/sdc1——BIOS兼容分区
/dev/sdc2——Linux的/boot
/dev/sdc3——Linux的swap
/dev/sdc4——Linux的/
/dev/sdc5——FreeBSD的swap
/dev/sdc6——FreeBSD的/boot(UFS)
/dev/sdc7——FreeBSD的/(ZFS)

我所要做的就是把剩余的400GB空间划分给FreeBSD,并且把/boot和swap也分出来,独立于ZFS之外。

话不多说,步骤如下:

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

U盘启动FreeBSD 9.0

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

找出硬盘的名称,第一个AHCI硬盘通常是 /dev/ada0(FreeBSD-9.0内核内建AHCI支持)。
  1. ls /dev/ad*
复制代码
划分出12GB空间作为swap,注意,如果是物理扇区为4KB的高级格式硬盘,要加入-a 4K参数以保证扇区对齐
  1. gpart add -s 12G -t freebsd-swap ada2
复制代码
给FreeBSD分出一个分区用于挂载/boot,注意,如果是物理扇区为4KB的高级格式硬盘,要加入-a 4K参数以保证扇区对齐
  1. gpart add -s 1G -t freebsd-ufs ada2
复制代码
剩下的容量都给ZFS,注意,如果是物理扇区为4KB的高级格式硬盘,要加入-a 4K参数以保证扇区对齐
  1. gpart add -t freebsd-zfs ada2
复制代码
把FreeBSD gpt的boot loader写入第一分区。(如果是我这样的Linux+FreeBSD,并且用Grub2引导的情况,这步不需要)
  1. gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada2
复制代码
在ZFS分区中,创建Single Pool模式的ZFS,把它命令为tank。
  1. zpool create tank /dev/ada2p7
  2. zpool set bootfs=tank tank
  3. zfs set checksum=fletcher4 tank
复制代码
用UFS文件系统格式化以后要用做/boot的分区。
  1. newfs /dev/ada2p6
复制代码
使用zfs create命令,创建系统目录结构。
  1. zfs set mountpoint=/mnt tank
  2. zfs create tank/usr
  3. zfs create tank/usr/home
  4. zfs create tank/var
  5. zfs create -o compression=on -o exec=on -o setuid=off tank/tmp
  6. zfs create -o compression=lzjb -o setuid=off  tank/usr/ports
  7. zfs create -o compression=off -o exec=off -o setuid=off tank/usr/ports/distfiles
  8. zfs create -o compression=off -o exec=off -o setuid=off tank/usr/ports/packages
  9. zfs create -o compression=lzjb -o exec=off -o setuid=off  tank/usr/src
  10. zfs create -o compression=lzjb  -o exec=off     -o setuid=off   tank/var/crash
  11. zfs create -o exec=off -o setuid=off tank/var/db
  12. zfs create -o compression=lzjb  -o exec=on -o setuid=off  tank/var/db/pkg
  13. zfs create -o exec=off -o setuid=off   tank/var/empty
  14. zfs create -o compression=lzjb  -o exec=off -o setuid=off  tank/var/log
  15. zfs create -o compression=gzip -o exec=off -o setuid=off tank/var/mail
  16. zfs create -o exec=off -o setuid=off   tank/var/run
  17. zfs create -o compression=lzjb  -o exec=on -o setuid=off   tank/var/tmp
复制代码
使用zpool export和zpool import把刚才规划的ZFS挂载到/mnt,以便下一步安装系统。
  1. zpool export tank
  2. zpool import -o cachefile=/tmp/zpool.cache tank
复制代码
现在,你所规划的ZFS已挂载到 /mnt,你可以ls /mnt,会发现有/mnt/usr /mnt/var /mnt/tmp,此时请完成以下命令。
  1. chmod 1777 /mnt/tmp
  2. chmod 1777 /mnt/var/tmp
复制代码
把刚才创建的UFS分区挂载到/mnt/bootdir
  1. mount /dev/ada2p6 /mnt/bootdir
复制代码
正式把FreeBSD 9.0安装进/mnt 中的ZFS,此时以转用sh做SHELL为佳,请留意for那一行,因为太长,宜使用\分行输入。
  1. sh
  2. cd /usr/freebsd-dist
  3. export DESTDIR=/mnt
  4. 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拷贝到指定位置。
  1. cp /tmp/zpool.cache /mnt/boot/zfs/zpool.cache
复制代码
最后,为新系统编写相关的/etc/rc.conf /etc/fstab /boot/loader.conf,指示新系统由ZFS启动。注意,未重新启动之前,有关文件是放在/mnt下。
编写 rc.conf
  1. echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf
复制代码
编写 loader.conf
  1. echo 'zfs_load="YES"' >> /mnt/boot/loader.conf
  2. echo 'vfs.root.mountfrom="zfs:tank"' >> /mnt/boot/loader.conf
复制代码
编写fstab
  1. cat << EOF > /zroot/etc/fstab
  2. #Device                       Mountpoint              FStype  Options         Dump    Pass#
  3. /dev/ad2p6                    /bootdir                ufs     rw              0       0
  4. /dev/ad2p5                    none                    swap    sw              0       0
  5. EOF
复制代码
进入/mnt,把/boot整个文件夹移动到/bootdir下面,并且把原来的/boot链接到/bootdir
  1. mv boot bootdir/
  2. ln -s bootdir/boot /mnt/boot
  3. chflags -h sunlink /mnt/boot
复制代码
接着把UFS分区卸载掉。
  1. umount /mnt/bootdir
复制代码
还有最后一步!把ZFS的挂载点指定为/。
  1. zfs set readonly=on tank/var/empty
  2. zfs unmount -a
  3. zfs set mountpoint=legacy tank
  4. zfs set mountpoint=/tmp tank/tmp
  5. zfs set mountpoint=/usr tank/usr
  6. zfs set mountpoint=/var tank/var
复制代码
然后进行重启,设置下Grub2,添加FreeBSD的启动项。
  1. menuentry "FreeBSD" {
  2.   insmod part_gpt
  3.   insmod ufs2
  4.   set root=(hd2,6)
  5.   kfreebsd /boot/loader
  6. }
复制代码
之后就可以顺利进入新装好的FreeBSD-9.0 based on UFS+ZFS了,当然,为了方便起见,可以把/usr/home连接到/。
  1. ln -sf /usr/home /home
复制代码
除此以外,记得设置root密码和时区。
  1. passwd
  2. tzsetup
复制代码
Screenshot.png
已有 1 人评分评分 金币 树叶 收起 理由
cirsina + 4 + 10 + 2 原创内容

总评分: 评分 + 4  金币 + 10  树叶 + 2   查看全部评分

/dev/ada1:Gentoo Linux+ZFS (GPT)
/dev/ada2:FreeBSD 9.1+ZFS (GPT)
个人网站:http://woodelf.org
开源OS爱好者:226246994

Rank: 6Rank: 6

树叶
36
金币
2356
积分
165
发表于 2012-7-20 19:50:01 |显示全部楼层
刚学LINUX,帮顶。
既然还有生的欲望,为何还轻言死去!

登峰造极

不会C++

Rank: 10Rank: 10Rank: 10

树叶
161
金币
11493
积分
786

系统名医(操作系统)

发表于 2012-7-21 01:54:54 |显示全部楼层
要是能简化简化就好了。

春风得意

暢遊無限

Rank: 7Rank: 7Rank: 7

树叶
607
金币
7455
积分
240
发表于 2012-7-21 02:35:09 |显示全部楼层
不错,挺详细的教程

支持

自成一派

BSD Lover

Rank: 11Rank: 11Rank: 11Rank: 11

树叶
1061
金币
1592
积分
1080

斑竹纪念章 系统名医(操作系统)

发表于 2012-7-21 09:37:19 |显示全部楼层
jiang925 发表于 2012-7-21 01:54
要是能简化简化就好了。

PC-BSD已经简化了ZFS的搭建,或者用mfsBSD镜像,只要几个命令就能完成ZFS搭建。
/dev/ada1:Gentoo Linux+ZFS (GPT)
/dev/ada2:FreeBSD 9.1+ZFS (GPT)
个人网站:http://woodelf.org
开源OS爱好者:226246994

中流砥柱

霓裳仙子

Rank: 8Rank: 8

树叶
5
金币
15157
积分
419
发表于 2012-7-21 09:52:43 |显示全部楼层
学习一下
人生中有欢喜 难免亦常有泪 我D大家 在狮子山下相遇上 总算是欢笑多于唏嘘
人生不免崎岖 难以绝无挂虑 既是同舟 在狮子山下 且共济 抛弃区分 求共对

Rank: 9Rank: 9Rank: 9

树叶
252
金币
10187
积分
531

系统名医(操作系统)

发表于 2013-7-4 22:01:48 |显示全部楼层
看看,没怎么学linux
您需要登录后才可以回帖 登录 | 注册


感谢版主

Archiver|手机版|电脑报官方网站 ( 渝ICP备10009040号 

GMT+8, 2017-9-24 16:47

回顶部