参考にしたのは以下のページ

# apt-get install kernel-package
# apt-get install libc6-dev
# apt-get install libncurses5-dev
# apt-get install module-init-tools

libc6-devを入れると自動的にlinux-kernel-headersもインストールされた。以下からソースを落としてくる。

root以外のユーザでログインしてソースをwgetで取得

$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.1.tar.gz
$ tar zxvf linux-2.6.23.1.tar.gz
$ cd linux-2.6.23.1
$ make oldconfig

いろいろと聞いてくる。とりあえず全部エンター

$ make menuconfig

iptables関連を有効にしておく

$ make-kpkg clean
$ fakeroot make-kpkg --initrd --revision=custom.0.1 kernel_image

ここでエラー。どうやらfakerootがない。rootに戻ってインストール。

# apt-get install fakeroot

もう一度一般ユーザに戻ってmake-kpkg

$ make-kpkg clean
$ fakeroot make-kpkg --initrd --revision=custom.0.1 kernel_image

かなりの時間がかかる。無事カーネルパッケージの作成完了

$ cd ..
$ ls
linux-image-2.6.23.1_custom.0.1_arm.deb

このlinux-image-2.6.23.1_custom.0.1_arm.debをインストールする。以下はrootアカウントで実行

# dpkg -i linux-image-2.6.18-subarchitecture_custom.1.0_i386.deb

途中で以下のように怒られる

dpkg: dependency problems prevent configuration of linux-image-2.6.23.1:
linux-image-2.6.23.1 depends on initramfs-tools (>= 0.53) | yaird (>= 0.0.11) | linux-initramfs-tool; however:
Package initramfs-tools is not installed.
Package yaird is not installed.
Package linux-initramfs-tool is not installed.
dpkg: error processing linux-image-2.6.23.1 (--install):
dependency problems - leaving unconfigured
Errors were encountered while processing:
linux-image-2.6.23.1

initramfs-toolsをインストールしようとしたが、apt-get -f installしろと怒られる

# apt-get -f install

とりあえず以下のように表示される。

Setting up linux-image-2.6.23.1 (custom.0.1) ...
Running depmod.
Finding valid ramdisk creators.
Using mkinitramfs-kpkg to build the ramdisk.

# dpkg -i linux-image-2.6.23.1_custom.0.1_arm.deb

とりあえずうまくいったように見える。コンソールキットをつないでU-Bootからの起動を試みるがうまくゆかず。
仕方なしに、uImage.buffaloにもどして、dpkgを用いない方法で試すことにする。
以下のURLを参照

$ make clean
$ make uImage

時間がかかるのでちょっと休憩

"mkimage" command not found - U-Boot images will not be built

このエラー画面を見て納得。uImageはU-Bootで用いるイメージのことだったらしい。
道理でうまくゆかないわけだ。ちなみにmkimageをfindで調べたところ、
/usr/local/sbinにあるらしい。

PATH=/usr/local/sbin:$PATH; export PATH

として再び

$ make uImage

今度はうまく作成されたっぽい。

Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-2.6.23.1
Created: Sun Nov 11 18:42:57 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 961100 Bytes = 938.57 kB = 0.92 MB
Load Address: 0x00008000
Entry Point: 0x00008000
Image arch/arm/boot/uImage is ready

つづいてモジュールのコンパイル

$ make modules

モジュールのコンパイル中に気づく、もしかしてdpkgを使って作成したカーネルイメージからmkimageを用いてuImageを作成できるのでは?
そこで調査すると以下のページを見つける

さっそくCtrl-Cでコンパイルを途中で止めrootになり試す

# cd /boot
# mkimage -l uImage.buffalo
Image Name: Linux-2.6.12.6-arm1
Created: Thu Feb 8 15:00:09 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1736372 Bytes = 1695.68 kB = 1.66 MB
Load Address: 0x00008000
Entry Point: 0x00008000
# mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n "Linux-2.6.23.1-arm1 Ver0.1" -d vmlinuz-2.6.23.1 uImage.kurobox
Image Name: Linux-2.6.23.1-arm1 Ver0.1
Created: Sun Nov 11 19:10:19 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 961104 Bytes = 938.58 kB = 0.92 MB

リブートしてU-Bootでストップ

Marvell>>setenv kernel 'uImage.kurobox'
Marvell>>boot

こんどはカーネルの読み込みまではうまくいったが上がってこない。
何かを根本的に間違っているのだろうか?
仕方ないので電源を強制的に切ってパラメータを元に戻す。

