Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Blockers for systemd? #994

Open
fpqc opened this Issue Aug 27, 2016 · 58 comments

Comments

Projects
None yet
@fpqc
Copy link

commented Aug 27, 2016

For various reasons, it isn't obvious to me exactly how to determine what features are missing from WSL's implementation in order to get something like systemd up and running. From the documentation, we know for sure that WSL does not yet implement any of the syscalls related to cgroups, and doesn't include any of the kernel namespaces, which is probably a blocker at the moment. Are there any other missing syscalls or socket options that would block systemd from running?

I also am attaching the output of
strace systemd --test

systemd-trace.txt

(using the docker image of Ubuntu yakkety installed with RoliSoft's python script)

Also, I know that WSL currently uses a kind of hardcoded init process (which sets up the network interfaces, remakes the /etc/hosts file, does some other stuff, then (I think) forks /bin/bash by default). Would the whole initialization process need to be rewritten from scratch to use systemd as the init, assuming all of the other dependencies were eventually implemented (cgroups, aforementioned missing syscalls and socket options)?

@iz0eyj

This comment has been minimized.

Copy link

commented Aug 27, 2016

Something in this old thread ( @jackchammons ), but it seems that WSL (and all the Win10 kernel design) is a Top Secret. :)
https://blogs.msdn.microsoft.com/wsl/2016/06/08/wsl-system-calls/

@rodrymbo

This comment has been minimized.

Copy link

commented Aug 27, 2016

Considering how open the Devs have been hereabouts, I'd say the issue isn't so much "keeping it secret" as "it's a moving target".

I don't think it will take too long for the Devs to figure out that what they are presenting to us is "single-user, console". To a Linux person it is like Safe Mode is to a Windows person. Yes you can do stuff in Safe Mode, and sometimes you are amazed that it even works at all, but it's not the same as running Windows, just as running WSL without cron or syslog or sshd or a terminal emulator (what we have got is sort of a console emulator) and other servers/daemons/background tasks, is not the same as running an Ubuntu developer machine.

I can be happy without upstart/init/systemd running everything that comes with a fresh Ubuntu install. But the things I work on generally do logging to syslog, and don't have an option for logging to a file; so trying to work on them without rsyslogd is quite difficult. It's nice to be able to run a bash script from a shell prompt, but what would be nicer is being able to run a few from cron, to automate things. And so forth.

So let's see if we can figure out what is blocking systemd, but I'd guess that when the Devs decide it's something they need to implement, they'll figure out a way.

@fpqc

This comment has been minimized.

Copy link
Author

commented Aug 27, 2016

@rodrymbo I'm just interested for my own curiosity. Like, is the main blocker just cgroups, or is it something more difficult? Like, is WSL architected in such a way that its init process needs to be a special one generated by MS, or did they just make a stripped-down init process because they haven't implemented cgroups and didn't want to bother supporting upstart when they knew it was already obsolete?

Basically, I want to compare against this:
Gentoo Kernel Options for Systemd

Aside from cgroups, the requirements don't seem that crazy to emulate. I don't see the specific syscalls mentioned in that guide listed in the list of supported syscalls for WSL, but on the face of it, you need cgroups, "open by fhandle syscalls", eventpoll syscall, signalfd syscall, and timerfd syscall. The rest of the requirements appear to be things that are at various stages of implementation.

P.S. Mercifully, it looks like the Redhat devs have given up for now on pushing things like dbus into the kernel for the forseeable future (there was a big blowout on the kernel.org mailing list over kdbus, and kdbus was dropped from Fedora Rawhide a bit later).

@iz0eyj

This comment has been minimized.

Copy link

commented Aug 27, 2016

@fpqc init, upstart etc etc requires a continuous operation; in this moment WSL exists only when calling bash ... perhaps in the future will be different ... (?)
I think now you could only simulate an init or an upstart, but does not implement them really (emulate them)
for system calls I think that certain things cannot be implemented (emulated) because WSL is not a standalone operating system, but I see no reason why they cannot be simulated at least providing a dummy response.
I think the reason is only the young age of WSL, just a few months, but at the end we will have a very close to the "true" Linux.

Sorry for my bad English.

@fpqc

This comment has been minimized.

Copy link
Author

commented Aug 27, 2016

@iz0eyj That's not true, do
$ ps -A

You will see that the init daemon is running at pid 1.

@rodrymbo

This comment has been minimized.

Copy link

commented Aug 27, 2016

