ablog

不器用で落着きのない技術者のメモ

インターフェースを down するときのシステムコールを調べてみた

[root@localhost ~]# strace -tf -o strace.log ifconfig eth0 down
[root@localhost ~]# less strace.log
3096  23:36:01 execve("/sbin/ifconfig", ["ifconfig", "eth0", "down"], [/* 19 vars */]) = 0
3096  23:36:01 brk(0)                   = 0x8c5e000
3096  23:36:01 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
3096  23:36:01 open("/etc/ld.so.cache", O_RDONLY) = 3
3096  23:36:01 fstat64(3, {st_mode=S_IFREG|0644, st_size=44348, ...}) = 0
3096  23:36:01 mmap2(NULL, 44348, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fb8000
...
3096  23:36:01 access("/proc/net", R_OK) = 0
3096  23:36:01 access("/proc/net/unix", R_OK) = 0
3096  23:36:01 socket(PF_FILE, SOCK_DGRAM, 0) = 3
3096  23:36:01 socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
3096  23:36:01 access("/proc/net/if_inet6", R_OK) = 0
3096  23:36:01 socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 5
3096  23:36:01 access("/proc/net/ax25", R_OK) = -1 ENOENT (No such file or directory)
3096  23:36:01 access("/proc/net/nr", R_OK) = -1 ENOENT (No such file or directory)
3096  23:36:01 access("/proc/net/rose", R_OK) = -1 ENOENT (No such file or directory)
3096  23:36:01 access("/proc/net/ipx", R_OK) = -1 ENOENT (No such file or directory)
3096  23:36:01 access("/proc/net/appletalk", R_OK) = -1 ENOENT (No such file or directory)
3096  23:36:01 access("/proc/sys/net/econet", R_OK) = -1 ENOENT (No such file or directory)
3096  23:36:01 access("/proc/sys/net/ash", R_OK) = -1 ENOENT (No such file or directory)
3096  23:36:01 access("/proc/net/x25", R_OK) = -1 ENOENT (No such file or directory)
3096  23:36:01 open("/usr/share/locale/locale.alias", O_RDONLY) = 6
3096  23:36:01 fstat64(6, {st_mode=S_IFREG|0644, st_size=2528, ...}) = 0
3096  23:36:01 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc2000
3096  23:36:01 read(6, "# Locale name alias data base.\n#"..., 4096) = 2528
3096  23:36:01 read(6, "", 4096)        = 0
3096  23:36:01 close(6)                 = 0
3096  23:36:01 munmap(0xb7fc2000, 4096) = 0
3096  23:36:01 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
3096  23:36:01 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
3096  23:36:01 open("/usr/share/locale/en_US/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
3096  23:36:01 open("/usr/share/locale/en.UTF-8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
3096  23:36:01 open("/usr/share/locale/en.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
3096  23:36:01 open("/usr/share/locale/en/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
3096  23:36:01 ioctl(4, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0 ★ココ
3096  23:36:01 ioctl(4, SIOCSIFFLAGS, 0xbf93bc78) = 0
3096  23:36:01 exit_group(0)            = ?

ioctl システムコールを使ってインターフェースを down してるぽい。
「ifconfig ioctl」でググってみると、あきみちさんのサイトにヒットしたので読んでみると

Linuxでは、ネットワークインターフェースの状態を変更するためにioctlを利用します。

インターフェースをup状態にする:Geekなぺーじ

と、やはりそうらしい。

補足

インターフェースを down すると、そのインタフェースを使って通信しているプロセスのソケットがクローズされると思ったが、/proc/PID/fd を観察してみたところ、down してもクローズされずにそのままだった。

[root@localhost ~]# ls -l /proc/3419/fd
total 0
lr-x------ 1 oracle oracle 64 Apr 20 23:50 0 -> /dev/null
l-wx------ 1 oracle oracle 64 Apr 20 23:50 1 -> /dev/null
lr-x------ 1 oracle oracle 64 Apr 20 23:50 10 -> /home/oracle/app/oracle/product/11.2.0/dbhome_2/rdbms/mesg/oraja.msb
lr-x------ 1 oracle oracle 64 Apr 20 23:50 11 -> /home/oracle/app/oracle/product/11.2.0/dbhome_2/rdbms/mesg/oraus.msb
lrwx------ 1 oracle oracle 64 Apr 20 23:50 14 -> socket:[8881] ★ここの状態を観察する
l-wx------ 1 oracle oracle 64 Apr 20 23:50 2 -> /dev/null
lrwx------ 1 oracle oracle 64 Apr 20 23:50 256 -> /home/oracle/app/oracle/oradata/orcl/system01.dbf
lrwx------ 1 oracle oracle 64 Apr 20 23:52 257 -> /home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
lr-x------ 1 oracle oracle 64 Apr 20 23:50 3 -> /dev/null
lr-x------ 1 oracle oracle 64 Apr 20 23:50 4 -> /dev/null
lr-x------ 1 oracle oracle 64 Apr 20 23:50 5 -> /home/oracle/app/oracle/product/11.2.0/dbhome_2/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oracle 64 Apr 20 23:50 6 -> /proc/3419/fd
lr-x------ 1 oracle oracle 64 Apr 20 23:50 7 -> /dev/zero
l-wx------ 1 oracle oracle 64 Apr 20 23:50 8 -> /home/oracle/app/oracle/diag/rdbms/orcl2/orcl/trace/orcl_ora_3419.trc
l-wx------ 1 oracle oracle 64 Apr 20 23:50 9 -> /home/oracle/app/oracle/diag/rdbms/orcl2/orcl/trace/orcl_ora_3419.trm

インターフェースが down しても、抜線してもユーザープロセスから見ると区別つかなさそうだ。OSカーネル内のデータ構造(/proc/net/if_inet6など)には違いがあると思うが。NIC の bonding やチーミングを行っている場合は、デバイスドライバが高度な動きをすると思うが、ドライバのレイヤーでよろしくやってくれて、ユーザープロセスから見ると何もわからないのではないかと思う。