Làm cách nào để định cấu hình `eth0` để thử lại` dhclient` khi rút phích cắm và cắm lại?


12

Tôi đang làm việc trên một tiện ích linux.

Tôi muốn nó nhận DHCP nếu tôi cắm cáp mạng sau khi đã khởi động xong hoặc nếu cáp mạng được rút ra và cắm lại.

Một giải pháp là chạy một kịch bản như thế này (hoạt động, btw):

#!/bin/bash

NET_STATUS='different'

while true
do
  NEW_NET_STATUS=`ifconfig | grep RUNNING | grep -v LOOPBACK`
  if [ "${NEW_NET_STATUS}" = "${NET_STATUS}" ]
  then
    echo "no change"
    sleep 1
    continue
  fi
  NET_STATUS=${NEW_NET_STATUS}
  if [ "${NET_STATUS}" ]
  then
    echo "cable plugged in"
  else
    echo "cable unplugged"
  fi
  sleep 1
done

Tuy nhiên, tôi có một cảm giác sâu thẳm trong ngón chân út cho tôi biết rằng có cách tốt hơn để xử lý các sự kiện cắm nóng cho cáp ethernet.


1
Thật không may là vào năm 2016 cả hai ifplugdnetplugdxuất hiện không rõ ràng. Tuy nhiên câu hỏi tương tự này có vẻ như nó có một câu trả lời tốt (đơn giản) bằng cách sử dụng các quy tắc udev - không cần gói bổ sung. serverfault.com/a/312296/275255
Thom Nichols

Thay đổi autothành allow-hotplugtrong interfaces.
Ken Sharp

Câu trả lời:


9

mạng lưới

netpluglà giải pháp mà tôi đã đi cùng. ifplugdcó thể làm việc tốt

Cài đặt

sudo apt-get install netplug

Cấu hình giao diện

cat /etc/netplug/netplugd.conf
eth*

Cấu hình sự kiện

cat /etc/netplug/netplug
#!/bin/sh
PATH=/usr/bin:/bin:/usr/sbin:/sbin
export PATH

dev="$1"
action="$2"

case "$action" in
in)
    echo "$dev : $action : plugged in" >> /tmp/netplug.log
    ;;
out)
    echo "$dev : $action : unplugged" >> /tmp/netplug.log
    ;;
probe)
    echo "$dev : $action : probed" >> /tmp/netplug.log
    ;;
*)
    echo "$dev : $action : I feel violated" >> /tmp/netplug.log
    exit 1
    ;;
esac

Kiểm tra

/etc/init.d/netplug stop
/etc/init.d/netplug start

cat /tmp/netplug.log
eth0 : probe : probed
eth1 : probe : probed
...
eth15 : probe : probed
eth0 : in : plugged in

5

ifplugd xử lý tình huống này rất tốt:

ifplugdlà một trình nền Linux sẽ tự động định cấu hình thiết bị ethernet của bạn khi cắm cáp và tự động hủy cấu hình nếu cáp được kéo. Điều này rất hữu ích trên máy tính xách tay có bộ điều hợp mạng trên bo mạch, vì nó sẽ chỉ cấu hình giao diện khi cáp thực sự được kết nối.

ifplugd giao diện với các tiện ích cấu hình mạng gốc phân phối của bạn.

Một số tính năng:

  • Sử dụng bản địa ifup/ ifdownchương trình phân phối của bạn .
  • [...]
  • Hỗ trợ Linux SIOCETHTOOL(phiên bản mới hơn, hay còn gọi là ethtoolAPI), SIOCGMIIREG(cũ, aka mii-diag/ mii-toolAPI) và SIOCDEVPRIVATE(lâu đời nhất, hay còn gọi là mii-toolAPI) ioctl()là để có được trạng thái liên kết. Phiên bản 0.24 giới thiệu hỗ trợ phát hiện liên kết với IFF_RUNNINGcờ giao diện.
  • [...]
  • Có thể được cấu hình để bỏ qua các khoảng thời gian "rút phích cắm" ngắn ( -dtùy chọn) hoặc thời gian "cắm" ngắn ( -utùy chọn)
  • [...]
  • Chế độ tương thích cho các thiết bị mạng không hỗ trợ phát hiện cáp ( -Ftùy chọn)

