2007-11-26

Fedora から Gentoo への移行


Fedora の yum が w3m のために gpm をひっぱってきたりと依存関係がうっとおしいのに愛想がつきて Gentoo にいれかえたいなと思っていると「HOWTO Convert A RedHat Server to Gentoo Remotely- Gentoo Linux Wiki」というページを発見。
swap が小さいので代わりに少し危険だとあるけれど「HOWTO Replace RedHat with Gentoo, Remotely over SSH」の方法をとることにした。

1.必要なドライバをカーネルに組み込む
安全のため、モジュールなしでも起動できるカーネルを作る。
必要なモジュールは lspci-vvv を使えばわかる。

(2.sshd_confg で SSH の PAM 機能をオフにする)
remote からする時は必要だが、私は local で作業したので行っていない。
ちなみに以下のようにするといいらしい。


  1. /etc/ssh/sshd_config の UsePAM を no にする。

  2. netstat -tanp | grep LISTEN | grep sshd で sshd の PID をメモ

  3. kill <PID> で sshd を kill。これを実行しても LISTEN している sshd だけが kill され、すでにログインしているプロセスには影響しない。

  4. ログアウトせずに /usr/sbin/sshd を実行。

  5. 今のログインとは別にマシンに ssh 接続できるか試してみる。



3.最新の stage3 をダウンロード
Gentoo Linux-- Gentoo Linux Mirrorsにミラーサイト一覧があるので適当なところを選んで stage3 の tarball をダウンロード。

4.設定ファイルのバックアップ

  • /etc/resolv.conf

  • /etc/fstab,mtab

  • /etc/passwd,shadow,group

  • /etc/grub.conf,lilo.conf

  • /etc/sysconfig/network

  • /etc/sysconfig/network-scripts/ifcfg-eth*

  • apache の設定

  • sshd の設定


あたりを。そして、 /sbin/lsmod > /tmp/gentoo/modules.txt のようにして読みこまれているモジュールのリストをバックアップ。

5.全てのファイルの更新日時を変更
Gentoo をいれたあとにいらないファイルを識別するために一度全ファイルの更新日時を適当な日時に変更しておきます。


mv /sbin/modprobe /sbin/.modprobe
find / -print0 | xargs -0 touch -d "Feb 1 1978" -m -a
mv /sbin/.modprobe /sbin/modprobe



6.stage3 tarball を展開
私は念のために Fedora のバックアップをとりました。


# cd /
# for x in `tar jtvf /tmp/gentoo/stage3-*.tar.bz2 | awk '{print $6}'`;do
test ! -d $x -a -e $x &amp;&amp; echo $x
done > /tmp/fedora-list
# xargs tar zcvf /tmp/gentoo/fedora.tar.gz < /tmp/fedora-list


stage3 tarball を展開します。


cd / &amp;&amp; tar jxvf /tmp/gentoo/stage3-*.tar.bz2




7.portageツリーを同期


emerge --sync


同期には時間がかかるので、その間に他の作業ができるようにシェルを複数開いておくといいでしょう。

8.stage3 で置換えられたファイルの内容を復元

  • root パスワードの再設定。

  • 自分のアカウントを追加。

  • UID が変化していることがあるのでホームディレクトリ以下のファイルの所有者を再設定。


この時点でログインできるかどうかを確認。

  • バックアップしてある passwd、shadow、groupをもとにユーザ/グループを追加。UID が変化するなら以下のようにして所有者を再設定。




find / -uid $olduid -print0 | xargs -0 chown $newusername



  • バックアップから /etc/fstab を復元。


元の著者は LABEL= の設定を変更しているけれどそれはお好みで。

  • GRUB(または LILO)の設定を復元。

  • /etc/make.conf を編集

  • ネットワークの設定


/etc/conf.d/net を /etc/conf.d/net.example を見ながら編集。

  • その他の設定

    • /etc/conf.d/keymaps で KEYMAP の変更(emacs で US 配列・capslock が ctrl の役割のマップになるらしい)

    • /etc/conf.d/clock で CLOCK を local に変更

    • /etc/rc.conf で EDITOR をお好きなものに変更



  • システムのロケールを変更。日本なら ln -sf /usr/share/zoneinfo/Japan /etc/localtime

  • (一時的に、 /usr/bin/sshd を /etc/conf.d/local.start に追加)

  • /etc/conf.d/hostname でホスト名を設定

  • cd /lib && rm -rf i686 && /sbin/ldconfig で Fedora のシステムライブラリから Gentoo のシステムライブラリに移行!