Marvell>>setenv kernel 'uImage.buffalo'
Marvell>>boot

どうやらカーネルのコンフィグから見直さないといけないようだ。時間がかかりそうなので今日の玄箱はここいらでやめておこう。

syslogの保存

ルータはログ機能を持っているが、ログの保存領域はせまいものが多い。そのため大抵はsyslogを使って、外部にログを吐きだす機能を持っている。ここでは、YamahaのRT107eを用いてsyslogの設定を行う。syslogを受け取るのは、CentOS5とする。

  • 前準備

まずファシリティ名を決める。ファシリティ名はauth,authpriv,cron,daemon,ftp,kern,local0〜local7,lpr,mail,news,syslog,user,uucpを用いることができる。この値はコンパイル時に決められているようだ。

# man 3 syslog

とすれば詳しい説明を読むことができる。
余談になるがmanのあとの数字はマニュアルのセクション番号。セクション番号は通常以下のように決められている

話がそれたが、ファシリティとして、local6を用いることにする。
またログは/var/log/routerlogにとる。ログのローテーションも行う。

/etc/syslog.confに以下の行を追加する。ここで空白はスペースではなくタブでなければならないので注意!

# Save Router Messages
local6.* /var/log/routerlog

次にログローテーションの設定を行う。/etc/logrotate.d/syslogで行う。一行目の{の前に/var/log/routerlogを追加しておく。
また、リモートからログを受け取れるようにsyslog起動時のオプションに-rをつけるように変更する。/etc/sysconfig/syslogファイルのSYSLOGD_OPTIONSに-rを追加すればよい。

SYSLOGD_OPTIONS="-r -m 0"

またsyslogは514番のudpポートを使用するため、iptableなどを用いている場合には、このポートを開けておくこと!
syslogを再起動する。

/etc/init.d/syslog restart

  • RT107eの設定

管理者モードでログイン後以下のコマンドを入力する。

# syslog host SYSLOGを取るサーバ名
# syslog facility local6

またcaution、infoのsyslogはデフォルトでは取られないので以下のコマンドを実行する。
caution(フィルタなどに引っかかったパケット)のsyslogを取る場合

# syslog caution on

infoのsyslogを取る場合

# syslog info on

デバック用のsyslogを取る場合

# syslog debug on

debugは大量のsyslogがとられるためデバックのときのみにしておいたほうが良い。

時刻合わせ

先日インストールしたDebianをいじってみる。たまたま日付があっていないことに気づく。
以下のURLでプロパイダのNTPサーバを見つける

見つけたのちntpdateで時刻同期

# ntpdate hoge.hoge

ところがエラー。どうやらntpdateがないもよう。ntpdateをインストールする。

# aptitude install ntpdate

これでとりあえずntpdateで時刻を修正できるようになった。ntpをインストールして同期をとるか迷ったが、そこまでする必要はないだろうということでcronでntpdateを定時起動するだけにする。

# crontab -e

ところがここでGNU nanoというエディタが開く。わからないエディタは怖いので、エディタを終了。EDITOR環境変数を設定してviを起動するように設定する。

# EDITOR=vi; export EDITOR

crontabに値を設定して保存。viを使うように.bashrcに設定する。

# vi .bashrc

ここで、大事なことに気づく、rm、cp、mvのaliasがコメントアウトされている。どうやら、aliasを使いたければ自分でコメントを取れということらしい。なるほど……、OS側で余計なことはしないということか……。とりあえずコメントを外し、EDITOR環境変数を設定する。そして再びログイン。

# crontab -e

以下の行を追加

0 0 * * * ntpdate hoge.hoge

iptables

iptables関係のパッケージを探す

# apt-cache search iptables

たくさんのパッケージがずらずらと出てくる。無難にiptableを入れる

# aptitude install iptables

iptablesはインストールされたが、どうやらコマンドのみで、起動スクリプトなどはインストールされないらしい。そこでiptablesをコマンドから実行することにする。あちこち調べるとどうやら/etc/network/if-pre-up.d以下のディレクトリにあるシェルスクリプトを自動的に実行するらしい。

# vi /etc/network/if-pre-up.d/iptables.sh

以下のような内容とする。

#!/bin/sh

# Remove All Rule
/sbin/iptables -F INPUT
/sbin/iptables -F FORWARD
/sbin/iptables -F OUTPUT

# Drop All
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT DROP

# Accept Loopback
/sbin/iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
/sbin/iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

# Write Accept Port
/sbin/iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --source-port 22 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --destination-port 123 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --source-port 123 -j ACCEPT

# Write Log
/sbin/iptables -A INPUT -j LOG --log-prefix "IN-Deny! "
/sbin/iptables -A INPUT -j DROP
/sbin/iptables -A OUTPUT -j LOG --log-prefix "OUT-Deny! "
/sbin/iptables -A OUTPUT -j DROP

実行許可を与え、実行してみる

# chmod 755 iptables.sh
# ./iptables.sh

ところが以下のようなエラー

iptables v1.3.6: can't initialize iptables table `filter': Table does not exist (do you need to insmod?)

いろいろ調べてみるとip_tables.oのモジュールが必要らしい。めんどくさいからカーネルからコンパイルすることにする。
続きは明日

tftpが見つからない…

ルータから設定を落とそうでしてVistaマシンからtftpコマンドをたたく。
どうやらvistaはデフォルトではtftpは入ってない模様。
下記のURLをみてようやく解決。
http://f.hatena.ne.jp/moton/20070322064810

玄箱PROをハックしよう

ハックキットで夢のDebian GNU/Linuxサーバー 玄箱PROをハックしよう! 作者:山下康成
出版社/メーカー:ASCII


 玄箱Debian化する方法を書いた本です。
 最近、仕事の関係上、サーバとかルータ、ネットワークをいじる機会が多くなってきたので、初心に戻って、自宅でLinuxボックスのサーバをたてようと思った矢先、書店で見かけました。
 最初は、どこかのベアボーンを使って、DOS/V機で、CentOSでもインストールして使おうと思っていたのですが、消費電力や、アクセス数を考えた場合、得策とは思えません。それでどうしようか考えていた際に、この本が目に留まりました。どうやら半田付けも必要らしい…
 もともと、こういうのりは大好きです。高校の頃は半田こて片手に、MSXのインターフェース回りりの回路を設計&自作してました。すっかり半田こてとは縁遠くなっていたのですが、昔を懐かしんで玄箱を用いることに決めました。
 さっそく、秋葉原玄箱とコンソール接続用のKITを買ってきました。ついでにYamahaのルータ、RT107eを買ったのは内緒。
 買ってきた、玄箱とシリアルインターフェース用のキットを開けてハンダ付&HDDのインストール。手順の通りに構築を行おうとする。
 ここでひとつ問題が。どうやら、玄箱はでふぉで共有が有効になっているようだ。買ってきたばかりのルータの設定を見直す。WAN側のインターフェースはINはrejectで設定。OUTに関しては、www,httpd,pop3,smtp,ftpのみを動的フィルタで許可。それ以外はrejectで設定する。
 その後買ってきた玄箱PROをPCにUSB経由のシリアル&LANに接続して起動。どうやらうまく起動している。
 さっそく本書の通りにDebian化を行う。Debian化はうまくいったようだが、起動時に以下のようなエラーが…

Activating swap:swapon on /dev/sda3
Unable to find swap-space signature
swapon: /dev/sda3: Invalid argument
failed!

何箇所かまわって調べてみたが、どうやら/dev/sda3にswapができていないのが原因らしい。

# mkswap /dev/sda3
Setting up swapspace version 1, size = 139825 kB
no label, UUID=c649a752-23f5-4398-82fd-b061218065ee
# swapon -a

としてswapを作成しswapをonにする。それで上記エラーがでなくなった。telnetのままだと怖いので、sshをインストールする。

# apt-get install ssh
Reading package lists... Done
(中略)
After unpacking 3215kB of additional disk space will be used.
Do you want to continue [Y/n]? ←そのままEnterを入力

Setting up ssh (4.3p2-9) ...

# ps axu | grep sshd
root 1295 0.0 1.3 5148 1764 ? Ss 00:04 0:00 /usr/sbin/sshd
root 1698 0.0 0.3 1516 484 ttyS0 S+ 00:18 0:00 grep ssh

ssh経由でログインできることを確認して作業完了。

久し振りの日記更新

 久し振りの日記更新です。しばらく田舎にこもっていて、この日記はその暇つぶしのために書いていたのですが、就職してから、ご無沙汰になっていました。
 心配していた人もいるかと思いますが、安心してください。無事生きています。
 最近また東京に戻ってきたので、これを機会にまた日記のほうを始めたいと思います。