LUG địa phương của tôi hướng tôi đến netplug, vì vậy tôi đã đi với điều đó thay vào đó. Cảm ơn!
CoolAJ86

Điều này đã lừa tôi với một lời cảnh báo. Khi netplugdđược bật, tôi thấy rằng tôi phải xóa auto <interface>khỏi /etc/network/interfaces. Nếu không, tôi phải cắm cáp Ethernet, tháo nó ra và cắm lại trước khi tôi nhận được địa chỉ IP từ DHCP. Khi dòng này bị xóa, tôi nhận được địa chỉ IP từ DHCP trong sự kiện trình cắm đầu tiên hoặc khi khởi động nếu cáp đã được cắm (IP khi khởi động hoạt động có hoặc không có dòng bị xóa khi ifplugdđược bật).
MrMas

5

Tôi sẽ đề nghị sử dụng ifplugd trên netplugd vì nó hoạt động tốt hơn và được duy trì tích cực.

ifplugd là một trình nền Linux sẽ tự động định cấu hình thiết bị ethernet của bạn khi cắm cáp và tự động hủy cấu hình nếu cáp được kéo. Điều này rất hữu ích trên máy tính xách tay có bộ điều hợp mạng trên bo mạch, vì nó sẽ chỉ cấu hình giao diện khi cáp thực sự được kết nối.


2

Sử dụng phần mềm này của tôi để cấu hình mạng, rất dễ dàng.

http://code.google.com.vn/p/badvpn/wiki/NCD

Chương trình NCD sau đây sẽ làm. Nó cũng cho thấy cách bạn có thể mở rộng cấu hình, trong trường hợp này bằng cách chạy một cái gì đó khi mạng lên / xuống.

process eth0 {
    # Set device.
    var("eth0") dev;

    # Wait for device to appear, set it up, and wait for cable to be plugged in.
    net.backend.waitdevice(dev);
    net.up(dev);
    net.backend.waitlink(dev);

    # DHCP configuration.
    # net.ipv4.dhcp() will block here until it obtaines an IP address.
    # It doesn't check the obtained address in any way,
    # so as a basic security measure, do not proceed if it is local.
    net.ipv4.dhcp(dev) dhcp;
    ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
    ifnot(test_local);

    # Assign IP address to interface, as obtained by DHCP.
    net.ipv4.addr(dev, dhcp.addr, dhcp.prefix);

    # Add default route.
    net.ipv4.route("0.0.0.0", "0", dhcp.gateway, "20", dev);

    # Add DNS servers.
    net.dns(dhcp.dns_servers, "20");

    # Run an external program when network comes up or goes down.
    list("/some/program/to/run/when/up", "argument") do;
    list("/some/program/to/run/when/down", "argument") undo;
    run(do, undo);
}

Lưu ý rằng điều này sẽ không chỉ xử lý cáp mạng được cắm vào hoặc ra mà cả giao diện mạng tự xuất hiện và biến mất (hữu ích nếu là USB).

Ưu điểm của việc sử dụng NCD so với các phần mềm khác như ifplugd là thiết kế của nó cho phép rất linh hoạt. Về cơ bản, nó cho phép bạn lập trình cấu hình mạng của riêng mình, trái với việc bị giới hạn ở một bộ khả năng mã hóa giới hạn.

CẬP NHẬT: Tôi đã tạo các gói Ubuntu cho BadVPN và NCD. Tôi cũng đã cập nhật wiki với hướng dẫn cài đặt và sử dụng cho Ubuntu: http://code.google.com.vn/p/badvpn/wiki/NCD#Rasty_it


Điều này thực sự có vẻ hữu ích, bạn có nghĩ rằng bạn sẽ đưa nó vào repos Ubuntu / Fedora không?
CoolAJ86

Hiện tại tôi có các gói cho Arch và Gentoo, và không có gì khác vì tôi không sử dụng các bản phát hành khác. Tôi có thể tìm thấy một số thời gian để thực hiện các gói cho các bản phát hành khác. Tuy nhiên, thật dễ dàng để biên dịch và cài đặt nó vào / usr / local hoặc một cái gì đó và tạo một tập lệnh init đơn giản để khởi động nó.
Ambroz Bizjak

Các gói Ubuntu đã được thực hiện, theo yêu cầu của bạn :)
Ambroz Bizjak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.