Debian revisited

AirPrint環境を作ろうとしてNVIDIAにはまる

四方山話です。情報量はほぼゼロに近いです。

家族がiPodやiPadを使っていて、ついにiPhoneまでが使われ始めました。iPodはともかく、iPadやiPhoneは携帯端末の拡張のように見えますが、基本的にコンピュータですから、アプリケーション・ソフトウェアから印刷をしたいと思ようになるのも必然でしょう。しかし、残念ながら、わが家のCanon製プリンタ、MG6130(*1)はAirPrintに対応していません。調べてみると、Linux(*2)でCUPSを使えばAirPrintできるとのことなので、古いデスクトップでLinux Boxを立てることにしました。

  1. ネット上の評価では、「インクの消費量が尋常ではない」という声が多い機種ですが、本体の安さから導入したのでした。
  2. FSF的には、Linuxはカーネルだけで、GNUのソフトウェアを主体に使っているのだから、GNU/Linuxと呼ぶのがよいとのことですが、私はLinus Torvaldsを尊敬しつつも、その信者ではないし、Richard M. Stallmanを尊敬しつつも、その信者ではないので、ここでは通称のLinuxとしておきます。

PCは、10年以上前に買ったDELL Dimension4100という機種です。当初はWindows MEが載っていて、すぐにWindows 2000となり、それがサポート終了となってからは、しばらく埃をかぶっていました。CPUはIntelのPentiumIII 1GHz、メモリは256MBしか積んでません。ハードディスクは2台つながっているのですが、それぞれ40GBと8GBです。今ではありえないスペックですが、調べてみると、現在のLinuxディストリビューションでは、デスクトップ(GNOMEの採用率が高いようです)で使うにはメモリ不足ですが、サーバ用途なら問題なさそうです。

USBメディアからのブートができず(*1)、DVDドライブもないので、最少構成のインストール・メディアを使い、残りはネットワークからダウンロードするという方法が使えるものでないとインストールできません。昔はCD1枚済んだVine Linuxでさえ、「DVD1枚または2GBのUSBメモリ」が必要となっています。結局、ネットワークインストールできるCDイメージを見やすいところで配布しているDebian GNU/Linux(*2)を使うことにしました。バージョンは7.0、コードネームはWheezyとなっています。

  1. GRUBを入れたCDから起動->USBメモリブート、というのができるらしいので、たぶんフロッピーディスク起動->USBメモリブートもできるはずですが、試してません。GRUBを入れたCDと最少構成のインストールCDでは、機能に変わりがありませんので。
  2. DebianのポリシーではGNUの意見を容れて、正式名称Debian GNU/Linuxというのです。

実は、Debianを使うのはこれが初めてではありません。最初のLinuxはSlackwareでした。1990年代に、羽根秀也さんの入門書や、O’ReillyのHOWTO本、久野靖さんの書かれたUNIXの参考書などを見て勉強しながら遊んでいました。いまでは多言語をコンピュータで表示するのはあたりまえになりましたが、当時は、日本語と英語、フランス語とドイツ語を同時に表示できるエディタもなく、パーソナルユースでは、表計算ソフトもデータベースも日本語と英語しか入れられませんでした。目的はEmacs(というよりMuleですね)とTeXでした。複数言語のまじった文書が作れて、複数言語の文献ファイルも管理できるという、Windows環境でもでもMac環境でもできないことを既に実現しているという驚きがあったのですが、それとは別に、UNIXのシステムやネットワークのよい勉強になりました。Debianは2.1のslink(*1)くらいから、3.1sargeの頃まで付き合っていましたが、ライブラリなどの更新が遅く、最新バージョンのソフトウェアを自分でコンパイルしていると(*2)、/usr/local/ディレクトリの中身が肥大化してきて、たとえdebパッケージを作ったとしても、結局Slackwareのようなシステムになってしまうので、ライブラリの更新が早いRed Hat系に移行してしまい、それ以降は全く見ていません。久しぶりの再会といったところです。ライセンスに厳しいディストリビューションですが、順調に開発が続けられているようです(*3)

  1. Debian.orgのリリースノートには日付がないので、いつ頃なのか確認できませんでした。
  2. EmacsはCVSリポジトリから匿名でcheckoutできたので、常に最新を自前でコンパイルしていました。
  3. Mozillaについては確執があるようですが…

