etch/2.6.18-5-xen-amd64をG33チップセットで使う

メモリがあまりにも安いんで8GB積んだマシンを作ってみた。CPUはCore 2 Quad Q6600でマザーボードはG33チップセットを使ったDG33TL。ところがetchインストーラでインストールできず。武藤さんのetch-custom-1013.isoでインストールはできた。

しかしXenを使うにはどうしたら、、、と困ってしまったんだけど、etchの2.6.18-5-xen-amd64にちょっと手を加えたら動いたので、以下そのメモ。(Ubuntuカーネルを持ってきても良いような気もするけど)


なお、

  • DG33TLのIDEインターフェースは(インストール時以外は)使わない
  • SATAAHCIモードで使う

という前提です。IDEインターフェースはetch-custom-1013.isoでは動くけど2.6.18では動かないです。SATAIDEモード/RAIDモードは試してません。


まずは、武藤さんのetch-custom-1013.isoで普通にインストールする。ただし、起動パラメータに pci=nommconf を指定しないと途中で止まってしまいます。

インストールしたら、以下の手順で 2.6.18-5-xen-amd64 を作る。

$ apt-get source linux-2.6
$ cd linux-2.6-2.6.18.dfsg.1
$ dch -i

dch -i で起動するエディタの最初の行が次のようになっているのでバージョンを適宜書き換える。このバージョンの値はあとで使用します。

linux-2.6 (2.6.18.dfsg.1-13etch5) stable-security; urgency=low

私は次のようにしました(あとで使うのは 13etch4.raku2 の部分)。

linux-2.6 (2.6.18.dfsg.1-13etch4.raku2) stable-security; urgency=low


debian/patches/bugfix に次のふたつのファイルを作る。ファイル名は ich9.patch と xen-pm-idle-export.patch

diff -r c8992c4b7a1c -r 8bf8b3d201a9 drivers/scsi/ahci.c
--- a/drivers/scsi/ahci.c       Tue Sep 18 09:34:09 2007 +0100
+++ b/drivers/scsi/ahci.c       Tue Sep 18 16:21:17 2007 +0100
@@ -317,6 +317,28 @@ static const struct pci_device_id ahci_p
          board_ahci }, /* ICH8M */
        { PCI_VENDOR_ID_INTEL, 0x282a, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_ahci }, /* ICH8M */
