DamionGans / ubuntu-wsl2-systemd-script

[Does not work anymore!] Script to enable systemd support on current Ubuntu WSL2 images
1.56k stars 383 forks source link

nsenter: cannot open /proc/320/ns/time: No such file or directory #36

Open jototland opened 4 years ago

jototland commented 4 years ago

I get this after running your script. nsenter: cannot open /proc/320/ns/time: No such file or directory

Luckily, I can "wsl -e bash --norc" and revert the changes to /etc/bash.bashrc. But what is wrong with my /proc since nsenter doesn't like it?

Windows version 19041.388 WSL 2 Pengwin

jototland commented 4 years ago

Ok, I tested again with ubuntu instead of pengwin, and the script worked just fine. I guess that might be the reason the script has ubuntu in it's name :-)

I would still like to make it work for pengwin, though...

khs1994 commented 4 years ago

https://github.com/DamionGans/ubuntu-wsl2-systemd-script/blob/4d221c4f9bf89187eee7cd7ee298e5344190b191/enter-systemd-namespace#L41

this error because nsenter CMD -a maybe include time namespaces, you can diff ubuntu and pengwin nsenter --help

The time namespace support has been merged in the 5.6 kernel.

eternalphane commented 4 years ago

Please see https://github.com/yuk7/ArchWSL2/issues/21#issuecomment-663981023

pablorq commented 3 years ago

TL;DR: Change options of nsenter from -a to -m -p

Thank you @eternalphane for the information, but this could be confusing for some people.

Based on that data, this is how to fix it:

USER_HOME="$(getent passwd | awk -F: '$1=="'"$SUDO_USER"'" {print $6}')"
if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
    if [ -n "$1" ] && [ "$1" != "bash --login" ] && [ "$1" != "/bin/bash --login" ]; then
        exec /usr/bin/nsenter -t "$SYSTEMD_PID" -m -p \
            /usr/bin/sudo -H -u "$SUDO_USER" \
            /bin/bash -c 'set -a; [ -f "$HOME/.systemd-env" ] && source "$HOME/.systemd-env"; set +a; exec bash -c '"$(printf "%q" "$@")"
    else
        exec /usr/bin/nsenter -t "$SYSTEMD_PID" -m -p \
            /bin/login -p -f "$SUDO_USER" \
            $([ -f "$USER_HOME/.systemd-env" ] && /bin/cat "$USER_HOME/.systemd-env" | xargs printf ' %q')
    fi
    echo "Existential crisis"
    exit 1
fi
gskm commented 3 years ago

Worket on Debian 11 release! Thank you!

s4pfyr commented 3 years ago

Thanks @pablorq ! This was needed for me to get in working on WSL2+Ubuntu after release upgrade to 21.04!

pablorq commented 3 years ago

I'm glad it helps!

:slightly_smiling_face:

hyoretsu commented 3 years ago

@s4pfyr How exactly did you do it? After upgrading, mine started throwing Failed to enable unit: Transport endpoint is not connected (Docker) and nsenter: cannot open /proc/9286/ns/time: No such file or directory when running exec sudo nsenter -m -u -i -n -p -C -r -w -t $(pidof -s systemd) -a su - $LOGNAME

This was messy for me before, so I enabled systemd by doing this

sudo apt-get install -yqq daemonize dbus-user-session fontconfig
sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
s4pfyr commented 3 years ago

@hyoretsu I did not have the nsenter problem after switching the flags like @pablorq suggested. Regarding docker: I had problems with iptables and needed to do sudo update-alternatives --config iptables and select legancy mode. Try starting the docker daemon with sudo dockerd --debug to figure out whats going on with docker.

ghost commented 2 years ago

I'm even unable to run the install script with --force:

nsenter: cannot open /proc/830/ns/time: No such file or directory

hyoretsu commented 2 years ago

I'm even unable to run the install script with --force:

nsenter: cannot open /proc/830/ns/time: No such file or directory