さて、wheezyのインストールですが、何の問題もなく終わりました。サーバ用途としてなので、Xorgなどは必要ありませんが、興味本位でデスクトップ環境もインストールしたので、いきなりgdm3が起動してしまいます。Ctl-Alt-F1でコンソールにおりて、runlevel3で再起動すると、同じくgdm3が起動します。Debian sargeの後、Red Hat系を使っていたので、忘れていましたが、Debianではrunlevel2-5は全て同じになっているそうです。/etc/rc2.d/と/etc/rc5.d/の中身が同じでした。いやはや、また初心者レベルに逆戻りですね。

それなら試しに、ということで、GNOME3にログインしてみると…

画面が描画できていません。画面全体が青一色になって、Xorgのルート・ウィンドウを表示するところまで到達できません。ウィンドウ・マネージャをfluxboxにしたり、GNOME Classicにすると表示することができます。困ったことに、/etc/xorg.confファイルがありません。~/.xsession.errorを見ても、ちゃんと読めなくなっています(初心者以下ですね)。それなら、ということで調べました。Xorgのエラーというからには、たいていVGAカードかフォントに問題があり、というのが昔からの定番です。

$ lspci

の結果は次のようになっています。

01:00.0 VGA compatible controller: NVIDIA Corporation NV11 [GeForce2 MX/MX 400] (rev b2) (prog-if 00 [VGA controller])
        Subsystem: NVIDIA Corporation Device 004a
        Flags: bus master, 66MHz, medium devsel, latency 248, IRQ 11
        Memory at fd000000 (32-bit, non-prefetchable) [size=16M]
        Memory at e8000000 (32-bit, prefetchable) [size=128M]
        [virtual]Expansion ROM at fe9f0000 [disabled] [size=64K]
        Capabilities: 
        Kernel driver in use: nouveau

nouveauという見慣れないドライバが使われています。

$ lsmod

すると、NVIDIAらしきドライバはありません。ためしに、

# Xorg -configure

すると、とりあえずXorg.confができますが、エラーが出ます。中身を見ると、やはりDriverにnouveauというのが使われています。検索して判明したのは、このnouveauというモジュールは、プロプリエタリなNVIDIAのドラバをエミュレートすべく、X.Org FoundationとFreedesktop.orgがオープンソースで開発中のカーネル・モジュールとのことです(常識なのでしょうか?)。REnouveauというリバース・エンジニアリング用のツールまで配布しています。こういった場合、不具合を調べてバグがあればそれを調べて報告するというのが正しい態度ですが、まずは動かすのが先決なので、次に進みます。

ということで、次善の策、プロプリエタリなドライバを試しました。

$ sudo aptitude search nvidia

すると、けっこうな数のパッケージが存在します。Googleで検索すると、NVIDIAのサイトからドライバをダウンロードしてインストールした、というようなページが新旧たくさん見つかります。GeForce2 MX/MX 400にしぼると、あまり新しい情報が見あたりません。Debian wheezyにしぼると、Debianのサイトに行きつき、現行バージョンwheezyのドキュメントで、xserver-xorg-video-nvidia-legacy-96xxがバイナリの本体らしいことがわかります。その他はOpenGLのライブラリや、メタパッケージ、alternativesで提供するためのユーティリティ、カーネルを再構築するとき用のソースファイルという感じのようです。これくらいわかれば、あとはメタパッケージに狙いを定めて、

$ sudo apt-get install nvidia-support nvidia-glx nvidia-config

とすると、関連したパッケージがずらずらとインストールされます。これがDebianのよいところで、最も一般的な名称のパッケージを選択するとなんとなくそれらしいパッケージが一通りインストールされることになります。削除したいときにも、

$ sudo apt-get remove target package
$ sudo apt-get autoremove

すると一通り削除されることになります。もちろん、パッケージャがミスをする場合もありますが、バグリポートを参照すれば大抵のミスはわかります。

