Bug 202383 - [bsdinstall] zfsboot
Summary: [bsdinstall] zfsboot
Status: New
Alias: None
Product: Base System
Classification: Unclassified
Component: bin (show other bugs)
Version: 10.2-RELEASE
Hardware: i386 Any
: --- Affects Only Me
Assignee: freebsd-bugs mailing list
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-08-17 11:30 UTC by Fedor
Modified: 2019-03-01 16:46 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Fedor 2015-08-17 11:30:44 UTC
# uname -a
FreeBSD FreeBSD 10.2-RELEASE FreeBSD 10.2-RELEASE #0 r286666: Wed Aug 12 19:31:38 UTC 2015     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC  i386

/usr/libexec/bsdinstall/zfsboot

f_isset()
{
        eval [ \"\${${1%%[$IFS]*}+set}\" ] # eval [ "${ZFSBOOT_DATASETS+set}" ]
}
f_isset ZFSBOOT_DATASETS || ZFSBOOT_DATASETS="
  ...
"

It "keep it short and simple"?

ZFSBOOT_DATASETS=   # null
f_isset ZFSBOOT_DATASETS && echo "It worked!" || echo "Error"   # It worked!



I recommend do this option

if interactive zfs_create_dataset or ZFSBOOT_DATASETS="
...
"

zfs_create_datasets()
{
    ZFSBOOT_DATASETS=
    local zfs_create val

    while [ 1 ]
    do
    echo "Add ZFS datasets? (yes/no)"
    read val
    [ -n "$val" ] || continue
    if [ $val = "yes" ]; then
        echo "enter ZFS datasets..."
        echo "e.g.: /usr/src  compression=lz4,exec=off,setuid=off"

# You can add help for options zfs

        read zfs_create
        if [ $zfs_create ]; then
            ZFSBOOT_DATASETS="$ZFSBOOT_DATASETS

            $zfs_create"
            zfs_create=
        else
            f_show_err $msg_error
        fi
        continue
    elif
        [ $val = "no" ]; then
        break
    fi
    done
}

Help available options zfs:

aclinherit  discard | noallow | restricted | passthrough | passthrough-x
aclmode     discard | groupmask | passthrough | restricted
atime       on | off
canmount    on | off | noauto
checksum    on | off | fletcher2 | fletcher4 | sha256
compression on | off | lzjb | gzip | gzip-[1-9] | zle | lz4
copies      1 | 2 | 3
dedup       on | off | verify | sha256[,verify]
devices     on | off
exec        on | off
jailed      on | off
logbias     latency | throughput
mlslabel    <sensitivity label>
mountpoint  <path> | legacy | none
nbmand      on | off
primarycache    all | none | metadata
quota       <size> | none
readonly    on | off
recordsize  512 to 128k, power of 2
refquota    <size> | none
refreservation  <size> | none
reservation <size> | none
secondarycache  all | none | metadata
setuid      on | off
sharenfs    on | off | share(1M) options
sharesmb    on | off | sharemgr(1M) options
snapdir     hidden | visible
sync        standard | always | disabled
version     1 | 2 | 3 | 4 | 5 | current
volsize     <size>
vscan       on | off
xattr       on | off
userquota@...   <size> | none
groupquota@...  <size> | none



case "$ZFSBOOT_VDEV_TYPE" in
        stripe) want_disks=1 ;;
        mirror) want_disks=2 ;;
        raidz1) want_disks=2 ;;
        raidz2) want_disks=3 ;;
        raidz3) want_disks=4 ;;
        esac

For RAID-Z1 quite enough 2 disk devices.
For RAID-Z2 quite enough 3 disk devices.
For RAID-Z3 quite enough 4 disk devices.

invalid vdev specification: mirror requires at least 2 devices
invalid vdev specification: raidz requires at least 2 devices
invalid vdev specification: raidz2 requires at least 3 devices
invalid vdev specification: raidz3 requires at least 4 devices



f_eval_catch -d $funcname umount "$UMOUNT" /mnt
f_eval_catch -d $funcname umount "$UMOUNT" $BSDINSTALL_CHROOT # replacement



Not verification existence variable

if f_expand_number "$ZFSBOOT_SWAP_SIZE" swapsize &&
f_expand_number "$ZFSBOOT_BOOT_POOL_SIZE" bootsize

