2017年10月25日水曜日

hpsaドライバとmegaraid_sasドライバの改造

現在、自宅のファイルサーバーではHighPoint RocketRAID 2680 SGLというSAS RAIDカードをHBAとして使ってZFSストレージプールを作成しているのだが、こいつのドライバはLinuxカーネルに正式に取り込まれておらず、ちょっとした調整をしないと今時の環境では使えない。調整の情報はUbuntu Forumなどにあって、その通りにすれば動くのだが、高負荷時にビープ音が出て停止したり、SATAが最高3Gbpsまでだったりと、少し不満がある。

そこで最近、オークションで富士通の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,
  };

0 件のコメント: