dhcpd: Can't create PID file /run/dhcp-server/dhcpd.pid: Permission denied. in /var/log/syslog when starting isc_dhcp_server service isc-dhcp-server start on Ubuntu 15.10 bug report here version of package is 4.3.1-5ubuntu3

Process command is dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf /etc/dhcp/dhcpd.conf eth0 comming from /etc/init.d/isc-dhcp-server file

user@host: /$ cat /etc/init.d/isc-dhcp-server                
#!/bin/sh
#
#

### BEGIN INIT INFO
# Provides:          isc-dhcp-server
# Required-Start:    $remote_fs $network $syslog
# Required-Stop:     $remote_fs $network $syslog
# Should-Start:      $local_fs slapd $named
# Should-Stop:       $local_fs slapd
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: DHCP server
# Description:       Dynamic Host Configuration Protocol Server
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin

test -f /usr/sbin/dhcpd || exit 0

DHCPD_DEFAULT="${DHCPD_DEFAULT:-/etc/default/isc-dhcp-server}"

# It is not safe to start if we don't have a default configuration...
if [ ! -f "$DHCPD_DEFAULT" ]; then
        echo "$DHCPD_DEFAULT does not exist! - Aborting..."
        if [ "$DHCPD_DEFAULT" = "/etc/default/isc-dhcp-server" ]; then
                echo "Run 'dpkg-reconfigure isc-dhcp-server' to fix the problem."
        fi
        exit 0
fi

. /lib/lsb/init-functions

# Read init script configuration
[ -f "$DHCPD_DEFAULT" ] && . "$DHCPD_DEFAULT"

NAME=dhcpd
DESC="ISC DHCP server"
# fallback to default config file
DHCPD_CONF=${DHCPD_CONF:-/etc/dhcp/dhcpd.conf}
# try to read pid file name from config file, with fallback to /var/run/dhcpd.pid
if [ -z "$DHCPD_PID" ]; then
        DHCPD_PID=$(sed -n -e 's/^[ \t]*pid-file-name[ \t]*"(.*)"[ \t]*;.*$/\1/p' < "$DHCPD_CONF" 2>/dev/null | head -n 1)
fi
DHCPD_PID="${DHCPD_PID:-/var/run/dhcpd.pid}"

test_config()
{
        if ! /usr/sbin/dhcpd -t $OPTIONS -q -cf "$DHCPD_CONF" > /dev/null 2>&1; then
                echo "dhcpd self-test failed. Please fix $DHCPD_CONF."
                echo "The error was: "
                /usr/sbin/dhcpd -t $OPTIONS -cf "$DHCPD_CONF"
                exit 1
        fi
        touch /var/lib/dhcp/dhcpd.leases
}

# single arg is -v for messages, -q for none
check_status()
{
    if [ ! -r "$DHCPD_PID" ]; then
        test "$1" != -v || echo "$NAME is not running."
        return 3
    fi
    if read pid < "$DHCPD_PID" && ps -p "$pid" > /dev/null 2>&1; then
        test "$1" != -v || echo "$NAME is running."
        return 0
    else
        test "$1" != -v || echo "$NAME is not running but $DHCPD_PID exists."
        return 1
    fi
}

case "$1" in
        start)
                test_config
                log_daemon_msg "Starting $DESC" "$NAME"
                start-stop-daemon --start --quiet --pidfile "$DHCPD_PID" \
                        --exec /usr/sbin/dhcpd -- \
                        -q $OPTIONS -cf "$DHCPD_CONF" -pf "$DHCPD_PID" $INTERFACES
                sleep 2

                if check_status -q; then
                        log_end_msg 0
                else
                        log_failure_msg "check syslog for diagnostics."
                        log_end_msg 1
                        exit 1
                fi
                ;;
        stop)
                log_daemon_msg "Stopping $DESC" "$NAME"
                start-stop-daemon --stop --quiet --pidfile "$DHCPD_PID"
                log_end_msg $?
                rm -f "$DHCPD_PID"
                ;;
        restart | force-reload)
                test_config
                $0 stop
                sleep 2
                $0 start
                if [ "$?" != "0" ]; then
                        exit 1
                fi
                ;;
        status)
                echo -n "Status of $DESC: "
                check_status -v
                exit "$?"
                ;;
        *)
                echo "Usage: $0 {start|stop|restart|force-reload|status}"
                exit 1 
esac

exit 0
  • why don't you change the permission of /run/dhcp-server/ ? – Neil Nov 10 '15 at 9:26
  • @Neil directory seems to be created @ dhcp-server boot... – Philippe Gachoud Nov 10 '15 at 9:47
  • is there a dhcpd.pid file there ? – Neil Nov 10 '15 at 9:50
  • @Neil completed my post, but no there isn't – Philippe Gachoud Nov 10 '15 at 10:13
  • who is the owner of /run/dhcp-server and what is the directory permission? – Aizuddin Zali Nov 10 '15 at 12:57
up vote 4 down vote accepted

I responded in the actual ticket as well, but in 15.10...

It looks like the line in /lib/systemd/system/isc-dhcp-server.service:

exec dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf $CONFIG_FILE $INTERFACES'

is hardcoded and ignores the DHCPD_PID variable from /etc/default/isc-dhcp-server.

I think it should be:

exec dhcpd -user dhcpd -group dhcpd -f -4 -pf $DHCPD_PID -cf $CONFIG_FILE $INTERFACES'

After changing that, you have to run

systemctl daemon-reload

Then you have to set the value in /etc/default/isc-dhcp-server, because if you don't, no default is given and the service fails to start.

DHCPD_PID=/var/run/dhcp-server/dhcpd.pid

Then there are other issues with the file, like it always tries to run:

ExecStartPre=/bin/chown dhcpd:dhcpd /run/dhcp-server

regardless of the specified path. I'm not sure what the intended behavior was, but those two changes solved it for me.

BUT THEN

AppArmor was blocking the file from being written. I'm not very familiar with it, but I added

capability dac_override,

to /etc/apparmor.d/usr.sbin.dhcpd near the other capabilities, restarted the service, and now I have a PID file.

It seems this package has a few issues.

  • Just great thank you very much! Did you report your answer to the bug report too? your work has to worth it... – Philippe Gachoud Nov 11 '15 at 7:17
  • 1
    Yep, I pretty much wrote the same thing in the actual bug report. – Stephen Pape Nov 12 '15 at 16:11

I had the same issue on Ubuntu Vivid 15.04, without systemd.

audit: type=1400 audit(1453391318.882:44): apparmor="DENIED" operation="capable" profile="/usr/sbin/dhcpd" pid=15957 comm="dhcpd" capability=1 capname="dac_override" audit: type=1400 audit(1453391318.882:45): apparmor="DENIED" operation="capable" profile="/usr/sbin/dhcpd" pid=15957 comm="dhcpd" capability=2 capname="dac_read_search"

I added these two lines to /etc/apparmor.d/usr.sbin.dhcpd

capability dac_override,
capability dac_read_search,

Under the capability setuid, line.

Then apparmor_parser -r /etc/apparmor.d/usr.sbin.dhcpd

Then stop isc-dhcp-server; start isc-dhcp-server

  • I used this solution. However, stop; start both had error like: Unable to connect to Upstart: Failed to .... What worked normally was sudo /etc/init.d/isc-dhcp-server stop / start And dhcp server made no error message about missing pid file. Thanks for short solution. – ndasusers Feb 4 '16 at 22:26

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.