Singularity in Windows Subsystem for Linux

683 views
Skip to first unread message

Steffen Bollmann

unread,
Apr 11, 2018, 10:50:57 PM4/11/18
to singularity
Dear singularity developers,

I wondered if there is a way of getting singularity to work in the Windows Subsystem for Linux? Installing is fine, but when trying to run something I get:
singularity -d shell CAIsr-qsm-v1.2.3-latest.simg
Enabling debugging
Ending argument loop
Singularity version: 2.4.5-dist
Exec'ing: /usr/lib/x86_64-linux-gnu/singularity/cli/shell.exec
Evaluating args: 'CAIsr-qsm-v1.2.3-latest.simg'
VERBOSE [U=0,P=45]         message_init()                            Set messagelevel to: 5
DEBUG   [U=0,P=45]         fd_cleanup()                              Cleanup file descriptor table
VERBOSE [U=0,P=45]         singularity_config_parse()                Initialize configuration file: /etc/singularity/singularity.conf
DEBUG   [U=0,P=45]         singularity_config_parse()                Starting parse of configuration file /etc/singularity/singularity.conf
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key allow setuid = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key max loop devices = '256'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key allow pid ns = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key config passwd = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key config group = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key config resolv_conf = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key mount proc = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key mount sys = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key mount dev = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key mount devpts = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key mount home = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key mount tmp = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key mount hostfs = 'no'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key bind path = '/etc/localtime'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key bind path = '/etc/hosts'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key user bind control = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key enable overlay = 'try'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key mount slave = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key sessiondir max size = '16'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key allow container squashfs = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key allow container extfs = 'yes'
VERBOSE [U=0,P=45]         singularity_config_parse()                Got config key allow container dir = 'yes'
DEBUG   [U=0,P=45]         singularity_config_parse()                Finished parsing configuration file '/etc/singularity/singularity.conf'
VERBOSE [U=0,P=45]         singularity_registry_init()               Initializing Singularity Registry
VERBOSE [U=0,P=45]         singularity_registry_set()                Adding value to registry: 'LIBEXECDIR' = '/usr/lib/x86_64-linux-gnu'
DEBUG   [U=0,P=45]         singularity_registry_set()                Returning singularity_registry_set(libexecdir, /usr/lib/x86_64-linux-gnu) = 0
VERBOSE [U=0,P=45]         singularity_registry_set()                Adding value to registry: 'COMMAND' = 'shell'
DEBUG   [U=0,P=45]         singularity_registry_set()                Returning singularity_registry_set(COMMAND, shell) = 0
VERBOSE [U=0,P=45]         singularity_registry_set()                Adding value to registry: 'MESSAGELEVEL' = '5'
DEBUG   [U=0,P=45]         singularity_registry_set()                Returning singularity_registry_set(MESSAGELEVEL, 5) = 0
VERBOSE [U=0,P=45]         singularity_registry_set()                Adding value to registry: 'VERSION' = '2.4.5-dist'
DEBUG   [U=0,P=45]         singularity_registry_set()                Returning singularity_registry_set(version, 2.4.5-dist) = 0
VERBOSE [U=0,P=45]         singularity_registry_set()                Adding value to registry: 'LOCALSTATEDIR' = '/var/lib'
DEBUG   [U=0,P=45]         singularity_registry_set()                Returning singularity_registry_set(localstatedir, /var/lib) = 0
VERBOSE [U=0,P=45]         singularity_registry_set()                Adding value to registry: 'SYSCONFDIR' = '/etc'
DEBUG   [U=0,P=45]         singularity_registry_set()                Returning singularity_registry_set(sysconfdir, /etc) = 0
VERBOSE [U=0,P=45]         singularity_registry_set()                Adding value to registry: 'BINDIR' = '/usr/bin'
DEBUG   [U=0,P=45]         singularity_registry_set()                Returning singularity_registry_set(bindir, /usr/bin) = 0
VERBOSE [U=0,P=45]         singularity_registry_set()                Adding value to registry: 'IMAGE' = 'CAIsr-qsm-v1.2.3-latest.simg'
DEBUG   [U=0,P=45]         singularity_registry_set()                Returning singularity_registry_set(IMAGE, CAIsr-qsm-v1.2.3-latest.simg) = 0
DEBUG   [U=0,P=45]         singularity_registry_get()                Returning NULL on 'HOME'
DEBUG   [U=0,P=45]         singularity_registry_get()                Returning NULL on 'TARGET_UID'
DEBUG   [U=0,P=45]         singularity_registry_get()                Returning NULL on 'TARGET_GID'
DEBUG   [U=0,P=45]         singularity_priv_init()                   Initializing user info
DEBUG   [U=0,P=45]         singularity_priv_init()                   Set the calling user's username to: uqsbollm
DEBUG   [U=0,P=45]         singularity_priv_init()                   Marking uinfo structure as ready
DEBUG   [U=0,P=45]         singularity_priv_init()                   Obtaining home directory
VERBOSE [U=0,P=45]         singularity_priv_init()                   Set home (via getpwuid()) to: /home/uqsbollm
VERBOSE [U=0,P=45]         singularity_suid_init()                   Running SUID program workflow
VERBOSE [U=0,P=45]         singularity_suid_init()                   Checking program has appropriate permissions
VERBOSE [U=0,P=45]         singularity_suid_init()                   Checking configuration file is properly owned by root
VERBOSE [U=0,P=45]         singularity_suid_init()                   Checking if singularity.conf allows us to run as suid
DEBUG   [U=0,P=45]         singularity_config_get_bool_char_impl()   Called singularity_config_get_bool(allow setuid, yes)
DEBUG   [U=0,P=45]         singularity_config_get_value_impl()       Returning configuration value allow setuid='yes'
DEBUG   [U=0,P=45]         singularity_config_get_bool_char_impl()   Return singularity_config_get_bool(allow setuid, yes) = 1
DEBUG   [U=0,P=45]         singularity_registry_get()                Returning NULL on 'NOSUID'
VERBOSE [U=0,P=45]         singularity_priv_userns()                 Invoking the user namespace
DEBUG   [U=0,P=45]         singularity_config_get_bool_char_impl()   Called singularity_config_get_bool(allow user ns, yes)
DEBUG   [U=0,P=45]         singularity_config_get_value_impl()       No configuration entry found for 'allow user ns'; returning default value 'yes'
DEBUG   [U=0,P=45]         singularity_config_get_bool_char_impl()   Return singularity_config_get_bool(allow user ns, yes) = 1
VERBOSE [U=0,P=45]         singularity_priv_userns()                 Not virtualizing USER namespace: running as SUID
DEBUG   [U=0,P=45]         singularity_priv_userns()                 Returning singularity_priv_init(void)
DEBUG   [U=0,P=45]         singularity_priv_drop()                   Dropping privileges to UID=1000, GID=1000 (12 supplementary GIDs)
DEBUG   [U=0,P=45]         singularity_priv_drop()                   Restoring supplementary groups
DEBUG   [U=1000,P=45]      singularity_priv_drop()                   Confirming we have correct UID/GID
DEBUG   [U=1000,P=45]      singularity_config_get_value_multi_impl() No configuration entry found for 'autofs bug path'; returning default value ''
VERBOSE [U=1000,P=45]      singularity_runtime_autofs()              No autofs bug path in configuration, skipping
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'DAEMON_START'
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'DAEMON_JOIN'
DEBUG   [U=1000,P=45]      singularity_daemon_init()                 Not joining a daemon, daemon join not set
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'WRITABLE'
VERBOSE [U=1000,P=45]      main()                                    Instantiating read only container image object
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning value from registry: 'IMAGE' = 'CAIsr-qsm-v1.2.3-latest.simg'
DEBUG   [U=1000,P=45]      singularity_image_init()                  Calling image_init for each file system module
DEBUG   [U=1000,P=45]      singularity_image_dir_init()              Opening file descriptor to directory: /home/uqsbollm/CAIsr-qsm-v1.2.3-latest.simg
DEBUG   [U=1000,P=45]      singularity_image_dir_init()              This is not a directory based image
DEBUG   [U=1000,P=45]      singularity_image_squashfs_init()         Checking if writable image requested
DEBUG   [U=1000,P=45]      singularity_image_squashfs_init()         Opening file descriptor to image: /home/uqsbollm/CAIsr-qsm-v1.2.3-latest.simg
VERBOSE [U=1000,P=45]      singularity_image_squashfs_init()         Checking that file pointer is a Singularity image
DEBUG   [U=1000,P=45]      singularity_image_squashfs_init()         Checking for magic in the top of the file
VERBOSE [U=1000,P=45]      singularity_image_squashfs_init()         File is a valid SquashFS image
DEBUG   [U=1000,P=45]      singularity_image_init()                  got image_init type for squashfs
DEBUG   [U=1000,P=45]      singularity_config_get_bool_char_impl()   Called singularity_config_get_bool(allow container squashfs, yes)
DEBUG   [U=1000,P=45]      singularity_config_get_value_impl()       Returning configuration value allow container squashfs='yes'
DEBUG   [U=1000,P=45]      singularity_config_get_bool_char_impl()   Return singularity_config_get_bool(allow container squashfs, yes) = 1
DEBUG   [U=1000,P=45]      singularity_config_get_value_impl()       No configuration entry found for 'limit container paths'; returning default value 'NULL'
DEBUG   [U=1000,P=45]      singularity_config_get_value_impl()       No configuration entry found for 'limit container owners'; returning default value 'NULL'
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'DAEMON_JOIN'
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'CLEANUPDIR'
VERBOSE [U=1000,P=45]      singularity_registry_set()                Adding value to registry: 'CLEANUPD_FD' = '-1'
DEBUG   [U=1000,P=45]      singularity_registry_set()                Returning singularity_registry_set(CLEANUPD_FD, -1) = 0
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'DAEMON_JOIN'
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'NOSESSIONCLEANUP'
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'NOCLEANUP'
DEBUG   [U=1000,P=45]      singularity_cleanupd()                    Not running a cleanup thread, no 'SINGULARITY_CLEANUPDIR' defined
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'DAEMON_JOIN'
DEBUG   [U=1000,P=45]      singularity_runtime_ns()                  Calling: _singularity_runtime_ns_ipc()
DEBUG   [U=1000,P=45]      singularity_config_get_bool_char_impl()   Called singularity_config_get_bool(allow ipc ns, yes)
DEBUG   [U=1000,P=45]      singularity_config_get_value_impl()       No configuration entry found for 'allow ipc ns'; returning default value 'yes'
DEBUG   [U=1000,P=45]      singularity_config_get_bool_char_impl()   Return singularity_config_get_bool(allow ipc ns, yes) = 1
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'UNSHARE_IPC'
VERBOSE [U=1000,P=45]      singularity_runtime_ns_ipc()              Not virtualizing IPC namespace on user request
DEBUG   [U=1000,P=45]      singularity_runtime_ns()                  Calling: _singularity_runtime_ns_pid()
DEBUG   [U=1000,P=45]      singularity_config_get_bool_char_impl()   Called singularity_config_get_bool(allow pid ns, yes)
DEBUG   [U=1000,P=45]      singularity_config_get_value_impl()       Returning configuration value allow pid ns='yes'
DEBUG   [U=1000,P=45]      singularity_config_get_bool_char_impl()   Return singularity_config_get_bool(allow pid ns, yes) = 1
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'UNSHARE_PID'
VERBOSE [U=1000,P=45]      singularity_runtime_ns_pid()              Not virtualizing PID namespace on user request
DEBUG   [U=1000,P=45]      singularity_runtime_ns()                  Calling: _singularity_runtime_ns_net()
DEBUG   [U=1000,P=45]      singularity_registry_get()                Returning NULL on 'UNSHARE_NET'
VERBOSE [U=1000,P=45]      singularity_runtime_ns_net()              Not virtualizing network namespace on user request
DEBUG   [U=1000,P=45]      singularity_runtime_ns()                  Calling: _singularity_runtime_ns_mnt()
DEBUG   [U=1000,P=45]      singularity_config_get_bool_char_impl()   Called singularity_config_get_bool(mount slave, yes)
DEBUG   [U=1000,P=45]      singularity_config_get_value_impl()       Returning configuration value mount slave='yes'
DEBUG   [U=1000,P=45]      singularity_config_get_bool_char_impl()   Return singularity_config_get_bool(mount slave, yes) = 1
DEBUG   [U=1000,P=45]      singularity_priv_escalate()               Temporarily escalating privileges (U=1000)
DEBUG   [U=0,P=45]         singularity_priv_escalate()               Clearing supplementary GIDs.
DEBUG   [U=0,P=45]         singularity_runtime_ns_mnt()              Virtualizing FS namespace
DEBUG   [U=0,P=45]         singularity_runtime_ns_mnt()              Virtualizing mount namespace
DEBUG   [U=0,P=45]         singularity_priv_drop()                   Dropping privileges to UID=1000, GID=1000 (12 supplementary GIDs)
DEBUG   [U=0,P=45]         singularity_priv_drop()                   Restoring supplementary groups
DEBUG   [U=1000,P=45]      singularity_priv_drop()                   Confirming we have correct UID/GID
DEBUG   [U=1000,P=45]      singularity_runtime_ns_mnt()              Making mounts slave
ERROR   [U=1000,P=45]      singularity_runtime_ns_mnt()              Could not make mountspaces slave: Invalid argument
ABORT   [U=1000,P=45]      singularity_runtime_ns_mnt()              Retval = 255

