This document was edited: 2006-02-23 .. 2018-02-06

Linux 戦記

ここに掲載する内容は覚書程度です。情報の確度・精度についてはあまり期待しないでください。


Ubuntu GNOME (13.10) に関するいくつかの覚え書き」「Debian (6.0 - squeeze) に関するいくつかの覚え書き」「NVIDIA ドライバーと GeForce FX 5700」「NTFS ドライブの使用」「Debian (5.0 - lenny) に関するいくつかの覚え書き」「ATFintek」「【思い出話】NVClock の GeForceFX 5700 対応化の経緯」「CUI 環境の画像モード化」「SB AWE64」「Planex ENW-9501-F


画像

Ubuntu GNOME 13.10 に関するいくつかの覚え書き

マシンスペックが上がったので Debian から念願の Ubuntu 系に移行。本家 Ubuntu は Unity が最悪だったので、迷わず直ちに Ubuntu-GNOME に乗り換え。

  1. ネットワーク性能のチューニングもやってみたが、何もしないデフォルト状態と比べて誤差の範囲以上の向上は見られなかった。最近の Linux もしくは Ubuntu では、このあたりの自動調整も十分に最適化されてきているのだろうと思う。
  2. 32-bit 版のアプリケーションを 64-bit 版で利用するために sudo apt-get install ia32-libs した。

Debian (6.0 - squeeze) に関するいくつかの覚え書き

NVIDIA ドライバーと GeForce FX 5700

Debian 3 (etch) の頃からすると Linux のグラフィック関係ではかなり変化があった。それは X.Org が改新されてきたことと、そして NVIDIA のドライバーがオープンソース版の互換ドライバーである Nouveau ドライバーへと置き換えられつつあるという点だ。Debian 6 (squeeze) ではインストール後のデフォルト状態で Nouveau ドライバーがちゃんと動作しており、最適な解像度で X-Window が起動するようになっている。Debian 5 (lenny) まででは、デフォルト状態では低解像度でしか X-Window が動作しなかった状態からは大きく改善した。

画面表示自体は Nouveau ドライバーでも問題がなくなったが、まだ一つだけ問題が残っている。それは VGA ファンの制御である。FX 5700 には i2c バスを通じて接続されている 3 つの制御用チップがあり、2 つはモニター制御用のもののようで、それに対する Nouveau ドライバーの対応は進んでいるようだが、最後の 1 つが VGA ファンや GPU クロックの制御に使われており、このチップを Nouveau ドライバーはまだ認識してくれない。そのため依然として既定の Nouveau ドライバーに頼らず、NVIDIA の純正ドライバーを改めてインストールする作業が必要となる。

NVIDIA ドライバーのインストール作業

基本的には README に書かれているが、README 自体はかなりの情報量だ。普通にドライバーをインストールすることは特に面倒な作業ではなく、カーネルソースヘッダなどを用意した上で、(X-Window を起動していない)メンテナンスモード下でインストール用プログラムを実行すれば、あとは画面の指示に従えばいい。この過程で Nouveau ドライバーを無効化することになるので、(Nouveau ドライバーを再度有効化する作業を手動で行わない限り)以後、Nouveau ドライバーによる X-Window の起動はできなくなる。そして NVIDIA ドライバーが有効になれば、以後は NVIDIA ドライバーによって X-Window を起動することになる。

ところで、NVIDIA ドライバーは、単にドライバーとしての機能を提供するだけではなく、インストール時に Linux のカーネルを一部改変するみたいだ(おそらくそのためにインストール時にカーネルソースを利用する)。インストール後、起動メッセージで NVIDIA が カーネルを侵して(taint)いると表示されるようになる。そのため、カーネルを再構成・インストールした場合には、その改変が取り消されてしまい、NVIDIA ドライバーが立ち上がらなくなる。従って、NVIDIA ドライバーのインストール作業を再度しなければならなくなる。カーネルを再構築する都度、NVIDIA ドライバーのインストール作業をし直す必要がある。

NVIDIA ドライバーの修正ポイント

ちなみに僕のマシンではハードウェアの性能的に、NVIDIA ドライバーのデフォルト設定のままでは 2 つの点で性能が抑えられてしまう。通常は、README に従って自動モードでインストールすればいいのだが、ここではその 2 点について設定を最適化するために手動モードでインストールする。この手動モードのインストール方法は README の付録 F に説明されているやり方であり、まずインストールパッケージを解凍し、パッケージ中のドライバーのソースコードを修正してから、インストーラーを -n オプション付きで実行してインストールするやり方である。

修正ポイントは以下の 2 点:

VIA の Apollo Pro 133 系チップセットの M/B の場合、カタログスペック上は AGP の転送モードが 4X までとなっているのだが、これは不安定なので NVIDIA ドライバーは既定ではわざと 2X に性能を落とす仕様になっている。これを敢えて 4X にしたい場合は、NVIDIA-Linux-x86-173.14.36-pkg1/usr/src/nv/nv-reg.h を以下のように修正する:

