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
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.
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