@fpqc - The Microsoft init (/init, rather than /sbin/init or whatever) is definitely proprietary. It and any other parts of the WSL environment are probably written to meet the bare minimum for whatever requirements they thought would be needed. If the Devs decided they needed cgroups, it will be there, and if they didn't, it probably won't. :P

Not saying you shouldn't be curious, or that trying to figure it out based on clues might not provide an interesting way to pass time.

It looks to me as though they could implement most of a whole linux userland system if they wanted, and much more of the rest of the system, by which I mean to a user everything would work as expected including services. So the issue will likely be how much of that can users like us convince them (in Uservoice or whatever) is worthwhile.

@iz0eyj - right now, most of what you describe is happening: when Bash.exe runs, init is running (apparently launched or managed from svchost.exe or lxssmanager or something). No, it doesn't start when Windows starts (yet) but neither does each Bash.exe console start another init. And yes, it does stop (and tear down the environment) when the last Bash.exe is closed; but until that last Bash.exe closes, init is there, running along in the background. From my perspective, the tearing down of the linux environment is just a matter of the Devs requiring that the system "shutdown -h now" when the last Bash.exe closes. So in a sense, init is running continuously ... when the environment is running.

I agree that for many things it would be good enough for init (or whatever accepts system calls) to return dummy responses that satisfy whatever we are trying to run. For example, ifconfig could return what appear to be two devices, a loopback device and an ethernet device -- even though they don't really exist. (Or maybe there is a pseudo-device that would work without pretending to be a hardware adapter.) As long as networking works, I won't be too picky. I suppose someone will need a VPN, or more control over a tun/tap, and maybe that can come in the future.

@fpqc - For some things it is helpful to look in Process Explorer to see that init is running under a svchost.exe. What you see from ps -A (or ps -Af) could just be a different init in each different bash.exe console, but checking Process Explorer shows that it's the same one (or at least it appears to be) and it is running independently of Bash.exe (aside from being shutdown when the last Bash.exe exits).

@rodrymbo

This comment has been minimized.

Copy link

commented Aug 29, 2016

@fpqc - is there a reason for implementing systemd in WSL other than bragging rights? It looks to me like that would bring along a lot of baggage we might not need. Could we go to something closer to sysvinit or whatever for starting a few services, or would having systemd implemented give us a lot of benefits I'm not seeing?

@cerebrate

This comment has been minimized.

Copy link

commented Oct 9, 2016

For myself, I would like to be able to run systemd not to replace the WSL init, but because being able to start a pseudo-init with systemd --system --unit=foo.target would be a convenient way to start and subsequently manage a set of services/daemons required for a particular development, etc., configuration. By having multiple .target configuration files, that way systemd could be used to set up whatever service-set happened to be needed for a given session in a suitably Linuxy way.

(And, I suppose, those who want services running all the time could put bash.exe -c /bin/systemd into a startup shortcut, but that's just gravy compared to the convenient start-and-manage service functionality that'd come out of it.)

((I added a uservoice request for this here, BTW: https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/16571479-support-for-running-systemd .))

@schmitch

This comment has been minimized.

Copy link

commented Apr 7, 2017

Well this future would be great to use PostgreSQL or MySQL in Xenial instead of the Windows Installer.
Which would be really really huge, especially if systemd would be invoked on Windows startup and not on bash Startup.

The creators update did many things right, but this would be extremly huge as well. The best thing would be that Windows would be clean and the Development environment can be trashed and cleaned really really easy.

@carwyn

This comment has been minimized.

Copy link

commented Jun 8, 2017

If the desire is to manage a set of services under WSL in a more "linuxy" way it may be worth generalizing this discussion to look at other light weight approaches of doing this. SysV init is one option but there are others that have been developed for more constrained environments that may be of interest for example:

I'd hazard a guess that systemd may be one of the trickier ones to implement let alone track.

I suspect the main motivation for WSL is twofold: for developer tools and for running containers. In both cases they tend to be single thing or chain/group of things per invocation.

@fpqc

This comment has been minimized.

Copy link
Author

commented Jun 8, 2017

@carwyn All of the distro devs with whom MS has announced support (Ubuntu, Redhat, and OpenSuse) are now firmly in the Systemd camp, and all of their package managers and packages assume systemd is running. MS does not want to maintain its own distribution of Linux userland for WSL. Presumably if they do make a switch over to systemd from WSL-init, there should be nothing stopping you from writing shellscripts to wrap the interop daemon to work with sysVinit scripts.

@carwyn

