LoginSignup
6
8

More than 5 years have passed since last update.

EC2インスタンスでMTUを永続化

Last updated at Posted at 2015-04-10

EC2インスタンスからRedshiftへ接続するためにインスタンスタイプによってはMTUを変更する必要があります。

参考
* クライアントでクエリがハングしたようになり、クラスターに到達しない | AmazonWebServices
* Amazon RedshiftとEC2のインスタンスタイプに於ける"MTU"の関係について | Developers.IO

リンク先のコマンド(ip, ifconfig)でMTUを変更できますが永続化できないため、インターフェイス設定ファイルに記述する必要がありました。

root> echo 'MTU=1500' >> /etc/sysconfig/network-scripts/ifcfg-eth0

しかし、EC2インスタンスの場合、インターフェイス設定ファイルに記述しても永続化できておらず、サーバを再起動するとMTUが元に戻ってしまいました。

調べたところ、AWS Developer Forumsに該当するスレッドがありました。

Here is what should be added to the /etc/dhcp/dhclient.conf (on Ubuntu Precise LTS):

#added these two lines before the request line
default interface-mtu 1500;
supercede interface-mtu 1500;

AWS Developer Forums: How to set MTU permanently on Amazon ...

どうやらdhclientが原因みたいです。

プロセスを確認してみます。

$ ps -ef | grep [d]hclient
root       718     1  0 08:49 ?        00:00:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0

-lf オプションで指定されているリースファイルを見てみます。

/var/lib/dhclient/dhclient-eth0.leases
lease {
  interface "eth0";
  fixed-address 10.0.0.5;
  option subnet-mask 255.255.255.0;
  option dhcp-lease-time 3600;
  option routers 10.0.0.1;
  option dhcp-message-type 5;
  option dhcp-server-identifier 10.0.0.1;
  option domain-name-servers 10.0.0.2;
  option interface-mtu 9001;
  option broadcast-address 10.0.0.255;
  option host-name "ip-10-0-0-5";
  renew 3 2015/04/08 14:07:19;
  rebind 3 2015/04/08 14:30:01;
  expire 3 2015/04/08 14:37:31;
}
...

MTU値が設定されていました。

さらに、ifup-ethスクリプトで実際の動作を見てみます。

/etc/sysconfig/network-scripts/ifup-eth.
## 99行目あたり
if [ -n "${MTU}" ]; then
   ip link set dev ${DEVICE} mtu ${MTU}
fi

...(省略)...

## 162行目あたり
if [ -n "${DYNCONFIG}" -a -x /sbin/dhclient ]; then
    if [[ "${PERSISTENT_DHCLIENT}" =  [yY1]* ]]; then
       ONESHOT="";
    else
       ONESHOT="-1";
    fi;
    generate_config_file_name
    # copy any lease obtained by the initrd
    for file in /dev/.dhclient-${DEVICE}.leases /dev/.initramfs/net.${DEVICE}.lease ; do
        if [ -f "${file}" ]; then
            mv -f $file /var/lib/dhclient/dhclient-${DEVICE}.leases
            [ -x /sbin/restorecon ] && restorecon /var/lib/dhclient/dhclient-${DEVICE}.leases > /dev/null 2>&1
        fi
    done
    DHCLIENTARGS="${DHCLIENTARGS} ${DHCP_HOSTNAME:+-H $DHCP_HOSTNAME} ${ONESHOT} -q ${DHCLIENTCONF} -lf /var/lib/dhclient/dhclient-${DEVICE}.leases -pf /var/run/dhclient-${DEVICE}.pid"
    echo
    echo -n $"Determining IP information for ${DEVICE}..."
    if [[ "${PERSISTENT_DHCLIENT}" !=  [yY1]* ]] && check_link_down ${DEVICE}; then
        echo $" failed; no link present.  Check cable?"
        exit 1
    fi

    ethtool_set

    if /sbin/dhclient ${DHCLIENTARGS} ${DEVICE} ; then
                echo $" done."
                dhcpipv4="good"
    else
                echo $" failed."
                if [[ "${IPV4_FAILURE_FATAL}"  = [Yy1]* ]] ; then
                        exit 1
                fi
                if [[ "$IPV6INIT" != [yY1]* && "$DHCPV6C" != [yY1]* ]] ; then
                        exit 1
                fi
                net_log "Unable to obtain IPv4 DHCP address ${DEVICE}." warning
    fi
...

99行目あたりでMTUが更新されてますが、162行目あたりでdhclientが動くため、そのときにMTUが上書きされているのが原因かなと思います。

したがって、dhclient.confに次のような記述をします。

/etc/dhcp/dhclient.conf
default interface-mtu 1500;
supersede interface-mtu 1500;

default interface-mtuはAWSのDHCPサーバからMTUが設定されるので記述しなくても良いと思いますが、supersede interface-mtuはDHCPクライアントの値を使うように設定するため、必ず記述してください。

上記のリンク先で、supersedesupercedeにスペルミスしていてそれをコピペしたので、設定が反映されてなくてハマってました(ちゃんとドキュメント読めばすぐ分かったので反省)。

すぐに設定反映させるには、service network restartを実行すれば良いです。

設定反映後のリースファイルを再び見てみます。

/var/lib/dhclient/dhclient-eth0.leases
lease {
  interface "eth0";
  fixed-address 10.0.0.5;
  option subnet-mask 255.255.255.0;
  option routers 10.0.0.1;
  option dhcp-lease-time 3600;
  option dhcp-message-type 5;
  option domain-name-servers 10.0.0.2;
  option dhcp-server-identifier 10.0.0.1;
  option interface-mtu 1500;
  option broadcast-address 10.0.0.255;
  option host-name "ip-10-0-0-5";
  renew 5 2015/04/10 02:43:14;
  rebind 5 2015/04/10 03:12:24;
  expire 5 2015/04/10 03:19:54;
}
...

MTUが1500に変更されていることがわかります。

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8