Thank you for your thoughts on this
Best
Steffen

David Trudgian

unread,
Apr 11, 2018, 11:01:02 PM4/11/18
to singu...@lbl.gov

Hi Steffen,

Currently the Windows Subsystem for Linux does not support some of the system calls that Singularity requires in order to start containers. Since WSL is not running Linux applications in a Virtual Machine, but instead implements a layer translating from Linux system calls to Windows concepts, some low level functionality does not quite translate yet. There has been a progression in new Windows 10 builds adding more and more features - It's on our radar to monitor this, and look at it in more depth.

Cheers,

Dave Trudgian
--
You received this message because you are subscribed to the Google Groups "singularity" group.
To unsubscribe from this group and stop receiving emails from it, send an email to singularity...@lbl.gov.

David Godlove

unread,
Apr 11, 2018, 11:15:23 PM4/11/18
to singu...@lbl.gov
Hi Steffen,

I have not studied this issue extensively, but I can tell you what I think to be true.  Hopefully someone else can jump in and correct me if anything I say is inaccurate.  

First, as far as I know, the Linux subsystem running on Windows shares the same kernel as the host operating system.  So while it appears to be Linux, it's really running on a Windows kernel.  The Windows operating system is fundamentally different from the Linux operating system in many ways.  As it relates to containers, here are the important points:

1.  The Windows kernel has no concept of namespaces.
2.  The Windows kernel has no concept of mounting a file system directly to another file system.

These concepts are central to containers.  So I don't think that Singularity (or any other type of container) is going to run natively on the Linux subsystem in Windows anytime soon.

But there is still hope for Singularity on Windows.  Check out this blog post that was just released today.


Dave

--
You received this message because you are subscribed to the Google Groups "singularity" group.
To unsubscribe from this group and stop receiving emails from it, send an email to singularity+unsubscribe@lbl.gov.

Reply all
Reply to author
Forward
0 new messages