web-dev-qa-db-fra.com

isc_dhcp_server start error: `dhcpd: Impossible de créer le fichier PID /run/dhcp-server/dhcpd.pid: Autorisation refusée.`

dhcpd: Can't create PID file /run/dhcp-server/dhcpd.pid: Permission denied. dans/var/log/syslog lors du démarrage de isc_dhcp_server service isc-dhcp-server start sur Ubuntu 15.10 rapport de bogue ici la version du paquet est 4.3.1-5ubuntu3

La commande de processus est dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf /etc/dhcp/dhcpd.conf eth0 provenant du fichier /etc/init.d/isc-dhcp-server

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
3
Philippe Gachoud

J'ai aussi répondu au billet, mais en 15h10 ...

Cela ressemble à la ligne dans /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'

est codé en dur et ignore la variable DHCPD_PID de/etc/default/isc-dhcp-server.

Je pense que cela devrait être:

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

Après avoir changé cela, vous devez exécuter

systemctl daemon-reload

Ensuite, vous devez définir la valeur dans/etc/default/isc-dhcp-server, car si vous ne le faites pas, aucune valeur par défaut n’est donnée et le service ne parvient pas à démarrer.

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

Ensuite, il y a d'autres problèmes avec le fichier, comme il essaie toujours de s'exécuter:

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

quel que soit le chemin spécifié. Je ne suis pas sûr du comportement souhaité, mais ces deux changements l'ont résolu pour moi.

MAIS ALORS

AppArmor bloquait l'écriture du fichier. Je ne le connais pas très bien, mais j'ai ajouté

capability dac_override,

vers /etc/apparmor.d/usr.sbin.dhcpd près des autres capacités, a redémarré le service, et maintenant j’ai un fichier PID.

Il semble que ce paquet a quelques problèmes.

4
Stephen

J'ai eu le même problème sur Ubuntu Vivid 15.04, sans systemd.

audit: type = 1400 audit (1453391318.882: 44): apparmor = "REFUS" operation = "capable" profil = "/ usr/sbin/dhcpd" pid = 15957 comm = "dhcpd" moyen = 1 capname = "dac_override" audit: type = 1400 audit (1453391318.882: 45): apparmor = "REFUS" opération = "capable" profil = "/ usr/sbin/dhcpd" pid = 15957 comm = "dhcpd" facility = 2 capname = "dac_read_search"

J'ai ajouté ces deux lignes à /etc/apparmor.d/usr.sbin.dhcpd

capability dac_override,
capability dac_read_search,

Sous la ligne capability setuid,.

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

Alors stop isc-dhcp-server; start isc-dhcp-server

1
kevinf