カテゴリー: FreeBSDとLinux
参照数: 3037


FreeBSD 7.x 以前の問題です。
FreeBSD 8以上は、USBモジュールを全面書き換えたらしいので、問題無くなりました。

自宅サーバを構築した時に、気になるのが電気代と静粛性です。

両方とも共通するのは、ハードディスクのモーター音です。

これらを簡単に解決するのに、USBメモリや、SDメモリカードをルートでマウントしてしまおうというものです。

FreeBSDは、これらをマウントできるようになっていますので、特に問題無く構築できるのですが、問題になってくるのが、アクセススピードと信頼性です。

アクセススピードは、ハードの特性と相談するしか無いので、良いものを購入するしかないでしょう。

信頼性は、gmirror等のミラーでなんとかしてしまえば良いと思います。

当方もルートとvarをUSBメモリとSDカードで構築しているので、無音サーバとなっています。

しかしながら、たまにカーネルの問題(?)で認識できないデバイスが存在するようです。

そこで、強引に認識させてしまうようにソースを改造してしまいました。

 

/usr/src/sys/dev/usb/ohci.cを改造します。

ohci_add_done関数の戻値は、voidですが、intにします。

「panic("ohci_add_done: addr 0」とあるソースをコメントアウトします。

これで、ここのエラーによってカーネルパニックを起こさないように改造します。

その後、コール側にエラーを知らせる為にその直後にreturn -1;を追加しておきます。

後、この関数が問題無く完了すれば、return 0;となるように関数の最後に追加しておきます。

関数の戻値を改造したので、宣言も改造しておきます。 ソースの前半にあるので、「Static void           ohci_add_done(ohci_softc_t *, ohci_physaddr_t);」を「Static int            ohci_add_done(ohci_softc_t *, ohci_physaddr_t);」としておきましょう。

 

最後に呼び出す側のコードを修正します。

ohci_intr1関数内に呼び出しているコードがあるので、修正します。

元)

               ohci_add_done(sc, done &~ OHCI_DONE_INTRS);
               usb_schedsoftintr(&sc->sc_bus);
               eintrs &= ~OHCI_WDH;
後)

               if( ohci_add_done(sc, done &~ OHCI_DONE_INTRS) == 0 ) {
                       usb_schedsoftintr(&sc->sc_bus);
                       eintrs &= ~OHCI_WDH;
               }
               else
                       return (0);

これで、終了です。