この時点で Fedora のシステムバイナリ/ライブラリから Gentoo のものへの移行が完了です。再起動していらないファイルを削除する前に基本的なシステムコンポーネントをインストールします。

8.boot に必要なものをインストール

  • システムロガー(sysklogd,syslog-ng,metalog)

  • cron

  • emacs,vi で Backspace が動作するようにtermcap を修正するために libtermcap-compat

  • ブートローダ(GRUBかLILO)

  • openssh (rc-update add sshd default して、/etc/conf.d/local.start から /usr/bin/sshd を削除)

  • お好きなエディタ


私の場合、Fedora が LVM を使っていたので、さらに lvm2 を emerge しました。

これで再起動の準備が整いました。以下のことを確認して再起動してください。


  1. ブートローダがきちんと動くカーネルを起動するように設定されていること。

  2. ネットワークをつなげるためのドライバがカーネルにインストールされていること。

  3. Gentoo のネットワーク設定が正しく、タイプミスがないこと。

  4. fstab が正しく設定されていて boot 時に mount されるようになっていること。

  5. システムにログインし、 root になれること。

  6. openssh がシステム起動時に起動されること。



再起動後はいらない(Fedora 由来の)ファイルを削除します。

9.必要なファイルの保護
以下のように必要なファイルを保護します。


# find /lib/modules /etc/ssh -print0 | xargs -0 touch -m -a
# touch -m -a /etc/resolv.conf


これら以外にも例えば /var/www にウェブコンテンツを置いている場合にはそこも保護するといいでしょう。

10.Fedora のファイルを削除


# touch -d "Feb 2 1978" -m -a /tmp/foo
# find /bin /sbin /etc /lib /usr /var -type f ! -newer /tmp/foo -print0 | xargs -0 rm -v
# find /bin /sbin /etc /lib /usr /var -type d ! -newer /tmp/foo -print0 | xargs -0 rm -vrf



11.Fedora のディレクトリを削除


# cd / &amp;&amp; rm -rf opt misc tftpboot selinux



これで一通り終りです。
私の場合、空き容量800MBほどだったのが3.2GBほどまで増えました。

2007-11-15

SPARC のアセンブラ


Kernel Planet のDaveM's Linux Networking BLOGを見て。

2つのレジスタの状態によって、第3のレジスタに 0 か 1 を代入するということをしたい時。
つまり、


if(reg1==reg2)
reg3=1;
else
reg3=0;

ってことをしたい時。

下のようなコードだと分岐予測がきかないため効率が良くないらしく(いまいち理由がわからない…)、


cmp %reg1, %reg2
mov 0, %reg3
bCOND,a 1f
mov 1, %reg3
1:



次のようなコードを生成するらしい。


/* %reg3 = (%reg1 != %reg2) */
xor %reg1, %reg2, %reg3
subcc %g0, %reg3, %g0
addx %g0, 0, %reg3

/* %reg3 = (%reg1 < %reg2) */
cmp %reg1, %reg2
addx %g0, 0, %reg3

/* %reg3 = (%reg1 > %reg2) */
cmp %reg2, %reg1
addx %g0, 0, %reg3



これを読むために色々調べたことをメモ。
SPARC のアセンブラの演算は

hoge <レジスタ>,<レジスタもしくは数字>,<レジスタ>

と呼出し、第1引数と第2引数の演算結果を第3引数のレジスタに代入する。
g0 レジスタは、常に 0 がはいっていて代入は意味がない。
〜cc は with carry で演算結果によっては carry bit をセットする。
〜x は carry bit を考慮して演算する。
下2つはともかく、 %reg3 = (%reg1 != %reg2) の時が面白い。
xor して reg3 が 0 (reg1 == reg2) なら
subcc は 0- 0 で carry bit は 0 。
addx は 0+ 0 + <carry bit> で reg3 は 0。

xor して reg3 が 正 (reg1 != reg2) なら
subcc は 0- 正 で carry bit は 1 。
addx は 0+ 0 + <carry bit> で reg3 は 1。

引き算の carry bit を足し算で使うというアイデア。

386本で読んだはずなのに、 carry bit なんてすっかり忘れてた…。


2007-11-14

StupidFilter


/.本家から。
ウェブ上のばかな文章をフィルタリングするStupidFilterと言うオープンソースプロジェクトが開始された。
コアエンジンとしてCMS、ブログ、Wikiなどと協調して働くもの、そして、Firefox、Wordpress のプラグインをリリースする予定らしい。
とりあえず使えるコードは12月にでるそうな。

