Як успішно перезапустити мережу без перезавантаження через 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?


Ви дійсно хочете перезапустити мережу або просто перезапустити інтерфейс, такий як 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 / інтерфейсах. До цих сценаріїв припинення роботи 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-desktop.


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.  

Але вони дійсно могли / повинні вивести це як діалогове повідомлення при спробі перезавантаження сервісної мережі. ах добре. з'ясував це і навіть по-старому обходився.

EDIT: Я виявив, що це спричиняє ненавмисне запускання сценарію, керованого /etc/init/failsafe.conf, що небажано, оскільки це спричиняє затримку на 120 секунд у затримці кожного завантаження ..., а також, можливо, маскування фактичних неправильних конфігурацій / мережі проблеми, на які вказувала б ця затримка, але вона вже весь час проявляється. (наприклад, відключений кабель, який дозволяв отримати доступ до спільного доступу до мережевого файлу, відображеного в / etc / fstab)

У будь-якому випадку, я зрозумію, що викликає це завжди, коли трапляється тайм-аут, і опублікую виправлення, коли я його знайду.


5
розумність зміни основної поведінки ОС є дискусійною.
0xF2

Чому вони видалили можливість перезапустити? Я хотів би це знати, перш ніж відновити його.
мерехтіння

@ 0xF2 - ти маєш на увазі questionable.
Дейл Андерсон

@DaleAnderson that too ;-)
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 або командної служби.
ПРИМІТКА . Цей скрипт занадто простий і НЕ ОБРАБОТИ інтерфейси vm, tap, bridge, .... насправді флеш усі інтерфейси виключають lo (loopback).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.