- strace でインターフェース 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 やチーミングを行っている場合は、デバイスドライバが高度な動きをすると思うが、ドライバのレイヤーでよろしくやってくれて、ユーザープロセスから見ると何もわからないのではないかと思う。