Как успешно перезагрузить сеть без перезагрузки через SSH?


98

В Ubuntu 14.04 больше ничего sudo service networking restartне sudo /etc/init.d/networking restartделаю. Они также выходят с кодом 1. Очевидно, что-то изменилось (или наполовину изменилось), но я не могу найти что. Это, очевидно, вызывает проблемы с удаленной реконфигурацией сети и такими инструментами, как Ansible.

$ sudo bash -x /usr/sbin/service networking restart
[sudo] password for wirehive:
++ basename /usr/sbin/service
+ VERSION='service ver. 0.91-ubuntu1'
++ basename /usr/sbin/service
+ USAGE='Usage: service < option > | --status-all | [ service_name [ command | --full-restart ] ]'
+ SERVICE=
+ ACTION=
+ SERVICEDIR=/etc/init.d
+ OPTIONS=
+ '[' 2 -eq 0 ']'
+ cd /
+ '[' 2 -gt 0 ']'
+ case "${1}" in
+ '[' -z '' -a 2 -eq 1 -a networking = --status-all ']'
+ '[' 2 -eq 2 -a restart = --full-restart ']'
+ '[' -z '' ']'
+ SERVICE=networking
+ shift
+ '[' 1 -gt 0 ']'
+ case "${1}" in
+ '[' -z networking -a 1 -eq 1 -a restart = --status-all ']'
+ '[' 1 -eq 2 -a '' = --full-restart ']'
+ '[' -z networking ']'
+ '[' -z '' ']'
+ ACTION=restart
+ shift
+ '[' 0 -gt 0 ']'
+ '[' -r /etc/init/networking.conf ']'
+ which initctl
+ grep -q upstart
+ initctl version
+ case "${ACTION}" in
+ stop networking
stop: Job failed while stopping
+ :
+ exec start networking
start: Job is already running: networking

Как правильно перезагрузить сеть в Ubuntu 14.04 Server удаленно?


Вы действительно хотите перезагрузить сеть или просто перезапустить интерфейс, такой как eth0? В любом случае, это, вероятно, разорвет соединение ssh.
chili555

1
Поскольку оба являются сценариями оболочки, получите информацию с помощью sudo bash -x /usr/sbin/service networking restartиsudo bash -x /etc/init.d/networking restart
waltinator

@terdon немного глупо иметь тег для 14.04, тем более, что в описании говорится, что это «текущий» релиз, которым он не является. Тем не менее, эта проблема полностью воспроизводима в 13.10.
SimonJGreen

@ chili555 я хочу, чтобы изменения в / etc / network / interfaces вступили в силу. До остановки этих сценариев работающие соединения SSH выдерживают этот перезапуск.
SimonJGreen

@waltinator дополнительная информация добавлена ​​к вопросу, спасибо за предложение
SimonJGreen

Ответы:


121

Оказывается, это «особенность». Только поддерживаемый способ перезапуска интерфейса в Ubuntu Server являетсяsudo ifdown eth0 && sudo ifup eth0

https://bugs.launchpad.net/ubuntu/+source/ifupdown/+bug/1301015


8
Убедитесь, что вы запускаете 'sudo ifdown eth0 && sudo ifup eth0' (обратите внимание на второе sudo), если вы не запускаете эту команду от имени root
mtpettyp

3
Это нормально делать, если подключен через SSH? Т.е. обе команды будут выполняться до отключения?
Meawoppl

2
В моем случае бег, sudo service networking restartказалось, все испортил. Поэтому мне пришлось бежать sudo ifdown eth0 && sudo ifup eth0дважды. Да, дважды.
поляризовать

@ExceptionSlayer: Нет, они не работают для меня. Мне пришлось физически выключить сервер и снова включить его (Ubuntu 14.04).
Xdg

4
Разве не использовать ;вместо &&более безопасный вариант?
Исаак

72

ifdown, ifup не работает для меня (вероятно, тайм-аут соединения SSH до второй команды). Что работало было:

sudo service network-manager restart

Это было на 14.04 Ubuntu-настольной системе.


4
Принятый ответ не работал для меня; этот сделал. (Свежая установка 14.04.1)
u2n

2
Могу подтвердить, что это работает для меня на Trusty (Ubuntu 14.04).
Герлос

3
Ответ «ifdown / ifup» у меня тоже не сработал на Ubuntu 14.04, но это сработало.
dieuwe

4
Принятый ответ применим для Ubuntu 12.04 и ниже. Этот ответ приемлем для 14.04.
швейцарский

4
На моем 14.04.2 такого сервиса не существует - перезапустите диспетчер сети службы sudo.
Xdg

6

Что изменилось, так это то, что они больше не хотят, чтобы вы «подпрыгивали» от сети. Остановка и запуск, все еще работа. перезагрузка больше не работает. Я просто «решил» эту «проблему», то есть вернул прежнее поведение. Чтобы вернуться к предыдущему поведению: возьмите файл 13.10 /etc/init/networking.conf и замените им файл 14.04. (редактировать: уточнил, что заменяет какой)

Процесс выглядит так:

(Just before this, I configured my /etc/network/interfaces for eth1 on a 192.168.117.x address)

"/etc/network/interfaces" 16L, 413C written  
root@1404-Anode:~# service networking restart  
stop: Job failed while stopping  
start: Job is already running: networking  
root@1404-Anode:~# echo "hmm, wth?"
hmm, wth?
root@1404-Anode:~# ifconfig  
eth0      Link encap:Ethernet  HWaddr 00:0c:29:d6:a8:19  
          inet addr:192.168.115.105  Bcast:192.168.115.255  Mask:255.255.255.0  
          inet6 addr: 2002:4077:9050:1234:a08c:29c1:ce9b:a57b/64 Scope:Global  
          inet6 addr: fe80::20c:29ff:fed6:a819/64 Scope:Link  
          inet6 addr: 2002:4077:9050:1234:20c:29ff:fed6:a819/64 Scope:Global  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:646 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:531 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:1000  
          RX bytes:58748 (58.7 KB)  TX bytes:75465 (75.4 KB)  
(lo removed here)  
root@1404-Anode:~# cd /etc/init
root@1404-Anode:/etc/init# diff networking.conf.1310 networking.conf.1404  
13c13  
<       and (stopped udevtrigger or container)) or runlevel [2345]  
---  
>     and (stopped udevtrigger or container)) or runlevel [2345] or stopped  networking   >RESULT=failed PROCESS=post-stop EXIT_STATUS=100  
16a17,20  
>     if [ "$UPSTART_EVENTS" = "stopped" ] && [ "$UPSTART_JOB" = "networking" ] && [ "$EXIT_STATUS" = "100" ]; then  
>         exit 0  
>     fi  
>  
21a26,31  
>     if [ -z "$UPSTART_STOP_EVENTS" ]; then  
>        echo "Stopping or restarting the networking job is not supported."  
>         echo "Use ifdown & ifup to reconfigure desired interface."  
>         exit 100  
>     fi  
root@1404-Anode:/etc/init#  

Сделайте то же самое для скрипта /etc/init.d/networking, на что ссылается / вызывает файл /etc/init/networking.conf.