英語のみ対応のようだが、日本語版も作れないものかな。

ref.StupidFilter :: Main / HomePage

2007-11-05

pabbrev.el


gnu-emacs-sourcesMLから。
作者は、Phillip Lord氏。
アイドルタイムにバッファをスキャンし、文章を書いていて補完候補がみつかれば、候補を表示してくれる。
例えば、Emacsと打つ過程は


E
Em[acs] (ここでTAB)
Emacs

という風になる。
ここで表示されるのはもっとも出現頻度の高い候補だが、TABを二回おすことで下に選択バッファが開き、それ以外の候補を選択できます。

一応、日本語にも対応してはいるもののやはり区切りかたがいまいちで、日本語を書くのにはあまり使えないかも。
プログラミング時には、かなり使えるものと思われる。
アイドル時のバッファのスキャンは高速で Zaurus でも全くストレスなく使うことができた。

パスの通ったとこにおいて
.emacsに

(require 'pabbrev)

として、使いたいバッファで M-x pabbrev-mode してやればいい。
global-pabbrev-mode なら全バッファ(pabbrev-global-mode-not-buffer-names で指定されたものは除かれる)で pabbrev-mode が有効になる。
スキャン時に表示されるメッセージがうっとおしければ、

(setq pabbrev-idle-timer-verbose nil)

しておけばよろし。

2007-11-04

サスペンド、ハイバネーションのテスト


LKML に投稿されたパッチ。
/sys/power/pm_test_level に任意の数値を書きこむことで、サスペンド、ハイバネーションのテストを有効にする。


5- プロセスをフリーズするテスト
4- プロセスをフリーズし、デバイスをサスペンドするテスト
3- プロセスをフリーズし、デバイス・プラットフォーム操作システムをサスペンドするテスト
2- プロセスをフリーズし、デバイス・プラットフォーム操作システムをサスペンドし、起動CPUでないCPUを無効にするテスト
1- プロセスをフリーズし、デバイス・プラットフォーム操作システムをサスペンドし、起動CPUでないCPUを無効にし、プラットフォーム/システムのデバイスをサスペンドするテスト

プラットフォーム操作システムは、ACPIが有効なマシンでのみ使え、ハイバネーションモードが "platform" である時だけ、テストされる。


ref. Testing Suspend and Hibernation | KernelTrap

オープンソース版Second Life


Second Life のオープンソース版がでるみたい。

ref. A second life for 'Second Life' with open source? (LinuxWorld) [LWN.net]

2007-11-02

Apche の設定を楽にする mod_macro


mod_macroは、Fabien Coelho 氏 の書いた Apche用モジュール。
ライセンスは、Apcheと同じくBSDスタイルのライセンス。

これを使うと、例えば以下のようにして設定のコピペを回避し、ミスを少なくすることができる。



<Macro VHostCGI $customer $domain>
<VirtualHost $domain:80>
ServerName $domain
ServerAlias www.$domain
DocumentRoot /vaw/www/$customer/docroot/$domain/
ScriptAlias /cgi-bin/ /var/www/$customer/cgi-bin/
ErrorLog /var/log/apache/$customer/logs/$domain-error.log
CustomLog /var/log/apache/$customer/logs/$domain-access.log combined
<Directory /var/www/$customer/cgi-bin/>
Options ExecCGI
</Directory>
</VirtualHost>
</Macro>

Use VHostCGI customer1 example.com
Use VHostCGI customer15 sample.net
Use VHostCGI customer122 iamanexampletoo.org



Gentoo なら mod_macro を emerge して、 /etc/conf.d/apache の HTTPD_OPTS に "-D MACRO" を追加。
それ以外なら、最新版をダウンロードして、展開。


# apxs -cia mod_macro-1.1.8/mod_macro.c


で、本体のインストール。


# cp mod_macro-1.1.8/mod_macro.html apache_2.2.0/manual/mod/


で、ドキュメンとをコピー。


これを使うことで大分保守性があがりそう。本家にはいったりしないかねぇ。

2007-11-01

slashdotjp-mode


とりあえずバグ修正版


  • n/p キーの変な挙動

  • 同時に二つ以上の記事を取得した時にどちらのコメントも2つめの記事のほうに行ってしまうバグ

  • 一度取得した記事が二回目以降取得できないバグ



slashdotjp.el