- NV_DEFINE_REG_ENTRY(__NV_ENABLE_VIA_4X, 0);
+ NV_DEFINE_REG_ENTRY(__NV_ENABLE_VIA_4X, 1);

次に SBA (Side Band Addresssing) を有効化する設定。North Bridge の 82C694x では SBA 可能(一方、FW は不可らしい)なのだが、NVIDIA ドライバーは既定ではこれらの機能を無効にしている。SBA や FW (Fast Write) を有効にするには、/etc/modprobe.d を使う方法でも可だが、前述の 4X モードの修正と一緒に nv-reg.h の修正で済ませることにする:

- NV_DEFINE_REG_ENTRY(__NV_ENABLE_AGPSBA, 0);
+ NV_DEFINE_REG_ENTRY(__NV_ENABLE_AGPSBA, 1);

AGP ホストブリッジやビデオカードの性能を調べる方法:

NTFS ドライブの利用

nfts-3g を使う。/etc/fstab に以下の行を追加して自動マウントするようにする:

/dev/hda4 /mnt/ntfs ntfs-3g gid=users 0 0

/mnt/ntfs はあらかじめ作成しておく。またこの例の場合は NTFS ドライブが /dev/hda4 の場合である。

Debian (5.0 - lenny) に関するいくつかの覚え書き

ATFintek

2 年前に testing 時代の Debian (3.2 - etch) を同じマシンにインストールした時、NVClock 0.8b にパッチを当てて、ファンを静音化することが可能だった。ところが、最新の Debian (5.03 - lenny) では、NVClock がセンサーチップを認識できず、ファンを制御することができない。これには困った。FX 5700 は最新の X.Org 7.x を動作させるにはまだ十分なパフォーマンスが出るのだが、ファンが爆音過ぎて不快きわまりない。

NVClock のソースを眺めてちょっと弄ってみたりしたけど、今回はどうにもならなかった。

仕方ないので、自分でゼロからプログラムを書くことにした。Perl には習熟しているとはいえ、C 言語でプログラムを組むのは今回が初めて。それも Linux という慣れないプラットフォームの i2c デバイスを制御するという、情報も豊富ではないドライバーレベルでのプログラミングだ。

まず、センサーチップは Fintek の F75373S というものなのだが、これについての情報は以前 NVClock にパッチを当てた時にネットで調べて手に入れたデータシートが手元に残っている。次に、lm_sensors という有名なツールがあるのだが、それを使ってまずは、F75373S が存在する i2c バスの番号と、サブチャンネルの番号を確認した。lm_sensors で認識されているということは、OS やドライバの問題ではないことから、何とかなりそうだ。i2c_dev というモジュールが有効になっていることが条件らしい。

次に i2c ドライバーの利用方法については、Linux カーネルの i2c ドライバーに関する公式の情報を利用した。そこで紹介されたプログラムを参考にしながら、初めての C プログラムをフルスクラッチで書いていった。要するに、必要なライブラリーさえ include してしまえば、i2c デバイスは一般のファイルとして open / close / read / write が可能になる。データシートに従って、特定のレジスターアドレスに適切な数値を書き込むと、意図した通りに、ファンの回転数が下がった。

上記のプログラムを温度に応じて回転数を自動で制御するようなものにして、OS 起動時に /etc/rc.local でバックグラウンド起動(シェルコマンドで末尾に「&」付きで起動)するためのプログラムとしてブラッシュアップした。ATFintek と名付けて、Sourceforge.jp で公開中

ちなみに前提条件として、NVIDIA ドライバーと i2c_dev モジュールが有効であることが必要である。

【思い出話】NVClock の GeForceFX 5700 対応化の経緯

僕の PC のビデオカード(Asus V9570/TD)は、そのままでは GPU 冷却用ファンがフル回転して轟音を立てるので厄介だ。一応、Windows においては Asus から SmartDoctor というファン操作のできるユーティリティが提供されているので問題ないが、Linux 版は提供されていない。そこでネットを探してみたところ、Linux で(どうやら唯一)そのようなことを実現しているフリーウェアの NVClock というツールを見つけた(やはりこういうこともやってのけてしまう人がいるのだから、オープンソース/フリーウェアの世界のハッカーには頭が下がる)。

どうやらこの NVClock は、Debian のパッケージにも取り込まれているメジャーツールで、NVIDIA のチップにはほとんど対応しているらしい。──だが残念なことに、GeForceFX 5700 に関しては非対応だった。ちょうど僕が NVClock のことを知って NVClock のサイトのフォーラムを覗いてみたところ、去年(2005 年)の暮れあたりから GeForceFX 5700 の所有者と作者の thunderbird さんの間でやりとりがあったようだが、作者自身が現物を所有していないことが障害となって迷宮入り状態だったようだ。

