Chinaunix
标题:
写了一个代替FreeBSD10.1系统自动zfs分区的脚本...
[打印本页]
作者:
bleakwind
时间:
2015-07-01 19:02
标题:
写了一个代替FreeBSD10.1系统自动zfs分区的脚本...
本帖最后由 bleakwind 于 2015-07-02 15:23 编辑
参考FreeBSD10.1的自动zfs分区日志整的,我是搞PHP的,对shell做脚本一窍不通,拼拼凑凑三四天啊,终于测试通过.
水平有限,有问题的地方,看到一定要告诉我,随时修复.
btw: 请无视变量命名方式...
FreeBSD每个版本都不断改进,越来越好用.bsdconfig虽说不好用也在大家口水中成长,FreeBSD10.1的分区菜单出现了ZFS自动分区.不过使用后发现如下问题:
1. gpart没有加 -a 4k 参数,导致没有强制4k对齐,所以还是从34扇区开始分freebsd-boot,没有从40扇区开始.但是zfs的pool倒是用gnop来实现了4k读取.
2. zfs分区不能自己定义分区,都得按照系统那一套来,如果你跟我一样有把/home单独分这种强迫症,那就要装好系统再修改.
3. 而如果用命令一条一条敲,特别在机房的时候,那么小的推车,对着老旧显示器,还有好烂的键盘,会出现敲错字符或者设备名字.
综合上述,所以倒腾出如下脚本.可以在装系统的时候配置好网络在git上下载使用:
htt
ps://git
hub.com/bleakwind/freebsd/blob/master/zfs_disk.sh
使用方法脚本中有,下面详细说明下(此脚本仅针对FreeBSD10.1,仅对部分参数数值进行了判断和自动取值,部分失败情况没有判断,请自行查询同目录下zfs_disk.sh.log日志文件):
- 当安装光盘选择分区方式的时候 [Partitioning] 选择 [Shell] 方式然后配置网络:
# ifconfig "em0" inet "192.168.8.201" netmask "255.255.255.0"
# route add default "192.168.8.1"
# echo "nameserver 202.96.134.133" >> /etc/resolv.conf
# echo "nameserver 8.8.8.8" >> /etc/resolv.conf
- 切换到 /tmp/ 目录下载脚本文件(此处如果不能在安装环境下fetch,请提前下载放在你能fetch的地方):
# cd /tmp/
# fetch htt
ps://raw.git
hubusercontent.com/bleakwind/freebsd/master/zfs_disk.sh && chmod +x zfs_disk.sh
地址: htt
ps://git
hub.com/bleakwind/freebsd/blob/master/zfs_disk.sh
- 然后开始分区工作:
命令格式:
usage: ${THIS_FILE} command args ...
where 'command' is one of the following:
<init> <poolname>
<gpart> <device> <label> [size_boot] [size_swap] [size_zfs]
<pool> <poolname> <"poolcommand">
<zfs> <poolname> <auto>
<finish> <poolname> <"noplist">
<info> [device]
<help>
举例说明:
zroot是poolname,根据需要进行修改.
步骤 1: 初始化
# ./zfs_disk.sh -i zroot
步骤 2: -o显示磁盘信息,-g对每个盘顺序开始gpart,后三个参数可从后向前省略,[size_zfs]省略用所有剩余空间,[size_swap]省略用内存大小,[size_boot]省略用512k.
# ./zfs_disk.sh -o
# ./zfs_disk.sh -g da0 0 512k 4g 120g
或 # ./zfs_disk.sh -g da0 0
# ./zfs_disk.sh -g da1 1 512k 4g 120g
# ./zfs_disk.sh -g da2 2 512k 4g 120g
# ./zfs_disk.sh -g da3 3 512k 4g 120g
步骤 3: 根据需要设定自己的raid方式
# ./zfs_disk.sh -p zroot "raidz2 da0p3.nop da1p3.nop da2p3.nop da3p3.nop"
或: # ./zfs_disk.sh -p zroot "mirror da0p3.nop da1p3.nop mirror da2p3.nop da3p3.nop"
步骤 4: 可以一个一个自己设定,也可以先用auto自动,再设定自己单独的分区,此处可用-o copies=2等参数
# ./zfs_disk.sh -z zroot auto
# ./zfs_disk.sh -z zroot "-o mountpoint=/pub zroot/pub"
# ./zfs_disk.sh -z zroot "-o mountpoint=/db -o recordsize=8K zroot/db"
步骤 5: 注意引号,前面会给出nop信息,这里要传入nop
# ./zfs_disk.sh -f zroot "da0p3.nop da1p3.nop da2p3.nop da3p3.nop"
步骤 6: 删除shell脚本和日志,exit后安装程序会自动进行余下工作
# rm zfs_disk.sh zfs_disk.sh.log
# exit
其他命令: -o显示磁盘信息,-h显示命令帮助信息
# ./zfs_disk.sh -o
或: # ./zfs_disk.sh -o da0
# ./zfs_disk.sh -h
#!/bin/sh
#
# $FreeBSD10.1: zfs_disk.sh,v 1.0 2015/06/20 04:20:51 Bleakwind (at) www .weaverdream.com Exp $
#
# - First when [Partitioning] select [Shell] and configure network:
#
# # ifconfig "em0" inet "192.168.8.201" netmask "255.255.255.0"
# # route add default "192.168.8.1"
# # echo "nameserver 202.96.134.133" >> /etc/resolv.conf
# # echo "nameserver 8.8.8.8" >> /etc/resolv.conf
#
# - Second fetch the shell file:
#
# # cd /tmp/
# # fetch https ://raw.githubusercontent.com/bleakwind/freebsd/master/zfs_disk.sh && chmod +x zfs_disk.sh
# # at: https ://github.com/bleakwind/freebsd/blob/master/zfs_disk.sh
#
# - Third allocating disk space:
#
# step 1
# # ./zfs_disk.sh -i zroot
#
# step 2
# # ./zfs_disk.sh -o
# # ./zfs_disk.sh -g da0 0 512k 4g 120g
# or # ./zfs_disk.sh -g da0 0
# # ./zfs_disk.sh -g da1 1 512k 4g 120g
# # ./zfs_disk.sh -g da2 2 512k 4g 120g
# # ./zfs_disk.sh -g da3 3 512k 4g 120g
#
# step 3
# # ./zfs_disk.sh -p zroot "raidz2 da0p3.nop da1p3.nop da2p3.nop da3p3.nop"
# or: # ./zfs_disk.sh -p zroot "mirror da0p3.nop da1p3.nop mirror da2p3.nop da3p3.nop"
#
# step 4
# # ./zfs_disk.sh -z zroot auto
# # ./zfs_disk.sh -z zroot "-o mountpoint=/pub zroot/pub"
# # ./zfs_disk.sh -z zroot "-o mountpoint=/db -o recordsize=8K zroot/db"
# # option: -o copies=2
#
# step 5
# # ./zfs_disk.sh -f zroot "da0p3.nop da1p3.nop da2p3.nop da3p3.nop"
#
# step 6
# # rm zfs_disk.sh zfs_disk.sh.log
# # exit
#
# other
# # ./zfs_disk.sh -o
# or: # ./zfs_disk.sh -o da0
# # ./zfs_disk.sh -h
#
THIS_FILE=$0
THIS_OPE=$1
FSTAB_FMT="%s\t\t%s\t%s\t%s\t\t%s\t%s\n"
HELP_INFO="usage: ${THIS_FILE} command args ...
where 'command' is one of the following:
<init|-i> <poolname>
<gpart|-g> <device> <label> [size_boot] [size_swap] [size_zfs]
<pool|-p> <poolname> <"poolcommand">
<zfs|-z> <poolname> <auto|"zfscommand">
<finish|-f> <poolname> <"noplist">
<info|-o> [device]
<help|-h>"
if [ $# -le 0 ]; then
echo "missing command"
echo -e "${HELP_INFO}"
exit 1
fi
if [ ! -f "${THIS_FILE}.log" ]; then
echo -e "Log for ${THIS_FILE}: `date +%Y%m%d%H%M%S`" > ${THIS_FILE}.log
else
echo -e "\nLog for ${THIS_FILE}: `date +%Y%m%d%H%M%S`" >> ${THIS_FILE}.log
fi
echo "\${THIS_FILE} > ${THIS_FILE}" >> ${THIS_FILE}.log
echo "\${THIS_OPE} > ${THIS_OPE}" >> ${THIS_FILE}.log
# begin
case "${THIS_OPE}" in
# init: # ./zfs_disk.sh -i zroot
init|-i)
THIS_POOLNAME=$2
if [ -z "${THIS_POOLNAME}" ]; then
echo "missing argument"
echo -e "${HELP_INFO}"
exit 1
fi
echo "Begin init:" >> ${THIS_FILE}.log
echo "\${THIS_POOLNAME} > ${THIS_POOLNAME}" >> ${THIS_FILE}.log
zpool destroy "${THIS_POOLNAME}" >> ${THIS_FILE}.log 2>&1
printf "" > "/tmp/bsdinstall_etc/fstab"
printf "$FSTAB_FMT" "# Device" "Mountpoint" "FStype" "Options" "Dump" "Pass#" >> "/tmp/bsdinstall_etc/fstab"
echo "End init---" >> ${THIS_FILE}.log
echo "init successful..."
;;
# gpart: # ./zfs_disk.sh -g da0 0 512k 4g 120g
# or: # ./zfs_disk.sh -g da0 0
gpart|-g)
THIS_DEVICE=$2
THIS_LABEL=$3
THIS_SIZE_BOOT=$4
THIS_SIZE_SWAP=$5
THIS_SIZE_ZFS=$6
if [ -z "${THIS_DEVICE}" ] || [ -z "${THIS_LABEL}" ]; then
echo "missing argument"
echo -e "${HELP_INFO}"
exit 1
fi
echo "Begin gpart---" >> ${THIS_FILE}.log
if [ -z "${THIS_SIZE_BOOT}" ]; then
THIS_SIZE_BOOT="512k"
fi
if [ -z "${THIS_SIZE_SWAP}" ]; then
THIS_SIZE_SWAP=`sysctl hw.physmem | sed -e 's/.*hw\.physmem: \([0-9]*\).*/\1/g'`
THIS_SIZE_SWAP=`echo "scale=2; ${THIS_SIZE_SWAP}/1024/1024/1024" | bc`
THIS_SIZE_SWAP="`printf "%.0f" ${THIS_SIZE_SWAP}`g"
fi
echo "\${THIS_DEVICE} > ${THIS_DEVICE}" >> ${THIS_FILE}.log
echo "\${THIS_LABEL} > ${THIS_LABEL}" >> ${THIS_FILE}.log
echo "\${THIS_SIZE_BOOT} > ${THIS_SIZE_BOOT}" >> ${THIS_FILE}.log
echo "\${THIS_SIZE_SWAP} > ${THIS_SIZE_SWAP}" >> ${THIS_FILE}.log
echo "\${THIS_SIZE_ZFS} > ${THIS_SIZE_ZFS}" >> ${THIS_FILE}.log
gpart destroy -F "${THIS_DEVICE}" >> ${THIS_FILE}.log 2>&1
graid delete "${THIS_DEVICE}" >> ${THIS_FILE}.log 2>&1
zpool labelclear -f "/dev/${THIS_DEVICE}" >> ${THIS_FILE}.log 2>&1
gpart create -s gpt "${THIS_DEVICE}" >> ${THIS_FILE}.log 2>&1
gpart destroy -F "${THIS_DEVICE}" >> ${THIS_FILE}.log 2>&1
gpart create -s gpt "${THIS_DEVICE}" >> ${THIS_FILE}.log 2>&1
THIS_BOOT=`gpart add -a 4k -l gptboot${THIS_LABEL} -t freebsd-boot -s ${THIS_SIZE_BOOT} "${THIS_DEVICE}"`
THIS_BOOT_NAME=`echo ${THIS_BOOT} | sed -e 's/\([a-zA-Z0-9]*\) added/\1/g'`
echo "\${THIS_BOOT} > ${THIS_BOOT}" >> ${THIS_FILE}.log 2>&1
gpart bootcode -b "/boot/pmbr" -p "/boot/gptzfsboot" -i 1 "${THIS_DEVICE}" >> ${THIS_FILE}.log 2>&1
THIS_SWAP=`gpart add -a 4k -l swap${THIS_LABEL} -t freebsd-swap -s ${THIS_SIZE_SWAP} "${THIS_DEVICE}"`
THIS_SWAP_NAME=`echo ${THIS_SWAP} | sed -e 's/\([a-zA-Z0-9]*\) added/\1/g'`
echo "\${THIS_SWAP} > ${THIS_SWAP}" >> ${THIS_FILE}.log 2>&1
zpool labelclear -f "/dev/${THIS_SWAP_NAME}" >> ${THIS_FILE}.log 2>&1
if [ -z "${THIS_SIZE_ZFS}" ]; then
THIS_ZFS=`gpart add -a 4k -l zfs${THIS_LABEL} -t freebsd-zfs "${THIS_DEVICE}"`
else
THIS_ZFS=`gpart add -a 4k -l zfs${THIS_LABEL} -t freebsd-zfs -s ${THIS_SIZE_ZFS} "${THIS_DEVICE}"`
fi
THIS_ZFS_NAME=`echo ${THIS_ZFS} | sed -e 's/\([a-zA-Z0-9]*\) added/\1/g'`
echo "\${THIS_ZFS} > ${THIS_ZFS}" >> ${THIS_FILE}.log 2>&1
zpool labelclear -f "/dev/${THIS_ZFS_NAME}" >> ${THIS_FILE}.log 2>&1
printf "${FSTAB_FMT}" "/dev/${THIS_SWAP_NAME}" "none" "swap" "sw" "0" "0" >> "/tmp/bsdinstall_etc/fstab"
gnop create -S 4096 "${THIS_ZFS_NAME}" >> ${THIS_FILE}.log 2>&1
echo "remenber this => freebsd-boot:${THIS_BOOT_NAME}"
echo " freebsd-swap:${THIS_SWAP_NAME}"
echo " freebsd-zfs :${THIS_ZFS_NAME}"
echo "End gpart---" >> ${THIS_FILE}.log
echo "create partition successful..."
;;
# pool: # ./zfs_disk.sh -p zroot "raidz2 da0p3.nop da1p3.nop da2p3.nop da3p3.nop"
# or: # ./zfs_disk.sh -p zroot "mirror da0p3.nop da1p3.nop mirror da2p3.nop da3p3.nop"
pool|-p)
THIS_POOLNAME=$2
THIS_POOLCOMMAND=$3
if [ -z "${THIS_POOLNAME}" ] || [ -z "${THIS_POOLCOMMAND}" ]; then
echo "missing argument"
echo -e "${HELP_INFO}"
exit 1
fi
echo "Begin pool---" >> ${THIS_FILE}.log
echo "\${THIS_POOLNAME} > ${THIS_POOLNAME}" >> ${THIS_FILE}.log
echo "\${THIS_POOLCOMMAND} > ${THIS_POOLCOMMAND}" >> ${THIS_FILE}.log
echo "zpool create -o altroot=/mnt -O compress=lz4 -O atime=off -m none -f "${THIS_POOLNAME}" ${THIS_POOLCOMMAND}" >> ${THIS_FILE}.log
zpool create -o altroot=/mnt -O compress=lz4 -O atime=off -m none -f "${THIS_POOLNAME}" ${THIS_POOLCOMMAND} >> ${THIS_FILE}.log 2>&1
zfs create -o mountpoint=none "${THIS_POOLNAME}/ROOT" >> ${THIS_FILE}.log 2>&1
zfs create -o mountpoint=/ "${THIS_POOLNAME}/ROOT/default" >> ${THIS_FILE}.log 2>&1
echo "End pool---" >> ${THIS_FILE}.log
echo "create pool successful..."
;;
# zfs: # ./zfs_disk.sh -z zroot auto
# # ./zfs_disk.sh -z zroot "-o mountpoint=/pub zroot/pub"
# # ./zfs_disk.sh -z zroot "-o mountpoint=/db -o recordsize=8K zroot/db"
zfs|-z)
THIS_POOLNAME=$2
THIS_ZFSCOMMAND=$3
if [ -z "${THIS_POOLNAME}" ] || [ -z "${THIS_ZFSCOMMAND}" ]; then
echo "missing argument"
echo -e "${HELP_INFO}"
exit 1
fi
echo "Begin zfs---" >> ${THIS_FILE}.log
echo "\${THIS_POOLNAME} > ${THIS_POOLNAME}" >> ${THIS_FILE}.log
echo "\${THIS_ZFSCOMMAND} > ${THIS_ZFSCOMMAND}" >> ${THIS_FILE}.log
if [ "${THIS_ZFSCOMMAND}" = "auto" ]; then
zfs create -o mountpoint=/tmp -o exec=on -o setuid=off "${THIS_POOLNAME}/tmp" >> ${THIS_FILE}.log 2>&1
zfs create -o mountpoint=/usr -o canmount=off "${THIS_POOLNAME}/usr" >> ${THIS_FILE}.log 2>&1
zfs create -o setuid=off "${THIS_POOLNAME}/usr/ports" >> ${THIS_FILE}.log 2>&1
zfs create "${THIS_POOLNAME}/usr/src" >> ${THIS_FILE}.log 2>&1
zfs create -o mountpoint=/var -o canmount=off "${THIS_POOLNAME}/var" >> ${THIS_FILE}.log 2>&1
zfs create -o exec=off -o setuid=off "${THIS_POOLNAME}/var/crash" >> ${THIS_FILE}.log 2>&1
zfs create -o exec=off -o setuid=off "${THIS_POOLNAME}/var/log" >> ${THIS_FILE}.log 2>&1
zfs create -o atime=on "${THIS_POOLNAME}/var/mail" >> ${THIS_FILE}.log 2>&1
zfs create -o setuid=off "${THIS_POOLNAME}/var/tmp" >> ${THIS_FILE}.log 2>&1
zfs create -o mountpoint=/home "${THIS_POOLNAME}/home" >> ${THIS_FILE}.log 2>&1
else
zfs create ${THIS_ZFSCOMMAND} >> ${THIS_FILE}.log 2>&1
fi
echo "End zfs---" >> ${THIS_FILE}.log
echo "create dataset successful..."
;;
# finish: # ./zfs_disk.sh -f zroot "da0p3.nop da1p3.nop da2p3.nop da3p3.nop"
finish|-f)
THIS_POOLNAME=$2
THIS_NOPLIST=$3
if [ -z "${THIS_POOLNAME}" ] || [ -z "${THIS_NOPLIST}" ]; then
echo "missing argument"
echo -e "${HELP_INFO}"
exit 1
fi
echo "Begin finish---" >> ${THIS_FILE}.log
echo "\${THIS_POOLNAME} > ${THIS_POOLNAME}" >> ${THIS_FILE}.log
echo "\${THIS_NOPLIST} > ${THIS_NOPLIST}" >> ${THIS_FILE}.log
chmod 1777 "/tmp" >> ${THIS_FILE}.log 2>&1
chmod 1777 "/var/tmp" >> ${THIS_FILE}.log 2>&1
zpool set bootfs="${THIS_POOLNAME}/ROOT/default" "${THIS_POOLNAME}" >> ${THIS_FILE}.log 2>&1
zpool export "${THIS_POOLNAME}" >> ${THIS_FILE}.log 2>&1
gnop destroy ${THIS_NOPLIST} >> ${THIS_FILE}.log 2>&1
zpool import -o altroot="/mnt" "${THIS_POOLNAME}" >> ${THIS_FILE}.log 2>&1
mkdir -p "/mnt/boot/zfs" >> ${THIS_FILE}.log 2>&1
zpool set cachefile="/mnt/boot/zfs/zpool.cache" "${THIS_POOLNAME}" >> ${THIS_FILE}.log 2>&1
echo "zfs_enable=\"YES\"" >> "/tmp/bsdinstall_etc/rc.conf.zfs"
echo "zfs_load=\"YES\"" >> "/tmp/bsdinstall_boot/loader.conf.zfs"
echo "kern.geom.label.gptid.enable=\"0\"" >> "/tmp/bsdinstall_boot/loader.conf.zfs"
echo "End finish---" >> ${THIS_FILE}.log
echo "finish successful..."
;;
# help: # ./zfs_disk.sh -h
help|-h)
echo -e "${HELP_INFO}"
exit 0
;;
# info: # ./zfs_disk.sh -o
# or: # ./zfs_disk.sh -o da0
info|-o)
THIS_DEVICE=$2
echo "Begin info---" >> ${THIS_FILE}.log
echo "\${THIS_DEVICE} > ${THIS_DEVICE}" >> ${THIS_FILE}.log
if [ -z "${THIS_DEVICE}" ]; then
gpart show
else
gpart show "${THIS_DEVICE}"
fi
echo "End info---" >> ${THIS_FILE}.log
echo "show disk info successful..."
;;
# error
*)
echo "unrecognized command '${THIS_OPE}'"
echo -e "${HELP_INFO}"
exit 1
;;
esac
复制代码
作者:
蛮多肉
时间:
2015-07-01 23:29
先顶了再看
作者:
james90404
时间:
2015-07-01 23:35
我还在思考...
作者:
rtm009
时间:
2015-07-02 09:41
不是说zfs在非sun系统下性能下降很大吗?zfs最好用2块hdd 单盘没啥意思!
作者:
lsstarboy
时间:
2015-07-02 10:17
回复
4#
rtm009
性能下降是从哪地方得来的消息?应该是指的Linux吧,FreeBSD花了很大精力才移植过来的,几十万行代码呢。
单盘zfs也是有意义的,电力不好的时候可以避免磁盘fsck,也可以避免数据库不能启动。
作者:
lsstarboy
时间:
2015-07-02 10:19
本帖最后由 lsstarboy 于 2015-07-02 10:19 编辑
可以把磁盘也到shell的循环里面,官方的安装脚本里在就是对选中的磁盘进行循环。
作者:
rtm009
时间:
2015-07-02 14:59
回复
5#
lsstarboy
鸟语不好的说 装过不会用 也不会调 仅仅是装上了
作者:
bleakwind
时间:
2015-07-02 15:10
lsstarboy 发表于 2015-07-02 10:19
可以把磁盘也到shell的循环里面,官方的安装脚本里在就是对选中的磁盘进行循环。
主要是想给更多自定义,代替打过多命令,还有为了加上系统gpart没加的-a 4k,和自定义分区.
比如我习惯最后空出1g空间,作为磁盘容量不同的机动调整,还有swap也给予自定义.
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2