免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 13037 | 回复: 29
打印 上一主题 下一主题

[FreeBSD] 【更新2012/11/28】FreeBSD9使用ZFS作root安装脚本,支持raid0/1/5/10及4K对齐! [复制链接]

论坛徽章:
1
金牛座
日期:2014-05-29 15:55:47
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-05 16:02 |只看该作者 |倒序浏览
本帖最后由 iceblood 于 2012-11-28 09:43 编辑

freebsd_zfs_inst.sh使用说明
脚本介绍:
    这是一个快速将FreeBSD系统以ZFS文件格式形式安装的脚本,并且连根分区以及SWAP分区都已经以ZFS文件系统形式存在。使用该脚本需要你有一点FreeBSD基本知识,比如网络的设置等。
注意事项:
    使用该脚本前请确认该服务器里所有硬盘的所有数据都已经备份或者不再需要,因为脚本会删除所有硬盘的所有数据。
安装方法:
一、首先使用FreeBSD 9.0以后版本的光盘启动服务器。
二、进入SHELL模式
三、使用ifconfig设置IP地址及默认网关(具体方法请自行参考其他资料)
四、下载freebsd_zfs_inst.sh脚本到/tmp文件夹
五、执行脚本,命令如下:
cd /tmp
chmod 755 freebsd_zfs_inst.sh
./freebsd_zfs_inst.sh normal
六、支持模式:普通、RAID1、RAID5、RAID10
普通安装模式是将所有硬盘以条带的形式组合成一个超级大硬盘。如果您的系统已经有硬RAID,基本都可以用此方法安装。
RAID1安装模式会将2个大小一样的硬盘组合成镜像模式,这样保证系统的可靠性。
RAID5将3个以上硬盘组合成N-1的容量模式,速度更快。
RAID10将多个RAID1组合成一个超级大硬盘,速度和安全两者都兼具的模式。

另外您还可以修改脚本里的SWAP参数。
# SWAP分区为4G
SWAPSIZE=4G
当这个地方设置为空的时候,将自动分配SWAP大小,默认按照当内存小于4G的时候SWAP为2倍内存,当内存大于4G的时候,SWAP和内存大小一致的方式来设置。
安装完毕后网络配置、以及各种服务配置请自行解决。
硬盘损坏后的恢复:
注意事项:只有在RAID1和RAID5模式才支持不丢数据的硬盘更换。并且只能在原来损坏的硬盘的盘位上进行更换。并且损坏的硬盘数必须只能1个。
一、正常关闭服务器。
二、拔掉坏硬盘,在原来的位置换上新硬盘。(必须保证新盘的大小和原来的一致)
三、正常启动服务器。(如果无法启动可能是因为BIOS里设置启动的那个盘损坏,修改调换为用其他硬盘启动即可。)
四、下载replacehd.sh到服务器。
五、开始执行更换命令:
1、查看是哪一个硬盘损坏。
   zpool status
2、开始替换,假设替换的硬盘为da0
./replacehd.sh da0



安装完毕后的效果:

  1. # zpool status
  2.   pool: BSDROOT
  3. state: ONLINE
  4. scan: none requested
  5. config:

  6.         NAME        STATE     READ WRITE CKSUM
  7.         BSDROOT     ONLINE       0     0     0
  8.           raidz1-0  ONLINE       0     0     0
  9.             ada0p2  ONLINE       0     0     0
  10.             ada1p2  ONLINE       0     0     0
  11.             ada2p2  ONLINE       0     0     0
  12.             da0p2   ONLINE       0     0     0

  13. errors: No known data errors
  14. # df -h
  15. Filesystem      Size    Used   Avail Capacity  Mounted on
  16. BSDROOT         7.4G    212M    7.2G     3%    /
  17. devfs           1.0k    1.0k      0B   100%    /dev
  18. BSDROOT/home    7.2G     31k    7.2G     0%    /home
  19. BSDROOT/tmp     7.2G     35k    7.2G     0%    /tmp
  20. BSDROOT/usr     7.4G    216M    7.2G     3%    /usr
  21. BSDROOT/var     7.2G    244k    7.2G     0%    /var
  22. # swapinfo
  23. Device          1K-blocks     Used    Avail Capacity
  24. /dev/zvol/BSDROOT/swap   4194304        0  4194304     0%
