Arch Linux

Please read this before reporting a bug:
https://wiki.archlinux.org/title/Bug_reporting_guidelines

Do NOT report bugs when a package is just outdated, or it is in the AUR. Use the 'flag out of date' link on the package page, or the Mailing List.

REPEAT: Do NOT report bugs for outdated packages!
Tasklist

FS#35423 - [systemd(204-1)] systemctl is unable to disable any unit

Attached to Project: Arch Linux
Opened by Jason Vas Dias (JVD66) - Wednesday, 22 May 2013, 14:22 GMT
Last edited by Dave Reisner (falconindy) - Wednesday, 22 May 2013, 15:17 GMT
Task Type Bug Report
Category Packages: Core
Status Closed
Assigned To No-one
Architecture All
Severity High
Priority Normal
Reported Version
Due in Version Undecided
Due Date Undecided
Percent Complete 100%
Votes 0
Private No

Details

Description:
systemctl is unable to disable any unit because it does not retry socket receives that fail with EAGAIN.


Additional info:
* package version(s)
204-1
x86_64 ArchLinux up-to-date as of today (2013-05-22).
* config and/or log files etc.


Steps to reproduce:

Try to disable any unit with systemctl, inactive or active, eg. the active 'proc-xen.mount' :
$ systemctl | grep proc-xen
proc-xen.mount loaded active mounted /proc/xen
$ systemctl disable proc-xen.mount
Failed to issue method call: No such file or directory
or the inactive 'display-manager.service' :
$ systemctl -a | grep display
display-manager.service error inactive dead display-manager.service
$ systemctl disable display-manager.service

An strace shows why these commands fail:
$ strace systemctl disable proc-xen.mount
...
sendmsg(3, {msg_name(0)=NULL, msg_iov(2)=[{"l\1\0\1\34\0\0\0\1\0\0\0\251\0\0\0\1\1o\0\31\0\0\0/org/fre"..., 192}, {"\23\0\0\0\16\0\0\0proc-xen.mount\0\0\0\0\0\0", 28}], msg_controllen=0,
msg_flags=0}, MSG_NOSIGNAL) = 220
clock_gettime(CLOCK_MONOTONIC, {73496, 166603036}) = 0
poll([{fd=3, events=POLLIN}], 1, 25000) = 1 ([{fd=3, revents=POLLIN}])
recvmsg(3, {msg_name(0)=NULL, msg_iov(1)=[{"l\4\1\1\0\0\0\0\1\0\0\0q\0\0\0\1\1o\0\31\0\0\0/org/fre"..., 2048}], msg_controllen=0, msg_flags=MSG_CMSG_CLOEXEC}, MSG_CMSG_CLOEXEC) = 382
recvmsg(3, 0x7fffdeb0fff0, MSG_CMSG_CLOEXEC) = -1 EAGAIN (Resource temporarily unavailable)
writev(2, [{"Failed to issue method call: No "..., 54}, {"\n", 1}], 2Failed to issue method call: No such file or directory) = 55
close(3) = 0
exit_group(1) = ?

This happens for every 'disable' command sent.

I strongly suggest that the systemd programmers read the 'recvmsg(2)', recv(2), 'read(2)' and 'socket(7)' manual pages ,
where EAGAIN is documented as being returned by read() / recvmsg() when there is currently no data to be received
and the socket is marked as non-blocking / O_ASYNC . If they are expecting a reply to be sent, they should retry
the operation if the receive fails with errno set to EAGAIN.

This problem effectively makes my whole arch linux system unusable unless I'm running Xen, since
systemd always fails to enter the default "runlevel", and no units can be disabled.

I've done an 'egrep -RI proc-xen /' with no results found - it must be in a binary database somewhere -
any ideas where this database might be / how to reinitialize it so that NO units are enabled ?
( I want to disable systemd completely, and replace it with SysVinit, since it is not of sufficient
quality to be useful yet).

This task depends upon

Closed by  Dave Reisner (falconindy)
Wednesday, 22 May 2013, 15:17 GMT
Reason for closing:  Not a bug
Additional comments about closing:  Working as intended.
Comment by Dave Reisner (falconindy) - Wednesday, 22 May 2013, 14:34 GMT
The bulk of your strace is libdbus code, not systemd. A backtrace would happily show you that. I'm not even sure that dbus exposes the EAGAIN from the dbus_connection_send_with_reply_and_block() call.

Not interested in doing much here, since you've made it clear you don't actually care about resolving this.
Comment by Jan de Groot (JGC) - Wednesday, 22 May 2013, 14:57 GMT
I think this forum topic describes your problem:
https://bbs.archlinux.org/viewtopic.php?id=146295

The error message you're getting is not because of programming errors, but because you're trying to disable a service that doesn't exist. As it doesn't exist, it exits with "No such file or directory."
Comment by Dave Reisner (falconindy) - Wednesday, 22 May 2013, 15:17 GMT
Ah, right. There's nothing wrong here. The units created are ephemeral (in-memory) and are created only to either satisfy dependencies that may or may not show up in the future or generated via /proc/self/mountinfo (such as in the case of /proc/xen).

Loading...