Вопрос Ошибка запуска isc_dhcp_server: `dhcpd: не удается создать файл PID /run/dhcp-server/dhcpd.pid: Permission denied.`


dhcpd: Can't create PID file /run/dhcp-server/dhcpd.pid: Permission denied. in / var / log / syslog при запуске isc_dhcp_server service isc-dhcp-server start на Ubuntu 15.10 Сообщить об ошибке здесь версия пакета 4.3.1-5ubuntu3

Команда процесса dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf /etc/dhcp/dhcpd.conf eth0 исходя из /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
2017-11-10 08:44


происхождения


почему бы вам не изменить разрешение / run / dhcp-server /? - Neil
Каталог @Neil, похоже, создан. @ Dhcp-server boot ... - Philippe Gachoud
Есть ли dhcpd.pid файл там? - Neil
@Neil завершил мой пост, но нет, нет - Philippe Gachoud
который является владельцем /run/dhcp-server и каково разрешение каталога? - Aizuddin Zali


ответы:


Я тоже ответил в фактическом билете, но в 15.10 ...

Это похоже на строку в /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'

жестко закодирован и игнорирует переменную DHCPD_PID из / etc / default / isc-dhcp-server.

Я думаю, это должно быть:

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

После этого вы должны запустить

systemctl daemon-reload

Затем вы должны установить значение в / etc / default / isc-dhcp-server, потому что, если вы этого не сделаете, не указывается значение по умолчанию, и служба не запускается.

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

Тогда есть другие проблемы с файлом, как будто он всегда пытается запустить:

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

независимо от указанного пути. Я не уверен, что такое предполагаемое поведение, но эти две перемены решили для меня.

НО ПОТОМ

AppArmor блокировал файл от записи. Я не очень хорошо знаком с этим, но добавил

capability dac_override,

к /etc/apparmor.d/usr.sbin.dhcpd рядом с другими возможностями, перезапустил службу, и теперь у меня есть PID-файл.

Кажется, у этого пакета есть несколько проблем.


4
2017-11-10 21:25



Просто большое спасибо! Сообщали ли вы свой ответ на отчет об ошибке? ваша работа стоит того ... - Philippe Gachoud
Да, я в значительной степени написал то же самое в отчете об ошибке. - Stephen Pape


У меня была такая же проблема на Ubuntu Vivid 15.04, без systemd.

аудит: тип = 1400 аудит (1453391318.882: 44): apparmor = "DENIED" operation = "able" profile = "/ usr / sbin / dhcpd" pid = 15957 comm = "dhcpd" возможность = 1 capname = "dac_override"   аудит: тип = 1400 аудит (1453391318.882: 45): apparmor = "DENIED" operation = "able" profile = "/ usr / sbin / dhcpd" pid = 15957 comm = "dhcpd" возможность = 2 capname = "dac_read_search"

Я добавил эти две строки: /etc/apparmor.d/usr.sbin.dhcpd

capability dac_override,
capability dac_read_search,

Под capability setuid, линия.

затем apparmor_parser -r /etc/apparmor.d/usr.sbin.dhcpd

затем stop isc-dhcp-server; start isc-dhcp-server


1
2018-01-21 15:55



Я использовал это решение. Однако остановитесь; начало обоих ошибок было: Unable to connect to Upstart: Failed to .... То, что работало нормально, было sudo /etc/init.d/isc-dhcp-server stop / start И сервер dhcp не сделал сообщения об ошибке о пропавшем файле pid. Спасибо за короткое решение. - ndasusers