复制代码
RAID10默认安装效果:

  1. # zpool status
  2.   pool: ICEBLOOD
  3. state: ONLINE
  4. scan: none requested
  5. config:

  6.         NAME        STATE     READ WRITE CKSUM
  7.         ICEBLOOD    ONLINE       0     0     0
  8.           mirror-0  ONLINE       0     0     0
  9.             ada0p2  ONLINE       0     0     0
  10.             ada1p2  ONLINE       0     0     0
  11.           mirror-1  ONLINE       0     0     0
  12.             da0p2   ONLINE       0     0     0
  13.             da2p2   ONLINE       0     0     0

  14. errors: No known data errors
复制代码
脚本下载:
https://code.google.com/p/iceblood/source/browse/FreeBSD_ZFS

评分

参与人数 2可用积分 +8 收起 理由
send_linux + 6 很给力!
ulovko + 2 感谢分享 ^_^

查看全部评分

论坛徽章:
13
15-16赛季CBA联赛之同曦
日期:2016-01-28 19:52:032015亚冠之北京国安
日期:2015-10-07 14:28:19NBA常规赛纪念章
日期:2015-05-04 22:32:03处女座
日期:2015-01-15 19:45:44卯兔
日期:2014-10-28 16:17:14白羊座
日期:2014-05-24 15:10:46寅虎
日期:2014-05-10 09:50:35白羊座
日期:2014-03-12 20:52:17午马
日期:2014-03-01 08:37:27射手座
日期:2014-02-19 19:26:54子鼠
日期:2013-11-30 09:03:56狮子座
日期:2013-09-08 08:37:52
2 [报告]
发表于 2012-09-05 16:06 |只看该作者
  1. #!/bin/sh

  2. #############################
  3. #                           #
  4. #  Write by iceblood        #
  5. #    iceblood@163.com       #
  6. #############################

  7. TANKNAME=BSDROOT
  8. SWAPSIZE=4G



  9. PATH=/bin:/sbin:/usr/bin:/usr/sbin
  10. DISKLIST=$(cat /var/run/dmesg.boot | grep 'MB (' | awk -F':' '{print $1}')
  11. SYSDISK=$(echo $DISKLIST | awk '{print $1}')
  12. DISKCOUNT=$(cat /var/run/dmesg.boot | grep 'MB (' | wc -l)

  13. help()
  14. {
  15.         cat << HELP
  16. $0 {normal|raid1|raid5}
  17. HELP
  18.         exit 1
  19. }

  20. cleardisk()
  21. {
  22.         OS=$(uname)
  23.         if [ "$OS" != "FreeBSD" ]; then
  24.                 echo "isn't FreeBSD!!!"
  25.                 exit 1
  26.         fi
  27.         echo -n "WARNING!!!now clear all harddisk data!!are you agree[N/y]"
  28.         read AGREE
  29.         if [ "$AGREE" != "y" ]; then
  30.                 exit
  31.         fi
  32.         for DISK in $DISKLIST; do
  33.                 PARTITION=$(gpart show ${DISK} | awk '{print $3}' | sed 1d | tr -d '-' | sed '/^$/d')
  34.                 for P in $PARTITION; do
  35.                         gpart delete -i $P ${DISK} > /dev/null 2>&1
  36.                 done
  37.                 gpart destroy ${DISK} > /dev/null 2>&1
  38.         done
  39. }

  40. case $1 in
  41.         normal)
  42.                 cleardisk;
  43.                 mkdir -p /tmp/zfsbsd
  44.                 mdmfs -s 512m md /tmp/zfsbsd
  45.                 echo -n "Create filesystem..."
  46.                 gpart create -s gpt $SYSDISK > /dev/null 2>&1
  47.                 gpart add -b 34 -s 64k -t freebsd-boot $SYSDISK > /dev/null 2>&1
  48.                 gpart add -t freebsd-zfs $SYSDISK > /dev/null 2>&1
  49.                 gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 $SYSDISK > /dev/null 2>&1
  50.                 zpool create -f $TANKNAME /dev/${SYSDISK}p2 > /dev/null 2>&1
  51.                 NOSYSDISK=$(echo $DISKLIST | sed "s/$SYSDISK//")
  52.                 zpool add -f $TANKNAME $NOSYSDISK
  53.                 zpool set bootfs=$TANKNAME $TANKNAME
  54.                 zfs set checksum=fletcher4 $TANKNAME
  55.                 zfs create -V $SWAPSIZE $TANKNAME/swap
  56.                 zfs set checksum=off $TANKNAME/swap
  57.                 zfs set org.freebsd:swap=on $TANKNAME/swap
  58.                 zfs set mountpoint=/mnt $TANKNAME
  59.                 zfs mount $TANKNAME
  60.                 zfs create $TANKNAME/usr
  61.                 zfs create $TANKNAME/var
  62.                 zfs create -o compression=on -o exec=on -o setuid=off $TANKNAME/tmp
  63.                 zfs create $TANKNAME/home
  64.                 zpool export $TANKNAME
  65.                 zpool import -o cachefile=/tmp/zfsbsd/zpool.cache $TANKNAME
  66.                 chmod 1777 /mnt/tmp
  67.                 mkdir -p /mnt/var/tmp
  68.                 chmod 1777 /mnt/var/tmp
  69.                 echo "done."
  70.                 echo -n "Install base system..."
  71.                 cd /usr/freebsd-dist
  72.                 DESTDIR=/mnt
  73.                 cat kernel.txz | tar --unlink -xpJf - -C ${DESTDIR:-/}
  74.                 cat base.txz | tar --unlink -xpJf - -C ${DESTDIR:-/}
  75.                 echo "done."
  76.                 echo -n "Init new freebsd..."
  77.                 cp /tmp/zfsbsd/zpool.cache /mnt/boot/zfs/zpool.cache
  78.                 echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf
  79.                 touch /mnt/etc/fstab
  80.                 cat << LOADER > /mnt/boot/loader.conf
  81. zfs_load="YES"
  82. vfs.root.mountfrom="zfs:${TANKNAME}"
  83. vm.kmem_size="512M"
  84. vm.kmem_size_max="512M"
  85. vfs.zfs.arc_max="40M"
  86. vfs.zfs.vdev.cache.size="5M"
  87. LOADER
  88.                 zfs umount -a > /dev/null 2>&1
  89.                 zfs set mountpoint=legacy $TANKNAME
  90.                 zfs set mountpoint=/tmp $TANKNAME/tmp  > /dev/null 2>&1
  91.                 zfs set mountpoint=/usr $TANKNAME/usr > /dev/null 2>&1
  92.                 zfs set mountpoint=/var $TANKNAME/var > /dev/null 2>&1
  93.                 zfs set mountpoint=/home $TANKNAME/home > /dev/null 2>&1
  94.                 echo "done."
  95.                 echo "Install done,Please run \"reboot\"."
  96.                 ;;
  97.         *)
  98.                 help;
  99.                 ;;
  100. esac
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-09-05 16:34 |只看该作者
mfsbsd 里有个zfs的安装脚本