There are two commands, they each work in different cases: exec sudo nsenter -m -u -i -n -p -C -r -w -t $(pidof systemd) -a su - $LOGNAME exec sudo nsenter -m -u -i -n -p -C -r -w -t $(pidof systemd) -m -p su - $LOGNAME (just noticed mp being repeated, might not be necessary)

If that doesn't work, I believe you need to do it manually

I managed to successfully update to 21.10 btw https://github.com/microsoft/WSL/issues/5126#issuecomment-1001240706

ghost commented 2 years ago

ok so have I understood it correctly. I need to replace the LOGNAME with my home user name and pidof systemd. But how can I find the PID of systemd if systemd doesnt work? (Or even if it works)

hyoretsu commented 2 years ago

ok so have I understood it correctly. I need to replace the LOGNAME with my home user name and pidof systemd. But how can I find the PID of systemd if systemd doesnt work? (Or even if it works)

top systemd/htop systemd though keep in mind that the PID changes sometimes.

IgorOhrimenko commented 2 years ago

I try

wsl bash --norc
nsenter: cannot open /proc/26/ns/time: No such file or directory

it does not work, but

wsl --exec /usr/bin/sh
$

work and then I used @pablorq's method.

PinkSerenity commented 2 years ago

I successfully changed enter-systemd-namespace, but even after reinstalling the script I get the same error. What am I supposed to do?

IgorOhrimenko commented 2 years ago

Check your the endfile /usr/sbin/enter-systemd-namespace, if need change it.

PinkSerenity commented 2 years ago

Apparently, changing it before rebooting (so before the error happens) and not reinstalling the script as opposed to what @pablorq suggested works like a charm (at least for me). Thank you all very much.

eitanmiz commented 2 years ago

As I seen in: https://www.csa.iisc.ac.in/~vg/teaching/E0-256/slides/lxc-slide-deck.pdf /proc/pid/ns/time is new, so I think that there may be patch for update, or just downgrade some services.

Also: when running: lsns -l, you should see the namespaces list for linux kernel. If you cannot see 'time', then you should provide support them.

For me - I don't know how can I downgrade the version, and which one? (Or running a new patch), but I presume this can be solved by simple commands.

DataMadeEEZY commented 2 years ago

I ran this script ( ubuntu-wsl2-systemd-script) originally but did not have success. So I waited for upgrade to 22.04 like most suggested and after upgrading I run into this error: nsenter: cannot open /proc/27/ns/time: No such file or directory

[process exited with code 1 (0x00000001)]

wsl -e /usr/libexec/nslogin /bin/bash in command prompt allows me to the enter the terminal. How can I get my linux terminal to open without error now?

Pflegusch commented 2 years ago

Thanks @pablorq, worked for me!

apos commented 2 years ago

Hi there,

I updated from Ubuntu 20.04 to 22.04 via console (do-release-upgrade).

Unfortunately the solution of @pablorq only works partly. The system starts now, but only it is not possible to login as normal user. wsl -u root works totally fine and I can login. Systemd runs fine.

root@MADAGASKAR:/mnt/c/Users/myuser# ps aux | grep systemd
root          43  0.0  0.0   6140   932 ?        Ss   21:05   0:00 /usr/bin/unshare --fork --pid --mount-proc bash -c export container=wsl; mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc; exec /lib/systemd/systemd --unit=basic.target
root          45 99.4  0.0  21940 11544 ?        Rs   21:05   1:37 /lib/systemd/systemd --unit=basic.target
root          93 32.8  0.9 187216 147168 ?       S<s  21:05   0:32 /lib/systemd/systemd-journald
root         119  0.2  0.0  22820  6136 ?        Ss   21:05   0:00 /lib/systemd/systemd-udevd
systemd+     140  0.0  0.0  16064  6548 ?        Ss   21:05   0:00 /lib/systemd/systemd-networkd
root         305  0.0  0.0  11992  5704 pts/1    Ss+  21:06   0:00 sudo /usr/sbin/enter-systemd-namespace
root         314  0.0  0.0  11992   884 pts/2    Ss   21:06   0:00 sudo /usr/sbin/enter-systemd-namespace
root         315  0.0  0.0   7740  3556 pts/2    S+   21:06   0:00 /bin/bash --norc /usr/sbin/enter-systemd-namespace
root         319  0.0  0.0   7740  1572 pts/2    S+   21:06   0:00 /bin/bash --norc /usr/sbin/enter-systemd-namespace
root         323  0.0  0.0   6868  2376 pts/0    S+   21:06   0:00 grep --color=auto systemd

