先日気になった、スリープからの復帰後に、EvolutionがIPv6(以下v6)でなくIPv4(以下v4)を使ってしまう件だが、やはり、v6とv4の初期化時間の違いによるようだ。

今日、後述の処理の有効性を調べるため、一旦ネットを全部無効にして、手でv6とv4を順番に有効にしようとしてみたら、v6の初期化が全然終わらず、設定間違いや何かのバグで停まっているのかと思った。しかし、実は処理は続いていて、忘れた頃に有効(使用可能)になった。と言っても何十分も掛かる訳ではなく10秒くらいだが、体感としては随分遅い。

処理時間が違う理由を考えてみると、僕のデスクトップPCでは、v4はローカルな固定IPアドレスなので、初期化時間はほぼ0だが、v6はプロバイダの設備やルータと相談しながらアドレスを振っているからだろうと思われる。更に、先日使い始めたプライバシー拡張も遅くなる一因なのかも知れない。元々v6は複雑で重いのが、更に遅くなるのだろうと想像する。

という訳で、初期化の時間差はどうにもならないけれど、それでも意地でもEvolutionにv6を使わせたくなってしまい、次のような処理を考えた。

  • EthernetのNW-IFとして、v6専用とv4専用の2つを作る。
    • どちらも物理IFは同じ(ルータに繋がる)なので、片方は仮想的なものにする必要があり、v4をaliasにした。
      • aliasの名前(suffix)は数字でなくてもいいようだったので、分かりやすくしようと":v4"にした(例: "eth0:v4")。駄目なら数字にすればいい。
  • スリープになる時は、まずv4専用NW-IFを無効にし、そのあとでv6専用NW-IFを無効にする。
    • Linuxのマニュアルを読むと、本来のNW-IF(ここではv6専用NW-IF)を無効に(ifdown)すると、aliasも無効になると書いてあるが、先にaliasを無効に(削除)しておかないと内部に残骸が残ってしまうようで、次(復帰時)にaliasが作れなくなってしまったので、このようにしている。
  • スリープからの復帰時には、まずv6専用NW-IFを有効にし、そのあとでv4専用NW-IFを有効にする(aliasを作る)。
    • 念のため、v6の初期化のあとで0.5秒待ってから、v4専用NW-IFを有効にするようにした。
    • OSの起動時も同様である。

こうすることで、スリープからの復帰時に、(スリープ中にメールチェック間隔が過ぎたために)ネットが使えるようになるのを手ぐすね引いて待っているEvolutionは、v6専用NW-IFが使えるようになった時点でそっち経由で通信し出すと考えた。

なお、Evolutionがネットの状態をチェックしないようにしたら、スリープからの復帰後はエラーなどを出さずに全然メールチェックしなくなってしまったので、PCをスリープさせる場合でも意図してv6を使わせ続けるには こういう処理が必要そうだ。

本来は、スリープからの復帰後にタイムアウトで通信を中断し、エラーを出すとかリトライすべきなのだが、Evolutionはなぜか だんまりを決め込んでしまうようだ。あるいは、タイムアウトが長過ぎる(数時間?)のだろうか?

実装してみたら、(例によって随分試行錯誤したが)うまくいった。明日、(寝ている間の)長時間スリープ後の結果を見るまでは確定しないが(→ 12/4の朝に問題なかった。: 12/4 9:49)、今はめでたく、通常時は自分のサーバ関連のv4の使用ポート数が0になった。

 

とは言え、冷静に考えれば、そこまでv6を使う意味はミリもないのだが、気分とか趣味(v6が好きだからでなく、「きちんとしたい」みたいな、あるいは、「僕の目の黒いうちは、Evolutionなんかには好き勝手はさせねえぜ」w)的な理由で頑張ってしまった。すなわち、冷静じゃないってことだw

  •  1
  •  0

コメントを書く / Write a comment

名前 / Name    

メール / Mail 

URL