论坛徽章:
1
金牛座
日期:2014-05-29 15:55:47
4 [报告]
发表于 2012-09-05 16:41 |只看该作者
芭比小柒 发表于 2012-09-05 16:34
mfsbsd 里有个zfs的安装脚本

哦。是嘛?难道我白幸苦啦?

论坛徽章:
13
15-16赛季CBA联赛之同曦
日期:2016-01-28 19:52:032015亚冠之北京国安
日期:2015-10-07 14:28:19NBA常规赛纪念章
日期:2015-05-04 22:32:03处女座
日期:2015-01-15 19:45:44卯兔
日期:2014-10-28 16:17:14白羊座
日期:2014-05-24 15:10:46寅虎
日期:2014-05-10 09:50:35白羊座
日期:2014-03-12 20:52:17午马
日期:2014-03-01 08:37:27射手座
日期:2014-02-19 19:26:54子鼠
日期:2013-11-30 09:03:56狮子座
日期:2013-09-08 08:37:52
5 [报告]
发表于 2012-09-05 16:52 |只看该作者
@芭比小柒  脚本在哪

论坛徽章:
0
6 [报告]
发表于 2012-09-05 19:39 |只看该作者
太感谢了,我照着网上的搞了一个,结果,就是引导不了。

论坛徽章:
0
7 [报告]
发表于 2012-09-05 20:43 |只看该作者
https://github.com/mmatuska/mfsbsd/blob/master/tools/zfsinstall




