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);
これで、終了です。