Author Archives: admin

Fedora – yum でソースを取得してコンパイル、デバッグする

yumでインストールできるパッケージのソースを取得して、コンパイルする方法。ここではsedを対象に行った。Fedoraで行っている。

まず、rpm-buildとyum-utilsをインストールする。

# yum install rpm-build
# yum install yum-utils

次にsedのソースrpmを取得する。

# yumdownloader --source sed
# ls
sed-4.1.5-9.fc8.src.rpm
#

このrpmをインストールすると、/usr/src/redhat/SOURCEにソースコードがコピーされる。 多くの場合パッチも一緒に入っている。このソースコードのコンパイル方法は/usr/src/redhat/SPECにあるスペックファイルのビルドセクションに記述されているが詳細は見ない。

ビルドする。

# cd /usr/src/redhat/
# rpmbuild -bc SPECS/sed.spec
.................

-bcオプションは通常パッチをあてmakeすることを意味する。このコマンドが成功すれば、BUILDディレクトリにsedのいろいろなファイルが作られている。

しかしこれらはデバッグビルドではないので、このままでは中途半端にしかデバッグできない。幸いsedはCで書かれていて基本的なmakeコマンドで処理できるので、あとはどこかでCFLAGSとして”-O0 -g”を指定してmakeすればデバッグビルドできる。

ここでは、configureスクリプトをCFLAGSを変えて起動することで行った。configureスクリプトの起動方法はSPECファイルに記述されているので、そのとおりにやらないとエラーになるかもしれないが、ここでは面倒なので無視した。

# cd /usr/src/redhat/BUILD/sed-4.1.5/
# make clean
......
# CFLAGS="-O0 -g" ./configure
......
# make
......

これでsed/sedがデバッグビルドされ、gdbなどでデバッグできる。

# cat > ttt
aaa
bbb
ccc<CTRL+D>
# gdb sed/sed
GNU gdb Red Hat Linux (6.6-45.fc8rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) break main
Breakpoint 1 at 0x8049864: file sed.c, line 179.
(gdb) r s/aaa/xxx/ ttt
Starting program: /usr/src/redhat/BUILD/sed-4.1.5/sed/sed s/aaa/xxx/ ttt

Breakpoint 1, main (argc=3, argv=0xbfd5b684) at sed.c:179
179 const char *cols = getenv("COLS");
Missing separate debuginfos, use: debuginfo-install glibc.i686
(gdb)

最後に上記作業は全部rootで行ったが、rpmdevtoolsパッケージに含まれるrpmdev-setuptreeを使えば、一般ユーザでも作業できる。参考

ホームディレクトリにある”デスクトップ”や”音楽”を英語にする

最近のLinuxのgnomeではデフォルトでデスクトップのディレクトリがそのまま日本語で”デスクトップ”となっている。しかしファイル名やフォルダ名に日本語を使うのはいささか抵抗があるので、これを戻す方法。

まずログアウトして、ログインマネージャで言語を英語にする。

changelang.JPG

ログインすると”デスクトップ”などのフォルダをリネームするか聞いてくるのでUpdate Namesを選択し、リネームする。

changetoeng.JPG

再びログオフし日本語に戻す。そしてログインすると再びリネームするか聞いてくるので、ここでリネームをしなければいい。

iptablesメモ。firewallとして

iptablesは多機能で複雑でわかりにくい。ここでは主にiptablesを入ってくるパケットに対するファイヤーウォール機能として考える。

まずiptablesはパケットに対して操作を行う。特にパケットのヘッダに対して行う。パケットのデータに対しては処理を行わない。

iptablesには3ビルトインテーブルfilter、nat、mangleがある、firewallとして使うにはfilterを用いる。filterはiptablesコマンドのデフォルトのテーブルであり、-tオプションを指定しなかった場合は、-t filterと同じ意味になる。

tableはchainの集まりとして定義される。chainはruleとtargetを組にしたものの集まりで定義される。ruleはフィルタそのもののことで、targetはそのフィルターにかかったパケットをどう処理するかを指定する。

filter tableにおけるビルドインchainとしてINPUT、FORWARD、OUTPUTが存在する。INPUTは入ってきたパケットで宛先が自分のものに適用される。FORWARDは宛先が自分でないもの、これはマシンをルーターとして動かしているときのもの、そしてOUTPUTは自分から出て行くパケットに適用される。