[ghw@7axu.pts/3] ~ % zpool list
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank   199G  17.7G   181G     8%  1.36x  ONLINE  -
[ghw@7axu.pts/3] ~ % zfs list
NAME                       USED  AVAIL  REFER  MOUNTPOINT
tank                      18.0G   178G  93.5M  legacy
tank/home                 10.7G   178G  10.7G  /home
tank/usr                  6.95G   178G   215M  /usr
tank/usr/local            2.63G   178G  2.63G  /usr/local
tank/usr/ports            3.05G   178G   847M  /usr/ports
tank/usr/ports/distfiles  2.23G   178G  2.23G  /usr/ports/distfiles
tank/usr/src              1.05G   178G  1.05G  /usr/src
tank/var                   149M   178G  3.59M  /var
tank/var/crash             148K   178G   148K  /var/crash
tank/var/db                143M   178G   143M  /var/db
tank/var/empty             144K   178G   144K  /var/empty
tank/var/log               580K   178G   580K  /var/log
tank/var/mail              144K   178G   144K  /var/mail
tank/var/run               388K   178G   388K  /var/run
tank/var/tmp               368K   178G   368K  /var/tmp
[ghw@7axu.pts/3] ~ % geli status
       Name  Status  Components
ada0s1d.eli  ACTIVE  ada0s1d
ada0s1b.eli  ACTIVE  ada0s1b
[ghw@7axu.pts/3] ~ % zdb
tank:
    version: 28
    name: 'tank'
    state: 0
    txg: 174
    pool_guid: 4273006994210631156
    hostid: 1256830924
    hostname: '7axu.com'
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: 4273006994210631156
        children[0]:
            type: 'disk'
            id: 0
            guid: 8589119704594412908
            path: '/dev/ada0s1d.eli'
            phys_path: '/dev/ada0s1d.eli'
            whole_disk: 1
            metaslab_array: 30
            metaslab_shift: 30
            ashift: 12
            asize: 214743384064
            is_log: 0
            create_txg: 4
[ghw@7axu.pts/3] ~ %

评分

参与人数 1可用积分 +2 收起 理由
ulovko + 2 赞一个!

查看全部评分