root@1404-Anode:/etc/init# cp networking.conf.1310 networking.conf  
root@1404-Anode:/etc/init# cd ../init.d  
root@1404-Anode:/etc/init.d# diff networking.1404 networking.1310  
15d14  
< STATEDIR="$RUN_DIR/state"
21a21,27
> # Make sure that it's clear to the user that they shouldn't use this
> # script under upstart
> if init_is_upstart; then
>       echo "ERROR: Calling a sysvinit script on a system using upstart isn't supported. Please use the 'service' command instead."  
>       exit 1
> fi
>
52,54d57
<       if ! chown root:netdev "$RUN_DIR" ; then
<           log_warning_msg "can't chown $RUN_DIR"
<       fi
160,162d162
<       if init_is_upstart; then
<               exit 1
<       fi
166c166
<       state=$(ifquery --state)
---
>       state=$(cat /run/network/ifstate)
root@1404-Anode:/etc/init.d# cp networking.1310 networking
root@1404-Anode:/etc/init.d# service networking restart
networking stop/waiting
networking start/running
root@1404-Anode:/etc/init.d# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0c:29:d6:a8:19
          inet addr:192.168.115.105  Bcast:192.168.115.255  Mask:255.255.255.0
          inet6 addr: 2002:4077:9050:1234:a08c:29c1:ce9b:a57b/64 Scope:Global
          inet6 addr: fe80::20c:29ff:fed6:a819/64 Scope:Link
          inet6 addr: 2002:4077:9050:1234:20c:29ff:fed6:a819/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3398 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2545 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:318654 (318.6 KB)  TX bytes:418804 (418.8 KB)

eth1      Link encap:Ethernet  HWaddr 00:0c:29:d6:a8:23
          inet addr:192.168.117.105  Bcast:192.168.117.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fed6:a823/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:98 errors:0 dropped:58 overruns:0 frame:0
          TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:20055 (20.0 KB)  TX bytes:1226 (1.2 KB)
(lo removed)
root@1404-Anode:/etc/init.d# echo "hah, it works! *8^)"
Hah, it works! *8^)
root@1404-Anode:/etc/init.d#

(note: the steps where I scp'd the 1310 versions into the 1404 system are omitted for brevity). 

Очевидно, есть причина, по которой они поставили защитный выход, но они не удосужились действительно показать, что происходит очень хорошо.

Когда вы пытаетесь это сделать, запись в /var/log/upstart/networking.log выглядит так:

Stopping or restarting the networking job is not supported.  
Use ifdown & ifup to reconfigure desired interface.  

Но они действительно могли / должны были выводить это как диалоговое сообщение при попытке перезапустить сервисную сеть. Ах хорошо. разобрался и даже по старинке обходился.

РЕДАКТИРОВАТЬ: я обнаружил, что это вызывает непреднамеренный запуск сценария, контролируемого /etc/init/failsafe.conf, который нежелателен, так как он вызывает задержку по времени ожидания 120 секунд при каждой загрузке ... а также, возможно, маскирует фактическую неправильную конфигурацию / сеть проблемы, на которые указывает появление этой задержки, но это уже показывает все время. (Например, отключенный кабель, который разрешал доступ к общей сетевой папке, например, в / etc / fstab)

В любом случае, я выясню, что является причиной всегда превышения времени ожидания, и опубликую исправление, когда найду его.


5
мудрость изменения поведения ядра ОС спорна.
0xF2

Почему они убрали возможность перезагрузки? Я хотел бы знать это прежде, чем восстановить это.
flickerfly

@ 0xF2 - ты имеешь в виду questionable.
Дейл Андерсон

@DaleAnderson, что тоже ;-)
0xF2

3

Что касается ответа kvm-user420, я решил установить скрипт для замены сетевых скриптов Ubuntu 14.04 на Ubuntu 13.10.

Вы можете найти его здесь: https://github.com/metral/restore_networking

Наслаждайтесь!


Это сработало для меня. Надеюсь, однажды Upstart просто уйдет ;-)
Эндрю

0

Я исправляю проблему с этим сценарием: пожалуйста, добавьте этот сценарий в "/etc/network/if-down.d"

cd /etc/network/if-down.d
vim ifdown

содержание:

#!/bin/bash 

for I in /sys/class/net/* 
do
        ifname=$(basename $I) 
        if [ $ifname != "lo" ] ; then 
                ip addr flush $ifname
        fi
done

и наконец :

chmod +x ifdown

Теперь вы можете изменить IP-адрес и перезапустить сетевой сервис с помощью команды systemctl или service.
ПРИМЕЧАНИЕ : этот скрипт слишком прост и НЕ ОБРАЩАЕТСЯ к интерфейсам vm, tap, bridge, .... фактически сбросить все интерфейсы, исключая lo (loopback).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.