ユーザ定義のカスタムchainを定義することができ、これらのchainはビルドインchainのtargetととして利用できる。ビルドインchainはあらかじめどんなパケットに適用されているかが決まっているがカスタムchainはビルドインchainから呼び出される形で動くことになる。

targetにはACCEPT、DROP、REJECTなどのビルドインtargetがある。言葉のとおり、ACCEPTはパケットを受け入れ、DROPはパケットを捨て、REJECTはエラーパケットを返す。

実際に動かしてみる。ここではFedora8を使った。

現在のiptablesの状態を確認するには-Lオプションをもちいる。しかしこのオプションだけだと詳細が分からないので-vオプションも一緒に使う。-Lオプションはchain名を引数にとる。ここでは上記のように入ってくるパケットに対して考えているのでINPUT chainを見る。

# iptables -v -L INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
18 1727 RH-Firewall-1-INPUT all -- any any anywhere anywhere

まず、policy ACCEPTとあるが、policyとはすべてのruleにかからなかったパケットをどうするかを定義してもので、デフォルトではACCEPTになっている。つまりruleが一つも定義されてなければすべてのパケットを受け入れると言うことである。

コラムを順に見ると protはプロトコルでinは入ってきたパケットのインターフェース(ネットワークカード)でoutは出て行くパケットのインターフェース。しかしINPUT chainにおいてはoutは関係ないと思われる。sourceはパケットのソースIP、destinationはデストIP、しかし同様にここではINPUT chainなので、デストIPは自分自身のはずである。

エントリーをみると targetがRH-Firewall-1-INPUTになっていて、protなどがanyとなっている。つまりINPUT chainに入ってくるパケットはすべてRH-Firewall-1-INPUT chainに送られるようになっている。そこでこのchainを見てみる。