论坛徽章:
13
15-16赛季CBA联赛之同曦
日期:2016-01-28 19:52:032015亚冠之北京国安
日期:2015-10-07 14:28:19NBA常规赛纪念章
日期:2015-05-04 22:32:03处女座
日期:2015-01-15 19:45:44卯兔
日期:2014-10-28 16:17:14白羊座
日期:2014-05-24 15:10:46寅虎
日期:2014-05-10 09:50:35白羊座
日期:2014-03-12 20:52:17午马
日期:2014-03-01 08:37:27射手座
日期:2014-02-19 19:26:54子鼠
日期:2013-11-30 09:03:56狮子座
日期:2013-09-08 08:37:52
8 [报告]
发表于 2012-09-05 21:13 |只看该作者
  1. #!/bin/sh
  2. # $Id$
  3. #
  4. # mfsBSD ZFS install script
  5. # Copyright (c) 2011 Martin Matuska <mm at FreeBSD.org>
  6. #
  7. FS_LIST="var tmp"

  8. usage() {
  9.         echo "Usage: $0 [-h] -d geom_provider [-d geom_provider ...] -t archive_file [-r mirror|raidz] [-m mount_point] [-p zfs_pool_name] [-V zfs_pool_version] [-s swap_partition_size] [-z zfs_partition_size] [-c] [-l] [-4]"
  10. }

  11. help() {
  12.         echo; echo "Install FreeBSD using ZFS from a compressed archive"
  13.         echo; echo "Required flags:"
  14.         echo "-d geom_provider  : geom provider(s) to install to (e.g. da0)"
  15.         echo "-t archive_file   : tar archive file containing the FreeBSD distribution"
  16.         echo "                          supported compression formats are: gzip, bzip2, xz"
  17.         echo; echo "Optional flags:"
  18.         echo "-r raidz|mirror   : select raid mode if more than one -d provider given"
  19.         echo "-s swap_part_size : create a swap partition with given size (default: no swap)"
  20.         echo "-z zfs_part_size  : create zfs parition of this size (default: all space left)"
  21.         echo "-p pool_name      : specify a name for the ZFS pool (default: tank)"
  22.         echo "-V pool_version   : specify a version number for ZFS pool (default: 13)"
  23.         echo "-m mount_point    : use this mount point for operations (default: /mnt)"
  24.         echo "-c                : enable lzjb compression for all datasets"
  25.         echo "-l                 : use legacy mounts (via fstab) instead of ZFS mounts"
  26.         echo "-4                : use fletcher4 as default checksum algorithm"
  27.         echo; echo "Examples:"
  28.         echo "Install on a single drive with 2GB swap:"
  29.         echo "$0 -d ad4 -s 2G"
  30.         echo "Install on a mirror without swap, pool name rpool:"
  31.         echo "$0 -d ad4 -d ad6 -r mirror -p rpool"
  32.         echo; echo "Notes:"
  33.         echo "When using swap and raidz/mirror, the swap partition is created on all drives."
  34.         echo "The /etc/fstab entry will contatin only the first drive's swap partition."
  35.         echo "You can enable all swap partitions and/or make a gmirror-ed swap later."
  36. }

  37. while getopts d:t:r:p:s:z:m:V:hcl4 o; do
  38.         case "$o" in
  39.                 d) DEVS="$DEVS ${OPTARG##/dev/}" ;;
  40.                 t) ARCHIVE="${OPTARG}" ;;
  41.                 p) POOL="${OPTARG}" ;;
  42.                 s) SWAP="${OPTARG}" ;;
  43.                 m) MNT="${OPTARG}" ;;
  44.                 r) RAID="${OPTARG}" ;;
  45.                 z) ZPART="${OPTARG}" ;;
  46.                 V) VERSION="${OPTARG}" ;;
  47.                 c) LZJB=1 ;;
  48.                 l) LEGACY=1 ;;
  49.                 4) FLETCHER=1 ;;
  50.                 h) help; exit 1;;
  51.                 [?]) usage; exit 1;;
  52. esac
  53. done

  54. if ! `/sbin/kldstat -m zfs >/dev/null 2>/dev/null`; then
  55.         /sbin/kldload zfs >/dev/null 2>/dev/null
  56. fi

  57. ZFS_VERSION=`/sbin/sysctl -n vfs.zfs.version.spa 2>/dev/null`

  58. if [ -z "$ZFS_VERSION" ]; then
  59.         echo "Error: failed to load ZFS module"
  60.         exit 1
  61. elif [ "$ZFS_VERSION" -lt "13" ]; then
  62.         echo "Error: ZFS module too old, version 13 or higher required"
  63.         exit 1
  64. fi

  65. if [ -z "$DEVS" -o -z "$ARCHIVE" ]; then
  66.         usage
  67.         exit 1
  68. fi

  69. if [ -z "$POOL" ]; then
  70.         POOL=tank
  71. fi

  72. if [ -z "$VERSION" ]; then
  73.         VERSION=${ZFS_VERSION}
  74. elif [ "$VERSION" -gt "$ZFS_VERSION" ]; then
  75.         echo "Error: invalid ZFS pool version (maximum: $ZFS_VERSION)"
  76.         exit 1
  77. fi

  78. if [ "$VERSION" = "5000" ]; then
  79.         VERSION=
  80. else
  81.         VERSION="-o version=${VERSION}"
  82. fi

  83. if /sbin/zpool list $POOL > /dev/null 2> /dev/null; then
  84.         echo Error: ZFS pool \"$POOL\" already exists
  85.         echo Please choose another pool name or rename/destroy the existing pool.
  86.         exit 1
  87. fi

  88. EXPOOLS=`/sbin/zpool import | /usr/bin/grep pool: | /usr/bin/awk '{ print $2 }'`

  89. if [ -n "${EXPOOLS}" ]; then
  90.         for P in ${EXPOOLS}; do
  91.                 if [ "$P" = "$POOL" ]; then
  92.                         echo Error: An exported ZFS pool \"$POOL\" already exists
  93.                         echo Please choose another pool name or rename/destroy the exported pool.
  94.                         exit 1
  95.                 fi
  96.         done
  97. fi

  98. COUNT=`echo ${DEVS} | /usr/bin/wc -w | /usr/bin/awk '{ print $1 }'`
  99. if [ "$COUNT" -lt "3" -a "$RAID" = "raidz" ]; then
  100.         echo "Error: raidz needs at least three devices (-d switch)"
  101.         exit 1
  102. elif [ "$COUNT" = "1" -a "$RAID" = "mirror" ]; then
  103.         echo "Error: mirror needs at least two devices (-d switch)"
  104.         exit 1
  105. elif [ "$COUNT" = "2" -a "$RAID" != "mirror" ]; then
  106.         echo "Notice: two drives selected, automatically choosing mirror mode"
  107.         RAID="mirror"
  108. elif [ "$COUNT" -gt "2" -a "$RAID" != "mirror" -a "$RAID" != "raidz" ]; then
  109.         echo "Error: please choose raid mode with the -r switch (mirror or raidz)"
  110.         exit 1
  111. fi

  112. for DEV in ${DEVS}; do
  113.         if ! [ -c "/dev/${DEV}" ]; then
  114.                 echo "Error: /dev/${DEV} is not a block device"
  115.                 exit 1
  116.         fi
  117.         if /sbin/gpart show $DEV > /dev/null 2> /dev/null; then
  118.                 echo "Error: /dev/${DEV} already contains a partition table."
  119.                 echo ""
  120.                 /sbin/gpart show $DEV
  121.                 echo "You may erase the partition table manually with the destroygeom command"
  122.                 exit 1
  123.         fi
  124. done

  125. if ! [ -f "${ARCHIVE}" ]; then
  126.         echo "Error: file $ARCHIVE does not exist"
  127.         exit 1
  128. fi

  129. DIRECT_TAR=0
  130. FTYPE=`/usr/bin/file -b --mime-type ${ARCHIVE}`
  131. if [ "$FTYPE" = "application/x-tar" ]; then
  132.         DIRECT_TAR=1
  133. elif [ "$FTYPE" = "application/x-gzip" ]; then
  134.         EXTRACT_CMD=/usr/bin/gzip
  135. elif [ "$FTYPE" = "application/x-bzip2" ]; then
  136.         EXTRACT_CMD=/usr/bin/bzip2
  137. elif [ "$FTYPE" = "application/x-xz" ]; then
  138.         if [ ! -x "`/usr/bin/which xz`" ]; then
  139.                 echo "xz-compressed file selected and xz is not installed";
  140.                 exit 1
  141.         fi
  142.         EXTRACT_CMD=`which xz`
  143. else
  144.         echo "Archive must be uncompressed or gzip, bzip2 or xz compressed"
  145.         exit 1
  146. fi

  147. if [ -z "$MNT" ]; then
  148.         MNT=/mnt
  149. fi

  150. if ! [ -d "${MNT}" ]; then
  151.         echo "Error: $MNT is not a directory"
  152.         exit 1
  153. fi

  154. if [ -n "${ZPART}" ]; then
  155.         SZPART="-s ${ZPART}"
  156. fi

  157. if [ "${LEGACY}" = "1" ]; then
  158.         ALTROOT=
  159.         ROOTMNT=legacy
  160. else
  161.         ALTROOT="-o altroot=${MNT} -o cachefile=/boot/zfs/zpool.cache"
  162.         ROOTMNT=/
  163. fi

  164. # Create GPT

  165. for DEV in ${DEVS}; do
  166.         echo -n "Creating GUID partitions on ${DEV} ..."
  167.         if ! /sbin/gpart create -s GPT /dev/${DEV} > /dev/null; then
  168.                 echo " error"
  169.                 exit 1
  170.         fi
  171.         /bin/sleep 1
  172.         if ! echo "a 1" | /sbin/fdisk -f - ${DEV} > /dev/null 2> /dev/null; then
  173.                 echo " error"
  174.                 exit 1
  175.         fi
  176.         if ! /sbin/gpart add -t freebsd-boot -s 128 ${DEV} > /dev/null; then
  177.                 echo " error"
  178.                 exit 1
  179.         fi
  180.         if [ -n "${SWAP}" ]; then
  181.                 if ! /sbin/gpart add -t freebsd-swap -s "${SWAP}" ${DEV} > /dev/null; then
  182.                         echo " error"
  183.                         exit 1
  184.                 fi
  185.                 SWAPPART=`/sbin/glabel status ${DEV}p2 | /usr/bin/grep gptid | /usr/bin/awk '{ print $1 }'`
  186.                 if [ -z "$SWAPPART" ]; then
  187.                         echo " error determining swap partition"
  188.                 fi
  189.                 if [ -z "$FSWAP" ]; then
  190.                         FSWAP=${SWAPPART}
  191.                 fi
  192.         fi
  193.         if ! /sbin/gpart add -t freebsd-zfs ${SZPART} ${DEV} > /dev/null; then
  194.                 echo " error"
  195.                 exit 1
  196.         fi
  197.         /bin/dd if=/dev/zero of=/dev/${DEV}p2 bs=512 count=560 > /dev/null 2> /dev/null
  198.         if [ -n "${SWAP}" ]; then
  199.                 /bin/dd if=/dev/zero of=/dev/${DEV}p3 bs=512 count=560 > /dev/null 2> /dev/null
  200.         fi
  201.         echo " done"

  202.         echo -n "Configuring ZFS bootcode on ${DEV} ..."
  203.                 if ! /sbin/gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ${DEV} > /dev/null; then
  204.                 echo " error"
  205.                 exit 1
  206.         fi
  207.         echo " done"
  208.         /sbin/gpart show ${DEV}
  209. done

  210. # Create zpool and zfs

  211. for DEV in ${DEVS}; do
  212.         PART=`/sbin/gpart show ${DEV} | /usr/bin/grep freebsd-zfs | /usr/bin/awk '{ print $3 }'`

  213.         if [ -z "${PART}" ]; then
  214.                 echo Error: freebsd-zfs partition not found on /dev/$DEV
  215.                 exit 1
  216.         fi

  217.         GPART=`/sbin/glabel list ${DEV}p${PART} | /usr/bin/grep gptid | /usr/bin/awk -F"gptid/" '{ print "gptid/" $2 }'`

  218.         GPARTS="${GPARTS} ${GPART}"
  219.         PARTS="${PARTS} ${DEV}p${PART}"
  220. done

  221. echo -n "Creating ZFS pool ${POOL} on${PARTS} ..."
  222. if ! /sbin/zpool create -f -m none ${ALTROOT} ${VERSION} ${POOL} ${RAID} ${PARTS} > /dev/null 2> /dev/null; then
  223.         echo " error"
  224.         exit 1
  225. fi
  226. echo " done"

  227. if [ "${FLETCHER}" = "1" ]; then
  228.         echo -n "Setting default checksum to fletcher4 for ${POOL} ..."
  229.         if ! /sbin/zfs set checksum=fletcher4 ${POOL} > /dev/null 2> /dev/null; then
  230.                 echo " error"
  231.                 exit 1
  232.         fi
  233.         echo " done"
  234. fi

  235. if [ "${LZJB}" = "1" ]; then
  236.         echo -n "Setting default compression to lzjb for ${POOL} ..."
  237.         if ! /sbin/zfs set compression=lzjb ${POOL} > /dev/null 2> /dev/null; then
  238.                 echo " error"
  239.                 exit 1
  240.         fi
  241.         echo " done"
  242. fi

  243. echo -n "Creating ${POOL} root partition:"
  244. if ! /sbin/zfs create -o mountpoint=${ROOTMNT} ${POOL}/root > /dev/null 2> /dev/null; then
  245.         echo " error"
  246.         exit 1
  247. fi
  248. echo " ... done"
  249. echo -n "Creating ${POOL} partitions:"
  250. for FS in ${FS_LIST}; do
  251.         if [ "${LEGACY}" = 1 ]; then
  252.                 MNTPT="-o mountpoint=legacy"
  253.         else
  254.                 MNTPT=
  255.         fi
  256.         if ! /sbin/zfs create ${MNTPT} ${POOL}/root/${FS} > /dev/null 2> /dev/null; then
  257.                 echo " error"
  258.                 exit 1
  259.         fi
  260.         echo -n " ${FS}"
  261. done
  262. echo " ... done"
  263. echo -n "Setting bootfs for ${POOL} to ${POOL}/root ..."
  264. if ! /sbin/zpool set bootfs=${POOL}/root ${POOL} > /dev/null 2> /dev/null; then
  265.         echo " error"
  266.         exit 1
  267. fi
  268. echo " done"
  269. /sbin/zfs list -r ${POOL}

  270. # Mount and populate zfs (if legacy)
  271. if [ "${LEGACY}" = "1" ]; then
  272.         echo -n "Mounting ${POOL} on ${MNT} ..."
  273.         /bin/mkdir -p ${MNT}
  274.         if ! /sbin/mount -t zfs ${POOL}/root ${MNT} > /dev/null 2> /dev/null; then
  275.                 echo " error mounting pool/root"
  276.                 exit 1
  277.         fi
  278.         for FS in ${FS_LIST}; do
  279.                 /bin/mkdir -p ${MNT}/${FS}
  280.                 if ! /sbin/mount -t zfs ${POOL}/root/${FS} ${MNT}/${FS} > /dev/null 2> /dev/null; then
  281.                         echo " error mounting ${POOL}/root/${FS}"
  282.                         exit 1
  283.                 fi
  284.         done
  285. echo " done"
  286. fi

  287. echo -n "Extracting FreeBSD distribution ..."
  288. if [ "${DIRECT_TAR}" = "1" ]; then
  289.         if ! /usr/bin/tar -C ${MNT} -x -f ${ARCHIVE} > /dev/null 2> /dev/null; then
  290.                 echo " error"
  291.                 exit 1
  292.         fi
  293. else
  294.         if ! ${EXTRACT_CMD} -d -c ${ARCHIVE} | /usr/bin/tar -C ${MNT} -x -f - > /dev/null 2> /dev/null; then
  295.                 echo " error"
  296.                 exit 1
  297.         fi
  298. fi
  299. echo " done"

  300. # Adjust configuration files

  301. echo -n "Writing /boot/loader.conf..."
  302. echo "zfs_load=\"YES\"" > ${MNT}/boot/loader.conf
  303. echo "vfs.root.mountfrom=\"zfs:${POOL}/root\"" >> ${MNT}/boot/loader.conf
  304. echo " done"

  305. # Write fstab if swap or legacy
  306. echo -n "Writing /etc/fstab..."
  307. rm -f ${MNT}/etc/fstab
  308. touch ${MNT}/etc/fstab
  309. if [ -n "${FSWAP}" -o "${LEGACY}" = "1" ]; then
  310.         if [ -n "${FSWAP}" ]; then
  311.                 echo "/dev/${FSWAP} none swap sw 0 0" > ${MNT}/etc/fstab
  312.         fi
  313.         if [ "${LEGACY}" = "1" ]; then
  314.                 for FS in ${FS_LIST}; do
  315.                         echo ${POOL}/root/${FS} /${FS} zfs rw 0 0 >> ${MNT}/etc/fstab
  316.                 done
  317.         fi
  318. fi
  319. if [ "${LEGACY}" != "1" ]; then
  320.         echo -n "Writing /etc/rc.conf..."
  321.         echo 'zfs_enable="YES"' >> ${MNT}/etc/rc.conf
  322. fi
  323. echo " done"

  324. echo -n "Copying /boot/zfs/zpool.cache ..."
  325. if [ -n "${LEGACY}" ]; then
  326.         for FS in ${FS_LIST}; do
  327.                 /sbin/umount ${MNT}/${FS} > /dev/null 2> /dev/null
  328.         done
  329.         /sbin/umount ${MNT} > /dev/null 2> /dev/null
  330. fi
  331. if ! /sbin/zpool export ${POOL} > /dev/null 2> /dev/null; then
  332.         echo " error exporting pool"
  333.         exit 1
  334. fi
  335. if ! /sbin/zpool import ${ALTROOT} ${POOL} > /dev/null 2> /dev/null; then
  336.         echo " error importing pool"
  337.         exit 1
  338. fi
  339. if [ -n "${LEGACY}" ]; then
  340.         if ! /sbin/mount -t zfs ${POOL}/root ${MNT} > /dev/null 2> /dev/null; then
  341.                 echo " error mounting ${POOL}/root"
  342.                 exit 1
  343.         fi
  344. fi
  345. if ! /bin/cp /boot/zfs/zpool.cache ${MNT}/boot/zfs/ > /dev/null 2> /dev/null; then
  346.         echo " error copying zpool.cache"
  347.         exit 1
  348. fi
  349. if [ -n "${LEGACY}" ]; then
  350.         for FS in ${FS_LIST}; do
  351.                 if ! /sbin/mount -t zfs ${POOL}/${FS} ${MNT}/${FS} > /dev/null 2> /dev/null; then
  352.                 echo " error mounting ${POOL}/${FS}"
  353.                 exit 1
  354.                 fi
  355.         done
  356. fi
  357. echo " done"

  358. # Mount devfs for post-configuration

  359. if ! /sbin/mount -t devfs devfs ${MNT}/dev; then
  360.         echo "Error mounting devfs on ${MNT}/dev"
  361. fi

  362. echo ""
  363. echo "Installation complete."
  364. echo "The system will boot from ZFS with clean install on next reboot"
  365. echo ""
  366. echo "You may type \"chroot ${MNT}\" and make any adjustments you need."
  367. echo "For example, change the root password or edit/create /etc/rc.conf for"
  368. echo "for system services. "
  369. echo ""
  370. echo "WARNING - Don't export ZFS pool \"${POOL}\"!"
复制代码

论坛徽章:
0
9 [报告]
发表于 2012-09-05 22:11 |只看该作者
果真有啊
不管有没有,必须顶楼主,赞一个

论坛徽章:
1
金牛座
日期:2014-05-29 15:55:47
10 [报告]
发表于 2012-09-06 09:02 |只看该作者
本帖最后由 iceblood 于 2012-09-07 15:47 编辑

[quote]芭比小柒 发表于 2012-09-05 20:43
https://github.com/mmatuska/mfsbsd/blob/master/tools/zfsinstall

从他的脚本看,不支持SWAP也放在ZFS里。这样SWAP的大小就不能灵活的调整。
看来我的脚本完善后功能上将来还是会有一定的优势,又或者说是另外一种风格。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP