diff --git a/heartbeat/nvmet-namespace b/heartbeat/nvmet-namespace index c6616a673..0ea31f121 100755 --- a/heartbeat/nvmet-namespace +++ b/heartbeat/nvmet-namespace @@ -1,205 +1,205 @@ #!/bin/sh # # # NVMe-oF (rdma, tcp, fc) OCF RA. Exports and manages NVMe targets. # # (c) 2021 LINBIT HA-Solutions GmbH, written by Philipp Reisner # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # This program is distributed in the hope that it would be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Further, this software is distributed without any warranty that it is # free of the rightful claim of any third person regarding infringement # or the like. Any license provided herein, whether implied or # otherwise, applies only to this software file. Patent licenses, if # any, provided herein do not apply to combinations of this program with # other software, or any other product whatsoever. # # You should have received a copy of the GNU General Public License # along with this program; if not, write the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. # ####################################################################### # Initialization: : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs OCF_RESKEY_namespace_id_default="1" : ${OCF_RESKEY_namespace_id=${OCF_RESKEY_namespace_id_default}} OCF_RESKEY_nguid_default="" : ${OCF_RESKEY_nguid=${OCF_RESKEY_nguid_default}} ####################################################################### meta_data() { cat < 0.9 Manages NVMe-oF namespaces. An NVMe-oF namespace is part of an NVMe-oF target. A namespace must be created after the subsystem. It is similar in concept to the LUN of an iSCSI target. NVMe-oF target export agent The NVMe Qualified Name (NQN) is used to identify the remote NVMe storage target. It is similar to an iSCSI Qualified Name -(IQN). While it is a free from string follow the conversion: +(IQN). While it is a free-form string, you should follow the convention: nqn.2014-08.com.vendor:nvme:nvm-subsystem-sn-12345 You need to refer here to the NQN of an NVMe Subsystem your created with the NVMeSubsystem resource agent. NVMe Qualified Name The NVMe namespace id (number). namespace id The full path to the block device or file that should be exposed through this -namesapce. +namespace. block device full path The UUID that should be exposed by NVMe. Create it using uuidgen. This is -necessary that the initiators accept the Namespace from the new server +necessary for the initiators to accept the namespace from the new server after failover. UUID NGUID stands for Namespace Globally Unique Identifier. Seems to be optional, looks like e.g. VMWare ESXi7 uses it to identify namespaces. Use 'uuidgen' to create it. NGUID END } ####################################################################### nvmet_namespace_usage() { cat < ${namespace}/device_path echo "${OCF_RESKEY_uuid}" > ${namespace}/device_uuid [ "${OCF_RESKEY_nguid}" ] && echo "${OCF_RESKEY_nguid}" > ${namespace}/device_nguid echo 1 > ${namespace}/enable nvmet_namespace_monitor } nvmet_namespace_stop() { nvmet_namespace_monitor if [ $? -eq $OCF_NOT_RUNNING ]; then return $OCF_SUCCESS fi rmdir ${namespace} return $OCF_SUCCESS } nvmet_namespace_monitor() { [ -d ${namespace} ] || return $OCF_NOT_RUNNING return $OCF_SUCCESS } nvmet_namespace_validate() { if [ ! -d /sys/kernel/config/nvmet ]; then ocf_log err "/sys/kernel/config/nvmet does not exist -- Load the nvmet.ko linux kernel module." exit $OCF_ERR_INSTALLED fi subsys=/sys/kernel/config/nvmet/subsystems/${OCF_RESKEY_nqn} namespace=${subsys}/namespaces/${OCF_RESKEY_namespace_id} return $OCF_SUCCESS } case $1 in meta-data) meta_data exit $OCF_SUCCESS ;; usage|help) nvmet_namespace_usage exit $OCF_SUCCESS ;; esac # Everything except usage and meta-data must pass the validate test nvmet_namespace_validate case $__OCF_ACTION in start) nvmet_namespace_start;; stop) nvmet_namespace_stop;; monitor|status) nvmet_namespace_monitor;; reload) ocf_log info "Reloading..." nvmet_namespace_start ;; validate-all) ;; *) nvmet_namespace_usage exit $OCF_ERR_UNIMPLEMENTED ;; esac rc=$? ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc" exit $rc diff --git a/heartbeat/nvmet-port b/heartbeat/nvmet-port index 50ee2562a..8728857d9 100755 --- a/heartbeat/nvmet-port +++ b/heartbeat/nvmet-port @@ -1,238 +1,238 @@ #!/bin/sh # # # NVMe-oF (rdma, tcp, fc) OCF RA. Exports and manages NVMe targets. # # (c) 2021 LINBIT HA-Solutions GmbH, written by Philipp Reisner # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # This program is distributed in the hope that it would be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Further, this software is distributed without any warranty that it is # free of the rightful claim of any third person regarding infringement # or the like. Any license provided herein, whether implied or # otherwise, applies only to this software file. Patent licenses, if # any, provided herein do not apply to combinations of this program with # other software, or any other product whatsoever. # # You should have received a copy of the GNU General Public License # along with this program; if not, write the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. # ####################################################################### # Initialization: : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs OCF_RESKEY_port_id_default="0" : ${OCF_RESKEY_port_id=${OCF_RESKEY_port_id_default}} OCF_RESKEY_type_default="tcp" : ${OCF_RESKEY_type=${OCF_RESKEY_type_default}} OCF_RESKEY_addr_fam_default="ipv4" : ${OCF_RESKEY_addr_fam=${OCF_RESKEY_addr_fam_default}} OCF_RESKEY_svcid_default="4420" : ${OCF_RESKEY_svcid=${OCF_RESKEY_svcid_default}} ####################################################################### meta_data() { cat < 0.9 Manages NVMe-oF ports. An NVMe-oF port is part of an NVMe-oF target. A port must be created after the subsystem. It exposes one or multiple subsystem(s) including the enclosed namespace(s) to the network. NVMe-oF target export agent The NVMe port number is a 16 bit number. NVMe port -The NVMe transport type. Might be one of 'tcp', 'rdma', 'fc' or 'loop'. +The NVMe transport type. Should be one of 'tcp', 'rdma', 'fc' or 'loop'. tcp or rdma -The address family of the address. Mibht be 'ipv4', 'ipv6' or 'fc'. +The address family of the address. Should be 'ipv4', 'ipv6' or 'fc'. ipv4 or ipv6 -The transport service identifier, is the TCP/IP port number of the -equivalent in the RDMA world. +The transport service identifier. The TCP/IP port number this target binds to, +or its RDMA protocol equivalent. IP/RDMA port number -The transport address, is the TCP/IP address this targets binds to -or the equivalent in the RDMA world. +The transport address. The TCP/IP address this targets binds to, +or its RDMA protocol equivalent. IP/RDMA/FC address A space-separated list of NQNs that should be exported through this NVMe-oF-Target port. This list needs to have at least one entry. list of NQNs END } ####################################################################### nvmet_port_usage() { cat < ${portdir}/addr_traddr echo ${OCF_RESKEY_type} > ${portdir}/addr_trtype echo ${OCF_RESKEY_svcid} > ${portdir}/addr_trsvcid echo ${OCF_RESKEY_addr_fam} > ${portdir}/addr_adrfam for subsystem in ${OCF_RESKEY_nqns}; do ln -s /sys/kernel/config/nvmet/subsystems/${subsystem} \ ${portdir}/subsystems/${subsystem} done nvmet_port_monitor } nvmet_port_stop() { nvmet_port_monitor if [ $? -eq $OCF_NOT_RUNNING ]; then return $OCF_SUCCESS fi for subsystem in ${OCF_RESKEY_nqns}; do rm ${portdir}/subsystems/${subsystem} done rmdir ${portdir} return $OCF_SUCCESS } nvmet_port_monitor() { [ -d ${portdir} ] || return $OCF_NOT_RUNNING return $OCF_SUCCESS } nvmet_port_validate() { case "${OCF_RESKEY_type}" in tcp|rdma|fc) ;; *) ocf_log err "type must be tcp, rdma, or fc. OCF_RESKEY_type was set to $OCF_RESKEY_type" exit $OCF_ERR_ARGS ;; esac case "${OCF_RESKEY_addr_fam}" in ipv4|ipv6|fc) ;; *) ocf_log err "addr_fam must be ipv4, ipv6, or fc. OCF_RESKEY_addr_fam was set to $OCF_RESKEY_addr_fam" exit $OCF_ERR_ARGS ;; esac if [ -z "${OCF_RESKEY_nqns}" ]; then ocf_log err "subsystems may not be empty. OCF_RESKEY_nqns was set to $OCF_RESKEY_nqns" exit $OCF_ERR_ARGS fi if [ ! -d /sys/kernel/config/nvmet ]; then ocf_log err "/sys/kernel/config/nvmet does not exist -- Load the nvmet.ko linux kernel module." exit $OCF_ERR_INSTALLED fi portdir=/sys/kernel/config/nvmet/ports/${OCF_RESKEY_port_id} return $OCF_SUCCESS } case $1 in meta-data) meta_data exit $OCF_SUCCESS ;; usage|help) nvmet_port_usage exit $OCF_SUCCESS ;; esac # Everything except usage and meta-data must pass the validate test nvmet_port_validate case $__OCF_ACTION in start) nvmet_port_start;; stop) nvmet_port_stop;; monitor|status) nvmet_port_monitor;; reload) ocf_log info "Reloading..." nvmet_port_start ;; validate-all) ;; *) nvmet_port_usage exit $OCF_ERR_UNIMPLEMENTED ;; esac rc=$? ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc" exit $rc diff --git a/heartbeat/nvmet-subsystem b/heartbeat/nvmet-subsystem index 217858687..d469fc17b 100755 --- a/heartbeat/nvmet-subsystem +++ b/heartbeat/nvmet-subsystem @@ -1,188 +1,188 @@ #!/bin/sh # # # NVMe-oF (rdma, tcp, fc) OCF RA. Exports and manages NVMe targets. # # (c) 2021 LINBIT HA-Solutions GmbH, written by Philipp Reisner # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # This program is distributed in the hope that it would be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Further, this software is distributed without any warranty that it is # free of the rightful claim of any third person regarding infringement # or the like. Any license provided herein, whether implied or # otherwise, applies only to this software file. Patent licenses, if # any, provided herein do not apply to combinations of this program with # other software, or any other product whatsoever. # # You should have received a copy of the GNU General Public License # along with this program; if not, write the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. # ####################################################################### # Initialization: : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs OCF_RESKEY_allowed_initiators_default="" : ${OCF_RESKEY_allowed_initiators=${OCF_RESKEY_allowed_initiators_default}} OCF_RESKEY_serial_default="" : ${OCF_RESKEY_serial=${OCF_RESKEY_serial_default}} ####################################################################### meta_data() { cat < 0.9 Manages NVMe-oF subsystems. An NVMe-oF subsystem is part of an NVMe-oF target. A subsystem must be created first, before namespace(s) and port(s). NVMe-oF target export agent The NVMe Qualified Name (NQN) is used to identify the remote NVMe storage target. It is similar to an iSCSI Qualified Name -(IQN). While it is a free from string follow the conversion: +(IQN). While it is a free-form string, you should follow the convention: nqn.2014-08.com.vendor:nvme:nvm-subsystem-sn-12345 NVMe Qualified Name Allowed initiators. A space-separated list of initiators allowed to connect to this target. Initiators are identified by their NQN. If the list is empty, any initiator will be allowed to connect. List of NVMe initiators allowed to connect to this target The serial of the subsystem. Set it to a random 16 character hex value. Use hexdump -n 8 -e '4/4 "%08x" 1 "\n"' /dev/urandom List of NVMe initiators allowed to connect to this target END } ####################################################################### nvmet_subsystem_usage() { cat < ${subsys}/attr_serial if [ -z "${OCF_RESKEY_allowed_initiators}" ]; then echo 1 > ${subsys}/attr_allow_any_host else local hosts_dir=/sys/kernel/config/nvmet/hosts echo 0 > ${subsys}/attr_allow_any_host for hostnqn in "${OCF_RESKEY_allowed_initiators}"; do mkdir -p ${hosts_dir}/${hostnqn} ln -s ${hosts_dir}/${hostnqn} ${subsys}/allowed_hosts done fi nvmet_subsystem_monitor } nvmet_subsystem_stop() { nvmet_subsystem_monitor if [ $? -eq $OCF_NOT_RUNNING ]; then return $OCF_SUCCESS fi rmdir /sys/kernel/config/nvmet/subsystems/${OCF_RESKEY_nqn} return $OCF_SUCCESS } nvmet_subsystem_monitor() { [ -d /sys/kernel/config/nvmet/subsystems/${OCF_RESKEY_nqn} ] || return $OCF_NOT_RUNNING return $OCF_SUCCESS } nvmet_subsystem_validate() { if [ ! -d /sys/kernel/config/nvmet ]; then ocf_log err "/sys/kernel/config/nvmet does not exist -- Load the nvmet.ko linux kernel module." exit $OCF_ERR_INSTALLED fi return $OCF_SUCCESS } case $1 in meta-data) meta_data exit $OCF_SUCCESS ;; usage|help) nvmet_subsystem_usage exit $OCF_SUCCESS ;; esac # Everything except usage and meta-data must pass the validate test nvmet_subsystem_validate case $__OCF_ACTION in start) nvmet_subsystem_start;; stop) nvmet_subsystem_stop;; monitor|status) nvmet_subsystem_monitor;; reload) ocf_log info "Reloading..." nvmet_subsystem_start ;; validate-all) ;; *) nvmet_subsystem_usage exit $OCF_ERR_UNIMPLEMENTED ;; esac rc=$? ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc" exit $rc