そこで最近、オークションで富士通のPG-248H(D2616)というSAS RAIDカードを(安く)入手した。こいつに入れ替えればバッチリ!…と思いきや、こいつは物理ドライブをOSにそのまま見せるモードに対応していなかったのである。このカードに限らず、LSI SAS 2108搭載のものは皆そうらしい。LSI SAS 2008の場合はITモードのファームウエアを書き込むことでHBAとして利用可能になるらしいが、こっちはそれもできない。
面倒臭かったので別製品(HP Smart Array P410)をまたオークションで入手したのだが、動かしてみると、なんとこっちも物理ドライブをOSに見せられないことが判明。しかもこっちはSASは6GbpsだがSATAは3Gbpsまでだった(笑)
ただググったところ、Hewlett-Packard P400 physical drive access and >2TB drivesというページを発見した。同ページによると、通常はドライバ側でマスクしている物理ドライブをマスクしないようにhpsaドライバを改造すればいいらしい。Ubuntu 16.04のカーネル(4.4系)では、同ページのパッチが使えないので以下のようなものを作成して試してみたところ、特に問題なく動作しているようだ。本当にこれでいいのか少し不安だが、動けば良かろうなのだ。
hpsaドライバのパッチ(4.4系向け)
--- hpsa.c.orig 2017-10-25 17:56:54.702177019 +0900+++ hpsa.c 2017-10-23 21:26:06.729861753 +0900
@@ -89,6 +89,10 @@
module_param(hpsa_simple_mode, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(hpsa_simple_mode,
"Use 'simple mode' rather than 'performant mode'");
+static int hpsa_expose_masked;
+module_param(hpsa_expose_masked, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(hpsa_expose_masked,
+ "Expose masked physical devices (cf. BSD hw.ciss.expose_hidden_physical)");
/* define the PCI info for the cards we can control */
static const struct pci_device_id hpsa_pci_device_id[] = {
@@ -4101,7 +4105,7 @@
if (!tmpdevice->external && physical_device) {
skip_device = hpsa_skip_device(h, lunaddrbytes,
&physdev_list->LUN[phys_dev_index]);
- if (skip_device)
+ if (!hpsa_expose_masked && skip_device)
continue;
}
@@ -4148,7 +4152,7 @@
* Expose all devices except for physical devices that
* are masked.
*/
- if (MASKED_DEVICE(lunaddrbytes) && this_device->physical_device)
+ if ((MASKED_DEVICE(lunaddrbytes) && this_device->physical_device) && !hpsa_expose_masked)
this_device->expose_device = 0;
else
this_device->expose_device = 1;
調子に乗って、PG-248H用のmegaraid_sasドライバも同様の改良が出来ないかとソースを見たところ、こっちはmegaraid_sas.hの定数を1つ書き換えて、物理ドライブの「Unconfigured Good」ステータスを「System」ステータスとして取り扱うようにすれば良さそうだと分かった。試したところ、こちらも動作は問題なさそうだ。
megaraid_sasドライバのパッチ(4.4系向け)
--- megaraid_sas.h.orig 2017-10-25 18:02:27.276084072 +0900
+++ megaraid_sas.h 2017-10-25 18:01:44.246440683 +0900
@@ -431,7 +431,7 @@
MR_PD_STATE_REBUILD = 0x14,
MR_PD_STATE_ONLINE = 0x18,
MR_PD_STATE_COPYBACK = 0x20,
- MR_PD_STATE_SYSTEM = 0x40,
+ MR_PD_STATE_SYSTEM = 0x00,
};