僕は半ば諦めかけたのだが、逆にやけくそ半分でファンコントローラチップのデータシートを検索してみたりした。すると、チップメーカのサイトを見て Fintek F75373S と Fintek F75375S の 2 種類のファンコントローラチップが存在することがわかった。フォーラムのやりとりを見ていると、thunderbird さんは F75373S を F75375S と勘違いしているように思われた。そこでフォーラムにメッセージを投稿して反応を覗ってみたところ(yamato-boy が僕)、どうやらその通りらしい。そこで次の日にでも直してもらえるかと思ったが、我慢できなかった僕は、C/C++ 言語には素人も同然なのに思い切って NVClock のソースコードに目を通してみることにした。そして、データシートを見比べても F75373S と F75375S との違いはチップ ID の違いぐらいでしかなかったので、F75375S 用のモジュール(src/backend/f75375.c)が F75373S でも動くようにほんの少し修正してみて(下記参照)、NVClock をコンパイルしてみた。

   if (MERGE_BYTE(nvh, nvl) == 0x0306) {
     dev->chip_id = F75375;
     dev->chip_name = (char*)strdup("Fintek F75375S");
     return 1;
   }
+  else if (MERGE_BYTE(nvh, nvl) == 0x0204) {
+    dev->chip_id = F75375;
+    dev->chip_name = (char*)strdup("Fintek F75373S");
+    return 1;
+  }
   return 0;

すると上手くいった! ちゃんとファンの回転数を落とせるようになった。まさしくオープンソースの勝利といったところである。早速、フォーラムにそのことを報告しておいた(修正は CVS に反映されるとのこと)。

CUI 環境の画像モード化

grub の起動メニュー(/boot/grub/menu.lst)を少しいじるだけで、簡単に Linux の CUI 環境を画像モード化できる。X-Window を大前提にしているユーザの場合は場合はあまり意味がないかもしれないが、時々シングルモードで起動して CUI 環境下でシステムをいじるような人にとってこれはかなり嬉しいし、さらに特に液晶モニタで DVI 接続していると余計に燃(萌)える(笑)。

一般的な情報は、vesafb.txt を参照して欲しい。僕の環境では以下のような感じの設定(menu.lst)(上は通常モード、下がシングルモード):

kernel          /boot/bzImage-2.6.15.4 root=/dev/hda6 ro vga=0x31B video=vesafb:ywrap,mtrr:3

kernel          /boot/bzImage-2.6.15.4 root=/dev/hda6 ro vga=0x307 video=vesafb:ywrap,mtrr:3 single

実は、この設定でフレームバッファーが mtrr を利用してライトコンバインモードで動作するようになるので、CUI 環境だけではなく、X-Window の GUI 環境にもその恩恵が波及するという効果も得られる。ライトコンバインは、VRAM への書込を通常とは違ってキャッシュして行うためにかなり高速化させることができる。X-Window 環境下で /proc/mtrr で確認すると、VRAM 用に割り当てられたメモリ番地が、ライトコンバインで読み書きする領域としてちゃんとマークされているのがわかる。

SB AWE64

いまだに ISA バス用の SB AWE64 を使い続けている。ただ、カード自体が古いだけに、情報(Sound Blaster AWE 32/64 HOWTO)は古いまま放置されている。Linux ではかつては OSS というサウンド関係のドライバーがよく使われていたが、これはもう陳腐化して ALSA に置き換わった。従って、カーネルの再構成時には、基本的に OSS はカテゴリーごと省略してしまい、ALSA のカテゴリーの中から必要なものを選択する(ALSA のカテゴリーの中の OSS との互換用の選択肢は選択しても構わない)。

Debian 3 (Etch) の頃は ALSA への移行の過渡期だったので、サウンドカードはまだ自前でドライバーの調整等をする必要があった。ALSA への移行が落ち着いた現時点では SB AWE64 で苦労することはなく、Debian 5 (lenny) / 6 (squeeze) ではデフォルトのインストール状態で完璧に機能している。一方、Linux の最先端を走るディストリビューションである Ubuntu では 9 の頃でも既に見放されていたのか、SB AWE64 を使えるように調整できなかった。

Planex ENW-9501-F

僕のマシンの NIC は Planex ENW-9501-F という 100Base-TX、FullDuplex のもの。いわゆる DEC 2114x チップを使っている(DEC 21140-AC)。Debian 3.2 (Etch) のインストール後のデフォルト状態では tulip ドライバーが使われるが、やや不安定で、マシンを再起動した時に NIC がちゃんと再起動されていないらしく、ネットワークが不通になることがある(再び再起動するか、一度ちゃんと電源を切ってから起動する必要がある)。

tulip ドライバーではなく同じ Tulip ファミリドライバーの別のドライバーである de4x5 の方を使うように、カーネルの再構成を行ってみた(カーネルの設定では「Tulip ファミリ」は選択する必要があるが、「tulip ドライバー」そのものは選択しないで「de4x5 ドライバー」だけを選択する)。そうして de4x5 ドライバーが使われるようにしたら、tulip ドライバーの時のような不具合が解消された。

実際に説明などを見ても、tulip ドライバーは DEC 製の純粋な Tulip NIC 用のドライバーであり、単に同じ 2114x チップを使った他社製の擬似 Tulip NIC の場合は、de4x5 ドライバーの方を使うように指示されているので、これが正しいことになる。


<mihr.net>