{"id":34243578,"url":"https://github.com/opensvc/multipath-tools","last_synced_at":"2026-02-02T16:14:20.853Z","repository":{"id":38081272,"uuid":"311287602","full_name":"opensvc/multipath-tools","owner":"opensvc","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-20T14:33:06.000Z","size":5136,"stargazers_count":67,"open_issues_count":8,"forks_count":54,"subscribers_count":17,"default_branch":"master","last_synced_at":"2026-01-22T16:41:59.724Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/opensvc.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS.md","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-11-09T09:32:07.000Z","updated_at":"2026-01-22T14:03:05.000Z","dependencies_parsed_at":"2025-10-27T19:17:17.763Z","dependency_job_id":"abc65d20-88a7-4761-95e2-0243ff704fd6","html_url":"https://github.com/opensvc/multipath-tools","commit_stats":null,"previous_names":[],"tags_count":56,"template":false,"template_full_name":null,"purl":"pkg:github/opensvc/multipath-tools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensvc%2Fmultipath-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensvc%2Fmultipath-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensvc%2Fmultipath-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensvc%2Fmultipath-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/opensvc","download_url":"https://codeload.github.com/opensvc/multipath-tools/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensvc%2Fmultipath-tools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28784093,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T13:55:28.044Z","status":"ssl_error","status_checked_at":"2026-01-26T13:55:26.068Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-12-16T05:04:10.475Z","updated_at":"2026-01-26T18:08:49.508Z","avatar_url":"https://github.com/opensvc.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![basic-build-and-ci](https://github.com/openSUSE/multipath-tools/actions/workflows/build-and-unittest.yaml/badge.svg)](https://github.com/openSUSE/multipath-tools/actions/workflows/build-and-unittest.yaml) [![compile and unit test on native arch](https://github.com/openSUSE/multipath-tools/actions/workflows/native.yaml/badge.svg)](https://github.com/openSUSE/multipath-tools/actions/workflows/native.yaml) [![compile and unit test on foreign arch](https://github.com/openSUSE/multipath-tools/actions/workflows/foreign.yaml/badge.svg)](https://github.com/openSUSE/multipath-tools/actions/workflows/foreign.yaml)\n\nmultipath-tools for Linux\n=========================\n\nhttps://github.com/opensvc/multipath-tools\n\nThis package provides the following binaries to drive the Device Mapper multipathing driver:\n\n* multipath - Device mapper target autoconfig.\n* multipathc - Interactive client for multipathd.\n* multipathd - Multipath daemon.\n* mpathpersist - Manages SCSI persistent reservations on dm multipath devices.\n* kpartx - Create device maps from partition tables.\n\n\nCode Repository, Branches, and Maintenance\n==========================================\n\nThe code is maintained on GitHub in the\n[opensvc/multipath-tools](https://github.com/opensvc/multipath-tools)\nproject. The latest major release is always found in the `master` branch in\nthis project.\n\nStaging area\n------------\n\nBetween releases, the latest reviewed code can be obtained from\n[the queue branch](https://github.com/openSUSE/multipath-tools/tree/queue)\nin the openSUSE/multipath-tools repository on GitHub. From there,\npull requests for new releases in the master repository are\ncreated roughly every 3 months.\n\nStable branches\n---------------\n\nBeginning with 0.10, there will be stable branches `stable-0.x.y` on\nopensvc/multipath-tools. Small bug fixes with low regression risk from will be\ncherry-picked to these branches from the staging area. These branches are\nmaintained by the multipath-tools maintainers on a best-effort basis. From\ntime to time, minor releases will be made on these branches.\n\nReleases\n========\n\nThe project uses git tags like `0.10.0` for releases. It is not planned to use\nthe GitHub release mechanism.\n\nTo get a specific X.Y.Z release, use one of the following method:\n\n\nGit\n---\n\n    git clone https://github.com/opensvc/multipath-tools.git\n    cd multipath-tools\n    git tag\n    git archive --format=tar.gz --prefix=multipath-tools-X.Y.Z/ X.Y.Z \u003e ../multipath-tools-X.Y.Z.tar.gz\n\n\nDirect download\n---------------\n\n    wget \"https://github.com/opensvc/multipath-tools/archive/X.Y.Z.tar.gz\" -O multipath-tools-X.Y.Z.tar.gz\n\n\nBrowser\n-------\n\nGo to: https://github.com/opensvc/multipath-tools/tags\nSelect a release-tag and then click on \"zip\" or \"tar.gz\".\n\n\nBuilding multipath-tools\n========================\n\nPrerequisites: development packages of for `libdevmapper`, `libaio`, `libudev`,\n`libjson-c`, `liburcu`, and `libsystemd`. If commandline editing is enabled\n(see below), the development package for either `libedit` or `libreadline` is\nrequired as well.\n\nThen, build and install multipath-tools with:\n\n    make\n\tmake DESTDIR=\"/my/target/dir\" install\n\nTo uninstall, type:\n\n    make uninstall\n\nBy default, the build will run quietly, just printing one-line messages\nabout the files being built. To enable more verbose output, run `make V=1`.\n\nCustomizing the build\n---------------------\n\n**Note**: With very few exceptions, the build process does not read\nconfiguration from the environment. So using syntax like\n\n    SOME_VAR=some_value make\n\nwill **not** have the intended effect. Use the following instead:\n\n    make SOME_VAR=some_value\n\nSee \"Passing standard compiler flags\" below for an exception.\nThe following variables can be passed to the `make` command line:\n\n * `V=1`: enable verbose build.\n * `OPT=`: set optimization flags. You may want to set `OPT=\"-O0\"` for\n   debugging, for example. The default is `-O2`. Note that it is also\n   possible to set `OPTFLAGS`, which takes precedence over `OPT`. `OPTFLAGS`\n   sets additional options by default, which are intended for distribution\n   build environments to override. For quick customization of the optimization\n   level, use `OPT`.\n * `ASAN=1`: Enable\n   [AddressSanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer)\n   during build for debugging memory allocation. This is off by default.\n * `plugindir=\"/some/path\"`: directory where libmultipath plugins (path\n   checkers, prioritizers, and foreign multipath support) will be looked up.\n   This used to be the run-time option `multipath_dir` in earlier versions.\n   The default is `$(prefix)/$(LIB)/multipath`, where `$(LIB)` is `lib64` on\n   systems that have `/lib64`, and `lib` otherwise.\n * `configfile=\"/some/path`\": The path to the main configuration file.\n    The default is `$(etc_prefix)/etc/multipath.conf`.\n * `configdir=\"/some/path\"` : directory to search for additional configuration files.\n    This used to be the run-time option `config_dir` in earlier versions.\n\tThe default is `$(etc_prefix)/etc/multipath/conf.d`.\n * `statedir=\"/some/path\"`: The path of the directory where multipath-tools\n    stores run-time settings that need persist between reboots, such as known\n\tWWIDs, user-friendly names, and persistent reservation keys.\n\tThe default is `$(etc_prefix)/etc/multipath`.\n * `READLINE=libedit` or `READLINE=libreadline`: enable command line history\n    and TAB completion in the interactive mode *(which is entered with `multipathd -k` or `multipathc`)*.\n    The respective development package will be required for building.\n    By default, command line editing is disabled.\n    Note that using libreadline may\n    [make binary indistributable due to license incompatibility](https://github.com/opensvc/multipath-tools/issues/36).\n * `ENABLE_LIBDMMP=0`: disable building libdmmp\n * `ENABLE_DMEVENTS_POLL=0`: disable support for the device-mapper event\n   polling API. For use with pre-5.0 kernels that don't support dmevent polling\n   (but even if you don't use this option, multipath-tools will work with\n   these kernels).\n * `SYSTEMD`: The version number of systemd (e.g. \"244\") to compile the code for.\n   The default is autodetected, assuming that the systemd version in the build\n   environment is the same as on the target system. Override the value to\n   build for a different systemd version, or set it to `\"\"` to build for a\n   system without systemd.\n   **Caution:** multipathd without systemd has been largely untested by the\n   upstream maintainers since at least 2020.\n * `SCSI_DH_MODULES_PRELOAD=\"(list)\"`: specify a space-separated list of SCSI\n   device handler kernel modules to load early during boot. Some\n   multipath-tools functionality depends on these modules being loaded\n   early. This option causes a *modules-load.d(5)* configuration file to be\n   created, thus it depends on functionality provided by *systemd*.\n   This variable only matters for `make install`.\n   \n   **Note**: The usefulness of the preload list depends on the kernel configuration.\n   It's especially useful if `scsi_mod` is builtin but `scsi_dh_alua` and\n   other device handler modules are built as modules. If `scsi_mod` itself is compiled\n   as a module, it might make more sense to use a module softdep for the same\n   purpose by creating a `modprobe.d` file like this:\n       \n        softdep scsi_mod post: scsi_dh_alua scsi_dh_rdac\n\n### Installation Paths\n\n * `prefix`: The directory prefix for (almost) all files to be installed.\n   \"Usr-merged\" distributions[^systemd] may want to set this to `/usr`. The\n   default is empty (`\"\"`).\n * `usr_prefix`: where to install those parts of the code that aren't necessary\n   for booting. The default is `/usr` if `$(prefix)` is empty, and `$(prefix)` otherwise.\n * `systemd_prefix`: Prefix for systemd-related files[^systemd]. The default is `/usr`.\n * `etc_prefix`: The prefix for configuration files. \"usr-merged\"\n   distributions with immutable `/usr`[^systemd] may want to set this to\n   `\"\"`. The default is `$(prefix)`.\n * `LIB`: the subdirectory under `prefix` where shared libraries will be\n   installed. By default, the makefile uses `/lib64` if this directory is\n   found on the build system, and `/lib` otherwise.\n   \nThe options `configdir`, `plugindir`, `configfile`, and `statedir` above can\nbe used for setting individual paths where the `prefix` variables don't provide\nsufficient control. See `Makefile.inc` for even more fine-grained control.\n\n[^systemd]: systemd installations up to v254 which have been built with\n    `split-usr=true` may use separate `prefixdir` and `rootprefixdir`\n    directories, where `prefixdir` is a subdirectory of `rootprefixdir`.\n\tmultipath-tools' `systemd_prefix` corresponds to systemd's `prefixdir`.\n\tOn such distributions, override `unitdir` and `libudevdir` to use systemd's\n   `rootprefix`: `make libudevdir=/lib/udev unitdir=/lib/systemd/system`\n\n### prefix, DESTDIR and TGTDIR\n\n`prefix` and related variables are included in compiled-in paths like\n`plugindir` and are used by `make install`. Using `prefix` is useful if\nmultipath-tools is built locally on the same host where it's supposed to be\ninstalled.\n\nBy convention, the `DESTDIR` variable is prepended to all paths by `make\ninstall`, but not to any compiled-in paths.\nIt is useful if the software is built on one system (build host) but intended\nto be run on another system (installation host). This is typically used in build\nsystems like *rpmbuild* to set a root directory for all the installed\nfiles.\n\nOn the contrary, the `TGTDIR` variable is used for compiled-in paths only, and\nignored by `make install`. It is useful for running multipath-tools in a separate\nsubdirectory in the installation host, mostly for testing / development\npurposes.\n\nFor example,\n\n    make prefix=/opt DESTDIR=/build TGTDIR=/test install\n\nwill install plugins into `/build/opt/lib64/multipath` on the build\nhost. On the installation host, the plugins will be expected to be found under\n`/test/opt/lib64/multipath`. If the developer runs\n\n    rsync -a $BUILD_HOST:$DESTDIR/ $INSTALL_HOST:$TGTDIR/\n\t\nand adds `$TGTDIR/lib64` to `LD_LIBRARY_PATH` on the installation host, the\nmultipath binaries installed under `$TGTDIR` will find their plugins and\nconfiguration files in the expected compiled-in paths.\n\n### Compiler Options\n\nUse `OPTFLAGS` to change optimization-related compiler options;\ne.g. `OPTFLAGS=\"-g -O0\"` to disable all optimizations.\n\n### Passing standard compiler flags\n\nContrary to most other variables, the standard variables `CFLAGS`, \n`CPPFLAGS`, and `LDFLAGS` **must** be passed to **make** via the environment\nif they need to be customized:\n\n    CPPFLAGS=\"-D_SECRET_=secret\" make\n\nSpecial Makefile targets\n------------------------\n\nThe following targets are intended for developers only.\n\n * `make test` to build and run the unit tests\n * `make valgrind-test` to run the unit tests under valgrind\n * `make abi` to create an XML representation of the ABI of the libraries in\n   the `abi/` subdirectory\n * `make abi-test` to compare the ABI of a different multipath-tools version,\n   which must be stored in the `reference-abi/` subdirectory. If this test\n   fails, the ABI has changed wrt the reference.\n * `make compile-commands.json` to create input for [clangd](https://clangd.llvm.org/).\n\n\nContributing\n============\n\nPlease send patches or contributions for general discussion about\nmultipath tools to the mailing list (see below). You can also create\nissues or pull requests on\n[GitHub](https://github.com/opensvc/multipath-tools).\nYou will be asked to send your patches to the mailing list\nunless your patch is trivial.\n\nMailing list\n------------\n\nThe mailing list for multipath-tools is `dm-devel@lists.linux.dev`.\nTo subscribe, send an email to `dm-devel+subscribe@lists.linux.dev`.\nMailing list archives are available on\n[lore.kernel.org](https://lore.kernel.org/dm-devel/) and\n[marc.info](https://marc.info/?l=dm-devel). See also the\n[lists.linux.dev home page](https://subspace.kernel.org/lists.linux.dev.html).\n\nWhen sending patches to the mailing list, please add a `Signed-off-by:`\ntag, and add Benjamin Marzinski \u003cbmarzins@redhat.com\u003e and \nMartin Wilck \u003cmwilck@suse.com\u003e to the Cc list.\n\nAdding new storage devices\n--------------------------\n\nIf you want to add special settings for a storage device which is\nnew on the market, follow the instructions at the top of the\nfile `libmultipath/hwtable.c`.\n\nChangelog\n=========\n\n* Since multipath-tools 0.9.1, changs are tracked in [NEWS.md](NEWS.md).\n* post-0.4.5: https://github.com/opensvc/multipath-tools/commits/master\n* pre-0.4.5: https://web.archive.org/web/20070309224034/http://christophe.varoqui.free.fr/wiki/wakka.php?wiki=ChangeLog\n\nMaintainer\n==========\n\nChristophe Varoqui \u003cchristophe.varoqui@opensvc.com\u003e\nDevice-mapper development mailing list \u003cdm-devel@lists.linux.dev\u003e\n\n\nLicence\n=======\n\nThe multipath-tools source code is covered by several different licences.\nRefer to the individual source files for details.\nSource files which do not specify a licence are shipped under LGPL-2.0\n(see `LICENSES/LGPL-2.0`).\n\n\nALUA\n====\nThis is a rough guide, consult your storage device manufacturer documentation.\n\nALUA is supported in some devices, but usually it's disabled by default.\nTo enable ALUA, the following options should be changed:\n\n- EMC CLARiiON/VNX:\n   \"Failover Mode\" should be changed to \"4\" or \"Active-Active mode(ALUA)-failover mode 4\"\n\n- HPE 3PAR, Primera, and Alletra 9000:\n   \"Host:\" should be changed to \"Generic-ALUA Persona 2 (UARepLun, SESLun, ALUA)\".\n\n- Promise VTrak/Vess:\n   \"LUN Affinity\" and \"ALUA\" should be changed to \"Enable\", \"Redundancy Type\"\n   must be \"Active-Active\".\n\n- LSI/Engenio/NetApp RDAC class, as NetApp SANtricity E/EF Series and rebranded arrays:\n   \"Select operating system:\" should be changed to \"Linux DM-MP (Kernel 3.10 or later)\".\n\n- NetApp ONTAP FAS/AFF Series:\n   To check ALUA state: \"igroup show -v \u003cigroup_name\u003e\", and to enable ALUA:\n   \"igroup set \u003cigroup_name\u003e alua yes\".\n\n- Huawei OceanStor:\n   \"Host Access Mode\" should be changed to \"Asymmetric\".\n\n\nNVMe\n====\n\nUsing dm-multipath with NVMe\n----------------------------\n\nNVMe multipath is natively supported by the Linux kernel. If for some reason\nyou prefer using device mapper multipath with NVMe devices,\nyou need to disable native multipathing first:\n\n    echo \"options nvme_core multipath=N\" \u003e /etc/modprobe.d/01-nvme_core-mp.conf\n\nAfterwards, regenerate the initramfs (`dracut -f` or `update-initramfs`) and reboot.\n\nUsing multipath-tools with native NVMe multipath\n------------------------------------------------\n\nIf native NVMe multipathing is enabled, you can still use multipath-tools\nfor displaying the topology and some other information about native NVMe\nmultipath setups. This feature is disabled by default. To enable it, set\n`enable_foreign nvme` in the `defaults` section of `multipath.conf`.\nCommands like `multipath -ll` will then display information about NVMe\nnative multipath. This support is read-only; modifying the native multipath\nconfiguration is not supported.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopensvc%2Fmultipath-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopensvc%2Fmultipath-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopensvc%2Fmultipath-tools/lists"}