diff --git a/cmd/Makefile.am b/cmd/Makefile.am index de2db40307..5c8afb4e73 100644 --- a/cmd/Makefile.am +++ b/cmd/Makefile.am @@ -1,2 +1,2 @@ SUBDIRS = zfs zpool zdb zinject ztest zpios mount_zfs -SUBDIRS += zpool_layout zvol_id zpool_id sas_switch_id +SUBDIRS += zpool_layout zvol_id zpool_id vdev_id diff --git a/cmd/Makefile.in b/cmd/Makefile.in index 0efcdb4a2e..ffc2834f97 100644 --- a/cmd/Makefile.in +++ b/cmd/Makefile.in @@ -329,7 +329,7 @@ top_srcdir = @top_srcdir@ udevdir = @udevdir@ udevruledir = @udevruledir@ SUBDIRS = zfs zpool zdb zinject ztest zpios mount_zfs zpool_layout \ - zvol_id zpool_id sas_switch_id + zvol_id zpool_id vdev_id all: all-recursive .SUFFIXES: diff --git a/cmd/sas_switch_id/Makefile.am b/cmd/sas_switch_id/Makefile.am deleted file mode 100644 index b666bea0a9..0000000000 --- a/cmd/sas_switch_id/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -dist_udev_SCRIPTS = sas_switch_id diff --git a/cmd/sas_switch_id/sas_switch_id b/cmd/sas_switch_id/sas_switch_id deleted file mode 100755 index ecaabc0285..0000000000 --- a/cmd/sas_switch_id/sas_switch_id +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/sh -# -# sas_switch_id -# -# Callout script for multipathd to obtain disk UUIDs. Combine the UUID -# from the scsi_id program with the SAS switch port number and enclosure -# bay number, if available. This naming convention enables easier -# identification of the physical drive location when multiple disk -# enclosures are accessed via a SAS switch. For other storage -# topologies just return the undecorated UUID of the drive. - -PHYS_PER_PORT=4 -DEV= - -usage() { - cat << EOF -Usage: sas_switch_id [-d disk] [-p phys_per_port] - -d Basename of the disk device [default=none] - -p Number of PHYs per switch port [default=${PHYS_PER_PORT}] - -h Show this message -EOF - exit 0 -} - -while getopts 'd:p:h' OPTION; do - case ${OPTION} in - d) - DEV=${OPTARG} - ;; - p) - PHYS_PER_PORT=${OPTARG} - ;; - h) - usage - ;; - esac -done - -if [ -z "$DEV" ] ; then - echo "Error: missing required option -d" - exit 1 -fi - -UUID=`/lib/udev/scsi_id --whitelisted --device=/dev/$DEV` -if [ $? != 0 -o -z "$UUID" ] ; then - exit 1 -fi -sys_path=`udevadm info -q path -p /sys/block/$DEV` -dirs=(`echo "$sys_path" | tr / ' '`) -switch_port_dir="/sys" - -# Get path up to /sys/.../hostX -for (( i=0; i<${#dirs[*]}; i++ )); do - d=${dirs[$i]} - switch_port_dir=$switch_port_dir/$d - echo $d | egrep -q -e '^host[0-9]+$' && break -done - -if [ $i = ${#dirs[*]} ] ; then - echo $UUID - exit 0 -fi - -# The directory three levels beneath /sys/.../hostX contains -# symlinks to phy devices that reveal the switch port number. -# Lowest phy number is $PHYS_PER_PORT*switch_port_number. -for (( j=(($i+1)) ; j<(($i+4)); j++ )); do - switch_port_dir=$switch_port_dir/${dirs[$j]} -done -pushd $switch_port_dir > /dev/null -PHY=`ls -d phy* 2>/dev/null | head -1 | awk -F: '{print $NF}'` -PORT=$(( $PHY / $PHYS_PER_PORT )) -popd > /dev/null -if [ -z "$PHY" ] ; then - echo $UUID - exit 0 -fi - -# Look in /sys/.../sas_device/end_device-X for the bay_identifier -# attribute. -end_device_dir=$switch_port_dir -for (( k=$j ; k<${#dirs[*]} ; k++ )); do - d=${dirs[$k]} - end_device_dir=$end_device_dir/$d - if echo $d | egrep -q -e '^end_device' ; then - end_device_dir=$end_device_dir/sas_device/$d - break - fi -done -SLOT=`cat $end_device_dir/bay_identifier 2>/dev/null` -if [ -z "$SLOT" ] ; then - echo $UUID - exit 0 -fi - -echo "$UUID-switch-port:$PORT-slot:$SLOT" diff --git a/cmd/vdev_id/Makefile.am b/cmd/vdev_id/Makefile.am new file mode 100644 index 0000000000..fb815faad0 --- /dev/null +++ b/cmd/vdev_id/Makefile.am @@ -0,0 +1 @@ +dist_udev_SCRIPTS = vdev_id diff --git a/cmd/sas_switch_id/Makefile.in b/cmd/vdev_id/Makefile.in similarity index 98% rename from cmd/sas_switch_id/Makefile.in rename to cmd/vdev_id/Makefile.in index 12be6784eb..8f3b4ae6ab 100644 --- a/cmd/sas_switch_id/Makefile.in +++ b/cmd/vdev_id/Makefile.in @@ -35,7 +35,7 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ -subdir = cmd/sas_switch_id +subdir = cmd/vdev_id DIST_COMMON = $(dist_udev_SCRIPTS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -313,7 +313,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ udevdir = @udevdir@ udevruledir = @udevruledir@ -dist_udev_SCRIPTS = sas_switch_id +dist_udev_SCRIPTS = vdev_id all: all-am .SUFFIXES: @@ -326,9 +326,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/sas_switch_id/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/vdev_id/Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu cmd/sas_switch_id/Makefile + $(AUTOMAKE) --gnu cmd/vdev_id/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ diff --git a/cmd/vdev_id/vdev_id b/cmd/vdev_id/vdev_id new file mode 100755 index 0000000000..d2781972f7 --- /dev/null +++ b/cmd/vdev_id/vdev_id @@ -0,0 +1,291 @@ +#!/bin/bash +# +# vdev_id: udev helper to generate user-friendly names for JBOD disks +# +# This script parses the file /etc/zfs/vdev_id.conf to map a +# physical path in a storage topology to a channel name. The +# channel name is combined with a disk enclosure slot number to +# create an alias that reflects the physical location of the drive. +# This is particularly helpful when it comes to tasks like replacing +# failed drives. Slot numbers may also be re-mapped in case the +# default numbering is unsatisfactory. The drive aliases will be +# created as symbolic links in /dev/disk/by-vdev. +# +# The only currently supported topologies are sas_direct and +# sas_switch. A multipath mode is supported in which dm-mpath +# devices are handled by examining the first-listed running +# component disk. In multipath mode the configuration file +# should contain a channel definition with the same name for +# each path to a given enclosure. + +# +# Some example configuration files are given below. + +# # +# # Example vdev_id.conf - sas_direct. +# # +# +# multipath no +# topology sas_direct +# phys_per_port 4 +# +# # PCI_ID HBA PORT CHANNEL NAME +# channel 85:00.0 1 A +# channel 85:00.0 0 B +# channel 86:00.0 1 C +# channel 86:00.0 0 D +# +# # Linux Mapped +# # Slot Slot +# slot 1 7 +# slot 2 10 +# slot 3 3 +# slot 4 6 +# slot 5 2 +# slot 6 8 +# slot 7 1 +# slot 8 4 +# slot 9 9 +# slot 10 5 + +# # +# # Example vdev_id.conf - sas_switch +# # +# +# topology sas_switch +# +# # SWITCH PORT CHANNEL NAME +# channel 1 A +# channel 2 B +# channel 3 C +# channel 4 D + +# # +# # Example vdev_id.conf - multipath +# # +# +# multipath yes +# +# # PCI_ID HBA PORT CHANNEL NAME +# channel 85:00.0 1 A +# channel 85:00.0 0 B +# channel 86:00.0 1 A +# channel 86:00.0 0 B + +PATH=/bin:/sbin:/usr/bin:/usr/sbin +CONFIG=/etc/zfs/vdev_id.conf +PHYS_PER_PORT= +DEV= +SLOT_MAP= +CHANNEL_MAP= +MULTIPATH= +TOPOLOGY= +declare -i i j + +usage() { + cat << EOF +Usage: vdev_id [-h] + vdev_id <-d device> [-c config_file] [-p phys_per_port] + [-g sas_direct|sas_switch] [-m] + + -c specify name of alernate config file [default=$CONFIG] + -d specify basename of device (i.e. sda) + -g Storage network topology [default="$TOPOLOGY"] + -m Run in multipath mode + -p number of phy's per switch port [default=$PHYS_PER_PORT] + -h show this summary +EOF + exit 0 +} + +map_slot() { + local LINUX_SLOT=$1 + local MAPPED_SLOT= + + MAPPED_SLOT=`awk "/^slot / && \\$2 == ${LINUX_SLOT} \ + { print \\$3; exit }" $CONFIG` + if [ -z "$MAPPED_SLOT" ] ; then + MAPPED_SLOT=$LINUX_SLOT + fi + printf "%d" ${MAPPED_SLOT} +} + +map_channel() { + local MAPPED_CHAN= + local PCI_ID=$1 + local PORT=$2 + + case $TOPOLOGY in + "sas_switch") + MAPPED_CHAN=`awk "/^channel / && \\$2 == ${PORT} \ + { print \\$3; exit }" $CONFIG` + ;; + "sas_direct") + MAPPED_CHAN=`awk "/^channel / && \\$2 == \"${PCI_ID}\" && \ + \\$3 == ${PORT} { print \\$4; exit }" \ + $CONFIG` + ;; + esac + printf "%s" ${MAPPED_CHAN} +} + +while getopts 'c:s:d:g:mp:h' OPTION; do + case ${OPTION} in + c) + CONFIG=`readlink -e ${OPTARG}` + ;; + d) + DEV=${OPTARG} + ;; + g) + TOPOLOGY=$OPTARG + ;; + p) + PHYS_PER_PORT=${OPTARG} + ;; + m) + MULTIPATH_MODE=yes + ;; + s) + SLOT_MAP=`readlink -e ${OPTARG}` + if [ ! -r $SLOT_MAP ] ; then + echo "Error: $SLOT_MAP is nonexistant or unreadable" + exit 1 + fi + ;; + h) + usage + ;; + esac +done + +if [ ! -r $CONFIG ] ; then + exit 0 +fi + +if [ -z "$DEV" ] ; then + echo "Error: missing required option -d" + exit 1 +fi + +if [ -z "$TOPOLOGY" ] ; then + TOPOLOGY=`awk "/^topology /{print \\$2; exit}" $CONFIG` +fi +TOPOLOGY=${TOPOLOGY:-sas_direct} +case $TOPOLOGY in + sas_direct|sas_switch) + ;; + *) + echo "Error: unknown topology $TOPOLOGY" + exit 1 + ;; +esac + +if [ -z "$PHYS_PER_PORT" ] ; then + PHYS_PER_PORT=`awk "/^phys_per_port /{print \\$2; exit}" $CONFIG` +fi +PHYS_PER_PORT=${PHYS_PER_PORT:-4} +if ! echo $PHYS_PER_PORT | egrep -q '^[0-9]+$' ; then + echo "Error: phys_per_port value $PHYS_PER_PORT is non-numeric" + exit 1 +fi + +if [ -z "$MULTIPATH_MODE" ] ; then + MULTIPATH_MODE=`awk "/^multipath /{print \\$2; exit}" $CONFIG` +fi + +# Use first running component device if we're handling a dm-mpath device. +if [ "$MULTIPATH_MODE" = "yes" ] ; then + # If udev didn't tell us the UUID via DM_NAME, find it in /dev/mapper + if [ -z "$DM_NAME" ] ; then + DM_NAME=`ls -l --full-time /dev/mapper | + awk "/\/$DEV$/{print \\$9}"` + fi + + # For raw disks udev exports DEVTYPE=partition when handling partitions, + # and the rules can be written to take advantage of this to append a + # -part suffix. For dm devices we get DEVTYPE=disk even for partitions + # so we have to append the -part suffix directly in the helper. + if [ "$DEVTYPE" != "partition" ] ; then + PART=`echo $DM_NAME | awk -Fp '/p/{print "-part"$2}'` + fi + + # Strip off partition information. + DM_NAME=`echo $DM_NAME | sed 's/p[0-9][0-9]*$//'` + if [ -z "$DM_NAME" ] ; then + exit 0 + fi + + # Get the raw scsi device name from multipath -l. + DEV=`multipath -l $DM_NAME |awk '/running/{print $3 ; exit}'` + if [ -z "$DEV" ] ; then + exit 0 + fi +fi + +if echo $DEV | grep -q ^/devices/ ; then + sys_path=$DEV +else + sys_path=`udevadm info -q path -p /sys/block/$DEV 2>/dev/null` +fi + +dirs=(`echo "$sys_path" | tr / ' '`) +scsi_host_dir="/sys" + +# Get path up to /sys/.../hostX +for (( i=0; i<${#dirs[*]}; i++ )); do + d=${dirs[$i]} + scsi_host_dir="$scsi_host_dir/$d" + echo $d | egrep -q -e '^host[0-9]+$' && break +done + +if [ $i = ${#dirs[*]} ] ; then + exit 0 +fi + +PCI_ID=`echo ${dirs[$(( $i - 1 ))]} | awk -F: '{print $2":"$3}'` + +# In sas_switch mode, the directory three levels beneath /sys/.../hostX +# contains symlinks to phy devices that reveal the switch port number. In +# sas_direct mode, the phy links one directory down reveal the HBA port. +port_dir=$scsi_host_dir +case $TOPOLOGY in + "sas_switch") j=$(($i+4)) ;; + "sas_direct") j=$(($i + 1)) ;; +esac +for (( i++; i<=$j; i++ )); do + port_dir="$port_dir/${dirs[$i]}" +done + +PHY=`ls -d $port_dir/phy* 2>/dev/null | head -1 | awk -F: '{print $NF}'` +if [ -z "$PHY" ] ; then + exit 0 +fi +PORT=$(( $PHY / $PHYS_PER_PORT )) + +# Look in /sys/.../sas_device/end_device-X for the bay_identifier +# attribute. +end_device_dir=$port_dir +for (( ; i<${#dirs[*]} ; i++ )); do + d=${dirs[$i]} + end_device_dir="$end_device_dir/$d" + if echo $d | egrep -q -e '^end_device' ; then + end_device_dir="$end_device_dir/sas_device/$d" + break + fi +done + +SLOT=`cat $end_device_dir/bay_identifier 2>/dev/null` +if [ -z "$SLOT" ] ; then + exit 0 +fi + +SLOT=`map_slot $SLOT` +CHAN=`map_channel $PCI_ID $PORT` +if [ -z "$CHAN" ] ; then + exit 0 +fi +ID_VDEV=${CHAN}${SLOT}${PART} + +echo "ID_VDEV=${ID_VDEV}" +echo "ID_VDEV_PATH=disk/by-vdev/${ID_VDEV}" diff --git a/cmd/zpool/zpool_vdev.c b/cmd/zpool/zpool_vdev.c index a65847038b..8c4fadebd1 100644 --- a/cmd/zpool/zpool_vdev.c +++ b/cmd/zpool/zpool_vdev.c @@ -367,9 +367,9 @@ is_whole_disk(const char *path) /* * This may be a shorthand device path or it could be total gibberish. * Check to see if it's a known device in /dev/, /dev/disk/by-id, - * /dev/disk/by-label, /dev/disk/by-path, /dev/disk/by-uuid, or - * /dev/disk/zpool/. As part of this check, see if we've been given - * an entire disk (minus the slice number). + * /dev/disk/by-label, /dev/disk/by-path, /dev/disk/by-uuid, + * /dev/disk/by-vdev, or /dev/disk/zpool/. As part of this check, see + * if we've been given an entire disk (minus the slice number). */ static int is_shorthand_path(const char *arg, char *path, diff --git a/configure b/configure index 6b198f873e..9bcc551f46 100755 --- a/configure +++ b/configure @@ -24325,7 +24325,7 @@ $as_echo_n "checking whether dmu tx validation is enabled... " >&6; } $as_echo "$enable_debug_dmu_tx" >&6; } -ac_config_files="$ac_config_files Makefile dracut/Makefile dracut/90zfs/Makefile udev/Makefile udev/rules.d/Makefile etc/Makefile etc/init.d/Makefile etc/zfs/Makefile man/Makefile man/man8/Makefile lib/Makefile lib/libspl/Makefile lib/libspl/asm-generic/Makefile lib/libspl/asm-i386/Makefile lib/libspl/asm-x86_64/Makefile lib/libspl/include/Makefile lib/libspl/include/ia32/Makefile lib/libspl/include/ia32/sys/Makefile lib/libspl/include/rpc/Makefile lib/libspl/include/sys/Makefile lib/libspl/include/sys/sysevent/Makefile lib/libspl/include/sys/dktp/Makefile lib/libspl/include/util/Makefile lib/libavl/Makefile lib/libefi/Makefile lib/libnvpair/Makefile lib/libunicode/Makefile lib/libuutil/Makefile lib/libzpool/Makefile lib/libzfs/Makefile lib/libshare/Makefile cmd/Makefile cmd/zdb/Makefile cmd/zfs/Makefile cmd/zinject/Makefile cmd/zpool/Makefile cmd/ztest/Makefile cmd/zpios/Makefile cmd/mount_zfs/Makefile cmd/zpool_layout/Makefile cmd/zvol_id/Makefile cmd/zpool_id/Makefile cmd/sas_switch_id/Makefile module/Makefile module/avl/Makefile module/nvpair/Makefile module/unicode/Makefile module/zcommon/Makefile module/zfs/Makefile module/zpios/Makefile include/Makefile include/linux/Makefile include/sys/Makefile include/sys/fs/Makefile include/sys/fm/Makefile include/sys/fm/fs/Makefile scripts/Makefile scripts/zpios-profile/Makefile scripts/zpios-test/Makefile scripts/zpool-config/Makefile scripts/zpool-layout/Makefile scripts/common.sh zfs.spec zfs-modules.spec PKGBUILD-zfs PKGBUILD-zfs-modules zfs-script-config.sh" +ac_config_files="$ac_config_files Makefile dracut/Makefile dracut/90zfs/Makefile udev/Makefile udev/rules.d/Makefile etc/Makefile etc/init.d/Makefile etc/zfs/Makefile man/Makefile man/man5/Makefile man/man8/Makefile lib/Makefile lib/libspl/Makefile lib/libspl/asm-generic/Makefile lib/libspl/asm-i386/Makefile lib/libspl/asm-x86_64/Makefile lib/libspl/include/Makefile lib/libspl/include/ia32/Makefile lib/libspl/include/ia32/sys/Makefile lib/libspl/include/rpc/Makefile lib/libspl/include/sys/Makefile lib/libspl/include/sys/sysevent/Makefile lib/libspl/include/sys/dktp/Makefile lib/libspl/include/util/Makefile lib/libavl/Makefile lib/libefi/Makefile lib/libnvpair/Makefile lib/libunicode/Makefile lib/libuutil/Makefile lib/libzpool/Makefile lib/libzfs/Makefile lib/libshare/Makefile cmd/Makefile cmd/zdb/Makefile cmd/zfs/Makefile cmd/zinject/Makefile cmd/zpool/Makefile cmd/ztest/Makefile cmd/zpios/Makefile cmd/mount_zfs/Makefile cmd/zpool_layout/Makefile cmd/zvol_id/Makefile cmd/zpool_id/Makefile cmd/vdev_id/Makefile module/Makefile module/avl/Makefile module/nvpair/Makefile module/unicode/Makefile module/zcommon/Makefile module/zfs/Makefile module/zpios/Makefile include/Makefile include/linux/Makefile include/sys/Makefile include/sys/fs/Makefile include/sys/fm/Makefile include/sys/fm/fs/Makefile scripts/Makefile scripts/zpios-profile/Makefile scripts/zpios-test/Makefile scripts/zpool-config/Makefile scripts/zpool-layout/Makefile scripts/common.sh zfs.spec zfs-modules.spec PKGBUILD-zfs PKGBUILD-zfs-modules zfs-script-config.sh" cat >confcache <<\_ACEOF @@ -25250,6 +25250,7 @@ do "etc/init.d/Makefile") CONFIG_FILES="$CONFIG_FILES etc/init.d/Makefile" ;; "etc/zfs/Makefile") CONFIG_FILES="$CONFIG_FILES etc/zfs/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; + "man/man5/Makefile") CONFIG_FILES="$CONFIG_FILES man/man5/Makefile" ;; "man/man8/Makefile") CONFIG_FILES="$CONFIG_FILES man/man8/Makefile" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "lib/libspl/Makefile") CONFIG_FILES="$CONFIG_FILES lib/libspl/Makefile" ;; @@ -25283,7 +25284,7 @@ do "cmd/zpool_layout/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/zpool_layout/Makefile" ;; "cmd/zvol_id/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/zvol_id/Makefile" ;; "cmd/zpool_id/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/zpool_id/Makefile" ;; - "cmd/sas_switch_id/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/sas_switch_id/Makefile" ;; + "cmd/vdev_id/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/vdev_id/Makefile" ;; "module/Makefile") CONFIG_FILES="$CONFIG_FILES module/Makefile" ;; "module/avl/Makefile") CONFIG_FILES="$CONFIG_FILES module/avl/Makefile" ;; "module/nvpair/Makefile") CONFIG_FILES="$CONFIG_FILES module/nvpair/Makefile" ;; diff --git a/configure.ac b/configure.ac index e0cb5a52dc..d693f67e84 100644 --- a/configure.ac +++ b/configure.ac @@ -64,6 +64,7 @@ AC_CONFIG_FILES([ etc/init.d/Makefile etc/zfs/Makefile man/Makefile + man/man5/Makefile man/man8/Makefile lib/Makefile lib/libspl/Makefile @@ -97,7 +98,7 @@ AC_CONFIG_FILES([ cmd/zpool_layout/Makefile cmd/zvol_id/Makefile cmd/zpool_id/Makefile - cmd/sas_switch_id/Makefile + cmd/vdev_id/Makefile module/Makefile module/avl/Makefile module/nvpair/Makefile diff --git a/etc/zfs/Makefile.am b/etc/zfs/Makefile.am index 027c397e42..b1a1cf43cc 100644 --- a/etc/zfs/Makefile.am +++ b/etc/zfs/Makefile.am @@ -1,6 +1,9 @@ pkgsysconfdir = $(sysconfdir)/zfs pkgsysconf_DATA = \ + vdev_id.conf.sas_direct.example \ + vdev_id.conf.sas_switch.example \ + vdev_id.conf.multipath.example \ zdev.conf \ zdev.conf.supermicro.example \ zdev.conf.dragon.example \ diff --git a/etc/zfs/Makefile.in b/etc/zfs/Makefile.in index 1d223d8854..f2aef91c34 100644 --- a/etc/zfs/Makefile.in +++ b/etc/zfs/Makefile.in @@ -314,6 +314,9 @@ udevdir = @udevdir@ udevruledir = @udevruledir@ pkgsysconfdir = $(sysconfdir)/zfs pkgsysconf_DATA = \ + vdev_id.conf.sas_direct.example \ + vdev_id.conf.sas_switch.example \ + vdev_id.conf.multipath.example \ zdev.conf \ zdev.conf.supermicro.example \ zdev.conf.dragon.example \ diff --git a/etc/zfs/vdev_id.conf.multipath.example b/etc/zfs/vdev_id.conf.multipath.example new file mode 100644 index 0000000000..c1359d37d5 --- /dev/null +++ b/etc/zfs/vdev_id.conf.multipath.example @@ -0,0 +1,7 @@ +multipath yes + +# PCI_ID HBA PORT CHANNEL NAME +channel 85:00.0 1 A +channel 85:00.0 0 B +channel 86:00.0 1 A +channel 86:00.0 0 B diff --git a/etc/zfs/vdev_id.conf.sas_direct.example b/etc/zfs/vdev_id.conf.sas_direct.example new file mode 100644 index 0000000000..a0c43a78c3 --- /dev/null +++ b/etc/zfs/vdev_id.conf.sas_direct.example @@ -0,0 +1,22 @@ +multipath no +topology sas_direct +phys_per_port 4 + +# PCI_ID HBA PORT CHANNEL NAME +channel 85:00.0 1 A +channel 85:00.0 0 B +channel 86:00.0 1 C +channel 86:00.0 0 D + +# Linux Mapped +# Slot Slot +slot 1 7 +slot 2 10 +slot 3 3 +slot 4 6 +slot 5 2 +slot 6 8 +slot 7 1 +slot 8 4 +slot 9 9 +slot 10 5 diff --git a/etc/zfs/vdev_id.conf.sas_switch.example b/etc/zfs/vdev_id.conf.sas_switch.example new file mode 100644 index 0000000000..b87d655274 --- /dev/null +++ b/etc/zfs/vdev_id.conf.sas_switch.example @@ -0,0 +1,7 @@ +topology sas_switch + +# SWITCH PORT CHANNEL NAME +channel 1 A +channel 2 B +channel 3 C +channel 4 D diff --git a/lib/libzfs/libzfs_util.c b/lib/libzfs/libzfs_util.c index 5f6763c490..3983f5c010 100644 --- a/lib/libzfs/libzfs_util.c +++ b/lib/libzfs/libzfs_util.c @@ -821,11 +821,12 @@ int zfs_resolve_shortname(const char *name, char *path, size_t pathlen) { int i, err; - char dirs[5][9] = {"by-id", "by-label", "by-path", "by-uuid", "zpool"}; + char dirs[6][9] = {"by-id", "by-label", "by-path", "by-uuid", "zpool", + "by-vdev"}; (void) snprintf(path, pathlen, "%s/%s", DISK_ROOT, name); err = access(path, F_OK); - for (i = 0; i < 5 && err < 0; i++) { + for (i = 0; i < 6 && err < 0; i++) { (void) snprintf(path, pathlen, "%s/%s/%s", UDISK_ROOT, dirs[i], name); err = access(path, F_OK); diff --git a/man/Makefile.am b/man/Makefile.am index 1602da1071..0ccc5b4916 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -1 +1 @@ -SUBDIRS = man8 +SUBDIRS = man5 man8 diff --git a/man/Makefile.in b/man/Makefile.in index 6013612494..bd23249e6c 100644 --- a/man/Makefile.in +++ b/man/Makefile.in @@ -328,7 +328,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ udevdir = @udevdir@ udevruledir = @udevruledir@ -SUBDIRS = man8 +SUBDIRS = man5 man8 all: all-recursive .SUFFIXES: diff --git a/man/man5/Makefile.am b/man/man5/Makefile.am new file mode 100644 index 0000000000..9bb25fd238 --- /dev/null +++ b/man/man5/Makefile.am @@ -0,0 +1,5 @@ +man_MANS = vdev_id.conf.5 +EXTRA_DIST = $(man_MANS) + +install-data-local: + $(INSTALL) -d -m 0755 "$(DESTDIR)$(mandir)/man5" diff --git a/man/man5/Makefile.in b/man/man5/Makefile.in new file mode 100644 index 0000000000..2684134a16 --- /dev/null +++ b/man/man5/Makefile.in @@ -0,0 +1,565 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = man/man5 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = \ + $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \ + $(top_srcdir)/config/kernel-automount.m4 \ + $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \ + $(top_srcdir)/config/kernel-bdev-logical-size.m4 \ + $(top_srcdir)/config/kernel-bdi-setup-and-register.m4 \ + $(top_srcdir)/config/kernel-bdi.m4 \ + $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \ + $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \ + $(top_srcdir)/config/kernel-bio-failfast.m4 \ + $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \ + $(top_srcdir)/config/kernel-blk-end-request.m4 \ + $(top_srcdir)/config/kernel-blk-fetch-request.m4 \ + $(top_srcdir)/config/kernel-blk-queue-discard.m4 \ + $(top_srcdir)/config/kernel-blk-queue-flush.m4 \ + $(top_srcdir)/config/kernel-blk-queue-io-opt.m4 \ + $(top_srcdir)/config/kernel-blk-queue-max-hw-sectors.m4 \ + $(top_srcdir)/config/kernel-blk-queue-max-segments.m4 \ + $(top_srcdir)/config/kernel-blk-queue-nonrot.m4 \ + $(top_srcdir)/config/kernel-blk-queue-physical-block-size.m4 \ + $(top_srcdir)/config/kernel-blk-requeue-request.m4 \ + $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \ + $(top_srcdir)/config/kernel-blk-rq-pos.m4 \ + $(top_srcdir)/config/kernel-blk-rq-sectors.m4 \ + $(top_srcdir)/config/kernel-blkdev-get-by-path.m4 \ + $(top_srcdir)/config/kernel-check-disk-size-change.m4 \ + $(top_srcdir)/config/kernel-create-umode-t.m4 \ + $(top_srcdir)/config/kernel-d-obtain-alias.m4 \ + $(top_srcdir)/config/kernel-evict-inode.m4 \ + $(top_srcdir)/config/kernel-fallocate.m4 \ + $(top_srcdir)/config/kernel-fmode-t.m4 \ + $(top_srcdir)/config/kernel-fsync.m4 \ + $(top_srcdir)/config/kernel-get-disk-ro.m4 \ + $(top_srcdir)/config/kernel-insert-inode-locked.m4 \ + $(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \ + $(top_srcdir)/config/kernel-kobj-name-len.m4 \ + $(top_srcdir)/config/kernel-mount-nodev.m4 \ + $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ + $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-show-options.m4 \ + $(top_srcdir)/config/kernel-shrink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ + $(top_srcdir)/config/user-arch.m4 \ + $(top_srcdir)/config/user-frame-larger-than.m4 \ + $(top_srcdir)/config/user-ioctl.m4 \ + $(top_srcdir)/config/user-libblkid.m4 \ + $(top_srcdir)/config/user-libuuid.m4 \ + $(top_srcdir)/config/user-nptl_guard_within_stack.m4 \ + $(top_srcdir)/config/user-selinux.m4 \ + $(top_srcdir)/config/user-udev.m4 \ + $(top_srcdir)/config/user-zlib.m4 $(top_srcdir)/config/user.m4 \ + $(top_srcdir)/config/zfs-build.m4 \ + $(top_srcdir)/config/zfs-meta.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/zfs_config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man5dir = $(mandir)/man5 +am__installdirs = "$(DESTDIR)$(man5dir)" +NROFF = nroff +MANS = $(man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALIEN = @ALIEN@ +ALIEN_VERSION = @ALIEN_VERSION@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_CFLAGS = @DEBUG_CFLAGS@ +DEBUG_DMU_TX = @DEBUG_DMU_TX@ +DEBUG_STACKFLAGS = @DEBUG_STACKFLAGS@ +DEBUG_ZFS = @DEBUG_ZFS@ +DEFAULT_INIT_DIR = @DEFAULT_INIT_DIR@ +DEFAULT_INIT_SCRIPT = @DEFAULT_INIT_SCRIPT@ +DEFAULT_PACKAGE = @DEFAULT_PACKAGE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DPKG = @DPKG@ +DPKGBUILD = @DPKGBUILD@ +DPKGBUILD_VERSION = @DPKGBUILD_VERSION@ +DPKG_VERSION = @DPKG_VERSION@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRAME_LARGER_THAN = @FRAME_LARGER_THAN@ +GREP = @GREP@ +HAVE_ALIEN = @HAVE_ALIEN@ +HAVE_DPKG = @HAVE_DPKG@ +HAVE_DPKGBUILD = @HAVE_DPKGBUILD@ +HAVE_MAKEPKG = @HAVE_MAKEPKG@ +HAVE_PACMAN = @HAVE_PACMAN@ +HAVE_RPM = @HAVE_RPM@ +HAVE_RPMBUILD = @HAVE_RPMBUILD@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KERNELCPPFLAGS = @KERNELCPPFLAGS@ +KERNELMAKE_PARAMS = @KERNELMAKE_PARAMS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBBLKID = @LIBBLKID@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBSELINUX = @LIBSELINUX@ +LIBTOOL = @LIBTOOL@ +LIBUUID = @LIBUUID@ +LINUX = @LINUX@ +LINUX_OBJ = @LINUX_OBJ@ +LINUX_SYMBOLS = @LINUX_SYMBOLS@ +LINUX_VERSION = @LINUX_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MAKEPKG = @MAKEPKG@ +MAKEPKG_VERSION = @MAKEPKG_VERSION@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_UNUSED_BUT_SET_VARIABLE = @NO_UNUSED_BUT_SET_VARIABLE@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACMAN = @PACMAN@ +PACMAN_VERSION = @PACMAN_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +RPM = @RPM@ +RPMBUILD = @RPMBUILD@ +RPMBUILD_VERSION = @RPMBUILD_VERSION@ +RPM_VERSION = @RPM_VERSION@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SPL = @SPL@ +SPL_OBJ = @SPL_OBJ@ +SPL_SYMBOLS = @SPL_SYMBOLS@ +SPL_VERSION = @SPL_VERSION@ +STRIP = @STRIP@ +TARGET_ASM_DIR = @TARGET_ASM_DIR@ +VENDOR = @VENDOR@ +VERSION = @VERSION@ +ZFS_CONFIG = @ZFS_CONFIG@ +ZFS_META_ALIAS = @ZFS_META_ALIAS@ +ZFS_META_AUTHOR = @ZFS_META_AUTHOR@ +ZFS_META_DATA = @ZFS_META_DATA@ +ZFS_META_LICENSE = @ZFS_META_LICENSE@ +ZFS_META_LT_AGE = @ZFS_META_LT_AGE@ +ZFS_META_LT_CURRENT = @ZFS_META_LT_CURRENT@ +ZFS_META_LT_REVISION = @ZFS_META_LT_REVISION@ +ZFS_META_NAME = @ZFS_META_NAME@ +ZFS_META_RELEASE = @ZFS_META_RELEASE@ +ZFS_META_VERSION = @ZFS_META_VERSION@ +ZLIB = @ZLIB@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevdir = @udevdir@ +udevruledir = @udevruledir@ +man_MANS = vdev_id.conf.5 +EXTRA_DIST = $(man_MANS) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/man5/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu man/man5/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man5: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)" + @list=''; test -n "$(man5dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.5[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ + done; } + +uninstall-man5: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man5dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.5[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man5dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man5dir)" && rm -f $$files; } +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man5dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man5 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-man + +uninstall-man: uninstall-man5 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-local install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man5 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am uninstall uninstall-am uninstall-man uninstall-man5 + + +install-data-local: + $(INSTALL) -d -m 0755 "$(DESTDIR)$(mandir)/man5" + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/man/man5/vdev_id.conf.5 b/man/man5/vdev_id.conf.5 new file mode 100644 index 0000000000..e449360d1f --- /dev/null +++ b/man/man5/vdev_id.conf.5 @@ -0,0 +1,160 @@ +.TH vdev_id.conf 5 +.SH NAME +vdev_id.conf \- Configuration file for vdev_id +.SH DESCRIPTION +.I vdev_id.conf +is the configuration file for +.BR vdev_id (8). +It controls the default behavior of +.BR vdev_id (8) +while it is mapping a disk device name to an alias. +.PP +The +.I vdev_id.conf +file uses a simple format consisting of a keyword followed by one or +more values on a single line. Any line not beginning with a recognized +keyword is ignored. Comments may optionally begin with a hash +character. + +The following keywords and values are used. +.TP +\fIchannel\fR [pci_slot] +Maps a physical path to a channel name (typically representing a single +disk enclosure). + +\fIpci_slot\fR - specifies the PCI SLOT of the HBA +hosting the disk enclosure being mapped, as found in the output of +.BR lspci (8). +This argument is not used in sas_switch mode. + +\fIport\fR - specifies the numeric identifier of the HBA or SAS switch port +connected to the disk enclosure being mapped. + +\fIname\fR - specifies the name of the channel. + +.TP +\fIslot\fR +Maps a disk slot number as reported by the operating system +to an alternative slot number. +.TP +\fImultipath\fR +Specifies whether +.BR vdev_id (8) +will handle only dm-multipath devices. If set to "yes" then +.BR vdev_id (8) +will examine the first running component disk of a dm-multipath +device as listed by the +.BR multipath (8) +command to determine the physical path. +.TP +\fItopology\fR +Identifies a physical topology that governs how physical paths are +mapped to channels. + +\fIsas_direct\fR - in this mode a channel is uniquely identified by +a PCI slot and a HBA port number + +\fIsas_switch\fR - in this mode a channel is uniquely identified by +a SAS switch port number + +.TP +\fIphys_per_port\fR +Specifies the number of PHY devices are associated with a SAS HBA port or SAS +switch port. +.BR vdev_id (8) +internally uses this value to determine which HBA or switch port a +device is connected to. The default is 4. +.SH EXAMPLES +A non-multipath configuration with direct-attached SAS enclosures and an +arbitrary slot re-mapping. +.P + multipath no +.br + topology sas_direct +.br + phys_per_port 4 +.br + +.br + # PCI_SLOT HBA PORT CHANNEL NAME +.br + channel 85:00.0 1 A +.br + channel 85:00.0 0 B +.br + channel 86:00.0 1 C +.br + channel 86:00.0 0 D +.br + +.br + # Linux Mapped +.br + # Slot Slot +.br + slot 1 7 +.br + slot 2 10 +.br + slot 3 3 +.br + slot 4 6 +.br + slot 5 2 +.br + slot 6 8 +.br + slot 7 1 +.br + slot 8 4 +.br + slot 9 9 +.br + slot 10 5 +.br +.P +A SAS-switch topology. Note that the +.I channel +keyword takes only two arguments in this example. +.P + topology sas_switch +.br + +.br + # SWITCH PORT CHANNEL NAME +.br + channel 1 A +.br + channel 2 B +.br + channel 3 C +.br + channel 4 D +.br +.P +A multipath configuration. Note that channel names have multiple +definitions - one per physical path. +.P + multipath yes +.br + +.br + # PCI_SLOT HBA PORT CHANNEL NAME +.br + channel 85:00.0 1 A +.br + channel 85:00.0 0 B +.br + channel 86:00.0 1 A +.br + channel 86:00.0 0 B +.br +.P + +.SH FILES +.TP +.I /etc/zfs/vdev_id.conf +The configuration file for +.BR vdev_id (8). +.SH SEE ALSO +.BR vdev_id (8) diff --git a/man/man8/Makefile.am b/man/man8/Makefile.am index 8f0227f884..619d74fc34 100644 --- a/man/man8/Makefile.am +++ b/man/man8/Makefile.am @@ -1,4 +1,4 @@ -man_MANS = zdb.8 zfs.8 zpool.8 +man_MANS = vdev_id.8 zdb.8 zfs.8 zpool.8 EXTRA_DIST = $(man_MANS) install-data-local: diff --git a/man/man8/Makefile.in b/man/man8/Makefile.in index e50bb5a0ee..feac996752 100644 --- a/man/man8/Makefile.in +++ b/man/man8/Makefile.in @@ -313,7 +313,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ udevdir = @udevdir@ udevruledir = @udevruledir@ -man_MANS = zdb.8 zfs.8 zpool.8 +man_MANS = vdev_id.8 zdb.8 zfs.8 zpool.8 EXTRA_DIST = $(man_MANS) all: all-am diff --git a/man/man8/vdev_id.8 b/man/man8/vdev_id.8 new file mode 100644 index 0000000000..612a50bbec --- /dev/null +++ b/man/man8/vdev_id.8 @@ -0,0 +1,72 @@ +.TH vdev_id 8 +.SH NAME +vdev_id \- generate user-friendly names for JBOD disks +.SH SYNOPSIS +.LP +.nf +\fBvdev_id\fR <-d dev> [-c config_file] [-g sas_direct|sas_switch] + [-m] [-p phys_per_port] +\fBvdev_id\fR -h +.fi +.SH DESCRIPTION +The \fBvdev_id\fR command is a udev helper which parses the file +.BR /etc/zfs/vdev_id.conf (5) +to map a physical path in a storage topology to a channel name. The +channel name is combined with a disk enclosure slot number to create an +alias that reflects the physical location of the drive. This is +particularly helpful when it comes to tasks like replacing failed +drives. Slot numbers may also be re-mapped in case the default +numbering is unsatisfactory. The drive aliases will be created as +symbolic links in /dev/disk/by-vdev. + +The only currently supported topologies are sas_direct and +sas_switch. A multipath mode is supported in which dm-mpath +devices are handled by examining the first-listed running +component disk as reported by the +.BR multipath (8) +command. In multipath mode the configuration file should contain a +channel definition with the same name for each path to a given +enclosure. + +.SH OPTIONS +.TP +\fB\-c\fR +Specifies the path to an alternate configuration file. The default is +/etc/zfs/vdev_id.conf. +.TP +\fB\-d\fR +This is the only mandatory argument. Specifies the name of a device +in /dev, i.e. "sda". +.TP +\fB\-g\fR +Identifies a physical topology that governs how physical paths are +mapped to channels. + +\fIsas_direct\fR - in this mode a channel is uniquely identified by +a PCI slot and a HBA port number + +\fIsas_switch\fR - in this mode a channel is uniquely identified by +a SAS switch port number +.TP +\fB\-m\fR +Specifies that +.BR vdev_id (8) +will handle only dm-multipath devices. If set to "yes" then +.BR vdev_id (8) +will examine the first running component disk of a dm-multipath +device as listed by the +.BR multipath (8) +command to determine the physical path. +.TP +\fB\-p\fR +Specifies the number of PHY devices associated with a SAS HBA port or SAS +switch port. +.BR vdev_id (8) +internally uses this value to determine which HBA or switch port a +device is connected to. The default is 4. +.TP +\fB\-h\fR +Print a usage summary. +.SH SEE ALSO +.LP +\fBvdev_id.conf\fR(5) diff --git a/udev/rules.d/60-vdev.rules.in b/udev/rules.d/60-vdev.rules.in new file mode 100644 index 0000000000..a1885d9677 --- /dev/null +++ b/udev/rules.d/60-vdev.rules.in @@ -0,0 +1,9 @@ +# +# /lib/udev/rules.d/60-vdev.rules +# + +ENV{DEVTYPE}=="disk", IMPORT{program}="/lib/udev/vdev_id -d %k" + +KERNEL=="*[!0-9]", ENV{SUBSYSTEM}=="block", ENV{ID_VDEV}=="?*", SYMLINK+="$env{ID_VDEV_PATH}" +KERNEL=="*[0-9]", ENV{SUBSYSTEM}=="block", ENV{DEVTYPE}=="partition", ENV{ID_VDEV}=="?*", SYMLINK+="$env{ID_VDEV_PATH}-part%n" +KERNEL=="dm-[0-9]*", ENV{SUBSYSTEM}=="block", ENV{ID_VDEV}=="?*", SYMLINK+="$env{ID_VDEV_PATH}" diff --git a/udev/rules.d/Makefile.am b/udev/rules.d/Makefile.am index bb4eedfe9c..586d76a5e2 100644 --- a/udev/rules.d/Makefile.am +++ b/udev/rules.d/Makefile.am @@ -1,9 +1,11 @@ udevrule_DATA = \ + $(top_srcdir)/udev/rules.d/60-vdev.rules \ $(top_srcdir)/udev/rules.d/60-zpool.rules \ $(top_srcdir)/udev/rules.d/60-zvol.rules \ $(top_srcdir)/udev/rules.d/90-zfs.rules EXTRA_DIST = \ + $(top_srcdir)/udev/rules.d/60-vdev.rules.in \ $(top_srcdir)/udev/rules.d/60-zpool.rules.in \ $(top_srcdir)/udev/rules.d/60-zvol.rules.in \ $(top_srcdir)/udev/rules.d/90-zfs.rules.in diff --git a/udev/rules.d/Makefile.in b/udev/rules.d/Makefile.in index d016d16466..2f440e1264 100644 --- a/udev/rules.d/Makefile.in +++ b/udev/rules.d/Makefile.in @@ -313,11 +313,13 @@ top_srcdir = @top_srcdir@ udevdir = @udevdir@ udevruledir = @udevruledir@ udevrule_DATA = \ + $(top_srcdir)/udev/rules.d/60-vdev.rules \ $(top_srcdir)/udev/rules.d/60-zpool.rules \ $(top_srcdir)/udev/rules.d/60-zvol.rules \ $(top_srcdir)/udev/rules.d/90-zfs.rules EXTRA_DIST = \ + $(top_srcdir)/udev/rules.d/60-vdev.rules.in \ $(top_srcdir)/udev/rules.d/60-zpool.rules.in \ $(top_srcdir)/udev/rules.d/60-zvol.rules.in \ $(top_srcdir)/udev/rules.d/90-zfs.rules.in diff --git a/zfs.spec.in b/zfs.spec.in index 2bed540b0f..4b5b3ea71c 100644 --- a/zfs.spec.in +++ b/zfs.spec.in @@ -79,6 +79,7 @@ rm -rf $RPM_BUILD_ROOT %{_sbindir}/* %{_bindir}/* %{_libdir}/* +%{_mandir}/man5/* %{_mandir}/man8/* %{_sysconfdir}/init.d/* %{_sysconfdir}/zfs/*