eth0とeth1を入れ替えるには

Linux で eth0 と eth1 など、イーサネットバイスの番号を入れ替えるには、

  • /etc/modules.conf に、


    alias eth0 e1000e
    alias eth1 e1000
    などと記述する方法。(それぞれが別デバイスドライバのみ有効)

  • /etc/udev/rules.d/nn-persistent-net.rules において、

    MAC アドレスで指定する方法。(udev を利用していることが前提)

上記 2通りの方法が主に使われますが、

組み込みシステムなどで上記の方法が使えない場合に変更する場合はどうすれば良いのでしょうか。



この様なときは、Linux Programmer's Manual (7) の NETDEVICE に説明がある SIOCSIFNAME を使えば簡単に解決可能です。

サンプルコード


#include
#include
#include
#include
#include
#include
#include
#include
#include

int
main(int argc, char *argv[])
{
int fd;
struct ifreq ifr;

if (argc < 2) {
(void) fprintf(stderr, "Usage: %s ethN ethN\n", argv[0]);
exit(EX_USAGE);
}

if ( (fd = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
err("socket(): %s\n", strerror(errno));

(void) memset(&ifr, 0x00, sizeof(struct ifreq));
(void) strcpy(ifr.ifr_name, argv[1]);
(void) strcpy(ifr.ifr_newname, argv[2]);

if (ioctl(fd, SIOCSIFNAME, &ifr) == -1)
err("ioctl(): %s\n", strerror(errno));

(void) close(fd);

return (EX_OK);
}

コンパイル


% gcc sample.c -o sample

使い方


# ifdown eth0
# ifconfig eth0 down
# ./sample eth0 eth1
# ifconfig eth1 up

とりあえず、これで eth0 が eth1 になります。

入れ替えは少し面倒ですが、この方法を知っていれば何とかなるはずです。