にゃははー

はへらー

Debianのインストールから、カーネルビルドまで...はいかない

ディストリビューション/パッケージマネージャー Advent Calendar 2013 - Qiita の18日目です。

今回はDebianのインストールとちょっとした操作説明したいと思います。Debian系は最近あんまり使ってないのですが、選択肢が現時点ではDebianしか無いので。

何を言っているかわからないと思いますが、すぐに分かります。

ほんとはカーネルのビルドまでやりたかったのですが、文章量が増えるだけなので諦めました。

インストール

前準備

まず、インストール先についてですが、私は適当なVMを強くお薦めします。

Xen環境であれば最高です。が、私はXenへのインストールを試したことがないので、割愛します。VirtualBox / VMware vSphere Hypervisior ESXi / kvm+QEMU では動きました。あと、先日ThinkPad X60へのインストールも成功しました。

VMの設定でできるだけ古い構成を選びましょう。SATAとかいう実験室レベルの次世代規格があるらしいですが、ここではIDEです。もし、実機に入れたい場合に、未来から持ってきてしまった場合SATAしか無いので、BIOSで頑張ってIDEエミュレーションさせて下さい。無ければ諦めましょう。更に、光学メディアドライブはIDE接続のものを用意して下さい。USBっていうものがあるらしいですが、ちょっと良くわからないです。

ThinkPad X60はUltraBaseがIDEエミュレーションなドライブになってくれるのでここらへんをクリアできます。

あと、プロセッサはPentium Proあたりと互換があれば問題無いです。やたらコアがあってもdmesgのログがダブるだけなので1で問題無いです。
Nested Pagingに関する設定項目があれば入れておいた方がいい気がします。前上手くいかなかったことがあったので。

さて、だらだら制限事項を書いていきましたが、いい加減インストールしたいので、以下のアドレスからisoファイルをダウンロードしましょう。
http://ftp.debian-ports.org/debian-cd/hurd-i386/current/
DVDと書いてあるisoファイルを強くお薦めします。