# iptables -v -L RH-Firewall-1-INPUT
Chain RH-Firewall-1-INPUT (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 ACCEPT icmp -- any any anywhere anywhere icmp any
0 0 ACCEPT esp -- any any anywhere anywhere
0 0 ACCEPT ah -- any any anywhere anywhere
0 0 ACCEPT udp -- any any anywhere 224.0.0.251 udp dpt:mdns
0 0 ACCEPT udp -- any any anywhere anywhere udp dpt:ipp
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ipp
179 27376 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:ssh
4 926 REJECT all -- any any anywhere anywhere reject-with icmp-host-prohibited

一番最初のエントリーでinがloのものはすべてACCEPTしている。これによりブラウザなどでhttp://localhost/でアクセスしたときのパケットを許可している。

つぎにicmpでpingを許可し、esp、ahでIPSec関係のパケットを許可している。

重要なエントリーはstate RELATED,ESTABLISHEDのある行で、実際ほとんどのパケットはここで許可される。stateとは対象パケットが通信全体から見た場合どういう状態でのパケットなのかを表したもので、ESTABLISHEDはすでに通信が確立しているもの、例えばブラウザでどこかのサイトにアクセスし、その結果として戻ってきたパケットはstateがESTABLIEDになる。これを許可しないとほとんどの通信ができなくなってしまう。RELATEDは多分FTPのデータ経路などをACTIVEで開いたときに入ってきたパケットを許可するものだと思う。

つぎのエントリーでsshの接続を許可している、state NEWとあるので、通信開始時のパケットを許可していることになる。一度開始されればそれ以降のパケットは上記のESTABLISHEDで許可されることになるので、state NEWとしているのだと思われる。

一番最後のエントリーでそれ以外のすべてのパケットがREJECTされている。最初に書いたようにREJECTだとエラーパケットを返す。

カーネルモジュール覚書

カーネルモジュールはカーネルが動的にロードできるモジュール。ローダブルカーネルモジュール(LKM)ともいう。デバイスドライバなどで使われている。

現在カーネルが読み込んでいるモジュールを表示するにはlsmodまたは/proc/modulesを読めばいい。

[root@centos build]# lsmod
Module Size Used by
autofs4 24517 3
hidp 23105 2
rfcomm 42457 0
l2cap 29633 10 hidp,rfcomm

左から順に、名前、サイズ、いくつのプロセスから使われているか、依存しているモジュールを示す。

モジュールの情報を表示するにはmodinfoを用いる。

[root@centos build]# modinfo hidp
filename: /lib/modules/2.6.18-53.1.14.el5/kernel/net/bluetooth/hidp/hidp.ko
alias: bt-proto-6
license: GPL
version: 1.1
description: Bluetooth HIDP ver 1.1
author: Marcel Holtmann <marcel@holtmann.org>
srcversion: F6110A784FD4060F29C39C7
depends: bluetooth,l2cap
vermagic: 2.6.18-53.1.14.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
module_sig: 883f35047ced1a9eca829d098883c27112e81509d1eb0b292e3db5dedbf5a25709c45da76fbe43e09f7461c3ed59fa8fdfdd1649a3ea28dd2bf43f7de

モジュールをカーネルに組み込むにはinsmodまたはmodprobeを用いる。modprobeはinsmodより賢く依存関係を解決しながら読み込んでくれる。

モジュールをカーネルから開放するにはrmmodまたはmodprobe -rを用いる。上記と同様にmodprobeは賢く開放する。

依存関係は通常/lib/modules/<version>/modules.depに記述してあり、これはdepmodによって作られる。

modprobeは設定ファイル/etc/modprobe.confを参照する。このファイルは1行1命令で記述されていて、以下のような命令がある。

  • alias : モジュールに別名を付ける。ワイルドカードも指定可能。ネストはできない。
  • options :指定されたモジュールがmodprobeコマンドで指定されたとき、追加のオプションを指定する。
  • install : 指定されたモジュールがmodprobeコマンドで指定されたとき実行されるスクリプトを記述する。この命令がある場合、modprobeはデフォルトの動作を行わない。命令には–ignore-installを含んでいることが多い。これをつけるとmodprobe.confのinstall命令を無視する。つまりこれを付けて再帰しないようにしている。
  • remove : 上記と大体同じ。

モジュールは通常/lib/modules/<version>/ ディレクトリに格納されている。現在の動いているカーネルのヴァージョンを知るにはuname -rを用いる。

xorg.conf覚書

xorg.confはXサーバーの設定ファイル。Linuxだと/etc/X11/xorg.confにあることが多いです。

xorg.confはいくつかのセクションに分かれているが、各セクションは独立したものではなく、それらをツリー状に組み合わせて構成を決定する仕組みになっています。

ツリーのルートにあたるセクションがServerLayoutでこの下にScreenセクション、その下にMonitorやDeviceがあります。ServerLayoutはいくつあってもよく、複数ある場合はServerFlagsセクションのDefaultServerLayoutオプションでデフォルトのServerLayoutを指定します。セクションはIdentifierキーを使って一意に識別でき、これを使ってツリー構成を作っています。

Deviceセクションにグラフィックボードの設定を記述します。

Monitorセクションにモニターがサポートできる水平解像度と垂直解像度をkHzで指定します。これらは自分のモニターのマニュアルかネットで検索して見つけます。

Screenセクションに、DeviceキーとMonitorキーを指定し、Displayサブセクションを追加して、ここにDepthキーを使ってモニターのカラーデプス(色のビット数)を指定し、Modesキーを使って画面の大きさを指定します。Displayサブセクションは複数あってもかまいません。

▽関連記事
X Window Systemで他のディスプレイを使う

Firefoxのメニューのフォントを変える

Firefoxのメニューのフォントがデフォルトだと小さく表示されている。Firefoxはクロスプラットフォームなアプリなのでユーザーインタフェース(UI)もOS任せにせず全部自分でやっているからだと思われます。

FirefoxのUIの設定はプロファイルフォルダのchromeフォルダにあります。プロファイルフォルダは通常以下の場所にあります。

C:\Documents and Settings\<ユーザ名>\Application Data\Mozilla\Firefox\Profiles\xxxxxx.default

このフォルダの下のchromeフォルダ内に”userChrome-example.css”と言うファイルがあるのでこれをコピーして、”userChrome.css”としこれを編集します。このファイルはUTF-8で書かれているので、UTF-8を扱えるエディタを使ってください。

/*
* デフォルトフォントサイズをすべて 20 ポイントにする:
*
* * {
* font-size: 20pt !important
* }
*/

上の部分を下のように変える。

* {
font-size: 10pt !important;
}

内容を変更したら、保存してFirefoxを再起動します。

もちろんfont-sizeだけではなく、font-familyなども指定することができます。

* {
font-size: 10pt !important;
font-family: "MS UI Gothic";
}

▼関連記事
Operaのメニューのフォントを変える

Firefox 拡張機能の作り方

Firefoxの拡張機能は作り始めるまでが結構大変だったので、そのやり方をメモしておきます。

まずFirefoxはプロファイル機能を持っていて、設定情報などをプロファイルごとに分けることができます。開発用のプロファイルをつくっておけばデフォルトのプロファイルを汚さなくてすみます。

プロファイルを作るには、-Pオプションをつかって起動します。

"C:\Program Files\Mozilla Firefox\firefox.exe" -no-remote -P dev

-no-remoteは新しいインスタンスで起動するオプションです。-Pでプロファイル名を指定しています。プロファイルが存在しないと、「ユーザプロファイルの選択」ダイアログが出てくるので、ここで作成します。「今後このプロファイルを使用する」はオフにします。

プロファイルごとに違うテーマを設定しておくとわかりやすくていいと思います。

以下、devプロファイルでの作業です。

まずこのサイトにいって、拡張機能のスケルトンを作ります。

extenstionwiz.jpg

ダウンロードしたファイルを解凍して適当なフォルダに置きます。ここではC:\fxext\に置きました。

C:\fxext\myext\install.rdfを開き、<em:id>タグ内の文字列をコピーします。ここでは myext@mynameになっています。

Firefoxのdevプロファイルのプロファイルフォルダを探します。通常はC:\Documents and Settings\<ログオン名>\Application Data\Mozilla\Firefox\Profiles にあります。この下のdevで終わっている名前のフォルダがプロファイルフォルダです。

この下のextenstionsフォルダの下に、先ほどコピーした名前でファイルを作成します。ここではmyext@mynameです。次にテキストエディタで開き、拡張のあるフォルダを記述します。ここでは以下のようになります。

C:\fxext\myext\

Firefoxをdevプロファイルで開きなおします。

「ツール」->「アドオン」メニューをクリックし、自分のアドオンが登録されているか確認します。

addon.jpg

あとはここから作っていくわけですが、基本的にはXULでユーザーインタフェースをつくり、javascriptでハンドラを書く、という作り方になります。

参考リンク:
http://developer.mozilla.org/ja/docs/Extensions
http://www.xulplanet.com/

debianでWindowsの共有フォルダにオートマウント

必要なものをインストール、sambaサーバが必要なのかはよくわかりませんでしたが一応入れてあります。

# apt-get install autofs smbclient smbmount samba

マウントポイントのルートディレクトリを作成。

# mkdir sambaauto
# chmod 777 sambaauto/

auto.smbの編集

# vi /etc/auto.smb

opts="-fstype=cifs"

を以下のように変更

opts="-fstype=cifs,iocharset=utf8"

パーミションの変更。

# chmod 755 /etc/auto.smb

auto.masterを編集して、auto.smbを読み込ませる。

# vi /etc/auto.master

以下の行を追加

/sambaauto /etc/auto.smb

autofsを再起動

~# /etc/init.d/autofs restart

アクセス

$ cd /sambaauto/192.168.0.100

debianにvmware-config-toolsをインストールする

debianをゲストOSとしてインストールし、vmware-config-toolsをインストールしたときの記録。

debianは日本語設定でインストールした以外はすべてデフォルトでインストールしました。ゲストOSの種別は”Other Linux 2.6.x kernel”。カーネルのバージョンは2.6.18-6-486。インストールファイルは”VMwareTools-6.0.0-45731.tar.gz”。

まず、vmware-config-toolsのインストールに必要なファイルをインストールします。

# apt-get install gcc linux-headers-2.6.18-6-486

/usr/src/linux-headers-2.6.18-6-486のシンボリックリンクを作ってvmware-config-toolsがカーネルヘッダを見付けられるようにします。(これは不要かも)

# cd /usr/src
# ln -s linux-headers-2.6.18-6 linux

vmwaretoolsを解凍して実行します。基本的に全部デフォルトで、最後の解像度の設定だけすればOKです。

# tar xfz VMwareTools-6.0.0-45731.tar.gz
# cd vmware-tools-distrib/
# ./vmware-install.pl