selecao3のブログ

技術系の備忘録

hotplugイベントが発火しない

hotplugイベントが発火しない

 環境

 

問題

 /hogeというマウントポイントに対し、

# mv /etc/network/ /hoge/etc/

# ln -s /hoge/etc/network /etc/network

というコマンドを実行し、再起動させると、起動時に自動でインターネットに繋がらなくなった。

理由

 /hogeがマウントされる前に、カーネルethernetの接続を検知するから。

つまり、/etc/networkが存在していない時点でhotplugイベントが発火したから。

解決策

 /etc/udev/rules.d/60-enp0s3.rules を作成し、下記の一文を書く。

KERNEL=="enp0s3", RUN="/bin/mount /hoge"

経緯

 バイト先で、以下の依頼があった。

 /hogeというマウントポイントがあるのだが、そこに/etc/networkを移動させ、シンボリックリンクで元の/etc/networkに貼ると、起動時にネットに繋がらなくなる。

 原因と対策を考えてほしい。

  そんなこんなで調査が始まった。

 Linuxは遊び程度でしか触ったことがなかったのでそこまで深くは分からなかったが、「ショートカット(シンボリックリンク)貼ったのにネットが自動起動しなくなる」という点がまず不思議だった。

 考えていくうちに「/hogeがマウントされていない、つまり/etc/network/*が存在していないときにethernetが接続されたせいでhotplugイベントが起きなかった」と考えるのが自然だと辿り着いた。

 まず、対策として思いついたのが以下の3つ

  • ルートディレクトリがマウントされる前に/hogeをマウントさせる
  • (Eathernetが繋がったうえで)hotplugイベントのタイミングを弄る
  • systemd.deviceの起動を遅延させる。

1番目:

「ルートディレクトリの前に/hogeがマウントされへんとシンボリックリンクのファイルが認識されへんやん!」ということで思いついた。

fstabのルートディレクトリの項目のoption部分を"noauto"に書き換えることで自動マウントを禁止し、/etc/init.d/rc.localを作成し、その中に"mount /"と書いた。

fstabによってルートディレクトリ以外をマウントさせ、最後にルートディレクトリをマウントしたらいいなぁと思ってやってみた。

結果は失敗で、理由は「Debianを起動させた時点でルートディレクトリ(というよりもブートローダーがインストールされているディレクトリ)はマウントされている」から。あと、「"mount"という/bin/mountコマンドが使えている=ルートディレクトリが既にマウントされている」である。

 2番目:

「hotplugイベントを任意のタイミングに変えれば繋がるんちゃうか!?」っていう感じ。

結果は失敗。というより、遅延の方法が思いつかなかったし、上記に書いた解決方法の方がスマートのように感じた。

3番目:

「deviceの検知を遅延させたろ!」的な発想である。

結果は失敗というか、自分自身systemdについてよく理解していなかったので出来なかった。

ちなみになぜsystemd.deviceの起動遅延に辿り着いたかというと、/var/log/daemon.confにsystem[1] fount device ethernet...みたいなことが書いてあったから。

 

で、調べている内にudevというものに出会った。

udevとは、例えば起動時に外部端末が接続されると、カーネルはそれを検知しudevくんに伝える。udevくんはrulesファイルに従ってアクションを起こす。

ざっくりいうとUSBやらLANケーブルを接続or切断した際に動的に行動してくれるスゴイやつである。

で、あとは解決方法に書かれている通りである。