<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.bwhpc.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=M+Janczyk</id>
	<title>bwHPC Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.bwhpc.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=M+Janczyk"/>
	<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/e/Special:Contributions/M_Janczyk"/>
	<updated>2026-06-15T20:46:58Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Easybuild_Modules&amp;diff=16129</id>
		<title>NEMO2/Easybuild Modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Easybuild_Modules&amp;diff=16129"/>
		<updated>2026-06-11T14:43:03Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= EasyBuild on NEMO2 =&lt;br /&gt;
&lt;br /&gt;
EasyBuild is a software build and installation framework designed to manage scientific software on High-Performance Computing (HPC) systems. It automates the process of building and installing software, ensuring reproducibility and consistency across environments. EasyBuild uses &amp;quot;easyconfig&amp;quot; files (with &amp;lt;code&amp;gt;.eb&amp;lt;/code&amp;gt; extension) to define build parameters, dependencies, and configurations, simplifying the management of complex software stacks.&lt;br /&gt;
&lt;br /&gt;
NEMO2 uses EasyBuild exclusively to manage its software modules. All available software on NEMO2 is provided as EasyBuild modules.&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Building your own modules:&#039;&#039;&#039; [[NEMO2/Easybuild Modules/EB Build Module]] - Complete guide for the &amp;lt;code&amp;gt;eb-build-module.sh&amp;lt;/code&amp;gt; script&lt;br /&gt;
* &#039;&#039;&#039;Available modules:&#039;&#039;&#039; [https://www.nemo.uni-freiburg.de/easybuild-modules/ NEMO EasyBuild Modules List]&lt;br /&gt;
* &#039;&#039;&#039;EasyBuild official website:&#039;&#039;&#039; https://easybuild.io/&lt;br /&gt;
* &#039;&#039;&#039;EasyBuild documentation:&#039;&#039;&#039; https://docs.easybuild.io/&lt;br /&gt;
* &#039;&#039;&#039;EasyBuild GitHub:&#039;&#039;&#039; https://github.com/easybuilders/easybuild&lt;br /&gt;
&lt;br /&gt;
= Understanding Architectures on NEMO2 =&lt;br /&gt;
&lt;br /&gt;
NEMO2 has different CPU and GPU hardware architectures, and software modules are compiled specifically for each architecture to achieve optimal performance (see [[NEMO2/Hardware]] for hardware details).&lt;br /&gt;
&lt;br /&gt;
== Available Architecture Modules ==&lt;br /&gt;
&lt;br /&gt;
You can see all available architectures by running:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module avail arch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will show five architecture options:&lt;br /&gt;
* &amp;lt;code&amp;gt;arch/milan&amp;lt;/code&amp;gt; - AMD EPYC Milan CPUs&lt;br /&gt;
* &amp;lt;code&amp;gt;arch/genoa&amp;lt;/code&amp;gt; - AMD EPYC Genoa CPUs&lt;br /&gt;
* &amp;lt;code&amp;gt;arch/mi300a&amp;lt;/code&amp;gt; - AMD MI300A APU (Accelerated Processing Unit - combined CPU+GPU)&lt;br /&gt;
* &amp;lt;code&amp;gt;arch/l40s&amp;lt;/code&amp;gt; - NVIDIA L40S GPUs (Intel-based nodes)&lt;br /&gt;
* &amp;lt;code&amp;gt;arch/h200&amp;lt;/code&amp;gt; - NVIDIA H200 GPUs&lt;br /&gt;
&lt;br /&gt;
== Physical vs. Symbolic Architectures ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; While five architecture modules are available, there are only &#039;&#039;&#039;three physical architectures&#039;&#039;&#039; on NEMO2:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Architecture Module !! Physical Hardware !! Type !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;milan&amp;lt;/code&amp;gt; || AMD EPYC Milan CPUs || Physical || Separate installation directory&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;genoa&amp;lt;/code&amp;gt; || AMD EPYC Genoa CPUs || Physical || Separate installation directory&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mi300a&amp;lt;/code&amp;gt; || AMD MI300A APU (CPU+GPU) || &#039;&#039;&#039;Symbolic link → genoa&#039;&#039;&#039; || Uses genoa installation directory&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;l40s&amp;lt;/code&amp;gt; || Intel CPUs + NVIDIA L40S GPUs || Physical || Separate installation directory&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;h200&amp;lt;/code&amp;gt; || AMD Genoa CPUs + NVIDIA H200 GPUs || &#039;&#039;&#039;Symbolic link → genoa&#039;&#039;&#039; || Uses genoa installation directory&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What this means for system modules (&amp;lt;code&amp;gt;/opt/eb&amp;lt;/code&amp;gt;):&#039;&#039;&#039; The global NEMO2 modules use symbolic links, so modules for &amp;lt;code&amp;gt;mi300a&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;h200&amp;lt;/code&amp;gt; are actually stored in the &amp;lt;code&amp;gt;genoa&amp;lt;/code&amp;gt; directory. This is because these GPU nodes use AMD Genoa CPUs as their host processors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What this means for self-built modules:&#039;&#039;&#039; When you build your own modules with &amp;lt;code&amp;gt;eb-build-module.sh&amp;lt;/code&amp;gt;, each architecture gets its own separate directory by default:&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/milan/&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/genoa/&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/mi300a/&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/l40s/&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/h200/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional:&#039;&#039;&#039; You can manually create symbolic links (&amp;lt;code&amp;gt;mi300a → genoa&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;h200 → genoa&amp;lt;/code&amp;gt;) to mirror the global structure, but this is not required. See [[NEMO2/Easybuild_Modules/EB_Build_Module#Architecture_Support|Architecture Support]] for details.&lt;br /&gt;
&lt;br /&gt;
== Viewing Modules for Specific Architectures ==&lt;br /&gt;
&lt;br /&gt;
By default, the login nodes use Genoa CPUs and display only Genoa modules. To see modules for a different architecture:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Load a specific architecture&lt;br /&gt;
module load arch/milan&lt;br /&gt;
&lt;br /&gt;
# Now module avail will show milan modules&lt;br /&gt;
module avail&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;$MODULE_ARCH&amp;lt;/code&amp;gt; environment variable is automatically set when you load an architecture:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load arch/genoa&lt;br /&gt;
echo $MODULE_ARCH  # Output: genoa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Architecture Compatibility =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important for beginners:&#039;&#039;&#039; Different architectures may not be compatible with each other. Software compiled for one architecture may not work optimally (or at all) on another.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;General compatibility rules:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;milan → genoa:&#039;&#039;&#039; Software compiled for Milan will usually work on Genoa (but may not be optimally tuned)&lt;br /&gt;
* &#039;&#039;&#039;genoa → milan:&#039;&#039;&#039; Software compiled for Genoa may &#039;&#039;&#039;not&#039;&#039;&#039; work on Milan&lt;br /&gt;
* &#039;&#039;&#039;GPU architectures:&#039;&#039;&#039; Always use architecture-specific builds for GPU software&lt;br /&gt;
&lt;br /&gt;
When in doubt, build separate versions for each architecture you plan to use.&lt;br /&gt;
&lt;br /&gt;
= Building Your Own EasyBuild Modules =&lt;br /&gt;
&lt;br /&gt;
If you need software that is not yet available as a module on NEMO2, you can build your own EasyBuild modules. NEMO2 provides the &amp;lt;code&amp;gt;eb-build-module.sh&amp;lt;/code&amp;gt; script that makes this process straightforward.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For complete documentation, see:&#039;&#039;&#039; [[NEMO2/Easybuild_Modules/EB_Build_Module]]&lt;br /&gt;
&lt;br /&gt;
== Why Build Your Own Modules? ==&lt;br /&gt;
&lt;br /&gt;
* Software you need is not available in the system-wide modules&lt;br /&gt;
* You need a different version than what&#039;s provided&lt;br /&gt;
* You want to customize build options or dependencies&lt;br /&gt;
* You&#039;re testing software before requesting a system-wide installation&lt;br /&gt;
&lt;br /&gt;
== Quick Start Guide ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1:&#039;&#039;&#039; Search for available easyconfig files (these define how to build software):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
eb-build-module.sh -s Python&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2:&#039;&#039;&#039; Preview what will be built (dry-run - highly recommended for beginners):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
eb-build-module.sh -d -m Python-3.11.3-GCCcore-12.3.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This shows all dependencies that will be built without actually building anything.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 3:&#039;&#039;&#039; Build the module with default settings (20 cores, 12 hours, genoa architecture):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
eb-build-module.sh -m Python-3.11.3-GCCcore-12.3.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 4:&#039;&#039;&#039; Use your newly built module:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load arch/genoa  # If not already loaded&lt;br /&gt;
module avail python     # Your module will appear here (lowercase)&lt;br /&gt;
module load lang/python/3.11.3-gcccore-12.3.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Module names are lowercase due to NEMO2&#039;s naming scheme, even though you build with &amp;lt;code&amp;gt;Python-3.11.3-GCCcore-12.3.0.eb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Building for Different Architectures ==&lt;br /&gt;
&lt;br /&gt;
To build for a specific architecture (important if you&#039;ll run jobs on specific hardware):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# For Genoa CPUs&lt;br /&gt;
eb-build-module.sh -a genoa -m Python-3.11.3-GCCcore-12.3.0&lt;br /&gt;
&lt;br /&gt;
# For MI300A APUs (creates separate mi300a directory)&lt;br /&gt;
eb-build-module.sh -a mi300a -m PyTorch-2.1.2-foss-2023a&lt;br /&gt;
&lt;br /&gt;
# For L40S GPUs (Intel-based, uses CUDA)&lt;br /&gt;
eb-build-module.sh -a l40s -m CUDA-12.0.0&lt;br /&gt;
&lt;br /&gt;
# For H200 GPUs (creates separate h200 directory)&lt;br /&gt;
eb-build-module.sh -a h200 -m CUDA-12.0.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; If you plan to use software on multiple architectures, you need to build it separately for each one.&lt;br /&gt;
&lt;br /&gt;
== Key Script Features ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Architecture support:&#039;&#039;&#039; Automatically configures builds for milan, genoa, mi300a, l40s, or h200&lt;br /&gt;
* &#039;&#039;&#039;GPU detection:&#039;&#039;&#039; Allocates GPUs automatically when building GPU software&lt;br /&gt;
* &#039;&#039;&#039;Flexible options:&#039;&#039;&#039; Customize cores (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;), walltime (&amp;lt;code&amp;gt;-w&amp;lt;/code&amp;gt;), and installation prefix (&amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;Build modes:&#039;&#039;&#039; &lt;br /&gt;
** Standard build (default)&lt;br /&gt;
** Rebuild (&amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt;) - force rebuild even if already exists&lt;br /&gt;
** Module-only (&amp;lt;code&amp;gt;-o&amp;lt;/code&amp;gt;) - generate module file without building&lt;br /&gt;
** Dry-run (&amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt;) - preview without building&lt;br /&gt;
* &#039;&#039;&#039;Search function:&#039;&#039;&#039; Use &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; to find available easyconfig files&lt;br /&gt;
* &#039;&#039;&#039;Pass-through options:&#039;&#039;&#039; Use &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt; to pass additional EasyBuild options directly&lt;br /&gt;
&lt;br /&gt;
== Where Are Modules Installed? ==&lt;br /&gt;
&lt;br /&gt;
By default, modules are installed to:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/easybuild/&amp;lt;arch&amp;gt;/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example (each architecture gets its own directory):&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/milan/&amp;lt;/code&amp;gt; - Milan-specific modules&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/genoa/&amp;lt;/code&amp;gt; - Genoa-specific modules&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/mi300a/&amp;lt;/code&amp;gt; - MI300A-specific modules&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/l40s/&amp;lt;/code&amp;gt; - L40S-specific modules&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/h200/&amp;lt;/code&amp;gt; - H200-specific modules&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Unlike the global system modules (&amp;lt;code&amp;gt;/opt/eb&amp;lt;/code&amp;gt;), your self-built modules do &#039;&#039;&#039;not&#039;&#039;&#039; use symbolic links by default. Each architecture gets its own separate directory. You can manually create symlinks if desired to mirror the global structure.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module files location:&#039;&#039;&#039; The actual module files that you load with &amp;lt;code&amp;gt;module load&amp;lt;/code&amp;gt; are placed in:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/easybuild/modules/all/          # Architecture-independent modules&lt;br /&gt;
~/.local/easybuild/&amp;lt;arch&amp;gt;/modules/all/   # Architecture-specific modules&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example module paths:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/easybuild/modules/all/lang/python/3.11.3-gcccore-12.3.0.lua&lt;br /&gt;
~/.local/easybuild/genoa/modules/all/lang/python/3.11.3-gcccore-12.3.0.lua&lt;br /&gt;
~/.local/easybuild/mi300a/modules/all/ai/pytorch/2.1.2-foss-2023a.lua&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; On NEMO2, the module naming scheme converts all names to lowercase. While EasyBuild uses files like &amp;lt;code&amp;gt;Python-3.11.3-GCCcore-12.3.0.eb&amp;lt;/code&amp;gt;, the resulting modules are named in lowercase: &amp;lt;code&amp;gt;lang/python/3.11.3-gcccore-12.3.0&amp;lt;/code&amp;gt;. This applies to all modules including compilers (&amp;lt;code&amp;gt;compiler/gcc&amp;lt;/code&amp;gt;), libraries, etc.&lt;br /&gt;
&lt;br /&gt;
These paths are automatically added to your &amp;lt;code&amp;gt;MODULEPATH&amp;lt;/code&amp;gt; when you load an architecture with &amp;lt;code&amp;gt;module load arch/&amp;amp;lt;arch&amp;amp;gt;&amp;lt;/code&amp;gt;, making your custom modules visible with &amp;lt;code&amp;gt;module avail&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You can change the installation location with the &amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; option or by setting the &amp;lt;code&amp;gt;PREFIX&amp;lt;/code&amp;gt; environment variable.&lt;br /&gt;
&lt;br /&gt;
== Using Your Custom Modules ==&lt;br /&gt;
&lt;br /&gt;
After building, your modules are automatically available when you load the corresponding architecture:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Load the architecture you built for&lt;br /&gt;
module load arch/genoa&lt;br /&gt;
&lt;br /&gt;
# Your custom modules now appear alongside system modules&lt;br /&gt;
module avail&lt;br /&gt;
&lt;br /&gt;
# Load your custom module (remember: lowercase names)&lt;br /&gt;
module load category/softwarename/version-toolchain&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How it works:&#039;&#039;&#039; When you load &amp;lt;code&amp;gt;arch/genoa&amp;lt;/code&amp;gt;, the following paths are added to your &amp;lt;code&amp;gt;MODULEPATH&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/modules/all/&amp;lt;/code&amp;gt; - for architecture-independent modules&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.local/easybuild/genoa/modules/all/&amp;lt;/code&amp;gt; - for genoa-specific modules&lt;br /&gt;
&lt;br /&gt;
This makes your custom-built modules visible alongside system modules when you run &amp;lt;code&amp;gt;module avail&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Module names appear in lowercase (e.g., &amp;lt;code&amp;gt;lang/python/3.11.3-gcccore-12.3.0&amp;lt;/code&amp;gt;) due to NEMO2&#039;s naming scheme, even though the easyconfig files use capitalized names.&lt;br /&gt;
&lt;br /&gt;
== Common Build Options ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Build with more cores for faster compilation (large packages)&lt;br /&gt;
eb-build-module.sh -c 64 -w 24 -m GCC-13.2.0&lt;br /&gt;
&lt;br /&gt;
# Rebuild an existing module&lt;br /&gt;
eb-build-module.sh -r -m Python-3.11.3-GCCcore-12.3.0&lt;br /&gt;
&lt;br /&gt;
# Pass additional EasyBuild options&lt;br /&gt;
eb-build-module.sh -m Python-3.11.3-GCCcore-12.3.0 -- --force --debug&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Need Help? ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Full script documentation:&#039;&#039;&#039; [[NEMO2/Easybuild_Modules/EB_Build_Module]]&lt;br /&gt;
* &#039;&#039;&#039;Script options:&#039;&#039;&#039; [[NEMO2/Easybuild_Modules/EB_Build_Module#Options|Command-line options]]&lt;br /&gt;
* &#039;&#039;&#039;Examples:&#039;&#039;&#039; [[NEMO2/Easybuild_Modules/EB_Build_Module#Examples|Usage examples]]&lt;br /&gt;
* &#039;&#039;&#039;Troubleshooting:&#039;&#039;&#039; [[NEMO2/Easybuild_Modules/EB_Build_Module#Troubleshooting|Common issues and solutions]]&lt;br /&gt;
* &#039;&#039;&#039;EasyBuild documentation:&#039;&#039;&#039; https://docs.easybuild.io/&lt;br /&gt;
* &#039;&#039;&#039;Available easyconfigs:&#039;&#039;&#039; Use &amp;lt;code&amp;gt;eb-build-module.sh -s pattern&amp;lt;/code&amp;gt; to search&lt;br /&gt;
&lt;br /&gt;
= Compiling Your Own Software (Non-EasyBuild) =&lt;br /&gt;
&lt;br /&gt;
If you compile your own applications outside of EasyBuild (e.g., custom C/C++/Fortran code), you should create architecture-specific builds using the &amp;lt;code&amp;gt;$MODULE_ARCH&amp;lt;/code&amp;gt; environment variable.&lt;br /&gt;
&lt;br /&gt;
== Using $MODULE_ARCH in Your Workflows ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;$MODULE_ARCH&amp;lt;/code&amp;gt; variable is automatically set when you load an architecture module:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module load arch/milan&lt;br /&gt;
echo $MODULE_ARCH  # Output: milan&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use this in your directory structure:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Organize binaries by architecture&lt;br /&gt;
$HOME/software/$MODULE_ARCH/myapp/bin/myprogram&lt;br /&gt;
&lt;br /&gt;
# Example paths for different architectures:&lt;br /&gt;
# ~/.local/software/milan/myapp/bin/myprogram&lt;br /&gt;
# ~/.local/software/genoa/myapp/bin/myprogram&lt;br /&gt;
# ~/.local/software/l40s/myapp/bin/myprogram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling for Different Architectures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Compile for Milan&lt;br /&gt;
module load arch/milan&lt;br /&gt;
gcc -O3 -march=znver3 mycode.c -o $HOME/software/$MODULE_ARCH/bin/myprogram&lt;br /&gt;
&lt;br /&gt;
# Compile for Genoa&lt;br /&gt;
module load arch/genoa&lt;br /&gt;
gcc -O3 -march=znver4 mycode.c -o $HOME/software/$MODULE_ARCH/bin/myprogram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Cross-Architecture Binaries ==&lt;br /&gt;
&lt;br /&gt;
If you compile for one architecture but run on another, you must load the correct architecture module:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Request a Genoa node but run Milan-compiled code&lt;br /&gt;
salloc -n1 -p genoa&lt;br /&gt;
&lt;br /&gt;
# Load the architecture the code was compiled for&lt;br /&gt;
module load arch/milan&lt;br /&gt;
&lt;br /&gt;
# Now run your Milan-compiled binary on the Genoa node&lt;br /&gt;
$HOME/software/milan/myapp/bin/myprogram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warning:&#039;&#039;&#039; This should only be done when Milan code is compatible with Genoa. Genoa code will likely not work on Milan nodes.&lt;br /&gt;
&lt;br /&gt;
= Testing Modules and Software =&lt;br /&gt;
&lt;br /&gt;
== Interactive Testing ==&lt;br /&gt;
&lt;br /&gt;
You can test modules and software interactively using &amp;lt;code&amp;gt;srun&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;salloc&amp;lt;/code&amp;gt; (see [[NEMO2/Slurm#Interactive_Jobs|Interactive Jobs]] and [[NEMO2/Slurm#Partitions|Partitions]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Quick tests on login nodes (up to 15 minutes):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
srun -p login &amp;lt;command&amp;gt;&lt;br /&gt;
# or&lt;br /&gt;
salloc -p login&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Testing on specific architecture:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Interactive session on Milan partition&lt;br /&gt;
salloc -n1 -p milan&lt;br /&gt;
module load arch/milan&lt;br /&gt;
module load YourModule&lt;br /&gt;
&amp;lt;your-command&amp;gt;&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
# Interactive session with AMD MI300A APU&lt;br /&gt;
salloc -n1 -p mi300a --gres=gpu:1&lt;br /&gt;
module load arch/mi300a&lt;br /&gt;
module load system/rocm  # ROCm for AMD GPUs&lt;br /&gt;
&amp;lt;your-gpu-command&amp;gt;&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
# Interactive session with NVIDIA GPU (L40S example)&lt;br /&gt;
salloc -n1 -p l40s --gres=gpu:1&lt;br /&gt;
module load arch/l40s&lt;br /&gt;
module load system/cuda  # CUDA for NVIDIA GPUs&lt;br /&gt;
&amp;lt;your-gpu-command&amp;gt;&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; If you get MPI or memory errors, try using &amp;lt;code&amp;gt;srun&amp;lt;/code&amp;gt; to launch your program: &amp;lt;code&amp;gt;srun &amp;lt;program&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Working with Module Listings =&lt;br /&gt;
&lt;br /&gt;
== Viewing Available Modules ==&lt;br /&gt;
&lt;br /&gt;
Basic module commands:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# List all available modules&lt;br /&gt;
module avail&lt;br /&gt;
&lt;br /&gt;
# List modules for a specific category&lt;br /&gt;
module avail compiler&lt;br /&gt;
module avail math&lt;br /&gt;
module avail chem&lt;br /&gt;
&lt;br /&gt;
# Search for a specific module&lt;br /&gt;
module avail python&lt;br /&gt;
module avail gcc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing Long Module Lists ==&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;module avail&amp;lt;/code&amp;gt; produces a very long list, use these techniques:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Get an overview:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module overview&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This shows a condensed summary of available modules.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Filter by category or name:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
module avail compiler   # Show only compiler modules&lt;br /&gt;
module avail llvm       # Show only LLVM-related modules&lt;br /&gt;
module avail python     # Show only Python-related modules&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Hide module extensions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Many modules have extensions (additional packages/libraries). To hide these:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Hide extensions for one command&lt;br /&gt;
module --nx avail&lt;br /&gt;
# or&lt;br /&gt;
module --no_extensions avail&lt;br /&gt;
&lt;br /&gt;
# Hide extensions permanently&lt;br /&gt;
export LMOD_AVAIL_EXTENSIONS=no&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the export command to your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; to make it permanent.&lt;br /&gt;
&lt;br /&gt;
== Understanding Module Names ==&lt;br /&gt;
&lt;br /&gt;
EasyBuild module names on NEMO2 follow a specific format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
category/softwarename/version-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All components are lowercase due to NEMO2&#039;s naming scheme.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;lang/python/3.11.3-gcccore-12.3.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Category:&#039;&#039;&#039; lang (programming language)&lt;br /&gt;
* &#039;&#039;&#039;Software:&#039;&#039;&#039; python (lowercase)&lt;br /&gt;
* &#039;&#039;&#039;Version:&#039;&#039;&#039; 3.11.3&lt;br /&gt;
* &#039;&#039;&#039;Toolchain:&#039;&#039;&#039; gcccore-12.3.0 (the compiler/libraries used to build it, also lowercase)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; When building, you use the EasyBuild file with capitalized names (e.g., &amp;lt;code&amp;gt;Python-3.11.3-GCCcore-12.3.0.eb&amp;lt;/code&amp;gt;), but the resulting module will be in lowercase (e.g., &amp;lt;code&amp;gt;lang/python/3.11.3-gcccore-12.3.0&amp;lt;/code&amp;gt;). This applies to all parts: software names (python, not Python), toolchain components (gcccore, not GCCcore), and everything else.&lt;br /&gt;
&lt;br /&gt;
Common categories include:&lt;br /&gt;
* &amp;lt;code&amp;gt;lang/&amp;lt;/code&amp;gt; - Programming languages (python, r, julia, etc.)&lt;br /&gt;
* &amp;lt;code&amp;gt;compiler/&amp;lt;/code&amp;gt; - Compilers (gcc, intel, llvm, etc.)&lt;br /&gt;
* &amp;lt;code&amp;gt;system/&amp;lt;/code&amp;gt; - System software (cuda, mpi, etc.)&lt;br /&gt;
* &amp;lt;code&amp;gt;bio/&amp;lt;/code&amp;gt; - Biology/Bioinformatics software&lt;br /&gt;
* &amp;lt;code&amp;gt;chem/&amp;lt;/code&amp;gt; - Chemistry software&lt;br /&gt;
* &amp;lt;code&amp;gt;math/&amp;lt;/code&amp;gt; - Mathematical software&lt;br /&gt;
* &amp;lt;code&amp;gt;ai/&amp;lt;/code&amp;gt; - Artificial Intelligence/Machine Learning&lt;br /&gt;
* &amp;lt;code&amp;gt;lib/&amp;lt;/code&amp;gt; - Libraries&lt;br /&gt;
* &amp;lt;code&amp;gt;devel/&amp;lt;/code&amp;gt; - Development tools&lt;br /&gt;
&lt;br /&gt;
When building your own modules, use the same naming convention for consistency.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Registration/bwForCluster/RV&amp;diff=16125</id>
		<title>Registration/bwForCluster/RV</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Registration/bwForCluster/RV&amp;diff=16125"/>
		<updated>2026-06-03T15:56:17Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Become Coworker of an RV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=  Step B: Apply for a Rechenvorhaben/Project =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rechenvorhaben/Projects (RV)&#039;&#039;&#039; are required for assignment to a bwForCluster.&lt;br /&gt;
[[File:RV-my.png|right|frame|My RVs.]]&lt;br /&gt;
&lt;br /&gt;
To get access to an RV, answer the following question: &lt;br /&gt;
* Does your work group (or the collaborative project that you are part of) already have an RV?&lt;br /&gt;
** &#039;&#039;&#039;Yes &amp;amp;rarr; [[#Become_Coworker_of_an_RV|Become Coworker of an RV]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;No &amp;amp;rarr; [[#Register_a_new_RV|Register a new RV]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can see your RV memberships at the central application site ZAS under [https://zas.bwhpc.de/shib/en/info_rv.php &#039;&#039;&#039;My RVs&#039;&#039;&#039;].&lt;br /&gt;
&lt;br /&gt;
== Become Coworker of an RV ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #28a745; padding: 15px; background-color: #d4edda; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
You can only sign up for an RV once.&lt;br /&gt;
If you are an inactive member of an RV, either because you de-registered yourself or a manager deactivated you, only an RV manager can reactivate you.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;RV responsible&amp;quot; will provide you with the following data on the RV:&lt;br /&gt;
* RV acronym&lt;br /&gt;
* RV password&lt;br /&gt;
&lt;br /&gt;
If this information is lost, please let the &amp;quot;RV responsible&amp;quot; [[Registration/bwForCluster/RV/Management#Renew_RV_Password|renew the password]] for the RV.&lt;br /&gt;
&lt;br /&gt;
To become coworker of an RV, follow these steps:&lt;br /&gt;
# Please visit the [https://zas.bwhpc.de/shib/en/bwforcluster_collaboration.php &#039;&#039;&#039;RV collaboration&#039;&#039;&#039;] web form at the [https://zas.bwhpc.de ZAS].&lt;br /&gt;
# Select your home organization from the list on the main page and click &#039;&#039;&#039;Proceed&#039;&#039;&#039; or &#039;&#039;&#039;Fortfahren&#039;&#039;&#039;.&lt;br /&gt;
# You will be directed to the &#039;&#039;Identity Provider&#039;&#039; of your home organization. Enter the username and password of your &#039;&#039;&#039;home organization&#039;&#039;&#039; (usually these credentials are also used for other services like email) and click &#039;&#039;&#039;Login/Einloggen&#039;&#039;&#039;.&lt;br /&gt;
# You will be redirected back to the RV collaboration form &#039;&#039;&#039;https://zas.bwhpc.de/shib/en/bwforcluster_collaboration.php&#039;&#039;&#039;.&lt;br /&gt;
# Enter &#039;&#039;&#039;RV Acronym&#039;&#039;&#039;, &#039;&#039;&#039;RV Password&#039;&#039;&#039; and &#039;&#039;&#039;Institute&#039;&#039;&#039; into the form and check both &amp;quot;Terms of Use&amp;quot;. Click &#039;&#039;&#039;Send&#039;&#039;&#039;.&lt;br /&gt;
# You will be assigned to the RV as a new member. &lt;br /&gt;
&amp;lt;div style=&amp;quot;padding-left:18px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Attention.svg|left|15px]]&lt;br /&gt;
In case of the &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;error&amp;lt;/span&amp;gt; &amp;quot;This project is not currently renewed&amp;quot;, please ask the RV responsible to apply for a prolongation of the RV. As soon as the prolongation was accepted, you can join the RV.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After submitting the request you will receive an email from ZAS about the further steps.&lt;br /&gt;
RV owner and RV managers will be notified automatically.&lt;br /&gt;
&lt;br /&gt;
== Register a new RV ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #28a745; padding: 15px; background-color: #d4edda; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
* An RV is valid for &#039;&#039;&#039;one year&#039;&#039;&#039;. After that, the RV responsible must apply for an extension of the RV for it to be renewed for another year.&lt;br /&gt;
* &#039;&#039;&#039;Creating multiple RVs on the same cluster is not necessary.&#039;&#039;&#039; Being part of multiple RVs on the same cluster does not grant any additional computing resources. The resource specifications (e.g. CPU hours) in an RV are used solely for cluster (tier) routing — to help assign your project to the most suitable cluster (tier). &#039;&#039;&#039;They do not represent a budget that is consumed, and they do not impose any limits on your usage.&#039;&#039;&#039; Every cluster user has full access to all available cluster resources regardless of how many RVs they belong to.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An RV should be registered by a leader or senior scientist of a research group/collaboration.&lt;br /&gt;
You will be:&lt;br /&gt;
* held accountable for the coworkers in the RV&lt;br /&gt;
* asked to provide information for the two reports required by the DFG for their funding of bwForClusters&lt;br /&gt;
* must make sure publications that used bwHPC resources properly cite the use in the [[acknowledgement]]&lt;br /&gt;
* must report publications which used bwHPC resources at least once a year&lt;br /&gt;
* likely asked for a contribution to a future DFG grant proposal for a new bwForCluster in your area of research (&amp;quot;wissenschaftliches Beiblatt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Some hints:&#039;&#039;&#039; &lt;br /&gt;
* To be notified about important issues via the cluster&#039;s mailing list, it is necessary to finish all three registration steps. If you don&#039;t plan to work with the cluster yourself, we recommend to either register nevertheless or ask a colleague who is going to use the cluster to keep you updated. For better transparency, that colleague could receive the &#039;&#039;RV manager&#039;&#039; role from you. &lt;br /&gt;
* Any number of coworkers can join the RV to work with the cluster.Therefore, they need to be provided with the RV password and acronym.&lt;br /&gt;
* The [https://www.bwhpc.de/bwhpc-domains.php research area] of the group as well as the software and hardware requirements are taken into account.&lt;br /&gt;
*: Please look carefully through the scientific fields and research domains to find the field that fits best to your research focus and experience. This way, you&#039;ll be assigned to the cluster that can support you best. If in doubt, you can check the [https://www.dfg.de/resource/blob/175334/89ba4a3464c99aaea40fdef47367e7b2/fachsystematik-2020-2024-de-grafik-data.pdf DFG classification] as well.&lt;br /&gt;
* Research topics also do not need to match the RV description exactly. However, we appreciate it if you keep the RV information up to date when submitting a prolongation application.&lt;br /&gt;
* Getting access to two different clusters is only possible if specific software or hardware needs demand access for both. &lt;br /&gt;
&lt;br /&gt;
[[File:RV-reg.png|right|frame|Register a new RV.]]&lt;br /&gt;
[[File:BwIDM-login.png|right|250px|thumb|Select your home organization]]&lt;br /&gt;
&#039;&#039;&#039;To apply for a new RV, follow these steps:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Please visit the [https://zas.bwhpc.de/shib/en/bwforcluster_proposal.php &#039;&#039;&#039;RV registration&#039;&#039;&#039;] web form at the [https://zas.bwhpc.de ZAS].&lt;br /&gt;
# Select your home organization from the list on the main page and click &#039;&#039;&#039;Proceed&#039;&#039;&#039; or &#039;&#039;&#039;Fortfahren&#039;&#039;&#039;.&lt;br /&gt;
# You will be directed to the &#039;&#039;Identity Provider&#039;&#039; of your home organization. Enter the username and password of your &#039;&#039;&#039;home organization&#039;&#039;&#039; (usually these credentials are also used for other services like email) and click &#039;&#039;&#039;Login/Einloggen&#039;&#039;&#039;.&lt;br /&gt;
# You will be redirected back to the RV registration form &#039;&#039;&#039;https://zas.bwhpc.de/shib/en/bwforcluster_proposal.php&#039;&#039;&#039;.&lt;br /&gt;
# Fill in all mandatory fields of the form and tick the two &amp;quot;Terms of use&amp;quot;. Detailed information on the individual fields can be found in the section [[Registration/bwForCluster/RV#Registration_Form_Details|Registration Form Details]]. Click &#039;&#039;&#039;Preview&#039;&#039;&#039;.&lt;br /&gt;
# If the information is correct, click &#039;&#039;&#039;Submit&#039;&#039;&#039;, otherwise you can customize your application.&lt;br /&gt;
# Go to section [[Registration/bwForCluster/RV#Registration_Response|Registration Response]] for the next steps.&lt;br /&gt;
&lt;br /&gt;
Please note that for your convenience you can also switch to the [https://zas.bwhpc.de/shib/bwforcluster_proposal.php German version] of the web form.&lt;br /&gt;
The submitter of the RV will be assigned the role &amp;quot;RV responsible&amp;quot; (see [[Registration/bwForCluster/RV/Management|Roles in an RV]]).&lt;br /&gt;
&lt;br /&gt;
=== Registration Form Details ===&lt;br /&gt;
&lt;br /&gt;
The web form consists of the following fields.&lt;br /&gt;
Note that the fields - name, given name, organization, mail, and EPPN - are auto-filled and can not be changed.&lt;br /&gt;
These are your credentials as given by your home organization.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;border:3px solid darkgray; margin: 1em auto 1em auto;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20%;padding:2px;margin:3px; background:#AAA; font-size:100%; font-weight:bold; border:1px solid #BBBBBB; text-align:left; color:#000; padding:0.2em 0.4em;&amp;quot;| Field&lt;br /&gt;
! style=&amp;quot;padding:2px;margin:3px; background:#AAA; font-size:100%; font-weight:bold; border:1px solid #BBBBBB; text-align:left; color:#000; padding:0.2em 0.4em;&amp;quot; | Explanation&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| [[File:RV-form.png|center|400px|thumb|Registering a new RV.]]&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| RV Title&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Define a short title of your planned compute activities, maximum of 255 characters including spaces.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| RV Description&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Write a short abstract about your planned compute activities (maximum of 2048 characters including spaces). Research groups that contributed to the DFG grant proposal (Art. 91b GG) of the corresponding bwForCluster only need to give reference to that particular proposal.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Scientific field&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Tick one or several scientific fields. Once all bwForClusters are up and running the full list of given scientific fields are supported and hence for RV applicable. If your RV does not match any given scientific field, please state your scientific field in the given text box. Grayed out scientific fields indicate that the corresponding bwForCluster(s) is/are not operational yet.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Field of activity&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Define if your RV is primarily for research and/or teaching. If not applicable, use text box.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Parallel paradigm&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State what parallel paradigm your code or application uses. Multiple ticks are allowed. Further information can be provided via text box. If you are not sure about it, please state the software you are using.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Programming language&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State the programming language(s) of your code or application.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Numerical methods&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State the numerical or &amp;quot;calculation&amp;quot; methods your code or application utilizes. If you do not know, write &amp;quot;unknown&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Software packages&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State all software package you will or want to use for your RV. Also include compiler, MPI and numerical packages (e.g. MKL, FFTW).&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Estimated requested computing resources&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Roughly estimate how many CPU hours are required to finish your RV. To calculate &amp;quot;CPU hours&amp;quot; multiply &amp;quot;elapsed parallel computing time&amp;quot; with &amp;quot;number of CPU core&amp;quot; per job. &lt;br /&gt;
&#039;&#039;Example: Your code uses 4 CPU cores and has a wall time of 1h. This makes 4 CPU hours.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Planned maximum number of parallel used CPU cores per job&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Give an upper limit of how many CPU cores per job are required. Please cross-check with your statement about parallel paradigm. &lt;br /&gt;
&#039;&#039;Obviously, a sequential code can only use 1 CPU core per job.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Estimated maximal memory requirements per CPU core&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Give an upper limit of how much RAM per CPU core your jobs require. Please give a value in Gigabytes.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Estimated requested persistent disk space for the RV&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State how much disk space in total you need for your RV. Please give a value in Gigabytes. &lt;br /&gt;
&#039;&#039;Example: If your RV has 4 more coworker and each of you produces until the end of your RV 20 Gigabyte of output, your maximum disk space is 100 Gigabyte.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Estimated maximal temporary disk space per job&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State how much space your intermediate files require during a job run. Please give a value in Gigabytes. &lt;br /&gt;
&#039;&#039;Example: Your final output of your job is 0.1 Gigabyte, but during your job 10 temporary files, each with a size of 1 Gigabyte, are written to disk, hence your correct answer is 10 Gigabyte.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Institute&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State the full name of your Institute.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Registration Response ===&lt;br /&gt;
&lt;br /&gt;
After submitting you will get an email from the ZAS confirming your submission.&lt;br /&gt;
With this email you are given an unique&lt;br /&gt;
* RV acronym&lt;br /&gt;
* RV password&lt;br /&gt;
&lt;br /&gt;
Please keep the password enclosed.&lt;br /&gt;
With RV acronym and password, [[Registration/bwForCluster/RV#Become_Coworker_of_a_RV| coworkers ]] can already associate themselves to the RV.&lt;br /&gt;
If this information is lost, please [[Registration/bwForCluster/RV#Renew_RV_Password|renew the password]] for the RV.&lt;br /&gt;
&lt;br /&gt;
The cluster assignment team assigns a bwForCluster to your RV based on your submitted data, including the [https://www.bwhpc.de/bwhpc-domains.php research area] as well as the software and hardware requirements.&lt;br /&gt;
The ZAS notifies you in an email about your assigned bwForCluster and provides website details for [[Registration/bwForCluster/Service| Step C]]. Later on you can find details about the roles and management possibilities at the [[Registration/bwForCluster/RV/Management | RV Management]] page.&lt;br /&gt;
&lt;br /&gt;
=== Duration of an RV ===&lt;br /&gt;
&lt;br /&gt;
An RV is valid for &#039;&#039;&#039;one year&#039;&#039;&#039;.&lt;br /&gt;
After that, the RV responsible must apply for an extension of the RV for it to be renewed for another year.&lt;br /&gt;
&lt;br /&gt;
=== RV Management for RV Responsibles and Managers  ===&lt;br /&gt;
&lt;br /&gt;
RV responsible or manager can [[Registration/bwForCluster/RV/Management|manage and modify Rechenvorhaben/projects]]. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:right;&amp;quot;&amp;gt;[[Registration/bwForCluster/Service | Go to step C]]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Registration/bwForCluster/RV&amp;diff=16124</id>
		<title>Registration/bwForCluster/RV</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Registration/bwForCluster/RV&amp;diff=16124"/>
		<updated>2026-06-03T15:53:54Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Register a new RV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=  Step B: Apply for a Rechenvorhaben/Project =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rechenvorhaben/Projects (RV)&#039;&#039;&#039; are required for assignment to a bwForCluster.&lt;br /&gt;
[[File:RV-my.png|right|frame|My RVs.]]&lt;br /&gt;
&lt;br /&gt;
To get access to an RV, answer the following question: &lt;br /&gt;
* Does your work group (or the collaborative project that you are part of) already have an RV?&lt;br /&gt;
** &#039;&#039;&#039;Yes &amp;amp;rarr; [[#Become_Coworker_of_an_RV|Become Coworker of an RV]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;No &amp;amp;rarr; [[#Register_a_new_RV|Register a new RV]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can see your RV memberships at the central application site ZAS under [https://zas.bwhpc.de/shib/en/info_rv.php &#039;&#039;&#039;My RVs&#039;&#039;&#039;].&lt;br /&gt;
&lt;br /&gt;
== Become Coworker of an RV ==&lt;br /&gt;
&lt;br /&gt;
[[File:RV-collab.png|right|100px|frame|1. RV collaboration.]]&lt;br /&gt;
[[File:RV-formcol.png|right|300px|thumb|4. RV collaboration form]]&lt;br /&gt;
{|style=&amp;quot;background:#deffee; width:70%;&amp;quot;&lt;br /&gt;
|style=&amp;quot;padding:5px; background:#cef2e0; text-align:left&amp;quot;|&lt;br /&gt;
[[Image:Attention.svg|center|25px]]&lt;br /&gt;
|style=&amp;quot;padding:5px; background:#cef2e0; text-align:left&amp;quot;|&lt;br /&gt;
You can only sign up for an RV once.&lt;br /&gt;
If you are an inactive member of an RV, either because you de-registered yourself or a manager deactivated you, only an RV manager can reactivate you.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;RV responsible&amp;quot; will provide you with the following data on the RV:&lt;br /&gt;
* RV acronym&lt;br /&gt;
* RV password&lt;br /&gt;
&lt;br /&gt;
If this information is lost, please let the &amp;quot;RV responsible&amp;quot; [[Registration/bwForCluster/RV/Management#Renew_RV_Password|renew the password]] for the RV.&lt;br /&gt;
&lt;br /&gt;
To become coworker of an RV, follow these steps:&lt;br /&gt;
# Please visit the [https://zas.bwhpc.de/shib/en/bwforcluster_collaboration.php &#039;&#039;&#039;RV collaboration&#039;&#039;&#039;] web form at the [https://zas.bwhpc.de ZAS].&lt;br /&gt;
# Select your home organization from the list on the main page and click &#039;&#039;&#039;Proceed&#039;&#039;&#039; or &#039;&#039;&#039;Fortfahren&#039;&#039;&#039;.&lt;br /&gt;
# You will be directed to the &#039;&#039;Identity Provider&#039;&#039; of your home organization. Enter the username and password of your &#039;&#039;&#039;home organization&#039;&#039;&#039; (usually these credentials are also used for other services like email) and click &#039;&#039;&#039;Login/Einloggen&#039;&#039;&#039;.&lt;br /&gt;
# You will be redirected back to the RV collaboration form &#039;&#039;&#039;https://zas.bwhpc.de/shib/en/bwforcluster_collaboration.php&#039;&#039;&#039;.&lt;br /&gt;
# Enter &#039;&#039;&#039;RV Acronym&#039;&#039;&#039;, &#039;&#039;&#039;RV Password&#039;&#039;&#039; and &#039;&#039;&#039;Institute&#039;&#039;&#039; into the form and check both &amp;quot;Terms of Use&amp;quot;. Click &#039;&#039;&#039;Send&#039;&#039;&#039;.&lt;br /&gt;
# You will be assigned to the RV as a new member. &lt;br /&gt;
&amp;lt;div style=&amp;quot;padding-left:18px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Attention.svg|left|15px]]&lt;br /&gt;
In case of the &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;error&amp;lt;/span&amp;gt; &amp;quot;This project is not currently renewed&amp;quot;, please ask the RV responsible to apply for a prolongation of the RV. As soon as the prolongation was accepted, you can join the RV.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After submitting the request you will receive an email from ZAS about the further steps.&lt;br /&gt;
RV owner and RV managers will be notified automatically.&lt;br /&gt;
&lt;br /&gt;
== Register a new RV ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #28a745; padding: 15px; background-color: #d4edda; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
* An RV is valid for &#039;&#039;&#039;one year&#039;&#039;&#039;. After that, the RV responsible must apply for an extension of the RV for it to be renewed for another year.&lt;br /&gt;
* &#039;&#039;&#039;Creating multiple RVs on the same cluster is not necessary.&#039;&#039;&#039; Being part of multiple RVs on the same cluster does not grant any additional computing resources. The resource specifications (e.g. CPU hours) in an RV are used solely for cluster (tier) routing — to help assign your project to the most suitable cluster (tier). &#039;&#039;&#039;They do not represent a budget that is consumed, and they do not impose any limits on your usage.&#039;&#039;&#039; Every cluster user has full access to all available cluster resources regardless of how many RVs they belong to.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An RV should be registered by a leader or senior scientist of a research group/collaboration.&lt;br /&gt;
You will be:&lt;br /&gt;
* held accountable for the coworkers in the RV&lt;br /&gt;
* asked to provide information for the two reports required by the DFG for their funding of bwForClusters&lt;br /&gt;
* must make sure publications that used bwHPC resources properly cite the use in the [[acknowledgement]]&lt;br /&gt;
* must report publications which used bwHPC resources at least once a year&lt;br /&gt;
* likely asked for a contribution to a future DFG grant proposal for a new bwForCluster in your area of research (&amp;quot;wissenschaftliches Beiblatt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Some hints:&#039;&#039;&#039; &lt;br /&gt;
* To be notified about important issues via the cluster&#039;s mailing list, it is necessary to finish all three registration steps. If you don&#039;t plan to work with the cluster yourself, we recommend to either register nevertheless or ask a colleague who is going to use the cluster to keep you updated. For better transparency, that colleague could receive the &#039;&#039;RV manager&#039;&#039; role from you. &lt;br /&gt;
* Any number of coworkers can join the RV to work with the cluster.Therefore, they need to be provided with the RV password and acronym.&lt;br /&gt;
* The [https://www.bwhpc.de/bwhpc-domains.php research area] of the group as well as the software and hardware requirements are taken into account.&lt;br /&gt;
*: Please look carefully through the scientific fields and research domains to find the field that fits best to your research focus and experience. This way, you&#039;ll be assigned to the cluster that can support you best. If in doubt, you can check the [https://www.dfg.de/resource/blob/175334/89ba4a3464c99aaea40fdef47367e7b2/fachsystematik-2020-2024-de-grafik-data.pdf DFG classification] as well.&lt;br /&gt;
* Research topics also do not need to match the RV description exactly. However, we appreciate it if you keep the RV information up to date when submitting a prolongation application.&lt;br /&gt;
* Getting access to two different clusters is only possible if specific software or hardware needs demand access for both. &lt;br /&gt;
&lt;br /&gt;
[[File:RV-reg.png|right|frame|Register a new RV.]]&lt;br /&gt;
[[File:BwIDM-login.png|right|250px|thumb|Select your home organization]]&lt;br /&gt;
&#039;&#039;&#039;To apply for a new RV, follow these steps:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Please visit the [https://zas.bwhpc.de/shib/en/bwforcluster_proposal.php &#039;&#039;&#039;RV registration&#039;&#039;&#039;] web form at the [https://zas.bwhpc.de ZAS].&lt;br /&gt;
# Select your home organization from the list on the main page and click &#039;&#039;&#039;Proceed&#039;&#039;&#039; or &#039;&#039;&#039;Fortfahren&#039;&#039;&#039;.&lt;br /&gt;
# You will be directed to the &#039;&#039;Identity Provider&#039;&#039; of your home organization. Enter the username and password of your &#039;&#039;&#039;home organization&#039;&#039;&#039; (usually these credentials are also used for other services like email) and click &#039;&#039;&#039;Login/Einloggen&#039;&#039;&#039;.&lt;br /&gt;
# You will be redirected back to the RV registration form &#039;&#039;&#039;https://zas.bwhpc.de/shib/en/bwforcluster_proposal.php&#039;&#039;&#039;.&lt;br /&gt;
# Fill in all mandatory fields of the form and tick the two &amp;quot;Terms of use&amp;quot;. Detailed information on the individual fields can be found in the section [[Registration/bwForCluster/RV#Registration_Form_Details|Registration Form Details]]. Click &#039;&#039;&#039;Preview&#039;&#039;&#039;.&lt;br /&gt;
# If the information is correct, click &#039;&#039;&#039;Submit&#039;&#039;&#039;, otherwise you can customize your application.&lt;br /&gt;
# Go to section [[Registration/bwForCluster/RV#Registration_Response|Registration Response]] for the next steps.&lt;br /&gt;
&lt;br /&gt;
Please note that for your convenience you can also switch to the [https://zas.bwhpc.de/shib/bwforcluster_proposal.php German version] of the web form.&lt;br /&gt;
The submitter of the RV will be assigned the role &amp;quot;RV responsible&amp;quot; (see [[Registration/bwForCluster/RV/Management|Roles in an RV]]).&lt;br /&gt;
&lt;br /&gt;
=== Registration Form Details ===&lt;br /&gt;
&lt;br /&gt;
The web form consists of the following fields.&lt;br /&gt;
Note that the fields - name, given name, organization, mail, and EPPN - are auto-filled and can not be changed.&lt;br /&gt;
These are your credentials as given by your home organization.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;border:3px solid darkgray; margin: 1em auto 1em auto;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20%;padding:2px;margin:3px; background:#AAA; font-size:100%; font-weight:bold; border:1px solid #BBBBBB; text-align:left; color:#000; padding:0.2em 0.4em;&amp;quot;| Field&lt;br /&gt;
! style=&amp;quot;padding:2px;margin:3px; background:#AAA; font-size:100%; font-weight:bold; border:1px solid #BBBBBB; text-align:left; color:#000; padding:0.2em 0.4em;&amp;quot; | Explanation&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| [[File:RV-form.png|center|400px|thumb|Registering a new RV.]]&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| RV Title&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Define a short title of your planned compute activities, maximum of 255 characters including spaces.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| RV Description&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Write a short abstract about your planned compute activities (maximum of 2048 characters including spaces). Research groups that contributed to the DFG grant proposal (Art. 91b GG) of the corresponding bwForCluster only need to give reference to that particular proposal.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Scientific field&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Tick one or several scientific fields. Once all bwForClusters are up and running the full list of given scientific fields are supported and hence for RV applicable. If your RV does not match any given scientific field, please state your scientific field in the given text box. Grayed out scientific fields indicate that the corresponding bwForCluster(s) is/are not operational yet.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Field of activity&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Define if your RV is primarily for research and/or teaching. If not applicable, use text box.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Parallel paradigm&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State what parallel paradigm your code or application uses. Multiple ticks are allowed. Further information can be provided via text box. If you are not sure about it, please state the software you are using.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Programming language&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State the programming language(s) of your code or application.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Numerical methods&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State the numerical or &amp;quot;calculation&amp;quot; methods your code or application utilizes. If you do not know, write &amp;quot;unknown&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Software packages&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State all software package you will or want to use for your RV. Also include compiler, MPI and numerical packages (e.g. MKL, FFTW).&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Estimated requested computing resources&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Roughly estimate how many CPU hours are required to finish your RV. To calculate &amp;quot;CPU hours&amp;quot; multiply &amp;quot;elapsed parallel computing time&amp;quot; with &amp;quot;number of CPU core&amp;quot; per job. &lt;br /&gt;
&#039;&#039;Example: Your code uses 4 CPU cores and has a wall time of 1h. This makes 4 CPU hours.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Planned maximum number of parallel used CPU cores per job&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Give an upper limit of how many CPU cores per job are required. Please cross-check with your statement about parallel paradigm. &lt;br /&gt;
&#039;&#039;Obviously, a sequential code can only use 1 CPU core per job.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Estimated maximal memory requirements per CPU core&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | Give an upper limit of how much RAM per CPU core your jobs require. Please give a value in Gigabytes.&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Estimated requested persistent disk space for the RV&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State how much disk space in total you need for your RV. Please give a value in Gigabytes. &lt;br /&gt;
&#039;&#039;Example: If your RV has 4 more coworker and each of you produces until the end of your RV 20 Gigabyte of output, your maximum disk space is 100 Gigabyte.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Estimated maximal temporary disk space per job&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State how much space your intermediate files require during a job run. Please give a value in Gigabytes. &lt;br /&gt;
&#039;&#039;Example: Your final output of your job is 0.1 Gigabyte, but during your job 10 temporary files, each with a size of 1 Gigabyte, are written to disk, hence your correct answer is 10 Gigabyte.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;column&amp;quot; {{Lightgray_small}}| Institute&lt;br /&gt;
|scope=&amp;quot;column&amp;quot; {{Tab element}} | State the full name of your Institute.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Registration Response ===&lt;br /&gt;
&lt;br /&gt;
After submitting you will get an email from the ZAS confirming your submission.&lt;br /&gt;
With this email you are given an unique&lt;br /&gt;
* RV acronym&lt;br /&gt;
* RV password&lt;br /&gt;
&lt;br /&gt;
Please keep the password enclosed.&lt;br /&gt;
With RV acronym and password, [[Registration/bwForCluster/RV#Become_Coworker_of_a_RV| coworkers ]] can already associate themselves to the RV.&lt;br /&gt;
If this information is lost, please [[Registration/bwForCluster/RV#Renew_RV_Password|renew the password]] for the RV.&lt;br /&gt;
&lt;br /&gt;
The cluster assignment team assigns a bwForCluster to your RV based on your submitted data, including the [https://www.bwhpc.de/bwhpc-domains.php research area] as well as the software and hardware requirements.&lt;br /&gt;
The ZAS notifies you in an email about your assigned bwForCluster and provides website details for [[Registration/bwForCluster/Service| Step C]]. Later on you can find details about the roles and management possibilities at the [[Registration/bwForCluster/RV/Management | RV Management]] page.&lt;br /&gt;
&lt;br /&gt;
=== Duration of an RV ===&lt;br /&gt;
&lt;br /&gt;
An RV is valid for &#039;&#039;&#039;one year&#039;&#039;&#039;.&lt;br /&gt;
After that, the RV responsible must apply for an extension of the RV for it to be renewed for another year.&lt;br /&gt;
&lt;br /&gt;
=== RV Management for RV Responsibles and Managers  ===&lt;br /&gt;
&lt;br /&gt;
RV responsible or manager can [[Registration/bwForCluster/RV/Management|manage and modify Rechenvorhaben/projects]]. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:right;&amp;quot;&amp;gt;[[Registration/bwForCluster/Service | Go to step C]]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16121</id>
		<title>NEMO2/Workspaces</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16121"/>
		<updated>2026-06-03T12:47:43Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Sharing Workspaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 15px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is the updated Workspaces guide for NEMO2. For other clusters please use: [[Workspace]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Workspace tools&#039;&#039;&#039; provide temporary storage on NEMO&#039;s fast parallel filesystem (Weka).&lt;br /&gt;
They are meant for data that needs to persist longer than a single job, but not permanently.&lt;br /&gt;
&lt;br /&gt;
For advanced features — user config (&amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;), reminders, quotas, workspace handover, and more — see [[NEMO2/Workspaces/Advanced_Features|Advanced Features]].&lt;br /&gt;
&lt;br /&gt;
== What are Workspaces? ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Jobs generating intermediate data&lt;br /&gt;
* Data shared between multiple compute nodes&lt;br /&gt;
* Multi-step workflows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Don&#039;t use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Permanent storage (use HOME or project directories)&lt;br /&gt;
* Single-node temporary files (use &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt; instead)&lt;br /&gt;
&lt;br /&gt;
== Important - Read First ==&lt;br /&gt;
&lt;br /&gt;
* No Backup: Data is &#039;&#039;&#039;not backed up&#039;&#039;&#039; and will be &#039;&#039;&#039;automatically deleted&#039;&#039;&#039; after expiration&lt;br /&gt;
* Time-limited: Maximum lifetime is 100 days, up to 100 extensions&lt;br /&gt;
* Email Reminders: You receive email notifications before expiration&lt;br /&gt;
* Backup Important Data: Copy results to permanent storage before expiration&lt;br /&gt;
&lt;br /&gt;
== Command Overview ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_allocate&amp;lt;/tt&amp;gt; - Create or extend workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt; - List your workspaces&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; - Find workspace path (for scripts)&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_extend&amp;lt;/tt&amp;gt; - Extend workspace lifetime&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt; - Release (delete) workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; - Restore expired/released workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_register&amp;lt;/tt&amp;gt; - Create symbolic links&lt;br /&gt;
&lt;br /&gt;
All commands support &amp;lt;tt&amp;gt;-h&amp;lt;/tt&amp;gt; for help.&lt;br /&gt;
&lt;br /&gt;
== Quick Start ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:40%&amp;quot; | Task&lt;br /&gt;
!style=&amp;quot;width:60%&amp;quot; | Command&lt;br /&gt;
|-&lt;br /&gt;
|Create workspace (100 days)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Create group workspace&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate -G groupname myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|List all workspaces&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|See what expires soon&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list -Rr&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Find path (for scripts)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_find myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Extend by 100 days&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_extend myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Delete workspace (permanent, next nightly run)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_release myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Restore expired workspace (30d grace)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; then &amp;lt;tt&amp;gt;ws_restore oldname newname&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Creating Workspaces ==&lt;br /&gt;
&lt;br /&gt;
Create a workspace with a &#039;&#039;&#039;name&#039;&#039;&#039; and &#039;&#039;&#039;lifetime&#039;&#039;&#039; in days:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate myWs 100&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
   /work/classic/$USER-myWs&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Capture path in variable:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_allocate myWs 100)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Running the same command again is safe - returns the existing workspace path.&lt;br /&gt;
&lt;br /&gt;
== Listing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_list                                # List all workspaces&lt;br /&gt;
   $ ws_list -Rr                            # Sort by remaining time, soonest first&lt;br /&gt;
   $ ws_list -g                             # Show group workspaces&lt;br /&gt;
&lt;br /&gt;
== Extending Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_extend myWs 100                      # Extend by 100 days from now&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alternative:&#039;&#039;&#039; &amp;lt;tt&amp;gt;ws_allocate -x myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each extension consumes one of your available extensions (100 total).&lt;br /&gt;
&lt;br /&gt;
== Releasing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_release myWs&lt;br /&gt;
&lt;br /&gt;
The workspace becomes inaccessible immediately and is permanently deleted at the next nightly expirer run. &#039;&#039;&#039;Do not rely on recovering a released workspace.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Restoring Workspaces ==&lt;br /&gt;
&lt;br /&gt;
Recover workspaces that &#039;&#039;&#039;expired naturally&#039;&#039;&#039; (reached end of lifetime) within the 30-day grace period:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -l                          # (1) List restorable workspaces&lt;br /&gt;
   $ ws_allocate restored 100               # (2) Create target workspace&lt;br /&gt;
   $ ws_restore username-myWs-0 restored    # (3) Restore&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Use the &#039;&#039;&#039;full name&#039;&#039;&#039; from &amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; (with username and timestamp), not the short name.&lt;br /&gt;
Released workspaces (via &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt;) can also be restored, but only until the next nightly expirer run — after that they are permanently deleted.&lt;br /&gt;
&lt;br /&gt;
== Sharing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
=== Group workspace (recommended) ===&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable (read-only for group)&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable (recommended for teams)&lt;br /&gt;
   $ ws_allocate -G bw12a001 myWs 100       # Example: project group bw12a001&lt;br /&gt;
&lt;br /&gt;
Anyone in the group can use &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt; to see the workspace and extend it with:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -x -u owner myWs 100&lt;br /&gt;
&lt;br /&gt;
Using &amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; also enables smooth handover when team members leave — see [[NEMO2/Workspaces/Advanced_Features#Workspace_Handover|Workspace Handover]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set default group in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
groupname: bw12a001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Share after creation ===&lt;br /&gt;
&lt;br /&gt;
If you didn&#039;t use &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; at creation, share read-only with &amp;lt;tt&amp;gt;ws_share&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
   $ ws_share share myWs alice bob          # Grant read access&lt;br /&gt;
   $ ws_share list myWs                     # Show who has access&lt;br /&gt;
   $ ws_share unshare myWs alice            # Remove access&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Advanced sharing:&#039;&#039;&#039; [[NEMO2/Workspaces/Advanced_Features#Sharing|Sharing guide]] for ACL-based per-user permissions.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Enroot&amp;diff=16116</id>
		<title>NEMO2/Containers/Enroot</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Enroot&amp;diff=16116"/>
		<updated>2026-06-02T12:45:12Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Image storage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Enroot&#039;&#039;&#039; is a container runtime developed by NVIDIA that runs OCI/Docker containers without root privileges.&lt;br /&gt;
On NEMO it is the &#039;&#039;&#039;recommended&#039;&#039;&#039; container solution and is integrated with Slurm via the &#039;&#039;&#039;Pyxis&#039;&#039;&#039; SPANK plugin.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
Enroot converts a Docker image into a SquashFS file (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;), unpacks it on demand into an overlay filesystem, and runs your workload inside that environment.&lt;br /&gt;
The Pyxis plugin adds &amp;lt;tt&amp;gt;--container-*&amp;lt;/tt&amp;gt; options to &amp;lt;tt&amp;gt;srun&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;salloc&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;sbatch&amp;lt;/tt&amp;gt; so containers become first-class Slurm jobs.&lt;br /&gt;
&lt;br /&gt;
== Image sources ==&lt;br /&gt;
&lt;br /&gt;
All major OCI registries work out of the box. Note that Enroot uses &amp;lt;tt&amp;gt;#&amp;lt;/tt&amp;gt; (not &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt;) to separate registry host from image path.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Registry !! URI syntax !! Example&lt;br /&gt;
|-&lt;br /&gt;
| Docker Hub || &amp;lt;tt&amp;gt;docker://IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://ubuntu:24.04&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NVIDIA NGC || &amp;lt;tt&amp;gt;docker://nvcr.io#ORG/IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://nvcr.io#nvidia/pytorch:24.01-py3&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| quay.io || &amp;lt;tt&amp;gt;docker://quay.io#ORG/IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://quay.io#rockylinux/rockylinux:9&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Container Registry || &amp;lt;tt&amp;gt;docker://ghcr.io#ORG/IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://ghcr.io#containerd/alpine:latest&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Image storage ==&lt;br /&gt;
&lt;br /&gt;
Unpacked container images are stored in &amp;lt;tt&amp;gt;~/.local/share/enroot/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Images are SquashFS files and can be several GB.&lt;br /&gt;
To avoid filling your home quota, store images in a [[NEMO2/Workspaces|workspace]] and symlink the default path:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a workspace (100 days)&lt;br /&gt;
ws_allocate enroot 100&lt;br /&gt;
&lt;br /&gt;
# replace the default enroot directory with a symlink to the workspace&lt;br /&gt;
mkdir -p ~/.local/share&lt;br /&gt;
ln -s $(ws_find enroot) ~/.local/share/enroot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enroot (and Pyxis) will now transparently use the workspace path for all image storage.&lt;br /&gt;
&lt;br /&gt;
== Default mounts ==&lt;br /&gt;
&lt;br /&gt;
The following paths are &#039;&#039;&#039;automatically mounted&#039;&#039;&#039; into every container:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Host path !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt; || all home directories, read-write&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt; || all workspace filesystems, read-write&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The paths inside the container are &#039;&#039;&#039;identical&#039;&#039;&#039; to the paths on the host system, so scripts referencing &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt; or workspace paths work without modification.&lt;br /&gt;
You do &#039;&#039;&#039;not&#039;&#039;&#039; need to pass &amp;lt;tt&amp;gt;--container-mount-home&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--container-mounts=/work&amp;lt;/tt&amp;gt; manually.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;ws_*&amp;lt;/tt&amp;gt; tools (e.g. &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;) are &#039;&#039;&#039;not available inside the container&#039;&#039;&#039;.&lt;br /&gt;
Determine your workspace path on the login node before submitting the job and pass it as an environment variable or hard-code it in your script.&lt;br /&gt;
&lt;br /&gt;
== Interactive usage ==&lt;br /&gt;
&lt;br /&gt;
=== Import an image ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;enroot import&amp;lt;/tt&amp;gt; downloads an OCI image from a registry and converts it into a &#039;&#039;&#039;SquashFS archive&#039;&#039;&#039; (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;).&lt;br /&gt;
SquashFS is a compressed, read-only filesystem — the sqsh file is the portable, immutable snapshot of the container image.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# from Docker Hub&lt;br /&gt;
enroot import docker://ubuntu:24.04&lt;br /&gt;
&lt;br /&gt;
# from quay.io&lt;br /&gt;
enroot import docker://quay.io#rockylinux/rockylinux:9&lt;br /&gt;
&lt;br /&gt;
# from NVIDIA NGC&lt;br /&gt;
enroot import docker://nvcr.io#nvidia/pytorch:24.01-py3&lt;br /&gt;
&lt;br /&gt;
# from GitHub Container Registry&lt;br /&gt;
enroot import docker://ghcr.io#containerd/alpine:latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates a &amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt; file in the current directory (e.g. &amp;lt;tt&amp;gt;ubuntu+24.04.sqsh&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Create a container ===&lt;br /&gt;
&lt;br /&gt;
Before you can run the image, you must &#039;&#039;&#039;unpack&#039;&#039;&#039; it into a container root filesystem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enroot create --name pyxis_ubuntu ubuntu+24.04.sqsh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This extracts the sqsh archive into &amp;lt;tt&amp;gt;~/.local/share/enroot/pyxis_ubuntu/&amp;lt;/tt&amp;gt; (or the symlinked workspace path).&lt;br /&gt;
The container name must be prefixed with &amp;lt;tt&amp;gt;pyxis_&amp;lt;/tt&amp;gt; so that &#039;&#039;&#039;Pyxis&#039;&#039;&#039; (the Slurm plugin) can find it later — when passing &amp;lt;tt&amp;gt;--container-name&amp;lt;/tt&amp;gt; to Slurm, omit the prefix.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Can I delete the &amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt; file afterwards?&#039;&#039;&#039;&lt;br /&gt;
Yes. Once &amp;lt;tt&amp;gt;enroot create&amp;lt;/tt&amp;gt; has unpacked the image, the sqsh file is no longer needed for running the container.&lt;br /&gt;
Keep it as a backup to recreate the container later, or delete it to free space:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm ubuntu+24.04.sqsh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Start a container ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# interactive shell, read-write&lt;br /&gt;
enroot start --rw pyxis_ubuntu bash&lt;br /&gt;
&lt;br /&gt;
# get root inside the container (to install packages)&lt;br /&gt;
enroot start --root --rw pyxis_ubuntu bash&lt;br /&gt;
&lt;br /&gt;
# mount an extra directory&lt;br /&gt;
enroot start --rw -m /tmp/mydata:/data pyxis_ubuntu bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== List and remove containers ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enroot list --fancy&lt;br /&gt;
enroot remove pyxis_ubuntu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage via Slurm / Pyxis ==&lt;br /&gt;
&lt;br /&gt;
=== Interactive allocation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# use an already-created container&lt;br /&gt;
salloc -p cpu --container-name=ubuntu&lt;br /&gt;
&lt;br /&gt;
# pull, create and start in one step (container is created under ~/.local/share/enroot/)&lt;br /&gt;
salloc -p cpu --container-image=ubuntu:24.04 --container-name=ubuntu&lt;br /&gt;
salloc -p cpu --container-image=&amp;quot;quay.io#rockylinux/rockylinux:9&amp;quot; --container-name=rocky&lt;br /&gt;
salloc -p cpu --container-image=&amp;quot;ghcr.io#containerd/alpine:latest&amp;quot; --container-name=alpine&lt;br /&gt;
salloc -p l40s --gres=gpu:1 --container-image=&amp;quot;nvcr.io#nvidia/pytorch:24.01-py3&amp;quot; --container-name=pytorch&lt;br /&gt;
&lt;br /&gt;
# start with a specific working directory inside the container&lt;br /&gt;
# $(ws_find enroot) is evaluated on the login node before the job starts&lt;br /&gt;
salloc -p cpu --container-name=ubuntu --container-workdir=$(ws_find enroot)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Batch job ===&lt;br /&gt;
&lt;br /&gt;
CPU job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p cpu&lt;br /&gt;
#SBATCH --container-name=ubuntu&lt;br /&gt;
&lt;br /&gt;
python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GPU job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p l40s&lt;br /&gt;
#SBATCH --gres=gpu:1&lt;br /&gt;
#SBATCH --container-name=pytorch&lt;br /&gt;
&lt;br /&gt;
python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Useful Pyxis options ===&lt;br /&gt;
&lt;br /&gt;
All options are listed in &amp;lt;tt&amp;gt;srun --help&amp;lt;/tt&amp;gt; under &#039;&#039;Options provided by plugins&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-name=NAME&amp;lt;/tt&amp;gt; || Use existing enroot container (omit the &amp;lt;tt&amp;gt;pyxis_&amp;lt;/tt&amp;gt; prefix)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-image=IMAGE&amp;lt;/tt&amp;gt; || Pull image from registry and create container on the fly&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-mounts=SRC:DST[,…]&amp;lt;/tt&amp;gt; || Bind-mount additional paths&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-writable&amp;lt;/tt&amp;gt; || Make the container overlay writable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-remap-root&amp;lt;/tt&amp;gt; || Become root inside the container (no real root on host)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-workdir=PATH&amp;lt;/tt&amp;gt; || Set the working directory inside the container&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GPU access ==&lt;br /&gt;
&lt;br /&gt;
GPU passthrough is &#039;&#039;&#039;automatic&#039;&#039;&#039; — no extra flags are needed.&lt;br /&gt;
Enroot/Pyxis detect the allocated GPUs via Slurm&#039;s GRES mechanism and make them available inside the container.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
salloc -p l40s --gres=gpu:1 --container-name=pytorch&lt;br /&gt;
# nvidia-smi works inside the container out of the box&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
&lt;br /&gt;
* Install extra packages interactively with &amp;lt;tt&amp;gt;enroot start --root --rw&amp;lt;/tt&amp;gt; before submitting batch jobs.&lt;br /&gt;
* Use &amp;lt;tt&amp;gt;--container-writable&amp;lt;/tt&amp;gt; in batch jobs only if your script modifies the container filesystem; otherwise the default overlay is discarded after the job anyway.&lt;br /&gt;
* Store large datasets in workspaces (&amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt;), not in &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt;, to avoid filling your home quota with data files.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Registration/SSH/SSH-FIDO2-Quick-Start&amp;diff=16110</id>
		<title>Registration/SSH/SSH-FIDO2-Quick-Start</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Registration/SSH/SSH-FIDO2-Quick-Start&amp;diff=16110"/>
		<updated>2026-05-28T16:26:18Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= SSH with FIDO2 Security Keys - Quick Start Guide =&lt;br /&gt;
&lt;br /&gt;
This guide shows you how to secure your SSH keys with FIDO2 security hardware keys (Yubikey, Feitian, Token2, etc.) using FIDO2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #28a745; padding: 15px; background-color: #d4edda; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Why FIDO2 SSH Keys?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
FIDO2 SSH keys (&#039;&#039;&#039;ED25519-SK&#039;&#039;&#039; and &#039;&#039;&#039;ECDSA-SK&#039;&#039;&#039;) offer significant advantages:&lt;br /&gt;
* Valid for &#039;&#039;&#039;720 days&#039;&#039;&#039; - no frequent re-registration needed&lt;br /&gt;
* No pre-login required - no need to first unlock with password and TOTP&lt;br /&gt;
* Hardware-protected - private key never leaves the security key&lt;br /&gt;
* Physical presence required - you must touch the key to authenticate&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; margin-top:10px;&amp;quot;&lt;br /&gt;
|+ Cluster Support&lt;br /&gt;
|-&lt;br /&gt;
! Cluster !! FIDO2 Support&lt;br /&gt;
|-&lt;br /&gt;
| bwUniCluster 3.0 || style=&amp;quot;background-color:#90EE90;&amp;quot; | ✓&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster BinAC 2 || style=&amp;quot;background-color:#FFB6C1;&amp;quot; | ✗&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster Helix || style=&amp;quot;background-color:#FFB6C1;&amp;quot; | ✗&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster JUSTUS 2 || style=&amp;quot;background-color:#FFB6C1;&amp;quot; | ✗&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster NEMO 2 || style=&amp;quot;background-color:#90EE90;&amp;quot; | ✓&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
* A FIDO2 security key, e.g.:&lt;br /&gt;
** [https://www.yubico.com/products/yubikey-5-overview/ Yubikey 5 series] or newer&lt;br /&gt;
** [https://www.ftsafe.com/Products/FIDO/Single_Button_FIDO Feitian ePass FIDO A4B] (~18 €, as of May 2026) — supports &amp;lt;code&amp;gt;ecdsa-sk&amp;lt;/code&amp;gt; only, use &amp;lt;code&amp;gt;ssh-keygen -t ecdsa-sk&amp;lt;/code&amp;gt;&lt;br /&gt;
** Token2 or any other FIDO2-certified key&lt;br /&gt;
* OpenSSH 8.2 or newer&lt;br /&gt;
* For PIN setup: Either Chrome/Chromium/Brave browser OR &amp;lt;code&amp;gt;yubikey-manager&amp;lt;/code&amp;gt; command-line tool (Yubikey only)&lt;br /&gt;
* For SSH key generation: &amp;lt;code&amp;gt;openssh-client&amp;lt;/code&amp;gt; package&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Check your OpenSSH version:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -V&lt;br /&gt;
ssh -Q PubkeyAcceptedAlgorithms | grep -E &#039;sk-ssh-ed25519|sk-ecdsa&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Need help with installation?&#039;&#039;&#039; See the [https://gitlab.rz.uni-freiburg.de/escience-public/yubikey#ssh-and-yubikeys detailed setup guide] for your operating system.&lt;br /&gt;
&lt;br /&gt;
= Quick Start Guide =&lt;br /&gt;
&lt;br /&gt;
== Step 1: Set up your FIDO2 Security Key ==&lt;br /&gt;
&lt;br /&gt;
What is a FIDO2 PIN? The PIN protects your security key&#039;s FIDO2 functions. For Yubikeys, it&#039;s separate from any other PINs (like the PIV PIN). Choose a PIN you can remember or save it to a keystore - you have 8 attempts before needing to reset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you lose your FIDO2 PIN, the security key must be reset. &#039;&#039;&#039;All FIDO2 data will be lost,&#039;&#039;&#039; including SSH keys stored on the device. After reset, you must generate new SSH keys and re-register them.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Option A: Command Line Setup (Yubikey only) ===&lt;br /&gt;
&lt;br /&gt;
For Yubikeys, set a PIN using the &amp;lt;code&amp;gt;yubikey-manager&amp;lt;/code&amp;gt; tool:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ykman fido access change-pin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll be asked to &#039;&#039;&#039;enter a new PIN&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Forgot your PIN or need to reset?&#039;&#039;&#039; You can reset your FIDO2 PIN using &amp;lt;code&amp;gt;ykman fido reset&amp;lt;/code&amp;gt; or use the &amp;quot;Reset your security key&amp;quot; option shown in the browser security key settings (see image in Option B below).&lt;br /&gt;
&lt;br /&gt;
=== Option B: Browser Setup (Chrome/Chromium/Brave) ===&lt;br /&gt;
&lt;br /&gt;
You can also set a FIDO2 PIN using Chrome, Chromium, or Brave browser. &#039;&#039;&#039;This method works for all FIDO2 security hardware keys&#039;&#039;&#039; (Yubikey, Feitian, Token2, etc.), not just Yubikeys.&lt;br /&gt;
&#039;&#039;&#039;Alternative:&#039;&#039;&#039; For Yubikeys specifically, you can also use [https://www.yubico.com/products/yubico-authenticator/ Yubico Authenticator].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Open Security Key Settings:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Enter the following in your browser&#039;s address bar:&lt;br /&gt;
&lt;br /&gt;
* Chrome/Chromium/Brave: &amp;lt;code&amp;gt;chrome://settings/securityKeys&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Chrome_Fido2_1.png|center|600px|thumb|Manage security keys - shows options for Create PIN, Sign-in data, Fingerprints, and Reset security key]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The &amp;quot;Reset your security key&amp;quot; option (shown with red warning icons in the image above) can be used if you forget your PIN. &#039;&#039;&#039;Warning: Reset will delete all FIDO2 data including SSH keys!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Create a PIN:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Click &#039;&#039;&#039;Create a PIN&#039;&#039;&#039; and follow the prompts:&lt;br /&gt;
&lt;br /&gt;
[[File:Chrome_Fido2_2.png|center|400px|thumb|Create PIN dialog]]&lt;br /&gt;
[[File:Chrome_Fido2_3.png|center|400px|thumb|Enter new PIN]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. PIN Created Successfully:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Step 2: Create an SSH Key ==&lt;br /&gt;
&lt;br /&gt;
This creates a non-discoverable FIDO2 SSH key. The private key material is wrapped/encrypted with a secret stored on your security key - the security key is required for every authentication, but the actual key credentials are stored on your computer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; For keys stored directly on the security key (resident/discoverable keys), see the [https://gitlab.rz.uni-freiburg.de/escience-public/yubikey#creating-discoverable-ssh-keys resident keys documentation].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Connect your FIDO2 security key&#039;&#039;&#039; and create a new SSH key. Optional: Choose a descriptive filename like &amp;lt;code&amp;gt;id_ed25519_sk_bwunicluster&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;id_ed25519_sk_nemo2&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh-keygen -t ed25519-sk -f ~/.ssh/id_ed25519_sk_bwunicluster&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When prompted:&lt;br /&gt;
* &#039;&#039;&#039;Enter PIN:&#039;&#039;&#039; First, you&#039;ll be asked to enter your FIDO2 PIN (the one you set in Step 1)&lt;br /&gt;
* &#039;&#039;&#039;Passphrase:&#039;&#039;&#039; Press Enter to skip - the key is protected by requiring physical security key presence&lt;br /&gt;
* &#039;&#039;&#039;Touch your security key:&#039;&#039;&#039; The key will blink or light up - touch it to confirm&lt;br /&gt;
&lt;br /&gt;
Two files are created:&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.ssh/id_ed25519_sk_bwunicluster&amp;lt;/code&amp;gt; - key handle (encrypted credentials that require the security key)&lt;br /&gt;
* &amp;lt;code&amp;gt;~/.ssh/id_ed25519_sk_bwunicluster.pub&amp;lt;/code&amp;gt; - public key (this is what you&#039;ll upload)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Want keys stored on the security key itself?&#039;&#039;&#039; See [https://gitlab.rz.uni-freiburg.de/escience-public/yubikey#creating-discoverable-ssh-keys resident keys documentation] for discoverable keys that can be copied to any machine.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Register Your Public Key ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #17a2b8; padding: 15px; background-color: #d1ecf1; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;FIDO2 SSH Keys work immediately - no pre-login required!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Unlike regular SSH keys, FIDO2 keys do not need to be unlocked by first logging in with password and TOTP.&lt;br /&gt;
They work as soon as you register them as &#039;&#039;&#039;Interactive Keys&#039;&#039;&#039; and are valid for &#039;&#039;&#039;720 days&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For bwUniCluster 3.0 and bwForCluster NEMO 2:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. View your public key:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat ~/.ssh/id_ed25519_sk_bwunicluster.pub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Copy the complete output (starts with &amp;lt;code&amp;gt;sk-ssh-ed25519@openssh.com&amp;lt;/code&amp;gt; for ED25519-SK, or &amp;lt;code&amp;gt;sk-ecdsa-sha2-nistp256@openssh.com&amp;lt;/code&amp;gt; for ECDSA-SK)&lt;br /&gt;
&lt;br /&gt;
3. Follow the [[Registration/SSH#Adding_a_new_SSH_Key|SSH Key Registration Guide]] to:&lt;br /&gt;
* Add your public key in bwIDM/bwServices&lt;br /&gt;
* Register it as an &#039;&#039;&#039;Interactive Key&#039;&#039;&#039; for your cluster&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;That&#039;s it!&#039;&#039;&#039; You can connect immediately - no 2FA unlock needed.&lt;br /&gt;
&lt;br /&gt;
== Step 4: Connect with Your Security Key ==&lt;br /&gt;
&lt;br /&gt;
After registering your key as an &#039;&#039;&#039;Interactive Key&#039;&#039;&#039; in bwIDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh -i ~/.ssh/id_ed25519_sk_bwunicluster your_username@bwunicluster.scc.kit.edu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What to expect:&#039;&#039;&#039;&lt;br /&gt;
1. Your security key will blink or light up&lt;br /&gt;
2. Touch it to authenticate&lt;br /&gt;
3. You&#039;re logged in - no password needed!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; Add your key to &amp;lt;code&amp;gt;~/.ssh/config&amp;lt;/code&amp;gt; to avoid typing the &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; option every time:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host bwuni bwunicluster.scc.kit.edu&lt;br /&gt;
  HostName bwunicluster.scc.kit.edu&lt;br /&gt;
  User fr_user1234&lt;br /&gt;
  IdentityFile ~/.ssh/id_ed25519_sk_bwunicluster&lt;br /&gt;
&lt;br /&gt;
Host nemo2 login.nemo.uni-freiburg.de&lt;br /&gt;
  HostName login.nemo.uni-freiburg.de&lt;br /&gt;
  User fr_user1234&lt;br /&gt;
  IdentityFile ~/.ssh/id_ed25519_sk_nemo2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then simply connect with: &amp;lt;code&amp;gt;ssh bwuni&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ssh nemo2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [https://gitlab.rz.uni-freiburg.de/escience-public/yubikey#ssh-configuration-for-fido2-secured-ssh-keys SSH config examples] for more advanced configurations.&lt;br /&gt;
&lt;br /&gt;
= Advanced Topics =&lt;br /&gt;
&lt;br /&gt;
== Using Multiple Security Keys (Optional) ==&lt;br /&gt;
&lt;br /&gt;
Having backup security keys adds convenience - you can switch between devices without reconfiguring.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you lose your security key, you can still access the cluster using regular SSH keys (with 2FA unlock) or password login with TOTP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setup:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Create a key on your first security key: &amp;lt;code&amp;gt;id_ed25519_sk_key1&amp;lt;/code&amp;gt;&lt;br /&gt;
2. Create another key on your second security key: &amp;lt;code&amp;gt;id_ed25519_sk_key2&amp;lt;/code&amp;gt;&lt;br /&gt;
3. Register &#039;&#039;&#039;both public keys&#039;&#039;&#039; in bwIDM as Interactive Keys&lt;br /&gt;
4. Configure &amp;lt;code&amp;gt;~/.ssh/config&amp;lt;/code&amp;gt; with multiple identities:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host bwunicluster.scc.kit.edu uc*.scc.kit.edu login*.nemo.uni-freiburg.de&lt;br /&gt;
  User fr_user1234&lt;br /&gt;
  IdentityFile ~/.ssh/id_ed25519_sk_key1&lt;br /&gt;
  IdentityFile ~/.ssh/id_ed25519_sk_key2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SSH will automatically try each key until it finds one with a connected security key.&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Common Issues:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Key not working?&#039;&#039;&#039; &lt;br /&gt;
** Make sure your security key is plugged in&lt;br /&gt;
** Try unplugging and re-plugging the security key&lt;br /&gt;
** Check if the key is blinking or lit up (requires touch)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Command not found?&#039;&#039;&#039; &lt;br /&gt;
** Install &amp;lt;code&amp;gt;yubikey-manager&amp;lt;/code&amp;gt; (for Yubikey command-line setup only):&lt;br /&gt;
*** Debian/Ubuntu: &amp;lt;code&amp;gt;sudo apt install yubikey-manager&amp;lt;/code&amp;gt;&lt;br /&gt;
*** Fedora/RHEL/Rocky/Alma: &amp;lt;code&amp;gt;sudo dnf install yubikey-manager&amp;lt;/code&amp;gt;&lt;br /&gt;
** Install &amp;lt;code&amp;gt;openssh-client&amp;lt;/code&amp;gt; if missing&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Old OpenSSH?&#039;&#039;&#039; &lt;br /&gt;
** Check version: &amp;lt;code&amp;gt;ssh -V&amp;lt;/code&amp;gt;&lt;br /&gt;
** Update to version 8.2 or newer&lt;br /&gt;
** On older systems, consider using a newer OpenSSH version or upgrade your OS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;invalid format&amp;quot; or &amp;quot;unknown key type&amp;quot;?&#039;&#039;&#039;&lt;br /&gt;
** Your OpenSSH version is too old (needs 8.2+)&lt;br /&gt;
** The cluster doesn&#039;t support FIDO2 keys (only bwUniCluster 3.0 and NEMO 2)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PIN locked after too many attempts?&#039;&#039;&#039;&lt;br /&gt;
** Reset FIDO2 PIN: See [[#Step_1:_Set_up_your_FIDO2_Security_Key|Step 1]]&lt;br /&gt;
&lt;br /&gt;
= Learn More =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cluster-Specific Documentation:&#039;&#039;&#039;&lt;br /&gt;
* [[Registration/SSH|Complete SSH Key Registration Guide for bwUniCluster/bwForCluster]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yubikey &amp;amp; FIDO2 SSH Documentation:&#039;&#039;&#039;&lt;br /&gt;
* [https://gitlab.rz.uni-freiburg.de/escience-public/yubikey Comprehensive Yubikey Guide] - Setup, configuration, troubleshooting&lt;br /&gt;
** [https://gitlab.rz.uni-freiburg.de/escience-public/yubikey#creating-discoverable-ssh-keys Resident Keys] - Store keys directly on Yubikey&lt;br /&gt;
** [https://gitlab.rz.uni-freiburg.de/escience-public/yubikey#ssh-configuration-for-fido2-secured-ssh-keys SSH Config Examples] - Automate your SSH connections&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Official Yubico Documentation:&#039;&#039;&#039;&lt;br /&gt;
* [https://developers.yubico.com/SSH/Securing_SSH_with_FIDO2.html Securing SSH with FIDO2] - Technical deep dive&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Registration/SSH&amp;diff=16109</id>
		<title>Registration/SSH</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Registration/SSH&amp;diff=16109"/>
		<updated>2026-05-28T16:12:33Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= SSH Key Authentication for HPC Clusters =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SSH Keys&#039;&#039;&#039; allow you to log into a system without entering a password. Instead of proving your identity with something you know (a password), you prove it with something you have (a cryptographic key).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|+ SSH Key Management Methods by Cluster&lt;br /&gt;
|-&lt;br /&gt;
! Cluster&lt;br /&gt;
! Management Method&lt;br /&gt;
! Details&lt;br /&gt;
|-&lt;br /&gt;
| bwUniCluster 3.0&lt;br /&gt;
| style=&amp;quot;background-color:#90EE90;&amp;quot; | bwIDM Portal&lt;br /&gt;
| Centralized key management, 180-day validity (720-day for FIDO2 SK keys)&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster BinAC 2&lt;br /&gt;
| style=&amp;quot;background-color:#FFE4B5;&amp;quot; | ~/.ssh/authorized_keys&lt;br /&gt;
| Self-managed, use ssh-copy-id&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster Helix&lt;br /&gt;
| style=&amp;quot;background-color:#90EE90;&amp;quot; | bwServices Portal&lt;br /&gt;
| Centralized key management, 180-day validity&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster JUSTUS 2&lt;br /&gt;
| style=&amp;quot;background-color:#FFE4B5;&amp;quot; | ~/.ssh/authorized_keys&lt;br /&gt;
| Self-managed, use ssh-copy-id&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster NEMO 2&lt;br /&gt;
| style=&amp;quot;background-color:#90EE90;&amp;quot; | bwIDM Portal&lt;br /&gt;
| Centralized key management, 180-day validity (720-day for FIDO2 SK keys)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Choose your cluster below:&#039;&#039;&#039;&lt;br /&gt;
* [[#SSH_Keys_on_BinAC_2_and_JUSTUS_2|BinAC 2 and JUSTUS 2]] - Self-managed keys&lt;br /&gt;
* [[#SSH_Keys_via_bwIDM.2FbwServices|bwUniCluster 3.0, Helix, and NEMO2]] - Centralized management&lt;br /&gt;
&lt;br /&gt;
= SSH Keys on BinAC 2 and JUSTUS 2 =&lt;br /&gt;
&lt;br /&gt;
On &#039;&#039;&#039;bwForCluster BinAC 2&#039;&#039;&#039; and &#039;&#039;&#039;bwForCluster JUSTUS 2&#039;&#039;&#039;, you manage SSH keys yourself using the standard &amp;lt;code&amp;gt;~/.ssh/authorized_keys&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
== Quick Setup with ssh-copy-id ==&lt;br /&gt;
&lt;br /&gt;
The easiest method to add your SSH key:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1: Generate an SSH key&#039;&#039;&#039; (if you don&#039;t have one):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh-keygen -t ed25519 -C &amp;quot;your_email@example.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Press Enter to accept the default location, then set a strong passphrase.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2: Copy your key to the cluster:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For BinAC2:&lt;br /&gt;
ssh-copy-id username@login.binac2.uni-tuebingen.de&lt;br /&gt;
&lt;br /&gt;
# For JUSTUS2:&lt;br /&gt;
ssh-copy-id username@justus2.uni-ulm.de&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enter your service password and OTP when prompted. Your public key will be automatically added to &amp;lt;code&amp;gt;~/.ssh/authorized_keys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 3: Test your connection:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For BinAC2:&lt;br /&gt;
ssh username@login.binac2.uni-tuebingen.de&lt;br /&gt;
&lt;br /&gt;
# For JUSTUS2:&lt;br /&gt;
ssh username@justus2.uni-ulm.de&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should now be able to log in using your SSH key and OTP.&lt;br /&gt;
&lt;br /&gt;
== Manual Setup (Alternative) ==&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;ssh-copy-id&amp;lt;/code&amp;gt; is not available on your system:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 1: Display your public key:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat ~/.ssh/id_ed25519.pub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy the entire output.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 2: Log into the cluster&#039;&#039;&#039; using your service password and OTP&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Step 3: Add the key to authorized_keys:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p ~/.ssh&lt;br /&gt;
chmod 700 ~/.ssh&lt;br /&gt;
echo &amp;quot;paste-your-public-key-here&amp;quot; &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;paste-your-public-key-here&amp;lt;/code&amp;gt; with your actual public key.&lt;br /&gt;
&lt;br /&gt;
= SSH Keys via bwIDM/bwServices =&lt;br /&gt;
&lt;br /&gt;
On &#039;&#039;&#039;bwUniCluster 3.0&#039;&#039;&#039;, &#039;&#039;&#039;bwForCluster Helix&#039;&#039;&#039;, and &#039;&#039;&#039;bwForCluster NEMO 2&#039;&#039;&#039;, SSH keys are managed centrally through the registration service.&lt;br /&gt;
&lt;br /&gt;
== Why Centralized Management? ==&lt;br /&gt;
&lt;br /&gt;
Centralized SSH key management provides:&lt;br /&gt;
&lt;br /&gt;
* Security enforcement: Keys must use strong algorithms; regular keys have 180-day validity, FIDO2 SK keys have 720-day validity&lt;br /&gt;
* Centralized control: Review and revoke all keys from one location&lt;br /&gt;
* Two key types: Interactive keys (manual logins) and Command keys (automated workflows)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Self-managed &amp;lt;code&amp;gt;~/.ssh/authorized_keys&amp;lt;/code&amp;gt; files are ignored on these clusters.&lt;br /&gt;
&lt;br /&gt;
== Supported Key Types ==&lt;br /&gt;
&lt;br /&gt;
=== Standard SSH Keys ===&lt;br /&gt;
&lt;br /&gt;
* ED25519: 256 bits (recommended)&lt;br /&gt;
* RSA: 2048 bits or more&lt;br /&gt;
* ECDSA: 521 bits&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Always protect your private keys with a strong passphrase.&lt;br /&gt;
&lt;br /&gt;
=== FIDO2 Hardware Keys ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ED25519-SK&#039;&#039;&#039; and &#039;&#039;&#039;ECDSA-SK&#039;&#039;&#039; keys use hardware security keys (like Yubikey or Feitian ePass FIDO A4B) for authentication:&lt;br /&gt;
&lt;br /&gt;
* Valid for &#039;&#039;&#039;720 days&#039;&#039;&#039; - no frequent re-registration needed&lt;br /&gt;
* No pre-login required - no need to first unlock with password and TOTP&lt;br /&gt;
* Hardware-protected - private key never leaves the device&lt;br /&gt;
* Physical presence required - must touch key to authenticate&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|+ FIDO2 Key Support by Cluster&lt;br /&gt;
|-&lt;br /&gt;
! Cluster&lt;br /&gt;
! SK Support (ED25519-SK / ECDSA-SK)&lt;br /&gt;
|-&lt;br /&gt;
| bwUniCluster 3.0&lt;br /&gt;
| style=&amp;quot;background-color:#90EE90;&amp;quot; | ✓ Supported&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster Helix&lt;br /&gt;
| style=&amp;quot;background-color:#FFB6C1;&amp;quot; | ✗ Not supported&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster NEMO 2&lt;br /&gt;
| style=&amp;quot;background-color:#90EE90;&amp;quot; | ✓ Supported&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Get started:&#039;&#039;&#039; See [[Registration/SSH/SSH-FIDO2-Quick-Start|SSH with FIDO2 - Quick Start Guide]]&lt;br /&gt;
&lt;br /&gt;
== Step 1: Add Your SSH Key to the Portal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; background-color: #fff3cd; margin: 10px 0px 10px 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;padding-left: 5px; margin: 0px;&amp;quot;&amp;gt;&#039;&#039;&#039;Important:&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
* Regular SSH keys are valid for &#039;&#039;&#039;180 days&#039;&#039;&#039; and automatically revoked after expiration. FIDO2 hardware keys (SK) are valid for &#039;&#039;&#039;720 days&#039;&#039;&#039;.&lt;br /&gt;
* Upload only your &#039;&#039;&#039;public key&#039;&#039;&#039; file (ending in &amp;lt;code&amp;gt;.pub&amp;lt;/code&amp;gt;, e.g., &amp;lt;code&amp;gt;~/.ssh/id_ed25519.pub&amp;lt;/code&amp;gt;).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Generate an SSH key&#039;&#039;&#039; (if you don&#039;t have one):&lt;br /&gt;
* Run in your local terminal: &amp;lt;pre&amp;gt; ssh-keygen -t ed25519 -C &amp;quot;your_email@example.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Press Enter to accept the default location, then set a strong passphrase.&lt;br /&gt;
* You now have a private key (~/.ssh/id_ed25519) and a public key (~/.ssh/id_ed25519.pub).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Navigate to SSH key management:&#039;&#039;&#039;&lt;br /&gt;
* [https://login.bwidm.de/user/ssh-keys.xhtml bwUniCluster 3.0 / NEMO 2] (bwIDM)&lt;br /&gt;
* [https://bwservices.uni-heidelberg.de/user/ssh-keys.xhtml bwForCluster Helix] (bwServices)&lt;br /&gt;
&lt;br /&gt;
[[File:BwIDM-twofa.png|center|600px|thumb|My SSH Pubkeys page]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Click &amp;quot;Add SSH Key&amp;quot; / &amp;quot;SSH Key Hochladen&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Bwunicluster 2.0 access ssh keys empty.png|center|400px|thumb|Add SSH Key button]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Enter key details:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Name:&#039;&#039;&#039; Descriptive identifier (e.g., &amp;quot;laptop-work&amp;quot;, &amp;quot;desktop-home&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;SSH Key:&#039;&#039;&#039; Paste complete contents of your &amp;lt;code&amp;gt;.pub&amp;lt;/code&amp;gt; file&lt;br /&gt;
* Click &#039;&#039;&#039;Add&#039;&#039;&#039; / &#039;&#039;&#039;Hinzufügen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Ssh-key.png|center|400px|thumb|Add SSH key dialog]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Your key appears in the list:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Ssh-success.png|center|600px|thumb|SSH key successfully added]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6. Bind your key to a cluster&#039;&#039;&#039; as either an [[#Step_2A:_Register_Interactive_Key|Interactive Key]] or [[#Step_2B:_Register_Command_Key|Command Key]].&lt;br /&gt;
&lt;br /&gt;
== Step 2A: Register Interactive Key ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interactive Keys&#039;&#039;&#039; are for manual SSH logins.&lt;br /&gt;
&lt;br /&gt;
=== Understanding Key Validity ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regular SSH Keys&#039;&#039;&#039; (RSA, ECDSA, ED25519):&lt;br /&gt;
* Require 2-factor authentication unlock&lt;br /&gt;
* Valid for limited hours after entering OTP + service password&lt;br /&gt;
* Must re-authenticate when validity expires&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|+ Validity Periods for Regular SSH Keys&lt;br /&gt;
|-&lt;br /&gt;
! Cluster&lt;br /&gt;
! Valid Duration&lt;br /&gt;
|-&lt;br /&gt;
| bwUniCluster 3.0&lt;br /&gt;
| 8 hours&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster Helix&lt;br /&gt;
| 12 hours&lt;br /&gt;
|-&lt;br /&gt;
| bwForCluster NEMO 2&lt;br /&gt;
| 12 hours&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FIDO2 Hardware Keys&#039;&#039;&#039; (ED25519-SK, ECDSA-SK):&lt;br /&gt;
* Valid for &#039;&#039;&#039;720 days&#039;&#039;&#039; - no re-authentication needed&lt;br /&gt;
* No pre-login required - no password/TOTP unlock needed&lt;br /&gt;
* Authentication via physical key touch only&lt;br /&gt;
* Only on bwUniCluster 3.0 and NEMO 2 (not Helix)&lt;br /&gt;
* See [[Registration/SSH/SSH-FIDO2-Quick-Start|SSH with FIDO2 - Quick Start Guide]]&lt;br /&gt;
&lt;br /&gt;
=== Registration Steps ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Add your public key&#039;&#039;&#039; following [[#Step_1:_Add_Your_SSH_Key_to_the_Portal|Step 1]] above&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Navigate to &amp;quot;Registered Services&amp;quot; / &amp;quot;Registrierte Dienste&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Click &#039;&#039;&#039;Set SSH Key&#039;&#039;&#039; / &#039;&#039;&#039;SSH Key setzen&#039;&#039;&#039; for your cluster&lt;br /&gt;
&lt;br /&gt;
[[File:BwIDM-registered.png|center|600px|thumb|Select cluster]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Find your key and click &amp;quot;Add&amp;quot; / &amp;quot;Hinzufügen&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Ssh-service-int.png|center|800px|thumb|Add SSH key to service]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Select &amp;quot;Interactive&amp;quot; and confirm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Usage type: &#039;&#039;&#039;Interactive&#039;&#039;&#039;&lt;br /&gt;
* Comment: Optional description&lt;br /&gt;
* Click &#039;&#039;&#039;Add&#039;&#039;&#039; / &#039;&#039;&#039;Hinzufügen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Ssh-int.png|center|600px|thumb|Set as Interactive key]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Done!&#039;&#039;&#039; Your key is active for interactive logins&lt;br /&gt;
&lt;br /&gt;
[[File:Ssh-service.png|center|800px|thumb|SSH key registered]]&lt;br /&gt;
&lt;br /&gt;
== Step 2B: Register Command Key ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Command Keys&#039;&#039;&#039; enable automated workflows (e.g., backups, data transfers) without manual login.&lt;br /&gt;
&lt;br /&gt;
=== Security Requirements ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
Command keys are &#039;&#039;&#039;always valid&#039;&#039;&#039; (no 2FA required), making them security-sensitive.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mandatory restrictions:&#039;&#039;&#039;&lt;br /&gt;
* Single command: Specify exact command with full path&lt;br /&gt;
* IP restriction: Limit to specific IP address(es) or subnet&lt;br /&gt;
* Admin approval: Keys require review before activation&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Common use case:&#039;&#039;&#039; [[Registration/SSH/rrsync|rrsync for data transfers]]&lt;br /&gt;
&lt;br /&gt;
=== Registration Steps ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Add your public key&#039;&#039;&#039; following [[#Step_1:_Add_Your_SSH_Key_to_the_Portal|Step 1]] above&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Navigate to &amp;quot;Registered Services&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Click &#039;&#039;&#039;Set SSH Key&#039;&#039;&#039; for your cluster&lt;br /&gt;
&lt;br /&gt;
[[File:BwIDM-registered.png|center|600px|thumb|Select cluster]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Find your key and click &amp;quot;Add&amp;quot; / &amp;quot;Hinzufügen&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Ssh-service-com.png|center|800px|thumb|Add SSH key to service]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Configure command restrictions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Usage type:&#039;&#039;&#039; Select &#039;&#039;&#039;Command&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Command:&#039;&#039;&#039; Full path with parameters (see example below)&lt;br /&gt;
* &#039;&#039;&#039;From:&#039;&#039;&#039; IP address or CIDR notation (e.g., &amp;lt;code&amp;gt;192.168.1.0/24&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;Comment:&#039;&#039;&#039; Explain purpose (speeds up approval)&lt;br /&gt;
* Click &#039;&#039;&#039;Add&#039;&#039;&#039; / &#039;&#039;&#039;Hinzufügen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Example: rrsync for data transfer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;/usr/local/bin/rrsync -ro /home/aa/aa_bb/aa_abc1/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Verify exact path on your cluster (may be &amp;lt;code&amp;gt;/usr/bin/rrsync&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:Ssh-com.png|center|600px|thumb|Configure command key]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Wait for approval&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Ssh-service.png|center|800px|thumb|Key pending approval]]&lt;br /&gt;
&lt;br /&gt;
== Revoking SSH Keys ==&lt;br /&gt;
&lt;br /&gt;
Revoke keys that are no longer needed or potentially compromised.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #6c757d; padding: 15px; background-color: #e2e3e5; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Revoked keys are immediately disabled and cannot be reused.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Navigate to SSH key management:&#039;&#039;&#039;&lt;br /&gt;
* [https://login.bwidm.de/user/ssh-keys.xhtml bwUniCluster 3.0 / NEMO 2] (bwIDM)&lt;br /&gt;
* [https://bwservices.uni-heidelberg.de/user/ssh-keys.xhtml bwForCluster Helix] (bwServices)&lt;br /&gt;
&lt;br /&gt;
[[File:BwIDM-twofa.png|center|600px|thumb|My SSH Pubkeys page]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Click &amp;quot;REVOKE&amp;quot; / &amp;quot;ZURÜCKZIEHEN&amp;quot;&#039;&#039;&#039; next to the key you want to disable&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Click &#039;&#039;&#039;REVOKE&#039;&#039;&#039; / &#039;&#039;&#039;ZURÜCKZIEHEN&#039;&#039;&#039; next to the key you want to disable&lt;br /&gt;
&lt;br /&gt;
[[File:Ssh-success.png|center|800px|thumb|Revoke SSH key]]&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2&amp;diff=16103</id>
		<title>NEMO2</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2&amp;diff=16103"/>
		<updated>2026-05-22T18:12:46Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Serverraum-2024-09.jpg|center|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;bwForCluster NEMO 2&#039;&#039;&#039; is dedicated to research in the bwHPC domains Neuroscience, Elementary Particle Physics, Microsystems Engineering and Material Science (NEMO).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[Status: Major Outage] bwForCluster NEMO 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
NEMO2 is currently offline. A power outage damaged the cluster&#039;s UPS, causing an abrupt shutdown of our core infrastructure and parallel storage.&lt;br /&gt;
&lt;br /&gt;
We hope to restore service tomorrow, we cannot guarantee a specific timeline yet. We will provide another update as soon as more information is available.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{| style=&amp;quot;  background:#ffa833; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f80; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | NEMO1 Migration&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* Still using NEMO1: &#039;&#039;&#039;[[NEMO1|Go To NEMO1 Legacy Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Users of NEMO1 must&#039;&#039;&#039; [[Registration/bwForCluster/NEMO2|&#039;&#039;&#039;re-register for NEMO2&#039;&#039;&#039;]] (only step C necessary). You keep your existing projects (Rechenvorhaben).&lt;br /&gt;
* &#039;&#039;&#039;[[NEMO2/Migrate NEMO1 workspaces to NEMO2 workspaces|Migrate NEMO1 workspaces to NEMO2 workspaces]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[NEMO2/Migrate Moab to Slurm jobs|Migrate Moab to Slurm jobs]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#ffa833; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f80; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Maintenance&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;strong&amp;gt;[https://www.nemo.uni-freiburg.de/nemo/stat/ Scheduled Power Maintenance 09.04.2024]&amp;lt;/strong&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#FEF4AB; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#FFE856; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | News and Events&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [https://www.nemo.uni-freiburg.de/news/ NEMO News]&lt;br /&gt;
* [https://www.nemo.uni-freiburg.de/nemo/stat/ NEMO Status, Usage and (Maintenance) Announcements]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#eeeefe; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Training &amp;amp; Support&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [[NEMO2/Start|Getting Started]]&lt;br /&gt;
* [https://training.bwhpc.de E-Learning Courses]&lt;br /&gt;
* Contact and [[NEMO2/Support|Support]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | User Documentation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[Registration]] for one of the bwHPC clusters&lt;br /&gt;
* [[NEMO2/Login|Login]]&lt;br /&gt;
* [[NEMO2/Hardware|Hardware and Architecture]]&lt;br /&gt;
* [[NEMO2/Hardware#File_Systems|File Systems]]&lt;br /&gt;
** [[NEMO2/Workspaces|Workspaces]]&lt;br /&gt;
** [[NEMO2/SDS_hd|Using SDS@hd on NEMO2]]&lt;br /&gt;
* Cluster Specific Software:&lt;br /&gt;
** [[NEMO2/Modules|Available Modules (Wiki)]] or [https://www.nemo.uni-freiburg.de/easybuild-modules/ Available Modules (HTML, incl. search)] on NEMO2&lt;br /&gt;
** [[NEMO2/Easybuild Modules|Easybuild Modules]] (hints for building your own software!)&lt;br /&gt;
** [[Conda]]&lt;br /&gt;
** [[NEMO2/Containers|Containers]] (Enroot and Apptainer/Singularity)&lt;br /&gt;
* [[NEMO2/Slurm|Submitting and managing Jobs with Slurm]] ([[HPC_Glossary#Batch_System|Batch System]])&lt;br /&gt;
* [[Development]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#e6e9eb; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#d1dadf; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Cluster Funding&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Please [[NEMO2/Acknowledgement|acknowledge]] the NEMO2 in your publications.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Main_Page&amp;diff=16102</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Main_Page&amp;diff=16102"/>
		<updated>2026-05-22T18:11:55Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size:140%;&amp;gt;&#039;&#039;&#039;Welcome to the bwHPC Wiki.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bwHPC represents services and resources in the State of &#039;&#039;&#039;B&#039;&#039;&#039;aden-&#039;&#039;&#039;W&#039;&#039;&#039;ürttemberg, Germany, for High Performance Computing (&#039;&#039;&#039;HPC&#039;&#039;&#039;), Data Intensive Computing (&#039;&#039;&#039;DIC&#039;&#039;&#039;) and Large Scale Scientific Data Management (&#039;&#039;&#039;LS2DM&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
The main bwHPC web page is at &#039;&#039;&#039;[https://www.bwhpc.de/ https://www.bwhpc.de/]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Many topics depend on the cluster system you use. &lt;br /&gt;
First choose the cluster you use,  then select the correct topic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- bwHPC STATUS START --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{Template:Status|warn|Status: Jobs suspended on Justus 2}}--&amp;gt;&lt;br /&gt;
{{Template:Status|ok|&#039;&#039;&#039;Status:&#039;&#039;&#039; Ok}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Template usage examples: color ok(green),warn(yellow),alert(red). Enter custom text in 3rd field&lt;br /&gt;
{{Template:Status|ok|Status: Ok}}&lt;br /&gt;
{{Template:Status|warn|Status: maintenance upcoming}}&lt;br /&gt;
{{Template:Status|alert|Status: bwUniCluster down}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- bwHPC STATUS END --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot; background:#eeeefe; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold; text-align:left&amp;quot; | Courses / eLearning&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [https://training.bwhpc.de/ eLearning and Online Courses]&lt;br /&gt;
* [https://hpc-wiki.info/hpc/Introduction_to_Linux_in_HPC Introduction to Linux in HPC (external resource)]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold; text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  Need Access to a Cluster?&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[When to use an HPC Cluster]]&lt;br /&gt;
* [[Running Calculations]]&lt;br /&gt;
* [[Registration]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  HPC System Specific Documentation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
bwHPC encompasses several HPC compute clusters at different universities in Baden-Württemberg. Each cluster is dedicated to [https://www.bwhpc.de/bwhpc-domains.php specific research domains]. &lt;br /&gt;
 &lt;br /&gt;
Documentation differs between compute clusters, please see cluster specific overview pages:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[BwUniCluster3.0|bwUniCluster 3.0]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | General Purpose, Teaching&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[BinAC2|bwForCluster BinAC 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Bioinformatics, Astrophysics, Geosciences, Pharmacy, and Medical Informatics&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot; | [[Helix|bwForCluster Helix]]&lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  |   Structural and Systems Biology, Medical Science, Soft Matter, Computational Humanities, and Mathematics and Computer Science&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[:JUSTUS2| bwForCluster JUSTUS 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Theoretical Chemistry, Condensed Matter Physics, and Quantum Sciences&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[NEMO2|bwForCluster NEMO 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Neurosciences, Particle Physics, Materials Science, and Microsystems Engineering&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|bwHPC Clusters: [https://www.bwhpc.de/cluster.php operational status] &lt;br /&gt;
Further Compute Clusters in Baden-Württemberg (separate access policies):&lt;br /&gt;
* [[DACHS | Datenanalyse Cluster der Hochschulen (DACHS)]]&lt;br /&gt;
* bwHPC tier 1: [https://kb.hlrs.de/platforms/index.php/Hunter_(HPE) Hunter] ([https://www.hlrs.de/apply-for-computing-time getting access])&lt;br /&gt;
* bwHPC tier 2: [https://www.nhr.kit.edu/userdocs/horeka HoreKa] ([https://www.nhr.kit.edu/userdocs/horeka/projects/ getting access])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold; text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  Documentation valid for all Clusters&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[Environment Modules| Software Environment Modules]]: usage of preexisting software&lt;br /&gt;
* [https://www.bwhpc.de/software.html List of Software] on all clusters&lt;br /&gt;
* [[Data Transfer|Data Transfer]]: working with files [[File:Notebook.svg|x15px]] &amp;lt;---&amp;gt; [[File:Clusternodes.svg|x15px]]&lt;br /&gt;
* [[Development| Development]]: software, programming languages, parallel pogramming&lt;br /&gt;
* [[Energy Efficient Cluster Usage | (Energy) Efficient Cluster Usage]] for low waiting times and fast running jobs&lt;br /&gt;
* [[HPC Glossary]]&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | [[File:Storage_small.svg|x15px]]  Scientific Data Storage&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
User guides of available scientific data storage services:&lt;br /&gt;
* [[SDS@hd]]: Everyone can join existing storage projects, entitlement needed for creating your own, [https://sds-hd.urz.uni-heidelberg.de/management/shib/sds_costs.php cost sheet]&lt;br /&gt;
* [https://uni-tuebingen.de/einrichtungen/zentrum-fuer-datenverarbeitung/projekte/laufende-projekte/bwsfs bwSFS]&lt;br /&gt;
Associated, but local scientific storage services are:&lt;br /&gt;
* [https://wiki.scc.kit.edu/lsdf/index.php/Category:LSDF_Online_Storage LSDF Online Storage] (only for KIT and KIT partners)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | [[File:Storage_small.svg|x15px]]  Scientific Data Archiving&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
For user guides of the scientific data archiving services:&lt;br /&gt;
* [https://www.rda.kit.edu/english bwDataArchive]: Open to all scientists at KIT and institutions in Baden-Württemberg that have signed a service agreement with KIT&lt;br /&gt;
Associated, but local archiving services for scientific data are:&lt;br /&gt;
* [https://www.urz.uni-heidelberg.de/de/service-katalog/speicher/heiarchive heiARCHIVE] (only for members of Heidelberg University)&lt;br /&gt;
For instructions on how to move the data, depending on the offered connections, can be found under [[Data Transfer | Data Transfer]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | Research Data Management&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [https://www.forschungsdaten.org/index.php/FDM-Kontakte#Deutschland Research Data Management (RDM)] contact persons&lt;br /&gt;
* [https://www.forschungsdaten.info Portal for Research Data Management] (Forschungsdaten.info)&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;  background:#eeeefe; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Support&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [[BwSupportPortal|Submit a Ticket in our Support Portal]]&lt;br /&gt;
Support is provided by the [https://www.bwhpc.de/teams.php bwHPC Competence Centers]:&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;  background:#e6e9eb; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#d1dadf; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Acknowledgement&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* Please [[Acknowledgement|acknowledge]] our resources in your publications.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16101</id>
		<title>Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16101"/>
		<updated>2026-05-22T18:11:27Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Current Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= bwHPC Cluster and Service Status Page =&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{Template:Status|warn|Status: Jobs suspended on Justus 2}}&lt;br /&gt;
Due to work on the power supply of the cooling system all jobs have been suspended to prevent overheating.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Status|ok|&#039;&#039;&#039;Status:&#039;&#039;&#039; Normal operation of all systems}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Template usage examples: color ok(green),warn(yellow),alert(red). Enter custom text in 3rd field&lt;br /&gt;
{{Template:Status|ok|Status: Ok}}&lt;br /&gt;
{{Template:Status|warn|Status: maintenance upcoming}}&lt;br /&gt;
{{Template:Status|alert|Status: bwUniCluster down}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relevant Old Messages ==&lt;br /&gt;
None&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16100</id>
		<title>Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16100"/>
		<updated>2026-05-21T18:50:13Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= bwHPC Cluster and Service Status Page =&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{Template:Status|warn|Status: Jobs suspended on Justus 2}}&lt;br /&gt;
Due to work on the power supply of the cooling system all jobs have been suspended to prevent overheating.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Template:Status|ok|&#039;&#039;&#039;Status:&#039;&#039;&#039; Normal operation of all systems}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[Status: Major Outage] bwForCluster NEMO 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
NEMO2 is currently offline. A power outage damaged the cluster&#039;s UPS, causing an abrupt shutdown of our core infrastructure and parallel storage.&lt;br /&gt;
&lt;br /&gt;
We hope to restore service tomorrow, we cannot guarantee a specific timeline yet. We will provide another update as soon as more information is available.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Template usage examples: color ok(green),warn(yellow),alert(red). Enter custom text in 3rd field&lt;br /&gt;
{{Template:Status|ok|Status: Ok}}&lt;br /&gt;
{{Template:Status|warn|Status: maintenance upcoming}}&lt;br /&gt;
{{Template:Status|alert|Status: bwUniCluster down}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relevant Old Messages ==&lt;br /&gt;
None&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2&amp;diff=16099</id>
		<title>NEMO2</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2&amp;diff=16099"/>
		<updated>2026-05-21T18:49:55Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Serverraum-2024-09.jpg|center|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;bwForCluster NEMO 2&#039;&#039;&#039; is dedicated to research in the bwHPC domains Neuroscience, Elementary Particle Physics, Microsystems Engineering and Material Science (NEMO).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[Status: Major Outage] bwForCluster NEMO 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
NEMO2 is currently offline. A power outage damaged the cluster&#039;s UPS, causing an abrupt shutdown of our core infrastructure and parallel storage.&lt;br /&gt;
&lt;br /&gt;
We hope to restore service tomorrow, we cannot guarantee a specific timeline yet. We will provide another update as soon as more information is available.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{| style=&amp;quot;  background:#ffa833; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f80; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | NEMO1 Migration&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* Still using NEMO1: &#039;&#039;&#039;[[NEMO1|Go To NEMO1 Legacy Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Users of NEMO1 must&#039;&#039;&#039; [[Registration/bwForCluster/NEMO2|&#039;&#039;&#039;re-register for NEMO2&#039;&#039;&#039;]] (only step C necessary). You keep your existing projects (Rechenvorhaben).&lt;br /&gt;
* &#039;&#039;&#039;[[NEMO2/Migrate NEMO1 workspaces to NEMO2 workspaces|Migrate NEMO1 workspaces to NEMO2 workspaces]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[NEMO2/Migrate Moab to Slurm jobs|Migrate Moab to Slurm jobs]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#ffa833; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f80; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Maintenance&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;strong&amp;gt;[https://www.nemo.uni-freiburg.de/nemo/stat/ Scheduled Power Maintenance 09.04.2024]&amp;lt;/strong&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#FEF4AB; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#FFE856; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | News and Events&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [https://www.nemo.uni-freiburg.de/news/ NEMO News]&lt;br /&gt;
* [https://www.nemo.uni-freiburg.de/nemo/stat/ NEMO Status, Usage and (Maintenance) Announcements]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#eeeefe; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Training &amp;amp; Support&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [[NEMO2/Start|Getting Started]]&lt;br /&gt;
* [https://training.bwhpc.de E-Learning Courses]&lt;br /&gt;
* Contact and [[NEMO2/Support|Support]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | User Documentation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[Registration]] for one of the bwHPC clusters&lt;br /&gt;
* [[NEMO2/Login|Login]]&lt;br /&gt;
* [[NEMO2/Hardware|Hardware and Architecture]]&lt;br /&gt;
* [[NEMO2/Hardware#File_Systems|File Systems]]&lt;br /&gt;
** [[NEMO2/Workspaces|Workspaces]]&lt;br /&gt;
** [[NEMO2/SDS_hd|Using SDS@hd on NEMO2]]&lt;br /&gt;
* Cluster Specific Software:&lt;br /&gt;
** [[NEMO2/Modules|Available Modules (Wiki)]] or [https://www.nemo.uni-freiburg.de/easybuild-modules/ Available Modules (HTML, incl. search)] on NEMO2&lt;br /&gt;
** [[NEMO2/Easybuild Modules|Easybuild Modules]] (hints for building your own software!)&lt;br /&gt;
** [[Conda]]&lt;br /&gt;
** [[NEMO2/Containers|Containers]] (Enroot and Apptainer/Singularity)&lt;br /&gt;
* [[NEMO2/Slurm|Submitting and managing Jobs with Slurm]] ([[HPC_Glossary#Batch_System|Batch System]])&lt;br /&gt;
* [[Development]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#e6e9eb; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#d1dadf; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Cluster Funding&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Please [[NEMO2/Acknowledgement|acknowledge]] the NEMO2 in your publications.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2&amp;diff=16098</id>
		<title>NEMO2</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2&amp;diff=16098"/>
		<updated>2026-05-21T17:04:50Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Serverraum-2024-09.jpg|center|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;bwForCluster NEMO 2&#039;&#039;&#039; is dedicated to research in the bwHPC domains Neuroscience, Elementary Particle Physics, Microsystems Engineering and Material Science (NEMO).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[Status: Major Outage] bwForCluster NEMO 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
NEMO2 is currently offline. A power outage damaged the cluster&#039;s UPS, causing an abrupt shutdown of our core infrastructure and parallel storage. Compute nodes and storage are completely inaccessible and cannot be started at this time. Comprehensive file system checks are scheduled for tomorrow.&lt;br /&gt;
&lt;br /&gt;
We hope to restore service tomorrow, we cannot guarantee a specific timeline yet. We will provide another update as soon as more information is available. Apologies for the disruption.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{| style=&amp;quot;  background:#ffa833; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f80; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | NEMO1 Migration&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* Still using NEMO1: &#039;&#039;&#039;[[NEMO1|Go To NEMO1 Legacy Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Users of NEMO1 must&#039;&#039;&#039; [[Registration/bwForCluster/NEMO2|&#039;&#039;&#039;re-register for NEMO2&#039;&#039;&#039;]] (only step C necessary). You keep your existing projects (Rechenvorhaben).&lt;br /&gt;
* &#039;&#039;&#039;[[NEMO2/Migrate NEMO1 workspaces to NEMO2 workspaces|Migrate NEMO1 workspaces to NEMO2 workspaces]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[NEMO2/Migrate Moab to Slurm jobs|Migrate Moab to Slurm jobs]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#ffa833; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f80; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Maintenance&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;strong&amp;gt;[https://www.nemo.uni-freiburg.de/nemo/stat/ Scheduled Power Maintenance 09.04.2024]&amp;lt;/strong&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#FEF4AB; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#FFE856; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | News and Events&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [https://www.nemo.uni-freiburg.de/news/ NEMO News]&lt;br /&gt;
* [https://www.nemo.uni-freiburg.de/nemo/stat/ NEMO Status, Usage and (Maintenance) Announcements]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#eeeefe; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Training &amp;amp; Support&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [[NEMO2/Start|Getting Started]]&lt;br /&gt;
* [https://training.bwhpc.de E-Learning Courses]&lt;br /&gt;
* Contact and [[NEMO2/Support|Support]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | User Documentation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[Registration]] for one of the bwHPC clusters&lt;br /&gt;
* [[NEMO2/Login|Login]]&lt;br /&gt;
* [[NEMO2/Hardware|Hardware and Architecture]]&lt;br /&gt;
* [[NEMO2/Hardware#File_Systems|File Systems]]&lt;br /&gt;
** [[NEMO2/Workspaces|Workspaces]]&lt;br /&gt;
** [[NEMO2/SDS_hd|Using SDS@hd on NEMO2]]&lt;br /&gt;
* Cluster Specific Software:&lt;br /&gt;
** [[NEMO2/Modules|Available Modules (Wiki)]] or [https://www.nemo.uni-freiburg.de/easybuild-modules/ Available Modules (HTML, incl. search)] on NEMO2&lt;br /&gt;
** [[NEMO2/Easybuild Modules|Easybuild Modules]] (hints for building your own software!)&lt;br /&gt;
** [[Conda]]&lt;br /&gt;
** [[NEMO2/Containers|Containers]] (Enroot and Apptainer/Singularity)&lt;br /&gt;
* [[NEMO2/Slurm|Submitting and managing Jobs with Slurm]] ([[HPC_Glossary#Batch_System|Batch System]])&lt;br /&gt;
* [[Development]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#e6e9eb; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#d1dadf; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Cluster Funding&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Please [[NEMO2/Acknowledgement|acknowledge]] the NEMO2 in your publications.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16097</id>
		<title>Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16097"/>
		<updated>2026-05-21T17:04:09Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Current Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= bwHPC Cluster and Service Status Page =&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{Template:Status|warn|Status: Jobs suspended on Justus 2}}&lt;br /&gt;
Due to work on the power supply of the cooling system all jobs have been suspended to prevent overheating.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Template:Status|ok|&#039;&#039;&#039;Status:&#039;&#039;&#039; Normal operation of all systems}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[Status: Major Outage] bwForCluster NEMO 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
NEMO2 is currently offline. A power outage damaged the cluster&#039;s UPS, causing an abrupt shutdown of our core infrastructure and parallel storage. Compute nodes and storage are completely inaccessible and cannot be started at this time. Comprehensive file system checks are scheduled for tomorrow.&lt;br /&gt;
&lt;br /&gt;
We hope to restore service tomorrow, we cannot guarantee a specific timeline yet. We will provide another update as soon as more information is available. Apologies for the disruption.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Template usage examples: color ok(green),warn(yellow),alert(red). Enter custom text in 3rd field&lt;br /&gt;
{{Template:Status|ok|Status: Ok}}&lt;br /&gt;
{{Template:Status|warn|Status: maintenance upcoming}}&lt;br /&gt;
{{Template:Status|alert|Status: bwUniCluster down}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relevant Old Messages ==&lt;br /&gt;
None&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Main_Page&amp;diff=16096</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Main_Page&amp;diff=16096"/>
		<updated>2026-05-21T17:02:40Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size:140%;&amp;gt;&#039;&#039;&#039;Welcome to the bwHPC Wiki.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bwHPC represents services and resources in the State of &#039;&#039;&#039;B&#039;&#039;&#039;aden-&#039;&#039;&#039;W&#039;&#039;&#039;ürttemberg, Germany, for High Performance Computing (&#039;&#039;&#039;HPC&#039;&#039;&#039;), Data Intensive Computing (&#039;&#039;&#039;DIC&#039;&#039;&#039;) and Large Scale Scientific Data Management (&#039;&#039;&#039;LS2DM&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
The main bwHPC web page is at &#039;&#039;&#039;[https://www.bwhpc.de/ https://www.bwhpc.de/]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Many topics depend on the cluster system you use. &lt;br /&gt;
First choose the cluster you use,  then select the correct topic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- bwHPC STATUS START --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{Template:Status|warn|Status: Jobs suspended on Justus 2}}--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Template:Status|ok|&#039;&#039;&#039;Status:&#039;&#039;&#039; Ok}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
[[Status|&#039;&#039;&#039;[Status: Major Outage] bwForCluster NEMO 2&#039;&#039;&#039;]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Template usage examples: color ok(green),warn(yellow),alert(red). Enter custom text in 3rd field&lt;br /&gt;
{{Template:Status|ok|Status: Ok}}&lt;br /&gt;
{{Template:Status|warn|Status: maintenance upcoming}}&lt;br /&gt;
{{Template:Status|alert|Status: bwUniCluster down}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- bwHPC STATUS END --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot; background:#eeeefe; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold; text-align:left&amp;quot; | Courses / eLearning&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [https://training.bwhpc.de/ eLearning and Online Courses]&lt;br /&gt;
* [https://hpc-wiki.info/hpc/Introduction_to_Linux_in_HPC Introduction to Linux in HPC (external resource)]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold; text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  Need Access to a Cluster?&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[When to use an HPC Cluster]]&lt;br /&gt;
* [[Running Calculations]]&lt;br /&gt;
* [[Registration]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  HPC System Specific Documentation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
bwHPC encompasses several HPC compute clusters at different universities in Baden-Württemberg. Each cluster is dedicated to [https://www.bwhpc.de/bwhpc-domains.php specific research domains]. &lt;br /&gt;
 &lt;br /&gt;
Documentation differs between compute clusters, please see cluster specific overview pages:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[BwUniCluster3.0|bwUniCluster 3.0]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | General Purpose, Teaching&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[BinAC2|bwForCluster BinAC 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Bioinformatics, Astrophysics, Geosciences, Pharmacy, and Medical Informatics&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot; | [[Helix|bwForCluster Helix]]&lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  |   Structural and Systems Biology, Medical Science, Soft Matter, Computational Humanities, and Mathematics and Computer Science&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[:JUSTUS2| bwForCluster JUSTUS 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Theoretical Chemistry, Condensed Matter Physics, and Quantum Sciences&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[NEMO2|bwForCluster NEMO 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Neurosciences, Particle Physics, Materials Science, and Microsystems Engineering&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|bwHPC Clusters: [https://www.bwhpc.de/cluster.php operational status] &lt;br /&gt;
Further Compute Clusters in Baden-Württemberg (separate access policies):&lt;br /&gt;
* [[DACHS | Datenanalyse Cluster der Hochschulen (DACHS)]]&lt;br /&gt;
* bwHPC tier 1: [https://kb.hlrs.de/platforms/index.php/Hunter_(HPE) Hunter] ([https://www.hlrs.de/apply-for-computing-time getting access])&lt;br /&gt;
* bwHPC tier 2: [https://www.nhr.kit.edu/userdocs/horeka HoreKa] ([https://www.nhr.kit.edu/userdocs/horeka/projects/ getting access])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold; text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  Documentation valid for all Clusters&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[Environment Modules| Software Environment Modules]]: usage of preexisting software&lt;br /&gt;
* [https://www.bwhpc.de/software.html List of Software] on all clusters&lt;br /&gt;
* [[Data Transfer|Data Transfer]]: working with files [[File:Notebook.svg|x15px]] &amp;lt;---&amp;gt; [[File:Clusternodes.svg|x15px]]&lt;br /&gt;
* [[Development| Development]]: software, programming languages, parallel pogramming&lt;br /&gt;
* [[Energy Efficient Cluster Usage | (Energy) Efficient Cluster Usage]] for low waiting times and fast running jobs&lt;br /&gt;
* [[HPC Glossary]]&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | [[File:Storage_small.svg|x15px]]  Scientific Data Storage&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
User guides of available scientific data storage services:&lt;br /&gt;
* [[SDS@hd]]: Everyone can join existing storage projects, entitlement needed for creating your own, [https://sds-hd.urz.uni-heidelberg.de/management/shib/sds_costs.php cost sheet]&lt;br /&gt;
* [https://uni-tuebingen.de/einrichtungen/zentrum-fuer-datenverarbeitung/projekte/laufende-projekte/bwsfs bwSFS]&lt;br /&gt;
Associated, but local scientific storage services are:&lt;br /&gt;
* [https://wiki.scc.kit.edu/lsdf/index.php/Category:LSDF_Online_Storage LSDF Online Storage] (only for KIT and KIT partners)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | [[File:Storage_small.svg|x15px]]  Scientific Data Archiving&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
For user guides of the scientific data archiving services:&lt;br /&gt;
* [https://www.rda.kit.edu/english bwDataArchive]: Open to all scientists at KIT and institutions in Baden-Württemberg that have signed a service agreement with KIT&lt;br /&gt;
Associated, but local archiving services for scientific data are:&lt;br /&gt;
* [https://www.urz.uni-heidelberg.de/de/service-katalog/speicher/heiarchive heiARCHIVE] (only for members of Heidelberg University)&lt;br /&gt;
For instructions on how to move the data, depending on the offered connections, can be found under [[Data Transfer | Data Transfer]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | Research Data Management&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [https://www.forschungsdaten.org/index.php/FDM-Kontakte#Deutschland Research Data Management (RDM)] contact persons&lt;br /&gt;
* [https://www.forschungsdaten.info Portal for Research Data Management] (Forschungsdaten.info)&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;  background:#eeeefe; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Support&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [[BwSupportPortal|Submit a Ticket in our Support Portal]]&lt;br /&gt;
Support is provided by the [https://www.bwhpc.de/teams.php bwHPC Competence Centers]:&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;  background:#e6e9eb; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#d1dadf; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Acknowledgement&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* Please [[Acknowledgement|acknowledge]] our resources in your publications.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Main_Page&amp;diff=16095</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Main_Page&amp;diff=16095"/>
		<updated>2026-05-21T17:00:34Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size:140%;&amp;gt;&#039;&#039;&#039;Welcome to the bwHPC Wiki.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bwHPC represents services and resources in the State of &#039;&#039;&#039;B&#039;&#039;&#039;aden-&#039;&#039;&#039;W&#039;&#039;&#039;ürttemberg, Germany, for High Performance Computing (&#039;&#039;&#039;HPC&#039;&#039;&#039;), Data Intensive Computing (&#039;&#039;&#039;DIC&#039;&#039;&#039;) and Large Scale Scientific Data Management (&#039;&#039;&#039;LS2DM&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
The main bwHPC web page is at &#039;&#039;&#039;[https://www.bwhpc.de/ https://www.bwhpc.de/]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Many topics depend on the cluster system you use. &lt;br /&gt;
First choose the cluster you use,  then select the correct topic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- bwHPC STATUS START --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{Template:Status|warn|Status: Jobs suspended on Justus 2}}--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Template:Status|ok|&#039;&#039;&#039;Status:&#039;&#039;&#039; Ok}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Status|alert|&#039;&#039;&#039;Status: Major Outage bwForCluster NEMO 2}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Template usage examples: color ok(green),warn(yellow),alert(red). Enter custom text in 3rd field&lt;br /&gt;
{{Template:Status|ok|Status: Ok}}&lt;br /&gt;
{{Template:Status|warn|Status: maintenance upcoming}}&lt;br /&gt;
{{Template:Status|alert|Status: bwUniCluster down}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- bwHPC STATUS END --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot; background:#eeeefe; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold; text-align:left&amp;quot; | Courses / eLearning&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [https://training.bwhpc.de/ eLearning and Online Courses]&lt;br /&gt;
* [https://hpc-wiki.info/hpc/Introduction_to_Linux_in_HPC Introduction to Linux in HPC (external resource)]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold; text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  Need Access to a Cluster?&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[When to use an HPC Cluster]]&lt;br /&gt;
* [[Running Calculations]]&lt;br /&gt;
* [[Registration]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  HPC System Specific Documentation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
bwHPC encompasses several HPC compute clusters at different universities in Baden-Württemberg. Each cluster is dedicated to [https://www.bwhpc.de/bwhpc-domains.php specific research domains]. &lt;br /&gt;
 &lt;br /&gt;
Documentation differs between compute clusters, please see cluster specific overview pages:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[BwUniCluster3.0|bwUniCluster 3.0]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | General Purpose, Teaching&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[BinAC2|bwForCluster BinAC 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Bioinformatics, Astrophysics, Geosciences, Pharmacy, and Medical Informatics&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot; | [[Helix|bwForCluster Helix]]&lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  |   Structural and Systems Biology, Medical Science, Soft Matter, Computational Humanities, and Mathematics and Computer Science&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[:JUSTUS2| bwForCluster JUSTUS 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Theoretical Chemistry, Condensed Matter Physics, and Quantum Sciences&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[NEMO2|bwForCluster NEMO 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Neurosciences, Particle Physics, Materials Science, and Microsystems Engineering&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|bwHPC Clusters: [https://www.bwhpc.de/cluster.php operational status] &lt;br /&gt;
Further Compute Clusters in Baden-Württemberg (separate access policies):&lt;br /&gt;
* [[DACHS | Datenanalyse Cluster der Hochschulen (DACHS)]]&lt;br /&gt;
* bwHPC tier 1: [https://kb.hlrs.de/platforms/index.php/Hunter_(HPE) Hunter] ([https://www.hlrs.de/apply-for-computing-time getting access])&lt;br /&gt;
* bwHPC tier 2: [https://www.nhr.kit.edu/userdocs/horeka HoreKa] ([https://www.nhr.kit.edu/userdocs/horeka/projects/ getting access])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold; text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  Documentation valid for all Clusters&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[Environment Modules| Software Environment Modules]]: usage of preexisting software&lt;br /&gt;
* [https://www.bwhpc.de/software.html List of Software] on all clusters&lt;br /&gt;
* [[Data Transfer|Data Transfer]]: working with files [[File:Notebook.svg|x15px]] &amp;lt;---&amp;gt; [[File:Clusternodes.svg|x15px]]&lt;br /&gt;
* [[Development| Development]]: software, programming languages, parallel pogramming&lt;br /&gt;
* [[Energy Efficient Cluster Usage | (Energy) Efficient Cluster Usage]] for low waiting times and fast running jobs&lt;br /&gt;
* [[HPC Glossary]]&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | [[File:Storage_small.svg|x15px]]  Scientific Data Storage&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
User guides of available scientific data storage services:&lt;br /&gt;
* [[SDS@hd]]: Everyone can join existing storage projects, entitlement needed for creating your own, [https://sds-hd.urz.uni-heidelberg.de/management/shib/sds_costs.php cost sheet]&lt;br /&gt;
* [https://uni-tuebingen.de/einrichtungen/zentrum-fuer-datenverarbeitung/projekte/laufende-projekte/bwsfs bwSFS]&lt;br /&gt;
Associated, but local scientific storage services are:&lt;br /&gt;
* [https://wiki.scc.kit.edu/lsdf/index.php/Category:LSDF_Online_Storage LSDF Online Storage] (only for KIT and KIT partners)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | [[File:Storage_small.svg|x15px]]  Scientific Data Archiving&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
For user guides of the scientific data archiving services:&lt;br /&gt;
* [https://www.rda.kit.edu/english bwDataArchive]: Open to all scientists at KIT and institutions in Baden-Württemberg that have signed a service agreement with KIT&lt;br /&gt;
Associated, but local archiving services for scientific data are:&lt;br /&gt;
* [https://www.urz.uni-heidelberg.de/de/service-katalog/speicher/heiarchive heiARCHIVE] (only for members of Heidelberg University)&lt;br /&gt;
For instructions on how to move the data, depending on the offered connections, can be found under [[Data Transfer | Data Transfer]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | Research Data Management&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [https://www.forschungsdaten.org/index.php/FDM-Kontakte#Deutschland Research Data Management (RDM)] contact persons&lt;br /&gt;
* [https://www.forschungsdaten.info Portal for Research Data Management] (Forschungsdaten.info)&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;  background:#eeeefe; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Support&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [[BwSupportPortal|Submit a Ticket in our Support Portal]]&lt;br /&gt;
Support is provided by the [https://www.bwhpc.de/teams.php bwHPC Competence Centers]:&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;  background:#e6e9eb; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#d1dadf; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Acknowledgement&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* Please [[Acknowledgement|acknowledge]] our resources in your publications.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Main_Page&amp;diff=16094</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Main_Page&amp;diff=16094"/>
		<updated>2026-05-21T17:00:01Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size:140%;&amp;gt;&#039;&#039;&#039;Welcome to the bwHPC Wiki.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bwHPC represents services and resources in the State of &#039;&#039;&#039;B&#039;&#039;&#039;aden-&#039;&#039;&#039;W&#039;&#039;&#039;ürttemberg, Germany, for High Performance Computing (&#039;&#039;&#039;HPC&#039;&#039;&#039;), Data Intensive Computing (&#039;&#039;&#039;DIC&#039;&#039;&#039;) and Large Scale Scientific Data Management (&#039;&#039;&#039;LS2DM&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
The main bwHPC web page is at &#039;&#039;&#039;[https://www.bwhpc.de/ https://www.bwhpc.de/]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Many topics depend on the cluster system you use. &lt;br /&gt;
First choose the cluster you use,  then select the correct topic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- bwHPC STATUS START --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{Template:Status|warn|Status: Jobs suspended on Justus 2}}--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Template:Status|ok|&#039;&#039;&#039;Status:&#039;&#039;&#039; Ok}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Status|alert|[Status: Major Outage] bwForCluster NEMO 2}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Template usage examples: color ok(green),warn(yellow),alert(red). Enter custom text in 3rd field&lt;br /&gt;
{{Template:Status|ok|Status: Ok}}&lt;br /&gt;
{{Template:Status|warn|Status: maintenance upcoming}}&lt;br /&gt;
{{Template:Status|alert|Status: bwUniCluster down}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- bwHPC STATUS END --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot; background:#eeeefe; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold; text-align:left&amp;quot; | Courses / eLearning&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [https://training.bwhpc.de/ eLearning and Online Courses]&lt;br /&gt;
* [https://hpc-wiki.info/hpc/Introduction_to_Linux_in_HPC Introduction to Linux in HPC (external resource)]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold; text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  Need Access to a Cluster?&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[When to use an HPC Cluster]]&lt;br /&gt;
* [[Running Calculations]]&lt;br /&gt;
* [[Registration]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  HPC System Specific Documentation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
bwHPC encompasses several HPC compute clusters at different universities in Baden-Württemberg. Each cluster is dedicated to [https://www.bwhpc.de/bwhpc-domains.php specific research domains]. &lt;br /&gt;
 &lt;br /&gt;
Documentation differs between compute clusters, please see cluster specific overview pages:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[BwUniCluster3.0|bwUniCluster 3.0]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | General Purpose, Teaching&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[BinAC2|bwForCluster BinAC 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Bioinformatics, Astrophysics, Geosciences, Pharmacy, and Medical Informatics&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot; | [[Helix|bwForCluster Helix]]&lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  |   Structural and Systems Biology, Medical Science, Soft Matter, Computational Humanities, and Mathematics and Computer Science&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[:JUSTUS2| bwForCluster JUSTUS 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Theoretical Chemistry, Condensed Matter Physics, and Quantum Sciences&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px; width:30%&amp;quot;  | [[NEMO2|bwForCluster NEMO 2]] &lt;br /&gt;
| style=&amp;quot;padding-left:20px;&amp;quot;  | Neurosciences, Particle Physics, Materials Science, and Microsystems Engineering&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|bwHPC Clusters: [https://www.bwhpc.de/cluster.php operational status] &lt;br /&gt;
Further Compute Clusters in Baden-Württemberg (separate access policies):&lt;br /&gt;
* [[DACHS | Datenanalyse Cluster der Hochschulen (DACHS)]]&lt;br /&gt;
* bwHPC tier 1: [https://kb.hlrs.de/platforms/index.php/Hunter_(HPE) Hunter] ([https://www.hlrs.de/apply-for-computing-time getting access])&lt;br /&gt;
* bwHPC tier 2: [https://www.nhr.kit.edu/userdocs/horeka HoreKa] ([https://www.nhr.kit.edu/userdocs/horeka/projects/ getting access])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold; text-align:left&amp;quot; | [[File:Clusternodes.svg|x20px]]  Documentation valid for all Clusters&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[Environment Modules| Software Environment Modules]]: usage of preexisting software&lt;br /&gt;
* [https://www.bwhpc.de/software.html List of Software] on all clusters&lt;br /&gt;
* [[Data Transfer|Data Transfer]]: working with files [[File:Notebook.svg|x15px]] &amp;lt;---&amp;gt; [[File:Clusternodes.svg|x15px]]&lt;br /&gt;
* [[Development| Development]]: software, programming languages, parallel pogramming&lt;br /&gt;
* [[Energy Efficient Cluster Usage | (Energy) Efficient Cluster Usage]] for low waiting times and fast running jobs&lt;br /&gt;
* [[HPC Glossary]]&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | [[File:Storage_small.svg|x15px]]  Scientific Data Storage&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
User guides of available scientific data storage services:&lt;br /&gt;
* [[SDS@hd]]: Everyone can join existing storage projects, entitlement needed for creating your own, [https://sds-hd.urz.uni-heidelberg.de/management/shib/sds_costs.php cost sheet]&lt;br /&gt;
* [https://uni-tuebingen.de/einrichtungen/zentrum-fuer-datenverarbeitung/projekte/laufende-projekte/bwsfs bwSFS]&lt;br /&gt;
Associated, but local scientific storage services are:&lt;br /&gt;
* [https://wiki.scc.kit.edu/lsdf/index.php/Category:LSDF_Online_Storage LSDF Online Storage] (only for KIT and KIT partners)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | [[File:Storage_small.svg|x15px]]  Scientific Data Archiving&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
For user guides of the scientific data archiving services:&lt;br /&gt;
* [https://www.rda.kit.edu/english bwDataArchive]: Open to all scientists at KIT and institutions in Baden-Württemberg that have signed a service agreement with KIT&lt;br /&gt;
Associated, but local archiving services for scientific data are:&lt;br /&gt;
* [https://www.urz.uni-heidelberg.de/de/service-katalog/speicher/heiarchive heiARCHIVE] (only for members of Heidelberg University)&lt;br /&gt;
For instructions on how to move the data, depending on the offered connections, can be found under [[Data Transfer | Data Transfer]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;height:100%; background:#ffeaef; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f5dfdf; font-size:120%; font-weight:bold;  text-align:left&amp;quot;   | Research Data Management&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [https://www.forschungsdaten.org/index.php/FDM-Kontakte#Deutschland Research Data Management (RDM)] contact persons&lt;br /&gt;
* [https://www.forschungsdaten.info Portal for Research Data Management] (Forschungsdaten.info)&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;  background:#eeeefe; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Support&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [[BwSupportPortal|Submit a Ticket in our Support Portal]]&lt;br /&gt;
Support is provided by the [https://www.bwhpc.de/teams.php bwHPC Competence Centers]:&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;  background:#e6e9eb; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#d1dadf; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Acknowledgement&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* Please [[Acknowledgement|acknowledge]] our resources in your publications.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16093</id>
		<title>Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16093"/>
		<updated>2026-05-21T16:58:54Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Current Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= bwHPC Cluster and Service Status Page =&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{Template:Status|warn|Status: Jobs suspended on Justus 2}}&lt;br /&gt;
Due to work on the power supply of the cooling system all jobs have been suspended to prevent overheating.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Template:Status|ok|&#039;&#039;&#039;Status:&#039;&#039;&#039; Normal operation of all systems}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Status|alert|[Status: Major Outage] bwForCluster NEMO 2}}&lt;br /&gt;
NEMO2 is currently offline. A power outage damaged the cluster&#039;s UPS, causing an abrupt shutdown of our core infrastructure and parallel storage. Compute nodes and storage are completely inaccessible and cannot be started at this time. Comprehensive file system checks are scheduled for tomorrow.&lt;br /&gt;
&lt;br /&gt;
We hope to restore service tomorrow, but due to the hardware damage, we cannot guarantee a specific timeline yet. We will provide another update as soon as more information is available. Apologies for the disruption.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Template usage examples: color ok(green),warn(yellow),alert(red). Enter custom text in 3rd field&lt;br /&gt;
{{Template:Status|ok|Status: Ok}}&lt;br /&gt;
{{Template:Status|warn|Status: maintenance upcoming}}&lt;br /&gt;
{{Template:Status|alert|Status: bwUniCluster down}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relevant Old Messages ==&lt;br /&gt;
None&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16092</id>
		<title>Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16092"/>
		<updated>2026-05-21T16:57:18Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Current Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= bwHPC Cluster and Service Status Page =&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{Template:Status|warn|Status: Jobs suspended on Justus 2}}&lt;br /&gt;
Due to work on the power supply of the cooling system all jobs have been suspended to prevent overheating.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Template:Status|ok|&#039;&#039;&#039;Status:&#039;&#039;&#039; Normal operation of all systems}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Status|alert|[Status: Major Outage] bwForCluster NEMO 2}}&lt;br /&gt;
NEMO2 is currently offline. A power outage damaged the cluster&#039;s UPS, causing an abrupt shutdown of our core infrastructure and parallel storage. Compute nodes and storage are completely inaccessible and cannot be started at this time. Comprehensive file system checks are scheduled for tomorrow.&lt;br /&gt;
We hope to restore service tomorrow, but due to the hardware damage, we cannot guarantee a specific timeline yet. We will provide another update as soon as more information is available. Apologies for the disruption.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Template usage examples: color ok(green),warn(yellow),alert(red). Enter custom text in 3rd field&lt;br /&gt;
{{Template:Status|ok|Status: Ok}}&lt;br /&gt;
{{Template:Status|warn|Status: maintenance upcoming}}&lt;br /&gt;
{{Template:Status|alert|Status: bwUniCluster down}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relevant Old Messages ==&lt;br /&gt;
None&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16091</id>
		<title>Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16091"/>
		<updated>2026-05-21T16:57:07Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Current Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= bwHPC Cluster and Service Status Page =&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{Template:Status|warn|Status: Jobs suspended on Justus 2}}&lt;br /&gt;
Due to work on the power supply of the cooling system all jobs have been suspended to prevent overheating.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Template:Status|ok|&#039;&#039;&#039;Status:&#039;&#039;&#039; Normal operation of all systems}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Status|alert|[Status: Major Outage] bwForCluster NEMO 2}}&lt;br /&gt;
NEMO2 is currently offline. A power outage damaged the cluster&#039;s UPS, causing an abrupt shutdown of our core infrastructure and parallel storage.&lt;br /&gt;
Compute nodes and storage are completely inaccessible and cannot be started at this time.&lt;br /&gt;
Comprehensive file system checks are scheduled for tomorrow.&lt;br /&gt;
We hope to restore service tomorrow, but due to the hardware damage, we cannot guarantee a specific timeline yet.&lt;br /&gt;
We will provide another update as soon as more information is available. Apologies for the disruption.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Template usage examples: color ok(green),warn(yellow),alert(red). Enter custom text in 3rd field&lt;br /&gt;
{{Template:Status|ok|Status: Ok}}&lt;br /&gt;
{{Template:Status|warn|Status: maintenance upcoming}}&lt;br /&gt;
{{Template:Status|alert|Status: bwUniCluster down}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relevant Old Messages ==&lt;br /&gt;
None&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16090</id>
		<title>Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Status&amp;diff=16090"/>
		<updated>2026-05-21T16:56:39Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Current Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= bwHPC Cluster and Service Status Page =&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{Template:Status|warn|Status: Jobs suspended on Justus 2}}&lt;br /&gt;
Due to work on the power supply of the cooling system all jobs have been suspended to prevent overheating.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Template:Status|ok|&#039;&#039;&#039;Status:&#039;&#039;&#039; Normal operation of all systems}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template:Status|alert|[Status: Major Outage] bwForCluster NEMO 2}}&lt;br /&gt;
NEMO2 is currently offline. A power outage damaged the cluster&#039;s UPS, causing an abrupt shutdown of our core infrastructure and parallel storage.&lt;br /&gt;
&lt;br /&gt;
Compute nodes and storage are completely inaccessible and cannot be started at this time.&lt;br /&gt;
Comprehensive file system checks are scheduled for tomorrow.&lt;br /&gt;
&lt;br /&gt;
We hope to restore service tomorrow, but due to the hardware damage, we cannot guarantee a specific timeline yet.&lt;br /&gt;
&lt;br /&gt;
We will provide another update as soon as more information is available. Apologies for the disruption.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Template usage examples: color ok(green),warn(yellow),alert(red). Enter custom text in 3rd field&lt;br /&gt;
{{Template:Status|ok|Status: Ok}}&lt;br /&gt;
{{Template:Status|warn|Status: maintenance upcoming}}&lt;br /&gt;
{{Template:Status|alert|Status: bwUniCluster down}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relevant Old Messages ==&lt;br /&gt;
None&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=BwSupportPortal&amp;diff=16088</id>
		<title>BwSupportPortal</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=BwSupportPortal&amp;diff=16088"/>
		<updated>2026-05-21T10:09:06Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Help, support and any other HPC related request can be addressed to the bwHPC cluster and competence center teams via the &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #28a745; padding: 15px; background-color: #d4edda; margin: 5px 0;&amp;quot;&amp;gt;&lt;br /&gt;
[https://www.bwhpc.de/supportportal &#039;&#039;&#039;Create a ticket at the bwSupportPortal&#039;&#039;&#039;]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Creating a ticket =&lt;br /&gt;
&lt;br /&gt;
Tickets can be created and assigned to a support unit through the following steps after login:&lt;br /&gt;
&lt;br /&gt;
== Select New Ticket ==&lt;br /&gt;
&lt;br /&gt;
A new ticket can be created by clicking on the &amp;quot;+&amp;quot;-Symbol in the bottom left:&lt;br /&gt;
&lt;br /&gt;
[[File:BwHelpdesk Step1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Navigate the Support Groups ==&lt;br /&gt;
&lt;br /&gt;
Navigate the support groups by using &#039;&#039;&#039;the arrows&#039;&#039;&#039; or use the &#039;&#039;&#039;search bar&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
[[File:BwHelpdesk Step2.png]]&lt;br /&gt;
&lt;br /&gt;
== Choose a Support Unit ==&lt;br /&gt;
&lt;br /&gt;
Choose a specific support group:&lt;br /&gt;
&lt;br /&gt;
[[File:BwHelpdesk Step3.png]]&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces/Advanced_Features&amp;diff=16087</id>
		<title>NEMO2/Workspaces/Advanced Features</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces/Advanced_Features&amp;diff=16087"/>
		<updated>2026-05-20T13:20:54Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Sharing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For basic daily usage see the main [[NEMO2/Workspaces|Workspaces]] guide.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Creating Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate myWs 100&lt;br /&gt;
&lt;br /&gt;
Returns the workspace path, e.g. &amp;lt;tt&amp;gt;/work/classic/$USER-myWs&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Running the same command again is safe — it returns the existing workspace path.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Capture path in variable:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_allocate myWs 100)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Common options:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable workspace&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable workspace&lt;br /&gt;
   $ ws_allocate -r 7 myWs 100              # Reminder 7 days before expiry&lt;br /&gt;
   $ ws_allocate -c &amp;quot;ML training data&amp;quot; myWs 100   # Add comment (shown in ws_list -l)&lt;br /&gt;
   $ ws_allocate -x myWs 100                # Extend existing workspace&lt;br /&gt;
   $ ws_allocate -x -u alice myWs 100       # Extend Alice&#039;s group workspace&lt;br /&gt;
   $ ws_allocate -r 7 -x myWs 0             # Update reminder only (no extension)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:20%&amp;quot; | Option&lt;br /&gt;
!style=&amp;quot;width:80%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Group-readable workspace&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-G &amp;lt;groupname&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Group-writable workspace. Set default in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-m &amp;lt;email&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Custom email for reminders (overrides identity provider email)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-r &amp;lt;days&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Reminder n days before expiration&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-c &amp;lt;comment&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Comment shown in &amp;lt;tt&amp;gt;ws_list -l&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-x&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Extend existing workspace&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-u &amp;lt;username&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Target another user&#039;s workspace (requires &amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using workspaces in batch jobs:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Create the workspace once on the login node, then use &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; in the job script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=my_job&lt;br /&gt;
&lt;br /&gt;
WORKSPACE=$(ws_find myProject)&lt;br /&gt;
cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./my_program --input input.dat --output results.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User Defaults: ~/.ws_user.conf ===&lt;br /&gt;
&lt;br /&gt;
Set defaults so you never forget important options. The file is in YAML format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
duration:  100&lt;br /&gt;
reminder:  7&lt;br /&gt;
groupname: projectgroup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; The first line must be a setting, not a comment. Some versions interpret a leading &amp;lt;tt&amp;gt;#&amp;lt;/tt&amp;gt; as an email address.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the config above, &amp;lt;tt&amp;gt;ws_allocate myWs&amp;lt;/tt&amp;gt; automatically creates a 100-day workspace with a 7-day reminder for the default group — no extra flags needed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:25%&amp;quot; | Setting&lt;br /&gt;
!style=&amp;quot;width:75%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;duration:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Default lifetime in days&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;reminder:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Days before expiration for reminder&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;groupname:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Default group for &amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; (see [[#Sharing|Sharing]])&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;mail:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Override notification email (optional)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Listing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_list                                # All your workspaces&lt;br /&gt;
   $ ws_list -Rr                            # Sort by remaining time (soonest first)&lt;br /&gt;
   $ ws_list -g                             # Include group workspaces&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
id: myWs&lt;br /&gt;
   workspace directory  : /work/classic/$USER-myWs&lt;br /&gt;
   remaining time       : 6 days 23 hours&lt;br /&gt;
   creation time        : Thu Apr 17 09:23:41 2025&lt;br /&gt;
   expiration time      : Mon May 26 09:23:41 2025&lt;br /&gt;
   available extensions : 98&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot; | Option&lt;br /&gt;
!style=&amp;quot;width:85%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-l&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Long listing (shows creation time, comment, extensions remaining)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-R&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Show remaining time as human-readable&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-r&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Reverse sort order&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-s&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Sort by creation time&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Include group workspaces (not just owned)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Finding Workspace Paths ==&lt;br /&gt;
&lt;br /&gt;
Returns the full path — primarily useful in scripts:&lt;br /&gt;
&lt;br /&gt;
   $ ws_find myWs&lt;br /&gt;
   /work/classic/$USER-myWs&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_find myWs)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Extending Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_extend myWs 100                      # Extend by 100 days (same as ws_allocate -x)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Expiry is recalculated from &#039;&#039;now&#039;&#039;. Extending too early reduces remaining time; extending near expiry gives maximum benefit.&lt;br /&gt;
&lt;br /&gt;
Group members can extend each other&#039;s workspaces:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -x -u alice myWs 100        # Requires workspace created with -G&lt;br /&gt;
&lt;br /&gt;
Each extension uses one of the 100 available extensions. Check remaining extensions with &amp;lt;tt&amp;gt;ws_list -l&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Releasing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_release myWs&lt;br /&gt;
&lt;br /&gt;
The workspace directory is immediately moved out of reach. The data is permanently deleted at the next nightly expirer run — &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; is possible until then.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
Do &#039;&#039;&#039;not&#039;&#039;&#039; rely on being able to restore a released workspace. If you have important data, archive it before releasing.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--delete-data&amp;lt;/tt&amp;gt; skips even that window and deletes immediately (&#039;&#039;&#039;cannot be restored&#039;&#039;&#039;). Only use this if you are certain the data is no longer needed.&lt;br /&gt;
&lt;br /&gt;
== Restoring Workspaces ==&lt;br /&gt;
&lt;br /&gt;
Restore workspaces that &#039;&#039;&#039;expired naturally&#039;&#039;&#039; (reached end of lifetime) within the 30-day grace period:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -l                          # (1) List restorable workspaces&lt;br /&gt;
   $ ws_allocate restored 100               # (2) Create target workspace&lt;br /&gt;
   $ ws_restore username-myWs-0 restored    # (3) Restore&lt;br /&gt;
&lt;br /&gt;
Use the &#039;&#039;&#039;full name&#039;&#039;&#039; from &amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; (includes username prefix and timestamp), not the short name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 12px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Released workspaces&#039;&#039;&#039; (deleted with &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt;) can be restored with &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; until the next nightly expirer run — after that they are permanently deleted.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the workspace is not listed, it has been &#039;&#039;&#039;permanently deleted&#039;&#039;&#039; — not recoverable by anyone.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:20%&amp;quot; | Option&lt;br /&gt;
!style=&amp;quot;width:80%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-l&amp;lt;/tt&amp;gt;&lt;br /&gt;
|List restorable workspaces&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-u &amp;lt;username&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Restore another user&#039;s workspace (requires permission)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Workspace Links ==&lt;br /&gt;
&lt;br /&gt;
Creates a directory of symlinks to all your workspaces for quick navigation:&lt;br /&gt;
&lt;br /&gt;
   $ ws_register ~/workspaces&lt;br /&gt;
   $ ls ~/workspaces/&lt;br /&gt;
   myWs -&amp;gt; /work/classic/$USER-myWs&lt;br /&gt;
&lt;br /&gt;
Re-run after creating new workspaces to keep the links up to date.&lt;br /&gt;
&lt;br /&gt;
== Sharing ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;NEVER use &amp;lt;tt&amp;gt;chmod 777&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;chmod o+rwx&amp;lt;/tt&amp;gt;!&#039;&#039;&#039;&lt;br /&gt;
Making workspaces world-readable is a security policy violation — use the methods below.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Group workspaces (recommended) ===&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable (read-only for group)&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable (recommended for teams)&lt;br /&gt;
   $ ws_allocate -G bw12a001 myWs 100       # Example: project group bw12a001&lt;br /&gt;
&lt;br /&gt;
Set &amp;lt;tt&amp;gt;groupname&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt; so you don&#039;t have to type it every time.&lt;br /&gt;
&lt;br /&gt;
Benefits: team members can extend the workspace, &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt; shows it to everyone in the group, and new files automatically inherit group ownership.&lt;br /&gt;
&lt;br /&gt;
=== Read-only sharing after creation ===&lt;br /&gt;
&lt;br /&gt;
Share an existing workspace read-only with specific users outside your group:&lt;br /&gt;
&lt;br /&gt;
   $ ws_share share myWs alice bob          # Grant read access&lt;br /&gt;
   $ ws_share unshare myWs alice            # Remove access&lt;br /&gt;
   $ ws_share list myWs                     # Show who has access&lt;br /&gt;
&lt;br /&gt;
=== ACLs (per-user and per-group fine-grained) ===&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;tt&amp;gt;setfacl&amp;lt;/tt&amp;gt; when &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ws_share&amp;lt;/tt&amp;gt; do not cover your needs.&lt;br /&gt;
&lt;br /&gt;
==== User ACLs ====&lt;br /&gt;
&lt;br /&gt;
DIR=$(ws_find my_workspace)&lt;br /&gt;
   $ setfacl -Rm user:alice:rX,default:user:alice:rX &amp;quot;$DIR&amp;quot;   # Read-only for alice&lt;br /&gt;
   $ setfacl -Rm user:bob:rwX,default:user:bob:rwX   &amp;quot;$DIR&amp;quot;   # Read-write for bob&lt;br /&gt;
&lt;br /&gt;
==== Group ACLs ====&lt;br /&gt;
&lt;br /&gt;
   $ setfacl -Rm group:readgroup:rX,default:group:readgroup:rX         &amp;quot;$DIR&amp;quot;   # Read-only for group&lt;br /&gt;
   $ setfacl -Rm group:projectgroup:rwX,default:group:projectgroup:rwX &amp;quot;$DIR&amp;quot;   # Read-write for group&lt;br /&gt;
&lt;br /&gt;
==== Inspect &amp;amp; Remove ====&lt;br /&gt;
&lt;br /&gt;
   $ getfacl     &amp;quot;$DIR&amp;quot;   # View current ACLs (users and groups)&lt;br /&gt;
   $ setfacl -Rb &amp;quot;$DIR&amp;quot;   # Remove all ACLs&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;-R&amp;lt;/tt&amp;gt; || Apply recursively to all subdirectories and files&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;default:&amp;lt;/tt&amp;gt; || New files automatically inherit the ACL entry&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;X&amp;lt;/tt&amp;gt; || Execute permission only on directories and executable files&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Workspace Handover ==&lt;br /&gt;
&lt;br /&gt;
When a team member leaves or transfers a project, their workspaces can be handed over without data loss.&lt;br /&gt;
&lt;br /&gt;
=== Preparation (before someone leaves) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-G groupname&amp;lt;/tt&amp;gt; can only be set &#039;&#039;&#039;at creation time&#039;&#039;&#039;. Always create shared research data with it from the start:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -G projectgroup -c &amp;quot;ML training data – contact alice&amp;quot; myWs 100&lt;br /&gt;
&lt;br /&gt;
This ensures:&lt;br /&gt;
* Group members can see the workspace with &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Any group member can extend it: &amp;lt;tt&amp;gt;ws_allocate -x -u alice myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Data remains accessible after the original owner&#039;s account is deactivated&lt;br /&gt;
&lt;br /&gt;
To ensure someone else receives expiry reminders, there are two options:&lt;br /&gt;
&lt;br /&gt;
* Add their email to &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt; of the owner (or use &amp;lt;tt&amp;gt;-m email&amp;lt;/tt&amp;gt; at allocate time):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mailaddress: alice@uni-freiburg.de,backup@uni-freiburg.de&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Or actively take over the reminders as the new responsible person:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -r 7 -u alice -x myWs 0   # Redirect reminders to yourself&lt;br /&gt;
&lt;br /&gt;
=== After the owner has left ===&lt;br /&gt;
&lt;br /&gt;
If the workspace was created with &amp;lt;tt&amp;gt;-G groupname&amp;lt;/tt&amp;gt;, a group member can keep it alive:&lt;br /&gt;
&lt;br /&gt;
   $ ws_list -g                                  # Find group workspaces&lt;br /&gt;
   $ ws_allocate -x -u formercolleague myWs 100  # Extend (while still restorable)&lt;br /&gt;
&lt;br /&gt;
If the workspace has already expired, an authorized group member or administrator can restore it:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -u formercolleague -l        # List their restorable workspaces&lt;br /&gt;
   $ ws_allocate newname 100&lt;br /&gt;
   $ ws_restore -u formercolleague formercolleague-myWs-0 newname&lt;br /&gt;
&lt;br /&gt;
=== Workspaces without group access ===&lt;br /&gt;
&lt;br /&gt;
If the workspace was created without &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt;, contact the HPC support team for assistance during the grace period (30 days after expiry).&lt;br /&gt;
&lt;br /&gt;
== Reminders ==&lt;br /&gt;
&lt;br /&gt;
Reminders are automatic. The notification goes to your identity provider email address.&lt;br /&gt;
&lt;br /&gt;
Customize reminder timing at workspace creation:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -r 7 myWs 100              # Reminder 7 days before expiry&lt;br /&gt;
&lt;br /&gt;
Custom email address:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -m custom@example.com myWs 100&lt;br /&gt;
&lt;br /&gt;
Update reminder timing (or take over reminders) without extending:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -r 7 -x myWs 0            # Change timing only&lt;br /&gt;
   $ ws_allocate -r 7 -u alice -x myWs 0   # Take over reminders for Alice&#039;s workspace&lt;br /&gt;
&lt;br /&gt;
The last command is useful when taking responsibility for a colleague&#039;s workspace.&lt;br /&gt;
&lt;br /&gt;
== Quotas &amp;amp; Limits ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:35%&amp;quot; | Parameter&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot; | Value&lt;br /&gt;
|-&lt;br /&gt;
|Default lifetime&lt;br /&gt;
|30 days&lt;br /&gt;
|-&lt;br /&gt;
|Maximum lifetime&lt;br /&gt;
|100 days&lt;br /&gt;
|-&lt;br /&gt;
|Maximum extensions&lt;br /&gt;
|100 times&lt;br /&gt;
|-&lt;br /&gt;
|Storage quota&lt;br /&gt;
|5 TiB per workspace&lt;br /&gt;
|-&lt;br /&gt;
|Grace period (expired workspaces)&lt;br /&gt;
|30 days (recoverable with &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|Grace period (released workspaces)&lt;br /&gt;
|next nightly expirer run (&#039;&#039;&#039;not reliably recoverable&#039;&#039;&#039;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Check quota:&lt;br /&gt;
&lt;br /&gt;
   $ nemoquota                               # HOME + workspace quotas&lt;br /&gt;
   $ df --si $(ws_find myWs)                 # Size of a specific workspace&lt;br /&gt;
&lt;br /&gt;
Released workspaces count toward quota until the nightly cleanup runs. Use &amp;lt;tt&amp;gt;ws_release --delete-data&amp;lt;/tt&amp;gt; for immediate relief (&#039;&#039;&#039;irreversible&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Best Practices ==&lt;br /&gt;
&lt;br /&gt;
# Set up &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt; — defaults save time and prevent mistakes&lt;br /&gt;
# Use &amp;lt;tt&amp;gt;-G groupname&amp;lt;/tt&amp;gt; for research data — essential for handover and collaboration&lt;br /&gt;
# Create workspaces on the login node — use &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; in job scripts, don&#039;t create inside jobs&lt;br /&gt;
# Monitor with &amp;lt;tt&amp;gt;ws_list -Rr&amp;lt;/tt&amp;gt; — sort by remaining time to catch workspaces about to expire&lt;br /&gt;
# Archive before expiry — workspaces are not backed up&lt;br /&gt;
# Clean up finished workspaces — &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt; frees quota and reduces clutter&lt;br /&gt;
&lt;br /&gt;
Single-node temporary files belong in &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt;, not workspaces.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16086</id>
		<title>NEMO2/Workspaces</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16086"/>
		<updated>2026-05-20T13:07:44Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Sharing Workspaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 15px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is the updated Workspaces guide for NEMO2. For other clusters please use: [[Workspace]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Workspace tools&#039;&#039;&#039; provide temporary storage on NEMO&#039;s fast parallel filesystem (Weka).&lt;br /&gt;
They are meant for data that needs to persist longer than a single job, but not permanently.&lt;br /&gt;
&lt;br /&gt;
For advanced features — user config (&amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;), reminders, quotas, workspace handover, and more — see [[NEMO2/Workspaces/Advanced_Features|Advanced Features]].&lt;br /&gt;
&lt;br /&gt;
== What are Workspaces? ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Jobs generating intermediate data&lt;br /&gt;
* Data shared between multiple compute nodes&lt;br /&gt;
* Multi-step workflows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Don&#039;t use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Permanent storage (use HOME or project directories)&lt;br /&gt;
* Single-node temporary files (use &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt; instead)&lt;br /&gt;
&lt;br /&gt;
== Important - Read First ==&lt;br /&gt;
&lt;br /&gt;
* No Backup: Data is &#039;&#039;&#039;not backed up&#039;&#039;&#039; and will be &#039;&#039;&#039;automatically deleted&#039;&#039;&#039; after expiration&lt;br /&gt;
* Time-limited: Maximum lifetime is 100 days, up to 100 extensions&lt;br /&gt;
* Email Reminders: You receive email notifications before expiration&lt;br /&gt;
* Backup Important Data: Copy results to permanent storage before expiration&lt;br /&gt;
&lt;br /&gt;
== Command Overview ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_allocate&amp;lt;/tt&amp;gt; - Create or extend workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt; - List your workspaces&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; - Find workspace path (for scripts)&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_extend&amp;lt;/tt&amp;gt; - Extend workspace lifetime&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt; - Release (delete) workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; - Restore expired/released workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_register&amp;lt;/tt&amp;gt; - Create symbolic links&lt;br /&gt;
&lt;br /&gt;
All commands support &amp;lt;tt&amp;gt;-h&amp;lt;/tt&amp;gt; for help.&lt;br /&gt;
&lt;br /&gt;
== Quick Start ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:40%&amp;quot; | Task&lt;br /&gt;
!style=&amp;quot;width:60%&amp;quot; | Command&lt;br /&gt;
|-&lt;br /&gt;
|Create workspace (100 days)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Create group workspace&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate -G groupname myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|List all workspaces&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|See what expires soon&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list -Rr&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Find path (for scripts)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_find myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Extend by 100 days&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_extend myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Delete workspace (permanent, next nightly run)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_release myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Restore expired workspace (30d grace)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; then &amp;lt;tt&amp;gt;ws_restore oldname newname&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Creating Workspaces ==&lt;br /&gt;
&lt;br /&gt;
Create a workspace with a &#039;&#039;&#039;name&#039;&#039;&#039; and &#039;&#039;&#039;lifetime&#039;&#039;&#039; in days:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate myWs 100&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
   /work/classic/$USER-myWs&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Capture path in variable:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_allocate myWs 100)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Running the same command again is safe - returns the existing workspace path.&lt;br /&gt;
&lt;br /&gt;
== Listing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_list                                # List all workspaces&lt;br /&gt;
   $ ws_list -Rr                            # Sort by remaining time, soonest first&lt;br /&gt;
   $ ws_list -g                             # Show group workspaces&lt;br /&gt;
&lt;br /&gt;
== Extending Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_extend myWs 100                      # Extend by 100 days from now&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alternative:&#039;&#039;&#039; &amp;lt;tt&amp;gt;ws_allocate -x myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each extension consumes one of your available extensions (100 total).&lt;br /&gt;
&lt;br /&gt;
== Releasing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_release myWs&lt;br /&gt;
&lt;br /&gt;
The workspace becomes inaccessible immediately and is permanently deleted at the next nightly expirer run. &#039;&#039;&#039;Do not rely on recovering a released workspace.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Restoring Workspaces ==&lt;br /&gt;
&lt;br /&gt;
Recover workspaces that &#039;&#039;&#039;expired naturally&#039;&#039;&#039; (reached end of lifetime) within the 30-day grace period:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -l                          # (1) List restorable workspaces&lt;br /&gt;
   $ ws_allocate restored 100               # (2) Create target workspace&lt;br /&gt;
   $ ws_restore username-myWs-0 restored    # (3) Restore&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Use the &#039;&#039;&#039;full name&#039;&#039;&#039; from &amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; (with username and timestamp), not the short name.&lt;br /&gt;
Released workspaces (via &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt;) can also be restored, but only until the next nightly expirer run — after that they are permanently deleted.&lt;br /&gt;
&lt;br /&gt;
== Sharing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
=== Group workspace (recommended) ===&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable (read-only for group)&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable (recommended for teams)&lt;br /&gt;
   $ ws_allocate -G bw12a001 myWs 100       # Example: project group bw12a001&lt;br /&gt;
&lt;br /&gt;
Anyone in the group can use &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt; to see the workspace and extend it with:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -x -u owner myWs 100&lt;br /&gt;
&lt;br /&gt;
Using &amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; also enables smooth handover when team members leave — see [[NEMO2/Workspaces/Advanced_Features#Workspace_Handover|Workspace Handover]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set default group in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
groupname: bw12a001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16085</id>
		<title>NEMO2/Workspaces</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16085"/>
		<updated>2026-05-20T13:01:56Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Sharing Workspaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 15px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is the updated Workspaces guide for NEMO2. For other clusters please use: [[Workspace]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Workspace tools&#039;&#039;&#039; provide temporary storage on NEMO&#039;s fast parallel filesystem (Weka).&lt;br /&gt;
They are meant for data that needs to persist longer than a single job, but not permanently.&lt;br /&gt;
&lt;br /&gt;
For advanced features — user config (&amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;), reminders, quotas, workspace handover, and more — see [[NEMO2/Workspaces/Advanced_Features|Advanced Features]].&lt;br /&gt;
&lt;br /&gt;
== What are Workspaces? ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Jobs generating intermediate data&lt;br /&gt;
* Data shared between multiple compute nodes&lt;br /&gt;
* Multi-step workflows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Don&#039;t use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Permanent storage (use HOME or project directories)&lt;br /&gt;
* Single-node temporary files (use &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt; instead)&lt;br /&gt;
&lt;br /&gt;
== Important - Read First ==&lt;br /&gt;
&lt;br /&gt;
* No Backup: Data is &#039;&#039;&#039;not backed up&#039;&#039;&#039; and will be &#039;&#039;&#039;automatically deleted&#039;&#039;&#039; after expiration&lt;br /&gt;
* Time-limited: Maximum lifetime is 100 days, up to 100 extensions&lt;br /&gt;
* Email Reminders: You receive email notifications before expiration&lt;br /&gt;
* Backup Important Data: Copy results to permanent storage before expiration&lt;br /&gt;
&lt;br /&gt;
== Command Overview ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_allocate&amp;lt;/tt&amp;gt; - Create or extend workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt; - List your workspaces&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; - Find workspace path (for scripts)&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_extend&amp;lt;/tt&amp;gt; - Extend workspace lifetime&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt; - Release (delete) workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; - Restore expired/released workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_register&amp;lt;/tt&amp;gt; - Create symbolic links&lt;br /&gt;
&lt;br /&gt;
All commands support &amp;lt;tt&amp;gt;-h&amp;lt;/tt&amp;gt; for help.&lt;br /&gt;
&lt;br /&gt;
== Quick Start ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:40%&amp;quot; | Task&lt;br /&gt;
!style=&amp;quot;width:60%&amp;quot; | Command&lt;br /&gt;
|-&lt;br /&gt;
|Create workspace (100 days)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Create group workspace&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate -G groupname myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|List all workspaces&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|See what expires soon&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list -Rr&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Find path (for scripts)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_find myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Extend by 100 days&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_extend myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Delete workspace (permanent, next nightly run)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_release myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Restore expired workspace (30d grace)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; then &amp;lt;tt&amp;gt;ws_restore oldname newname&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Creating Workspaces ==&lt;br /&gt;
&lt;br /&gt;
Create a workspace with a &#039;&#039;&#039;name&#039;&#039;&#039; and &#039;&#039;&#039;lifetime&#039;&#039;&#039; in days:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate myWs 100&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
   /work/classic/$USER-myWs&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Capture path in variable:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_allocate myWs 100)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Running the same command again is safe - returns the existing workspace path.&lt;br /&gt;
&lt;br /&gt;
== Listing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_list                                # List all workspaces&lt;br /&gt;
   $ ws_list -Rr                            # Sort by remaining time, soonest first&lt;br /&gt;
   $ ws_list -g                             # Show group workspaces&lt;br /&gt;
&lt;br /&gt;
== Extending Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_extend myWs 100                      # Extend by 100 days from now&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alternative:&#039;&#039;&#039; &amp;lt;tt&amp;gt;ws_allocate -x myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each extension consumes one of your available extensions (100 total).&lt;br /&gt;
&lt;br /&gt;
== Releasing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_release myWs&lt;br /&gt;
&lt;br /&gt;
The workspace becomes inaccessible immediately and is permanently deleted at the next nightly expirer run. &#039;&#039;&#039;Do not rely on recovering a released workspace.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Restoring Workspaces ==&lt;br /&gt;
&lt;br /&gt;
Recover workspaces that &#039;&#039;&#039;expired naturally&#039;&#039;&#039; (reached end of lifetime) within the 30-day grace period:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -l                          # (1) List restorable workspaces&lt;br /&gt;
   $ ws_allocate restored 100               # (2) Create target workspace&lt;br /&gt;
   $ ws_restore username-myWs-0 restored    # (3) Restore&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Use the &#039;&#039;&#039;full name&#039;&#039;&#039; from &amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; (with username and timestamp), not the short name.&lt;br /&gt;
Released workspaces (via &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt;) can also be restored, but only until the next nightly expirer run — after that they are permanently deleted.&lt;br /&gt;
&lt;br /&gt;
== Sharing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
=== Group workspace (recommended) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ws_allocate -g myWs 100                  # Group-readable (read-only for group)&lt;br /&gt;
ws_allocate -G projectgroup myWs 100     # Group-writable (recommended for teams)&lt;br /&gt;
ws_allocate -G bw12a001 myWs 100         # Example: project group bw12a001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anyone in the group can use &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt; to see the workspace and extend it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ws_allocate -x -u owner myWs 100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using &amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; also enables smooth handover when team members leave — see [[NEMO2/Workspaces/Advanced_Features#Workspace_Handover|Workspace Handover]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set default group in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
groupname: bw12a001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Your project group name (e.g. &amp;lt;tt&amp;gt;bw12a001&amp;lt;/tt&amp;gt;) is typically assigned by your HPC site. Use &amp;lt;tt&amp;gt;groups&amp;lt;/tt&amp;gt; on the command line to list all groups you belong to.}}&lt;br /&gt;
&lt;br /&gt;
=== Share after creation ===&lt;br /&gt;
&lt;br /&gt;
If you didn&#039;t use &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; at creation, share read-only with &amp;lt;tt&amp;gt;ws_share&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ws_share share myWs alice bob            # Grant read access&lt;br /&gt;
ws_share list myWs                       # Show who has access&lt;br /&gt;
ws_share unshare myWs alice              # Remove access&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Advanced sharing:&#039;&#039;&#039; [[NEMO2/Workspaces/Advanced_Features#Sharing|Sharing guide]] for ACL-based per-user permissions.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces/Advanced_Features&amp;diff=16084</id>
		<title>NEMO2/Workspaces/Advanced Features</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces/Advanced_Features&amp;diff=16084"/>
		<updated>2026-05-20T12:59:06Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* ACLs (per-user fine-grained) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For basic daily usage see the main [[NEMO2/Workspaces|Workspaces]] guide.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Creating Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate myWs 100&lt;br /&gt;
&lt;br /&gt;
Returns the workspace path, e.g. &amp;lt;tt&amp;gt;/work/classic/$USER-myWs&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Running the same command again is safe — it returns the existing workspace path.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Capture path in variable:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_allocate myWs 100)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Common options:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable workspace&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable workspace&lt;br /&gt;
   $ ws_allocate -r 7 myWs 100              # Reminder 7 days before expiry&lt;br /&gt;
   $ ws_allocate -c &amp;quot;ML training data&amp;quot; myWs 100   # Add comment (shown in ws_list -l)&lt;br /&gt;
   $ ws_allocate -x myWs 100                # Extend existing workspace&lt;br /&gt;
   $ ws_allocate -x -u alice myWs 100       # Extend Alice&#039;s group workspace&lt;br /&gt;
   $ ws_allocate -r 7 -x myWs 0             # Update reminder only (no extension)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:20%&amp;quot; | Option&lt;br /&gt;
!style=&amp;quot;width:80%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Group-readable workspace&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-G &amp;lt;groupname&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Group-writable workspace. Set default in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-m &amp;lt;email&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Custom email for reminders (overrides identity provider email)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-r &amp;lt;days&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Reminder n days before expiration&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-c &amp;lt;comment&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Comment shown in &amp;lt;tt&amp;gt;ws_list -l&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-x&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Extend existing workspace&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-u &amp;lt;username&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Target another user&#039;s workspace (requires &amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using workspaces in batch jobs:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Create the workspace once on the login node, then use &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; in the job script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=my_job&lt;br /&gt;
&lt;br /&gt;
WORKSPACE=$(ws_find myProject)&lt;br /&gt;
cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./my_program --input input.dat --output results.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User Defaults: ~/.ws_user.conf ===&lt;br /&gt;
&lt;br /&gt;
Set defaults so you never forget important options. The file is in YAML format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
duration:  100&lt;br /&gt;
reminder:  7&lt;br /&gt;
groupname: projectgroup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; The first line must be a setting, not a comment. Some versions interpret a leading &amp;lt;tt&amp;gt;#&amp;lt;/tt&amp;gt; as an email address.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the config above, &amp;lt;tt&amp;gt;ws_allocate myWs&amp;lt;/tt&amp;gt; automatically creates a 100-day workspace with a 7-day reminder for the default group — no extra flags needed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:25%&amp;quot; | Setting&lt;br /&gt;
!style=&amp;quot;width:75%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;duration:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Default lifetime in days&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;reminder:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Days before expiration for reminder&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;groupname:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Default group for &amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; (see [[#Sharing|Sharing]])&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;mail:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Override notification email (optional)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Listing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_list                                # All your workspaces&lt;br /&gt;
   $ ws_list -Rr                            # Sort by remaining time (soonest first)&lt;br /&gt;
   $ ws_list -g                             # Include group workspaces&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
id: myWs&lt;br /&gt;
   workspace directory  : /work/classic/$USER-myWs&lt;br /&gt;
   remaining time       : 6 days 23 hours&lt;br /&gt;
   creation time        : Thu Apr 17 09:23:41 2025&lt;br /&gt;
   expiration time      : Mon May 26 09:23:41 2025&lt;br /&gt;
   available extensions : 98&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot; | Option&lt;br /&gt;
!style=&amp;quot;width:85%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-l&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Long listing (shows creation time, comment, extensions remaining)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-R&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Show remaining time as human-readable&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-r&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Reverse sort order&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-s&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Sort by creation time&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Include group workspaces (not just owned)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Finding Workspace Paths ==&lt;br /&gt;
&lt;br /&gt;
Returns the full path — primarily useful in scripts:&lt;br /&gt;
&lt;br /&gt;
   $ ws_find myWs&lt;br /&gt;
   /work/classic/$USER-myWs&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_find myWs)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Extending Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_extend myWs 100                      # Extend by 100 days (same as ws_allocate -x)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Expiry is recalculated from &#039;&#039;now&#039;&#039;. Extending too early reduces remaining time; extending near expiry gives maximum benefit.&lt;br /&gt;
&lt;br /&gt;
Group members can extend each other&#039;s workspaces:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -x -u alice myWs 100        # Requires workspace created with -G&lt;br /&gt;
&lt;br /&gt;
Each extension uses one of the 100 available extensions. Check remaining extensions with &amp;lt;tt&amp;gt;ws_list -l&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Releasing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_release myWs&lt;br /&gt;
&lt;br /&gt;
The workspace directory is immediately moved out of reach. The data is permanently deleted at the next nightly expirer run — &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; is possible until then.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
Do &#039;&#039;&#039;not&#039;&#039;&#039; rely on being able to restore a released workspace. If you have important data, archive it before releasing.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--delete-data&amp;lt;/tt&amp;gt; skips even that window and deletes immediately (&#039;&#039;&#039;cannot be restored&#039;&#039;&#039;). Only use this if you are certain the data is no longer needed.&lt;br /&gt;
&lt;br /&gt;
== Restoring Workspaces ==&lt;br /&gt;
&lt;br /&gt;
Restore workspaces that &#039;&#039;&#039;expired naturally&#039;&#039;&#039; (reached end of lifetime) within the 30-day grace period:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -l                          # (1) List restorable workspaces&lt;br /&gt;
   $ ws_allocate restored 100               # (2) Create target workspace&lt;br /&gt;
   $ ws_restore username-myWs-0 restored    # (3) Restore&lt;br /&gt;
&lt;br /&gt;
Use the &#039;&#039;&#039;full name&#039;&#039;&#039; from &amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; (includes username prefix and timestamp), not the short name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 12px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Released workspaces&#039;&#039;&#039; (deleted with &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt;) can be restored with &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; until the next nightly expirer run — after that they are permanently deleted.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the workspace is not listed, it has been &#039;&#039;&#039;permanently deleted&#039;&#039;&#039; — not recoverable by anyone.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:20%&amp;quot; | Option&lt;br /&gt;
!style=&amp;quot;width:80%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-l&amp;lt;/tt&amp;gt;&lt;br /&gt;
|List restorable workspaces&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-u &amp;lt;username&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Restore another user&#039;s workspace (requires permission)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Workspace Links ==&lt;br /&gt;
&lt;br /&gt;
Creates a directory of symlinks to all your workspaces for quick navigation:&lt;br /&gt;
&lt;br /&gt;
   $ ws_register ~/workspaces&lt;br /&gt;
   $ ls ~/workspaces/&lt;br /&gt;
   myWs -&amp;gt; /work/classic/$USER-myWs&lt;br /&gt;
&lt;br /&gt;
Re-run after creating new workspaces to keep the links up to date.&lt;br /&gt;
&lt;br /&gt;
== Sharing ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;NEVER use &amp;lt;tt&amp;gt;chmod 777&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;chmod o+rwx&amp;lt;/tt&amp;gt;!&#039;&#039;&#039;&lt;br /&gt;
Making workspaces world-readable is a security policy violation — use the methods below.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Group workspaces (recommended) ===&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable (read-only for group)&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable (recommended for teams)&lt;br /&gt;
&lt;br /&gt;
Set &amp;lt;tt&amp;gt;groupname&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt; so you don&#039;t have to type it every time.&lt;br /&gt;
&lt;br /&gt;
Benefits: team members can extend the workspace, &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt; shows it to everyone in the group, and new files automatically inherit group ownership.&lt;br /&gt;
&lt;br /&gt;
=== Read-only sharing after creation ===&lt;br /&gt;
&lt;br /&gt;
Share an existing workspace read-only with specific users outside your group:&lt;br /&gt;
&lt;br /&gt;
   $ ws_share share myWs alice bob          # Grant read access&lt;br /&gt;
   $ ws_share unshare myWs alice            # Remove access&lt;br /&gt;
   $ ws_share list myWs                     # Show who has access&lt;br /&gt;
&lt;br /&gt;
=== ACLs (per-user and per-group fine-grained) ===&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;tt&amp;gt;setfacl&amp;lt;/tt&amp;gt; when &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ws_share&amp;lt;/tt&amp;gt; do not cover your needs.&lt;br /&gt;
&lt;br /&gt;
==== User ACLs ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DIR=$(ws_find my_workspace)&lt;br /&gt;
setfacl -Rm user:alice:rX,default:user:alice:rX &amp;quot;$DIR&amp;quot;   # Read-only for alice&lt;br /&gt;
setfacl -Rm user:bob:rwX,default:user:bob:rwX   &amp;quot;$DIR&amp;quot;   # Read-write for bob&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Group ACLs ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
setfacl -Rm group:readgroup:rX,default:group:readgroup:rX         &amp;quot;$DIR&amp;quot;   # Read-only for group&lt;br /&gt;
setfacl -Rm group:projectgroup:rwX,default:group:projectgroup:rwX &amp;quot;$DIR&amp;quot;   # Read-write for group&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Inspect &amp;amp; Remove ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
getfacl     &amp;quot;$DIR&amp;quot;   # View current ACLs (users and groups)&lt;br /&gt;
setfacl -Rb &amp;quot;$DIR&amp;quot;   # Remove all ACLs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;-R&amp;lt;/tt&amp;gt; || Apply recursively to all subdirectories and files&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;default:&amp;lt;/tt&amp;gt; || New files automatically inherit the ACL entry&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;X&amp;lt;/tt&amp;gt; || Execute permission only on directories and executable files&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Workspace Handover ==&lt;br /&gt;
&lt;br /&gt;
When a team member leaves or transfers a project, their workspaces can be handed over without data loss.&lt;br /&gt;
&lt;br /&gt;
=== Preparation (before someone leaves) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-G groupname&amp;lt;/tt&amp;gt; can only be set &#039;&#039;&#039;at creation time&#039;&#039;&#039;. Always create shared research data with it from the start:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -G projectgroup -c &amp;quot;ML training data – contact alice&amp;quot; myWs 100&lt;br /&gt;
&lt;br /&gt;
This ensures:&lt;br /&gt;
* Group members can see the workspace with &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Any group member can extend it: &amp;lt;tt&amp;gt;ws_allocate -x -u alice myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Data remains accessible after the original owner&#039;s account is deactivated&lt;br /&gt;
&lt;br /&gt;
To ensure someone else receives expiry reminders, there are two options:&lt;br /&gt;
&lt;br /&gt;
* Add their email to &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt; of the owner (or use &amp;lt;tt&amp;gt;-m email&amp;lt;/tt&amp;gt; at allocate time):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mailaddress: alice@uni-freiburg.de,backup@uni-freiburg.de&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Or actively take over the reminders as the new responsible person:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -r 7 -u alice -x myWs 0   # Redirect reminders to yourself&lt;br /&gt;
&lt;br /&gt;
=== After the owner has left ===&lt;br /&gt;
&lt;br /&gt;
If the workspace was created with &amp;lt;tt&amp;gt;-G groupname&amp;lt;/tt&amp;gt;, a group member can keep it alive:&lt;br /&gt;
&lt;br /&gt;
   $ ws_list -g                                  # Find group workspaces&lt;br /&gt;
   $ ws_allocate -x -u formercolleague myWs 100  # Extend (while still restorable)&lt;br /&gt;
&lt;br /&gt;
If the workspace has already expired, an authorized group member or administrator can restore it:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -u formercolleague -l        # List their restorable workspaces&lt;br /&gt;
   $ ws_allocate newname 100&lt;br /&gt;
   $ ws_restore -u formercolleague formercolleague-myWs-0 newname&lt;br /&gt;
&lt;br /&gt;
=== Workspaces without group access ===&lt;br /&gt;
&lt;br /&gt;
If the workspace was created without &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt;, contact the HPC support team for assistance during the grace period (30 days after expiry).&lt;br /&gt;
&lt;br /&gt;
== Reminders ==&lt;br /&gt;
&lt;br /&gt;
Reminders are automatic. The notification goes to your identity provider email address.&lt;br /&gt;
&lt;br /&gt;
Customize reminder timing at workspace creation:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -r 7 myWs 100              # Reminder 7 days before expiry&lt;br /&gt;
&lt;br /&gt;
Custom email address:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -m custom@example.com myWs 100&lt;br /&gt;
&lt;br /&gt;
Update reminder timing (or take over reminders) without extending:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -r 7 -x myWs 0            # Change timing only&lt;br /&gt;
   $ ws_allocate -r 7 -u alice -x myWs 0   # Take over reminders for Alice&#039;s workspace&lt;br /&gt;
&lt;br /&gt;
The last command is useful when taking responsibility for a colleague&#039;s workspace.&lt;br /&gt;
&lt;br /&gt;
== Quotas &amp;amp; Limits ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:35%&amp;quot; | Parameter&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot; | Value&lt;br /&gt;
|-&lt;br /&gt;
|Default lifetime&lt;br /&gt;
|30 days&lt;br /&gt;
|-&lt;br /&gt;
|Maximum lifetime&lt;br /&gt;
|100 days&lt;br /&gt;
|-&lt;br /&gt;
|Maximum extensions&lt;br /&gt;
|100 times&lt;br /&gt;
|-&lt;br /&gt;
|Storage quota&lt;br /&gt;
|5 TiB per workspace&lt;br /&gt;
|-&lt;br /&gt;
|Grace period (expired workspaces)&lt;br /&gt;
|30 days (recoverable with &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|Grace period (released workspaces)&lt;br /&gt;
|next nightly expirer run (&#039;&#039;&#039;not reliably recoverable&#039;&#039;&#039;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Check quota:&lt;br /&gt;
&lt;br /&gt;
   $ nemoquota                               # HOME + workspace quotas&lt;br /&gt;
   $ df --si $(ws_find myWs)                 # Size of a specific workspace&lt;br /&gt;
&lt;br /&gt;
Released workspaces count toward quota until the nightly cleanup runs. Use &amp;lt;tt&amp;gt;ws_release --delete-data&amp;lt;/tt&amp;gt; for immediate relief (&#039;&#039;&#039;irreversible&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Best Practices ==&lt;br /&gt;
&lt;br /&gt;
# Set up &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt; — defaults save time and prevent mistakes&lt;br /&gt;
# Use &amp;lt;tt&amp;gt;-G groupname&amp;lt;/tt&amp;gt; for research data — essential for handover and collaboration&lt;br /&gt;
# Create workspaces on the login node — use &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; in job scripts, don&#039;t create inside jobs&lt;br /&gt;
# Monitor with &amp;lt;tt&amp;gt;ws_list -Rr&amp;lt;/tt&amp;gt; — sort by remaining time to catch workspaces about to expire&lt;br /&gt;
# Archive before expiry — workspaces are not backed up&lt;br /&gt;
# Clean up finished workspaces — &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt; frees quota and reduces clutter&lt;br /&gt;
&lt;br /&gt;
Single-node temporary files belong in &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt;, not workspaces.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers&amp;diff=16080</id>
		<title>NEMO2/Containers</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers&amp;diff=16080"/>
		<updated>2026-05-19T08:42:54Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NEMO supports two container runtimes for different use cases.&lt;br /&gt;
Neither requires root privileges and both integrate with the cluster&#039;s shared filesystems (&amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! [[NEMO2/Containers/Enroot|Enroot + Pyxis]] (recommended)&lt;br /&gt;
! [[NEMO2/Containers/Apptainer|Apptainer / Singularity]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Image source&#039;&#039;&#039;&lt;br /&gt;
| Docker Hub, NGC, any OCI registry&lt;br /&gt;
| Docker Hub, NGC, any OCI registry; SIF files&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Image format&#039;&#039;&#039;&lt;br /&gt;
| SquashFS (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;)&lt;br /&gt;
| SIF (&amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Slurm integration&#039;&#039;&#039;&lt;br /&gt;
| Native via Pyxis plugin (&amp;lt;tt&amp;gt;--container-name&amp;lt;/tt&amp;gt; etc.)&lt;br /&gt;
| Manual — wrap in batch script&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;GPU support&#039;&#039;&#039;&lt;br /&gt;
| Automatic, no extra flags needed&lt;br /&gt;
| Via &amp;lt;tt&amp;gt;--nv&amp;lt;/tt&amp;gt; flag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Installation&#039;&#039;&#039;&lt;br /&gt;
| System-wide, always available&lt;br /&gt;
| System-wide, always available&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Best for&#039;&#039;&#039;&lt;br /&gt;
| Docker-based workflows, GPU workloads, Slurm batch jobs&lt;br /&gt;
| Existing SIF images, reproducible science, portability&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== When to use what ==&lt;br /&gt;
&lt;br /&gt;
; Enroot + Pyxis&lt;br /&gt;
: Use this if you want to run Docker images directly from a registry, submit containerised jobs via &amp;lt;tt&amp;gt;srun&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;sbatch&amp;lt;/tt&amp;gt;, or need tight GPU integration.&lt;br /&gt;
: [[NEMO2/Containers/Enroot|→ Enroot &amp;amp; Pyxis details]]&lt;br /&gt;
&lt;br /&gt;
; Apptainer / Singularity&lt;br /&gt;
: Use this if you have an existing &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; image, need a self-contained portable image you can copy between systems, or are working with workflows that already use Apptainer/Singularity.&lt;br /&gt;
: [[NEMO2/Containers/Apptainer|→ Apptainer details]]&lt;br /&gt;
&lt;br /&gt;
== Note on Docker ==&lt;br /&gt;
&lt;br /&gt;
Plain Docker is &#039;&#039;&#039;not available&#039;&#039;&#039; on NEMO. Both Enroot and Apptainer can pull Docker/OCI images directly from registries without a local Docker installation.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2&amp;diff=16071</id>
		<title>NEMO2</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2&amp;diff=16071"/>
		<updated>2026-05-12T16:02:22Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Serverraum-2024-09.jpg|center|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;bwForCluster NEMO 2&#039;&#039;&#039; is dedicated to research in the bwHPC domains Neuroscience, Elementary Particle Physics, Microsystems Engineering and Material Science (NEMO).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{| style=&amp;quot;  background:#ffa833; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f80; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | NEMO1 Migration&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* Still using NEMO1: &#039;&#039;&#039;[[NEMO1|Go To NEMO1 Legacy Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Users of NEMO1 must&#039;&#039;&#039; [[Registration/bwForCluster/NEMO2|&#039;&#039;&#039;re-register for NEMO2&#039;&#039;&#039;]] (only step C necessary). You keep your existing projects (Rechenvorhaben).&lt;br /&gt;
* &#039;&#039;&#039;[[NEMO2/Migrate NEMO1 workspaces to NEMO2 workspaces|Migrate NEMO1 workspaces to NEMO2 workspaces]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[NEMO2/Migrate Moab to Slurm jobs|Migrate Moab to Slurm jobs]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#ffa833; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f80; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Maintenance&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;strong&amp;gt;[https://www.nemo.uni-freiburg.de/nemo/stat/ Scheduled Power Maintenance 09.04.2024]&amp;lt;/strong&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#FEF4AB; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#FFE856; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | News and Events&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [https://www.nemo.uni-freiburg.de/news/ NEMO News]&lt;br /&gt;
* [https://www.nemo.uni-freiburg.de/nemo/stat/ NEMO Status, Usage and (Maintenance) Announcements]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#eeeefe; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Training &amp;amp; Support&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [[NEMO2/Start|Getting Started]]&lt;br /&gt;
* [https://training.bwhpc.de E-Learning Courses]&lt;br /&gt;
* Contact and [[NEMO2/Support|Support]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | User Documentation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[Registration]] for one of the bwHPC clusters&lt;br /&gt;
* [[NEMO2/Login|Login]]&lt;br /&gt;
* [[NEMO2/Hardware|Hardware and Architecture]]&lt;br /&gt;
* [[NEMO2/Hardware#File_Systems|File Systems]]&lt;br /&gt;
** [[NEMO2/Workspaces|Workspaces]]&lt;br /&gt;
** [[NEMO2/SDS_hd|Using SDS@hd on NEMO2]]&lt;br /&gt;
* Cluster Specific Software:&lt;br /&gt;
** [[NEMO2/Modules|Available Modules (Wiki)]] or [https://www.nemo.uni-freiburg.de/easybuild-modules/ Available Modules (HTML, incl. search)] on NEMO2&lt;br /&gt;
** [[NEMO2/Easybuild Modules|Easybuild Modules]] (hints for building your own software!)&lt;br /&gt;
** [[Conda]]&lt;br /&gt;
** [[NEMO2/Containers|Containers]] (Enroot and Apptainer/Singularity)&lt;br /&gt;
* [[NEMO2/Slurm|Submitting and managing Jobs with Slurm]] ([[HPC_Glossary#Batch_System|Batch System]])&lt;br /&gt;
* [[Development]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#e6e9eb; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#d1dadf; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Cluster Funding&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Please [[NEMO2/Acknowledgement|acknowledge]] the NEMO2 in your publications.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces/Advanced_Features&amp;diff=16070</id>
		<title>NEMO2/Workspaces/Advanced Features</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces/Advanced_Features&amp;diff=16070"/>
		<updated>2026-05-12T15:58:17Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For basic daily usage see the main [[NEMO2/Workspaces|Workspaces]] guide.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Creating Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate myWs 100&lt;br /&gt;
&lt;br /&gt;
Returns the workspace path, e.g. &amp;lt;tt&amp;gt;/work/classic/$USER-myWs&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Running the same command again is safe — it returns the existing workspace path.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Capture path in variable:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_allocate myWs 100)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Common options:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable workspace&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable workspace&lt;br /&gt;
   $ ws_allocate -r 7 myWs 100              # Reminder 7 days before expiry&lt;br /&gt;
   $ ws_allocate -c &amp;quot;ML training data&amp;quot; myWs 100   # Add comment (shown in ws_list -l)&lt;br /&gt;
   $ ws_allocate -x myWs 100                # Extend existing workspace&lt;br /&gt;
   $ ws_allocate -x -u alice myWs 100       # Extend Alice&#039;s group workspace&lt;br /&gt;
   $ ws_allocate -r 7 -x myWs 0             # Update reminder only (no extension)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:20%&amp;quot; | Option&lt;br /&gt;
!style=&amp;quot;width:80%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Group-readable workspace&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-G &amp;lt;groupname&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Group-writable workspace. Set default in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-m &amp;lt;email&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Custom email for reminders (overrides identity provider email)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-r &amp;lt;days&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Reminder n days before expiration&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-c &amp;lt;comment&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Comment shown in &amp;lt;tt&amp;gt;ws_list -l&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-x&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Extend existing workspace&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-u &amp;lt;username&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Target another user&#039;s workspace (requires &amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using workspaces in batch jobs:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Create the workspace once on the login node, then use &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; in the job script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=my_job&lt;br /&gt;
&lt;br /&gt;
WORKSPACE=$(ws_find myProject)&lt;br /&gt;
cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./my_program --input input.dat --output results.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User Defaults: ~/.ws_user.conf ===&lt;br /&gt;
&lt;br /&gt;
Set defaults so you never forget important options. The file is in YAML format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
duration:  100&lt;br /&gt;
reminder:  7&lt;br /&gt;
groupname: projectgroup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; The first line must be a setting, not a comment. Some versions interpret a leading &amp;lt;tt&amp;gt;#&amp;lt;/tt&amp;gt; as an email address.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the config above, &amp;lt;tt&amp;gt;ws_allocate myWs&amp;lt;/tt&amp;gt; automatically creates a 100-day workspace with a 7-day reminder for the default group — no extra flags needed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:25%&amp;quot; | Setting&lt;br /&gt;
!style=&amp;quot;width:75%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;duration:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Default lifetime in days&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;reminder:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Days before expiration for reminder&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;groupname:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Default group for &amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; (see [[#Sharing|Sharing]])&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;mail:&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Override notification email (optional)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Listing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_list                                # All your workspaces&lt;br /&gt;
   $ ws_list -Rr                            # Sort by remaining time (soonest first)&lt;br /&gt;
   $ ws_list -g                             # Include group workspaces&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
id: myWs&lt;br /&gt;
   workspace directory  : /work/classic/$USER-myWs&lt;br /&gt;
   remaining time       : 6 days 23 hours&lt;br /&gt;
   creation time        : Thu Apr 17 09:23:41 2025&lt;br /&gt;
   expiration time      : Mon May 26 09:23:41 2025&lt;br /&gt;
   available extensions : 98&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot; | Option&lt;br /&gt;
!style=&amp;quot;width:85%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-l&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Long listing (shows creation time, comment, extensions remaining)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-R&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Show remaining time as human-readable&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-r&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Reverse sort order&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-s&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Sort by creation time&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Include group workspaces (not just owned)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Finding Workspace Paths ==&lt;br /&gt;
&lt;br /&gt;
Returns the full path — primarily useful in scripts:&lt;br /&gt;
&lt;br /&gt;
   $ ws_find myWs&lt;br /&gt;
   /work/classic/$USER-myWs&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_find myWs)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Extending Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_extend myWs 100                      # Extend by 100 days (same as ws_allocate -x)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Expiry is recalculated from &#039;&#039;now&#039;&#039;. Extending too early reduces remaining time; extending near expiry gives maximum benefit.&lt;br /&gt;
&lt;br /&gt;
Group members can extend each other&#039;s workspaces:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -x -u alice myWs 100        # Requires workspace created with -G&lt;br /&gt;
&lt;br /&gt;
Each extension uses one of the 100 available extensions. Check remaining extensions with &amp;lt;tt&amp;gt;ws_list -l&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Releasing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_release myWs&lt;br /&gt;
&lt;br /&gt;
The workspace directory is immediately moved out of reach. The data is permanently deleted at the next nightly expirer run — &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; is possible until then.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
Do &#039;&#039;&#039;not&#039;&#039;&#039; rely on being able to restore a released workspace. If you have important data, archive it before releasing.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--delete-data&amp;lt;/tt&amp;gt; skips even that window and deletes immediately (&#039;&#039;&#039;cannot be restored&#039;&#039;&#039;). Only use this if you are certain the data is no longer needed.&lt;br /&gt;
&lt;br /&gt;
== Restoring Workspaces ==&lt;br /&gt;
&lt;br /&gt;
Restore workspaces that &#039;&#039;&#039;expired naturally&#039;&#039;&#039; (reached end of lifetime) within the 30-day grace period:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -l                          # (1) List restorable workspaces&lt;br /&gt;
   $ ws_allocate restored 100               # (2) Create target workspace&lt;br /&gt;
   $ ws_restore username-myWs-0 restored    # (3) Restore&lt;br /&gt;
&lt;br /&gt;
Use the &#039;&#039;&#039;full name&#039;&#039;&#039; from &amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; (includes username prefix and timestamp), not the short name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 12px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Released workspaces&#039;&#039;&#039; (deleted with &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt;) can be restored with &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; until the next nightly expirer run — after that they are permanently deleted.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the workspace is not listed, it has been &#039;&#039;&#039;permanently deleted&#039;&#039;&#039; — not recoverable by anyone.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width:20%&amp;quot; | Option&lt;br /&gt;
!style=&amp;quot;width:80%&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-l&amp;lt;/tt&amp;gt;&lt;br /&gt;
|List restorable workspaces&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-u &amp;lt;username&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|Restore another user&#039;s workspace (requires permission)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Workspace Links ==&lt;br /&gt;
&lt;br /&gt;
Creates a directory of symlinks to all your workspaces for quick navigation:&lt;br /&gt;
&lt;br /&gt;
   $ ws_register ~/workspaces&lt;br /&gt;
   $ ls ~/workspaces/&lt;br /&gt;
   myWs -&amp;gt; /work/classic/$USER-myWs&lt;br /&gt;
&lt;br /&gt;
Re-run after creating new workspaces to keep the links up to date.&lt;br /&gt;
&lt;br /&gt;
== Sharing ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;NEVER use &amp;lt;tt&amp;gt;chmod 777&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;chmod o+rwx&amp;lt;/tt&amp;gt;!&#039;&#039;&#039;&lt;br /&gt;
Making workspaces world-readable is a security policy violation — use the methods below.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Group workspaces (recommended) ===&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable (read-only for group)&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable (recommended for teams)&lt;br /&gt;
&lt;br /&gt;
Set &amp;lt;tt&amp;gt;groupname&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt; so you don&#039;t have to type it every time.&lt;br /&gt;
&lt;br /&gt;
Benefits: team members can extend the workspace, &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt; shows it to everyone in the group, and new files automatically inherit group ownership.&lt;br /&gt;
&lt;br /&gt;
=== Read-only sharing after creation ===&lt;br /&gt;
&lt;br /&gt;
Share an existing workspace read-only with specific users outside your group:&lt;br /&gt;
&lt;br /&gt;
   $ ws_share share myWs alice bob          # Grant read access&lt;br /&gt;
   $ ws_share unshare myWs alice            # Remove access&lt;br /&gt;
   $ ws_share list myWs                     # Show who has access&lt;br /&gt;
&lt;br /&gt;
=== ACLs (per-user fine-grained) ===&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;tt&amp;gt;setfacl&amp;lt;/tt&amp;gt; when &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ws_share&amp;lt;/tt&amp;gt; don&#039;t cover your needs.&lt;br /&gt;
&lt;br /&gt;
   $ DIR=$(ws_find my_workspace)&lt;br /&gt;
&lt;br /&gt;
   $ setfacl -Rm user:alice:rX,default:user:alice:rX &amp;quot;$DIR&amp;quot;   # Read-only for alice&lt;br /&gt;
   $ setfacl -Rm user:bob:rwX,default:user:bob:rwX  &amp;quot;$DIR&amp;quot;    # Read-write for bob&lt;br /&gt;
   $ getfacl &amp;quot;$DIR&amp;quot;                                           # View current ACLs&lt;br /&gt;
   $ setfacl -Rb &amp;quot;$DIR&amp;quot;                                       # Remove all ACLs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-R&amp;lt;/tt&amp;gt; recursive, &amp;lt;tt&amp;gt;default:&amp;lt;/tt&amp;gt; makes new files inherit the ACL, &amp;lt;tt&amp;gt;X&amp;lt;/tt&amp;gt; execute only on dirs/executables.&lt;br /&gt;
&lt;br /&gt;
== Workspace Handover ==&lt;br /&gt;
&lt;br /&gt;
When a team member leaves or transfers a project, their workspaces can be handed over without data loss.&lt;br /&gt;
&lt;br /&gt;
=== Preparation (before someone leaves) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-G groupname&amp;lt;/tt&amp;gt; can only be set &#039;&#039;&#039;at creation time&#039;&#039;&#039;. Always create shared research data with it from the start:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -G projectgroup -c &amp;quot;ML training data – contact alice&amp;quot; myWs 100&lt;br /&gt;
&lt;br /&gt;
This ensures:&lt;br /&gt;
* Group members can see the workspace with &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Any group member can extend it: &amp;lt;tt&amp;gt;ws_allocate -x -u alice myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Data remains accessible after the original owner&#039;s account is deactivated&lt;br /&gt;
&lt;br /&gt;
To ensure someone else receives expiry reminders, there are two options:&lt;br /&gt;
&lt;br /&gt;
* Add their email to &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt; of the owner (or use &amp;lt;tt&amp;gt;-m email&amp;lt;/tt&amp;gt; at allocate time):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mailaddress: alice@uni-freiburg.de,backup@uni-freiburg.de&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Or actively take over the reminders as the new responsible person:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -r 7 -u alice -x myWs 0   # Redirect reminders to yourself&lt;br /&gt;
&lt;br /&gt;
=== After the owner has left ===&lt;br /&gt;
&lt;br /&gt;
If the workspace was created with &amp;lt;tt&amp;gt;-G groupname&amp;lt;/tt&amp;gt;, a group member can keep it alive:&lt;br /&gt;
&lt;br /&gt;
   $ ws_list -g                                  # Find group workspaces&lt;br /&gt;
   $ ws_allocate -x -u formercolleague myWs 100  # Extend (while still restorable)&lt;br /&gt;
&lt;br /&gt;
If the workspace has already expired, an authorized group member or administrator can restore it:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -u formercolleague -l        # List their restorable workspaces&lt;br /&gt;
   $ ws_allocate newname 100&lt;br /&gt;
   $ ws_restore -u formercolleague formercolleague-myWs-0 newname&lt;br /&gt;
&lt;br /&gt;
=== Workspaces without group access ===&lt;br /&gt;
&lt;br /&gt;
If the workspace was created without &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt;, contact the HPC support team for assistance during the grace period (30 days after expiry).&lt;br /&gt;
&lt;br /&gt;
== Reminders ==&lt;br /&gt;
&lt;br /&gt;
Reminders are automatic. The notification goes to your identity provider email address.&lt;br /&gt;
&lt;br /&gt;
Customize reminder timing at workspace creation:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -r 7 myWs 100              # Reminder 7 days before expiry&lt;br /&gt;
&lt;br /&gt;
Custom email address:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -m custom@example.com myWs 100&lt;br /&gt;
&lt;br /&gt;
Update reminder timing (or take over reminders) without extending:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -r 7 -x myWs 0            # Change timing only&lt;br /&gt;
   $ ws_allocate -r 7 -u alice -x myWs 0   # Take over reminders for Alice&#039;s workspace&lt;br /&gt;
&lt;br /&gt;
The last command is useful when taking responsibility for a colleague&#039;s workspace.&lt;br /&gt;
&lt;br /&gt;
== Quotas &amp;amp; Limits ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:35%&amp;quot; | Parameter&lt;br /&gt;
!style=&amp;quot;width:65%&amp;quot; | Value&lt;br /&gt;
|-&lt;br /&gt;
|Default lifetime&lt;br /&gt;
|30 days&lt;br /&gt;
|-&lt;br /&gt;
|Maximum lifetime&lt;br /&gt;
|100 days&lt;br /&gt;
|-&lt;br /&gt;
|Maximum extensions&lt;br /&gt;
|100 times&lt;br /&gt;
|-&lt;br /&gt;
|Storage quota&lt;br /&gt;
|5 TiB per workspace&lt;br /&gt;
|-&lt;br /&gt;
|Grace period (expired workspaces)&lt;br /&gt;
|30 days (recoverable with &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|Grace period (released workspaces)&lt;br /&gt;
|next nightly expirer run (&#039;&#039;&#039;not reliably recoverable&#039;&#039;&#039;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Check quota:&lt;br /&gt;
&lt;br /&gt;
   $ nemoquota                               # HOME + workspace quotas&lt;br /&gt;
   $ df --si $(ws_find myWs)                 # Size of a specific workspace&lt;br /&gt;
&lt;br /&gt;
Released workspaces count toward quota until the nightly cleanup runs. Use &amp;lt;tt&amp;gt;ws_release --delete-data&amp;lt;/tt&amp;gt; for immediate relief (&#039;&#039;&#039;irreversible&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Best Practices ==&lt;br /&gt;
&lt;br /&gt;
# Set up &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt; — defaults save time and prevent mistakes&lt;br /&gt;
# Use &amp;lt;tt&amp;gt;-G groupname&amp;lt;/tt&amp;gt; for research data — essential for handover and collaboration&lt;br /&gt;
# Create workspaces on the login node — use &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; in job scripts, don&#039;t create inside jobs&lt;br /&gt;
# Monitor with &amp;lt;tt&amp;gt;ws_list -Rr&amp;lt;/tt&amp;gt; — sort by remaining time to catch workspaces about to expire&lt;br /&gt;
# Archive before expiry — workspaces are not backed up&lt;br /&gt;
# Clean up finished workspaces — &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt; frees quota and reduces clutter&lt;br /&gt;
&lt;br /&gt;
Single-node temporary files belong in &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt;, not workspaces.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16069</id>
		<title>NEMO2/Workspaces</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16069"/>
		<updated>2026-05-12T15:37:22Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 15px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is the updated Workspaces guide for NEMO2. For other clusters please use: [[Workspace]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Workspace tools&#039;&#039;&#039; provide temporary storage on NEMO&#039;s fast parallel filesystem (Weka).&lt;br /&gt;
They are meant for data that needs to persist longer than a single job, but not permanently.&lt;br /&gt;
&lt;br /&gt;
For advanced features — user config (&amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;), reminders, quotas, workspace handover, and more — see [[NEMO2/Workspaces/Advanced_Features|Advanced Features]].&lt;br /&gt;
&lt;br /&gt;
== What are Workspaces? ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Jobs generating intermediate data&lt;br /&gt;
* Data shared between multiple compute nodes&lt;br /&gt;
* Multi-step workflows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Don&#039;t use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Permanent storage (use HOME or project directories)&lt;br /&gt;
* Single-node temporary files (use &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt; instead)&lt;br /&gt;
&lt;br /&gt;
== Important - Read First ==&lt;br /&gt;
&lt;br /&gt;
* No Backup: Data is &#039;&#039;&#039;not backed up&#039;&#039;&#039; and will be &#039;&#039;&#039;automatically deleted&#039;&#039;&#039; after expiration&lt;br /&gt;
* Time-limited: Maximum lifetime is 100 days, up to 100 extensions&lt;br /&gt;
* Email Reminders: You receive email notifications before expiration&lt;br /&gt;
* Backup Important Data: Copy results to permanent storage before expiration&lt;br /&gt;
&lt;br /&gt;
== Command Overview ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_allocate&amp;lt;/tt&amp;gt; - Create or extend workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt; - List your workspaces&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; - Find workspace path (for scripts)&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_extend&amp;lt;/tt&amp;gt; - Extend workspace lifetime&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt; - Release (delete) workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; - Restore expired/released workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_register&amp;lt;/tt&amp;gt; - Create symbolic links&lt;br /&gt;
&lt;br /&gt;
All commands support &amp;lt;tt&amp;gt;-h&amp;lt;/tt&amp;gt; for help.&lt;br /&gt;
&lt;br /&gt;
== Quick Start ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:40%&amp;quot; | Task&lt;br /&gt;
!style=&amp;quot;width:60%&amp;quot; | Command&lt;br /&gt;
|-&lt;br /&gt;
|Create workspace (100 days)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Create group workspace&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate -G groupname myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|List all workspaces&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|See what expires soon&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list -Rr&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Find path (for scripts)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_find myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Extend by 100 days&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_extend myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Delete workspace (permanent, next nightly run)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_release myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Restore expired workspace (30d grace)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; then &amp;lt;tt&amp;gt;ws_restore oldname newname&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Creating Workspaces ==&lt;br /&gt;
&lt;br /&gt;
Create a workspace with a &#039;&#039;&#039;name&#039;&#039;&#039; and &#039;&#039;&#039;lifetime&#039;&#039;&#039; in days:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate myWs 100&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
   /work/classic/$USER-myWs&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Capture path in variable:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_allocate myWs 100)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Running the same command again is safe - returns the existing workspace path.&lt;br /&gt;
&lt;br /&gt;
== Listing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_list                                # List all workspaces&lt;br /&gt;
   $ ws_list -Rr                            # Sort by remaining time, soonest first&lt;br /&gt;
   $ ws_list -g                             # Show group workspaces&lt;br /&gt;
&lt;br /&gt;
== Extending Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_extend myWs 100                      # Extend by 100 days from now&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alternative:&#039;&#039;&#039; &amp;lt;tt&amp;gt;ws_allocate -x myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each extension consumes one of your available extensions (100 total).&lt;br /&gt;
&lt;br /&gt;
== Releasing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_release myWs&lt;br /&gt;
&lt;br /&gt;
The workspace becomes inaccessible immediately and is permanently deleted at the next nightly expirer run. &#039;&#039;&#039;Do not rely on recovering a released workspace.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Restoring Workspaces ==&lt;br /&gt;
&lt;br /&gt;
Recover workspaces that &#039;&#039;&#039;expired naturally&#039;&#039;&#039; (reached end of lifetime) within the 30-day grace period:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -l                          # (1) List restorable workspaces&lt;br /&gt;
   $ ws_allocate restored 100               # (2) Create target workspace&lt;br /&gt;
   $ ws_restore username-myWs-0 restored    # (3) Restore&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Use the &#039;&#039;&#039;full name&#039;&#039;&#039; from &amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; (with username and timestamp), not the short name.&lt;br /&gt;
Released workspaces (via &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt;) can also be restored, but only until the next nightly expirer run — after that they are permanently deleted.&lt;br /&gt;
&lt;br /&gt;
== Sharing Workspaces ==&lt;br /&gt;
&lt;br /&gt;
=== Group workspace (recommended) ===&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable (read-only for group)&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable (recommended for teams)&lt;br /&gt;
&lt;br /&gt;
Anyone in the group can use &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt; to see the workspace and extend it with &amp;lt;tt&amp;gt;ws_allocate -x -u owner myWs 100&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Using &amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; also enables smooth handover when team members leave — see [[NEMO2/Workspaces/Advanced_Features#Workspace_Handover|Workspace Handover]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set default group in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
groupname: projectgroup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Share after creation ===&lt;br /&gt;
&lt;br /&gt;
If you didn&#039;t use &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; at creation, share read-only with &amp;lt;tt&amp;gt;ws_share&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
   $ ws_share share myWs alice bob          # Grant read access&lt;br /&gt;
   $ ws_share list myWs                     # Show who has access&lt;br /&gt;
   $ ws_share unshare myWs alice            # Remove access&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Advanced sharing:&#039;&#039;&#039; [[NEMO2/Workspaces/Advanced_Features#Sharing|Sharing guide]] for ACL-based per-user permissions.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16068</id>
		<title>NEMO2/Workspaces</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16068"/>
		<updated>2026-05-12T15:20:40Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 15px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is the updated Workspaces guide for NEMO2. For other clusters please use: [[Workspace]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Workspace tools&#039;&#039;&#039; provide temporary storage on NEMO&#039;s fast parallel filesystem (Weka).&lt;br /&gt;
They are meant for data that needs to persist longer than a single job, but not permanently.&lt;br /&gt;
&lt;br /&gt;
For advanced features — user config (&amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;), reminders, quotas, workspace handover, and more — see [[NEMO2/Workspaces/Advanced_Features|Advanced Features]].&lt;br /&gt;
&lt;br /&gt;
== What are Workspaces? ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Jobs generating intermediate data&lt;br /&gt;
* Data shared between multiple compute nodes&lt;br /&gt;
* Multi-step workflows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Don&#039;t use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Permanent storage (use HOME or project directories)&lt;br /&gt;
* Single-node temporary files (use &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt; instead)&lt;br /&gt;
&lt;br /&gt;
== Important - Read First ==&lt;br /&gt;
&lt;br /&gt;
* No Backup: Data is &#039;&#039;&#039;not backed up&#039;&#039;&#039; and will be &#039;&#039;&#039;automatically deleted&#039;&#039;&#039; after expiration&lt;br /&gt;
* Time-limited: Maximum lifetime is 100 days, up to 100 extensions&lt;br /&gt;
* Email Reminders: You receive email notifications before expiration&lt;br /&gt;
* Backup Important Data: Copy results to permanent storage before expiration&lt;br /&gt;
&lt;br /&gt;
== Command Overview ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_allocate&amp;lt;/tt&amp;gt; - Create or extend workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt; - List your workspaces&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; - Find workspace path (for scripts)&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_extend&amp;lt;/tt&amp;gt; - Extend workspace lifetime&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt; - Release (delete) workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; - Restore expired/released workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_register&amp;lt;/tt&amp;gt; - Create symbolic links&lt;br /&gt;
&lt;br /&gt;
All commands support &amp;lt;tt&amp;gt;-h&amp;lt;/tt&amp;gt; for help.&lt;br /&gt;
&lt;br /&gt;
== Quick Start ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:40%&amp;quot; | Task&lt;br /&gt;
!style=&amp;quot;width:60%&amp;quot; | Command&lt;br /&gt;
|-&lt;br /&gt;
|Create workspace (100 days)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Create group workspace&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate -G groupname myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|List all workspaces&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|See what expires soon&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list -Rr&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Find path (for scripts)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_find myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Extend by 100 days&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_extend myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Delete workspace (permanent, next nightly run)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_release myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Restore expired workspace (30d grace)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; then &amp;lt;tt&amp;gt;ws_restore oldname newname&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Create Workspace ==&lt;br /&gt;
&lt;br /&gt;
Create a workspace with a &#039;&#039;&#039;name&#039;&#039;&#039; and &#039;&#039;&#039;lifetime&#039;&#039;&#039; in days:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate myWs 100&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
   /work/workspace/scratch/username-myWs-0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Capture path in variable:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_allocate myWs 100)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Running the same command again is safe - returns the existing workspace path.&lt;br /&gt;
&lt;br /&gt;
== List Your Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_list                                # List all workspaces&lt;br /&gt;
   $ ws_list -Rr                            # Sort by remaining time, soonest first&lt;br /&gt;
   $ ws_list -g                             # Show group workspaces&lt;br /&gt;
&lt;br /&gt;
== Extend Workspace Lifetime ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_extend myWs 100                      # Extend by 100 days from now&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alternative:&#039;&#039;&#039; &amp;lt;tt&amp;gt;ws_allocate -x myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each extension consumes one of your available extensions (100 total).&lt;br /&gt;
&lt;br /&gt;
== Release (Delete) Workspace ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_release myWs&lt;br /&gt;
&lt;br /&gt;
The workspace becomes inaccessible immediately and is permanently deleted at the next nightly expirer run. &#039;&#039;&#039;Do not rely on recovering a released workspace.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Restore Workspace ==&lt;br /&gt;
&lt;br /&gt;
Recover workspaces that &#039;&#039;&#039;expired naturally&#039;&#039;&#039; (reached end of lifetime) within the 30-day grace period:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -l                          # (1) List restorable workspaces&lt;br /&gt;
   $ ws_allocate restored 100               # (2) Create target workspace&lt;br /&gt;
   $ ws_restore username-myWs-0 restored    # (3) Restore&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Use the &#039;&#039;&#039;full name&#039;&#039;&#039; from &amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; (with username and timestamp), not the short name.&lt;br /&gt;
Released workspaces (via &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt;) can also be restored, but only until the next nightly expirer run — after that they are permanently deleted.&lt;br /&gt;
&lt;br /&gt;
== Share Workspaces ==&lt;br /&gt;
&lt;br /&gt;
=== Group workspace (recommended) ===&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable (read-only for group)&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable (recommended for teams)&lt;br /&gt;
&lt;br /&gt;
Anyone in the group can use &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt; to see the workspace and extend it with &amp;lt;tt&amp;gt;ws_allocate -x -u owner myWs 100&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Using &amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; also enables smooth handover when team members leave — see [[NEMO2/Workspaces/Advanced_Features#Workspace_Handover|Workspace Handover]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set default group in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
groupname: projectgroup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Share after creation ===&lt;br /&gt;
&lt;br /&gt;
If you didn&#039;t use &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; at creation, share read-only with &amp;lt;tt&amp;gt;ws_share&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
   $ ws_share share myWs alice bob          # Grant read access&lt;br /&gt;
   $ ws_share list myWs                     # Show who has access&lt;br /&gt;
   $ ws_share unshare myWs alice            # Remove access&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Advanced sharing:&#039;&#039;&#039; [[NEMO2/Workspaces/Advanced_Features#Sharing|Sharing guide]] for ACL-based per-user permissions.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16067</id>
		<title>NEMO2/Workspaces</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16067"/>
		<updated>2026-05-12T14:15:08Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 15px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is the updated Workspaces guide for NEMO2. For other clusters please use: [[Workspace]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Workspace tools&#039;&#039;&#039; provide temporary storage on NEMO&#039;s fast parallel filesystem (Weka).&lt;br /&gt;
They are meant for data that needs to persist longer than a single job, but not permanently.&lt;br /&gt;
&lt;br /&gt;
For advanced features — user config (&amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;), reminders, quotas, workspace handover, and more — see [[NEMO2/Workspaces/Advanced_Features|Advanced Features]].&lt;br /&gt;
&lt;br /&gt;
== What are Workspaces? ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Jobs generating intermediate data&lt;br /&gt;
* Data shared between multiple compute nodes&lt;br /&gt;
* Multi-step workflows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Don&#039;t use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Permanent storage (use HOME or project directories)&lt;br /&gt;
* Single-node temporary files (use &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt; instead)&lt;br /&gt;
&lt;br /&gt;
== Important - Read First ==&lt;br /&gt;
&lt;br /&gt;
* No Backup: Data is &#039;&#039;&#039;not backed up&#039;&#039;&#039; and will be &#039;&#039;&#039;automatically deleted&#039;&#039;&#039; after expiration&lt;br /&gt;
* Time-limited: Maximum lifetime is 100 days, up to 100 extensions&lt;br /&gt;
* Email Reminders: You receive email notifications before expiration&lt;br /&gt;
* Backup Important Data: Copy results to permanent storage before expiration&lt;br /&gt;
&lt;br /&gt;
== Command Overview ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_allocate&amp;lt;/tt&amp;gt; - Create or extend workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt; - List your workspaces&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; - Find workspace path (for scripts)&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_extend&amp;lt;/tt&amp;gt; - Extend workspace lifetime&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt; - Release (delete) workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; - Restore expired/released workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_register&amp;lt;/tt&amp;gt; - Create symbolic links&lt;br /&gt;
&lt;br /&gt;
All commands support &amp;lt;tt&amp;gt;-h&amp;lt;/tt&amp;gt; for help.&lt;br /&gt;
&lt;br /&gt;
== Quick Start ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:40%&amp;quot; | Task&lt;br /&gt;
!style=&amp;quot;width:60%&amp;quot; | Command&lt;br /&gt;
|-&lt;br /&gt;
|Create workspace (100 days)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Create group workspace&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate -G groupname myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|List all workspaces&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|See what expires soon&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list -Rr&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Find path (for scripts)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_find myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Extend by 100 days&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_extend myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Delete workspace (permanent, next nightly run)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_release myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Restore expired workspace (30d grace)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; then &amp;lt;tt&amp;gt;ws_restore oldname newname&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Create Workspace ==&lt;br /&gt;
&lt;br /&gt;
Create a workspace with a &#039;&#039;&#039;name&#039;&#039;&#039; and &#039;&#039;&#039;lifetime&#039;&#039;&#039; in days:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate myWs 100&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
   /work/workspace/scratch/username-myWs-0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Capture path in variable:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_allocate myWs 100)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Running the same command again is safe - returns the existing workspace path.&lt;br /&gt;
&lt;br /&gt;
== List Your Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_list                                # List all workspaces&lt;br /&gt;
   $ ws_list -Rr                            # Sort by remaining time, soonest first&lt;br /&gt;
   $ ws_list -g                             # Show group workspaces&lt;br /&gt;
&lt;br /&gt;
== Extend Workspace Lifetime ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_extend myWs 100                      # Extend by 100 days from now&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alternative:&#039;&#039;&#039; &amp;lt;tt&amp;gt;ws_allocate -x myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each extension consumes one of your available extensions (100 total).&lt;br /&gt;
&lt;br /&gt;
== Release (Delete) Workspace ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_release myWs&lt;br /&gt;
&lt;br /&gt;
The workspace becomes inaccessible immediately and is permanently deleted at the next nightly expirer run. &#039;&#039;&#039;Do not rely on recovering a released workspace.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Restore Workspace ==&lt;br /&gt;
&lt;br /&gt;
Recover workspaces that &#039;&#039;&#039;expired naturally&#039;&#039;&#039; (reached end of lifetime) within the 30-day grace period:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -l                          # (1) List restorable workspaces&lt;br /&gt;
   $ ws_allocate restored 100               # (2) Create target workspace&lt;br /&gt;
   $ ws_restore username-myWs-0 restored    # (3) Restore&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Use the &#039;&#039;&#039;full name&#039;&#039;&#039; from &amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; (with username and timestamp), not the short name.&lt;br /&gt;
Released workspaces (via &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt;) are &#039;&#039;&#039;not&#039;&#039;&#039; recoverable this way — they are deleted at the next nightly expirer run.&lt;br /&gt;
&lt;br /&gt;
== Share Workspaces ==&lt;br /&gt;
&lt;br /&gt;
=== Group workspace (recommended) ===&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable (read-only for group)&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable (recommended for teams)&lt;br /&gt;
&lt;br /&gt;
Anyone in the group can use &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt; to see the workspace and extend it with &amp;lt;tt&amp;gt;ws_allocate -x -u owner myWs 100&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set default group in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
groupname: projectgroup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Share after creation ===&lt;br /&gt;
&lt;br /&gt;
If you didn&#039;t use &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; at creation, share read-only with &amp;lt;tt&amp;gt;ws_share&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
   $ ws_share share myWs alice bob          # Grant read access&lt;br /&gt;
   $ ws_share list myWs                     # Show who has access&lt;br /&gt;
   $ ws_share unshare myWs alice            # Remove access&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Advanced sharing:&#039;&#039;&#039; [[NEMO2/Workspaces/Advanced_Features#Sharing|Sharing guide]] for ACL-based per-user permissions.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16066</id>
		<title>NEMO2/Workspaces</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Workspaces&amp;diff=16066"/>
		<updated>2026-05-12T14:08:55Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 15px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is the updated Workspaces guide for NEMO2. For other clusters please use: [[Workspace]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Workspace tools&#039;&#039;&#039; provide temporary storage on NEMO&#039;s fast parallel filesystem (Weka).&lt;br /&gt;
They are meant for data that needs to persist longer than a single job, but not permanently.&lt;br /&gt;
&lt;br /&gt;
== What are Workspaces? ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Jobs generating intermediate data&lt;br /&gt;
* Data shared between multiple compute nodes&lt;br /&gt;
* Multi-step workflows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Don&#039;t use workspaces for:&#039;&#039;&#039;&lt;br /&gt;
* Permanent storage (use HOME or project directories)&lt;br /&gt;
* Single-node temporary files (use &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt; instead)&lt;br /&gt;
&lt;br /&gt;
== Important - Read First ==&lt;br /&gt;
&lt;br /&gt;
* No Backup: Data is &#039;&#039;&#039;not backed up&#039;&#039;&#039; and will be &#039;&#039;&#039;automatically deleted&#039;&#039;&#039; after expiration&lt;br /&gt;
* Time-limited: Maximum lifetime is 100 days, up to 100 extensions&lt;br /&gt;
* Email Reminders: You receive email notifications before expiration&lt;br /&gt;
* Backup Important Data: Copy results to permanent storage before expiration&lt;br /&gt;
&lt;br /&gt;
== Command Overview ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_allocate&amp;lt;/tt&amp;gt; - Create or extend workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt; - List your workspaces&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt; - Find workspace path (for scripts)&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_extend&amp;lt;/tt&amp;gt; - Extend workspace lifetime&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt; - Release (delete) workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_restore&amp;lt;/tt&amp;gt; - Restore expired/released workspace&lt;br /&gt;
* &amp;lt;tt&amp;gt;ws_register&amp;lt;/tt&amp;gt; - Create symbolic links&lt;br /&gt;
&lt;br /&gt;
All commands support &amp;lt;tt&amp;gt;-h&amp;lt;/tt&amp;gt; for help.&lt;br /&gt;
&lt;br /&gt;
== Quick Start ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
!style=&amp;quot;width:40%&amp;quot; | Task&lt;br /&gt;
!style=&amp;quot;width:60%&amp;quot; | Command&lt;br /&gt;
|-&lt;br /&gt;
|Create workspace (100 days)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Create group workspace&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_allocate -G groupname myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|List all workspaces&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|See what expires soon&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_list -Rr&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Find path (for scripts)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_find myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Extend by 100 days&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_extend myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Delete workspace (permanent, next nightly run)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_release myWs&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Restore expired workspace (30d grace)&lt;br /&gt;
|&amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; then &amp;lt;tt&amp;gt;ws_restore oldname newname&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Create Workspace ==&lt;br /&gt;
&lt;br /&gt;
Create a workspace with a &#039;&#039;&#039;name&#039;&#039;&#039; and &#039;&#039;&#039;lifetime&#039;&#039;&#039; in days:&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate myWs 100&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
   /work/workspace/scratch/username-myWs-0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Capture path in variable:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   $ WORKSPACE=$(ws_allocate myWs 100)&lt;br /&gt;
   $ cd &amp;quot;$WORKSPACE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Running the same command again is safe - returns the existing workspace path.&lt;br /&gt;
&lt;br /&gt;
== List Your Workspaces ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_list                                # List all workspaces&lt;br /&gt;
   $ ws_list -Rr                            # Sort by remaining time, soonest first&lt;br /&gt;
   $ ws_list -g                             # Show group workspaces&lt;br /&gt;
&lt;br /&gt;
== Extend Workspace Lifetime ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_extend myWs 100                      # Extend by 100 days from now&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alternative:&#039;&#039;&#039; &amp;lt;tt&amp;gt;ws_allocate -x myWs 100&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each extension consumes one of your available extensions (100 total).&lt;br /&gt;
&lt;br /&gt;
== Release (Delete) Workspace ==&lt;br /&gt;
&lt;br /&gt;
   $ ws_release myWs&lt;br /&gt;
&lt;br /&gt;
The workspace becomes inaccessible immediately and is permanently deleted at the next nightly expirer run. &#039;&#039;&#039;Do not rely on recovering a released workspace.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Restore Workspace ==&lt;br /&gt;
&lt;br /&gt;
Recover workspaces that &#039;&#039;&#039;expired naturally&#039;&#039;&#039; (reached end of lifetime) within the 30-day grace period:&lt;br /&gt;
&lt;br /&gt;
   $ ws_restore -l                          # (1) List restorable workspaces&lt;br /&gt;
   $ ws_allocate restored 100               # (2) Create target workspace&lt;br /&gt;
   $ ws_restore username-myWs-0 restored    # (3) Restore&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Use the &#039;&#039;&#039;full name&#039;&#039;&#039; from &amp;lt;tt&amp;gt;ws_restore -l&amp;lt;/tt&amp;gt; (with username and timestamp), not the short name.&lt;br /&gt;
Released workspaces (via &amp;lt;tt&amp;gt;ws_release&amp;lt;/tt&amp;gt;) are &#039;&#039;&#039;not&#039;&#039;&#039; recoverable this way — they are deleted at the next nightly expirer run.&lt;br /&gt;
&lt;br /&gt;
== Share Workspaces ==&lt;br /&gt;
&lt;br /&gt;
=== Group workspace (recommended) ===&lt;br /&gt;
&lt;br /&gt;
   $ ws_allocate -g myWs 100                # Group-readable (read-only for group)&lt;br /&gt;
   $ ws_allocate -G projectgroup myWs 100   # Group-writable (recommended for teams)&lt;br /&gt;
&lt;br /&gt;
Anyone in the group can use &amp;lt;tt&amp;gt;ws_list -g&amp;lt;/tt&amp;gt; to see the workspace and extend it with &amp;lt;tt&amp;gt;ws_allocate -x -u owner myWs 100&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set default group in &amp;lt;tt&amp;gt;~/.ws_user.conf&amp;lt;/tt&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
groupname: projectgroup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Share after creation ===&lt;br /&gt;
&lt;br /&gt;
If you didn&#039;t use &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;-G&amp;lt;/tt&amp;gt; at creation, share read-only with &amp;lt;tt&amp;gt;ws_share&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
   $ ws_share share myWs alice bob          # Grant read access&lt;br /&gt;
   $ ws_share list myWs                     # Show who has access&lt;br /&gt;
   $ ws_share unshare myWs alice            # Remove access&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Advanced sharing:&#039;&#039;&#039; [[NEMO2/Workspaces/Advanced_Features#Sharing|Sharing guide]] for ACL-based per-user permissions.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers&amp;diff=16061</id>
		<title>NEMO2/Containers</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers&amp;diff=16061"/>
		<updated>2026-05-11T12:56:02Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NEMO supports two container runtimes for different use cases.&lt;br /&gt;
Neither requires root privileges and both integrate with the cluster&#039;s shared filesystems (&amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! [[NEMO2/Containers/Enroot|Enroot + Pyxis]] (recommended)&lt;br /&gt;
! [[NEMO2/Containers/Apptainer|Apptainer / Singularity]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Image source&#039;&#039;&#039;&lt;br /&gt;
| Docker Hub, NGC, any OCI registry&lt;br /&gt;
| Docker Hub, NGC, any OCI registry; SIF files&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Image format&#039;&#039;&#039;&lt;br /&gt;
| SquashFS (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;)&lt;br /&gt;
| SIF (&amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Slurm integration&#039;&#039;&#039;&lt;br /&gt;
| Native via Pyxis plugin (&amp;lt;tt&amp;gt;--container-name&amp;lt;/tt&amp;gt; etc.)&lt;br /&gt;
| Manual — wrap in batch script&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;GPU support&#039;&#039;&#039;&lt;br /&gt;
| Automatic, no extra flags needed&lt;br /&gt;
| Via &amp;lt;tt&amp;gt;--nv&amp;lt;/tt&amp;gt; flag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Installation&#039;&#039;&#039;&lt;br /&gt;
| System-wide, always available&lt;br /&gt;
| System-wide, always available&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Best for&#039;&#039;&#039;&lt;br /&gt;
| Docker-based workflows, GPU workloads, Slurm batch jobs&lt;br /&gt;
| Existing SIF images, reproducible science, portability&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== When to use what ==&lt;br /&gt;
&lt;br /&gt;
; Enroot + Pyxis&lt;br /&gt;
: Use this if you want to run Docker images directly from a registry, submit containerised jobs via &amp;lt;tt&amp;gt;srun&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;sbatch&amp;lt;/tt&amp;gt;, or need tight GPU integration.&lt;br /&gt;
: [[NEMO2/Containers/Enroot|→ Enroot &amp;amp; Pyxis details]]&lt;br /&gt;
&lt;br /&gt;
; Apptainer&lt;br /&gt;
: Use this if you have an existing &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; image, need a self-contained portable image you can copy between systems, or are working with workflows that already use Apptainer/Singularity.&lt;br /&gt;
: [[NEMO2/Containers/Apptainer|→ Apptainer details]]&lt;br /&gt;
&lt;br /&gt;
== Note on Docker ==&lt;br /&gt;
&lt;br /&gt;
Plain Docker is &#039;&#039;&#039;not available&#039;&#039;&#039; on NEMO. Both Enroot and Apptainer can pull Docker/OCI images directly from registries without a local Docker installation.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Apptainer&amp;diff=16060</id>
		<title>NEMO2/Containers/Apptainer</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Apptainer&amp;diff=16060"/>
		<updated>2026-05-11T12:51:01Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Apptainer&#039;&#039;&#039; (formerly Singularity) is a container runtime designed for HPC systems.&lt;br /&gt;
It is installed system-wide on NEMO and available without loading a module.&lt;br /&gt;
&lt;br /&gt;
== Key properties ==&lt;br /&gt;
&lt;br /&gt;
* Runs as the invoking user — no root required and no privilege escalation&lt;br /&gt;
* Uses SIF (Singularity Image Format), a single portable file&lt;br /&gt;
* Can pull Docker/OCI images directly from registries without a local Docker installation&lt;br /&gt;
* No native Slurm plugin — call &amp;lt;tt&amp;gt;apptainer exec/run&amp;lt;/tt&amp;gt; inside your batch script&lt;br /&gt;
&lt;br /&gt;
== Image sources ==&lt;br /&gt;
&lt;br /&gt;
All major OCI registries work out of the box via &amp;lt;tt&amp;gt;docker://&amp;lt;/tt&amp;gt; URIs.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Registry !! URI prefix !! Example&lt;br /&gt;
|-&lt;br /&gt;
| Docker Hub || &amp;lt;tt&amp;gt;docker://&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://ubuntu:24.04&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NVIDIA NGC || &amp;lt;tt&amp;gt;docker://nvcr.io/&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://nvcr.io/nvidia/pytorch:24.01-py3&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| quay.io || &amp;lt;tt&amp;gt;docker://quay.io/&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://quay.io/rockylinux/rockylinux:9&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Container Registry || &amp;lt;tt&amp;gt;docker://ghcr.io/&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://ghcr.io/containerd/alpine:latest&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; file || — || copy to a workspace and use directly&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;library://&amp;lt;/tt&amp;gt; URIs (Sylabs Cloud Library) are &#039;&#039;&#039;not&#039;&#039;&#039; available by default — the default Apptainer installation has no Library API client configured.&lt;br /&gt;
See [https://apptainer.org/docs/user/latest/endpoint.html#no-default-remote Apptainer docs] if you need to set up a library remote.&lt;br /&gt;
&lt;br /&gt;
== Image storage ==&lt;br /&gt;
&lt;br /&gt;
SIF files are plain files — store them wherever you like.&lt;br /&gt;
To avoid filling your home quota, keep images in a [[Workspaces|workspace]] and use a symlink:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a workspace (100 days)&lt;br /&gt;
ws_allocate apptainer 100&lt;br /&gt;
&lt;br /&gt;
# symlink ~/images to the workspace&lt;br /&gt;
ln -s $(ws_find apptainer) ~/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In batch scripts, reference images via the symlink:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IMAGE=$HOME/images/pytorch.sif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default mounts ==&lt;br /&gt;
&lt;br /&gt;
The following paths are &#039;&#039;&#039;automatically mounted&#039;&#039;&#039; into every container (configured via &amp;lt;tt&amp;gt;bind path&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;/etc/apptainer/apptainer.conf&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Host path !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt; || home directory of the invoking user, read-write&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt; || all workspace filesystems, read-write&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The paths inside the container are &#039;&#039;&#039;identical&#039;&#039;&#039; to the paths on the host system.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;ws_*&amp;lt;/tt&amp;gt; tools (e.g. &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;) are &#039;&#039;&#039;not available inside the container&#039;&#039;&#039;.&lt;br /&gt;
Determine your workspace path on the login node before running the container.&lt;br /&gt;
&lt;br /&gt;
== Basic commands ==&lt;br /&gt;
&lt;br /&gt;
=== Pull an image ===&lt;br /&gt;
&lt;br /&gt;
Always pull images to a local SIF file first — using &amp;lt;tt&amp;gt;docker://&amp;lt;/tt&amp;gt; URIs at runtime repeatedly can hit Docker Hub rate limits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# from Docker Hub&lt;br /&gt;
apptainer pull ~/images/ubuntu.sif docker://ubuntu:24.04&lt;br /&gt;
&lt;br /&gt;
# from NVIDIA NGC&lt;br /&gt;
apptainer pull ~/images/pytorch.sif docker://nvcr.io/nvidia/pytorch:24.01-py3&lt;br /&gt;
&lt;br /&gt;
# from quay.io&lt;br /&gt;
apptainer pull ~/images/rockylinux.sif docker://quay.io/rockylinux/rockylinux:9&lt;br /&gt;
&lt;br /&gt;
# from GitHub Container Registry&lt;br /&gt;
apptainer pull ~/images/alpine.sif docker://ghcr.io/containerd/alpine:latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run a command inside a container ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# exec: run a specific command&lt;br /&gt;
apptainer exec ~/images/ubuntu.sif python3 script.py&lt;br /&gt;
&lt;br /&gt;
# run: execute the container&#039;s default runscript&lt;br /&gt;
apptainer run ~/images/ubuntu.sif&lt;br /&gt;
&lt;br /&gt;
# shell: interactive shell&lt;br /&gt;
apptainer shell ~/images/ubuntu.sif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Additional mounts ===&lt;br /&gt;
&lt;br /&gt;
To mount directories beyond the defaults:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apptainer exec --bind /tmp/mydata:/data ~/images/ubuntu.sif bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPU access ==&lt;br /&gt;
&lt;br /&gt;
Pass the &amp;lt;tt&amp;gt;--nv&amp;lt;/tt&amp;gt; flag to enable NVIDIA GPU passthrough:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apptainer exec --nv ~/images/pytorch.sif python3 train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unlike Enroot/Pyxis, GPU passthrough is &#039;&#039;&#039;not&#039;&#039;&#039; automatic — &amp;lt;tt&amp;gt;--nv&amp;lt;/tt&amp;gt; must be specified explicitly.&lt;br /&gt;
&lt;br /&gt;
== Slurm batch job ==&lt;br /&gt;
&lt;br /&gt;
There is no Slurm plugin; call &amp;lt;tt&amp;gt;apptainer&amp;lt;/tt&amp;gt; directly from your batch script:&lt;br /&gt;
&lt;br /&gt;
CPU job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p cpu&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --time=01:00:00&lt;br /&gt;
&lt;br /&gt;
IMAGE=$HOME/images/ubuntu.sif&lt;br /&gt;
&lt;br /&gt;
apptainer exec &amp;quot;$IMAGE&amp;quot; python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GPU job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p l40s&lt;br /&gt;
#SBATCH --gres=gpu:1&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --time=01:00:00&lt;br /&gt;
&lt;br /&gt;
IMAGE=$HOME/images/pytorch.sif&lt;br /&gt;
&lt;br /&gt;
apptainer exec --nv &amp;quot;$IMAGE&amp;quot; python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building images ==&lt;br /&gt;
&lt;br /&gt;
Building a new SIF image from a definition file requires root (or fakeroot/user namespaces).&lt;br /&gt;
On NEMO you cannot build images directly on the compute nodes.&lt;br /&gt;
&lt;br /&gt;
Recommended workflow:&lt;br /&gt;
# Build on a machine where you have root (local workstation, VM, GitHub Actions, …)&lt;br /&gt;
# Transfer the &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; file to NEMO (e.g. &amp;lt;tt&amp;gt;scp&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;)&lt;br /&gt;
# Run on NEMO as usual&lt;br /&gt;
&lt;br /&gt;
Store images in a workspace (symlinked to &amp;lt;tt&amp;gt;~/images/&amp;lt;/tt&amp;gt;) — not in &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt;, which is job-local and deleted after the job.&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;tt&amp;gt;apptainer exec --writable-tmpfs&amp;lt;/tt&amp;gt; if the container tries to write to its own filesystem (without persisting changes).&lt;br /&gt;
* The &amp;lt;tt&amp;gt;--containall&amp;lt;/tt&amp;gt; flag gives a fully isolated environment (no automatic bind-mounts); useful for reproducibility tests.&lt;br /&gt;
* To check what Apptainer version is installed: &amp;lt;tt&amp;gt;apptainer --version&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Enroot&amp;diff=16059</id>
		<title>NEMO2/Containers/Enroot</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Enroot&amp;diff=16059"/>
		<updated>2026-05-11T12:50:39Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Enroot&#039;&#039;&#039; is a container runtime developed by NVIDIA that runs OCI/Docker containers without root privileges.&lt;br /&gt;
On NEMO it is the &#039;&#039;&#039;recommended&#039;&#039;&#039; container solution and is integrated with Slurm via the &#039;&#039;&#039;Pyxis&#039;&#039;&#039; SPANK plugin.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
Enroot converts a Docker image into a SquashFS file (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;), unpacks it on demand into an overlay filesystem, and runs your workload inside that environment.&lt;br /&gt;
The Pyxis plugin adds &amp;lt;tt&amp;gt;--container-*&amp;lt;/tt&amp;gt; options to &amp;lt;tt&amp;gt;srun&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;salloc&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;sbatch&amp;lt;/tt&amp;gt; so containers become first-class Slurm jobs.&lt;br /&gt;
&lt;br /&gt;
== Image sources ==&lt;br /&gt;
&lt;br /&gt;
All major OCI registries work out of the box. Note that Enroot uses &amp;lt;tt&amp;gt;#&amp;lt;/tt&amp;gt; (not &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt;) to separate registry host from image path.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Registry !! URI syntax !! Example&lt;br /&gt;
|-&lt;br /&gt;
| Docker Hub || &amp;lt;tt&amp;gt;docker://IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://ubuntu:24.04&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NVIDIA NGC || &amp;lt;tt&amp;gt;docker://nvcr.io#ORG/IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://nvcr.io#nvidia/pytorch:24.01-py3&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| quay.io || &amp;lt;tt&amp;gt;docker://quay.io#ORG/IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://quay.io#rockylinux/rockylinux:9&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Container Registry || &amp;lt;tt&amp;gt;docker://ghcr.io#ORG/IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://ghcr.io#containerd/alpine:latest&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Image storage ==&lt;br /&gt;
&lt;br /&gt;
Unpacked container images are stored in &amp;lt;tt&amp;gt;~/.local/share/enroot/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Images are SquashFS files and can be several GB.&lt;br /&gt;
To avoid filling your home quota, store images in a [[Workspaces|workspace]] and symlink the default path:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a workspace (100 days)&lt;br /&gt;
ws_allocate enroot 100&lt;br /&gt;
&lt;br /&gt;
# replace the default enroot directory with a symlink to the workspace&lt;br /&gt;
mkdir -p ~/.local/share&lt;br /&gt;
ln -s $(ws_find enroot) ~/.local/share/enroot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enroot (and Pyxis) will now transparently use the workspace path for all image storage.&lt;br /&gt;
&lt;br /&gt;
== Default mounts ==&lt;br /&gt;
&lt;br /&gt;
The following paths are &#039;&#039;&#039;automatically mounted&#039;&#039;&#039; into every container:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Host path !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt; || all home directories, read-write&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt; || all workspace filesystems, read-write&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The paths inside the container are &#039;&#039;&#039;identical&#039;&#039;&#039; to the paths on the host system, so scripts referencing &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt; or workspace paths work without modification.&lt;br /&gt;
You do &#039;&#039;&#039;not&#039;&#039;&#039; need to pass &amp;lt;tt&amp;gt;--container-mount-home&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--container-mounts=/work&amp;lt;/tt&amp;gt; manually.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;ws_*&amp;lt;/tt&amp;gt; tools (e.g. &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;) are &#039;&#039;&#039;not available inside the container&#039;&#039;&#039;.&lt;br /&gt;
Determine your workspace path on the login node before submitting the job and pass it as an environment variable or hard-code it in your script.&lt;br /&gt;
&lt;br /&gt;
== Interactive usage ==&lt;br /&gt;
&lt;br /&gt;
=== Import an image ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;enroot import&amp;lt;/tt&amp;gt; downloads an OCI image from a registry and converts it into a &#039;&#039;&#039;SquashFS archive&#039;&#039;&#039; (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;).&lt;br /&gt;
SquashFS is a compressed, read-only filesystem — the sqsh file is the portable, immutable snapshot of the container image.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# from Docker Hub&lt;br /&gt;
enroot import docker://ubuntu:24.04&lt;br /&gt;
&lt;br /&gt;
# from quay.io&lt;br /&gt;
enroot import docker://quay.io#rockylinux/rockylinux:9&lt;br /&gt;
&lt;br /&gt;
# from NVIDIA NGC&lt;br /&gt;
enroot import docker://nvcr.io#nvidia/pytorch:24.01-py3&lt;br /&gt;
&lt;br /&gt;
# from GitHub Container Registry&lt;br /&gt;
enroot import docker://ghcr.io#containerd/alpine:latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates a &amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt; file in the current directory (e.g. &amp;lt;tt&amp;gt;ubuntu+24.04.sqsh&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Create a container ===&lt;br /&gt;
&lt;br /&gt;
Before you can run the image, you must &#039;&#039;&#039;unpack&#039;&#039;&#039; it into a container root filesystem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enroot create --name pyxis_ubuntu ubuntu+24.04.sqsh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This extracts the sqsh archive into &amp;lt;tt&amp;gt;~/.local/share/enroot/pyxis_ubuntu/&amp;lt;/tt&amp;gt; (or the symlinked workspace path).&lt;br /&gt;
The container name must be prefixed with &amp;lt;tt&amp;gt;pyxis_&amp;lt;/tt&amp;gt; so that &#039;&#039;&#039;Pyxis&#039;&#039;&#039; (the Slurm plugin) can find it later — when passing &amp;lt;tt&amp;gt;--container-name&amp;lt;/tt&amp;gt; to Slurm, omit the prefix.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Can I delete the &amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt; file afterwards?&#039;&#039;&#039;&lt;br /&gt;
Yes. Once &amp;lt;tt&amp;gt;enroot create&amp;lt;/tt&amp;gt; has unpacked the image, the sqsh file is no longer needed for running the container.&lt;br /&gt;
Keep it as a backup to recreate the container later, or delete it to free space:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm ubuntu+24.04.sqsh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Start a container ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# interactive shell, read-write&lt;br /&gt;
enroot start --rw pyxis_ubuntu bash&lt;br /&gt;
&lt;br /&gt;
# get root inside the container (to install packages)&lt;br /&gt;
enroot start --root --rw pyxis_ubuntu bash&lt;br /&gt;
&lt;br /&gt;
# mount an extra directory&lt;br /&gt;
enroot start --rw -m /tmp/mydata:/data pyxis_ubuntu bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== List and remove containers ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enroot list --fancy&lt;br /&gt;
enroot remove pyxis_ubuntu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage via Slurm / Pyxis ==&lt;br /&gt;
&lt;br /&gt;
=== Interactive allocation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# use an already-created container&lt;br /&gt;
salloc -p cpu --container-name=ubuntu&lt;br /&gt;
&lt;br /&gt;
# pull, create and start in one step (container is created under ~/.local/share/enroot/)&lt;br /&gt;
salloc -p cpu --container-image=ubuntu:24.04 --container-name=ubuntu&lt;br /&gt;
salloc -p cpu --container-image=&amp;quot;quay.io#rockylinux/rockylinux:9&amp;quot; --container-name=rocky&lt;br /&gt;
salloc -p cpu --container-image=&amp;quot;ghcr.io#containerd/alpine:latest&amp;quot; --container-name=alpine&lt;br /&gt;
salloc -p l40s --gres=gpu:1 --container-image=&amp;quot;nvcr.io#nvidia/pytorch:24.01-py3&amp;quot; --container-name=pytorch&lt;br /&gt;
&lt;br /&gt;
# start with a specific working directory inside the container&lt;br /&gt;
# $(ws_find enroot) is evaluated on the login node before the job starts&lt;br /&gt;
salloc -p cpu --container-name=ubuntu --container-workdir=$(ws_find enroot)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Batch job ===&lt;br /&gt;
&lt;br /&gt;
CPU job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p cpu&lt;br /&gt;
#SBATCH --container-name=ubuntu&lt;br /&gt;
&lt;br /&gt;
python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GPU job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p l40s&lt;br /&gt;
#SBATCH --gres=gpu:1&lt;br /&gt;
#SBATCH --container-name=pytorch&lt;br /&gt;
&lt;br /&gt;
python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Useful Pyxis options ===&lt;br /&gt;
&lt;br /&gt;
All options are listed in &amp;lt;tt&amp;gt;srun --help&amp;lt;/tt&amp;gt; under &#039;&#039;Options provided by plugins&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-name=NAME&amp;lt;/tt&amp;gt; || Use existing enroot container (omit the &amp;lt;tt&amp;gt;pyxis_&amp;lt;/tt&amp;gt; prefix)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-image=IMAGE&amp;lt;/tt&amp;gt; || Pull image from registry and create container on the fly&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-mounts=SRC:DST[,…]&amp;lt;/tt&amp;gt; || Bind-mount additional paths&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-writable&amp;lt;/tt&amp;gt; || Make the container overlay writable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-remap-root&amp;lt;/tt&amp;gt; || Become root inside the container (no real root on host)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-workdir=PATH&amp;lt;/tt&amp;gt; || Set the working directory inside the container&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GPU access ==&lt;br /&gt;
&lt;br /&gt;
GPU passthrough is &#039;&#039;&#039;automatic&#039;&#039;&#039; — no extra flags are needed.&lt;br /&gt;
Enroot/Pyxis detect the allocated GPUs via Slurm&#039;s GRES mechanism and make them available inside the container.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
salloc -p l40s --gres=gpu:1 --container-name=pytorch&lt;br /&gt;
# nvidia-smi works inside the container out of the box&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
&lt;br /&gt;
* Install extra packages interactively with &amp;lt;tt&amp;gt;enroot start --root --rw&amp;lt;/tt&amp;gt; before submitting batch jobs.&lt;br /&gt;
* Use &amp;lt;tt&amp;gt;--container-writable&amp;lt;/tt&amp;gt; in batch jobs only if your script modifies the container filesystem; otherwise the default overlay is discarded after the job anyway.&lt;br /&gt;
* Store large datasets in workspaces (&amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt;), not in &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt;, to avoid filling your home quota with data files.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Enroot&amp;diff=16058</id>
		<title>NEMO2/Containers/Enroot</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Enroot&amp;diff=16058"/>
		<updated>2026-05-11T12:23:35Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Enroot&#039;&#039;&#039; is a container runtime developed by NVIDIA that runs OCI/Docker containers without root privileges.&lt;br /&gt;
On NEMO it is the &#039;&#039;&#039;recommended&#039;&#039;&#039; container solution and is integrated with Slurm via the &#039;&#039;&#039;Pyxis&#039;&#039;&#039; SPANK plugin.&lt;br /&gt;
&lt;br /&gt;
== Image sources ==&lt;br /&gt;
&lt;br /&gt;
All major OCI registries work out of the box. Note that Enroot uses &amp;lt;tt&amp;gt;#&amp;lt;/tt&amp;gt; (not &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt;) to separate registry host from image path.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Registry !! URI syntax !! Example&lt;br /&gt;
|-&lt;br /&gt;
| Docker Hub || &amp;lt;tt&amp;gt;docker://IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://ubuntu:24.04&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NVIDIA NGC || &amp;lt;tt&amp;gt;docker://nvcr.io#ORG/IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://nvcr.io#nvidia/pytorch:24.01-py3&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| quay.io || &amp;lt;tt&amp;gt;docker://quay.io#ORG/IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://quay.io#rockylinux/rockylinux:9&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Container Registry || &amp;lt;tt&amp;gt;docker://ghcr.io#ORG/IMAGE[:TAG]&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://ghcr.io#containerd/alpine:latest&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
Enroot converts a Docker image into a SquashFS file (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;), unpacks it on demand into an overlay filesystem, and runs your workload inside that environment.&lt;br /&gt;
The Pyxis plugin adds &amp;lt;tt&amp;gt;--container-*&amp;lt;/tt&amp;gt; options to &amp;lt;tt&amp;gt;srun&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;salloc&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;sbatch&amp;lt;/tt&amp;gt; so containers become first-class Slurm jobs.&lt;br /&gt;
&lt;br /&gt;
== Default mounts ==&lt;br /&gt;
&lt;br /&gt;
The following paths are &#039;&#039;&#039;automatically mounted&#039;&#039;&#039; into every container when launched via Slurm/Pyxis:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Host path !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt; || all home directories, read-write&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt; || all workspace filesystems, read-write&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You do &#039;&#039;&#039;not&#039;&#039;&#039; need to pass &amp;lt;tt&amp;gt;--container-mount-home&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--container-mounts=/work&amp;lt;/tt&amp;gt; manually — they are already there.&lt;br /&gt;
The paths inside the container are &#039;&#039;&#039;identical&#039;&#039;&#039; to the paths on the host system, so scripts and config files referencing &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt; or workspace paths work without modification.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;ws_*&amp;lt;/tt&amp;gt; tools (e.g. &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;) are &#039;&#039;&#039;not available inside the container&#039;&#039;&#039;.&lt;br /&gt;
Determine your workspace path on the login node before submitting the job and pass it as an environment variable or hard-code it in your script.&lt;br /&gt;
&lt;br /&gt;
== Container image storage ==&lt;br /&gt;
&lt;br /&gt;
Unpacked container images are stored in:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/share/enroot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Images are SquashFS files and can be several GB.&lt;br /&gt;
To avoid filling your home quota, store images in a [[Workspaces|workspace]] and symlink the default path:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a workspace (100 days)&lt;br /&gt;
ws_allocate enroot 100&lt;br /&gt;
&lt;br /&gt;
# replace the default enroot directory with a symlink to the workspace&lt;br /&gt;
mkdir -p ~/.local/share&lt;br /&gt;
ln -s $(ws_find enroot) ~/.local/share/enroot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enroot (and Pyxis) will now transparently use the workspace path for all image storage.&lt;br /&gt;
&lt;br /&gt;
== Usage without Slurm (interactive) ==&lt;br /&gt;
&lt;br /&gt;
=== Import an image ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;enroot import&amp;lt;/tt&amp;gt; downloads an OCI image from a registry and converts it into a &#039;&#039;&#039;SquashFS archive&#039;&#039;&#039; (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;).&lt;br /&gt;
SquashFS is a compressed, read-only filesystem — the sqsh file is the portable, immutable snapshot of the container image.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# from Docker Hub&lt;br /&gt;
enroot import docker://ubuntu:24.04&lt;br /&gt;
&lt;br /&gt;
# from quay.io&lt;br /&gt;
enroot import docker://quay.io#rockylinux/rockylinux:9&lt;br /&gt;
&lt;br /&gt;
# from NVIDIA NGC&lt;br /&gt;
enroot import docker://nvcr.io#nvidia/pytorch:24.01-py3&lt;br /&gt;
&lt;br /&gt;
# from GitHub Container Registry&lt;br /&gt;
enroot import docker://ghcr.io#containerd/alpine:latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates a &amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt; file in the current directory (e.g. &amp;lt;tt&amp;gt;ubuntu+24.04.sqsh&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Create a container ===&lt;br /&gt;
&lt;br /&gt;
Before you can run the image, you must &#039;&#039;&#039;unpack&#039;&#039;&#039; it into a container root filesystem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enroot create --name pyxis_ubuntu ubuntu+24.04.sqsh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This extracts the sqsh archive into &amp;lt;tt&amp;gt;~/.local/share/enroot/pyxis_ubuntu/&amp;lt;/tt&amp;gt; (or the symlinked workspace path).&lt;br /&gt;
The container name must be prefixed with &amp;lt;tt&amp;gt;pyxis_&amp;lt;/tt&amp;gt; so that &#039;&#039;&#039;Pyxis&#039;&#039;&#039; (the Slurm plugin) can find it later — when passing &amp;lt;tt&amp;gt;--container-name&amp;lt;/tt&amp;gt; to Slurm, omit the prefix.&lt;br /&gt;
&lt;br /&gt;
Can I delete the &amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt; file afterwards?&lt;br /&gt;
Yes. Once &amp;lt;tt&amp;gt;enroot create&amp;lt;/tt&amp;gt; has unpacked the image, the sqsh file is no longer needed for running the container.&lt;br /&gt;
You can keep it as a backup to recreate the container later, or delete it to free space:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm ubuntu+24.04.sqsh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Start a container ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# interactive shell, read-write&lt;br /&gt;
enroot start --rw pyxis_ubuntu bash&lt;br /&gt;
&lt;br /&gt;
# get root inside the container (to install packages)&lt;br /&gt;
enroot start --root --rw pyxis_ubuntu bash&lt;br /&gt;
&lt;br /&gt;
# mount an extra directory (e.g. from outside /home and /work)&lt;br /&gt;
enroot start --rw -m /tmp/mydata:/data pyxis_ubuntu bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== List and remove containers ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enroot list --fancy&lt;br /&gt;
enroot remove pyxis_ubuntu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage via Slurm / Pyxis ==&lt;br /&gt;
&lt;br /&gt;
=== Interactive allocation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# use an already-created container&lt;br /&gt;
salloc -p cpu --container-name=ubuntu&lt;br /&gt;
&lt;br /&gt;
# pull, create and start in one step (container is created under ~/.local/share/enroot/)&lt;br /&gt;
salloc -p cpu --container-image=ubuntu:24.04 --container-name=ubuntu&lt;br /&gt;
salloc -p cpu --container-image=&amp;quot;quay.io#rockylinux/rockylinux:9&amp;quot; --container-name=rocky&lt;br /&gt;
salloc -p cpu --container-image=&amp;quot;ghcr.io#containerd/alpine:latest&amp;quot; --container-name=alpine&lt;br /&gt;
salloc -p l40s --gres=gpu:1 --container-image=&amp;quot;nvcr.io#nvidia/pytorch:24.01-py3&amp;quot; --container-name=pytorch&lt;br /&gt;
&lt;br /&gt;
# start with a specific working directory inside the container&lt;br /&gt;
# $(ws_find enroot) is evaluated on the login node before the job starts&lt;br /&gt;
salloc -p cpu --container-name=ubuntu --container-workdir=$(ws_find enroot)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Batch job ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p cpu&lt;br /&gt;
#SBATCH --container-name=ubuntu&lt;br /&gt;
&lt;br /&gt;
python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Useful Pyxis options ===&lt;br /&gt;
&lt;br /&gt;
All options are listed in &amp;lt;tt&amp;gt;srun --help&amp;lt;/tt&amp;gt; under &#039;&#039;Options provided by plugins&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-name=NAME&amp;lt;/tt&amp;gt; || Use existing enroot container (omit the &amp;lt;tt&amp;gt;pyxis_&amp;lt;/tt&amp;gt; prefix)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-image=IMAGE&amp;lt;/tt&amp;gt; || Pull image from registry and create container on the fly&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-mount-home&amp;lt;/tt&amp;gt; || Mount &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt; into container (already in defaults, but explicit flag also works)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-mounts=SRC:DST[,…]&amp;lt;/tt&amp;gt; || Bind-mount additional paths&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-writable&amp;lt;/tt&amp;gt; || Make the container overlay writable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-remap-root&amp;lt;/tt&amp;gt; || Become root inside the container (no real root on host)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-workdir=PATH&amp;lt;/tt&amp;gt; || Set the working directory inside the container&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GPU access ==&lt;br /&gt;
&lt;br /&gt;
GPU passthrough is &#039;&#039;&#039;automatic&#039;&#039;&#039; — no extra flags are needed.&lt;br /&gt;
Enroot/Pyxis detect the allocated GPUs via Slurm&#039;s GRES mechanism and make them available inside the container.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
salloc -p l40s --gres=gpu:1 --container-name=pytorch&lt;br /&gt;
# nvidia-smi works inside the container out of the box&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
&lt;br /&gt;
* Install extra packages interactively with &amp;lt;tt&amp;gt;enroot start --root --rw&amp;lt;/tt&amp;gt; before submitting batch jobs.&lt;br /&gt;
* Use &amp;lt;tt&amp;gt;--container-writable&amp;lt;/tt&amp;gt; in batch jobs only if your script modifies the container filesystem; otherwise the default overlay is discarded after the job anyway.&lt;br /&gt;
* Store large datasets in workspaces (&amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt;), not in &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt;, to avoid filling your home quota with data files.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Apptainer&amp;diff=16057</id>
		<title>NEMO2/Containers/Apptainer</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Apptainer&amp;diff=16057"/>
		<updated>2026-05-11T12:15:32Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Apptainer&#039;&#039;&#039; (formerly Singularity) is a container runtime designed for HPC systems.&lt;br /&gt;
It is installed system-wide on NEMO and available without loading a module.&lt;br /&gt;
&lt;br /&gt;
== Key properties ==&lt;br /&gt;
&lt;br /&gt;
* Runs as the invoking user — no root required and no privilege escalation&lt;br /&gt;
* Uses SIF (Singularity Image Format), a single portable file&lt;br /&gt;
* Can convert Docker images to SIF at build time&lt;br /&gt;
* No native Slurm plugin — call &amp;lt;tt&amp;gt;apptainer exec/run&amp;lt;/tt&amp;gt; inside your batch script&lt;br /&gt;
&lt;br /&gt;
== Image sources ==&lt;br /&gt;
&lt;br /&gt;
All major OCI registries work out of the box via &amp;lt;tt&amp;gt;docker://&amp;lt;/tt&amp;gt; URIs — no Docker installation needed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Registry !! URI prefix !! Example&lt;br /&gt;
|-&lt;br /&gt;
| Docker Hub || &amp;lt;tt&amp;gt;docker://&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://ubuntu:24.04&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NVIDIA NGC || &amp;lt;tt&amp;gt;docker://nvcr.io/&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://nvcr.io/nvidia/pytorch:24.01-py3&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| quay.io || &amp;lt;tt&amp;gt;docker://quay.io/&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://quay.io/rockylinux/rockylinux:9&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Container Registry || &amp;lt;tt&amp;gt;docker://ghcr.io/&amp;lt;/tt&amp;gt; || &amp;lt;tt&amp;gt;docker://ghcr.io/containerd/alpine:latest&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; file || — || copy to a workspace and use directly&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;library://&amp;lt;/tt&amp;gt; URIs (Sylabs Cloud Library) are &#039;&#039;&#039;not&#039;&#039;&#039; available by default — the default Apptainer installation has no Library API client configured.&lt;br /&gt;
See [https://apptainer.org/docs/user/latest/endpoint.html#no-default-remote Apptainer docs] if you need to set up a library remote.&lt;br /&gt;
&lt;br /&gt;
== Image storage ==&lt;br /&gt;
&lt;br /&gt;
SIF files are plain files — store them wherever you like.&lt;br /&gt;
To avoid filling your home quota, keep images in a [[Workspaces|workspace]] and use a symlink so your scripts don&#039;t need to change:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a workspace (100 days)&lt;br /&gt;
ws_allocate apptainer 100&lt;br /&gt;
&lt;br /&gt;
# create an images directory in the workspace and symlink it from home&lt;br /&gt;
ln -s $(ws_find apptainer) ~/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pull images directly into the workspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apptainer pull ~/images/ubuntu.sif docker://ubuntu:24.04&lt;br /&gt;
apptainer pull ~/images/pytorch.sif docker://nvcr.io/nvidia/pytorch:24.01-py3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In batch scripts, reference images via the symlink:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IMAGE=$HOME/images/pytorch.sif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basic commands ==&lt;br /&gt;
&lt;br /&gt;
=== Pull an image ===&lt;br /&gt;
&lt;br /&gt;
Always pull images to a local SIF file first — using &amp;lt;tt&amp;gt;docker://&amp;lt;/tt&amp;gt; URIs at runtime repeatedly can hit Docker Hub rate limits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# from Docker Hub&lt;br /&gt;
apptainer pull ~/images/ubuntu.sif docker://ubuntu:24.04&lt;br /&gt;
&lt;br /&gt;
# from NVIDIA NGC&lt;br /&gt;
apptainer pull ~/images/pytorch.sif docker://nvcr.io/nvidia/pytorch:24.01-py3&lt;br /&gt;
&lt;br /&gt;
# from quay.io&lt;br /&gt;
apptainer pull ~/images/rockylinux.sif docker://quay.io/rockylinux/rockylinux:9&lt;br /&gt;
&lt;br /&gt;
# from GitHub Container Registry&lt;br /&gt;
apptainer pull ~/images/alpine.sif docker://ghcr.io/containerd/alpine:latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run a command inside a container ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# exec: run a specific command&lt;br /&gt;
apptainer exec ubuntu.sif python3 script.py&lt;br /&gt;
&lt;br /&gt;
# run: execute the container&#039;s default runscript&lt;br /&gt;
apptainer run ubuntu.sif&lt;br /&gt;
&lt;br /&gt;
# shell: interactive shell&lt;br /&gt;
apptainer shell ubuntu.sif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GPU access ===&lt;br /&gt;
&lt;br /&gt;
Pass the &amp;lt;tt&amp;gt;--nv&amp;lt;/tt&amp;gt; flag to enable NVIDIA GPU passthrough:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apptainer exec --nv pytorch.sif python3 train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bind-mount paths ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt; are available inside the container by default (Apptainer automatically binds a set of paths; check &amp;lt;tt&amp;gt;apptainer config&amp;lt;/tt&amp;gt; for the system defaults).&lt;br /&gt;
&lt;br /&gt;
To mount additional directories explicitly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apptainer exec --bind /tmp/mydata:/data ubuntu.sif bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using Apptainer in a Slurm batch job ==&lt;br /&gt;
&lt;br /&gt;
Unlike Enroot/Pyxis there is no Slurm plugin; simply call &amp;lt;tt&amp;gt;apptainer&amp;lt;/tt&amp;gt; from your batch script:&lt;br /&gt;
&lt;br /&gt;
CPU job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p cpu&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --time=01:00:00&lt;br /&gt;
&lt;br /&gt;
IMAGE=$HOME/images/ubuntu.sif&lt;br /&gt;
&lt;br /&gt;
apptainer exec &amp;quot;$IMAGE&amp;quot; python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GPU job (use &amp;lt;tt&amp;gt;--nv&amp;lt;/tt&amp;gt; to pass through the allocated GPUs):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p l40s&lt;br /&gt;
#SBATCH --gres=gpu:1&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --time=01:00:00&lt;br /&gt;
&lt;br /&gt;
IMAGE=$HOME/images/pytorch.sif&lt;br /&gt;
&lt;br /&gt;
apptainer exec --nv &amp;quot;$IMAGE&amp;quot; python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building images ==&lt;br /&gt;
&lt;br /&gt;
Building a new SIF image from a definition file requires root (or a system that supports fakeroot/user namespaces).&lt;br /&gt;
On NEMO you cannot build images directly on the compute nodes.&lt;br /&gt;
&lt;br /&gt;
Recommended workflow:&lt;br /&gt;
# Build on a machine where you have root (local workstation, VM, GitHub Actions, …)&lt;br /&gt;
# Transfer the &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; file to NEMO (e.g. &amp;lt;tt&amp;gt;scp&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;)&lt;br /&gt;
# Run on NEMO as usual&lt;br /&gt;
&lt;br /&gt;
Store images in a workspace (symlinked to &amp;lt;tt&amp;gt;~/images/&amp;lt;/tt&amp;gt; as described above) — not in &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt;, which is job-local and deleted after the job.&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;tt&amp;gt;apptainer exec --writable-tmpfs&amp;lt;/tt&amp;gt; if the container tries to write to its own filesystem (without persisting changes).&lt;br /&gt;
* The &amp;lt;tt&amp;gt;--containall&amp;lt;/tt&amp;gt; flag gives a fully isolated environment (no automatic bind-mounts); useful for reproducibility tests.&lt;br /&gt;
* To check what Apptainer version is installed: &amp;lt;tt&amp;gt;apptainer --version&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Enroot&amp;diff=16053</id>
		<title>NEMO2/Containers/Enroot</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Enroot&amp;diff=16053"/>
		<updated>2026-05-08T14:20:08Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Default mounts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Enroot&#039;&#039;&#039; is a container runtime developed by NVIDIA that runs OCI/Docker containers without root privileges.&lt;br /&gt;
On NEMO it is the &#039;&#039;&#039;recommended&#039;&#039;&#039; container solution and is integrated with Slurm via the &#039;&#039;&#039;Pyxis&#039;&#039;&#039; SPANK plugin.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
Enroot converts a Docker image into a SquashFS file (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;), unpacks it on demand into an overlay filesystem, and runs your workload inside that environment.&lt;br /&gt;
The Pyxis plugin adds &amp;lt;tt&amp;gt;--container-*&amp;lt;/tt&amp;gt; options to &amp;lt;tt&amp;gt;srun&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;salloc&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;sbatch&amp;lt;/tt&amp;gt; so containers become first-class Slurm jobs.&lt;br /&gt;
&lt;br /&gt;
== Default mounts ==&lt;br /&gt;
&lt;br /&gt;
The following paths are &#039;&#039;&#039;automatically mounted&#039;&#039;&#039; into every container when launched via Slurm/Pyxis:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Host path !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt; || all home directories, read-write&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt; || all workspace filesystems, read-write&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You do &#039;&#039;&#039;not&#039;&#039;&#039; need to pass &amp;lt;tt&amp;gt;--container-mount-home&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--container-mounts=/work&amp;lt;/tt&amp;gt; manually — they are already there.&lt;br /&gt;
The paths inside the container are &#039;&#039;&#039;identical&#039;&#039;&#039; to the paths on the host system, so scripts and config files referencing &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt; or workspace paths work without modification.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;ws_*&amp;lt;/tt&amp;gt; tools (e.g. &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;) are &#039;&#039;&#039;not available inside the container&#039;&#039;&#039;.&lt;br /&gt;
Determine your workspace path on the login node before submitting the job and pass it as an environment variable or hard-code it in your script.&lt;br /&gt;
&lt;br /&gt;
== Container image storage ==&lt;br /&gt;
&lt;br /&gt;
Unpacked container images are stored in:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/share/enroot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Images are SquashFS files and can be several GB.&lt;br /&gt;
To avoid filling your home quota, store images in a [[Workspaces|workspace]] and symlink the default path:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a workspace (100 days)&lt;br /&gt;
ws_allocate enroot 100&lt;br /&gt;
&lt;br /&gt;
# replace the default enroot directory with a symlink to the workspace&lt;br /&gt;
mkdir -p ~/.local/share&lt;br /&gt;
ln -s $(ws_find enroot) ~/.local/share/enroot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enroot (and Pyxis) will now transparently use the workspace path for all image storage.&lt;br /&gt;
&lt;br /&gt;
== Usage without Slurm (interactive) ==&lt;br /&gt;
&lt;br /&gt;
=== Import an image ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# from Docker Hub&lt;br /&gt;
enroot import docker://ubuntu:24.04&lt;br /&gt;
&lt;br /&gt;
# from quay.io&lt;br /&gt;
enroot import docker://quay.io#rockylinux/rockylinux:9&lt;br /&gt;
&lt;br /&gt;
# from NVIDIA NGC&lt;br /&gt;
enroot import docker://nvcr.io#nvidia/pytorch:24.01-py3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates a &amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt; file in the current directory.&lt;br /&gt;
&lt;br /&gt;
=== Create a container ===&lt;br /&gt;
&lt;br /&gt;
The container name must be prefixed with &amp;lt;tt&amp;gt;pyxis_&amp;lt;/tt&amp;gt; for Slurm/Pyxis to find it later (omit the prefix when passing &amp;lt;tt&amp;gt;--container-name&amp;lt;/tt&amp;gt; to Slurm).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enroot create --name pyxis_ubuntu ubuntu+24.04.sqsh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Start a container ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# interactive shell, read-write&lt;br /&gt;
enroot start --rw pyxis_ubuntu bash&lt;br /&gt;
&lt;br /&gt;
# get root inside the container (to install packages)&lt;br /&gt;
enroot start --root --rw pyxis_ubuntu bash&lt;br /&gt;
&lt;br /&gt;
# mount an extra directory (e.g. from outside /home and /work)&lt;br /&gt;
enroot start --rw -m /tmp/mydata:/data pyxis_ubuntu bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== List and remove containers ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enroot list --fancy&lt;br /&gt;
enroot remove pyxis_ubuntu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage via Slurm / Pyxis ==&lt;br /&gt;
&lt;br /&gt;
=== Interactive allocation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# use an already-created container&lt;br /&gt;
salloc -p cpu --container-name=ubuntu&lt;br /&gt;
&lt;br /&gt;
# pull, create and start in one step (container is created under ~/.local/share/enroot/)&lt;br /&gt;
salloc -p cpu --container-image=ubuntu:24.04 --container-name=ubuntu&lt;br /&gt;
salloc -p cpu --container-image=&amp;quot;quay.io#rockylinux/rockylinux:9&amp;quot; --container-name=rocky&lt;br /&gt;
salloc -p l40s --gres=gpu:1 --container-image=&amp;quot;nvcr.io#nvidia/pytorch:24.01-py3&amp;quot; --container-name=pytorch&lt;br /&gt;
&lt;br /&gt;
# start with a specific working directory inside the container&lt;br /&gt;
# $(ws_find enroot) is evaluated on the login node before the job starts&lt;br /&gt;
salloc -p cpu --container-name=ubuntu --container-workdir=$(ws_find enroot)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Batch job ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p cpu&lt;br /&gt;
#SBATCH --container-name=ubuntu&lt;br /&gt;
&lt;br /&gt;
python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Useful Pyxis options ===&lt;br /&gt;
&lt;br /&gt;
All options are listed in &amp;lt;tt&amp;gt;srun --help&amp;lt;/tt&amp;gt; under &#039;&#039;Options provided by plugins&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-name=NAME&amp;lt;/tt&amp;gt; || Use existing enroot container (omit the &amp;lt;tt&amp;gt;pyxis_&amp;lt;/tt&amp;gt; prefix)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-image=IMAGE&amp;lt;/tt&amp;gt; || Pull image from registry and create container on the fly&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-mount-home&amp;lt;/tt&amp;gt; || Mount &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt; into container (already in defaults, but explicit flag also works)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-mounts=SRC:DST[,…]&amp;lt;/tt&amp;gt; || Bind-mount additional paths&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-writable&amp;lt;/tt&amp;gt; || Make the container overlay writable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-remap-root&amp;lt;/tt&amp;gt; || Become root inside the container (no real root on host)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-workdir=PATH&amp;lt;/tt&amp;gt; || Set the working directory inside the container&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GPU access ==&lt;br /&gt;
&lt;br /&gt;
GPU passthrough is &#039;&#039;&#039;automatic&#039;&#039;&#039; — no extra flags are needed.&lt;br /&gt;
Enroot/Pyxis detect the allocated GPUs via Slurm&#039;s GRES mechanism and make them available inside the container.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
salloc -p l40s --gres=gpu:1 --container-name=pytorch&lt;br /&gt;
# nvidia-smi works inside the container out of the box&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
&lt;br /&gt;
* Install extra packages interactively with &amp;lt;tt&amp;gt;enroot start --root --rw&amp;lt;/tt&amp;gt; before submitting batch jobs.&lt;br /&gt;
* Use &amp;lt;tt&amp;gt;--container-writable&amp;lt;/tt&amp;gt; in batch jobs only if your script modifies the container filesystem; otherwise the default overlay is discarded after the job anyway.&lt;br /&gt;
* Store large datasets in workspaces (&amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt;), not in &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt;, to avoid filling your home quota with data files.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers&amp;diff=16052</id>
		<title>NEMO2/Containers</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers&amp;diff=16052"/>
		<updated>2026-05-07T17:16:44Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Note on Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NEMO supports two container runtimes for different use cases.&lt;br /&gt;
Neither requires root privileges and both integrate with the cluster&#039;s shared filesystems (&amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! [[NEMO2/Containers/Enroot|Enroot + Pyxis]] (recommended)&lt;br /&gt;
! [[NEMO2/Containers/Apptainer|Apptainer / Singularity]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Image source&#039;&#039;&#039;&lt;br /&gt;
| Docker Hub, NGC, any OCI registry&lt;br /&gt;
| Apptainer Hub, Docker (via conversion), SIF files&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Image format&#039;&#039;&#039;&lt;br /&gt;
| SquashFS (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;)&lt;br /&gt;
| SIF (&amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Slurm integration&#039;&#039;&#039;&lt;br /&gt;
| Native via Pyxis plugin (&amp;lt;tt&amp;gt;--container-name&amp;lt;/tt&amp;gt; etc.)&lt;br /&gt;
| Manual — wrap in batch script&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;GPU support&#039;&#039;&#039;&lt;br /&gt;
| Automatic, no extra flags needed&lt;br /&gt;
| Via &amp;lt;tt&amp;gt;--nv&amp;lt;/tt&amp;gt; flag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Installation&#039;&#039;&#039;&lt;br /&gt;
| System-wide, always available&lt;br /&gt;
| System-wide, always available&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Best for&#039;&#039;&#039;&lt;br /&gt;
| Docker-based workflows, GPU workloads, Slurm batch jobs&lt;br /&gt;
| Existing SIF images, reproducible science, portability&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== When to use what ==&lt;br /&gt;
&lt;br /&gt;
; Enroot + Pyxis&lt;br /&gt;
: Use this if you want to run Docker images directly from a registry, submit containerised jobs via &amp;lt;tt&amp;gt;srun&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;sbatch&amp;lt;/tt&amp;gt;, or need tight GPU integration.&lt;br /&gt;
: [[NEMO2/Containers/Enroot|→ Enroot &amp;amp; Pyxis details]]&lt;br /&gt;
&lt;br /&gt;
; Apptainer&lt;br /&gt;
: Use this if you have an existing &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; image, are working with a workflow that builds Apptainer/Singularity images, or need a self-contained portable image you can copy between systems.&lt;br /&gt;
: [[NEMO2/Containers/Apptainer|→ Apptainer details]]&lt;br /&gt;
&lt;br /&gt;
== Note on Docker ==&lt;br /&gt;
&lt;br /&gt;
Plain Docker is &#039;&#039;&#039;not available&#039;&#039;&#039; on NEMO. Both Enroot and Apptainer can pull Docker/OCI images directly from registries without a local Docker installation.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Apptainer&amp;diff=16051</id>
		<title>NEMO2/Containers/Apptainer</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Apptainer&amp;diff=16051"/>
		<updated>2026-05-07T17:14:23Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;Apptainer&amp;#039;&amp;#039;&amp;#039; (formerly Singularity) is a container runtime designed for HPC systems. It is installed system-wide on NEMO and available without loading a module.  == Key properties ==  * Runs as the invoking user — no root required and no privilege escalation * Uses SIF (Singularity Image Format), a single portable file * Can convert Docker images to SIF at build time * No native Slurm plugin — call &amp;lt;tt&amp;gt;apptainer exec/run&amp;lt;/tt&amp;gt; inside your batch script  == Image sou...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Apptainer&#039;&#039;&#039; (formerly Singularity) is a container runtime designed for HPC systems.&lt;br /&gt;
It is installed system-wide on NEMO and available without loading a module.&lt;br /&gt;
&lt;br /&gt;
== Key properties ==&lt;br /&gt;
&lt;br /&gt;
* Runs as the invoking user — no root required and no privilege escalation&lt;br /&gt;
* Uses SIF (Singularity Image Format), a single portable file&lt;br /&gt;
* Can convert Docker images to SIF at build time&lt;br /&gt;
* No native Slurm plugin — call &amp;lt;tt&amp;gt;apptainer exec/run&amp;lt;/tt&amp;gt; inside your batch script&lt;br /&gt;
&lt;br /&gt;
== Image sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Example&lt;br /&gt;
|-&lt;br /&gt;
| Apptainer Hub || &amp;lt;tt&amp;gt;apptainer pull hello-world.sif library://lolcow&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Docker Hub (converted) || &amp;lt;tt&amp;gt;apptainer pull ubuntu.sif docker://ubuntu:24.04&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; file || copy to &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt; or a workspace and use directly&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Image storage ==&lt;br /&gt;
&lt;br /&gt;
SIF files are plain files — store them wherever you like.&lt;br /&gt;
To avoid filling your home quota, keep images in a [[Workspaces|workspace]] and use a symlink so your scripts don&#039;t need to change:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a workspace (100 days)&lt;br /&gt;
ws_allocate apptainer 100&lt;br /&gt;
&lt;br /&gt;
# create an images directory in the workspace and symlink it from home&lt;br /&gt;
ln -s $(ws_find apptainer) ~/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pull images directly into the workspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apptainer pull ~/images/ubuntu.sif docker://ubuntu:24.04&lt;br /&gt;
apptainer pull ~/images/pytorch.sif docker://nvcr.io/nvidia/pytorch:24.01-py3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In batch scripts, reference images via the symlink:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IMAGE=$HOME/images/pytorch.sif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basic commands ==&lt;br /&gt;
&lt;br /&gt;
=== Pull / build an image ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# from Docker Hub → produces ubuntu.sif in ~/images/&lt;br /&gt;
apptainer pull ~/images/ubuntu.sif docker://ubuntu:24.04&lt;br /&gt;
&lt;br /&gt;
# from NVIDIA NGC&lt;br /&gt;
apptainer pull ~/images/pytorch.sif docker://nvcr.io/nvidia/pytorch:24.01-py3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run a command inside a container ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# exec: run a specific command&lt;br /&gt;
apptainer exec ubuntu.sif python3 script.py&lt;br /&gt;
&lt;br /&gt;
# run: execute the container&#039;s default runscript&lt;br /&gt;
apptainer run ubuntu.sif&lt;br /&gt;
&lt;br /&gt;
# shell: interactive shell&lt;br /&gt;
apptainer shell ubuntu.sif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GPU access ===&lt;br /&gt;
&lt;br /&gt;
Pass the &amp;lt;tt&amp;gt;--nv&amp;lt;/tt&amp;gt; flag to enable NVIDIA GPU passthrough:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apptainer exec --nv pytorch.sif python3 train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bind-mount paths ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt; are available inside the container by default (Apptainer automatically binds a set of paths; check &amp;lt;tt&amp;gt;apptainer config&amp;lt;/tt&amp;gt; for the system defaults).&lt;br /&gt;
&lt;br /&gt;
To mount additional directories explicitly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apptainer exec --bind /work/classic/myWs:/data ubuntu.sif bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using Apptainer in a Slurm batch job ==&lt;br /&gt;
&lt;br /&gt;
Unlike Enroot/Pyxis there is no Slurm plugin; simply call &amp;lt;tt&amp;gt;apptainer&amp;lt;/tt&amp;gt; from your batch script:&lt;br /&gt;
&lt;br /&gt;
CPU job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p cpu&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --time=01:00:00&lt;br /&gt;
&lt;br /&gt;
IMAGE=$HOME/images/ubuntu.sif&lt;br /&gt;
&lt;br /&gt;
apptainer exec &amp;quot;$IMAGE&amp;quot; python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GPU job (use &amp;lt;tt&amp;gt;--nv&amp;lt;/tt&amp;gt; to pass through the allocated GPUs):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p l40s&lt;br /&gt;
#SBATCH --gres=gpu:1&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --time=01:00:00&lt;br /&gt;
&lt;br /&gt;
IMAGE=$HOME/images/pytorch.sif&lt;br /&gt;
&lt;br /&gt;
apptainer exec --nv &amp;quot;$IMAGE&amp;quot; python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building images ==&lt;br /&gt;
&lt;br /&gt;
Building a new SIF image from a definition file requires root (or a system that supports fakeroot/user namespaces).&lt;br /&gt;
On NEMO you cannot build images directly on the compute nodes.&lt;br /&gt;
&lt;br /&gt;
Recommended workflow:&lt;br /&gt;
# Build on a machine where you have root (local workstation, VM, GitHub Actions, …)&lt;br /&gt;
# Transfer the &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; file to NEMO (e.g. &amp;lt;tt&amp;gt;scp&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;)&lt;br /&gt;
# Run on NEMO as usual&lt;br /&gt;
&lt;br /&gt;
Store images in a workspace (symlinked to &amp;lt;tt&amp;gt;~/images/&amp;lt;/tt&amp;gt; as described above) — not in &amp;lt;tt&amp;gt;$TMPDIR&amp;lt;/tt&amp;gt;, which is job-local and deleted after the job.&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;tt&amp;gt;apptainer exec --writable-tmpfs&amp;lt;/tt&amp;gt; if the container tries to write to its own filesystem (without persisting changes).&lt;br /&gt;
* The &amp;lt;tt&amp;gt;--containall&amp;lt;/tt&amp;gt; flag gives a fully isolated environment (no automatic bind-mounts); useful for reproducibility tests.&lt;br /&gt;
* To check what Apptainer version is installed: &amp;lt;tt&amp;gt;apptainer --version&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Enroot&amp;diff=16050</id>
		<title>NEMO2/Containers/Enroot</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers/Enroot&amp;diff=16050"/>
		<updated>2026-05-07T17:05:11Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;Enroot&amp;#039;&amp;#039;&amp;#039; is a container runtime developed by NVIDIA that runs OCI/Docker containers without root privileges. On NEMO it is the &amp;#039;&amp;#039;&amp;#039;recommended&amp;#039;&amp;#039;&amp;#039; container solution and is integrated with Slurm via the &amp;#039;&amp;#039;&amp;#039;Pyxis&amp;#039;&amp;#039;&amp;#039; SPANK plugin.  == How it works ==  Enroot converts a Docker image into a SquashFS file (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;), unpacks it on demand into an overlay filesystem, and runs your workload inside that environment. The Pyxis plugin adds &amp;lt;tt&amp;gt;--container-*&amp;lt;/tt&amp;gt; options to...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Enroot&#039;&#039;&#039; is a container runtime developed by NVIDIA that runs OCI/Docker containers without root privileges.&lt;br /&gt;
On NEMO it is the &#039;&#039;&#039;recommended&#039;&#039;&#039; container solution and is integrated with Slurm via the &#039;&#039;&#039;Pyxis&#039;&#039;&#039; SPANK plugin.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
Enroot converts a Docker image into a SquashFS file (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;), unpacks it on demand into an overlay filesystem, and runs your workload inside that environment.&lt;br /&gt;
The Pyxis plugin adds &amp;lt;tt&amp;gt;--container-*&amp;lt;/tt&amp;gt; options to &amp;lt;tt&amp;gt;srun&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;salloc&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;sbatch&amp;lt;/tt&amp;gt; so containers become first-class Slurm jobs.&lt;br /&gt;
&lt;br /&gt;
== Default mounts ==&lt;br /&gt;
&lt;br /&gt;
The following paths are &#039;&#039;&#039;automatically mounted&#039;&#039;&#039; into every container when launched via Slurm/Pyxis:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Host path !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt; || all home directories, read-write&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt; || all workspace filesystems, read-write&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/etc/slurm&amp;lt;/tt&amp;gt; || Slurm configuration (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;/usr/lib64/slurm&amp;lt;/tt&amp;gt; || Slurm plug-in libraries (read-only)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You do &#039;&#039;&#039;not&#039;&#039;&#039; need to pass &amp;lt;tt&amp;gt;--container-mount-home&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--container-mounts=/work&amp;lt;/tt&amp;gt; manually — they are already there.&lt;br /&gt;
The paths inside the container are &#039;&#039;&#039;identical&#039;&#039;&#039; to the paths on the host system, so scripts and config files referencing &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt; or workspace paths work without modification.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;ws_*&amp;lt;/tt&amp;gt; tools (e.g. &amp;lt;tt&amp;gt;ws_find&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ws_list&amp;lt;/tt&amp;gt;) are &#039;&#039;&#039;not available inside the container&#039;&#039;&#039;.&lt;br /&gt;
Determine your workspace path on the login node before submitting the job and pass it as an environment variable or hard-code it in your script.&lt;br /&gt;
&lt;br /&gt;
== Container image storage ==&lt;br /&gt;
&lt;br /&gt;
Unpacked container images are stored in:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/share/enroot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Images are SquashFS files and can be several GB.&lt;br /&gt;
To avoid filling your home quota, store images in a [[Workspaces|workspace]] and symlink the default path:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a workspace (100 days)&lt;br /&gt;
ws_allocate enroot 100&lt;br /&gt;
&lt;br /&gt;
# replace the default enroot directory with a symlink to the workspace&lt;br /&gt;
mkdir -p ~/.local/share&lt;br /&gt;
ln -s $(ws_find enroot) ~/.local/share/enroot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enroot (and Pyxis) will now transparently use the workspace path for all image storage.&lt;br /&gt;
&lt;br /&gt;
== Usage without Slurm (interactive) ==&lt;br /&gt;
&lt;br /&gt;
=== Import an image ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# from Docker Hub&lt;br /&gt;
enroot import docker://ubuntu:24.04&lt;br /&gt;
&lt;br /&gt;
# from quay.io&lt;br /&gt;
enroot import docker://quay.io#rockylinux/rockylinux:9&lt;br /&gt;
&lt;br /&gt;
# from NVIDIA NGC&lt;br /&gt;
enroot import docker://nvcr.io#nvidia/pytorch:24.01-py3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates a &amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt; file in the current directory.&lt;br /&gt;
&lt;br /&gt;
=== Create a container ===&lt;br /&gt;
&lt;br /&gt;
The container name must be prefixed with &amp;lt;tt&amp;gt;pyxis_&amp;lt;/tt&amp;gt; for Slurm/Pyxis to find it later (omit the prefix when passing &amp;lt;tt&amp;gt;--container-name&amp;lt;/tt&amp;gt; to Slurm).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enroot create --name pyxis_ubuntu ubuntu+24.04.sqsh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Start a container ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# interactive shell, read-write&lt;br /&gt;
enroot start --rw pyxis_ubuntu bash&lt;br /&gt;
&lt;br /&gt;
# get root inside the container (to install packages)&lt;br /&gt;
enroot start --root --rw pyxis_ubuntu bash&lt;br /&gt;
&lt;br /&gt;
# mount an extra directory (e.g. from outside /home and /work)&lt;br /&gt;
enroot start --rw -m /tmp/mydata:/data pyxis_ubuntu bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== List and remove containers ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enroot list --fancy&lt;br /&gt;
enroot remove pyxis_ubuntu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage via Slurm / Pyxis ==&lt;br /&gt;
&lt;br /&gt;
=== Interactive allocation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# use an already-created container&lt;br /&gt;
salloc -p cpu --container-name=ubuntu&lt;br /&gt;
&lt;br /&gt;
# pull, create and start in one step (container is created under ~/.local/share/enroot/)&lt;br /&gt;
salloc -p cpu --container-image=ubuntu:24.04 --container-name=ubuntu&lt;br /&gt;
salloc -p cpu --container-image=&amp;quot;quay.io#rockylinux/rockylinux:9&amp;quot; --container-name=rocky&lt;br /&gt;
salloc -p l40s --gres=gpu:1 --container-image=&amp;quot;nvcr.io#nvidia/pytorch:24.01-py3&amp;quot; --container-name=pytorch&lt;br /&gt;
&lt;br /&gt;
# start with a specific working directory inside the container&lt;br /&gt;
# $(ws_find enroot) is evaluated on the login node before the job starts&lt;br /&gt;
salloc -p cpu --container-name=ubuntu --container-workdir=$(ws_find enroot)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Batch job ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p cpu&lt;br /&gt;
#SBATCH --container-name=ubuntu&lt;br /&gt;
&lt;br /&gt;
python3 /work/classic/myWs/train.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Useful Pyxis options ===&lt;br /&gt;
&lt;br /&gt;
All options are listed in &amp;lt;tt&amp;gt;srun --help&amp;lt;/tt&amp;gt; under &#039;&#039;Options provided by plugins&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-name=NAME&amp;lt;/tt&amp;gt; || Use existing enroot container (omit the &amp;lt;tt&amp;gt;pyxis_&amp;lt;/tt&amp;gt; prefix)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-image=IMAGE&amp;lt;/tt&amp;gt; || Pull image from registry and create container on the fly&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-mount-home&amp;lt;/tt&amp;gt; || Mount &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt; into container (already in defaults, but explicit flag also works)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-mounts=SRC:DST[,…]&amp;lt;/tt&amp;gt; || Bind-mount additional paths&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-writable&amp;lt;/tt&amp;gt; || Make the container overlay writable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-remap-root&amp;lt;/tt&amp;gt; || Become root inside the container (no real root on host)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;--container-workdir=PATH&amp;lt;/tt&amp;gt; || Set the working directory inside the container&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GPU access ==&lt;br /&gt;
&lt;br /&gt;
GPU passthrough is &#039;&#039;&#039;automatic&#039;&#039;&#039; — no extra flags are needed.&lt;br /&gt;
Enroot/Pyxis detect the allocated GPUs via Slurm&#039;s GRES mechanism and make them available inside the container.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
salloc -p l40s --gres=gpu:1 --container-name=pytorch&lt;br /&gt;
# nvidia-smi works inside the container out of the box&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
&lt;br /&gt;
* Install extra packages interactively with &amp;lt;tt&amp;gt;enroot start --root --rw&amp;lt;/tt&amp;gt; before submitting batch jobs.&lt;br /&gt;
* Use &amp;lt;tt&amp;gt;--container-writable&amp;lt;/tt&amp;gt; in batch jobs only if your script modifies the container filesystem; otherwise the default overlay is discarded after the job anyway.&lt;br /&gt;
* Store large datasets in workspaces (&amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt;), not in &amp;lt;tt&amp;gt;$HOME&amp;lt;/tt&amp;gt;, to avoid filling your home quota with data files.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers&amp;diff=16049</id>
		<title>NEMO2/Containers</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers&amp;diff=16049"/>
		<updated>2026-05-07T17:04:34Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NEMO supports two container runtimes for different use cases.&lt;br /&gt;
Neither requires root privileges and both integrate with the cluster&#039;s shared filesystems (&amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! [[NEMO2/Containers/Enroot|Enroot + Pyxis]] (recommended)&lt;br /&gt;
! [[NEMO2/Containers/Apptainer|Apptainer / Singularity]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Image source&#039;&#039;&#039;&lt;br /&gt;
| Docker Hub, NGC, any OCI registry&lt;br /&gt;
| Apptainer Hub, Docker (via conversion), SIF files&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Image format&#039;&#039;&#039;&lt;br /&gt;
| SquashFS (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;)&lt;br /&gt;
| SIF (&amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Slurm integration&#039;&#039;&#039;&lt;br /&gt;
| Native via Pyxis plugin (&amp;lt;tt&amp;gt;--container-name&amp;lt;/tt&amp;gt; etc.)&lt;br /&gt;
| Manual — wrap in batch script&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;GPU support&#039;&#039;&#039;&lt;br /&gt;
| Automatic, no extra flags needed&lt;br /&gt;
| Via &amp;lt;tt&amp;gt;--nv&amp;lt;/tt&amp;gt; flag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Installation&#039;&#039;&#039;&lt;br /&gt;
| System-wide, always available&lt;br /&gt;
| System-wide, always available&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Best for&#039;&#039;&#039;&lt;br /&gt;
| Docker-based workflows, GPU workloads, Slurm batch jobs&lt;br /&gt;
| Existing SIF images, reproducible science, portability&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== When to use what ==&lt;br /&gt;
&lt;br /&gt;
; Enroot + Pyxis&lt;br /&gt;
: Use this if you want to run Docker images directly from a registry, submit containerised jobs via &amp;lt;tt&amp;gt;srun&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;sbatch&amp;lt;/tt&amp;gt;, or need tight GPU integration.&lt;br /&gt;
: [[NEMO2/Containers/Enroot|→ Enroot &amp;amp; Pyxis details]]&lt;br /&gt;
&lt;br /&gt;
; Apptainer&lt;br /&gt;
: Use this if you have an existing &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; image, are working with a workflow that builds Apptainer/Singularity images, or need a self-contained portable image you can copy between systems.&lt;br /&gt;
: [[NEMO2/Containers/Apptainer|→ Apptainer details]]&lt;br /&gt;
&lt;br /&gt;
== Note on Docker ==&lt;br /&gt;
&lt;br /&gt;
Plain Docker is &#039;&#039;&#039;not available&#039;&#039;&#039; on NEMO. Use Enroot to pull and run Docker images, or build a &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; with Apptainer on a machine where you have Docker installed and copy it over.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=Development/Containers&amp;diff=16046</id>
		<title>Development/Containers</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=Development/Containers&amp;diff=16046"/>
		<updated>2026-05-07T15:03:45Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The bwHPC clusters mostly provide Singularity as a container runtime environment.&lt;br /&gt;
&lt;br /&gt;
To learn more about the usage of Singularity, visit the corresponding cluster page.&lt;br /&gt;
&lt;br /&gt;
* [[BwUniCluster3.0/Containers]]&lt;br /&gt;
* [[JUSTUS2/Software/Singularity]]&lt;br /&gt;
* [[Helix/Software/Singularity]]&lt;br /&gt;
* [[NEMO2/Containers]]&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers&amp;diff=16044</id>
		<title>NEMO2/Containers</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/Containers&amp;diff=16044"/>
		<updated>2026-05-07T11:28:12Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: Created page with &amp;quot;NEMO supports two container runtimes for different use cases. Neither requires root privileges and both integrate with the cluster&amp;#039;s shared filesystems (&amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt;).  == Overview ==  {| class=&amp;quot;wikitable&amp;quot; |- ! ! Enroot + Pyxis (recommended) ! Apptainer / Singularity |- | &amp;#039;&amp;#039;&amp;#039;Image source&amp;#039;&amp;#039;&amp;#039; | Docker Hub, NGC, any OCI registry | Apptainer Hub, Docker (via conversion), SIF files |- | &amp;#039;&amp;#039;&amp;#039;Image format&amp;#039;&amp;#039;&amp;#039; | Squa...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NEMO supports two container runtimes for different use cases.&lt;br /&gt;
Neither requires root privileges and both integrate with the cluster&#039;s shared filesystems (&amp;lt;tt&amp;gt;/home&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;/work&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! [[Containers/Enroot|Enroot + Pyxis]] (recommended)&lt;br /&gt;
! [[Containers/Apptainer|Apptainer / Singularity]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Image source&#039;&#039;&#039;&lt;br /&gt;
| Docker Hub, NGC, any OCI registry&lt;br /&gt;
| Apptainer Hub, Docker (via conversion), SIF files&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Image format&#039;&#039;&#039;&lt;br /&gt;
| SquashFS (&amp;lt;tt&amp;gt;.sqsh&amp;lt;/tt&amp;gt;)&lt;br /&gt;
| SIF (&amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Slurm integration&#039;&#039;&#039;&lt;br /&gt;
| Native via Pyxis plugin (&amp;lt;tt&amp;gt;--container-name&amp;lt;/tt&amp;gt; etc.)&lt;br /&gt;
| Manual — wrap in batch script&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;GPU support&#039;&#039;&#039;&lt;br /&gt;
| Automatic, no extra flags needed&lt;br /&gt;
| Via &amp;lt;tt&amp;gt;--nv&amp;lt;/tt&amp;gt; flag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Installation&#039;&#039;&#039;&lt;br /&gt;
| System-wide, always available&lt;br /&gt;
| System-wide, always available&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Best for&#039;&#039;&#039;&lt;br /&gt;
| Docker-based workflows, GPU workloads, Slurm batch jobs&lt;br /&gt;
| Existing SIF images, reproducible science, portability&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== When to use what ==&lt;br /&gt;
&lt;br /&gt;
; Enroot + Pyxis&lt;br /&gt;
: Use this if you want to run Docker images directly from a registry, submit containerised jobs via &amp;lt;tt&amp;gt;srun&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;sbatch&amp;lt;/tt&amp;gt;, or need tight GPU integration.&lt;br /&gt;
: [[Containers/Enroot|→ Enroot &amp;amp; Pyxis details]]&lt;br /&gt;
&lt;br /&gt;
; Apptainer&lt;br /&gt;
: Use this if you have an existing &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; image, are working with a workflow that builds Apptainer/Singularity images, or need a self-contained portable image you can copy between systems.&lt;br /&gt;
: [[Containers/Apptainer|→ Apptainer details]]&lt;br /&gt;
&lt;br /&gt;
== Note on Docker ==&lt;br /&gt;
&lt;br /&gt;
Plain Docker is &#039;&#039;&#039;not available&#039;&#039;&#039; on NEMO. Use Enroot to pull and run Docker images, or build a &amp;lt;tt&amp;gt;.sif&amp;lt;/tt&amp;gt; with Apptainer on a machine where you have Docker installed and copy it over.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2&amp;diff=16043</id>
		<title>NEMO2</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2&amp;diff=16043"/>
		<updated>2026-05-07T11:26:35Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Serverraum-2024-09.jpg|center|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;bwForCluster NEMO 2&#039;&#039;&#039; is dedicated to research in the bwHPC domains Neuroscience, Elementary Particle Physics, Microsystems Engineering and Material Science (NEMO).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{| style=&amp;quot;  background:#ffa833; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f80; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | NEMO1 Migration&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* Still using NEMO1: &#039;&#039;&#039;[[NEMO1|Go To NEMO1 Legacy Wiki]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Users of NEMO1 must&#039;&#039;&#039; [[Registration/bwForCluster/NEMO2|&#039;&#039;&#039;re-register for NEMO2&#039;&#039;&#039;]] (only step C necessary). You keep your existing projects (Rechenvorhaben).&lt;br /&gt;
* &#039;&#039;&#039;[[NEMO2/Migrate NEMO1 workspaces to NEMO2 workspaces|Migrate NEMO1 workspaces to NEMO2 workspaces]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[NEMO2/Migrate Moab to Slurm jobs|Migrate Moab to Slurm jobs]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#ffa833; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#f80; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Maintenance&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;strong&amp;gt;[https://www.nemo.uni-freiburg.de/nemo/stat/ Scheduled Power Maintenance 09.04.2024]&amp;lt;/strong&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#FEF4AB; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#FFE856; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | News and Events&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [https://www.nemo.uni-freiburg.de/news/ NEMO News]&lt;br /&gt;
* [https://www.nemo.uni-freiburg.de/nemo/stat/ NEMO Status, Usage and (Maintenance) Announcements]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#eeeefe; width:100%;&amp;quot; &lt;br /&gt;
| style=&amp;quot;padding:8px; background:#dedefe; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Training &amp;amp; Support&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* [[NEMO2/Start|Getting Started]]&lt;br /&gt;
* [https://training.bwhpc.de E-Learning Courses]&lt;br /&gt;
* Contact and [[NEMO2/Support|Support]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#deffee; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#cef2e0; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | User Documentation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* [[Registration]] for one of the bwHPC clusters&lt;br /&gt;
* [[NEMO2/Login|Login]]&lt;br /&gt;
* [[NEMO2/Hardware|Hardware and Architecture]]&lt;br /&gt;
* [[NEMO2/Hardware#File_Systems|File Systems]] and [[Workspaces]] &lt;br /&gt;
** [[NEMO2/SDS_hd|Using SDS@hd on NEMO2]]&lt;br /&gt;
* Cluster Specific Software:&lt;br /&gt;
** [[NEMO2/Modules|Available Modules (Wiki)]] or [https://www.nemo.uni-freiburg.de/easybuild-modules/ Available Modules (HTML, incl. search)] on NEMO2&lt;br /&gt;
** [[NEMO2/Easybuild Modules|Easybuild Modules]] (hints for building your own software!)&lt;br /&gt;
** [[Conda]]&lt;br /&gt;
** [[NEMO2/Containers|Containers]] (Enroot and Apptainer/Singularity)&lt;br /&gt;
* [[NEMO2/Slurm|Submitting and managing Jobs with Slurm]] ([[HPC_Glossary#Batch_System|Batch System]])&lt;br /&gt;
* [[Development]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;  background:#e6e9eb; width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:8px; background:#d1dadf; font-size:120%; font-weight:bold;  text-align:left&amp;quot; | Cluster Funding&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Please [[NEMO2/Acknowledgement|acknowledge]] the NEMO2 in your publications.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/SDS_hd&amp;diff=16006</id>
		<title>NEMO2/SDS hd</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/SDS_hd&amp;diff=16006"/>
		<updated>2026-04-22T16:49:14Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Per-user configuration file */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;WARNING! This feature is currently for testing purposes only!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDS@hd&#039;&#039;&#039; is the scientific storage service of Heidelberg University. On NEMO2, you can mount your SDS@hd project directly into your jobs or interactive sessions via rclone. Data is cached locally on the node&#039;s NVMe drive and uploaded to SDS@hd in the background.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #28a745; padding: 15px; background-color: #d4edda; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What you need to do:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[#Initial_Setup_.28Required.29|Initial Setup]]&#039;&#039;&#039; — one-time configuration, takes about 5 minutes. &#039;&#039;&#039;You must complete this before using SDS@hd on NEMO2.&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[#Advanced_Configuration|Advanced Configuration]]&#039;&#039;&#039; — optional. Tune cache size, bandwidth limits, and more. Skip this on your first use.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Initial Setup (Required) =&lt;br /&gt;
&lt;br /&gt;
Complete these four steps once. After that, SDS@hd is available in all your jobs and interactive sessions without any further configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prerequisites:&#039;&#039;&#039;&lt;br /&gt;
* Your bwIDM username and SDS@hd password&lt;br /&gt;
* Your SDS@hd project ID (e.g. &amp;lt;tt&amp;gt;sd14a001&amp;lt;/tt&amp;gt;, find it at [[SDS@hd/Access]])&lt;br /&gt;
&lt;br /&gt;
== Step 1: Create the rclone configuration file ==&lt;br /&gt;
&lt;br /&gt;
Run this command to create the config file with the correct permissions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone config touch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates &amp;lt;tt&amp;gt;~/.config/rclone/rclone.conf&amp;lt;/tt&amp;gt; with mode 600. Now open the file in an editor and add the following two sections, replacing the placeholder values with your own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[sdshd-backend]&lt;br /&gt;
type = sftp&lt;br /&gt;
host = lsdf02-sshfs.urz.uni-heidelberg.de&lt;br /&gt;
user = YOUR_BWIDM_USERNAME&lt;br /&gt;
pass = PASTE_OBSCURED_PASSWORD_HERE&lt;br /&gt;
md5sum_command = none&lt;br /&gt;
sha1sum_command = none&lt;br /&gt;
shell_type = unix&lt;br /&gt;
set_modtime = false&lt;br /&gt;
idle_timeout = 0&lt;br /&gt;
&lt;br /&gt;
[sdshd-sftp]&lt;br /&gt;
type = alias&lt;br /&gt;
remote = sdshd-backend:YOUR_PROJECT_ID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace:&lt;br /&gt;
* &amp;lt;tt&amp;gt;YOUR_BWIDM_USERNAME&amp;lt;/tt&amp;gt; — your bwIDM login name (same as on NEMO2)&lt;br /&gt;
* &amp;lt;tt&amp;gt;YOUR_PROJECT_ID&amp;lt;/tt&amp;gt; — your SDS@hd project ID, e.g. &amp;lt;tt&amp;gt;sd14a001&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;PASTE_OBSCURED_PASSWORD_HERE&amp;lt;/tt&amp;gt; — leave this for now, you will fill it in Step 2&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; section name must not be changed&#039;&#039;&#039; — all NEMO2 scripts mount &amp;lt;tt&amp;gt;sdshd-sftp:&amp;lt;/tt&amp;gt; by name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #17a2b8; padding: 15px; background-color: #d1ecf1; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What the path in &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; controls:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The path after the colon in &amp;lt;tt&amp;gt;remote = sdshd-backend:YOUR_PROJECT_ID&amp;lt;/tt&amp;gt; becomes the root of your mount at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt;. If you set it correctly, your project files appear directly under &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you leave the path empty (&amp;lt;tt&amp;gt;remote = sdshd-backend:&amp;lt;/tt&amp;gt;), the mount shows the SFTP server&#039;s home directory. Your project then appears as a &#039;&#039;subdirectory&#039;&#039; at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/YOUR_PROJECT_ID/&amp;lt;/tt&amp;gt;. Job scripts that reference &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/&amp;lt;/tt&amp;gt; directly will not find your data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception:&#039;&#039;&#039; If you are a member of multiple projects, you may intentionally omit the project ID so all projects appear as subdirectories. In that case, adjust your job scripts to include the project ID in the path.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 2: Set the password ==&lt;br /&gt;
&lt;br /&gt;
rclone does not store passwords in plain text — it stores an obscured form. Generate the obscured password with the following command. It reads your password without echoing it to the terminal and is never written to your shell history:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf &#039;SDS@hd password:\n&#039;; read -s p &amp;amp;&amp;amp; printf &#039;%s&#039; &amp;quot;$p&amp;quot; | rclone obscure -; echo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Type your SDS@hd password and press Enter. The command prints a string like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QKkf-abc123XYZetc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy that string and paste it as the &amp;lt;tt&amp;gt;pass =&amp;lt;/tt&amp;gt; value in &amp;lt;tt&amp;gt;~/.config/rclone/rclone.conf&amp;lt;/tt&amp;gt;, replacing &amp;lt;tt&amp;gt;PASTE_OBSCURED_PASSWORD_HERE&amp;lt;/tt&amp;gt;. Then clear the variable from memory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unset p        # bash / zsh&lt;br /&gt;
# set -e p    # fish&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Do not use &amp;lt;tt&amp;gt;echo &amp;quot;mypassword&amp;quot; | rclone obscure -&amp;lt;/tt&amp;gt;&#039;&#039;&#039; — the password would appear in your shell history and in &amp;lt;tt&amp;gt;ps&amp;lt;/tt&amp;gt; output. The &amp;lt;tt&amp;gt;read -s&amp;lt;/tt&amp;gt; method above avoids both.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3: Protect the config file ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;rclone config touch&amp;lt;/tt&amp;gt; already creates the file with mode 600. If you created it manually or are unsure, set the permissions explicitly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 600 ~/.config/rclone/rclone.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4: Verify the connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone ls sdshd-sftp:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expected output: a list of files and directories in your project. An empty listing (no output, no error) is also fine — it means the project exists but is empty.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Error message&lt;br /&gt;
! Likely cause&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;SSH authentication failed&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Wrong username or password&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;no such file or directory&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Project ID in &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; is wrong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;connection refused&amp;lt;/tt&amp;gt; / timeout&lt;br /&gt;
| Network issue or wrong hostname&lt;br /&gt;
|-&lt;br /&gt;
| Empty listing (no error)&lt;br /&gt;
| Project exists but is empty — that is fine&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setup complete.&#039;&#039;&#039; See [[#Basic_Usage|Basic Usage]] to start using SDS@hd.&lt;br /&gt;
&lt;br /&gt;
= Basic Usage =&lt;br /&gt;
&lt;br /&gt;
== Interactive sessions on login nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd            # mount at /mnt/sdshd/$USER&lt;br /&gt;
umount-sdshd           # unmount and wait for all uploads to finish&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The mount point &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt; is created automatically when you log in, via a PAM hook. No manual admin step is needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Always use &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; to disconnect — never &amp;lt;tt&amp;gt;fusermount -u&amp;lt;/tt&amp;gt; directly.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;fusermount -u&amp;lt;/tt&amp;gt; terminates rclone immediately, cutting off any uploads in progress and causing data loss. &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; waits until rclone confirms that all uploads are complete before sending the shutdown signal.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;tt&amp;gt;mount-sdshd --help&amp;lt;/tt&amp;gt; for all options and examples.&lt;br /&gt;
&lt;br /&gt;
== Slurm jobs ==&lt;br /&gt;
&lt;br /&gt;
Add the &amp;lt;tt&amp;gt;--gres=sdshd&amp;lt;/tt&amp;gt; flag to your job script. The Slurm prolog mounts SDS@hd automatically at job start; the epilog waits for all uploads to complete before the job finishes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#SBATCH --gres=sdshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your data is available at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt; inside the job, with no further commands needed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The job shows &amp;lt;tt&amp;gt;CG&amp;lt;/tt&amp;gt; (COMPLETING) in &amp;lt;tt&amp;gt;squeue&amp;lt;/tt&amp;gt; during the upload phase.&#039;&#039;&#039; For large output files this can take minutes — this is expected and safe. The job will not exit until all data has been confirmed uploaded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you need data on SDS@hd before the job finishes&#039;&#039;&#039; (e.g. for a multi-step pipeline where the next job reads this job&#039;s output), call &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; explicitly at the end of your job script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --gres=sdshd&lt;br /&gt;
&lt;br /&gt;
# ... your computation ...&lt;br /&gt;
&lt;br /&gt;
umount-sdshd    # blocks here until all uploads are done, then the job exits&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Advanced Configuration =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 15px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This section is optional.&#039;&#039;&#039; The built-in defaults work well for most jobs. Come back here if you need to:&lt;br /&gt;
* limit cache size or bandwidth&lt;br /&gt;
* use a persistent (crash-safe) cache on Weka&lt;br /&gt;
* tune performance for ML training or large job arrays&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Per-user configuration file ==&lt;br /&gt;
&lt;br /&gt;
Create &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt; to override the built-in defaults for all your jobs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p ~/.config/sdshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The format is &amp;lt;tt&amp;gt;key = value&amp;lt;/tt&amp;gt;, one per line. Lines starting with &amp;lt;tt&amp;gt;#&amp;lt;/tt&amp;gt; are comments. The file is parsed without being executed — invalid or unknown keys are silently ignored.&lt;br /&gt;
&lt;br /&gt;
=== Configuration keys ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;/tmp/sdshd-&amp;lt;uid&amp;gt;/cache/&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Local VFS cache directory. Node-local NVMe by default (cleaned on reboot). Set to a Weka workspace path for crash-safe persistent caching. See [[#Persistent_cache_on_Weka|Persistent cache on Weka]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_mode&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt;&lt;br /&gt;
| VFS cache mode: &amp;lt;tt&amp;gt;off&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;minimal&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;writes&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt; caches entire files for read and write. Required for arbitrary file access patterns. &amp;lt;tt&amp;gt;off&amp;lt;/tt&amp;gt; reads directly from SDS@hd with no local cache.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;50G&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Maximum local cache size. rclone evicts least-recently-used files automatically when the limit is approached.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_age&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;24h&amp;lt;/tt&amp;gt;&lt;br /&gt;
| How long to keep cached files before eviction, even if &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt; is not hit. Set to at least your job&#039;s wall time when using Weka as &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;sftp_concurrency&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;16&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Parallel SFTP requests per connection. Higher values fill the TCP window more aggressively over the 5 ms WAN link. Reduce to &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt; for large job arrays (e.g. 100+ tasks) to avoid overloading the gateway.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;transfers&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Number of parallel background upload workers.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;buffer_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;128M&amp;lt;/tt&amp;gt;&lt;br /&gt;
| In-memory read/write buffer per file. 128M is well-matched to the Freiburg–Heidelberg RTT. Increase for very large sequential files.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;read_ahead&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;64M&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Sequential read prefetch window. Increase to &amp;lt;tt&amp;gt;512M&amp;lt;/tt&amp;gt; for large sequential reads.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;write_back&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;5s&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Delay between file close and upload start. With the default &amp;lt;tt&amp;gt;5s&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;close()&amp;lt;/tt&amp;gt; returns immediately and the upload runs in the background — your job continues while data transfers to SDS@hd. Setting this to &amp;lt;tt&amp;gt;0s&amp;lt;/tt&amp;gt; makes uploads synchronous: your job stalls at every file write for the full upload duration. You almost certainly do not want &amp;lt;tt&amp;gt;0s&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;dir_cache&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;5m&amp;lt;/tt&amp;gt;&lt;br /&gt;
| How long to cache directory listings. Use &amp;lt;tt&amp;gt;2h&amp;lt;/tt&amp;gt; for compute jobs (stable dataset), &amp;lt;tt&amp;gt;5m&amp;lt;/tt&amp;gt; for interactive use (picks up changes from other nodes quickly).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt;&lt;br /&gt;
| (empty)&lt;br /&gt;
| Extra rclone flags appended verbatim. Values are split on spaces — arguments containing internal spaces (e.g. bwlimit timetables) cannot be expressed here; use &amp;lt;tt&amp;gt;rclone.conf&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;mount-sdshd&amp;lt;/tt&amp;gt; command-line options instead.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
Expand for full &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt; example.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ~/.config/sdshd/config&lt;br /&gt;
&lt;br /&gt;
# Local VFS cache directory. Must be an absolute path.&lt;br /&gt;
# Leave empty to use /tmp/sdshd-&amp;lt;uid&amp;gt;/cache/ (node-local NVMe, cleaned on reboot).&lt;br /&gt;
# Use a Weka workspace path (ws_find &amp;lt;name&amp;gt;) for crash-safe output caching or&lt;br /&gt;
# for large datasets that exceed node NVMe capacity.&lt;br /&gt;
# A per-hostname subdirectory (rclone-&amp;lt;nodename&amp;gt;/) is always appended so that&lt;br /&gt;
# parallel jobs on different nodes each have their own independent cache.&lt;br /&gt;
cache_dir       =&lt;br /&gt;
&lt;br /&gt;
# VFS cache mode: off | minimal | writes | full (default: full)&lt;br /&gt;
# &#039;full&#039; caches entire files locally for read/write. Required for arbitrary&lt;br /&gt;
# file access patterns and write support. &#039;off&#039; reads directly from SDS@hd&lt;br /&gt;
# with no local cache.&lt;br /&gt;
cache_mode      = full&lt;br /&gt;
&lt;br /&gt;
# Maximum local cache size. rclone evicts LRU files automatically.&lt;br /&gt;
cache_size      = 50G&lt;br /&gt;
&lt;br /&gt;
# How long to keep cached files before eviction (even if cache_size not hit).&lt;br /&gt;
# Set &amp;gt;= max job wall time when using Weka as cache_dir (not cleaned on reboot).&lt;br /&gt;
cache_age       = 24h&lt;br /&gt;
&lt;br /&gt;
# Number of parallel SFTP requests per connection.&lt;br /&gt;
# Higher values fill the TCP window more aggressively over the 5 ms WAN link.&lt;br /&gt;
# For job arrays with many tasks, reduce to 8 to avoid overloading lsdf02-sshfs.&lt;br /&gt;
sftp_concurrency = 16&lt;br /&gt;
&lt;br /&gt;
# Number of parallel file transfer workers (background uploads).&lt;br /&gt;
transfers       = 8&lt;br /&gt;
&lt;br /&gt;
# In-memory read/write buffer per file. 128M fills the TCP window well at&lt;br /&gt;
# 5 ms RTT (Freiburg → Heidelberg). Increase for very large sequential files.&lt;br /&gt;
buffer_size     = 128M&lt;br /&gt;
&lt;br /&gt;
# Sequential read prefetch window. Increase to 512M for large sequential reads.&lt;br /&gt;
read_ahead      = 64M&lt;br /&gt;
&lt;br /&gt;
# Delay between file close and upload start.&lt;br /&gt;
# 5s (default): close() returns immediately; the upload runs asynchronously&lt;br /&gt;
# in the background. Your job continues while data is transferred to SDS@hd,&lt;br /&gt;
# and umount-sdshd (or the Slurm epilog) waits for all uploads to finish&lt;br /&gt;
# before disconnecting.&lt;br /&gt;
# 0s: upload runs synchronously inside close(), blocking your job for the&lt;br /&gt;
# entire upload duration of every file written. For large output files this&lt;br /&gt;
# means your job script stalls at each file write — you almost certainly&lt;br /&gt;
# do not want this.&lt;br /&gt;
# Note: value must be in seconds (e.g. 5s, 30s); other units are not supported.&lt;br /&gt;
write_back      = 5s&lt;br /&gt;
&lt;br /&gt;
# How long directory listings are cached. 2h for compute jobs (stable),&lt;br /&gt;
# 5m for interactive use (pick up changes from other login nodes quickly).&lt;br /&gt;
dir_cache       = 5m&lt;br /&gt;
&lt;br /&gt;
# Extra rclone flags appended verbatim after all other options.&lt;br /&gt;
# Command-line arguments (mount-sdshd only) still take final precedence.&lt;br /&gt;
#&lt;br /&gt;
# Values are split on spaces, so arguments that contain an internal space&lt;br /&gt;
# (e.g. bwlimit timetables like &amp;quot;08:00,100M 18:00,500M&amp;quot;) cannot be expressed&lt;br /&gt;
# here. Set those via rclone.conf or pass them directly on the command line&lt;br /&gt;
# with mount-sdshd instead.&lt;br /&gt;
#&lt;br /&gt;
# Useful examples:&lt;br /&gt;
#&lt;br /&gt;
#   Limit upload/download bandwidth (per rclone process, not per file).&lt;br /&gt;
#   Useful when running multiple jobs simultaneously or to be a good&lt;br /&gt;
#   neighbour on a shared gateway. Value: bytes/s suffix M/G, or &#039;off&#039;.&lt;br /&gt;
#   Per-direction: --bwlimit-file takes the same syntax.&lt;br /&gt;
#     extra_opts = --bwlimit 200M&lt;br /&gt;
#&lt;br /&gt;
#   Exclude patterns — keep temp/checkpoint files out of the VFS cache&lt;br /&gt;
#   so they don&#039;t consume cache space or trigger unnecessary uploads.&lt;br /&gt;
#   Do NOT use shell quotes here — they are passed literally to rclone,&lt;br /&gt;
#   not interpreted by the shell.  Write glob patterns unquoted:&lt;br /&gt;
#     extra_opts = --exclude *.tmp --exclude checkpoint_*.pt&lt;br /&gt;
#&lt;br /&gt;
#   Override SSH connection timeout (default 60s). Reduce if you want&lt;br /&gt;
#   faster failure detection on flaky connections:&lt;br /&gt;
#     extra_opts = --timeout 30s&lt;br /&gt;
extra_opts      =&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Available disk space by node type:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Node type&lt;br /&gt;
! Local disk&lt;br /&gt;
! Recommended max &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Login nodes&lt;br /&gt;
| ~400 GB&lt;br /&gt;
| 20–50 G (shared with other users)&lt;br /&gt;
|-&lt;br /&gt;
| Milan nodes&lt;br /&gt;
| ~1.9 TB&lt;br /&gt;
| 50 G (default)&lt;br /&gt;
|-&lt;br /&gt;
| Other nodes&lt;br /&gt;
| ~3.8 TB&lt;br /&gt;
| 50 G (default)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Useful &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt; examples:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Limit upload/download bandwidth (per rclone process).&lt;br /&gt;
# Useful when running many jobs simultaneously or to be a good neighbour.&lt;br /&gt;
extra_opts = --bwlimit 200M&lt;br /&gt;
&lt;br /&gt;
# Exclude temp and checkpoint files from the cache — saves cache space&lt;br /&gt;
# and avoids uploading files you don&#039;t need on SDS@hd.&lt;br /&gt;
# Do NOT use shell quotes here — write glob patterns unquoted.&lt;br /&gt;
extra_opts = --exclude *.tmp --exclude checkpoint_*.pt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persistent cache on Weka ==&lt;br /&gt;
&lt;br /&gt;
With the default &amp;lt;tt&amp;gt;/tmp&amp;lt;/tt&amp;gt; cache, data written to SDS@hd is first held locally on the node&#039;s NVMe. If the node crashes, reboots, or is killed (OOM, walltime) before the upload completes, the cached data is lost.&lt;br /&gt;
&lt;br /&gt;
A Weka workspace survives node failures. If a job is killed before uploads finish, the data is still in the cache — remount with the same &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt; to resume, or copy directly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Create a workspace and configure it as the cache directory:&lt;br /&gt;
ws_allocate mywsname 30&lt;br /&gt;
&lt;br /&gt;
# Edit ~/.config/sdshd/config, add:&lt;br /&gt;
cache_dir  = /path/from/ws_find&lt;br /&gt;
cache_size = 2T&lt;br /&gt;
cache_age  = 720h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;tt&amp;gt;/path/from/ws_find&amp;lt;/tt&amp;gt; with the output of &amp;lt;tt&amp;gt;ws_find mywsname&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After a failed job, recover the cached data:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# The cache subdirectory is named after the compute node hostname.&lt;br /&gt;
# Check: ls $(ws_find mywsname)/&lt;br /&gt;
rclone copy &amp;quot;$(ws_find mywsname)/rclone-&amp;amp;lt;compute-node-name&amp;amp;gt;/vfs/sdshd-sftp/&amp;quot; \&lt;br /&gt;
    sdshd-sftp:recovered/ --progress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When are cached files removed?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Trigger&lt;br /&gt;
! What happens&lt;br /&gt;
|-&lt;br /&gt;
| rclone running, &amp;lt;tt&amp;gt;cache_age&amp;lt;/tt&amp;gt; exceeded&lt;br /&gt;
| rclone evicts the file from cache (LRU)&lt;br /&gt;
|-&lt;br /&gt;
| rclone running, &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt; would be exceeded&lt;br /&gt;
| rclone evicts least-recently-used files&lt;br /&gt;
|-&lt;br /&gt;
| rclone not running (between mounts)&lt;br /&gt;
| nothing — files are not touched&lt;br /&gt;
|-&lt;br /&gt;
| Workspace expires (&amp;lt;tt&amp;gt;ws_extend&amp;lt;/tt&amp;gt; not run)&lt;br /&gt;
| restorable for 30 days, then auto-deleted permanently&lt;br /&gt;
|-&lt;br /&gt;
| Manual cleanup&lt;br /&gt;
| remove the &amp;lt;tt&amp;gt;rclone-*&amp;lt;/tt&amp;gt; subdirectory inside the workspace&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See [[Workspaces]] for workspace management commands.&lt;br /&gt;
&lt;br /&gt;
The same Weka &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt; also benefits read-heavy jobs such as ML training or multi-epoch analysis: rclone downloads each input file on first access and serves all subsequent reads from Weka without any WAN traffic. Note that the cache is per-node — each node in a job array downloads its own copy independently. For job arrays where all tasks need the same files, use &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; to pre-stage once instead — see [[#Shared_dataset_across_many_jobs|Shared dataset across many jobs]].&lt;br /&gt;
&lt;br /&gt;
= Advanced Usage =&lt;br /&gt;
&lt;br /&gt;
== Read-only access ==&lt;br /&gt;
&lt;br /&gt;
For browsing or spot reads without writing — bypasses the local cache entirely, every read goes directly to SDS@hd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd --vfs-cache-mode off --read-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;&#039;repeated reads of the same files&#039;&#039;&#039; (e.g. checking a large dataset), use the default cache with &amp;lt;tt&amp;gt;--read-only&amp;lt;/tt&amp;gt;. The VFS cache still operates — files are downloaded once on first access and served from local disk on all subsequent reads:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd --read-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Shared dataset across many jobs ==&lt;br /&gt;
&lt;br /&gt;
If many job array tasks need to read the same files, rclone VFS cannot share a cache — concurrent mounts against the same cache directory will corrupt it, even with &amp;lt;tt&amp;gt;--read-only&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The solution: copy the dataset once to a Weka workspace, then have all jobs read from the Weka path directly as a plain filesystem — no FUSE mount, no per-job downloads:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Step 1 (once, on login node): copy dataset from SDS@hd to Weka&lt;br /&gt;
ws_allocate mydata 30&lt;br /&gt;
rclone copy sdshd-sftp:inputdata/ $(ws_find mydata)/inputdata/ \&lt;br /&gt;
    --progress --transfers 8 --sftp-concurrency 8 --sftp-chunk-size 255k&lt;br /&gt;
&lt;br /&gt;
# Step 2: reference the Weka path in your job script (no --gres=sdshd needed)&lt;br /&gt;
INPUT_DIR=$(ws_find mydata)/inputdata&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--sftp-chunk-size 255k&amp;lt;/tt&amp;gt; increases the SFTP packet size from 32 KB (default) to 255 KB (OpenSSH&#039;s maximum), which reduces protocol overhead and significantly improves throughput for large files. Use this flag with explicit &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; commands — it has no effect on the FUSE mount and should not be placed in &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
All tasks read from Weka at full speed with zero WAN traffic and zero gateway load. Re-run &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; if the source data changes — it skips unchanged files.&lt;br /&gt;
&lt;br /&gt;
= Known Limitations =&lt;br /&gt;
&lt;br /&gt;
== Symlinks are not preserved ==&lt;br /&gt;
&lt;br /&gt;
rclone&#039;s SFTP backend does not store symlinks on the remote. When rclone uploads a symlink (through the FUSE mount or via &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt;), it follows the link and uploads the target&#039;s content as a regular file. The symlink itself is lost.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Situation&lt;br /&gt;
! What happens&lt;br /&gt;
|-&lt;br /&gt;
| Symlink to a regular file&lt;br /&gt;
| Target file is uploaded; symlink metadata is lost&lt;br /&gt;
|-&lt;br /&gt;
| Symlink to a directory&lt;br /&gt;
| Directory tree is traversed; contents are uploaded recursively&lt;br /&gt;
|-&lt;br /&gt;
| Dangling symlink (target missing)&lt;br /&gt;
| Transfer error or silently skipped&lt;br /&gt;
|-&lt;br /&gt;
| Restore from SDS@hd&lt;br /&gt;
| Regular files/directories — original symlinks are gone&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Workarounds:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Archive before upload:&#039;&#039;&#039; &amp;lt;tt&amp;gt;tar -czf env.tar.gz myenv/&amp;lt;/tt&amp;gt; — preserves all symlinks inside the archive. Unpack after download to restore the original structure.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;rclone copy --links&amp;lt;/tt&amp;gt;:&#039;&#039;&#039; encodes symlinks as &amp;lt;tt&amp;gt;.rclonelink&amp;lt;/tt&amp;gt; text files on the remote. Only works for &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;rclone sync&amp;lt;/tt&amp;gt; workflows (not the FUSE VFS mount). Requires &amp;lt;tt&amp;gt;--links&amp;lt;/tt&amp;gt; on both the copy and the restore.&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;tt&amp;gt;SSH_FX_FAILURE&amp;lt;/tt&amp;gt; during upload ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Most common cause: storage quota exhausted.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SDS@hd enforces a hard quota per project. When full, the server rejects all writes. Check your quota first:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone about sdshd-sftp:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the quota is full, delete or archive old data on SDS@hd before retrying.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary cause: gateway overload from large job arrays.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
100 tasks × 16 SFTP connections = 1600 simultaneous connections to &amp;lt;tt&amp;gt;lsdf02-sshfs&amp;lt;/tt&amp;gt;. The gateway may reject new connections under this load. Reduce &amp;lt;tt&amp;gt;sftp_concurrency&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt;, or bypass the FUSE mount entirely for bulk transfers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone copy /local/results/ sdshd-sftp:results/ \&lt;br /&gt;
    --transfers 4 --sftp-concurrency 8 --sftp-chunk-size 255k --progress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the default &amp;lt;tt&amp;gt;/tmp&amp;lt;/tt&amp;gt; cache, resuming requires submitting a new job to the exact same compute node — not generally practical — and the cache is gone after a node reboot regardless. With a Weka workspace as &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;, the cache survives both job end and node reboots; the key advantage is that you can copy the data out manually without needing a job on that node at all, as described in [[#Persistent_cache_on_Weka|Persistent cache on Weka]].&lt;br /&gt;
&lt;br /&gt;
== Job stuck in &amp;lt;tt&amp;gt;CG&amp;lt;/tt&amp;gt; (COMPLETING) for a long time ==&lt;br /&gt;
&lt;br /&gt;
The Slurm epilog waits for rclone to finish uploading all pending data. For large output files this can take minutes — this is expected and safe. The job will exit on its own once all uploads are confirmed complete. There is nothing to do.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/SDS_hd&amp;diff=16005</id>
		<title>NEMO2/SDS hd</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/SDS_hd&amp;diff=16005"/>
		<updated>2026-04-22T15:55:22Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;WARNING! This feature is currently for testing purposes only!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDS@hd&#039;&#039;&#039; is the scientific storage service of Heidelberg University. On NEMO2, you can mount your SDS@hd project directly into your jobs or interactive sessions via rclone. Data is cached locally on the node&#039;s NVMe drive and uploaded to SDS@hd in the background.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #28a745; padding: 15px; background-color: #d4edda; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What you need to do:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[#Initial_Setup_.28Required.29|Initial Setup]]&#039;&#039;&#039; — one-time configuration, takes about 5 minutes. &#039;&#039;&#039;You must complete this before using SDS@hd on NEMO2.&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[#Advanced_Configuration|Advanced Configuration]]&#039;&#039;&#039; — optional. Tune cache size, bandwidth limits, and more. Skip this on your first use.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Initial Setup (Required) =&lt;br /&gt;
&lt;br /&gt;
Complete these four steps once. After that, SDS@hd is available in all your jobs and interactive sessions without any further configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prerequisites:&#039;&#039;&#039;&lt;br /&gt;
* Your bwIDM username and SDS@hd password&lt;br /&gt;
* Your SDS@hd project ID (e.g. &amp;lt;tt&amp;gt;sd14a001&amp;lt;/tt&amp;gt;, find it at [[SDS@hd/Access]])&lt;br /&gt;
&lt;br /&gt;
== Step 1: Create the rclone configuration file ==&lt;br /&gt;
&lt;br /&gt;
Run this command to create the config file with the correct permissions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone config touch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates &amp;lt;tt&amp;gt;~/.config/rclone/rclone.conf&amp;lt;/tt&amp;gt; with mode 600. Now open the file in an editor and add the following two sections, replacing the placeholder values with your own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[sdshd-backend]&lt;br /&gt;
type = sftp&lt;br /&gt;
host = lsdf02-sshfs.urz.uni-heidelberg.de&lt;br /&gt;
user = YOUR_BWIDM_USERNAME&lt;br /&gt;
pass = PASTE_OBSCURED_PASSWORD_HERE&lt;br /&gt;
md5sum_command = none&lt;br /&gt;
sha1sum_command = none&lt;br /&gt;
shell_type = unix&lt;br /&gt;
set_modtime = false&lt;br /&gt;
idle_timeout = 0&lt;br /&gt;
&lt;br /&gt;
[sdshd-sftp]&lt;br /&gt;
type = alias&lt;br /&gt;
remote = sdshd-backend:YOUR_PROJECT_ID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace:&lt;br /&gt;
* &amp;lt;tt&amp;gt;YOUR_BWIDM_USERNAME&amp;lt;/tt&amp;gt; — your bwIDM login name (same as on NEMO2)&lt;br /&gt;
* &amp;lt;tt&amp;gt;YOUR_PROJECT_ID&amp;lt;/tt&amp;gt; — your SDS@hd project ID, e.g. &amp;lt;tt&amp;gt;sd14a001&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;PASTE_OBSCURED_PASSWORD_HERE&amp;lt;/tt&amp;gt; — leave this for now, you will fill it in Step 2&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; section name must not be changed&#039;&#039;&#039; — all NEMO2 scripts mount &amp;lt;tt&amp;gt;sdshd-sftp:&amp;lt;/tt&amp;gt; by name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #17a2b8; padding: 15px; background-color: #d1ecf1; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What the path in &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; controls:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The path after the colon in &amp;lt;tt&amp;gt;remote = sdshd-backend:YOUR_PROJECT_ID&amp;lt;/tt&amp;gt; becomes the root of your mount at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt;. If you set it correctly, your project files appear directly under &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you leave the path empty (&amp;lt;tt&amp;gt;remote = sdshd-backend:&amp;lt;/tt&amp;gt;), the mount shows the SFTP server&#039;s home directory. Your project then appears as a &#039;&#039;subdirectory&#039;&#039; at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/YOUR_PROJECT_ID/&amp;lt;/tt&amp;gt;. Job scripts that reference &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/&amp;lt;/tt&amp;gt; directly will not find your data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception:&#039;&#039;&#039; If you are a member of multiple projects, you may intentionally omit the project ID so all projects appear as subdirectories. In that case, adjust your job scripts to include the project ID in the path.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 2: Set the password ==&lt;br /&gt;
&lt;br /&gt;
rclone does not store passwords in plain text — it stores an obscured form. Generate the obscured password with the following command. It reads your password without echoing it to the terminal and is never written to your shell history:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf &#039;SDS@hd password:\n&#039;; read -s p &amp;amp;&amp;amp; printf &#039;%s&#039; &amp;quot;$p&amp;quot; | rclone obscure -; echo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Type your SDS@hd password and press Enter. The command prints a string like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QKkf-abc123XYZetc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy that string and paste it as the &amp;lt;tt&amp;gt;pass =&amp;lt;/tt&amp;gt; value in &amp;lt;tt&amp;gt;~/.config/rclone/rclone.conf&amp;lt;/tt&amp;gt;, replacing &amp;lt;tt&amp;gt;PASTE_OBSCURED_PASSWORD_HERE&amp;lt;/tt&amp;gt;. Then clear the variable from memory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unset p        # bash / zsh&lt;br /&gt;
# set -e p    # fish&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Do not use &amp;lt;tt&amp;gt;echo &amp;quot;mypassword&amp;quot; | rclone obscure -&amp;lt;/tt&amp;gt;&#039;&#039;&#039; — the password would appear in your shell history and in &amp;lt;tt&amp;gt;ps&amp;lt;/tt&amp;gt; output. The &amp;lt;tt&amp;gt;read -s&amp;lt;/tt&amp;gt; method above avoids both.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3: Protect the config file ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;rclone config touch&amp;lt;/tt&amp;gt; already creates the file with mode 600. If you created it manually or are unsure, set the permissions explicitly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 600 ~/.config/rclone/rclone.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4: Verify the connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone ls sdshd-sftp:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expected output: a list of files and directories in your project. An empty listing (no output, no error) is also fine — it means the project exists but is empty.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Error message&lt;br /&gt;
! Likely cause&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;SSH authentication failed&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Wrong username or password&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;no such file or directory&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Project ID in &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; is wrong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;connection refused&amp;lt;/tt&amp;gt; / timeout&lt;br /&gt;
| Network issue or wrong hostname&lt;br /&gt;
|-&lt;br /&gt;
| Empty listing (no error)&lt;br /&gt;
| Project exists but is empty — that is fine&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setup complete.&#039;&#039;&#039; See [[#Basic_Usage|Basic Usage]] to start using SDS@hd.&lt;br /&gt;
&lt;br /&gt;
= Basic Usage =&lt;br /&gt;
&lt;br /&gt;
== Interactive sessions on login nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd            # mount at /mnt/sdshd/$USER&lt;br /&gt;
umount-sdshd           # unmount and wait for all uploads to finish&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The mount point &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt; is created automatically when you log in, via a PAM hook. No manual admin step is needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Always use &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; to disconnect — never &amp;lt;tt&amp;gt;fusermount -u&amp;lt;/tt&amp;gt; directly.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;fusermount -u&amp;lt;/tt&amp;gt; terminates rclone immediately, cutting off any uploads in progress and causing data loss. &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; waits until rclone confirms that all uploads are complete before sending the shutdown signal.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;tt&amp;gt;mount-sdshd --help&amp;lt;/tt&amp;gt; for all options and examples.&lt;br /&gt;
&lt;br /&gt;
== Slurm jobs ==&lt;br /&gt;
&lt;br /&gt;
Add the &amp;lt;tt&amp;gt;--gres=sdshd&amp;lt;/tt&amp;gt; flag to your job script. The Slurm prolog mounts SDS@hd automatically at job start; the epilog waits for all uploads to complete before the job finishes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#SBATCH --gres=sdshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your data is available at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt; inside the job, with no further commands needed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The job shows &amp;lt;tt&amp;gt;CG&amp;lt;/tt&amp;gt; (COMPLETING) in &amp;lt;tt&amp;gt;squeue&amp;lt;/tt&amp;gt; during the upload phase.&#039;&#039;&#039; For large output files this can take minutes — this is expected and safe. The job will not exit until all data has been confirmed uploaded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you need data on SDS@hd before the job finishes&#039;&#039;&#039; (e.g. for a multi-step pipeline where the next job reads this job&#039;s output), call &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; explicitly at the end of your job script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --gres=sdshd&lt;br /&gt;
&lt;br /&gt;
# ... your computation ...&lt;br /&gt;
&lt;br /&gt;
umount-sdshd    # blocks here until all uploads are done, then the job exits&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Advanced Configuration =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 15px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This section is optional.&#039;&#039;&#039; The built-in defaults work well for most jobs. Come back here if you need to:&lt;br /&gt;
* limit cache size or bandwidth&lt;br /&gt;
* use a persistent (crash-safe) cache on Weka&lt;br /&gt;
* tune performance for ML training or large job arrays&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Per-user configuration file ==&lt;br /&gt;
&lt;br /&gt;
Create &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt; to override the built-in defaults for all your jobs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p ~/.config/sdshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The format is &amp;lt;tt&amp;gt;key = value&amp;lt;/tt&amp;gt;, one per line. Lines starting with &amp;lt;tt&amp;gt;#&amp;lt;/tt&amp;gt; are comments. The file is parsed without being executed — invalid or unknown keys are silently ignored.&lt;br /&gt;
&lt;br /&gt;
=== Configuration keys ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;/tmp/sdshd-&amp;lt;uid&amp;gt;/cache/&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Local VFS cache directory. Node-local NVMe by default (cleaned on reboot). Set to a Weka workspace path for crash-safe persistent caching. See [[#Persistent_cache_on_Weka|Persistent cache on Weka]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_mode&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt;&lt;br /&gt;
| VFS cache mode: &amp;lt;tt&amp;gt;off&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;minimal&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;writes&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt; caches entire files for read and write. Required for arbitrary file access patterns. &amp;lt;tt&amp;gt;off&amp;lt;/tt&amp;gt; reads directly from SDS@hd with no local cache.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;50G&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Maximum local cache size. rclone evicts least-recently-used files automatically when the limit is approached.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_age&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;24h&amp;lt;/tt&amp;gt;&lt;br /&gt;
| How long to keep cached files before eviction, even if &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt; is not hit. Set to at least your job&#039;s wall time when using Weka as &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;sftp_concurrency&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;16&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Parallel SFTP requests per connection. Higher values fill the TCP window more aggressively over the 5 ms WAN link. Reduce to &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt; for large job arrays (e.g. 100+ tasks) to avoid overloading the gateway.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;transfers&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Number of parallel background upload workers.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;buffer_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;128M&amp;lt;/tt&amp;gt;&lt;br /&gt;
| In-memory read/write buffer per file. 128M is well-matched to the Freiburg–Heidelberg RTT. Increase for very large sequential files.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;read_ahead&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;64M&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Sequential read prefetch window. Increase to &amp;lt;tt&amp;gt;512M&amp;lt;/tt&amp;gt; for large sequential reads.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;write_back&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;5s&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Delay between file close and upload start. With the default &amp;lt;tt&amp;gt;5s&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;close()&amp;lt;/tt&amp;gt; returns immediately and the upload runs in the background — your job continues while data transfers to SDS@hd. Setting this to &amp;lt;tt&amp;gt;0s&amp;lt;/tt&amp;gt; makes uploads synchronous: your job stalls at every file write for the full upload duration. You almost certainly do not want &amp;lt;tt&amp;gt;0s&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;dir_cache&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;5m&amp;lt;/tt&amp;gt;&lt;br /&gt;
| How long to cache directory listings. Use &amp;lt;tt&amp;gt;2h&amp;lt;/tt&amp;gt; for compute jobs (stable dataset), &amp;lt;tt&amp;gt;5m&amp;lt;/tt&amp;gt; for interactive use (picks up changes from other nodes quickly).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt;&lt;br /&gt;
| (empty)&lt;br /&gt;
| Extra rclone flags appended verbatim. Values are split on spaces — arguments containing internal spaces (e.g. bwlimit timetables) cannot be expressed here; use &amp;lt;tt&amp;gt;rclone.conf&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;mount-sdshd&amp;lt;/tt&amp;gt; command-line options instead.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
Expand for full &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt; example.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ~/.config/sdshd/config&lt;br /&gt;
&lt;br /&gt;
# Local VFS cache directory. Must be an absolute path.&lt;br /&gt;
# Leave empty to use /tmp/sdshd-&amp;lt;uid&amp;gt;/cache/ (node-local NVMe, cleaned on reboot).&lt;br /&gt;
# Use a Weka workspace path (ws_find &amp;lt;name&amp;gt;) for crash-safe output caching or&lt;br /&gt;
# for large datasets that exceed node NVMe capacity.&lt;br /&gt;
# A per-hostname subdirectory (rclone-&amp;lt;nodename&amp;gt;/) is always appended so that&lt;br /&gt;
# parallel jobs on different nodes each have their own independent cache.&lt;br /&gt;
cache_dir       =&lt;br /&gt;
&lt;br /&gt;
# VFS cache mode: off | minimal | writes | full (default: full)&lt;br /&gt;
# &#039;full&#039; caches entire files locally for read/write. Required for arbitrary&lt;br /&gt;
# file access patterns and write support. &#039;off&#039; reads directly from SDS@hd&lt;br /&gt;
# with no local cache.&lt;br /&gt;
cache_mode      = full&lt;br /&gt;
&lt;br /&gt;
# Maximum local cache size. rclone evicts LRU files automatically.&lt;br /&gt;
cache_size      = 50G&lt;br /&gt;
&lt;br /&gt;
# How long to keep cached files before eviction (even if cache_size not hit).&lt;br /&gt;
# Set &amp;gt;= max job wall time when using Weka as cache_dir (not cleaned on reboot).&lt;br /&gt;
cache_age       = 24h&lt;br /&gt;
&lt;br /&gt;
# Number of parallel SFTP requests per connection.&lt;br /&gt;
# Higher values fill the TCP window more aggressively over the 5 ms WAN link.&lt;br /&gt;
# For job arrays with many tasks, reduce to 8 to avoid overloading lsdf02-sshfs.&lt;br /&gt;
sftp_concurrency = 16&lt;br /&gt;
&lt;br /&gt;
# Number of parallel file transfer workers (background uploads).&lt;br /&gt;
transfers       = 8&lt;br /&gt;
&lt;br /&gt;
# In-memory read/write buffer per file. 128M fills the TCP window well at&lt;br /&gt;
# 5 ms RTT (Freiburg → Heidelberg). Increase for very large sequential files.&lt;br /&gt;
buffer_size     = 128M&lt;br /&gt;
&lt;br /&gt;
# Sequential read prefetch window. Increase to 512M for large sequential reads.&lt;br /&gt;
read_ahead      = 64M&lt;br /&gt;
&lt;br /&gt;
# Delay between file close and upload start.&lt;br /&gt;
# 5s (default): close() returns immediately; the upload runs asynchronously&lt;br /&gt;
# in the background. Your job continues while data is transferred to SDS@hd,&lt;br /&gt;
# and umount-sdshd (or the Slurm epilog) waits for all uploads to finish&lt;br /&gt;
# before disconnecting.&lt;br /&gt;
# 0s: upload runs synchronously inside close(), blocking your job for the&lt;br /&gt;
# entire upload duration of every file written. For large output files this&lt;br /&gt;
# means your job script stalls at each file write — you almost certainly&lt;br /&gt;
# do not want this.&lt;br /&gt;
write_back      = 5s&lt;br /&gt;
&lt;br /&gt;
# How long directory listings are cached. 2h for compute jobs (stable),&lt;br /&gt;
# 5m for interactive use (pick up changes from other login nodes quickly).&lt;br /&gt;
dir_cache       = 5m&lt;br /&gt;
&lt;br /&gt;
# Extra rclone flags appended verbatim after all other options.&lt;br /&gt;
# Command-line arguments (mount-sdshd only) still take final precedence.&lt;br /&gt;
#&lt;br /&gt;
# Values are split on spaces, so arguments that contain an internal space&lt;br /&gt;
# (e.g. bwlimit timetables like &amp;quot;08:00,100M 18:00,500M&amp;quot;) cannot be expressed&lt;br /&gt;
# here. Set those via rclone.conf or pass them directly on the command line&lt;br /&gt;
# with mount-sdshd instead.&lt;br /&gt;
#&lt;br /&gt;
# Useful examples:&lt;br /&gt;
#&lt;br /&gt;
#   Limit upload/download bandwidth (per rclone process, not per file).&lt;br /&gt;
#   Useful when running multiple jobs simultaneously or to be a good&lt;br /&gt;
#   neighbour on a shared gateway. Value: bytes/s suffix M/G, or &#039;off&#039;.&lt;br /&gt;
#   Per-direction: --bwlimit-file takes the same syntax.&lt;br /&gt;
#     extra_opts = --bwlimit 200M&lt;br /&gt;
#&lt;br /&gt;
#   Exclude patterns — keep temp/checkpoint files out of the VFS cache&lt;br /&gt;
#   so they don&#039;t consume cache space or trigger unnecessary uploads.&lt;br /&gt;
#   Do NOT use shell quotes here — they are passed literally to rclone,&lt;br /&gt;
#   not interpreted by the shell.  Write glob patterns unquoted:&lt;br /&gt;
#     extra_opts = --exclude *.tmp --exclude checkpoint_*.pt&lt;br /&gt;
#&lt;br /&gt;
#   Override SSH connection timeout (default 60s). Reduce if you want&lt;br /&gt;
#   faster failure detection on flaky connections:&lt;br /&gt;
#     extra_opts = --timeout 30s&lt;br /&gt;
extra_opts      =&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Available disk space by node type:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Node type&lt;br /&gt;
! Local disk&lt;br /&gt;
! Recommended max &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Login nodes&lt;br /&gt;
| ~400 GB&lt;br /&gt;
| 20–50 G (shared with other users)&lt;br /&gt;
|-&lt;br /&gt;
| Milan nodes&lt;br /&gt;
| ~1.9 TB&lt;br /&gt;
| 50 G (default)&lt;br /&gt;
|-&lt;br /&gt;
| Other nodes&lt;br /&gt;
| ~3.8 TB&lt;br /&gt;
| 50 G (default)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Useful &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt; examples:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Limit upload/download bandwidth (per rclone process).&lt;br /&gt;
# Useful when running many jobs simultaneously or to be a good neighbour.&lt;br /&gt;
extra_opts = --bwlimit 200M&lt;br /&gt;
&lt;br /&gt;
# Exclude temp and checkpoint files from the cache — saves cache space&lt;br /&gt;
# and avoids uploading files you don&#039;t need on SDS@hd.&lt;br /&gt;
# Do NOT use shell quotes here — write glob patterns unquoted.&lt;br /&gt;
extra_opts = --exclude *.tmp --exclude checkpoint_*.pt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persistent cache on Weka ==&lt;br /&gt;
&lt;br /&gt;
With the default &amp;lt;tt&amp;gt;/tmp&amp;lt;/tt&amp;gt; cache, data written to SDS@hd is first held locally on the node&#039;s NVMe. If the node crashes, reboots, or is killed (OOM, walltime) before the upload completes, the cached data is lost.&lt;br /&gt;
&lt;br /&gt;
A Weka workspace survives node failures. If a job is killed before uploads finish, the data is still in the cache — remount with the same &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt; to resume, or copy directly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Create a workspace and configure it as the cache directory:&lt;br /&gt;
ws_allocate mywsname 30&lt;br /&gt;
&lt;br /&gt;
# Edit ~/.config/sdshd/config, add:&lt;br /&gt;
cache_dir  = /path/from/ws_find&lt;br /&gt;
cache_size = 2T&lt;br /&gt;
cache_age  = 720h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;tt&amp;gt;/path/from/ws_find&amp;lt;/tt&amp;gt; with the output of &amp;lt;tt&amp;gt;ws_find mywsname&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After a failed job, recover the cached data:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# The cache subdirectory is named after the compute node hostname.&lt;br /&gt;
# Check: ls $(ws_find mywsname)/&lt;br /&gt;
rclone copy &amp;quot;$(ws_find mywsname)/rclone-&amp;amp;lt;compute-node-name&amp;amp;gt;/vfs/sdshd-sftp/&amp;quot; \&lt;br /&gt;
    sdshd-sftp:recovered/ --progress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When are cached files removed?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Trigger&lt;br /&gt;
! What happens&lt;br /&gt;
|-&lt;br /&gt;
| rclone running, &amp;lt;tt&amp;gt;cache_age&amp;lt;/tt&amp;gt; exceeded&lt;br /&gt;
| rclone evicts the file from cache (LRU)&lt;br /&gt;
|-&lt;br /&gt;
| rclone running, &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt; would be exceeded&lt;br /&gt;
| rclone evicts least-recently-used files&lt;br /&gt;
|-&lt;br /&gt;
| rclone not running (between mounts)&lt;br /&gt;
| nothing — files are not touched&lt;br /&gt;
|-&lt;br /&gt;
| Workspace expires (&amp;lt;tt&amp;gt;ws_extend&amp;lt;/tt&amp;gt; not run)&lt;br /&gt;
| restorable for 30 days, then auto-deleted permanently&lt;br /&gt;
|-&lt;br /&gt;
| Manual cleanup&lt;br /&gt;
| remove the &amp;lt;tt&amp;gt;rclone-*&amp;lt;/tt&amp;gt; subdirectory inside the workspace&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See [[Workspaces]] for workspace management commands.&lt;br /&gt;
&lt;br /&gt;
The same Weka &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt; also benefits read-heavy jobs such as ML training or multi-epoch analysis: rclone downloads each input file on first access and serves all subsequent reads from Weka without any WAN traffic. Note that the cache is per-node — each node in a job array downloads its own copy independently. For job arrays where all tasks need the same files, use &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; to pre-stage once instead — see [[#Shared_dataset_across_many_jobs|Shared dataset across many jobs]].&lt;br /&gt;
&lt;br /&gt;
= Advanced Usage =&lt;br /&gt;
&lt;br /&gt;
== Read-only access ==&lt;br /&gt;
&lt;br /&gt;
For browsing or spot reads without writing — bypasses the local cache entirely, every read goes directly to SDS@hd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd --vfs-cache-mode off --read-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;&#039;repeated reads of the same files&#039;&#039;&#039; (e.g. checking a large dataset), use the default cache with &amp;lt;tt&amp;gt;--read-only&amp;lt;/tt&amp;gt;. The VFS cache still operates — files are downloaded once on first access and served from local disk on all subsequent reads:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd --read-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Shared dataset across many jobs ==&lt;br /&gt;
&lt;br /&gt;
If many job array tasks need to read the same files, rclone VFS cannot share a cache — concurrent mounts against the same cache directory will corrupt it, even with &amp;lt;tt&amp;gt;--read-only&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The solution: copy the dataset once to a Weka workspace, then have all jobs read from the Weka path directly as a plain filesystem — no FUSE mount, no per-job downloads:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Step 1 (once, on login node): copy dataset from SDS@hd to Weka&lt;br /&gt;
ws_allocate mydata 30&lt;br /&gt;
rclone copy sdshd-sftp:inputdata/ $(ws_find mydata)/inputdata/ \&lt;br /&gt;
    --progress --transfers 8 --sftp-concurrency 8 --sftp-chunk-size 255k&lt;br /&gt;
&lt;br /&gt;
# Step 2: reference the Weka path in your job script (no --gres=sdshd needed)&lt;br /&gt;
INPUT_DIR=$(ws_find mydata)/inputdata&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--sftp-chunk-size 255k&amp;lt;/tt&amp;gt; increases the SFTP packet size from 32 KB (default) to 255 KB (OpenSSH&#039;s maximum), which reduces protocol overhead and significantly improves throughput for large files. Use this flag with explicit &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; commands — it has no effect on the FUSE mount and should not be placed in &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
All tasks read from Weka at full speed with zero WAN traffic and zero gateway load. Re-run &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; if the source data changes — it skips unchanged files.&lt;br /&gt;
&lt;br /&gt;
= Known Limitations =&lt;br /&gt;
&lt;br /&gt;
== Symlinks are not preserved ==&lt;br /&gt;
&lt;br /&gt;
rclone&#039;s SFTP backend does not store symlinks on the remote. When rclone uploads a symlink (through the FUSE mount or via &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt;), it follows the link and uploads the target&#039;s content as a regular file. The symlink itself is lost.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Situation&lt;br /&gt;
! What happens&lt;br /&gt;
|-&lt;br /&gt;
| Symlink to a regular file&lt;br /&gt;
| Target file is uploaded; symlink metadata is lost&lt;br /&gt;
|-&lt;br /&gt;
| Symlink to a directory&lt;br /&gt;
| Directory tree is traversed; contents are uploaded recursively&lt;br /&gt;
|-&lt;br /&gt;
| Dangling symlink (target missing)&lt;br /&gt;
| Transfer error or silently skipped&lt;br /&gt;
|-&lt;br /&gt;
| Restore from SDS@hd&lt;br /&gt;
| Regular files/directories — original symlinks are gone&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Workarounds:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Archive before upload:&#039;&#039;&#039; &amp;lt;tt&amp;gt;tar -czf env.tar.gz myenv/&amp;lt;/tt&amp;gt; — preserves all symlinks inside the archive. Unpack after download to restore the original structure.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;rclone copy --links&amp;lt;/tt&amp;gt;:&#039;&#039;&#039; encodes symlinks as &amp;lt;tt&amp;gt;.rclonelink&amp;lt;/tt&amp;gt; text files on the remote. Only works for &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;rclone sync&amp;lt;/tt&amp;gt; workflows (not the FUSE VFS mount). Requires &amp;lt;tt&amp;gt;--links&amp;lt;/tt&amp;gt; on both the copy and the restore.&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;tt&amp;gt;SSH_FX_FAILURE&amp;lt;/tt&amp;gt; during upload ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Most common cause: storage quota exhausted.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SDS@hd enforces a hard quota per project. When full, the server rejects all writes. Check your quota first:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone about sdshd-sftp:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the quota is full, delete or archive old data on SDS@hd before retrying.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary cause: gateway overload from large job arrays.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
100 tasks × 16 SFTP connections = 1600 simultaneous connections to &amp;lt;tt&amp;gt;lsdf02-sshfs&amp;lt;/tt&amp;gt;. The gateway may reject new connections under this load. Reduce &amp;lt;tt&amp;gt;sftp_concurrency&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt;, or bypass the FUSE mount entirely for bulk transfers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone copy /local/results/ sdshd-sftp:results/ \&lt;br /&gt;
    --transfers 4 --sftp-concurrency 8 --sftp-chunk-size 255k --progress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the default &amp;lt;tt&amp;gt;/tmp&amp;lt;/tt&amp;gt; cache, resuming requires submitting a new job to the exact same compute node — not generally practical — and the cache is gone after a node reboot regardless. With a Weka workspace as &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;, the cache survives both job end and node reboots; the key advantage is that you can copy the data out manually without needing a job on that node at all, as described in [[#Persistent_cache_on_Weka|Persistent cache on Weka]].&lt;br /&gt;
&lt;br /&gt;
== Job stuck in &amp;lt;tt&amp;gt;CG&amp;lt;/tt&amp;gt; (COMPLETING) for a long time ==&lt;br /&gt;
&lt;br /&gt;
The Slurm epilog waits for rclone to finish uploading all pending data. For large output files this can take minutes — this is expected and safe. The job will exit on its own once all uploads are confirmed complete. There is nothing to do.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/SDS_hd&amp;diff=16004</id>
		<title>NEMO2/SDS hd</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/SDS_hd&amp;diff=16004"/>
		<updated>2026-04-22T15:54:24Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Persistent cache on Weka */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;WARNING! This feature is currently for testing purposes only!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDS@hd&#039;&#039;&#039; is the scientific storage service of Heidelberg University. On NEMO2, you can mount your SDS@hd project directly into your jobs or interactive sessions via rclone. Data is cached locally on the node&#039;s NVMe drive and uploaded to SDS@hd in the background.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #28a745; padding: 15px; background-color: #d4edda; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What you need to do:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[#Initial_Setup_.28Required.29|Initial Setup]]&#039;&#039;&#039; — one-time configuration, takes about 5 minutes. &#039;&#039;&#039;You must complete this before using SDS@hd on NEMO2.&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[#Advanced_Configuration|Advanced Configuration]]&#039;&#039;&#039; — optional. Tune cache size, bandwidth limits, and more. Skip this on your first use.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Initial Setup (Required) =&lt;br /&gt;
&lt;br /&gt;
Complete these four steps once. After that, SDS@hd is available in all your jobs and interactive sessions without any further configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prerequisites:&#039;&#039;&#039;&lt;br /&gt;
* Your bwIDM username and SDS@hd password&lt;br /&gt;
* Your SDS@hd project ID (e.g. &amp;lt;tt&amp;gt;sd14a001&amp;lt;/tt&amp;gt;, find it at [[SDS@hd/Access]])&lt;br /&gt;
&lt;br /&gt;
== Step 1: Create the rclone configuration file ==&lt;br /&gt;
&lt;br /&gt;
Run this command to create the config file with the correct permissions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone config touch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates &amp;lt;tt&amp;gt;~/.config/rclone/rclone.conf&amp;lt;/tt&amp;gt; with mode 600. Now open the file in an editor and add the following two sections, replacing the placeholder values with your own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[sdshd-backend]&lt;br /&gt;
type = sftp&lt;br /&gt;
host = lsdf02-sshfs.urz.uni-heidelberg.de&lt;br /&gt;
user = YOUR_BWIDM_USERNAME&lt;br /&gt;
pass = PASTE_OBSCURED_PASSWORD_HERE&lt;br /&gt;
md5sum_command = none&lt;br /&gt;
sha1sum_command = none&lt;br /&gt;
shell_type = unix&lt;br /&gt;
set_modtime = false&lt;br /&gt;
idle_timeout = 0&lt;br /&gt;
&lt;br /&gt;
[sdshd-sftp]&lt;br /&gt;
type = alias&lt;br /&gt;
remote = sdshd-backend:YOUR_PROJECT_ID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace:&lt;br /&gt;
* &amp;lt;tt&amp;gt;YOUR_BWIDM_USERNAME&amp;lt;/tt&amp;gt; — your bwIDM login name (same as on NEMO2)&lt;br /&gt;
* &amp;lt;tt&amp;gt;YOUR_PROJECT_ID&amp;lt;/tt&amp;gt; — your SDS@hd project ID, e.g. &amp;lt;tt&amp;gt;sd14a001&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;PASTE_OBSCURED_PASSWORD_HERE&amp;lt;/tt&amp;gt; — leave this for now, you will fill it in Step 2&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; section name must not be changed&#039;&#039;&#039; — all NEMO2 scripts mount &amp;lt;tt&amp;gt;sdshd-sftp:&amp;lt;/tt&amp;gt; by name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #17a2b8; padding: 15px; background-color: #d1ecf1; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What the path in &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; controls:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The path after the colon in &amp;lt;tt&amp;gt;remote = sdshd-backend:YOUR_PROJECT_ID&amp;lt;/tt&amp;gt; becomes the root of your mount at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt;. If you set it correctly, your project files appear directly under &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you leave the path empty (&amp;lt;tt&amp;gt;remote = sdshd-backend:&amp;lt;/tt&amp;gt;), the mount shows the SFTP server&#039;s home directory. Your project then appears as a &#039;&#039;subdirectory&#039;&#039; at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/YOUR_PROJECT_ID/&amp;lt;/tt&amp;gt;. Job scripts that reference &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/&amp;lt;/tt&amp;gt; directly will not find your data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception:&#039;&#039;&#039; If you are a member of multiple projects, you may intentionally omit the project ID so all projects appear as subdirectories. In that case, adjust your job scripts to include the project ID in the path.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 2: Set the password ==&lt;br /&gt;
&lt;br /&gt;
rclone does not store passwords in plain text — it stores an obscured form. Generate the obscured password with the following command. It reads your password without echoing it to the terminal and is never written to your shell history:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf &#039;SDS@hd password:\n&#039;; read -s p &amp;amp;&amp;amp; printf &#039;%s&#039; &amp;quot;$p&amp;quot; | rclone obscure -; echo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Type your SDS@hd password and press Enter. The command prints a string like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QKkf-abc123XYZetc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy that string and paste it as the &amp;lt;tt&amp;gt;pass =&amp;lt;/tt&amp;gt; value in &amp;lt;tt&amp;gt;~/.config/rclone/rclone.conf&amp;lt;/tt&amp;gt;, replacing &amp;lt;tt&amp;gt;PASTE_OBSCURED_PASSWORD_HERE&amp;lt;/tt&amp;gt;. Then clear the variable from memory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unset p        # bash / zsh&lt;br /&gt;
# set -e p    # fish&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Do not use &amp;lt;tt&amp;gt;echo &amp;quot;mypassword&amp;quot; | rclone obscure -&amp;lt;/tt&amp;gt;&#039;&#039;&#039; — the password would appear in your shell history and in &amp;lt;tt&amp;gt;ps&amp;lt;/tt&amp;gt; output. The &amp;lt;tt&amp;gt;read -s&amp;lt;/tt&amp;gt; method above avoids both.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3: Protect the config file ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;rclone config touch&amp;lt;/tt&amp;gt; already creates the file with mode 600. If you created it manually or are unsure, set the permissions explicitly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 600 ~/.config/rclone/rclone.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4: Verify the connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone ls sdshd-sftp:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expected output: a list of files and directories in your project. An empty listing (no output, no error) is also fine — it means the project exists but is empty.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Error message&lt;br /&gt;
! Likely cause&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;SSH authentication failed&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Wrong username or password&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;no such file or directory&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Project ID in &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; is wrong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;connection refused&amp;lt;/tt&amp;gt; / timeout&lt;br /&gt;
| Network issue or wrong hostname&lt;br /&gt;
|-&lt;br /&gt;
| Empty listing (no error)&lt;br /&gt;
| Project exists but is empty — that is fine&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setup complete.&#039;&#039;&#039; See [[#Basic_Usage|Basic Usage]] to start using SDS@hd.&lt;br /&gt;
&lt;br /&gt;
= Basic Usage =&lt;br /&gt;
&lt;br /&gt;
== Interactive sessions on login nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd            # mount at /mnt/sdshd/$USER&lt;br /&gt;
umount-sdshd           # unmount and wait for all uploads to finish&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The mount point &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt; is created automatically when you log in, via a PAM hook. No manual admin step is needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Always use &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; to disconnect — never &amp;lt;tt&amp;gt;fusermount -u&amp;lt;/tt&amp;gt; directly.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;fusermount -u&amp;lt;/tt&amp;gt; terminates rclone immediately, cutting off any uploads in progress and causing data loss. &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; waits until rclone confirms that all uploads are complete before sending the shutdown signal.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;tt&amp;gt;mount-sdshd --help&amp;lt;/tt&amp;gt; for all options and examples.&lt;br /&gt;
&lt;br /&gt;
== Slurm jobs ==&lt;br /&gt;
&lt;br /&gt;
Add the &amp;lt;tt&amp;gt;--gres=sdshd&amp;lt;/tt&amp;gt; flag to your job script. The Slurm prolog mounts SDS@hd automatically at job start; the epilog waits for all uploads to complete before the job finishes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#SBATCH --gres=sdshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your data is available at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt; inside the job, with no further commands needed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The job shows &amp;lt;tt&amp;gt;CG&amp;lt;/tt&amp;gt; (COMPLETING) in &amp;lt;tt&amp;gt;squeue&amp;lt;/tt&amp;gt; during the upload phase.&#039;&#039;&#039; For large output files this can take minutes — this is expected and safe. The job will not exit until all data has been confirmed uploaded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you need data on SDS@hd before the job finishes&#039;&#039;&#039; (e.g. for a multi-step pipeline where the next job reads this job&#039;s output), call &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; explicitly at the end of your job script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --gres=sdshd&lt;br /&gt;
&lt;br /&gt;
# ... your computation ...&lt;br /&gt;
&lt;br /&gt;
umount-sdshd    # blocks here until all uploads are done, then the job exits&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Advanced Configuration =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 15px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This section is optional.&#039;&#039;&#039; The built-in defaults work well for most jobs. Come back here if you need to:&lt;br /&gt;
* limit cache size or bandwidth&lt;br /&gt;
* use a persistent (crash-safe) cache on Weka&lt;br /&gt;
* tune performance for ML training or large job arrays&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Per-user configuration file ==&lt;br /&gt;
&lt;br /&gt;
Create &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt; to override the built-in defaults for all your jobs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p ~/.config/sdshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The format is &amp;lt;tt&amp;gt;key = value&amp;lt;/tt&amp;gt;, one per line. Lines starting with &amp;lt;tt&amp;gt;#&amp;lt;/tt&amp;gt; are comments. The file is parsed without being executed — invalid or unknown keys are silently ignored.&lt;br /&gt;
&lt;br /&gt;
=== Configuration keys ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;/tmp/sdshd-&amp;lt;uid&amp;gt;/cache/&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Local VFS cache directory. Node-local NVMe by default (cleaned on reboot). Set to a Weka workspace path for crash-safe persistent caching. See [[#Persistent_cache_on_Weka|Persistent cache on Weka]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_mode&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt;&lt;br /&gt;
| VFS cache mode: &amp;lt;tt&amp;gt;off&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;minimal&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;writes&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt; caches entire files for read and write. Required for arbitrary file access patterns. &amp;lt;tt&amp;gt;off&amp;lt;/tt&amp;gt; reads directly from SDS@hd with no local cache.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;50G&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Maximum local cache size. rclone evicts least-recently-used files automatically when the limit is approached.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_age&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;24h&amp;lt;/tt&amp;gt;&lt;br /&gt;
| How long to keep cached files before eviction, even if &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt; is not hit. Set to at least your job&#039;s wall time when using Weka as &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;sftp_concurrency&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;16&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Parallel SFTP requests per connection. Higher values fill the TCP window more aggressively over the 5 ms WAN link. Reduce to &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt; for large job arrays (e.g. 100+ tasks) to avoid overloading the gateway.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;transfers&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Number of parallel background upload workers.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;buffer_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;128M&amp;lt;/tt&amp;gt;&lt;br /&gt;
| In-memory read/write buffer per file. 128M is well-matched to the Freiburg–Heidelberg RTT. Increase for very large sequential files.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;read_ahead&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;64M&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Sequential read prefetch window. Increase to &amp;lt;tt&amp;gt;512M&amp;lt;/tt&amp;gt; for large sequential reads.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;write_back&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;5s&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Delay between file close and upload start. With the default &amp;lt;tt&amp;gt;5s&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;close()&amp;lt;/tt&amp;gt; returns immediately and the upload runs in the background — your job continues while data transfers to SDS@hd. Setting this to &amp;lt;tt&amp;gt;0s&amp;lt;/tt&amp;gt; makes uploads synchronous: your job stalls at every file write for the full upload duration. You almost certainly do not want &amp;lt;tt&amp;gt;0s&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;dir_cache&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;5m&amp;lt;/tt&amp;gt;&lt;br /&gt;
| How long to cache directory listings. Use &amp;lt;tt&amp;gt;2h&amp;lt;/tt&amp;gt; for compute jobs (stable dataset), &amp;lt;tt&amp;gt;5m&amp;lt;/tt&amp;gt; for interactive use (picks up changes from other nodes quickly).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt;&lt;br /&gt;
| (empty)&lt;br /&gt;
| Extra rclone flags appended verbatim. Values are split on spaces — arguments containing internal spaces (e.g. bwlimit timetables) cannot be expressed here; use &amp;lt;tt&amp;gt;rclone.conf&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;mount-sdshd&amp;lt;/tt&amp;gt; command-line options instead.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
Expand for full &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt; example.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ~/.config/sdshd/config&lt;br /&gt;
&lt;br /&gt;
# Local VFS cache directory. Must be an absolute path.&lt;br /&gt;
# Leave empty to use /tmp/sdshd-&amp;lt;uid&amp;gt;/cache/ (node-local NVMe, cleaned on reboot).&lt;br /&gt;
# Use a Weka workspace path (ws_find &amp;lt;name&amp;gt;) for crash-safe output caching or&lt;br /&gt;
# for large datasets that exceed node NVMe capacity.&lt;br /&gt;
# A per-hostname subdirectory (rclone-&amp;lt;nodename&amp;gt;/) is always appended so that&lt;br /&gt;
# parallel jobs on different nodes each have their own independent cache.&lt;br /&gt;
cache_dir       =&lt;br /&gt;
&lt;br /&gt;
# VFS cache mode: off | minimal | writes | full (default: full)&lt;br /&gt;
# &#039;full&#039; caches entire files locally for read/write. Required for arbitrary&lt;br /&gt;
# file access patterns and write support. &#039;off&#039; reads directly from SDS@hd&lt;br /&gt;
# with no local cache.&lt;br /&gt;
cache_mode      = full&lt;br /&gt;
&lt;br /&gt;
# Maximum local cache size. rclone evicts LRU files automatically.&lt;br /&gt;
cache_size      = 50G&lt;br /&gt;
&lt;br /&gt;
# How long to keep cached files before eviction (even if cache_size not hit).&lt;br /&gt;
# Set &amp;gt;= max job wall time when using Weka as cache_dir (not cleaned on reboot).&lt;br /&gt;
cache_age       = 24h&lt;br /&gt;
&lt;br /&gt;
# Number of parallel SFTP requests per connection.&lt;br /&gt;
# Higher values fill the TCP window more aggressively over the 5 ms WAN link.&lt;br /&gt;
# For job arrays with many tasks, reduce to 8 to avoid overloading lsdf02-sshfs.&lt;br /&gt;
sftp_concurrency = 16&lt;br /&gt;
&lt;br /&gt;
# Number of parallel file transfer workers (background uploads).&lt;br /&gt;
transfers       = 8&lt;br /&gt;
&lt;br /&gt;
# In-memory read/write buffer per file. 128M fills the TCP window well at&lt;br /&gt;
# 5 ms RTT (Freiburg → Heidelberg). Increase for very large sequential files.&lt;br /&gt;
buffer_size     = 128M&lt;br /&gt;
&lt;br /&gt;
# Sequential read prefetch window. Increase to 512M for large sequential reads.&lt;br /&gt;
read_ahead      = 64M&lt;br /&gt;
&lt;br /&gt;
# Delay between file close and upload start.&lt;br /&gt;
# 5s (default): close() returns immediately; the upload runs asynchronously&lt;br /&gt;
# in the background. Your job continues while data is transferred to SDS@hd,&lt;br /&gt;
# and umount-sdshd (or the Slurm epilog) waits for all uploads to finish&lt;br /&gt;
# before disconnecting.&lt;br /&gt;
# 0s: upload runs synchronously inside close(), blocking your job for the&lt;br /&gt;
# entire upload duration of every file written. For large output files this&lt;br /&gt;
# means your job script stalls at each file write — you almost certainly&lt;br /&gt;
# do not want this.&lt;br /&gt;
write_back      = 5s&lt;br /&gt;
&lt;br /&gt;
# How long directory listings are cached. 2h for compute jobs (stable),&lt;br /&gt;
# 5m for interactive use (pick up changes from other login nodes quickly).&lt;br /&gt;
dir_cache       = 5m&lt;br /&gt;
&lt;br /&gt;
# Extra rclone flags appended verbatim after all other options.&lt;br /&gt;
# Command-line arguments (mount-sdshd only) still take final precedence.&lt;br /&gt;
#&lt;br /&gt;
# Values are split on spaces, so arguments that contain an internal space&lt;br /&gt;
# (e.g. bwlimit timetables like &amp;quot;08:00,100M 18:00,500M&amp;quot;) cannot be expressed&lt;br /&gt;
# here. Set those via rclone.conf or pass them directly on the command line&lt;br /&gt;
# with mount-sdshd instead.&lt;br /&gt;
#&lt;br /&gt;
# Useful examples:&lt;br /&gt;
#&lt;br /&gt;
#   Limit upload/download bandwidth (per rclone process, not per file).&lt;br /&gt;
#   Useful when running multiple jobs simultaneously or to be a good&lt;br /&gt;
#   neighbour on a shared gateway. Value: bytes/s suffix M/G, or &#039;off&#039;.&lt;br /&gt;
#   Per-direction: --bwlimit-file takes the same syntax.&lt;br /&gt;
#     extra_opts = --bwlimit 200M&lt;br /&gt;
#&lt;br /&gt;
#   Exclude patterns — keep temp/checkpoint files out of the VFS cache&lt;br /&gt;
#   so they don&#039;t consume cache space or trigger unnecessary uploads.&lt;br /&gt;
#   Do NOT use shell quotes here — they are passed literally to rclone,&lt;br /&gt;
#   not interpreted by the shell.  Write glob patterns unquoted:&lt;br /&gt;
#     extra_opts = --exclude *.tmp --exclude checkpoint_*.pt&lt;br /&gt;
#&lt;br /&gt;
#   Override SSH connection timeout (default 60s). Reduce if you want&lt;br /&gt;
#   faster failure detection on flaky connections:&lt;br /&gt;
#     extra_opts = --timeout 30s&lt;br /&gt;
extra_opts      =&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Available disk space by node type:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Node type&lt;br /&gt;
! Local disk&lt;br /&gt;
! Recommended max &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Login nodes&lt;br /&gt;
| ~400 GB&lt;br /&gt;
| 20–50 G (shared with other users)&lt;br /&gt;
|-&lt;br /&gt;
| Milan nodes&lt;br /&gt;
| ~1.9 TB&lt;br /&gt;
| 50 G (default)&lt;br /&gt;
|-&lt;br /&gt;
| Other nodes&lt;br /&gt;
| ~3.8 TB&lt;br /&gt;
| 50 G (default)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Useful &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt; examples:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Limit upload/download bandwidth (per rclone process).&lt;br /&gt;
# Useful when running many jobs simultaneously or to be a good neighbour.&lt;br /&gt;
extra_opts = --bwlimit 200M&lt;br /&gt;
&lt;br /&gt;
# Exclude temp and checkpoint files from the cache — saves cache space&lt;br /&gt;
# and avoids uploading files you don&#039;t need on SDS@hd.&lt;br /&gt;
# Do NOT use shell quotes here — write glob patterns unquoted.&lt;br /&gt;
extra_opts = --exclude *.tmp --exclude checkpoint_*.pt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persistent cache on Weka ==&lt;br /&gt;
&lt;br /&gt;
With the default &amp;lt;tt&amp;gt;/tmp&amp;lt;/tt&amp;gt; cache, data written to SDS@hd is first held locally on the node&#039;s NVMe. If the node crashes, reboots, or is killed (OOM, walltime) before the upload completes, the cached data is lost.&lt;br /&gt;
&lt;br /&gt;
A Weka workspace survives node failures. If a job is killed before uploads finish, the data is still in the cache — remount with the same &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt; to resume, or copy directly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Create a workspace and configure it as the cache directory:&lt;br /&gt;
ws_allocate mywsname 30&lt;br /&gt;
&lt;br /&gt;
# Edit ~/.config/sdshd/config, add:&lt;br /&gt;
cache_dir  = /path/from/ws_find&lt;br /&gt;
cache_size = 2T&lt;br /&gt;
cache_age  = 720h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;tt&amp;gt;/path/from/ws_find&amp;lt;/tt&amp;gt; with the output of &amp;lt;tt&amp;gt;ws_find mywsname&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After a failed job, recover the cached data:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# The cache subdirectory is named after the compute node hostname.&lt;br /&gt;
# Check: ls $(ws_find mywsname)/&lt;br /&gt;
rclone copy &amp;quot;$(ws_find mywsname)/rclone-&amp;amp;lt;compute-node-name&amp;amp;gt;/vfs/sdshd-sftp/&amp;quot; \&lt;br /&gt;
    sdshd-sftp:recovered/ --progress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When are cached files removed?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Trigger&lt;br /&gt;
! What happens&lt;br /&gt;
|-&lt;br /&gt;
| rclone running, &amp;lt;tt&amp;gt;cache_age&amp;lt;/tt&amp;gt; exceeded&lt;br /&gt;
| rclone evicts the file from cache (LRU)&lt;br /&gt;
|-&lt;br /&gt;
| rclone running, &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt; would be exceeded&lt;br /&gt;
| rclone evicts least-recently-used files&lt;br /&gt;
|-&lt;br /&gt;
| rclone not running (between mounts)&lt;br /&gt;
| nothing — files are not touched&lt;br /&gt;
|-&lt;br /&gt;
| Workspace expires (&amp;lt;tt&amp;gt;ws_extend&amp;lt;/tt&amp;gt; not run)&lt;br /&gt;
| restorable for 30 days, then auto-deleted permanently&lt;br /&gt;
|-&lt;br /&gt;
| Manual cleanup&lt;br /&gt;
| remove the &amp;lt;tt&amp;gt;rclone-*&amp;lt;/tt&amp;gt; subdirectory inside the workspace&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See [[Workspaces]] for workspace management commands.&lt;br /&gt;
&lt;br /&gt;
The same Weka &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt; also benefits read-heavy jobs such as ML training or multi-epoch analysis: rclone downloads each input file on first access and serves all subsequent reads from Weka without any WAN traffic. Note that the cache is per-node — each node in a job array downloads its own copy independently. For job arrays where all tasks need the same files, use &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; to pre-stage once instead — see [[#Shared_dataset_across_many_jobs|Shared dataset across many jobs]].&lt;br /&gt;
&lt;br /&gt;
= Advanced Usage =&lt;br /&gt;
&lt;br /&gt;
== Read-only access ==&lt;br /&gt;
&lt;br /&gt;
For browsing or spot reads without writing — bypasses the local cache entirely, every read goes directly to SDS@hd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd --vfs-cache-mode off --read-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;&#039;repeated reads of the same files&#039;&#039;&#039; (e.g. checking a large dataset), use the default cache with &amp;lt;tt&amp;gt;--read-only&amp;lt;/tt&amp;gt;. The VFS cache still operates — files are downloaded once on first access and served from local disk on all subsequent reads:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd --read-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ML training and read-intensive jobs ==&lt;br /&gt;
&lt;br /&gt;
If your job reads the same files many times (training epochs, iterative algorithms, multi-pass analysis), set a Weka workspace as &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;. rclone downloads each file on first access; every subsequent read is served from Weka without any WAN traffic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ws_find mywsname      # e.g. /work/classic/fr_abc123456-mywsname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# In ~/.config/sdshd/config:&lt;br /&gt;
cache_dir  = /work/classic/fr_abc123456-mywsname&lt;br /&gt;
cache_size = 2T&lt;br /&gt;
cache_age  = 120h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first epoch downloads from SDS@hd. Every subsequent epoch reads from Weka — no WAN traffic, no gateway load.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The cache is per-node. Each node in a job array downloads its own copy. For job arrays where all tasks need the same files, use &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; to pre-stage once instead (see below).&lt;br /&gt;
&lt;br /&gt;
== Shared dataset across many jobs ==&lt;br /&gt;
&lt;br /&gt;
If many job array tasks need to read the same files, rclone VFS cannot share a cache — concurrent mounts against the same cache directory will corrupt it, even with &amp;lt;tt&amp;gt;--read-only&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The solution: copy the dataset once to a Weka workspace, then have all jobs read from the Weka path directly as a plain filesystem — no FUSE mount, no per-job downloads:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Step 1 (once, on login node): copy dataset from SDS@hd to Weka&lt;br /&gt;
ws_allocate mydata 30&lt;br /&gt;
rclone copy sdshd-sftp:inputdata/ $(ws_find mydata)/inputdata/ \&lt;br /&gt;
    --progress --transfers 8 --sftp-concurrency 8 --sftp-chunk-size 255k&lt;br /&gt;
&lt;br /&gt;
# Step 2: reference the Weka path in your job script (no --gres=sdshd needed)&lt;br /&gt;
INPUT_DIR=$(ws_find mydata)/inputdata&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--sftp-chunk-size 255k&amp;lt;/tt&amp;gt; increases the SFTP packet size from 32 KB (default) to 255 KB (OpenSSH&#039;s maximum), which reduces protocol overhead and significantly improves throughput for large files. Use this flag with explicit &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; commands — it has no effect on the FUSE mount and should not be placed in &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
All tasks read from Weka at full speed with zero WAN traffic and zero gateway load. Re-run &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; if the source data changes — it skips unchanged files.&lt;br /&gt;
&lt;br /&gt;
= Known Limitations =&lt;br /&gt;
&lt;br /&gt;
== Symlinks are not preserved ==&lt;br /&gt;
&lt;br /&gt;
rclone&#039;s SFTP backend does not store symlinks on the remote. When rclone uploads a symlink (through the FUSE mount or via &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt;), it follows the link and uploads the target&#039;s content as a regular file. The symlink itself is lost.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Situation&lt;br /&gt;
! What happens&lt;br /&gt;
|-&lt;br /&gt;
| Symlink to a regular file&lt;br /&gt;
| Target file is uploaded; symlink metadata is lost&lt;br /&gt;
|-&lt;br /&gt;
| Symlink to a directory&lt;br /&gt;
| Directory tree is traversed; contents are uploaded recursively&lt;br /&gt;
|-&lt;br /&gt;
| Dangling symlink (target missing)&lt;br /&gt;
| Transfer error or silently skipped&lt;br /&gt;
|-&lt;br /&gt;
| Restore from SDS@hd&lt;br /&gt;
| Regular files/directories — original symlinks are gone&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Workarounds:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Archive before upload:&#039;&#039;&#039; &amp;lt;tt&amp;gt;tar -czf env.tar.gz myenv/&amp;lt;/tt&amp;gt; — preserves all symlinks inside the archive. Unpack after download to restore the original structure.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;rclone copy --links&amp;lt;/tt&amp;gt;:&#039;&#039;&#039; encodes symlinks as &amp;lt;tt&amp;gt;.rclonelink&amp;lt;/tt&amp;gt; text files on the remote. Only works for &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;rclone sync&amp;lt;/tt&amp;gt; workflows (not the FUSE VFS mount). Requires &amp;lt;tt&amp;gt;--links&amp;lt;/tt&amp;gt; on both the copy and the restore.&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;tt&amp;gt;SSH_FX_FAILURE&amp;lt;/tt&amp;gt; during upload ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Most common cause: storage quota exhausted.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SDS@hd enforces a hard quota per project. When full, the server rejects all writes. Check your quota first:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone about sdshd-sftp:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the quota is full, delete or archive old data on SDS@hd before retrying.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary cause: gateway overload from large job arrays.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
100 tasks × 16 SFTP connections = 1600 simultaneous connections to &amp;lt;tt&amp;gt;lsdf02-sshfs&amp;lt;/tt&amp;gt;. The gateway may reject new connections under this load. Reduce &amp;lt;tt&amp;gt;sftp_concurrency&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt;, or bypass the FUSE mount entirely for bulk transfers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone copy /local/results/ sdshd-sftp:results/ \&lt;br /&gt;
    --transfers 4 --sftp-concurrency 8 --sftp-chunk-size 255k --progress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the default &amp;lt;tt&amp;gt;/tmp&amp;lt;/tt&amp;gt; cache, resuming requires submitting a new job to the exact same compute node — not generally practical — and the cache is gone after a node reboot regardless. With a Weka workspace as &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;, the cache survives both job end and node reboots; the key advantage is that you can copy the data out manually without needing a job on that node at all, as described in [[#Persistent_cache_on_Weka|Persistent cache on Weka]].&lt;br /&gt;
&lt;br /&gt;
== Job stuck in &amp;lt;tt&amp;gt;CG&amp;lt;/tt&amp;gt; (COMPLETING) for a long time ==&lt;br /&gt;
&lt;br /&gt;
The Slurm epilog waits for rclone to finish uploading all pending data. For large output files this can take minutes — this is expected and safe. The job will exit on its own once all uploads are confirmed complete. There is nothing to do.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
	<entry>
		<id>https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/SDS_hd&amp;diff=16003</id>
		<title>NEMO2/SDS hd</title>
		<link rel="alternate" type="text/html" href="https://wiki.bwhpc.de/wiki/index.php?title=NEMO2/SDS_hd&amp;diff=16003"/>
		<updated>2026-04-22T15:46:47Z</updated>

		<summary type="html">&lt;p&gt;M Janczyk: /* Shared dataset across many jobs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;WARNING! This feature is currently for testing purposes only!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SDS@hd&#039;&#039;&#039; is the scientific storage service of Heidelberg University. On NEMO2, you can mount your SDS@hd project directly into your jobs or interactive sessions via rclone. Data is cached locally on the node&#039;s NVMe drive and uploaded to SDS@hd in the background.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #28a745; padding: 15px; background-color: #d4edda; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What you need to do:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[#Initial_Setup_.28Required.29|Initial Setup]]&#039;&#039;&#039; — one-time configuration, takes about 5 minutes. &#039;&#039;&#039;You must complete this before using SDS@hd on NEMO2.&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[#Advanced_Configuration|Advanced Configuration]]&#039;&#039;&#039; — optional. Tune cache size, bandwidth limits, and more. Skip this on your first use.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Initial Setup (Required) =&lt;br /&gt;
&lt;br /&gt;
Complete these four steps once. After that, SDS@hd is available in all your jobs and interactive sessions without any further configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prerequisites:&#039;&#039;&#039;&lt;br /&gt;
* Your bwIDM username and SDS@hd password&lt;br /&gt;
* Your SDS@hd project ID (e.g. &amp;lt;tt&amp;gt;sd14a001&amp;lt;/tt&amp;gt;, find it at [[SDS@hd/Access]])&lt;br /&gt;
&lt;br /&gt;
== Step 1: Create the rclone configuration file ==&lt;br /&gt;
&lt;br /&gt;
Run this command to create the config file with the correct permissions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone config touch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates &amp;lt;tt&amp;gt;~/.config/rclone/rclone.conf&amp;lt;/tt&amp;gt; with mode 600. Now open the file in an editor and add the following two sections, replacing the placeholder values with your own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[sdshd-backend]&lt;br /&gt;
type = sftp&lt;br /&gt;
host = lsdf02-sshfs.urz.uni-heidelberg.de&lt;br /&gt;
user = YOUR_BWIDM_USERNAME&lt;br /&gt;
pass = PASTE_OBSCURED_PASSWORD_HERE&lt;br /&gt;
md5sum_command = none&lt;br /&gt;
sha1sum_command = none&lt;br /&gt;
shell_type = unix&lt;br /&gt;
set_modtime = false&lt;br /&gt;
idle_timeout = 0&lt;br /&gt;
&lt;br /&gt;
[sdshd-sftp]&lt;br /&gt;
type = alias&lt;br /&gt;
remote = sdshd-backend:YOUR_PROJECT_ID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace:&lt;br /&gt;
* &amp;lt;tt&amp;gt;YOUR_BWIDM_USERNAME&amp;lt;/tt&amp;gt; — your bwIDM login name (same as on NEMO2)&lt;br /&gt;
* &amp;lt;tt&amp;gt;YOUR_PROJECT_ID&amp;lt;/tt&amp;gt; — your SDS@hd project ID, e.g. &amp;lt;tt&amp;gt;sd14a001&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;PASTE_OBSCURED_PASSWORD_HERE&amp;lt;/tt&amp;gt; — leave this for now, you will fill it in Step 2&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; section name must not be changed&#039;&#039;&#039; — all NEMO2 scripts mount &amp;lt;tt&amp;gt;sdshd-sftp:&amp;lt;/tt&amp;gt; by name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #17a2b8; padding: 15px; background-color: #d1ecf1; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;What the path in &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; controls:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The path after the colon in &amp;lt;tt&amp;gt;remote = sdshd-backend:YOUR_PROJECT_ID&amp;lt;/tt&amp;gt; becomes the root of your mount at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt;. If you set it correctly, your project files appear directly under &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you leave the path empty (&amp;lt;tt&amp;gt;remote = sdshd-backend:&amp;lt;/tt&amp;gt;), the mount shows the SFTP server&#039;s home directory. Your project then appears as a &#039;&#039;subdirectory&#039;&#039; at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/YOUR_PROJECT_ID/&amp;lt;/tt&amp;gt;. Job scripts that reference &amp;lt;tt&amp;gt;/mnt/sdshd/$USER/&amp;lt;/tt&amp;gt; directly will not find your data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception:&#039;&#039;&#039; If you are a member of multiple projects, you may intentionally omit the project ID so all projects appear as subdirectories. In that case, adjust your job scripts to include the project ID in the path.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 2: Set the password ==&lt;br /&gt;
&lt;br /&gt;
rclone does not store passwords in plain text — it stores an obscured form. Generate the obscured password with the following command. It reads your password without echoing it to the terminal and is never written to your shell history:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf &#039;SDS@hd password:\n&#039;; read -s p &amp;amp;&amp;amp; printf &#039;%s&#039; &amp;quot;$p&amp;quot; | rclone obscure -; echo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Type your SDS@hd password and press Enter. The command prints a string like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QKkf-abc123XYZetc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy that string and paste it as the &amp;lt;tt&amp;gt;pass =&amp;lt;/tt&amp;gt; value in &amp;lt;tt&amp;gt;~/.config/rclone/rclone.conf&amp;lt;/tt&amp;gt;, replacing &amp;lt;tt&amp;gt;PASTE_OBSCURED_PASSWORD_HERE&amp;lt;/tt&amp;gt;. Then clear the variable from memory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unset p        # bash / zsh&lt;br /&gt;
# set -e p    # fish&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Do not use &amp;lt;tt&amp;gt;echo &amp;quot;mypassword&amp;quot; | rclone obscure -&amp;lt;/tt&amp;gt;&#039;&#039;&#039; — the password would appear in your shell history and in &amp;lt;tt&amp;gt;ps&amp;lt;/tt&amp;gt; output. The &amp;lt;tt&amp;gt;read -s&amp;lt;/tt&amp;gt; method above avoids both.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3: Protect the config file ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;rclone config touch&amp;lt;/tt&amp;gt; already creates the file with mode 600. If you created it manually or are unsure, set the permissions explicitly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 600 ~/.config/rclone/rclone.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4: Verify the connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone ls sdshd-sftp:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expected output: a list of files and directories in your project. An empty listing (no output, no error) is also fine — it means the project exists but is empty.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Error message&lt;br /&gt;
! Likely cause&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;SSH authentication failed&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Wrong username or password&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;no such file or directory&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Project ID in &amp;lt;tt&amp;gt;[sdshd-sftp]&amp;lt;/tt&amp;gt; is wrong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;connection refused&amp;lt;/tt&amp;gt; / timeout&lt;br /&gt;
| Network issue or wrong hostname&lt;br /&gt;
|-&lt;br /&gt;
| Empty listing (no error)&lt;br /&gt;
| Project exists but is empty — that is fine&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setup complete.&#039;&#039;&#039; See [[#Basic_Usage|Basic Usage]] to start using SDS@hd.&lt;br /&gt;
&lt;br /&gt;
= Basic Usage =&lt;br /&gt;
&lt;br /&gt;
== Interactive sessions on login nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd            # mount at /mnt/sdshd/$USER&lt;br /&gt;
umount-sdshd           # unmount and wait for all uploads to finish&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The mount point &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt; is created automatically when you log in, via a PAM hook. No manual admin step is needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #dc3545; padding: 15px; background-color: #f8d7da; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Always use &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; to disconnect — never &amp;lt;tt&amp;gt;fusermount -u&amp;lt;/tt&amp;gt; directly.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;fusermount -u&amp;lt;/tt&amp;gt; terminates rclone immediately, cutting off any uploads in progress and causing data loss. &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; waits until rclone confirms that all uploads are complete before sending the shutdown signal.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;tt&amp;gt;mount-sdshd --help&amp;lt;/tt&amp;gt; for all options and examples.&lt;br /&gt;
&lt;br /&gt;
== Slurm jobs ==&lt;br /&gt;
&lt;br /&gt;
Add the &amp;lt;tt&amp;gt;--gres=sdshd&amp;lt;/tt&amp;gt; flag to your job script. The Slurm prolog mounts SDS@hd automatically at job start; the epilog waits for all uploads to complete before the job finishes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#SBATCH --gres=sdshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your data is available at &amp;lt;tt&amp;gt;/mnt/sdshd/$USER&amp;lt;/tt&amp;gt; inside the job, with no further commands needed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The job shows &amp;lt;tt&amp;gt;CG&amp;lt;/tt&amp;gt; (COMPLETING) in &amp;lt;tt&amp;gt;squeue&amp;lt;/tt&amp;gt; during the upload phase.&#039;&#039;&#039; For large output files this can take minutes — this is expected and safe. The job will not exit until all data has been confirmed uploaded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you need data on SDS@hd before the job finishes&#039;&#039;&#039; (e.g. for a multi-step pipeline where the next job reads this job&#039;s output), call &amp;lt;tt&amp;gt;umount-sdshd&amp;lt;/tt&amp;gt; explicitly at the end of your job script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --gres=sdshd&lt;br /&gt;
&lt;br /&gt;
# ... your computation ...&lt;br /&gt;
&lt;br /&gt;
umount-sdshd    # blocks here until all uploads are done, then the job exits&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Advanced Configuration =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid #ffc107; padding: 15px; background-color: #fff3cd; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This section is optional.&#039;&#039;&#039; The built-in defaults work well for most jobs. Come back here if you need to:&lt;br /&gt;
* limit cache size or bandwidth&lt;br /&gt;
* use a persistent (crash-safe) cache on Weka&lt;br /&gt;
* tune performance for ML training or large job arrays&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Per-user configuration file ==&lt;br /&gt;
&lt;br /&gt;
Create &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt; to override the built-in defaults for all your jobs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p ~/.config/sdshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The format is &amp;lt;tt&amp;gt;key = value&amp;lt;/tt&amp;gt;, one per line. Lines starting with &amp;lt;tt&amp;gt;#&amp;lt;/tt&amp;gt; are comments. The file is parsed without being executed — invalid or unknown keys are silently ignored.&lt;br /&gt;
&lt;br /&gt;
=== Configuration keys ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;/tmp/sdshd-&amp;lt;uid&amp;gt;/cache/&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Local VFS cache directory. Node-local NVMe by default (cleaned on reboot). Set to a Weka workspace path for crash-safe persistent caching. See [[#Persistent_cache_on_Weka|Persistent cache on Weka]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_mode&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt;&lt;br /&gt;
| VFS cache mode: &amp;lt;tt&amp;gt;off&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;minimal&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;writes&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;full&amp;lt;/tt&amp;gt; caches entire files for read and write. Required for arbitrary file access patterns. &amp;lt;tt&amp;gt;off&amp;lt;/tt&amp;gt; reads directly from SDS@hd with no local cache.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;50G&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Maximum local cache size. rclone evicts least-recently-used files automatically when the limit is approached.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;cache_age&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;24h&amp;lt;/tt&amp;gt;&lt;br /&gt;
| How long to keep cached files before eviction, even if &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt; is not hit. Set to at least your job&#039;s wall time when using Weka as &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;sftp_concurrency&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;16&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Parallel SFTP requests per connection. Higher values fill the TCP window more aggressively over the 5 ms WAN link. Reduce to &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt; for large job arrays (e.g. 100+ tasks) to avoid overloading the gateway.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;transfers&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Number of parallel background upload workers.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;buffer_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;128M&amp;lt;/tt&amp;gt;&lt;br /&gt;
| In-memory read/write buffer per file. 128M is well-matched to the Freiburg–Heidelberg RTT. Increase for very large sequential files.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;read_ahead&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;64M&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Sequential read prefetch window. Increase to &amp;lt;tt&amp;gt;512M&amp;lt;/tt&amp;gt; for large sequential reads.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;write_back&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;5s&amp;lt;/tt&amp;gt;&lt;br /&gt;
| Delay between file close and upload start. With the default &amp;lt;tt&amp;gt;5s&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;close()&amp;lt;/tt&amp;gt; returns immediately and the upload runs in the background — your job continues while data transfers to SDS@hd. Setting this to &amp;lt;tt&amp;gt;0s&amp;lt;/tt&amp;gt; makes uploads synchronous: your job stalls at every file write for the full upload duration. You almost certainly do not want &amp;lt;tt&amp;gt;0s&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;dir_cache&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;5m&amp;lt;/tt&amp;gt;&lt;br /&gt;
| How long to cache directory listings. Use &amp;lt;tt&amp;gt;2h&amp;lt;/tt&amp;gt; for compute jobs (stable dataset), &amp;lt;tt&amp;gt;5m&amp;lt;/tt&amp;gt; for interactive use (picks up changes from other nodes quickly).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt;&lt;br /&gt;
| (empty)&lt;br /&gt;
| Extra rclone flags appended verbatim. Values are split on spaces — arguments containing internal spaces (e.g. bwlimit timetables) cannot be expressed here; use &amp;lt;tt&amp;gt;rclone.conf&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;mount-sdshd&amp;lt;/tt&amp;gt; command-line options instead.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
Expand for full &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt; example.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ~/.config/sdshd/config&lt;br /&gt;
&lt;br /&gt;
# Local VFS cache directory. Must be an absolute path.&lt;br /&gt;
# Leave empty to use /tmp/sdshd-&amp;lt;uid&amp;gt;/cache/ (node-local NVMe, cleaned on reboot).&lt;br /&gt;
# Use a Weka workspace path (ws_find &amp;lt;name&amp;gt;) for crash-safe output caching or&lt;br /&gt;
# for large datasets that exceed node NVMe capacity.&lt;br /&gt;
# A per-hostname subdirectory (rclone-&amp;lt;nodename&amp;gt;/) is always appended so that&lt;br /&gt;
# parallel jobs on different nodes each have their own independent cache.&lt;br /&gt;
cache_dir       =&lt;br /&gt;
&lt;br /&gt;
# VFS cache mode: off | minimal | writes | full (default: full)&lt;br /&gt;
# &#039;full&#039; caches entire files locally for read/write. Required for arbitrary&lt;br /&gt;
# file access patterns and write support. &#039;off&#039; reads directly from SDS@hd&lt;br /&gt;
# with no local cache.&lt;br /&gt;
cache_mode      = full&lt;br /&gt;
&lt;br /&gt;
# Maximum local cache size. rclone evicts LRU files automatically.&lt;br /&gt;
cache_size      = 50G&lt;br /&gt;
&lt;br /&gt;
# How long to keep cached files before eviction (even if cache_size not hit).&lt;br /&gt;
# Set &amp;gt;= max job wall time when using Weka as cache_dir (not cleaned on reboot).&lt;br /&gt;
cache_age       = 24h&lt;br /&gt;
&lt;br /&gt;
# Number of parallel SFTP requests per connection.&lt;br /&gt;
# Higher values fill the TCP window more aggressively over the 5 ms WAN link.&lt;br /&gt;
# For job arrays with many tasks, reduce to 8 to avoid overloading lsdf02-sshfs.&lt;br /&gt;
sftp_concurrency = 16&lt;br /&gt;
&lt;br /&gt;
# Number of parallel file transfer workers (background uploads).&lt;br /&gt;
transfers       = 8&lt;br /&gt;
&lt;br /&gt;
# In-memory read/write buffer per file. 128M fills the TCP window well at&lt;br /&gt;
# 5 ms RTT (Freiburg → Heidelberg). Increase for very large sequential files.&lt;br /&gt;
buffer_size     = 128M&lt;br /&gt;
&lt;br /&gt;
# Sequential read prefetch window. Increase to 512M for large sequential reads.&lt;br /&gt;
read_ahead      = 64M&lt;br /&gt;
&lt;br /&gt;
# Delay between file close and upload start.&lt;br /&gt;
# 5s (default): close() returns immediately; the upload runs asynchronously&lt;br /&gt;
# in the background. Your job continues while data is transferred to SDS@hd,&lt;br /&gt;
# and umount-sdshd (or the Slurm epilog) waits for all uploads to finish&lt;br /&gt;
# before disconnecting.&lt;br /&gt;
# 0s: upload runs synchronously inside close(), blocking your job for the&lt;br /&gt;
# entire upload duration of every file written. For large output files this&lt;br /&gt;
# means your job script stalls at each file write — you almost certainly&lt;br /&gt;
# do not want this.&lt;br /&gt;
write_back      = 5s&lt;br /&gt;
&lt;br /&gt;
# How long directory listings are cached. 2h for compute jobs (stable),&lt;br /&gt;
# 5m for interactive use (pick up changes from other login nodes quickly).&lt;br /&gt;
dir_cache       = 5m&lt;br /&gt;
&lt;br /&gt;
# Extra rclone flags appended verbatim after all other options.&lt;br /&gt;
# Command-line arguments (mount-sdshd only) still take final precedence.&lt;br /&gt;
#&lt;br /&gt;
# Values are split on spaces, so arguments that contain an internal space&lt;br /&gt;
# (e.g. bwlimit timetables like &amp;quot;08:00,100M 18:00,500M&amp;quot;) cannot be expressed&lt;br /&gt;
# here. Set those via rclone.conf or pass them directly on the command line&lt;br /&gt;
# with mount-sdshd instead.&lt;br /&gt;
#&lt;br /&gt;
# Useful examples:&lt;br /&gt;
#&lt;br /&gt;
#   Limit upload/download bandwidth (per rclone process, not per file).&lt;br /&gt;
#   Useful when running multiple jobs simultaneously or to be a good&lt;br /&gt;
#   neighbour on a shared gateway. Value: bytes/s suffix M/G, or &#039;off&#039;.&lt;br /&gt;
#   Per-direction: --bwlimit-file takes the same syntax.&lt;br /&gt;
#     extra_opts = --bwlimit 200M&lt;br /&gt;
#&lt;br /&gt;
#   Exclude patterns — keep temp/checkpoint files out of the VFS cache&lt;br /&gt;
#   so they don&#039;t consume cache space or trigger unnecessary uploads.&lt;br /&gt;
#   Do NOT use shell quotes here — they are passed literally to rclone,&lt;br /&gt;
#   not interpreted by the shell.  Write glob patterns unquoted:&lt;br /&gt;
#     extra_opts = --exclude *.tmp --exclude checkpoint_*.pt&lt;br /&gt;
#&lt;br /&gt;
#   Override SSH connection timeout (default 60s). Reduce if you want&lt;br /&gt;
#   faster failure detection on flaky connections:&lt;br /&gt;
#     extra_opts = --timeout 30s&lt;br /&gt;
extra_opts      =&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Available disk space by node type:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Node type&lt;br /&gt;
! Local disk&lt;br /&gt;
! Recommended max &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Login nodes&lt;br /&gt;
| ~400 GB&lt;br /&gt;
| 20–50 G (shared with other users)&lt;br /&gt;
|-&lt;br /&gt;
| Milan nodes&lt;br /&gt;
| ~1.9 TB&lt;br /&gt;
| 50 G (default)&lt;br /&gt;
|-&lt;br /&gt;
| Other nodes&lt;br /&gt;
| ~3.8 TB&lt;br /&gt;
| 50 G (default)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Useful &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt; examples:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Limit upload/download bandwidth (per rclone process).&lt;br /&gt;
# Useful when running many jobs simultaneously or to be a good neighbour.&lt;br /&gt;
extra_opts = --bwlimit 200M&lt;br /&gt;
&lt;br /&gt;
# Exclude temp and checkpoint files from the cache — saves cache space&lt;br /&gt;
# and avoids uploading files you don&#039;t need on SDS@hd.&lt;br /&gt;
# Do NOT use shell quotes here — write glob patterns unquoted.&lt;br /&gt;
extra_opts = --exclude *.tmp --exclude checkpoint_*.pt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persistent cache on Weka ==&lt;br /&gt;
&lt;br /&gt;
With the default &amp;lt;tt&amp;gt;/tmp&amp;lt;/tt&amp;gt; cache, data written to SDS@hd is first held locally on the node&#039;s NVMe. If the node crashes, reboots, or is killed (OOM, walltime) before the upload completes, the cached data is lost.&lt;br /&gt;
&lt;br /&gt;
A Weka workspace survives node failures. If a job is killed before uploads finish, the data is still in the cache — remount with the same &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt; to resume, or copy directly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Create a workspace and configure it as the cache directory:&lt;br /&gt;
ws_allocate mywsname 30&lt;br /&gt;
&lt;br /&gt;
# Edit ~/.config/sdshd/config, add:&lt;br /&gt;
cache_dir  = /path/from/ws_find&lt;br /&gt;
cache_size = 2T&lt;br /&gt;
cache_age  = 720h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;tt&amp;gt;/path/from/ws_find&amp;lt;/tt&amp;gt; with the output of &amp;lt;tt&amp;gt;ws_find mywsname&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After a failed job, recover the cached data:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# The cache subdirectory is named after the compute node hostname.&lt;br /&gt;
# Check: ls $(ws_find mywsname)/&lt;br /&gt;
rclone copy &amp;quot;$(ws_find mywsname)/rclone-&amp;amp;lt;compute-node-name&amp;amp;gt;/vfs/sdshd-sftp/&amp;quot; \&lt;br /&gt;
    sdshd-sftp:recovered/ --progress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When are cached files removed?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Trigger&lt;br /&gt;
! What happens&lt;br /&gt;
|-&lt;br /&gt;
| rclone running, &amp;lt;tt&amp;gt;cache_age&amp;lt;/tt&amp;gt; exceeded&lt;br /&gt;
| rclone evicts the file from cache (LRU)&lt;br /&gt;
|-&lt;br /&gt;
| rclone running, &amp;lt;tt&amp;gt;cache_size&amp;lt;/tt&amp;gt; would be exceeded&lt;br /&gt;
| rclone evicts least-recently-used files&lt;br /&gt;
|-&lt;br /&gt;
| rclone not running (between mounts)&lt;br /&gt;
| nothing — files are not touched&lt;br /&gt;
|-&lt;br /&gt;
| Workspace expires (&amp;lt;tt&amp;gt;ws_extend&amp;lt;/tt&amp;gt; not run)&lt;br /&gt;
| restorable for 30 days, then auto-deleted permanently&lt;br /&gt;
|-&lt;br /&gt;
| Manual cleanup&lt;br /&gt;
| remove the &amp;lt;tt&amp;gt;rclone-*&amp;lt;/tt&amp;gt; subdirectory inside the workspace&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See [[Workspaces]] for workspace management commands.&lt;br /&gt;
&lt;br /&gt;
= Advanced Usage =&lt;br /&gt;
&lt;br /&gt;
== Read-only access ==&lt;br /&gt;
&lt;br /&gt;
For browsing or spot reads without writing — bypasses the local cache entirely, every read goes directly to SDS@hd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd --vfs-cache-mode off --read-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;&#039;repeated reads of the same files&#039;&#039;&#039; (e.g. checking a large dataset), use the default cache with &amp;lt;tt&amp;gt;--read-only&amp;lt;/tt&amp;gt;. The VFS cache still operates — files are downloaded once on first access and served from local disk on all subsequent reads:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount-sdshd --read-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ML training and read-intensive jobs ==&lt;br /&gt;
&lt;br /&gt;
If your job reads the same files many times (training epochs, iterative algorithms, multi-pass analysis), set a Weka workspace as &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;. rclone downloads each file on first access; every subsequent read is served from Weka without any WAN traffic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ws_find mywsname      # e.g. /work/classic/fr_abc123456-mywsname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# In ~/.config/sdshd/config:&lt;br /&gt;
cache_dir  = /work/classic/fr_abc123456-mywsname&lt;br /&gt;
cache_size = 2T&lt;br /&gt;
cache_age  = 120h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first epoch downloads from SDS@hd. Every subsequent epoch reads from Weka — no WAN traffic, no gateway load.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The cache is per-node. Each node in a job array downloads its own copy. For job arrays where all tasks need the same files, use &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; to pre-stage once instead (see below).&lt;br /&gt;
&lt;br /&gt;
== Shared dataset across many jobs ==&lt;br /&gt;
&lt;br /&gt;
If many job array tasks need to read the same files, rclone VFS cannot share a cache — concurrent mounts against the same cache directory will corrupt it, even with &amp;lt;tt&amp;gt;--read-only&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The solution: copy the dataset once to a Weka workspace, then have all jobs read from the Weka path directly as a plain filesystem — no FUSE mount, no per-job downloads:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Step 1 (once, on login node): copy dataset from SDS@hd to Weka&lt;br /&gt;
ws_allocate mydata 30&lt;br /&gt;
rclone copy sdshd-sftp:inputdata/ $(ws_find mydata)/inputdata/ \&lt;br /&gt;
    --progress --transfers 8 --sftp-concurrency 8 --sftp-chunk-size 255k&lt;br /&gt;
&lt;br /&gt;
# Step 2: reference the Weka path in your job script (no --gres=sdshd needed)&lt;br /&gt;
INPUT_DIR=$(ws_find mydata)/inputdata&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--sftp-chunk-size 255k&amp;lt;/tt&amp;gt; increases the SFTP packet size from 32 KB (default) to 255 KB (OpenSSH&#039;s maximum), which reduces protocol overhead and significantly improves throughput for large files. Use this flag with explicit &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; commands — it has no effect on the FUSE mount and should not be placed in &amp;lt;tt&amp;gt;extra_opts&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
All tasks read from Weka at full speed with zero WAN traffic and zero gateway load. Re-run &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt; if the source data changes — it skips unchanged files.&lt;br /&gt;
&lt;br /&gt;
= Known Limitations =&lt;br /&gt;
&lt;br /&gt;
== Symlinks are not preserved ==&lt;br /&gt;
&lt;br /&gt;
rclone&#039;s SFTP backend does not store symlinks on the remote. When rclone uploads a symlink (through the FUSE mount or via &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt;), it follows the link and uploads the target&#039;s content as a regular file. The symlink itself is lost.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Situation&lt;br /&gt;
! What happens&lt;br /&gt;
|-&lt;br /&gt;
| Symlink to a regular file&lt;br /&gt;
| Target file is uploaded; symlink metadata is lost&lt;br /&gt;
|-&lt;br /&gt;
| Symlink to a directory&lt;br /&gt;
| Directory tree is traversed; contents are uploaded recursively&lt;br /&gt;
|-&lt;br /&gt;
| Dangling symlink (target missing)&lt;br /&gt;
| Transfer error or silently skipped&lt;br /&gt;
|-&lt;br /&gt;
| Restore from SDS@hd&lt;br /&gt;
| Regular files/directories — original symlinks are gone&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Workarounds:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Archive before upload:&#039;&#039;&#039; &amp;lt;tt&amp;gt;tar -czf env.tar.gz myenv/&amp;lt;/tt&amp;gt; — preserves all symlinks inside the archive. Unpack after download to restore the original structure.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;tt&amp;gt;rclone copy --links&amp;lt;/tt&amp;gt;:&#039;&#039;&#039; encodes symlinks as &amp;lt;tt&amp;gt;.rclonelink&amp;lt;/tt&amp;gt; text files on the remote. Only works for &amp;lt;tt&amp;gt;rclone copy&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;rclone sync&amp;lt;/tt&amp;gt; workflows (not the FUSE VFS mount). Requires &amp;lt;tt&amp;gt;--links&amp;lt;/tt&amp;gt; on both the copy and the restore.&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;tt&amp;gt;SSH_FX_FAILURE&amp;lt;/tt&amp;gt; during upload ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Most common cause: storage quota exhausted.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SDS@hd enforces a hard quota per project. When full, the server rejects all writes. Check your quota first:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone about sdshd-sftp:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the quota is full, delete or archive old data on SDS@hd before retrying.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secondary cause: gateway overload from large job arrays.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
100 tasks × 16 SFTP connections = 1600 simultaneous connections to &amp;lt;tt&amp;gt;lsdf02-sshfs&amp;lt;/tt&amp;gt;. The gateway may reject new connections under this load. Reduce &amp;lt;tt&amp;gt;sftp_concurrency&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;~/.config/sdshd/config&amp;lt;/tt&amp;gt;, or bypass the FUSE mount entirely for bulk transfers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rclone copy /local/results/ sdshd-sftp:results/ \&lt;br /&gt;
    --transfers 4 --sftp-concurrency 8 --sftp-chunk-size 255k --progress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the default &amp;lt;tt&amp;gt;/tmp&amp;lt;/tt&amp;gt; cache, resuming requires submitting a new job to the exact same compute node — not generally practical — and the cache is gone after a node reboot regardless. With a Weka workspace as &amp;lt;tt&amp;gt;cache_dir&amp;lt;/tt&amp;gt;, the cache survives both job end and node reboots; the key advantage is that you can copy the data out manually without needing a job on that node at all, as described in [[#Persistent_cache_on_Weka|Persistent cache on Weka]].&lt;br /&gt;
&lt;br /&gt;
== Job stuck in &amp;lt;tt&amp;gt;CG&amp;lt;/tt&amp;gt; (COMPLETING) for a long time ==&lt;br /&gt;
&lt;br /&gt;
The Slurm epilog waits for rclone to finish uploading all pending data. For large output files this can take minutes — this is expected and safe. The job will exit on its own once all uploads are confirmed complete. There is nothing to do.&lt;/div&gt;</summary>
		<author><name>M Janczyk</name></author>
	</entry>
</feed>