<!DOCTYPE html>
<html lang="en" data-content_root="../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Target export device script — The Linux Kernel documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=3918102e" />
<script src="../_static/documentation_options.js?v=5929fcd5"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="NVMe Subsystem" href="../nvme/index.html" />
<link rel="prev" title="The TCM v4 fabric module script generator" href="tcm_mod_builder.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../index.html">
<img class="logo" src="../_static/logo.svg" alt="Logo of The Linux Kernel"/>
</a></p>
<h1 class="logo"><a href="../index.html">The Linux Kernel</a></h1>
<p class="blurb">6.18.50</p>
<search id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script>
<p>
<h3 class="kernel-toc-contents">Contents</h3>
<input type="checkbox" class="kernel-toc-toggle" id = "kernel-toc-toggle" checked>
<label class="kernel-toc-title" for="kernel-toc-toggle"></label>
<div class="kerneltoc" id="kerneltoc">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../process/development-process.html">Development process</a></li>
<li class="toctree-l1"><a class="reference internal" href="../process/submitting-patches.html">Submitting patches</a></li>
<li class="toctree-l1"><a class="reference internal" href="../process/code-of-conduct.html">Code of conduct</a></li>
<li class="toctree-l1"><a class="reference internal" href="../maintainer/index.html">Maintainer handbook</a></li>
<li class="toctree-l1"><a class="reference internal" href="../process/index.html">All development-process docs</a></li>
</ul>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../core-api/index.html">Core API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../driver-api/index.html">Driver APIs</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../subsystem-apis.html">Subsystems</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#core-subsystems">Core subsystems</a></li>
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#human-interfaces">Human interfaces</a></li>
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#networking-interfaces">Networking interfaces</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../subsystem-apis.html#storage-interfaces">Storage interfaces</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../filesystems/index.html">Filesystems in the Linux kernel</a></li>
<li class="toctree-l3"><a class="reference internal" href="../block/index.html">Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cdrom/index.html">CD-ROM</a></li>
<li class="toctree-l3"><a class="reference internal" href="../scsi/index.html">SCSI Subsystem</a></li>
<li class="toctree-l3 current"><a class="reference internal" href="index.html">TCM Virtual Device</a></li>
<li class="toctree-l3"><a class="reference internal" href="../nvme/index.html">NVMe Subsystem</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#other-subsystems">Other subsystems</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../locking/index.html">Locking</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../process/license-rules.html">Licensing rules</a></li>
<li class="toctree-l1"><a class="reference internal" href="../doc-guide/index.html">Writing documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dev-tools/index.html">Development tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dev-tools/testing-overview.html">Testing guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../kernel-hacking/index.html">Hacking guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../trace/index.html">Tracing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../fault-injection/index.html">Fault injection</a></li>
<li class="toctree-l1"><a class="reference internal" href="../livepatch/index.html">Livepatching</a></li>
<li class="toctree-l1"><a class="reference internal" href="../rust/index.html">Rust</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../admin-guide/index.html">Administration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../kbuild/index.html">Build system</a></li>
<li class="toctree-l1"><a class="reference internal" href="../admin-guide/reporting-issues.html">Reporting issues</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tools/index.html">Userspace tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="../userspace-api/index.html">Userspace API</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../firmware-guide/index.html">Firmware</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devicetree/index.html">Firmware and Devicetree</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../arch/index.html">CPU architectures</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../staging/index.html">Unsorted documentation</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../translations/index.html">Translations</a></li>
</ul>
</div>
<script type="text/javascript"> <!--
var sbar = document.getElementsByClassName("sphinxsidebar")[0];
let currents = document.getElementsByClassName("current")
if (currents.length) {
sbar.scrollTop = currents[currents.length - 1].offsetTop;
}
--> </script>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../_sources/target/scripts.rst.txt"
rel="nofollow">Show Source</a></li>
</ul>
</div>
</div>
</div>
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="target-export-device-script">
<h1>Target export device script<a class="headerlink" href="#target-export-device-script" title="Link to this heading">ΒΆ</a></h1>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span><span class="ch">#!/bin/sh</span>
<span class="c1">#</span>
<span class="c1"># This script illustrates the sequence of operations in configfs to</span>
<span class="c1"># create a very simple LIO iSCSI target with a file or block device</span>
<span class="c1"># backstore.</span>
<span class="c1">#</span>
<span class="c1"># (C) Copyright 2014 Christophe Vu-Brugier <cvubrugier@fastmail.fm></span>
<span class="c1">#</span>
print_usage<span class="o">()</span><span class="w"> </span><span class="o">{</span>
<span class="w"> </span>cat<span class="w"> </span><span class="s"><<EOF</span>
<span class="s">Usage: $(basename $0) [-p PORTAL] DEVICE|FILE</span>
<span class="s">Export a block device or a file as an iSCSI target with a single LUN</span>
<span class="s">EOF</span>
<span class="o">}</span>
die<span class="o">()</span><span class="w"> </span><span class="o">{</span>
<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="nv">$1</span>
<span class="w"> </span><span class="nb">exit</span><span class="w"> </span><span class="m">1</span>
<span class="o">}</span>
<span class="k">while</span><span class="w"> </span><span class="nb">getopts</span><span class="w"> </span><span class="s2">"hp:"</span><span class="w"> </span>arg<span class="p">;</span><span class="w"> </span><span class="k">do</span>
<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="nv">$arg</span><span class="w"> </span><span class="k">in</span>
<span class="w"> </span>h<span class="o">)</span><span class="w"> </span>print_usage<span class="p">;</span><span class="w"> </span><span class="nb">exit</span><span class="w"> </span><span class="m">0</span><span class="p">;;</span>
<span class="w"> </span>p<span class="o">)</span><span class="w"> </span><span class="nv">PORTAL</span><span class="o">=</span><span class="si">${</span><span class="nv">OPTARG</span><span class="si">}</span><span class="p">;;</span>
<span class="w"> </span><span class="k">esac</span>
<span class="k">done</span>
<span class="nb">shift</span><span class="w"> </span><span class="k">$((</span><span class="nv">$OPTIND</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="k">))</span>
<span class="nv">DEVICE</span><span class="o">=</span><span class="nv">$1</span>
<span class="o">[</span><span class="w"> </span>-n<span class="w"> </span><span class="s2">"</span><span class="nv">$DEVICE</span><span class="s2">"</span><span class="w"> </span><span class="o">]</span><span class="w"> </span><span class="o">||</span><span class="w"> </span>die<span class="w"> </span><span class="s2">"Missing device or file argument"</span>
<span class="o">[</span><span class="w"> </span>-b<span class="w"> </span><span class="nv">$DEVICE</span><span class="w"> </span>-o<span class="w"> </span>-f<span class="w"> </span><span class="nv">$DEVICE</span><span class="w"> </span><span class="o">]</span><span class="w"> </span><span class="o">||</span><span class="w"> </span>die<span class="w"> </span><span class="s2">"Invalid device or file: </span><span class="si">${</span><span class="nv">DEVICE</span><span class="si">}</span><span class="s2">"</span>
<span class="nv">IQN</span><span class="o">=</span><span class="s2">"iqn.2003-01.org.linux-iscsi.</span><span class="k">$(</span>hostname<span class="k">)</span><span class="s2">:</span><span class="k">$(</span>basename<span class="w"> </span><span class="nv">$DEVICE</span><span class="k">)</span><span class="s2">"</span>
<span class="o">[</span><span class="w"> </span>-n<span class="w"> </span><span class="s2">"</span><span class="nv">$PORTAL</span><span class="s2">"</span><span class="w"> </span><span class="o">]</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nv">PORTAL</span><span class="o">=</span><span class="s2">"0.0.0.0:3260"</span>
<span class="nv">CONFIGFS</span><span class="o">=</span>/sys/kernel/config
<span class="nv">CORE_DIR</span><span class="o">=</span><span class="nv">$CONFIGFS</span>/target/core
<span class="nv">ISCSI_DIR</span><span class="o">=</span><span class="nv">$CONFIGFS</span>/target/iscsi
<span class="c1"># Load the target modules and mount the config file system</span>
lsmod<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-q<span class="w"> </span>configfs<span class="w"> </span><span class="o">||</span><span class="w"> </span>modprobe<span class="w"> </span>configfs
lsmod<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-q<span class="w"> </span>target_core_mod<span class="w"> </span><span class="o">||</span><span class="w"> </span>modprobe<span class="w"> </span>target_core_mod
mount<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-q<span class="w"> </span>^configfs<span class="w"> </span><span class="o">||</span><span class="w"> </span>mount<span class="w"> </span>-t<span class="w"> </span>configfs<span class="w"> </span>none<span class="w"> </span><span class="nv">$CONFIGFS</span>
mkdir<span class="w"> </span>-p<span class="w"> </span><span class="nv">$ISCSI_DIR</span>
<span class="c1"># Create a backstore</span>
<span class="k">if</span><span class="w"> </span><span class="o">[</span><span class="w"> </span>-b<span class="w"> </span><span class="nv">$DEVICE</span><span class="w"> </span><span class="o">]</span><span class="p">;</span><span class="w"> </span><span class="k">then</span>
<span class="w"> </span><span class="nv">BACKSTORE_DIR</span><span class="o">=</span><span class="nv">$CORE_DIR</span>/iblock_0/data
<span class="w"> </span>mkdir<span class="w"> </span>-p<span class="w"> </span><span class="nv">$BACKSTORE_DIR</span>
<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"udev_path=</span><span class="si">${</span><span class="nv">DEVICE</span><span class="si">}</span><span class="s2">"</span><span class="w"> </span>><span class="w"> </span><span class="nv">$BACKSTORE_DIR</span>/control
<span class="k">else</span>
<span class="w"> </span><span class="nv">BACKSTORE_DIR</span><span class="o">=</span><span class="nv">$CORE_DIR</span>/fileio_0/data
<span class="w"> </span>mkdir<span class="w"> </span>-p<span class="w"> </span><span class="nv">$BACKSTORE_DIR</span>
<span class="w"> </span><span class="nv">DEVICE_SIZE</span><span class="o">=</span><span class="k">$(</span>du<span class="w"> </span>-b<span class="w"> </span><span class="nv">$DEVICE</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>cut<span class="w"> </span>-f1<span class="k">)</span>
<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"fd_dev_name=</span><span class="si">${</span><span class="nv">DEVICE</span><span class="si">}</span><span class="s2">"</span><span class="w"> </span>><span class="w"> </span><span class="nv">$BACKSTORE_DIR</span>/control
<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"fd_dev_size=</span><span class="si">${</span><span class="nv">DEVICE_SIZE</span><span class="si">}</span><span class="s2">"</span><span class="w"> </span>><span class="w"> </span><span class="nv">$BACKSTORE_DIR</span>/control
<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>><span class="w"> </span><span class="nv">$BACKSTORE_DIR</span>/attrib/emulate_write_cache
<span class="k">fi</span>
<span class="nb">echo</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>><span class="w"> </span><span class="nv">$BACKSTORE_DIR</span>/enable
<span class="c1"># Create an iSCSI target and a target portal group (TPG)</span>
mkdir<span class="w"> </span><span class="nv">$ISCSI_DIR</span>/<span class="nv">$IQN</span>
mkdir<span class="w"> </span><span class="nv">$ISCSI_DIR</span>/<span class="nv">$IQN</span>/tpgt_1/
<span class="c1"># Create a LUN</span>
mkdir<span class="w"> </span><span class="nv">$ISCSI_DIR</span>/<span class="nv">$IQN</span>/tpgt_1/lun/lun_0
ln<span class="w"> </span>-s<span class="w"> </span><span class="nv">$BACKSTORE_DIR</span><span class="w"> </span><span class="nv">$ISCSI_DIR</span>/<span class="nv">$IQN</span>/tpgt_1/lun/lun_0/data
<span class="nb">echo</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>><span class="w"> </span><span class="nv">$ISCSI_DIR</span>/<span class="nv">$IQN</span>/tpgt_1/enable
<span class="c1"># Create a network portal</span>
mkdir<span class="w"> </span><span class="nv">$ISCSI_DIR</span>/<span class="nv">$IQN</span>/tpgt_1/np/<span class="nv">$PORTAL</span>
<span class="c1"># Disable authentication</span>
<span class="nb">echo</span><span class="w"> </span><span class="m">0</span><span class="w"> </span>><span class="w"> </span><span class="nv">$ISCSI_DIR</span>/<span class="nv">$IQN</span>/tpgt_1/attrib/authentication
<span class="nb">echo</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>><span class="w"> </span><span class="nv">$ISCSI_DIR</span>/<span class="nv">$IQN</span>/tpgt_1/attrib/generate_node_acls
<span class="c1"># Allow write access for non authenticated initiators</span>
<span class="nb">echo</span><span class="w"> </span><span class="m">0</span><span class="w"> </span>><span class="w"> </span><span class="nv">$ISCSI_DIR</span>/<span class="nv">$IQN</span>/tpgt_1/attrib/demo_mode_write_protect
<span class="nb">echo</span><span class="w"> </span><span class="s2">"Target </span><span class="si">${</span><span class="nv">IQN</span><span class="si">}</span><span class="s2">, portal </span><span class="si">${</span><span class="nv">PORTAL</span><span class="si">}</span><span class="s2"> has been created"</span>
</pre></div>
</div>
</section>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
©The kernel development community.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
& <a href="https://alabaster.readthedocs.io">Alabaster 0.7.16</a>
|
<a href="../_sources/target/scripts.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>