さて、NVIDIAドライバですが、インストールして、modprobeしてもロードされません。nouveauのほうも、rmmodeすると使用中だからできないと言われます。/etc/modprobe.d/の中を見ると、nvidia-kernel-common.confというファイルが追加されていて、aliasの設定とともに、

となっています。必要なことは全て設定済みのようです。が、nvidiaが読み込まれなければ意味がありません。blacklist.confのほうにも追加おきました。さらに、/etc/alternatives/の中を参考にして、update-alternativesで競合パッケージの状況を確認してみました。

$ update-alternatives --list glx
/usr/lib/mesa-diverted
/usr/lib/nvidia

$ update-alternatives --list nvidia
/usr/lib/nvidia/legacy-96xx

glxはnvidiaとmesaのライブラリがあるようですが、Xのドライバは一つで、nouveauは選択肢に入らないようです。もはや打つ手なしとなってしまいました。こんなときはもちろん、Google検索です。「UbuntuでNVidia ドライバのダウンロードとビルドとインストール」(http://www.kkaneko.com/rinkou/linux/nvidia_ubuntu.html)というページが、Nvidia GTS 460というカード(*1)をUbuntuで使った経緯を書いています。ここを見ると、nouveauを使わないようにする手段として、/etc/default/grubで、下のように設定する、とあります。

  1. 記事のリードではGTS 460となっていますが、GTX 460のようです。[追記: リンク先がつながらないので、アドレスだけにしておきます]

/etc/の下を見ると、grubのコマンドラインオプションをここで設定すると、/etc/grub/以下にあるスクリプトが起動時にそれを読み込んでカーネルに渡すようです。カーネルオプションなので、スペースで区切れば複数のオプションを指定できます。GRUB_CMDLINE_LINUXという変数もあり、これが先に読み込まれ、DEFAULTのついたほうが最後に読み込まれるようになっています。上のように設定すると、nouveauは後に読み込まれますが、コマンドで削除し、nvidiaをmodprobeすることができるようになります。最終的に、/etc/default/grubは下のように設定しました。

モジュール関係では、blacklist=nouveau(複数指定可)やnomodesetでも可能なようです(*1)

  1. ドキュメントを読んだだけなので、実際には試していません。

さて、nvidiaモジュールの読み込みができましたので、ここで再度

を実行してxorg.confを作ってみます。Deviceセクションは次のようになっていました。もちろん、必要最低限の設定しか書かれていませんが、ビデオカードだけなら十分でしょう。

ここでGNOME3を起動してみると…

一応、起動します。が、恐るべき重さです。最低要件の半分しかメモリを積んでませんから、仕方がないのですが、ウィンドウを開くまでの時間が長すぎます。すぐにコンソールにおりて、GNOME関連のパッケージは、Classicも含めて全て削除しました。

これなら、nouveauでもよかったではないか?——確かに、そのとおりなのですが、PC UNIX復帰のためのリハビリテーションにはちょうどよかったのです。

AirPrint? ああ、そうでした。それはまたの機会に…

利用したコマンド

  • lspci
    PCIバスのディバイスについての情報を出力する。本文で使った出力は、-vオプションをつけて実行したもの。The PCI Utilitiesに含まれる。wiki.debianのHowToIdentifyADevice USBを参照のこと。
  • lsusb
    USBバスについての情報を出力する。
  • lsmod
    Linuxカーネルモジュールの状態を出力する。
  • modprobe
    Linuxカーネルにモジュールを追加したり、削除したりする。
  • rmmod
    Linuxカーネルからモジュールを削除する。参考: modprobe -r
  • Xorg -configure
    xorg.confファイルを生成する。ファイルは、/root/xorg.conf.newに生成される。エラーが出てもファイルは生成される。
  • aptitude search package_name
    パッケージ名に一致するものを表示する。
  • apt-get
    Debianのパッケージを操作する。
  • update-alternatives
    同じ機能を持つソフトウェア間の優先順位を決める。
  • nvidia-config
    nvidiaドライバのおまけ。nvidia用のxorg.confを/etc/X11/以下に作る。

Leave a Reply