Jak pomyślnie zrestartować sieć bez ponownego uruchomienia przez SSH?

98

W Ubuntu 14.04 sudo service networking restartani sudo /etc/init.d/networking restartnic więcej. Oboje wychodzą również z kodem 1. Coś oczywiście się zmieniło (lub połowa zmieniło się), ale nie mogę znaleźć co. To oczywiście powoduje problemy ze zdalną rekonfiguracją sieci i narzędziami takimi jak 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

Jaki jest prawidłowy sposób zdalnego restartowania sieci w Ubuntu 14.04 Server?

SimonJGreen
źródło
Czy naprawdę chcesz zrestartować sieć, czy po prostu ponownie uruchomić interfejs, taki jak eth0? W każdym razie prawdopodobnie przerwie połączenie ssh.
chili555
1
Ponieważ oba są skryptami powłoki, uzyskaj informacje za pomocą sudo bash -x /usr/sbin/service networking restartisudo bash -x /etc/init.d/networking restart
waltinator
@terdon jest trochę głupi, żeby mieć tag na 14.04, tym bardziej, że z opisu wynika, że ​​jest to „aktualne” wydanie, którym nie jest. powiedziawszy, ten problem jest całkowicie powtarzalny w 13.10.
SimonJGreen
@ chili555 chcę, aby zmiany zostały wprowadzone w / etc / network / interfaces. Przed tymi skryptami zatrzymywanie działających połączeń SSH przetrwało to ponowne uruchomienie.
SimonJGreen
@waltinator dodatkowe informacje dodane do pytania, dzięki za sugestię
SimonJGreen

Odpowiedzi:

121

Okazuje się, że jest to „funkcja”. Tylko obsługiwane sposobem ponownego uruchomienia interfejsu w Ubuntu Server jestsudo ifdown eth0 && sudo ifup eth0

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

SimonJGreen
źródło
8
Upewnij się, że uruchomisz „sudo ifdown eth0 && sudo ifup eth0” (zwróć uwagę na drugie sudo), jeśli nie uruchamiasz tej komendy jako root
mtpettyp 30.04.2014
3
Czy to jest w porządku, jeśli masz połączenie przez ssh? Tzn. Czy oba polecenia będą działać przed rozłączeniem?
meawoppl
2
W moim przypadku bieganie sudo service networking restartwydawało się popsuć. Musiałem więc biec sudo ifdown eth0 && sudo ifup eth0dwa razy. Tak, dwa razy.
spolaryzować
@ExceptionSlayer: Nie, nie działały dla mnie. Musiałem fizycznie wyłączyć serwer i włączyć go ponownie (Ubuntu 14.04).
Xdg,
4
Nie używa ;zamiast &&bezpieczniejszą opcją?
Izaak
72

ifdown, ifup nie działało dla mnie (prawdopodobnie przekroczono limit czasu połączenia SSH przed drugim poleceniem). Co zadziałało to:

sudo service network-manager restart

To było na systemie Ubuntu-Desktop 14.04.

dpb
źródło
4
Przyjęta odpowiedź nie działała dla mnie; ten zrobił. (Świeża instalacja z 14.04.1)
u2n
2
Potwierdzam, że działa to dla mnie na Trusty (Ubuntu 14.04).
gerlos
3
Odpowiedź „ifdown / ifup” nie działała dla mnie również w systemie Ubuntu 14.04, ale tak się stało.
dieuwe
4
Zaakceptowana odpowiedź dotyczy wersji Ubuntu 12.04 i niższych. Ta odpowiedź jest dopuszczalna dla 14.04.
Szwajcarski
4
Na moim 14.04.2 ta usługa nie istnieje - ponowne uruchomienie menedżera sieci usługi sudo.
Xdg,
6

Zmieniło się to, że nie chcą, abyś „odbijał” sieć. zatrzymywanie i uruchamianie nadal działa. restart nie działa. Właśnie „rozwiązałem” ten „problem”, to znaczy przywróciłem stare zachowanie. Aby przywrócić poprzednie zachowanie: Weź plik 13.10 /etc/init/networking.conf i zastąp go plikiem 14.04. (edytuj: wyjaśniono, który zastępuje który)

Proces wygląda następująco:

(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#  

Zrób to samo dla skryptu /etc/init.d/networking, do którego odwołuje się / wywołuje plik /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). 

Oczywiście istnieje powód, dla którego wprowadzili tam obronne wyjście, ale nie zadają sobie trudu, aby naprawdę dobrze przedstawić to, co się dzieje.

Wpis próbuje przejść do pliku /var/log/upstart/networking.log, gdy wygląda to następująco:

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

Ale tak naprawdę mogą / powinny wyświetlać to jako komunikat dialogowy podczas próby ponownego uruchomienia sieci serwisowej. ach tak. wymyśliłem to, a nawet obejrzałem po staremu.

EDYCJA: Odkryłem, że powoduje to niezamierzone uruchomienie skryptu kontrolowanego przez /etc/init/failsafe.conf, co jest niepożądane, ponieważ powoduje 120-sekundowe opóźnienie przy każdym uruchomieniu ... a także może maskować rzeczywiste błędne konfiguracje / sieć problemy, które wskazywałoby na to pojawienie się tego opóźnienia, ale cały czas się pojawia. (np. Odłączony kabel, który umożliwiał dostęp do sieciowego udziału plików zmapowanego na przykład w / etc / fstab)

W każdym razie dowiem się, co powoduje to przekroczenie limitu czasu, i opublikuję poprawkę, gdy ją znajdę.

kvm-user420
źródło
5
zasadność modyfikowania podstawowych zachowań systemu operacyjnego jest dyskusyjna.
0xF2
Dlaczego usunęli możliwość ponownego uruchomienia? Chciałbym to wiedzieć przed przywróceniem.
flickerfly,
@ 0xF2 - masz na myśli questionable.
Dale Anderson,
@DaleAnderson też ;-)
0xF2
3

W nawiązaniu do odpowiedzi kvm-user420, poszedłem naprzód i skonfigurowałem skrypt zastępujący skrypty sieciowe Ubuntu 14.04 skryptami Ubuntu 13.10

Można go znaleźć tutaj: https://github.com/metral/restore_networking

Cieszyć się!

metral
źródło
To zadziałało dla mnie. Mam nadzieję, że pewnego dnia Upstart po prostu odejdzie ;-)
Andrew
0

Naprawiam problem z tym skryptem: dodaj ten skrypt do „/etc/network/if-down.d”

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

zawartość :

#!/bin/bash 

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

i w końcu :

chmod +x ifdown

teraz możesz zmienić adres IP i ponownie uruchomić usługę sieciową za pomocą polecenia systemctl lub service.
UWAGA : ten skrypt jest zbyt prosty i NIE NALEŻY OBSŁUGIwać interfejsów vm, tap, bridge, ... faktycznie opróżniają wszystkie interfejsy z wyłączeniem lo (loopback).

mah454
źródło