+       { PCI_VENDOR_ID_INTEL, 0x2922, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH9 */
+       { PCI_VENDOR_ID_INTEL, 0x2923, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH9 */
+       { PCI_VENDOR_ID_INTEL, 0x2924, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH9 */
+       { PCI_VENDOR_ID_INTEL, 0x2925, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH9 */
+       { PCI_VENDOR_ID_INTEL, 0x2927, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH9 */
+       { PCI_VENDOR_ID_INTEL, 0x2929, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH9M */
+       { PCI_VENDOR_ID_INTEL, 0x292a, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH9M */
+       { PCI_VENDOR_ID_INTEL, 0x292b, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH9M */
+       { PCI_VENDOR_ID_INTEL, 0x292f, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH9M */
+       { PCI_VENDOR_ID_INTEL, 0x294d, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH9 */
+       { PCI_VENDOR_ID_INTEL, 0x294e, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH9M */
 
        /* JMicron */
        { 0x197b, 0x2360, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
diff -r c8992c4b7a1c -r 8bf8b3d201a9 drivers/scsi/ata_piix.c
--- a/drivers/scsi/ata_piix.c   Tue Sep 18 09:34:09 2007 +0100
+++ b/drivers/scsi/ata_piix.c   Tue Sep 18 16:21:17 2007 +0100
@@ -125,6 +125,7 @@ enum {
        ich6m_sata_ahci         = 6,
        ich7m_sata_ahci         = 7,
        ich8_sata_ahci          = 8,
+       ich9_sata_ahci          = 9,
 
        /* constants for mapping table */
        P0                      = 0,  /* port 0 */
@@ -198,6 +199,18 @@ static const struct pci_device_id piix_p
        { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
        /* Mobile SATA Controller IDE (ICH8M, ditto) */
        { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
+       /* SATA Controller 1 IDE (ICH9) */
+       { 0x8086, 0x2920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich9_sata_ahci },
+       /* SATA Controller 1 IDE (ICH9) */
+       { 0x8086, 0x2921, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich9_sata_ahci },
+       /* SATA Controller 2 IDE (ICH9) */
+       { 0x8086, 0x2926, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich9_sata_ahci },
+       /* Mobile SATA Controller 1 IDE (ICH9M) */
+       { 0x8086, 0x2928, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich9_sata_ahci },
+       /* Mobile SATA Controller 2 IDE (ICH9M) */
+       { 0x8086, 0x292d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich9_sata_ahci },
+       /* Mobile SATA Controller 2 IDE (ICH9M) */
+       { 0x8086, 0x292e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich9_sata_ahci },
 
        { }     /* terminate list */
 };
@@ -361,9 +374,22 @@ static const struct piix_map_db ich8_map
        .present_shift = 8,
        .map = {
                /* PM   PS   SM   SS       MAP */
-               {  P0,  NA,  P1,  NA }, /* 00b (hardwired) */
+               {  P0,  P2,  P1,  P3 }, /* 00b (hardwired when in AHCI) */
                {  RV,  RV,  RV,  RV },
-               {  RV,  RV,  RV,  RV }, /* 10b (never) */
+               {  IDE,  IDE,  NA,  NA }, /* 10b (IDE mode) */
+               {  RV,  RV,  RV,  RV },
+       },
+};
+
+static const struct piix_map_db ich9_map_db = {
+       .mask = 0x3,
+       .port_enable = 0x3,
+       .present_shift = 8,
+       .map = {
+               /* PM   PS   SM   SS       MAP */
+               {  P0,  P2,  P1,  P3 }, /* 00b (hardwired when in AHCI) */
+               {  RV,  RV,  RV,  RV },
+               {  IDE,  IDE,  NA,  NA }, /* 10b (IDE mode) */
                {  RV,  RV,  RV,  RV },
        },
 };
@@ -376,6 +402,7 @@ static const struct piix_map_db *piix_ma
        [ich6m_sata_ahci]       = &ich6m_map_db,
        [ich7m_sata_ahci]       = &ich7m_map_db,
        [ich8_sata_ahci]        = &ich8_map_db,
+       [ich9_sata_ahci]        = &ich9_map_db,
 };
 
 static struct ata_port_info piix_port_info[] = {
@@ -485,6 +512,18 @@ static struct ata_port_info piix_port_in
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 */
+               .port_ops       = &piix_sata_ops,
+       },
+
+       /* ich9_sata_ahci */
+       {
+               .sht            = &piix_sht,
+               .host_flags     = ATA_FLAG_SATA |
+                                 PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR |
+                                 PIIX_FLAG_AHCI,
+               .pio_mask       = 0x1f, /* pio0-4 */
+               .mwdma_mask     = 0x07, /* mwdma0-2 */
+               .udma_mask      = 0x7f, /* udma0-6 */
                .port_ops       = &piix_sata_ops,
        },
 };
diff -r c8992c4b7a1c -r 8bf8b3d201a9 sound/pci/hda/hda_intel.c
--- a/sound/pci/hda/hda_intel.c Tue Sep 18 09:34:09 2007 +0100
+++ b/sound/pci/hda/hda_intel.c Tue Sep 18 16:21:17 2007 +0100
@@ -80,6 +80,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},
                         "{Intel, ICH7},"
                         "{Intel, ESB2},"
                         "{Intel, ICH8},"
+                        "{Intel, ICH9},"
                         "{ATI, SB450},"
                         "{ATI, SB600},"
                         "{ATI, RS600},"
@@ -1634,6 +1635,8 @@ static struct pci_device_id azx_ids[] = 
        { 0x8086, 0x27d8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH7 */
        { 0x8086, 0x269a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ESB2 */
        { 0x8086, 0x284b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH8 */
+       { 0x8086, 0x293e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH9 */
+       { 0x8086, 0x293f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH9 */
        { 0x1002, 0x437b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB450 */
        { 0x1002, 0x4383, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB600 */
        { 0x1002, 0x793b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATIHDMI }, /* ATI RS600 HDMI */
--- source-amd64-xen/arch/x86_64/kernel/process-xen.c.bad       2007-12-04 20:41:45.548664618 +0900
+++ source-amd64-xen/arch/x86_64/kernel/process-xen.c   2007-12-06 00:22:52.213565991 +0900
@@ -72,6 +72,7 @@
  * Powermanagement idle function, if any..
  */
 void (*pm_idle)(void);
+EXPORT_SYMBOL(pm_idle);
 static DEFINE_PER_CPU(unsigned int, cpu_idle_state);
 
 static ATOMIC_NOTIFIER_HEAD(idle_notifier);


debian/patches/series に次のふたつのファイルを作る。ファイル名は 13etch4.raku2 と 13etch4.raku2-extra (この 13etch4.raku2 が dch -i で付けたバージョンの値)

+ bugfix/ich9.patch
+ bugfix/xen-pm-idle-export.patch *_xen *_xen-vserver


DG33TLのオンボードGbEは2.6.18のe1000では動かないので、あとで最新のe1000をインストールする。そのためここでは一応e1000をはずしておく。debian/arch/amd64/config 内で

CONFIG_E1000=n

とする。


次の手順でビルドする。

$ fakeroot debian/rules clean
$ fakeroot debian/rules setup
$ fakeroot make -f debian/rules.gen binary-arch-amd64-xen DEBIAN_KERNEL_JOBS=8

DEBIAN_KERNEL_JOBSは make の -j オプションに渡される。この値はコア数より少し多めにするのがいいみたい。4コアだからと4にすると、ビルド中にtopで見てると、数%〜10%ぐらいアイドルになってることが結構ある。


できた .deb をインストール。


オンボードのe1000を使う場合は再起動するとネットワークが繋がらなくなるので、再起動する前に最新のドライバをダウンロードしておく。
http://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&Inst=Yes&ProductID=2247&DwnldID=9180&strOSs=39&OSFullName=Linux*%E2%8C%A9=eng


再起動。


e1000のインストール

$ tar xzf e1000-7.6.12.tar.gz
$ cd e1000-7.6.12/src
$ sudo make install MANDIR=/usr/local/man
$ sudo modprobe e1000


これで、Xenのdom0として動かすことができた。


なお、ich9.patch は http://lists.xensource.com/archives/html/xen-changelog/2007-09/msg00310.html を参考にしました。debianの2.6.18にはirqとデバイスIDだけすでにパッチが当たっていたので、ich9.patch は残りの箇所を抜き出したものです。

xen-pm-idle-export.patch は http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=405140#22 を参考にしました。これが無くても動きますが、起動時に pm_idle ってシンボルが無いといわれます。