colinuxをFC6に

FedoraCore6のイメージがあったので入れなおしてみた。
http://sourceforge.net/project/showfiles.php?group_id=98788
の Root FS Images - 2.6.x-based ってところから、FedoraCore6-20070502.exeをダウンロード。
解凍すると4GBのイメージになる。
WinPcapとかcoLinuxの設定はcoLinux install memo(FedoraCore5 RootFS) - vimとかと同じ。
FC5のときにはまったpasswdもちゃんと使えたし、ssh接続も特に支障なくできた(変なメッセージは出たけど。後述)。

ランレベル変更

/sbin/runlevelすると5だったので /etc/inittab を編集。

id:5:initdefault:

と書いてある行を

id:3:initdefault:

に修正。

固定IPを割り振る,DNSとか(sample)

デフォルトでDHCPになっている。サービス登録して使用したいので変更。
vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.0.100
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
NETWORK=192.168.0.0
ONBOOT=yes

vi /etc/resolv/conf

nameserver 192.168.0.1

設定反映

ifdown eth0
ifup eth0

とやってみたけどうまくいかなかったからネットワーク再起動した。

/etc/init.d/network restart

sshd起動

sshdを起動&自動起動設定

/etc/init.d/sshd start
chkconfig --add sshd

よくわかんないメッセージ

sshでログインしたら

[1]+  Terminated              echo >/dev/tcp/10.0.2.2/7000

というメッセージが。調べたらESD?とかなんとか書いてあったんですけど、スピーカー?そんなのは今必要としていないから潰す。
/etc/profile.d/espeaker.sh
を全部#でコメントアウトしてcolinux再起動。

時刻あわせ

ntpの設定。とりあえずバックアップをとる。

mv /etc/ntp.conf /etc/ntp.conf.bak


ntp.confの作成(/etc/ntp.conf)

server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
driftfile /var/lib/ntp/drift
keys /etc/ntp/keys

/var/lib/ntp/driftの作成。

touch /var/lib/ntp/drift

自動起動の設定。

chkconfig --level 234 ntpd on


ntpdを起動する前に、一旦手動で時刻あわせを実行。

ntpdate ntp.jst.mfeed.ad.jp

ntpd起動。

/etc/init.d/ntpd start

動作確認。

ntpq -p

先頭に'*'や'+'が表示されればOK。ただし、同期を開始するまでに1分少々時間がかかる。その間は空白で表示される。コーヒータイム。

タイムゾーン

mv /etc/localtime /etc/localtime.bak
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

おわり

デフォルトのvimが貧弱すぎるから
yum install vim-enhanced
してみたけど vim --versionしたら -ruby でショッキング。
あとでソースからインストールしよ・・・
screenやzshインストールしたりまだまだ終わらない〜

ウィンドウ番号入れ替え2

ウィンドウ番号入れ替え - vimとかでやり方は分ったけど、
bindする方法が分らない。

bind N number

とした場合、今のウィンドウ番号とタイトルが表示されるだけだし、

bind N number 1

としたら使い勝手が悪すぎる><


というわけで、ソース(4.0.2 + screen install memo (UNIX)のパッチあてたバージョン)をいじってしまいました。
numberコマンドの動作はそのままで、引数で"-i"が指定されるとウィンドウ番号の入力を求めるようにしてみました。
C-a Nでウィンドウ番号表示とかしないので、

bind N number -i

として使っています。
ソースいじらないでも出来るwwwって人はぜひ教えてください><


ついでにソース晒し。
process.cのDoAction関数の上に以下の関数3つを書く。