tail -f /var/log/syslog gives

systemd-fstab-generator[14]: Failed to create unit file /run/systemd/generator/-.mount, as it already exists. Duplicate entry in /etc/fstab?
systemd-sysv-generator[22]: Failed to create unit file /run/systemd/generator.late/hddtemp.service: File exists
systemd-sysv-generator[22]: Failed to create unit file /run/systemd/generator.late/apport.service: File exists
systemd-journald[32]: File /var/log/journal/cad812440ce02ca8f59723955f259f43/system.journal corrupted or uncleanly shut down, renaming and replacing.
systemd-journald[32]: Failed to read journal file /var/log/journal/cad812440ce02ca8f59723955f259f43/user-1000.journal for rotation, trying to move it out of the way: Device or resource busy
systemd-journald[32]: Failed to read journal file /var/log/journal/cad812440ce02ca8f59723955f259f43/user-1000.journal for rotation, trying to move it out of the way: Device or resource busy

File system is not full (332G free):

 Dateisystem    Größe Benutzt Verf.     Verw% Eingehängt auf
 /dev/sdc          251G   88G      151G   37%      /
 drvfs                953G   621G     332G   66%     /mnt/c

After login (myuser is my sudo user):

PS C:\Users\myuser> wsl -u myuser
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.10.102.1-microsoft-standard-WSL2 x86_64)
[...]
System information as of Do 12. Mai 20:39:56 CEST 2022
System load:  1.38037109375       Processes:             11
Usage of /:   35.5% of 250.98GB   Users logged in:       0
Memory usage: 2%                  IPv4 address for eth0: 172.21.148.45
Swap usage:   0%

Letzte Anmeldung: Donnerstag, 12. Mai 2022, 20:35:47 CEST auf pts/0

Login nach 60 Sekunden wegen 
Zeitüberschreitung abgebrochen.
# Login canceld after 60 seconds

What I found: the variable $HOME_USER which is used in /usr/sbin/enter-systemd-namespace is empty, if used in shell.

That#s why getent passwd | awk -F: '$1=="'"$SUDO_USER"'" {print $6}'returns nothing.

I also tried to "trick" the script by setting the user and users home manually ...

# USER_HOME="$(getent passwd | awk -F: '$1=="'"$SUDO_USER"'" {print $6}')"
export USER_HOME="/home/myuser"
export SUDO_USER="myuser"

... also here: the sytem starts, but login with normal user (!) is canceled after 60 seconds without success.

With the last method, $HOME/.systemd-env is created correct:

root@MADAGASKAR:/home/apos# cat .systemd-env
DISPLAY=":0"
HOSTTYPE="x86_64"
PULSE_SERVER="/mnt/wslg/PulseServer"
PWD="/home/apos"
TERM="xterm-256color"
WAYLAND_DISPLAY="wayland-0"
WSLENV="WT_SESSION:BASH_ENV/u:WT_PROFILE_ID"
WSL_DISTRO_NAME="Ubuntu-20.04"
WSL_INTEROP="/run/WSL/1027_interop"
WT_PROFILE_ID="{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}"
WT_SESSION="b342d5dc-46b4-4253-a7ac-df7a4d0a6f7b"
XDG_RUNTIME_DIR="/mnt/wslg/runtime-dir"

If I edit /etc/bash.bashrc and alter the first line to [ "$USER" == "root" ] && source /usr/sbin/start-systemd-namespace

start wsl -u root once, so systemd is running - I can start alls apps via Startmenü. Also Xterm.

Any idea?

Cheers Axel

alanmburr commented 2 years ago

TL;DR: Change options of nsenter from -a to -m -p

This works perfectly after using do-release-upgrade to 21.10 Impish. No need to reinstall though, that made it break again for me.