This comment has been minimized.

Copy link

commented Jun 8, 2017

@fpqc granted, although there is also a MS relationship with Docker although that seems more about container management rather than what's in them. Having said that Docker seem to be sniffing around Unikernels a lot.

@bugparty

This comment has been minimized.

Copy link

commented Nov 9, 2017

one of Ubuntu official develops says M$s intent is not a complete linux, its just something like chroot.

@seadonfrank

This comment has been minimized.

Copy link

commented Nov 14, 2017

You may want to try using Upstart to run and manage third-party services
Also, Follow me on linkedIn , I am going to publish an article very soon on WSL and running opensource project with WSL. Hopefully, it should give you a comprehensive guide while you start working with WSL

@therealkenc

This comment has been minimized.

Copy link
Collaborator

commented Dec 26, 2017

@kenshen112 writes in another issue:

...all .service files in wsl are by default located in the /lib folder mentioned above whilst they should be in the /etc equivalent.
...
...If the wsl team could move the file locations and fix permissions we might see systemd start.

The locations of those files are controlled by Canonical via the Debian systemd Maintainers via Freedesktop.org, not WSL. If you believe moving the file locations will help you could create a launchpad PPA for systemd.

My /etc/systemd/system looks alright enough on WSL. Which it does because it is just the stock Ubuntu image and systemd package. Could be missing something, but even if I am, that isn't the end of your voyage. Getting closer though (for some relative value of 'close`).

@kenshen112

This comment has been minimized.

Copy link

commented Dec 27, 2017

@therealkenc as far as I understand all .service files should be in /etc/systemed which most aren't and that's what causes the error as far as I can see if i execute the command in my post copying the files from there previous location to /etc/ it works aside from the permission's issue. if that's how conical has it by default though then I wonder if there's a symlink missing somewhere???

@therealkenc

This comment has been minimized.

Copy link
Collaborator

commented Dec 27, 2017

I haven't looked into systemd for a few months, and I am not sure why the .service entries you think might be missing aren't there. This is what mine looks like (unmodified) for what it is worth. But missing entries shouldn't cause systemd to fail (as far as it goes); it would just mean less services start. What methodology are you using to start systemd, if any? You are running systemctl status in #2787, but that is putting the horse before the cart because systemd isn't running per #2209 #1579.

@kenshen112

This comment has been minimized.

Copy link

commented Dec 27, 2017

so first off https://askubuntu.com/questions/894419/systemd-on-ubuntu-16-04-gives-no-such-interface-error one small example of the same problem / fix occurring in ubuntu 16.04
after I make the change my etc folder looks like https://pastebin.com/u3UkEeeH but now there's permission issues as previously stated.

sysctrl is a tool that allows one to create and manage service files used by systemd - the reason I said it could help us https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units it manages the stopping and starting of systemd services a key piece of what systemd does as a whole so whilst it might not fully fix systemd it'll give us some of the functionality of it at least for sysadmin's that's incredibly useful.

@fpqc

This comment has been minimized.

Copy link
Author

commented Dec 28, 2017

@kenshen112 no. Only changes or custom systemd unitfiles go into /etc/systemd.

default unitfiles belong in /usr/lib/systemd/system

Systemd provides tooling to build and store diffs of default unitfiles in your /etc/systemd/system as well as completely custom unitfiles.

@kenshen112

This comment has been minimized.

Copy link

commented Jul 13, 2018

If you guys are willing to consider an alternative option, https://www.reddit.com/r/bashonubuntuonwindows/comments/8xkko7/openrc_systemd_init_alternitve_starts_works/ OpenRC an alternative option works far better then systemd or init in the WSL it goes so far as to "boot" the kernel (or lack thereof in the WSL case) and start several key processes not the least of which is cron which after this functions absolutely perfectly as it should. udev and process requiring such however due to missing features in the WSL will not start so this alternative isn't perfect by any means and so far it seems only Ubuntu / Debian have packages which may or may not be an issue depending on how you'd implement this.

This also can start a slightly modified lxdm session that loads a desktop as it should. One final caveat is that this won't auto start by default but a clever usage of the windows task scheduler could alleviate that to some degree.

@therealkenc

This comment has been minimized.

Copy link
Collaborator

commented Jul 13, 2018

Yep the OpenRC scripts have basically worked since ever. The only thing that has changed in WSL recently is that once the daemons are started (via an OpenRC script or otherwise) they no longer die a horrible death when the last terminal is closed (since 17074).

isn't perfect by any means and so far it seems only Ubuntu / Debian have packages which may or may not be an issue

You can get a Debian-like (read: Ubuntu-like) experience with Devuan. Their whole schtick is removing the systemd goblins from Debian packages. On WSL the udev gaps can be worked-around by just configuring away those /etc/init.d/ tasks.

loads a desktop as it should

No one should load a desktop because that makes no kind of sense. But I digress.

In any case, the lxdm daemon is not specific/related to OpenRC anymore than say rsyslogd or apache2. That they run (or not as the case may be) isn't related to systemd or WSL's init. Doing a sudo openrc default does no more (and no less) than a shell script that calls a list of sudo service [some service] start from your stock WSL Ubuntu and (what you are calling) systemd.

@kenshen112

This comment has been minimized.

Copy link

commented Jul 13, 2018

With lxdm I understand that the point I was trying to make was the "shell script" that runs the service start works well enough that it can start a display manager as well as cron (which to my understanding though I could be totally misinformed has been a tough sucker in the past with WSL) Though I am curious what bars you guys from adding something like Udev support and what bars you guys from making this the defacto standard since it appears to be far more functional then systemd - if you would even call this a replacement for that even or is that up to the operating system manufacturer? I apologize for my ignorance and am simply curious.

@therealkenc

This comment has been minimized.

Copy link
Collaborator

commented Jul 13, 2018

Though I am curious what bars

Time, money.

you guys from adding something like Udev support

n.b. I am not those guys. Actually there hasn't been a single post in this thread from those guys because this is a navel-gazing discussion thread not a bug or feature request.

from making this the defacto standard

Because in this path of the space time continuum systemd ended up being the de-facto init system on the numerically most popular Desktop Linux distributions. MSFT has intended WSL to be distribution agnostic. You could always ask Canonical to ditch systemd for OpenRC. Or as I said you could run Devuan. But people (numerically) don't want to run Devuan. They expect the systemctl blah blah blah HOWTO they blindly copied off the Interwebs to work.

appears to be far more functional then systemd

It isn't. As I said, what you are doing is no more and no less functional than calling sudo /etc/init.d/something. Whether the daemons the scripts launch work or not isn't related MSFT's init or systemd or upstart or OpenRC's init. They're scripts. Daemons where the necessary syscall surface has been implemented run with varying levels of success. Those that don't, well, they don't.

@aleks-mariusz

This comment has been minimized.

Copy link

commented Jul 17, 2018

A tub in which wsl can splash around. I'll post code if I take it to the point of being consumer friendly. This is just first light.

@therealkenc been a while since you posted this; any chance you have (or could make) a quick write up for what you have already that might be the less friendly version, you know, for those who like to get their hands dirty with linux and don't need things that friendly? :-)

@therealkenc

This comment has been minimized.

Copy link
Collaborator

commented Jul 17, 2018

Yes it has been a while; I got sidetracked on a "what would it take" time-sink on nmap. I'll try to get back to systemd and will follow up if there is anything worth posting (friendly or otherwise).

@aleks-mariusz

This comment has been minimized.

Copy link

commented Jul 17, 2018

thanks.. coincidentally, nmap, systemd (and fuse) are actually the three most desired functionalities i would love to see (at least for me, but judging from the uservoice polls, for a lot of people).. so appreciate all the contributions so far!

@xOrMalware

This comment has been minimized.

Copy link

commented Oct 5, 2018

This is a load of rubbish. Microsoft announce a Linux subsystem. They announce you can use all these wonderful operating systems. But hey, we are not providing a systemd - and you have to sort these issues out for yourselves.

Sorry but that is simply an unacceptable position for a responsible Software Vendor to take (however, not surprising given its MS).

Either do or do not, but Microsoft should not badge this lovely container/runtime environment and then tell people tough luck, people have to change what they love about that environment.

It sounds much like Microsoft know they know that they cannot implement this feature, due to problems in the Windows, and are trying to move the community with them. Totally unacceptable.

As I said, either do or do not, there is not middle ground.

@garydwnldsKSC

This comment has been minimized.

Copy link

commented Oct 5, 2018

      This is a load of rubbish. Microsoft announce a Linux subsystem. They announce you can use all these wonderful operating systems. But hey, we are not providing a systemd - and you have to sort these issues out for yourselves.

Sorry but that is simply an unacceptable position for a responsible Software Vendor to take (however, not surprising given its MS).
Either do or do not, but Microsoft should not badge this lovely container/runtime environment and then tell people tough luck, people have to change what they love about that environment.
It sounds much like Microsoft know they know that they cannot implement this feature, due to problems in the Windows, and are trying to move the community with them. Totally unacceptable.
As I said, either do or do not, there is not middle ground.

There Is quite the middle ground. Provide a basic init system and let people make systemd wrappers for it. This is what is done for quite a few things - the only real blocker I can think of is the latest gnome 3 that requires full system (for god knows what reasons they want to tie it tighter). - we have systemd shims for many non-systemd distros to support everything you might need for the most part (except later versions of gnome3 which the reliance is boneheaded IMO, but that's neither here nor there. )

As for me, I use WSL for developing a lot of non-system embedded images and do NOT want to have to support systemd, as it would make WSL useless for me.

Do remember that it is possible to change the init and that the init does have some open source components to it, so you could implement it yourself, but a lot of the community does not want, need, or care about systemd for what WSL is targeted for - developers, and command line developers/tools at that. You don't dictate what the entire community wants - nor do I, and in this case, I disagree with you - non-systemd options are a requirement for me and many others.

Quite frankly, the replacement is more than possible - to quote an earlier post -

"Technically WSL /init isn't hardcoded right now (and never has been). WSL respects the init path specified in HKCU\Microsoft\Windows\CurrentVersion\lxss[gid]\KernelCommandLine along the lines of GRUB. The catch is we don't know right now the minimal requirements of init to make lxssmanager (and by extension wsl.exe) happy. I was going to look into it but never really got around before they made /init static.

In any case, there is no need to worry about WSL making some kind of unilateral move to systemd. If or when systemd is supported by WSL, every other init under the sun be it OpenRC or MSFT's home grown /init will be supported too. Because systemd depends on all the things."

Essentially, to deploy systemd, you have to implement into systemd what makes microsoft's init work with WSL, not the other way around, and every single function that systemd requires has to be supported/implemented by WSL. It's a long, long way to go but WSL already does everything it's advertised to do.

Microsoft made it work, and made it work well for many people's purposes and a lot of us are very happy with that. Yes, in some cases, even I to would like systemd support, but I make do with the shims when I need to - otherwise openSUSE wouldn't work properly on WSL.

@therealkenc

This comment has been minimized.

Copy link
Collaborator

commented Oct 5, 2018

Above way too verbose. From the FAQ:

Can I run ALL Linux apps in WSL?
No!

Which is kinda clear.

It sounds much like Microsoft know they know that they cannot implement this feature, due to problems in the Windows

MSFT knows they can implement this feature. I know this because I can implement this feature.

@sl1pkn07

This comment has been minimized.

Copy link

commented Dec 6, 2018

Sólo digo.

wsltub-first-light

any update of this?

@therealkenc

This comment has been minimized.

Copy link
Collaborator

commented Dec 6, 2018

any update of this?

No, I keep putting off making the concerted effort because (a) there have been hints and more hints the devs are working towards getting the necessary related pieces working, and (b) the problem isn't actually systemd per-se at this point (per screencap above). The problem is the next thing systemd is going to want to do is fire up stuff like systemd-logind, systemd-udevd, systemd-networkd, systemd-resolved and those exercise other largish gaps in the WSL ABI.

So... what would happen is... I post a systemd PoC and get an all-too-predictable "this sux" from the audience. Getting those things above limping (or just configuring them away) is "doable", mind - with effort. But without a roadmap to what the devs are actually working on (or not), duplicating the effort becomes less appealing as a time sink. The irony is if the devs had posted "we are never working on systemd it is totally out of scope" I probably would have worked on it harder. But realize: the fact they've never said anything like that is a good thing.

I'll post if I ever pick up banging on it some more. The interest is understood and appreciated.

@aparamon

This comment has been minimized.

Copy link

commented Jan 22, 2019

Systemd running as PID 1 is required for Snap.

@rdev5

This comment has been minimized.

Copy link

commented Feb 25, 2019

Sorry I'm late to the party at #2941 calling for OpenSUSE users, but I'm not much of an early adopter, you see, especially when it comes to Microsoft product (i.e. WSL).

As of today, the same error ("Failed to connect to bus: No such file or directory") is still seen for numerous systemd- related packages while running zypper update. This was during an initial attempt to upgrade the OpenSUSE 42.2 package distribution listed on Microsoft's Manually download Windows Subsystem for Linux distro packages page to Leap 42.3 following OpenSUSE's upgrade documentation here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.