วิธีการรีสตาร์ทเครือข่ายให้สำเร็จโดยไม่รีบูต 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 bit silly มีแท็กประมาณ 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 สอง) ถ้าคุณไม่ได้เรียกใช้คำสั่งนี้เป็นราก
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)
gerlos

3
คำตอบ "ifdown / ifup" ไม่ได้ผลสำหรับฉันใน Ubuntu 14.04 แต่สิ่งนี้ก็ใช้ได้
dieuwe

4
คำตอบที่ยอมรับนั้นใช้ได้สำหรับ Ubuntu 12.04 และต่ำกว่า คำตอบนี้เป็นที่ยอมรับสำหรับ 14.04
สวิส

4
ใน 14.04.2 ของฉันบริการนี้ไม่มีอยู่ - sudo service network-manager restart
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คุณหมายถึง
Dale Anderson

@DaleAnderson นั่นด้วย ;-)
0xF2

3

จากการตอบสนองของ kvm-user420 ฉันได้ดำเนินการต่อไปและตั้งค่าสคริปต์เพื่อแทนที่สคริปต์เครือข่ายของ Ubuntu 14.04 ด้วย Ubuntu 13.10

คุณสามารถค้นหาได้ที่นี่: https://github.com/metral/restore_networking

สนุก!


สิ่งนี้ใช้ได้สำหรับฉัน หวังว่าสักวันหนึ่งการพุ่งพรวดจะหายไป ;-)
แอนดรูว์

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, ... interfaces จริง ๆ แล้วล้างอินเทอร์เฟซทั้งหมดยกเว้นแท้จริง (วนรอบ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.