decli commented 2 years ago
USER_HOME="$(getent passwd | awk -F: '$1=="'"$SUDO_USER"'" {print $6}')"
if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
    if [ -n "$1" ] && [ "$1" != "bash --login" ] && [ "$1" != "/bin/bash --login" ]; then
        exec /usr/bin/nsenter -t "$SYSTEMD_PID" -m -p \
            /usr/bin/sudo -H -u "$SUDO_USER" \
            /bin/bash -c 'set -a; [ -f "$HOME/.systemd-env" ] && source "$HOME/.systemd-env"; set +a; exec bash -c '"$(printf "%q" "$@")"
    else
        exec /usr/bin/nsenter -t "$SYSTEMD_PID" -m -p \
            /bin/login -p -f "$SUDO_USER" \
            $([ -f "$USER_HOME/.systemd-env" ] && /bin/cat "$USER_HOME/.systemd-env" | xargs printf ' %q')
    fi
    echo "Existential crisis"
    exit 1
fi

it works on wsl2 + Ubuntu 22.04.1

danztensai commented 2 years ago

https://github.com/DamionGans/ubuntu-wsl2-systemd-script/issues/36#issuecomment-1214179638 working for me !!! THANK"S you save my life

Lestat06 commented 1 year ago

bash ubuntu-wsl2-systemd-script.sh --force

@pablorq thanks for the save, however worked for me after running bash ubuntu-wsl2-systemd-script.sh --force with sudo

cferrante commented 1 year ago

Thanks @jototland for opening the ticket, and thanks @pablorq for the simplification of the fix! Had to use this fix on WSL2+Ubuntu after release upgrade to 22.04.

ervalade commented 1 year ago

Hi guys I've upgraded 20.04 to 22.04, I've got the problem with /proc/xx/ns/time, I've changed the enter-systemd-namespace ; the problem /proc ... was fixed but when I start wsl,

Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.79.1-microsoft-standard-WSL2 x86_64)

3 mises à jour peuvent être appliquées immédiatement. Pour afficher ces mises à jour supplémentaires, exécuter : apt list --upgradable

Last login: Sat Dec 31 18:23:02 CET 2022 on pts/0

then I've got "Login timed out after 60 seconds."

after some investigations, i've found the command "getent password" never end any idea ? thanks

ringerc commented 1 year ago

Was fixed in nsenter, see https://github.com/util-linux/util-linux/issues/2059

icrc-aasselineau commented 1 year ago

Worked on WSL2 + Ubuntu 22.04, also Thanks @pablorq

eergeek commented 1 year ago

TL;DR: Change options of nsenter from -a to -m -p

Thank you @eternalphane for the information, but this could be confusing for some people.

Based on that data, this is how to fix it:

  • Replace (copy and paste) the following lines of enter-systemd-namespace file. You can do it on Windows side.
USER_HOME="$(getent passwd | awk -F: '$1=="'"$SUDO_USER"'" {print $6}')"
if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
    if [ -n "$1" ] && [ "$1" != "bash --login" ] && [ "$1" != "/bin/bash --login" ]; then
        exec /usr/bin/nsenter -t "$SYSTEMD_PID" -m -p \
            /usr/bin/sudo -H -u "$SUDO_USER" \
            /bin/bash -c 'set -a; [ -f "$HOME/.systemd-env" ] && source "$HOME/.systemd-env"; set +a; exec bash -c '"$(printf "%q" "$@")"
    else
        exec /usr/bin/nsenter -t "$SYSTEMD_PID" -m -p \
            /bin/login -p -f "$SUDO_USER" \
            $([ -f "$USER_HOME/.systemd-env" ] && /bin/cat "$USER_HOME/.systemd-env" | xargs printf ' %q')
    fi
    echo "Existential crisis"
    exit 1
fi
  • Get inside the broken Linux distribution:
> **wsl -e bash --norc**
  • Reinstall it:
$ **sudo** bash ubuntu-wsl2-systemd-script.sh --force
  • Worked on:

    • WSL2 + Ubuntu-20.10