Linuxでは、USBマスストレージデバイスはSCSIエミュレートするような形で使用する。
そして、USB接続のマルチカードリーダライタ(CFとかSDとかを読み書きするためのアレです)は、内部的にLUNでカードスロットを区別しているものが多い。
しかし、ディストリビューションで配布されているLinuxカーネルは、デバイス内のLUNをプローブする設定の、
CONFIG_SCSI_MULTI_LUN=y
でConfigされていない場合が多い(んじゃないかと思う…確信はないけど。少なくともCentOSはそうだ)。
そういうカーネルのLinuxマシンにそういうタイプのUSB接続カードリーダライタを接続しても、使えないのである。
もちろん、
CONFIG_SCSI_MULTI_LUN=y
でカーネルを再構築して入れれば使えるのだが、面倒だなーと思ってググっていたら…。
http://lists.centos.org/pipermail/centos/2006-August/068147.html
http://www.redhat.com/archives/kickstart-list/2005-August/msg00058.html
結局、
# echo “options scsi_mod max_luns=15” >> /etc/modprobe.conf
# cd /boot
# cp -a initrd-2.6.9-42.0.2.ELsmp.img initrd-2.6.9-42.0.2.ELsmp.img.orig
(↑バックアップしておくの意)
# mkinitrd -f -v initrd-2.6.9-42.0.2.ELsmp.img 2.6.9-42.0.2.ELsmp
# reboot
これだけで、使えるようになりました。カーネル再構築にくらべたらずっとお手軽です。
この例はCentOS 4.4 kernel 2.6.9-42.0.2.ELsmpの場合。
RHEL/FedoraCore,その他クローンでも同じでしょう。
でも、各ディストリビューションで、最初からCONFIG_SCSI_MULTI_LUNしておいてほしいなあ。
なんでこれで大丈夫なのか?と思ってカーネルソースの scsi ディレクトリ内で CONFIG_SCSI_MULTI_LUN を探すと、使っているのは
scsi_scan.c
のなかの
#ifdef CONFIG_SCSI_MULTI_LUN
static unsigned int max_scsi_luns = MAX_SCSI_LUNS;
#else
static unsigned int max_scsi_luns = 1;
#endif
ここ一カ所だけである。
そしてmax_scsi_lunsは、モジュールロード時にカーネルモジュールパラメータで与えることもできるようになっている。
なるほど。
(dc395x.c, ibmmca.cでもCONFIG_SCSI_MULTI_LUNを参照していたが、これらはメンテ放置状態なのではないかと思う)
ググると modprobe.confに書くだけで、mkinitrdしなくても動く場合があるようだ。なんでだろう。
ちなみに私のマシンはSATAハードディスクなのでそっちでもscsi_modが使われる。そういうカラミだろうか?
2007/07 追記。
アップデートを重ねていくうちに、いつのまにか、なにもしなくてもUSB接続マルチカードリーダが問題なく使えるようになっていた。CentOS 4.5の カーネル 2.6.9-55 以降から?
コメント