static void
WindowNumberChange(n)
int n;
{
  struct display *odisplay = display;
  int old = fore->w_number;
  struct win *p = wtab[n];

  wtab[n] = fore;
  fore->w_number = n;
  wtab[old] = p;
  if (p)
    p->w_number = old;
#ifdef MULTIUSER
  /* exchange the acls for these windows. */
  AclWinSwap(old, n);
#endif
#ifdef UTMPOK
  /* exchange the utmp-slots for these windows */
  if ((fore->w_slot != (slot_t) -1) && (fore->w_slot != (slot_t) 0))
    {
      RemoveUtmp(fore);
      SetUtmp(fore);
    }
  if (p && (p->w_slot != (slot_t) -1) && (p->w_slot != (slot_t) 0))
    {
      /* XXX: first display wins? */
      display = fore->w_layer.l_cvlist ? fore->w_layer.l_cvlist->c_display : 0;
      RemoveUtmp(p);
      SetUtmp(p);
    }
#endif

  WindowChanged(fore, 'n');
  WindowChanged((struct win *)0, 'w');
  WindowChanged((struct win *)0, 'W');
  WindowChanged((struct win *)0, 0);

  if (display != odisplay)
    {
      for (display = displays; display; display = display->d_next)
        if (display == odisplay)
          break;
    }
}

static void
SelectWindowNumberFin(buf, len, data)
char *buf;
int len;
char *data; /* dummy */
{
  int i;
  char* p;

  if (!len || !display)
    return;

  p = buf;
  i = 0;

  while (*p)
    {
      if (*p >= '0' && *p <= '9')
        i = 10 * i + (*p - '0');
      else
        {
          Msg(0, "%s: invalid argument. Give numeric argument.",
              rc_name);
          return;
        }
      p++;
    }

  if (i < 0 || i >= maxwin)
    return;

  WindowNumberChange(i);
}

static void
InputSetWindowNumber()
{
  Input("Set window's number to: ", 20, INP_COOKED, SelectWindowNumberFin, NULL);
}

あと、これも同じくprocess.cのDoAction関数内にある巨大なswitch分の case RC_NUMBER: を以下のように書き換える。

    case RC_NUMBER:
      if (*args == 0)
        {
          Msg(0, "This is window %d (%s).\n", fore->w_number, fore->w_title);
          break;
        }
      if (!strcmp(*args, "-i") && !args[1])
        {
          InputSetWindowNumber();
        }
      else
        {
          if (ParseNum(act, &n) || n >= maxwin)
            break;
          WindowNumberChange(n);
        }
      break;

以上です。

xmleditプラグイン

htmlで自動的に終了タグを挿入してくれるプラグインを探していたときに
xmledit : XML、HTML、SGMLドキュメントのタグ編集操作サポートプラグイン — 名無しのvim使いで発見したのですが、
どうやらインストール方法が変更されているのでメモ。
fedoracoreで試しました。
他OSで使用される場合はパスをそれぞれ置き換えてください。

インストール

http://www.vim.org/scripts/script.php?script_id=301
からxml.vimをダウンロードし、~/.vim/ftplugin/に格納。
~/.vim/ftpluginフォルダが無い場合は作成してください。
.vimrcに

filetype plugin on

が定義されていればxmlファイルを開くと自動的に適用されます。
初回起動時にdocファイルが作成される。(~/.vim/doc/xml-plugin.txt)
このファイルを見るとhtml.vimのsample codeが記載されているので、
これをコピペして ~/.vim/ftplugin/html.vim を作成します。
xml-plugin.txtが作成されない場合はvimを起動して

:source ~/.vim/ftplugin/xml.vim

としてみてください。それでも作成されない場合はがんばって調べて><
あとは

:helptags ~/.vim/doc/

でtagsファイルを更新しておきます。

使ってみる

補完

<hoge>と打ってみると自動的に<hoge></hoge>となります。

タグで囲む

vで文字列を選択し、下のコマンドを入力します。
(<LocalLeader>はdefaultでは"\"です)

<LocalLeader>x

タグ名とアトリビュートを聞かれるので、指定します(空白可)。
ここではタグ名を div、アトリビュートを id="name"と指定したとします。
<div id="name">選択した文字列</div>となります。

タグ削除

削除したいタグにカーソルを合わせ、下のコマンドを入力します。

<LocalLeader>d
対応タグにジャンプ

タグにカーソルを合わせ、下のコマンドを入力します。

<LocalLeader>5

(5は%の代わりじゃないかな)

オプション

デフォルトでは">"が入力されたときに補完されるのですが、
これを変更するには.vimrcに

let xml_tag_completion_map = "<C-l>"

とします。上記設定だとインサートモード時にCTRL-Lで補完してくれるようになります。

またdefaultでは<br>を入力しても<br />にはしてくれませんが、.vimrcに

let xml_use_xhtml = 1

と書くことで<br />と補完してくれるようになります。
他のオプションは :help xml-plugin-settings で参照してください><

コールバック

<hoge>と入力すると</hoge>を補完してくれますが、
例えばhtmlで<body>と入力すると<body bgcolor="white"></body>となってしまいます。
これを自分好みに変更するように設定します。

.vimrcに以下のfunctionを記述します。(sampleです)

"xmlファイルのときに呼ばれる
function XmlAttribCallback(xml_tag)
  if a:xml_tag ==? "hoge"
    return "default=\"attributes\""
  else
    return 0
  endif
endfunction

"htmlファイルのときに呼ばれる
function HtmlAttribCallback(xml_tag)
  if a:xml_tag ==? "a"
    return "href=\"\""
  else
    return 0
  endif
endfunction

このsampleだと、xml編集中に<hoge>を入力すると<hoge default="attributes"></hoge>となり、
html編集中に<a>を入力すると<a href=""></a>となります。
if a:xml_tag ==? "タグ名" を記述して自分好みにカスタマイズしてください。
(:help xml-plugin-callbacks)

ウィンドウ番号入れ替え

ずっとやり方が分らなくてパッチ書くしかないと思ってソースを見ていて、
ここに書けばいいというところまでは当たりをつけた。
ちょっと調べたいことがあってhttp://www.linux.or.jp/JM/html/GNU_screen/man1/screen.1.htmlを見たら発見してしまった><

number [n]

でできるよ!
C-A、:(コロン)と入力するとコマンド入力できるようになるので、
そこで"number 1"と入力するとウィンドウ番号を変更することが出来る。
今のウィンドウの番号と入力されたウィンドウの番号が一緒なら変更されないし、
既に存在するウィンドウの番号を指定した場合は入れ替えとなる。
存在しないウィンドウ番号なら今のウィンドウ番号が変更されるだけ。


リファレンスはちゃんと読もう><

表示がずれるのを直した

前から気にはしていたのだけど、screenを使ってw3mを実行するとズレまくるのを調べてみた。
screen install memo (UNIX)
このサイトのとおりにやって見たらズレなくなった。
違うのはscreen-4.0.2を落としたのと、configureに--enable-colors256を指定したくらい。
4.0.2のソースはhttp://www.gnu.org/prep/ftp.htmlにいって適当に落としてきました。
4.0.4で修正されることを期待。

substitute(置換)

:s

:s/a/b/
でaをbに置き換えできる。
これは現在行の最初にaがマッチする箇所しか適用されない。
つまりカーソルがある行が

aaa

だった場合、

baa

となる。

&コマンド

前回実行した:sを再度実行する。

g&コマンド

前回実行された:sを:%s(全行に適用)してくれる。
これは知らなかった。。。

coLinux install memo(FedoraCore5 RootFS)

colinux(バージョン:0.64)とFedoraCoreのイメージをダウンロード。
colinuxはstable、FedoraCoreはRoot FS Images - 2.6.x-basedってところから。
http://sourceforge.net/project/showfiles.php?group_id=98788

install

落としてきたcoLinux-0.6.4.exeを実行し、インストール。
今回はWinPcapを使用するのでインストーラでTAPは解除しておく。
インストールパスは「C:\colinux\」に変更。
途中でWinPcapダウンロードサイトURLが表示されるので、選択してダウンロードしておく。


インストールが終わったらWinPcapをインストール。
再起動を要求されるので再起動する。
(再起動を要求されないこともあるらしいです。ネットワーク接続ができない時は再起動するとなおるかもしれません)


FedoraCoreのイメージをcolinuxインストールフォルダに解凍する。
ちなみに落としてきたのは「FedoraCore5-2006.8-ext3-2gb.7z」。
7zipなのね。一緒にbatファイルが入っていたけど必要ないので削除。
ファイル名を「root.ext3」に変更(必須ではない)。

swapのイメージを探していたら親切な人が公開していたので利用させていただく。
サイズはお好きなものをどうぞ。
http://gniarf.nerim.net/colinux/swap/
これもcolinuxのインストールフォルダに解凍。
解凍したファイルの名前を「swap_device」に変更(必須ではない)。


C:\colinux\default.colinux.xmlを編集。

<?xml version="1.0" encoding="UTF-8"?>
<colinux>
    <block_device index="0" path="\DosDevices\c:\coLinux\root.ext3" enabled="true" />    
    <block_device index="1" path="\DosDevices\c:\coLinux\swap_device" enabled="true" />
    <bootparams>root=/dev/cobd0 fastboot nogui</bootparams>
    <initrd path="initrd.gz" />
    <image path="vmlinux" />
    <memory size="512" />
    <network index="0" name="Local Area Connection" type="bridged" />
</colinux>

で、重要なのがnetworkのとこ。
スタートメニュー→設定→ネットワーク接続を開いて「ローカルエリア接続」を「Local Area Connection」にリネームする。
colinuxが0.62以前は「ネットワーク・アダプタ名」を指定する(はず)けど、「ネットワーク接続の名前」になった。
これでWinPcap接続ができるようになる。

colinux起動

colinux-daemon.exe -t nt -c default.colinux.xml

で起動する。
username:rootで入れる。passwordは無い。

password変更できねー

passwdしてもエラー発生。

/usr/share/cracklib/pw_dict: error reading header

こんなメッセージが。
ファイルサイズ0だし。

cracklibをインストールしなおせば直るらしいので再インストール。

yum install yum-utils
yumdownloader cracklib-dicts
rpm -Uvh --replacepkgs cracklib-dicts-xxxxx.rpm   ←落としてきたファイルの名前で

ssh

sshでログインできるようにする。
sshdをインストールし起動する。

yum install openssh-server
/etc/init.d/sshd start

puttyでアクセスするんだけど、

Server refused to allocate pty

と表示されたままログインできない。
とりあえずCTRL+Dで終了させる。


いろいろ調べたところ解決方法がずばり書いてあるところを発見。
CoLinux + Fedora Core 5 RootFS - group.silver.arrow - silver-arrowグループ
/etc/udev/makedev.d/50-udev.nodes に

tty0
ptmx

を追加して再起動すればOK。

ネットワーク

わざわざcolinux-daemon.exeを実行するのは面倒だし、サービス登録して利用するつもりなので、DHCPだと困る。
デフォルトはDHCPになっているのでstaticに変更する。

yum install system-config-network-tui

した後に、system-config-network を実行して設定してあげる。

coLinuxをサービス登録

一旦colinuxを終了させる。
次のコマンドを実行するとサービス登録できる。

colinux-daemon.exe -c default.colinux.xml --install-service "colinux"

逆にサービスを解除したい場合は

colinux-daemon.exe --remove-service "colinux"

でOK。「"colinux"」のところはお好きな名前で。


登録はされたけど起動はしてないので起動する。
「コントロールパネル」→「管理ツール」→「サービス」で一覧が表示されるので、
先ほど登録した名前(colinux)を選択して右クリック。
ここで開始を選んでもいいけど、Windowsの起動時に自動起動にしたいのでプロパティを選択。
スタートアップの種類で「自動」を選び、更新。
そしてサービスを開始させる。

おわり

これで一通り準備が整ったのであとはお好きにどうぞ。
一点、デフォルトでキーボードが英語配列になっているので、日本語配列にしたい人は

yum install system-config-keyboard

すると幸せになれるらしいよ。