ところで気づきましたか?そうです。Debian GNU/Hurdです(ドヤァ。

実際にインストールしてみる

isoファイルを落としたら焼くなりVMに繋ぐなりして起動するとGRUB2が立ち上がるので、通常のDebianのインストールの様に進めていきます。
ハマるところはありますが、Debian GNU/Linuxと同じようにインストールできるので特には説明しないです。

ハマりポイント1

多分最初のGRUBの画面で選ぶインストールはPseudo-graphical instalにするのが無難です。多分Graphical installは動かないだろうし、試してはいないですがText installExpert installもハードモードだと思います。

ハマリポイント2

キーボードはAmerical Englishとても強くお薦めします。
Japaneseを選択肢てもいいですが、jp106ではなくてjp102とかになります。わりと記号が入らないです。

ハマリポイント3

USBという四角いやつを使ってCDドライブを接続する方法があると、実しやかに囁かれているらしいですが、そういうアングラなものは使えないですし、SATA接続のドライブも使えません。

え、普通にインストーラ起動してるんだけど

っていう人はすぐに現実が来ます。現実を直視してください。

ハマリポイント4

どうもパーティションを頑張って切ってみるとインストーラが上手くマウントできない感じがあります。
最初、

hd0s1 -> /boot
hd0s2 -> swap
hd0s3 -> /
hd0s4 -> /home

とか切ったんですが、hd0s3のマウントが出来ないとかほざきやがりました。結局全部お任せで

hd0s1 -> /
hd0s5 -> swap

にしたらうまくいきました。手動ではマウントできるんで、よくわからないです。

ハマリポイント5

実機にインストールするとNICを認識できない可能性が高いです。NICを認識できないというのはとてもすごくて、どうすごいかって言うと、外部からの侵入が一切できないboxが出来上がるわけです。セキュアヤッター!!
なので、DVDなisoをとても強くお薦めします。

Debian GNU/Linuxと違う所とか

システムのバージョン

例えばログインして以下のコマンドを打つと

$ cat /proc/version
Linux version 2.6.1 (GNU 0.3 GNU-Mach 1.3.99-486/Hurd-0.3 i686-AT386)

とか出ます。Linuxなので問題無いですね(ニッコリ

/procがマウントされてないんだけど...

稀によくある感じです。実機でインストールしたらboot中に/procがマウント出来ないとか言ってる事がありました。/procはtopとかも使うので無いと不便ですね。

NICのアドレスが知りたいんだけど...

ifconfigコマンドがありませんipコマンドもありません
/etc/interfaces効きません

もしかしてumaskが設定されてない?

はい。

スーパー牛さんパワー?

$ apt-get moo
                 (__) 
                 (oo) 
           /------\/ 
          / |    ||   
         *  /\---/\ 
            ~~   ~~   
..."Have you mooed today?"...

マウントはどうやる?

mountコマンドはありますし、動きますが、使いません

さて、Debian GNU/Hurdに慣れましたね?

え、無理?多分Linuxで使ってた簡単なコマンドがHurdでは通用しなかったからだと思います。Hurdで重要なのはtranslatorという概念と、それを操作するsettransコマンドとshowtransコマンドです。一時期Plan9というOSがtwitterを中心に?流行ったことがありましたが、あれに近いと勝手に思っています。

translatorは名前の通り、何かを何かに変換する仕組みです。今は主にデバイスファイルを何かのファイルとかに変換したりしています。

そうです。/proc然り、マウント然り、NIC然り。

これらtranslator/hurdに存在していて、実行可能なバイナリとなっています。例えば/procにprocfsをマウントしたいと思ったら、

# settrans -ap /proc /hurd/procfs --compatible

とします。こうすると/proc以下に色々ファイルが出現し始めます*1。ここで、/procHurd的にNodeと呼ぶっぽいです。

この他にprocfsで使えるオプションは、

$ /hurd/procfs --help

と、直接実行するとズラズラ表示されます。

特定のNodeに何のtranslatorがセットされているか調べるには

$ showtrans /proc
/hurd/procfs --compatible

とするとわかります。

/hurdを見てもらえばわかりますが、他にも色々なtranslatorがあります。例えばext2をマウントしたい場合は、

# settrans -cap /path/to /hurd/ext2fs /dev/hd0s1

とかすると出来ます。

アンセットしたいという場合には、対象となるNodeに対して何もtranslatorを指定しなければアンセットできます。

# settrans /path/to
# showtrans /path/to

もし、Device or resource busyとか言われたら、

# settrans -g /path/to
# settrans -fg /path/to

と順に試すといいでしょう。上はgo awayオプションをつけた場合で、下はそれでもダメなときのforceオプションです。

ifconfigが無いとかそういう話もしましたが、目ざとい人は/hurdの中に/hurd/pflocal/hurd/pfinetを見つけるかと思います。やはりネットワーク関係もtranslatorで動いています。Nodeはどこにいるかというと、/servers/socketです。

showtransするとなんとなくわかると思いますが、/servers/socket/1がloopback Nodeで、/servers/socket/2/servers/socket/26が対になったeth0です。この対になっているうちの、2がIPv4で、26がIPv6用のNodeです。

NICを認識できていて、DHCPを受け取れている場合にshowtransすると、

# showtrans /servers/socket/2
/hurd/pfinet --interface=/dev/eth0 --address=172.31.72.6 --netmask=255.255.255.0 --gateway=172.31.72.254 -6 /servers/socket/26

とか出ます。認識できていなければ

# showtrans /servers/socket/2
/hurd/pfinet -6 /servers/socket/26

だけです。

まとめ

最近debを更新する度に色々壊れていく感じがします。

$ gtags
*** Error in `gtags'; free(): invalid pointer 0x08077480 ***
zsh: abort      gtags
$ sudo locale-gen
Generating locales (this might take a while)...
  en_GB.UTF-8...Segmentation fault
 done
Generation complete.

つらい...

*1:--compatibleLinux互換なprocfsにするためのオプションで、今のところつけておかないとtopが使えません