f_expand_number()
{
    # echo $ZFSBOOT_SWAP_SIZE

    ## local var
    # __string="$ZFSBOOT_SWAP_SIZE"
    # echo $__string

    ## Remove any leading non-digits
    # __cp="$__string"
    # echo $__cp

    # __string="${__cp#[!0-9]}"
    # echo $__string

    # [ "$__string" = "$__cp" ] && echo "It worked!"
    It worked!
    ## Produce `-1' if string didn't contain any digits
    # if [ ! "$__string" ]; then
    > echo "It worked!"
    > fi
    It worked!
    ## Store the numbers
    # __num="${__string%%[!0-9]*}"
    ## Shortcut
    # [ $__num -eq 0 ] && echo "It worked!"
    [: -eq: unexpected operator
    ## Determine if the wheels fall off
    [ $__num -gt 1 ] && echo "It worked!"
    [: -gt: unexpected operator
}

Decision

if [ -n "$ZFSBOOT_SWAP_SIZE" ] && [ -n "$ZFSBOOT_BOOT_POOL_SIZE" ]; then
    if  f_expand_number "$ZFSBOOT_SWAP_SIZE" swapsize &&
        f_expand_number "$ZFSBOOT_BOOT_POOL_SIZE" bootsize

        ...

    fi
else
    [ -z "$ZFSBOOT_SWAP_SIZE" ] &&
    f_show_err "$msg_invalid_swap_size" "$ZFSBOOT_SWAP_SIZE" &&
    continue

    [ -z "$ZFSBOOT_BOOT_POOL_SIZE" ] &&
    f_show_err "$msg_invalid_boot_pool_size" "$ZFSBOOT_BOOT_POOL_SIZE" &&
    continue
fi

Delete unnecessary:

    f_dprintf "$funcname: Expanding supplied size values..."

    if ! f_expand_number "$ZFSBOOT_SWAP_SIZE" swapsize; then
        f_dprintf "$funcname: Invalid swap size \`%s'" \
                  "$ZFSBOOT_SWAP_SIZE"
        f_show_err "$msg_invalid_swap_size" "$ZFSBOOT_SWAP_SIZE"
        return $FAILURE
    fi
    

    if ! f_expand_number "$ZFSBOOT_BOOT_POOL_SIZE" bootsize; then
        f_dprintf "$funcname: Invalid boot pool size \`%s'" \
                  "$ZFSBOOT_BOOT_POOL_SIZE"
        f_show_err "$msg_invalid_boot_pool_size" \
                   "$ZFSBOOT_BOOT_POOL_SIZE"
        return $FAILURE
    fi



System is used all over the world.

f_dprintf "Pool name cannot be empty." # where i18n?
f_show_err "$msg_pool_name_cannot_be_empty"

msg_pool_name_cannot_be_empty="Pool name cannot be empty."

reiterate?

f_dprintf "No disk(s) present to configure" # unnecessary?
f_show_err "$msg_no_disks_present_to_configure"

msg_no_disks_present_to_configure="No disk(s) present to configure"



/usr/share/bsdconfig/dialog.subr
/usr/src/usr.sbin/bsdconfig/share/dialog.subr
Function f_dialog_line_sanitize () uses a non-existent functionf_dialog_response_sanitize ?
# grep -R 'f_dialog_response_sanitize*(' /usr/
# empty result

f_dialog_line_sanitize()
{
        if [ "$#" -eq 0 ]; then
                f_dprintf "%s: called with zero arguments" \
                          f_dialog_response_sanitize # Use of undeclared function f_dialog_response_sanitize?
                return $FAILURE
        fi

        local __var_to_edit
        for __var_to_edit in $*; do
                # Skip warnings and trim leading/trailing whitespace
                setvar $__var_to_edit "$( f_getvar $__var_to_edit | awk '
                        BEGIN { data = 0 }
                        {
                                if ( ! data )
                                {
                                        if ( $0 ~ /^$/ ) next
                                        if ( $0 ~ /^Gdk-WARNING \*\*:/ ) next
                                        data = 1
                                }
                                sub(/^[[:space:]]*/, "")
                                sub(/[[:space:]]*$/, "")
                                print
                        }
                ' )"
        done
}



/usr/share/bsdconfig/common.subr
/usr/src/usr.sbin/bsdconfig/share/common.subr
Function f_die() uses a non-existent function f_clean_up ?
# grep -R 'f_clean_up*(' /usr/
/usr/share/bsdconfig/common.subr:       # Optionally call f_clean_up() function if it exists
/usr/src/usr.sbin/bsdconfig/share/common.subr:  # Optionally call f_clean_up() function if it exists

f_die()
{
        local status=$FAILURE

        # If there is at least one argument, take it as the status
        if [ $# -gt 0 ]; then
                status=$1
                shift 1
        fi

        # If there are still arguments left, pass them to f_show_msg
        [ $# -gt 0 ] && f_show_msg "$@"

        # Optionally call f_clean_up() function if it exists
        f_have f_clean_up && f_clean_up # Optionally the use of undeclared function f_clean_up without testing?

        exit $status
}