2011年5月19日木曜日

USB Storage iSerial for KVM

# on debian squeeze

## Apache WebDAV 調子芳しくなく... 
## 素直な設定のままでいろいろイジらん方が良さげ

また唐突、絶対に覚えられないのでメモ。地味に必要なヒトいるかも。KVM と言
うか QEMU の話で、-usbdevice オプションは古いから -device オプションを使
おう。調べたところ本家? に指定方法アリ。ドキュメント眺めたり debian git
のソース取ってきたりしたところ -drive 側で

    -drive id=usbmem,file=thinstick.img,serial=01234567890ABCDEF

でイケると思いきや、常に "1" に。また調べると、こんなパッチ があったけど
debian のソース - git://git.debian.org/git/collab-maint/qemu-kvm.git
ではバージョン 0.14.0+dfsg-1~tl からで squeeze にバックポートもないし、
このバージョンでバイナリパッケージ作るも依存関係、他パッケージのバージョ
ン合わずインストールできず。で、いつものよぉおーに...ムリヤリ

    --- hw/usb-msd.c.dpkg-dist 2011-05-19 22:52:54.000000000 +0900
    +++ hw/usb-msd.c 2011-05-19 22:53:00.000000000 +0900
    @@ -296,7 +296,11 @@
                     break;
                 case 3:
                     /* serial number */
    +                if (s->dinfo && s->dinfo->serial) {
    +                     ret = set_usb_string(data, s->dinfo->serial);
    +                } else {
                     ret = set_usb_string(data, "1");
    +                }
                     break;
                 default:
                     goto fail;

多分モニタからは指定できず、起動時のオプション指定のみしか有効にならない。
でもまぁ

    kvm -m 512M -net tap -net nic,model=e1000 \
    -device piix3-usb-uhci -device usb-storage,drive=usbmem \
    -drive id=usbmem,file=memstick.img,serial=0123456789ABCDEF

で動くことは動いてる。根性ナシで手抜き、こっちも忘れそうだけど

    $ dpkg-buildpackage -b -rfakeroot -us -uc
    ...
    $ su
    ...
    # mv /usr/bin/kvm /usr/bin/kvm.dpkg-dist
    # cp debian/qemu-kvm/usr/bin/kvm /usr/bin 

でゴマカシ。

2011年5月3日火曜日

WebDAV quota on linux

あまり apache に限った話ではなく、いくつか方法があると思うのだけど、思い
付いたところ。ユーザ WebDAV 用のローカル側にてディレクトリを

1. オーナーをユーザ、グループを www-data。合わせて SUID して user quota
   chmod 4770 $HOME/public_html/webdavdir
   
   でもディレクトリの SUID は意味がないと言うか、許されちゃいない。ここで
   も少し触れられているし、じゃったら FreeBSD をつかえぇ。位の話らしい。
   できる、できないではなくパッチもあり、そんなに難しいことではなさそうな
   ので、セキュリティの問題で、やらないっぽい。あるいは GFS2 なら mount 
   オプションにあるらしいけど、そこまでやる元気もなし


2. オーナーを www-data として SGID & group quota
   グループを各ユーザ毎に --- chamaken ユーザに chamaken グループなど作
   成してグループで group quota は umask を変更すれば可能。

   変更しないとディレクトリ掘られた場合に削除できなくなってしまう。

   Dealing With Dashcode, Part 2: Apache, WebDAV, and umasks と同じ事かな

   umask を 022 から 002 に変更するには、シェルユーザとしては
   /etc/profile や $HOME/.profile あるいは /etc/login.defs の UMASK など。
   apache の場合は /etc/apache2/envvars に umask 002 を追記してあげれば
   ば良い ``らしい''


3. POSIX ACL & group quota
   上の ``Dealing With Dashcode'' 眺めていて、何とかならんのかい。と試し
   ていたらできちゃった程度なので見識ある方ご意見いただけると、とっても
   ありがたいです。
   
   先日の /etc/fstab に acl オプション追加

       # diff -uw fstab.old fs
       --- fstab.old 2011-05-03 08:08:59.000000000 +0900
       +++ fstab 2011-05-03 08:39:53.000000000 +0900
       @@ -7,7 +7,9 @@
        #                
        proc            /proc           proc    defaults        0       0
        # / was on /dev/sda1 during installation
       -/dev/sda1 / ext3 errors=remount-ro,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 0 1
       +/dev/sda1 / ext3 errors=remount-ro,acl,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 0 1
        # swap was on /dev/sda5 during installation

   acl パッケージのインストール

       # aptitude install acl

   の後に root 権限不要。一般ユーザで

       $ mkdir g+ws $HOME/public_html/webdavdir
       $ chmod g+ws $HOME/public_html/webdavdir
       $ setfacl -m user:www-data:rwx $HOME/public_html/webdavdir
       $ setfacl -d -m user:www-data:rwx $HOME/public_html/webdavdir

   実際に group quota が効くかまでは試してないです...


長いけど umask を変更しなかった場合のお試し chamaken$ cd ~/public_html chamaken$ mkdir davtest chamaken$ ls -ld davtest drwxr-xr-x 2 chamaken chamaken 4096 May 3 18:05 davtest この配下のファイルはオーナを chamaken グループとしたいので、ディレクト リに SGID して group writable に chamaken$ chmod g+ws davtest chamaken$ ls -ld davtest drwxr-sr-x 2 chamaken chamaken 4096 May 3 18:05 davtest WebDAV でアクセスするためにオーナユーザを www-data に # root がユーザホームに手を入れるのは今一つ root# chown www-data davtest root# ls -ld davtest drwxr-sr-x 2 www-data chamaken 4096 May 3 18:05 davtest www-data になってお試し www-data$ cd /home/chamaken/public_html/davtest www-data$ touch www_file www-data$ ls -l www_file -rw-r--r-- 1 www-data chamaken 0 May 3 18:11 www_file www-data$ mkdir www_dir www-data$ ls -ld www_dir drwxr-sr-x 2 www-data chamaken 4096 May 3 18:11 www_dir www-data$ cd www_dir www-data$ touch www_file_in_www_dir www-data$ ls -l file_in_www_dir -rw-r--r-- 1 www-data chamaken 0 May 3 18:12 file_in_www_dir ずっと SGID が効いてるねぇ。同じ事を chamaken で chamaken$ pwd /home/chamaken/public_html chamaken$ cd davtest chamaken$ touch chamaken_file chamaken$ ls -l chamaken_file -rw-r--r-- 1 chamaken chamaken 0 May 3 18:17 chamaken_file この時点で怪しいけど www-data で、このファイルを消すことは消せる www-data$ pwd /home/chamaken/public_html/davdir/www_dir www-data$ cd .. www-data$ ls -l chamaken_file -rw-r--r-- 1 chamaken chamaken 0 May 3 18:17 chamaken_file www-data$ rm chamaken_file rm: remove write-protected regular empty file `chamaken_file'? y でもディレクトリ掘っちゃうと chamaken$ mkdir chamaken_dir chamaken$ cd chamaken_dir chamaken$ touch file_in_chamaken_dir chamaken$ ls -la total 8 drwxr-sr-x 2 chamaken chamaken 4096 May 3 18:43 . drwxrwsr-x 4 www-data chamaken 4096 May 3 18:39 .. -rw-r--r-- 1 chamaken chamaken 0 May 3 18:43 file_in_chamaken_dir www-data にて削除できず www-data$ rm -rf chamaken_dir rm: cannot remove `chamaken_dir/file_in_chamaken_dir': Permission denied 逆もしかりで chamaken$ rm www_file rm: remove write-protected regular empty file `www_file'? y chamaken$ rm -rf www_dir rm: cannot remove `www_dir/file_in_www_dir': Permission denied
また長いけど POSIX ACL でのお試し chamaken$ cd /home/chamaken/public_html/ chamaken$ mkdir davacl chamaken$ chmod g+ws davacl chamaken$ ls -ld davacl drwxrwsr-x 2 chamaken chamaken 4096 May 3 19:55 davacl chamaken$ setfacl -m user:www-data:rwx davacl chamaken$ ls -ld davacl drwxrwsr-x+ 2 chamaken chamaken 4096 May 3 19:55 davacl chamaken$ getfacl davacl # file: davacl # owner: chamaken # group: chamaken # flags: -s- user::rwx user:www-data:rwx group::rwx mask::rwx other::r-x chamaken$ setfacl -d -m user:www-data:rwx davacl chamaken$ cd davacl chamaken$ touch chamaken_file chamaken$ mkdir chamaken_dir chamaken$ touch chamaken_dir/file_in_chamaken_dir chamaken$ ls -ld chamaken_dir drwxrwsr-x+ 2 chamaken chamaken 4096 May 3 19:57 chamaken_dir chamaken$ getfacl chamaken_dir # file: chamaken_dir # owner: chamaken # group: chamaken # flags: -s- user::rwx user:www-data:rwx group::rwx mask::rwx other::r-x default:user::rwx default:user:www-data:rwx default:group::rwx default:mask::rwx default:other::r-x www-data 側でも www-data$ cd /home/chamaken/public_html/ www-data$ cd davacl www-data$ touch www_file www-data$ mkdir www_dir www-data$ touch www_dir/file_in_www_dir www-data$ ls -ld www_dir drwxrwsr-x+ 2 www-data chamaken 4096 May 3 19:59 www_dir www-data$ getfacl www_dir # file: www_dir # owner: www-data # group: chamaken # flags: -s- user::rwx user:www-data:rwx group::rwx mask::rwx other::r-x default:user::rwx default:user:www-data:rwx default:group::rwx default:mask::rwx default:other::r-x www-data$ ls -l total 8 drwxrwsr-x+ 2 chamaken chamaken 4096 May 3 19:57 chamaken_dir -rw-rw-r--+ 1 chamaken chamaken 0 May 3 19:57 chamaken_file drwxrwsr-x+ 2 www-data chamaken 4096 May 3 19:59 www_dir -rw-rw-r--+ 1 www-data chamaken 0 May 3 19:59 www_file www-data$ で chamaken で作ったモノを削除 www-data$ rm -r chamaken_* www-data$ 他方 chamaken 側でも www-data で作ったモノを削除 chamaken$ ls -l total 4 drwxrwsr-x+ 2 www-data chamaken 4096 May 3 19:59 www_dir -rw-rw-r--+ 1 www-data chamaken 0 May 3 19:59 www_file chamaken$ rm -r * で、前に作った実際の WebDAV 用ディレクトリに適用してみる chamaken$ mv .webdav old.webdav chamaken$ mkdir .webdav chamaken$ chmod g+ws .webdav chamaken$ setfacl -m user:www-data:rwx .webdav chamaken$ setfacl -d -m user:www-data:rwx .webdav 外からアクセスしてみる another_host# aptitude install davfs2 another_host# mkdir davmount another_host# mount.davfs https://testing_webserver/webdav davmount Please enter the username to authenticate with server https://testing_webserver/webdav or hit enter for none. Username: chamaken Please enter the password to authenticate user chamaken with server https://testing_webserver/webdav or hit enter for none. Password: mount.davfs: the server certificate does not match the server name (オレオレ使ってるぜ... と Warning) ... You only should accept this certificate, if you can verify the fingerprint! The server might be faked or there might be a man-in-the-middle-attack. Accept certificate for this session? [y,N] y another_host# ls davmount lost+found another_host# cp /etc/fstab davmount/ 長くなるので割愛。双方でディレクトリ掘ってファイルコピーしてみたりした後 の削除も可能で、まぁ動いた

2011年5月1日日曜日

apt-cacher-ng

インストールマニアのつもりはないけど、仮想マシンを度々作るにあたって何か
手軽にできないかな。えーっと g4u だっけ? の debian 版は。と探してみたら
FAI (Fully Automatic Installation) というモノがあった。いつものごとく
Quickstart - For the impatient user コレコレ。と眺め始めるも 明確な計画先
に立たず一旦保留。ドキュメントの中で apt-proxy 使うみたいなことが書かれて
いたけど squeeze になく、他をあたったところと似たようなパッケージを発見。確かに epoch 時間は読みヅラいけど、まぁ。
サーバ側は何もせず、クライアント側だけ /etc/apt を少々
  • /etc/apt/apt.conf.d/02proxy
    Acquire::http { Proxy "http://CacheServerIp:3142"; };
  • sources.list を
    • 前 deb http://ftp.uni-kl.de/debian etch main
    • 後 deb http://192.168.0.17:3142/ftp.uni-kl.de/debian etch main
のどちらか tap 接続なのでソレナリの bridge /etc/kvm-ifup 設定と netboot の準備した 後にインストール
...の前にごめんなさい。以前 dhcpd.conf で二つ誤り。一点はファイル名 filename "pxelinux.0"; ルートのスラッシュが必要らしく、正しくは filename "/pxelinux.0"; もう一点は failover らしき内容調子に乗って書いていたけど、できないそうで す。加えて isc-dhcpd の仕様でもないそうで、無理矢理稼動させようとしたと ころ /etc/dhcp/master.conf line 1259: dynamic-bootp flag is not permitted for address range dynamic-bootp 172.27.101.193 172.27.101.220; ^ range declarations where there is a failover peer in scope. If you wish to declare an address range from which dynamic bootp leases can be allocated, please declare it within a pool declaration that also contains the "no failover" statement. The failover protocol itself does not permit dynamic bootp - this is not a limitation specific to the ISC DHCP server. Please don't ask me to defend this until you have read and really tried to understand the failover protocol specification. と叱られてしまいました。さて... と僅かばかりの試行錯誤、格闘してみたとこ ろの結果としては、当該 subnet では failover 使わない。が無難そう ignore bootp; ... subnet 172.27.101.0 netmask 255.255.255.0 { option routers 172.27.101.1; option broadcast-address 172.27.101.255; option domain-name-servers 172.27.1.1, 172.27.129.1; option domain-name "mydomain.or.jp"; pool { # ignore unknown-clients; deny dynamic bootp clients; failover peer "poolish"; range 172.27.101.65 172.27.101.190; } } としてあったところを allow bootp; ... subnet 172.27.101.0 netmask 255.255.255.0 { option routers 172.27.101.1; option broadcast-address 172.27.101.255; option domain-name-servers 172.27.1.1, 172.27.129.1; option domain-name "mydomains.or.jp"; filename "/pxelinux.0"; next-server 172.27.1.1; range 172.27.101.65 172.27.101.190; range dynamic-bootp 172.27.101.193 172.27.101.220; } として。こんなんで failover のよくある設定方法、dhcpd.conf と master.conf での master.conf があっちとこっちで違ってくると言う悲しい結 果。他にも間違いあったら指摘いただけると嬉しいです。
と、気を取り直して # kvm -net nic,model=virtio -net tap -boot n -curses netest.img とすると virtio で PXE が稼動開始して下記テキスト画面 Starting SeaBIOS (version 0.5.1-20101112_103537-polaris) Booting from virtio-net.zrom 5.4.4 (GPL) ether... ROM segment 0xc900 length 0x8000 reloc 0x00000000 Etherboot 5.4.4 (GPL) http://etherboot.org Drivers: VIRTIO-NET Images: NBI ELF PXE Exports: PXE Protocols: DHCP TFTP Relocating _text from: [00087780,0009f310) to [07ee8470,07f00000) Boot from (N)etwork or (Q)uit? Probing pci nic... Probing isa nic... Boot from (N)etwork or (Q)uit? Probing pci nic... [virtio-net]I/O address 0x0000c020, IRQ #11 MAC address 52:54:00:12:34:56 Searching for server (DHCP).... ちょっと待つと、いつもの真っ黒画面の真ん中に 640 x 480 Graphic mode 何度も書いている内に覚えたエコーバックないけど ''[スペース] linux text'' 更に覚えられず F8 見ながら install vga=normal fb=false。さくさくっと進ん で debian アーカイブミラー選択の下記画面になったら、一番上 ====== [!] Choose a mirror of the Debian archive ====== = = = The goal is to find a mirror of the Debian archive that is close to = = you on the network -- be aware that nearby countries, or even your = = own, may not be the best choice. = = = = Debian archive mirror country: = = = = enter information manually = = = Argentina = = = Australia = = = Austria = = = Bangladesh = = = Belarus = = = Belgium = = = Bosnia and Herzegovina = = = Brazil = = = Bulgaria = = = = = = = = ========================= enter information manually を選択すると、こんな画面 ===== [!!] Choose a mirror of the Debian archive ===== = = = = Please enter the hostname of the mirror from which Debian will be = = downloaded. = = = = An alternate port can be specified using the standard = = [hostname]:[port] format. = = = = Debian archive mirror hostname: = = = = mirror____________________________________________________________ = = = = = = = ======================= この mirror hostname: に上の例であれば 192.168.0.17:3142 として Continue。長くなるので省略しちゃうけど、次の画面の Debian archive mirror directory: を /ftp.uni-kl.de/debian として Continue。更に次の proxy は何もせず Continue で OK。一回目は取りに行っちゃ うけど、二回目以降は確認しに行くだけなので、速くなる...ハズ

apache webdav つづきの Tips

* URL の変更
   https://servername/~chamaken/.webdav がちょっと格好悪いので /webdav
   でアクセス。認証ユーザによって URL を変更する方法。いくつかあるらしい
   けど、説明ページの多い mod_rewrite を利用。

   # ~ をなくすには AliasMatch ^/([^/]+)/(.*) /home/$1/.webdav/$2 だそうだ

       # a2enmod rewrite
        Enabling module rewrite.
        Run '/etc/init.d/apache2 restart' to activate new configuration!
        # mv default-ssl default-ssl.dpkg-dist
        # cp default-ssl.dpkg-dist default-ssl
        # emacs default-ssl
        # diff -uw default-ssl.dpkg-dist default-ssl
        --- default-ssl.dpkg-dist       2011-03-23 06:13:14.000000000 +0900
        +++ default-ssl 2011-04-30 22:28:06.000000000 +0900
        @@ -168,5 +168,13 @@
                # MSIE 7 and newer should be able to use keepalive
                BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
 
        +        # mod_rewrite
        +        RewriteEngine on
        +        RewriteLog "/var/log/apache2/rewrite.log"
        +        RewriteLogLevel 1
        +
        +        RewriteCond %{LA-U:REMOTE_USER} (.*)
        +        RewriteRule ^/webdav(.*) /~%{LA-U:REMOTE_USER}/public_html/.webdav$1 [NS,L]
        +        RewriteRule ^/private(.*) /~%{LA-U:REMOTE_USER}/public_html/private$1 [NS,L]
         </VirtualHost>
         </IfModule>

   これで https://servername/webdav とアクセスすると認証したユーザ名で、
   ソレナリの URL に変換される


* davfs2
   webdab アクセスするユーザの所属するグループを増やしてよいのであれば、
   設定ファイルは特段変更せず当該ユーザを davfs2 グループに加えてあげる。

       # aptitude install davfs2
       ...
       # adduser chamaken davfs2
       Adding user `chamaken' to group `davfs2' ...
       Adding user chamaken to group davfs2
       Done.

   やっぱり root で引き続き。/etc/fstab に追記

       # cd /etc
       # cp fstab fstab.old
       # vi fstab
       # diff -uw fstab.old fstab
       --- fstab.old 2011-05-01 08:07:33.000000000 +0900
       +++ fstab 2011-05-01 08:08:59.000000000 +0900
       @@ -11,3 +11,5 @@
        # swap was on /dev/sda5 during installation
        /dev/sda5 none            swap    sw              0 0
        /dev/scd0 /media/cdrom0   udf,iso9660 user,noauto 0 0
       +https://localhost/webdav /home/chamaken/webdav davfs defaults,user,noauto 0 0
       +
       # 

   うーん、ちょっと微妙だけど一般ユーザから操作したいので setuid

       # chmod u+s /usr/sbin/mount.davfs

   一般ユーザアカウントで

       $ mount webdav
       Please enter the username to authenticate with server
       https://localhost/webdav or hit enter for none.
         Username: chamaken
       Please enter the password to authenticate user chamas with server
       https://localhost/webdav or hit enter for none.
         Password:  パスワード
       /sbin/mount.davfs: the server certificate does not match the server name
       /sbin/mount.davfs: the server certificate is not trusted
         issuer:      oreore
         subject:     oreore
         identity:    oreore.invalid.net
         fingerprint: aa:bb:cc:dd:ee:ff:11:22:33:44:55:66:77:88:99:00:11:22:33:44
       You only should accept this certificate, if you can
       verify the fingerprint! The server might be faked
       or there might be a man-in-the-middle-attack.
       Accept certificate for this session? [y,N] y

   何だか自分のホーム配下に間接アクセスはもぞかしいいけど、まぁ

   
* (意味がないけど) quota
   apache webdav quota で調べるとモジュールがあったり FAQ では obsolute
   になったモジュール使うかコンパイルし直してハンドラ書けとかあるけど、
   何かソコまでやる元気がないと言うか...

   で、あまり意味がなくなってしまったけど、普通の quota 設定も備忘録とし
   て残しておこうかと。How To Set Up Journaled Quota On Debian Lenny
   そのままとはちょっと違っていたので

   # げっ.../home 切ってないし

       # aptitude install quota quotatool
       ...
       # cp fstab fstab.old
       # vi fstab
       # diff -uw fstab.old fs
       --- fstab.old 2011-05-01 08:08:59.000000000 +0900
       +++ fstab 2011-05-01 08:39:53.000000000 +0900
       @@ -7,7 +7,9 @@
        #                
        proc            /proc           proc    defaults        0       0
        # / was on /dev/sda1 during installation
       -/dev/sda1 / ext3    errors=remount-ro 0       1
       +/dev/sda1 / ext3    errors=remount-ro,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 0       1
        # swap was on /dev/sda5 during installation

   ここで touch /aquota.user /aquota.group すると後でサイズおかしいとか
   言われるので作らずに

       # cd /
       # mount -o remount /
       # quotacheck -avugm
       quotacheck: Scanning /dev/sda1 [/] done
       quotacheck: Cannot stat old user quota file: No such file or directory
       quotacheck: Cannot stat old group quota file: No such file or directory
       quotacheck: Cannot stat old user quota file: No such file or directory
       quotacheck: Cannot stat old group quota file: No such file or directory
       quotacheck: Checked 17441 directories and 259009 files
       quotacheck: Old file not found.
       quotacheck: Old file not found.
       # ls -l /aquota.*
       -rw------- 1 root root 10240 May  1 08:40 /aquota.group
       -rw------- 1 root root  9216 May  1 08:40 /aquota.user
       # quotaon -avug
       /dev/sda1 [/]: group quotas turned on
       /dev/sda1 [/]: user quotas turned on

   linux quota で検索すると、ここで edquota になるんだけど、サイズ指定よ
   くわかんなかったりエディタでの編集煩しく quotatool 使用。quotatool(8)
   眺めた後に

       # id -u chamaken
       1000
       # quotatool -u 1000 -d /
       # quotatool -b -u 1000 -q $((1024 * 32))MB -l $((1024 * 32 - 128))MB /
       # quotatool -u 1000 -d /
       1000 / 4022884 33554432 33423360 0 140959 0 0 0

apache webdav

on debian squeeze は省略。ユーザディレクトリ配下に方法変えつつ色々と
https アクセス。いわゆる$HOME/public_html はそのまま。その下の private は
mod_authz_owner でRequire file-owner。.webdav は文字通り webdav で。


1. apache などのインストール
       # aptitude install apache2 libapache2-mod-auth-pam \
       > libpam-radius-auth libapache2-mod-encoding
   

2. https:443 のみ有効として、ソレナリのモジュール準備
   サイトファイル? と言うのかしら?

       # a2dissite
       Your choices are: default
       Which site(s) do you want to disable (wildcards ok)?
       default
       Site default disabled.
       Run '/etc/init.d/apache2 reload' to activate new configuration!

       # a2ensite
       Your choices are: default default-ssl
       Which site(s) do you want to enable (wildcards ok)?
       default-ssl
       Enabling site default-ssl.
       Run '/etc/init.d/apache2 reload' to activate new configuration!

   次にモジュール

       # a2enmod
       Your choices are: actions alias ...
       Which module(s) do you want to enable (wildcards ok)?
       auth_pam authz_owner dav* ssl userdir
       Module auth_pam already enabled
       Enabling module authz_owner.
       ...
       Enabling module ssl.
       See /usr/share/doc/apache2.2-common/README.Debian.gz on how to
           configure SSL and create self-signed certificates.
       Enabling module userdir.
       Run '/etc/init.d/apache2 restart' to activate new configuration!

   オレオレ証明書の説明はまぁデフォルトでも動くので割愛、ごめんなさい。
   こちらリスンポートのファイルでも無効に

       # cd /etc/apache2/
       # cp ports.conf ports.conf.dpkg-dist
       # emacs ports.conf
       # diff -uw ports.conf.dpkg-dist ports.conf
       --- ports.conf.dpkg-dist 2011-04-30 20:48:43.000000000 +0900
       +++ ports.conf 2011-04-30 20:49:11.000000000 +0900
       @@ -5,8 +5,8 @@
        # Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
        # README.Debian.gz
 
       -NameVirtualHost *:80
       -Listen 80
       +# NameVirtualHost *:80
       +# Listen 80
 
        <IfModule mod_ssl.c>
            # If you add NameVirtualHost *:443 here, you will also have to change

   一応再起動 /etc/init.d/apache2 restart して確認。http://servername や
   https://servername にアクセスしたり、その他として

       # netstat -aptn | grep apache
       # lsof -i | grep apache

   で TCP 80 番で聞き耳たてていないか


3. libapache2-mod-auth-pam の設定
   /usr/share/doc/libpam-radius-auth/examples/pam_example などを眺めつつ

       # cd /etc/pam.d/
       # cp apache2 apache2.dpkg-dist
       # emacs apache2
       # diff -uw apache2.dpkg-dist apache2
       --- apache2.dpkg-dist 2011-04-30 20:56:02.000000000 +0900
       +++ apache2 2011-04-30 20:56:52.000000000 +0900
       @@ -1,2 +1,4 @@
       +auth    sufficient      pam_radius_auth.so
       +account sufficient      pam_radius_auth.so
        @include common-auth
        @include common-account

   apache 〜 PAM 〜 freeradius 〜 PAM と、とっても遠回りだけど。


4. libpam-radius-auth の設定
   前回の FreeRADIUS を使うとして

       # cd /etc
       # cp pam_radius_auth.conf pam_radius_auth.conf.dpkg-dist
       # emacs pam_radius_auth.conf
       # diff -uw pam_radius_auth.conf.dpkg-dist pam_radius_auth.conf
       --- pam_radius_auth.conf.dpkg-dist 2011-04-30 20:54:40.000000000 +0900
       +++ pam_radius_auth.conf 2011-04-30 20:54:48.000000000 +0900
       @@ -23,8 +23,7 @@
        #  deciding that the server has failed to respond.
        #
        # server[:port] shared_secret      timeout (s)
       -127.0.0.1 secret             1
       -other-server    other-secret       3
       +127.0.0.1 ZkPbwZ17bCDEx7Kx 2
 
        #
        # having localhost in your radius configuration is a Good Thing.

   apache が、この pam_radius_auth.conf を読む必要があるので

       # ls -l pam_radius_auth.conf
       -rw------- 1 root root 1257 Apr 30 20:54 pam_radius_auth.conf
       # chgrp www-data pam_radius_auth.conf
       # chmod 0640 pam_radius_auth.conf
       # ls -l pam_radius_auth.conf
       -rw-r----- 1 root www-data 1257 Apr 30 20:54 pam_radius_auth.conf

   /etc/shadow を www-data グループにして読み取らせるよりは、少し安心で
   きる気がしてる

5. ユーザディレクトリ作成
   一般ユーザで

       $ cd
       $ mkdir -p public_html/private
       $ ls -ld public_html
       drwxr-xr-x 3 chamaken chamaken 4096 Apr 30 21:02 public_html
       $ ls -ld public_html/private/
       drwxr-xr-x 2 chamaken chamaken 4096 Apr 30 21:02 public_html/private/
       $ echo 'My private content works!' \
       > > public_html/private/index.html
   
   最後の一行が Require file-owner で必要になるのか、ならないのかはっき
   りせず。Options Indexes を指定しても...


6. public_html アクセスの設定 - mod_authz_owner だけ
   バックアップ取りつつ 

       # ls -l userdir.*
       lrwxrwxrwx 1 root root  30 Apr 30 20:47 userdir.conf -> ../mods-available/userdir.conf
       -rw-r--r-- 1 root root 604 Apr 30 21:06 userdir.conf.dpkg-dist
       lrwxrwxrwx 1 root root  30 Apr 30 20:47 userdir.load -> ../mods-available/userdir.load
       # mv userdir.conf userdir.conf.dpkg-dist
       # cp userdir.conf.dpkg-dist userdir.conf
       # ls -l userdir.*
       -rw-r--r-- 1 root root 604 Apr 30 21:07 userdir.conf
       lrwxrwxrwx 1 root root  30 Apr 30 20:47 userdir.conf.dpkg-dist -> ../mods-available/userdir.conf
       lrwxrwxrwx 1 root root  30 Apr 30 20:47 userdir.load -> ../mods-available/userdir.load

   設定ファイル編集。private はディレクトリインデックスせず、PAM 認証で
   ファイルオーナーが同じ場合のみアクセス可

      # emacs userdir.conf
      ...
      # diff -uw userdir.conf.dpkg-dist userdir.conf
      --- userdir.conf.dpkg-dist 2011-03-23 06:13:14.000000000 +0900
      +++ userdir.conf 2011-04-30 21:10:29.000000000 +0900
      @@ -5,6 +5,9 @@
               <Directory /home/*/public_html>
                       AllowOverride FileInfo AuthConfig Limit Indexes
                       Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
      +
      +               IndexIgnore private
      +
                       <Limit GET POST OPTIONS>
                               Order allow,deny
                               Allow from all
      @@ -14,5 +17,20 @@
                               Deny from all
                       </LimitExcept>
               </Directory>
      -</IfModule>
 
      +       <Directory /home/*/public_html/private>
      +               AllowOverride FileInfo AuthConfig Limit Indexes
      +               Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
      +
      +               AuthPAM_Enabled On
      +               AuthPAM_FallThrough Off
      +               AuthBasicAuthoritative Off
      +               AuthUserFile /dev/null
      +
      +               AuthType Basic
      +               AuthName "Your Private Contets"
      +
      +               Require file-owner
      +               Satisfy All
      +       </Directory>
      +</IfModule>

   AuthBasicAuthoritative Off が結構ハマった。AuthUserFile /dev/null は
   ログがうるさいので

7. ちょっと確認
   また再起動 /etc/init.d/apache2 restart してから、ブラウザ何でも良いので

       https://servername/~chamaken
       Index of /~chamaken
       [ICO]   Name    Last modified   Size    Description
       [DIR]   Parent Directory                -        
       Apache/2.2.16 (Debian) Server at decoh4 Port 443/

   うん。private がインデックスされず

       https://servername/~chamaken/private
       My private content works! 

   うん、ちょーさみしーコンテンツ


8. webdav 設定
   なかなか悲しいかな、どうしたって apache 稼動ユーザ権限が必要な模様。
   
   mod_dav がファイルを操作できるようにするためには、 管理下のディレクト
   リとファイルとに Apache が実行されている User と Group で書き込み可能
   である必要があります。 新しく作成されるファイルもこの User と Group に
   所有される ことになります。この理由から、そのアカウントへのアクセスを
   制御することは 重要です。DAV リポジトリは Apache 専用のものだとみなさ
   れています。 Apache 以外の方法でファイルを修正すること (例えば FTP や
   ファイルシステム 用のツールなどを使って) は許可されていません。

   suexec じゃないけど sudir とかないのかしら。これができれば quota とか
   ローカルアカウントのユーザが気にせず読み書き... と思ったけど webdav
   プロトコルでのロックとか考えると、ローカルファイルとして操作するので
   はなく webdav としてマウントして使うべきか。

   ローカルユーザのホームディレクトリ配下なんだけど root になって

       # mkdir /home/chamaken/public_html/.webdav
       # chown www-data.www-data /home/chamaken/public_html/.webdav
       # ls -ld !$
       ls -ld /home/chamaken/public_html/.webdav
       drwxr-xr-x 2 www-data www-data 4096 Apr 30 21:04 /home/chamaken/public_html/.webdav

   userdir 設定の更新

       # cp userdir.conf userdir.conf.private
       # emacs userdir.conf
       ...
       # diff -uw userdir.conf.private userdir.conf
       --- userdir.conf.private        2011-04-30 21:45:04.000000000 +0900
       +++ userdir.conf        2011-04-30 21:45:15.000000000 +0900
       @@ -6,7 +6,7 @@
                       AllowOverride FileInfo AuthConfig Limit Indexes
                       Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
 
       -               IndexIgnore private
       +               IndexIgnore private .webdav
 
                       <Limit GET POST OPTIONS>
                               Order allow,deny
       @@ -33,4 +33,31 @@
                       Require file-owner
                       Satisfy All
               </Directory>
       +
       +        <Directory /home/*/public_html/.webdav>
       +                AllowOverride FileInfo AuthConfig Limit Indexes
       +                Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
       +
       +                AuthPAM_Enabled On
       +                AuthPAM_FallThrough Off
       +                AuthBasicAuthoritative Off
       +                AuthUserFile /dev/null
       +
       +                AuthType Basic
       +                AuthName "Your WEBDAV Authentication"
       +
       +                DAV On
       +
       +                <LimitExcept GET POST OPTIONS>
       +                        Order allow,deny
       +                        Allow from all
       +                </LimitExcept>
       +                Satisfy All
       +
       +                ForceType text/plain
       +        </Directory>
       +
       +       <Directory /home/chamaken/public_html/.webdav>
       +               Require user chamaken
       +       </Directory>
        </IfModule>

   最後の方の Require user を個々ディレクトリ毎に指定するのが少々切ない。


9. webdav アクセス
   手元の環境なら nautilus webdav。Windows からならば

       # a2enmod encoding
       Enabling module encoding.
       Run '/etc/init.d/apache2 restart' to activate new configuration!
       # emacs /etc/apache2/mods-enabled/encoding.conf適切に設定した後の方が良いのかしら。~/chamaken/.webdav はちょっと見
   栄えが悪かったりするので、その他 Tips は次回に

2011年4月30日土曜日

freeradius rlm_pap on debian squeeze

HTML がわかっていず面倒なので <pre> と FireFox extension の It's All Text!
emacsclient & auto-fill-mode & set-fill-column 72 あたりで (C-x f)

0. インストールの前に
   直に /etc/passwd を触らせるのではなく PAM 経由。一応インストール前の
   状態を確認

       # cd /etc
       # ls -l passwd group shadow gshadow
       -rw-r--r-- 1 root root    820 Apr 30 14:03 group
       -rw-r----- 1 root shadow  679 Apr 30 14:03 gshadow
       -rw-r--r-- 1 root root   1584 Apr 30 14:03 passwd
       -rw-r----- 1 root shadow 1348 Apr 30 14:03 shadow
       # grep freerad passwd group shadow gshadowN
       # ls -l /etc/pam.d/radiusd
       ls: cannot access /etc/pam.d/radiusd: No such file or directory


1. インストール
   そのまま

       # aptitude install freeradius

   何も問われず。で、何されたか? を確認

       # ls -l passwd group shadow gshadow
       -rw-r--r-- 1 root root    849 Apr 30 15:26 group
       -rw-r----- 1 root shadow  705 Apr 30 15:26 gshadow
       -rw-r--r-- 1 root root   1630 Apr 30 15:26 passwd
       -rw-r----- 1 root shadow 1377 Apr 30 15:26 shadow
       # grep freerad passwd group shadow gshadow
       passwd:freerad:x:114:120::/etc/freeradius:/bin/false
       group:shadow:x:42:freerad
       group:ssl-cert:x:111:freerad
       group:freerad:x:120:
       shadow:freerad:*:15094:0:99999:7:::
       gshadow:shadow:*::freerad
       gshadow:ssl-cert:!::freerad
       gshadow:freerad:!::
       # ls -l /etc/pam.d/radiusd
       -rw-r--r-- 1 root root 227 Sep 28  2010 /etc/pam.d/radiusd

   グループ shadow に freerad が加えられた。イコール freerad ユーザアカ
   ウントで /etc/shadow を読むことができる。/etc/pam.d/radiusd の中身は、
   うん。特に...


3. 設定ファイル変更
   How do I use PAM with FreeRADIUS?rlm_pam の説明眺めながらファイル
三つ更新。どこかで見付けたパスワード生成ワンライナー

       # cat /dev/urandom | tr -dc '0-9A-Za-z' | fold -b16 | head -n1
       ZkPbwZ17bCDEx7Kx

   を多用しつつ。余裕があるなら? もちろん /dev/random の方が良いらしい

   
  • /etc/freeradius/users
  • # diff -uw users.dpkg-dist users --- users.dpkg-dist 2011-04-30 15:59:45.000000000 +0900 +++ users 2011-04-30 15:41:02.000000000 +0900 @@ -163,6 +163,8 @@ # Service-Type = Framed-User, # Fall-Through = Yes +DEFAULT Auth-Type = Pam + # # Default for PPP: dynamic IP address, PPP mode, VJ-compression. # NOTE: we do not use Hint = "PPP", since PPP might also be auto-detected #
  • /etc/freeradius/clients.conf
  • # diff -uw clients.conf.dpkg-dist clients.conf --- clients.conf.dpkg-dist 2011-04-30 16:03:19.000000000 +0900 +++ clients.conf 2011-04-30 15:40:26.000000000 +0900 @@ -98,7 +98,7 @@ # The default secret below is only for testing, and should # not be used in any real environment. # - secret = testing123 + secret = ZkPbwZ17bCDEx7Kx # # Old-style clients do not send a Message-Authenticator @@ -232,3 +232,14 @@ # secret = testing123 # } #} + +client 172.27.0.0/17 { + shortname = primary_site + secret = jf5O7D0FD2v4KJqH +} + +client 172.27.129.0/17 { + shortname = secondary_site + secret = wvlo17pzXHzOnLfL +} +
  • /etc/freeradius/sites-enabled/default
  • # diff -uw sites-enabled/default.dpkg-dist sites-enabled/default --- sites-enabled/default.dpkg-dist 2011-04-30 16:00:37.000000000 +0900 +++ sites-enabled/default 2011-04-30 16:00:42.000000000 +0900 @@ -263,7 +263,7 @@ # # Pluggable Authentication Modules. -# pam + pam # # See 'man getpwent' for information on how the 'unix' # 3. 再起動 # /etc/init.d/freeradius restart 4. テスト # radtest chamaken 'bl0gSP010' localhost 10 ZkPbwZ17bCDEx7Kx Sending Access-Request of id 65 to 127.0.0.1 port 1812 User-Name = "chamaken" User-Password = "bl0gSP010" NAS-IP-Address = 127.0.1.1 NAS-Port = 10 rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=65, length=20 # radtest chamaken 'invalid_passwd' localhost 10 ZkPbwZ17bCDEx7Kx Sending Access-Request of id 32 to 127.0.0.1 port 1812 User-Name = "chamaken" User-Password = "invalid_passwd" NAS-IP-Address = 127.0.1.1 NAS-Port = 10 rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=32, length=20 5. その他 freeradius とは /etc/init.d/freeradius stop した後に # freeradius -X で戦うべし。/etc/freeradius/users の DEFAULT Auth-Type = Pam の位置に気をつけて。PPP の前、先頭行でも良いくらい

    2011年4月26日火曜日

    TIPS: KVM (qemu) for debian squeeze - その 1

    小さいネタをいくつか。
    netboot
    qemu pxe をキーワードに Google 先生に尋ねたところ最初のページ日本語の
    最初のページ
    眺めると ROM-o-matic.net でブートイメージ作って。とあったの
    で早速。 1.0.1 の Image Generator で NIC type の選択に virtio-net なんて
    あったものだから、おぉと選択。フロッピーはないでしょ。もしかしたら今後
    使うカモとか思いつつ output format に USB Keychain disk image を選んで
    あとはシリアルコンソールとか。さて kvm を起動しようと、マニュアルでブー
    トデバイスの指 定を眺めると...
    -boot [order=drives][,once=drives][,menu=on|off]
    Specify boot order drives as a string of drive letters.
    Valid drive letters depend on the target achitecture. The x86 PC uses:
    a, b (floppy 1 and 2), c (first hard disk),d(first CD-ROM),
    n-p (Etherboot from network adapter 1-4),
    hard disk boot is the default.
    To apply a particular boot order only on the first startup, specify it via once.
    へっ? とお試し。

    1. tftpd のインストールと netboot イメージ
      # aptitude install tftpd-hpa
      (TFTP root directory: /srv/tftp)
      # cd /srv/tftp
      # wget http://ftp.jp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz
      # tar xzf netboot.tar.gz
      # ls -1
      debian-installer
      netboot.tar.gz
      pxelinux.0
      pxelinux.cfg
      version.info
    2. dhcpd.conf の編集
      filename に /pxelinux.0。next-server に tftpd サーバのアドレス
      subnet 172.27.201.0 netmask 255.255.255.0 {
          option routers 172.27.201.1;
          option broadcast-address 172.27.201.255;
      
          pool {
              # ignore unknown-clients;
              # deny dynamic bootp clients;
              failover peer "poolish";
              option domain-name-servers 172.27.129.1, 172.27.1.1;
              option domain-name "siesta.or.jp";
      
              filename "pxelinux.0";
              next-server 172.27.129.1;
      
              range 172.27.201.65 172.27.201.190;
          }
      }
      こんな感じ。
    3. サーバ群再起動 & kvm 起動
      # /etc/init.d/tftpd-hpa restart
      # /etc/init.d/isc-dhcp-server restart
      # cd ほにゃほにゃ
      # kvm-img create netboot.img 8G
      # kvm -net tap -net nic,model=virtio -boot n -curses netboot.img
    で例のまっ黒画面に 640x480 表示されるので、目を閉じてスペース & linux text

    ルーティング
    むやみやたらに kvm-qemu や lxc でゲスト作りまくっているとワケワカになって
    えーいままよ。と大元のホスト筆頭に
    iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
    ってやっちゃったりしない? うーん、それもどうかと思うけど、コレもどうかと。
    でコレは OSPFv2 / IPv4 適当に動かしちゃう。

    1. quagga のインストール
      # aptitude install quagga
    2. /etc/quagga/daemonsの編集
      コメント除けば
      zebra=yes
      bgpd=no
      ospfd=2
      ospf6d=no
      ripd=no
      ripngd=no
      isisd=no
    3. /etc/quagga/zebra.conf/etc/quagga/ospfd.conf
      • zebra.conf
      • hostname zebra@<適当なホスト名>
        password zebra
        enable password zebra
        log file /var/log/quagga/zebra.log
        !service password-encryption
        !
        ip forwarding
        ipv6 forwarding
        !
        line vty
      • ospfd.conf
      • こんなんでも動いているらしい
        hostname ospfd@<適当なホスト名>
        password zebra
        enable password zebra
        log file /var/log/quagga/ospfd.log
        !service password-encryption
        !
        router ospf
         ospf router-id <(自分の主たる) IP アドレス - 例えば 192.168.10.1 とか>
         redistribute kernel
         redistribute static
         redistribute connected
         network 0.0.0.0/0 area 0.0.0.0
        !
        line vty
    4. パーミッション
      ちょっとウルサイらしく debian.confdaemons の他は

      quagga 所有で 0640
      # cd /etc/quagga
      # chown quagga.quagga zebra.conf ospfd.conf
      # chmod 0640 *.conf
    5. 再起動と確認
      # /etc/init.d/quagga restart
      # # (しばらく待って...)
      # ip route ls
      10.6.36.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      172.27.202.0/24 dev br2  proto kernel  scope link  src 172.27.202.1 
      172.27.129.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      172.27.68.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 30 
      172.27.193.0/24 dev wlan0  proto kernel  scope link  src 172.27.193.17 
      172.27.201.0/24 dev br1  proto kernel  scope link  src 172.27.201.1 
      192.168.27.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      172.27.1.0/24 via 172.27.193.1 dev wlan0  proto zebra  metric 30 
      111.22.3.0/22 via 172.27.193.1 dev wlan0  proto zebra  metric 20 
      default via 172.27.193.1 dev wlan0 
      この proto zebra が quagga 経由。あるいは (なっがいけど)
      # telnet localhost ospfd
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      
      Hello, this is Quagga (version 0.99.17).
      Copyright 1996-2005 Kunihiro Ishiguro, et al.
      
      
      User Access Verification
      
      Password: 
      ospfd@myhost> show ip ospf route
      ============ OSPF network routing table ============
      N    10.6.36.0/24          [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      N    172.27.129.0/24       [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      N    172.27.193.0/24       [10] area: 0.0.0.0
                                 directly attached to wlan0
      N    172.27.201.0/24       [10] area: 0.0.0.0
                                 directly attached to br1
      N    172.27.202.0/24       [10] area: 0.0.0.0
                                 directly attached to br2
      N    192.168.27.0/24       [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      N    111.22.3.0/22         [20] area: 0.0.0.0
                                 via 172.27.193.1, wlan0
      
      ============ OSPF router routing table =============
      R    172.27.129.1          [10] area: 0.0.0.0, ASBR
                                 via 172.27.193.1, wlan0
      
      ============ OSPF external routing table ===========
      N E1 172.27.1.0/24         [40] tag: 0
                                 via 172.27.193.1, wlan0
      N E1 172.27.68.0/24        [40] tag: 0
                                 via 172.27.193.1, wlan0
      ospfd@myhost> exit
      Connection closed by foreign host.
      とか
    いくつか。なんて最初に書いたけど遅くなっちゃったので、ここまで...

    2011年4月23日土曜日

    オレオレ証明書の証明書更新

    完全なる備忘録。プロバイダから付与された IP アドレス間でトランスペアレントモード
    IPSec するにあたって racoon を certificate_type x509 で動かしているんだけど、この
    証明書の更新、および更新方法を都度忘れて調べ直すので、ここにメモ。CRL のハッシュ
    がわからず「証明書を取り扱う」を多々参考にさせてもらいました。ありがとうございます
    CSR の作成
    openssl req -new -keyout server_key.pem -out server_csr.pem -nodes

    オレオレ CA で sigh
    openssl ca -config /etc/ssl/openssl.cnf -in server_csr.pem -out server_cert.pem

    CRL の発行
    openssl ca -config /etc/ssl/openssl.cnf -gencrl -out crl.pem

    証明書のハッシュ
    ln -s server_cert.pem `openssl x509 -in server_cert.pem -noout -hash`.0

    CRL のハッシュ
    ln -s crl.pem `openssl crl -in crl.pem -noout -hash`.r0

    おまけ。確認方法とか
    テキスト出力
    openssl x509 -in csr.pem -text

    verify
    openssl verify -CAfile ca.pem csr.pem

    nodes 付け忘れ
    openssl rsa -in server_key.pem -out server_nodes_key.pem

    port mirror on linux

    だいぶ以前にここに書いたと思ったら、書いていなかった... のでメモ。
    実際に使える例ではないけれど、例えば wlan0 を dummy 0 にミラーするのであれば
    root になって長いコマンド。wlan0 からの出ていく方は
    # tc qdisc add dev wlan0 root handle 10: prio
    # tc filter add dev wlan0 parent 10: prio 10 \
    > protocol all u32 match u32 0 0 flowid 10:1 \
    > action mirred egress mirror dev dummy0
    disc prio を wlan0 の最初 (root) として 10 という ID 割り当て。
    その 10 を親として 10番という順番で u32 すべてマッチのフィルタを追加。
    結果は 10:1 に流すけど 10:1 という qdisc はないのでデフォルト何もせず。
    アクションとして dummy0 にミラーを送出。確認は
    # tc qdisc ls dev wlan0
    qdisc prio 10: root refcnt 5 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    # tc filter ls dev wlan0 handle 10:
    filter parent 10: protocol all pref 10 u32 
    filter parent 10: protocol all pref 10 u32 fh 800: ht divisor 1 
    filter parent 10: protocol all pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 10:1 
      match 00000000/00000000 at 0
     action order 1: mirred (Egress Mirror to device dummy0) pipe
      index 1 ref 1 bind 1
    wlan0 に入ってくる方は
    # tc qdisc add dev wlan0 ingress
    # tc filter add dev wlan0 parent ffff: prio 10 \
    > protocol all u32 match u32 0 0 flowid ffff:1 \
    > action mirred egress mirror dev dummy0
    こちら ingress は ID が ffff と決まっている他は、入ってくる方と同じ。確認は
    # tc qdisc ls dev wlan0 ingress
    qdisc prio 10: root refcnt 5 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    qdisc ingress ffff: parent ffff:fff1 ---------------- 
    # tc filter ls dev wlan0 handle ffff:
    filter protocol all pref 10 u32 
    filter protocol all pref 10 u32 fh 800: ht divisor 1 
    filter protocol all pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid ffff:1 
      match 00000000/00000000 at 0
     action order 1: mirred (Egress Mirror to device dummy0) pipe
      index 2 ref 1 bind 1
    これで wlan0 を promisc モードにして dummy0 で tcpdump
    #  ip link set wlan0 promisc on
    # tcpdump -nevxi dummy0
    とか。ドキュメントとして iproute-doc にも含まれていないのでソースを
    apt-get source iproute
    とか
    git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git
    とかで持ってきた $SRC/doc/actions/mirred-usage を参照。iproute 全般はで、以下その mirred-usage の抜粋意訳、中途訳


    普通のイーサネットスイッチでのミラーやリダイレクトの違いは u32 フィ
    ルタ (classifier) でミラーするフローを選択できること。
    
    mirred アクションの使い方:
        mirred <DIRECTION> <ACTION> [index INDEX] <dev DEVICENAME>
            DIRECTION := ingreee か egress
            ACTION    := mirror か redirect
            INDEX は特定のポリシ ID
            DEVICENAME はデバイス名
    
    ACTION - mirror はコピーを指定されたデバイスに送る
    ACTION - redirect はパケットを横取りして指定されたデバイスに送る
             (なのでローカルプロセスには渡らない)
    
    * 禁止事項
      A. ループさせない 
          eth0 を eth1 にリダイレクト。更に eth1 を eth0 にリダイレクトなど
      B. IFB デバイスから別の IFB デバイスにリダイレクトしない
          ホストはクラッシュしないけどパケット全てが drop される
    
      A は再帰によるデバイスキューのロック輻輳。
      B は送信ロック (の輻輳?)
    
    
    ---- サンプル
    
    1. eth0 に入ってくるパケットを eth1 にミラー
    
           # tc qdisc add dev eth0 ingress
           # tc filter add dev eth0 parent ffff: protocol ip prio 10 u32 \
           >    match u32 0 0 flowid 1:2 action mirred egress mirror dev eth1
    
       mirror を redirect に変えるとコピーせずオリジナルパケットを eth1
       に送出する
    
    
    2. lo から eth0 に横取り
       lo の ingress に届く全てのパケットを eth0 にリダイレクト
    
           # tc qdisc add dev lo ingress
           # tc filter add dev lo parent ffff: protocol ip prio 10 u32 \
           >    match u32 0 0 flowid 1:2 action mirred egress redirect dev eth0
    
       この設定をしたホストで ping -c 127.0.0.1 としても失敗する。
       eth0 の先に接続したホストで tcpdump してみると...
       XXX
       このフィルタ内 redirect を mirror に置き換えて
    
           # tc filter add dev lo parent ffff: protocol ip u32 \
           >    match u32 0 0 flowid 1:2 action mirred egress mirror dev eth0
    
       とすると tc 設定をしたホストと、この eth0 の先にある両方のホスト
       で、パケットを見ることができる。つまりは ping が成功する
    
    
    3. もうちょっとイカしたサンプル
       lo の ingress にて 10個の内 1個のパケットがランダムに別ホストへ
       --- eth0 へ --- 送る (ランダムは netrand generator を使う)
       XXX: action drop --- 少し違う気がする...
    
           # tc filter add dev lo parent ffff: protocol ip prio 10 u32 \
           >    match u32 0 0 flowid 1:2 \
           >    action drop random determ ok 10
           >    action mirred egress mirror dev eth0
    
    
    4. 10.0.0.9 から来て eth0 に出ていくパケット
       (ローカルの IP か forwarding するか)
       が 100Kbps を超えると eth1 にリダイレクト
    
           # tc qdisc add dev eth0 handle 1:0 root prio
           # tc filter add dev eth0 parent 1:0 protocol ip prio 6 u32 \
           >    match ip src 10.0.0.9/32 flowid 1:16 \
           >    action police rate 100kbit burst 90 ok \
           >    action mirred egress mirror dev eth1
    
    5. もっと面白いサンプルとしてフローを (デフォルト全て drop する)
       dummy デバイスにミラーして tcpdump
    
       192.168.200.200/32 からのパケットをポリシングして、この送出が
       100Kbps を超えてほしくないとか
    
           # tc qdisc add dev eth0 handle 1:0 root prio
           # tc filter add dev eth0 pareht 1: protocol ip prio 10 u32 \
           >    match ip src 192.168.200.200/32 flowid 1:2 \
           >    action police rate 100kbit burst 90 drop
    
       eth0 で tcpdump を実行すると 192.168.200.200/32 からのパケット送
       出がドロップされようと、されまいと全て見ることができる (tcpdump
       は egress される全てのパケットを見せるから)。ルールを少しだけ拡張
       して make out したパケットを見るためには
    
           # tc qdisc add dev eth0 handler 1:0 root prio
           # tc filter add dev eth0 parent 1: protocol ip prio 10 u32 \
           >    match ip src 192.168.200.200/32 flowid 1:2 \
           >    action police rate 100kbit burst 90 drop \
           >    action mirred egress mirror dev dummy0
    
       dummy0 で tcpdump を動かして、make out されたパケットだけを見る
    
           # tcpdump -n -i dummy0 -x -e -t
    
       mirror を redirect に置き換えると、これらパケットは XXX 一切 make
       out できなくなる
    

    2011年4月18日月曜日

    obs600-tools.deb # utils の方が良かった?

    obs600 で debian squeeze の続編。deb パッケージにない
    • flashcfg
    • runled
    • pshd
    をやっつけ deb パッケージ化。

    バイナリはこんなイメージ


    ソースはこんなイメージ


    SSDLinux のソースから autotools 環境作成のスクリプトと言うかコマンド列挙は
    こんなイメージ


    zlib1g zlib1g-dev が必要なのでそれぞれ powerpc のdeb バイナリ
    • zlib1g_1.2.3.4.dfsg-3_powerpc.deb
    • zlib1g-dev_1.2.3.4.dfsg-3_powerpc.deb
    を持ってきて
    $ dpkg-cross --build --arch powerpc *.deb
    とするんだけど、バージョン上がった場合の確認が面倒。
    apt-cross というツールはなくなってしまい、pdebuild-cross は使い方わからず...

    2011年4月16日土曜日

    softdog / CONFIG_WATCHDOG_NOWAYOUT - 勘違い

    nowayout と Magic Close の関係を思いっきり勘違い。先日のエントリでは
    何とでも読み取り可。nowayout 指定しても Magic Close はできると思い込
    んでた。が、nowayout の方が強いと言うか、nowayout を指定してしまうと
    Magic Close すらできない。

    drivers/watchdog/softdog.c の中 MODULE_PARM で探すと
    soft_margin: int
    Watchdog soft_margin in seconds.
    (0 < soft_margin < 65536, default=60)
     
    nowayout: int
    Watchdog cannot be stopped once started
    (default= [config WATCHDOG_NOWAYOUT?])
     
    soft_noboot: int
    Softdog action, set to 1 to ignore reboots, 0 to reboot
    noboot でテスト。watchdog プログラムはこんなんに swd.sh と命名して
    #!/bin/sh
    
    exec 3> /dev/watchdog
    trap "echo 'send V'; echo -n V >&3; exit 0" INT
    
    while :; do
        echo >&3
        sleep 4
    done
    SIG_INT で止められたら Magic Close。root になってまずは nowayout なし
    で Magic Close の場合は
    # modprobe softdog soft_margin=10 nowayout=0 soft_noboot=1 # ./swd.sh ^Csend V (しばらく待った後に Ctrl-c) # dmesg | tail ... [ 3010.493992] Software Watchdog Timer: 0.07 initialized. soft_noboot=1 soft_margin=10 sec (nowayout= 0)
    Magic Close しない場合は (rmmod しないで引き続き)
    # ./swd.sh 
    ^Z (Ctrl-z)
    [1]+  Stopped                 ./swd.sh
    # (しばらく - soft_margin で指定した10 秒以上待つ)
    # dmesg | tail
    ...
    [ 3010.493992] Software Watchdog Timer: 0.07 initialized. 
        soft_noboot=1 soft_margin=10 sec (nowayout= 0)
    [ 3241.819563] SoftDog: Triggered - Reboot ignored.
    リブートだけど soft_noboot 指定したのでメッセージだけ。/dev/watchdog
    が開きっぱになっているので、続けて
    # fg
    ./swd.sh
    ^Csend V (Ctrl-c)
    # rmmod softdog
    次に nowayout 指定すると
    # modprobe softdog soft_margin=10 nowayout=1 soft_noboot=1
    # ./swd.sh 
    ^Csend V (Ctrl-c)
    # (10 秒以上待って)
    # dmesg | tail
    ...
    [ 3757.016487] Software Watchdog Timer: 0.07 initialized. 
        soft_noboot=1 soft_margin=10 sec (nowayout= 1)
    [ 3811.572991] SoftDog: Unexpected close, not stopping watchdog!
    [ 3821.580111] SoftDog: Triggered - Reboot ignored.
    'V' を /dev/watchdog に送ったけどリブート。で最初の通り nowayout 指定
    すると Magic Close も何のその。書き込みなくば再起動という結果。

    とってもシンプルだけど先の swd.sh は
    nohup ./swd.sh > /var/log/watchdog.log 2>&1 &
    でソレナリには動くらしい。nowayout 指定せず Magic Close 使ってリブート
    せずの停止は
    # killall -INT swd.sh
    # cat /var/log/swd.log
    nohup: ignoring input
    send V

    2011年4月13日水曜日

    PIL で bin2png - その 2

    昔? telnet しか許されていないホストで base64 したバイナリをコピペしたこと
    思い出した...鶏卵、ブートストラップ。ソレやるか? で昨日の
    > 超てきとーいいかげんにパディング
    を貼り付けた結果、ながいブログエントリぃー。pack / unpack の使い方もわかっ
    てないし、ムダな事ばっかじゃん。と思った方は是非メンテしてやってください。
    コピペして bin2png.py とかで保存した後は、こちらも昨日のイメージを保存して
    $ ./bin2png.py -d patch-2.6.38.2.gz.png -o patch-2.6.38.2.gz
    とかで。
    サイズ大きいファイルはシャレになりませんが、ブログに貼り付ける程度なら...
    #!/usr/bin/python
    
    import sys, os, math, struct
    import getopt, logging
    import Image
    
    log = logging.getLogger()
    
    def sqrint(n):
        r = math.ceil(math.sqrt(n) + 0.1)
        return (int(r), int(math.pow(r, 2) - n))
    
    
    def encode(srcfp, dstfp):
        # calc sizes
        fsize = os.fstat(srcfp.fileno()).st_size
        log.debug("encode size: %d" % fsize)
        qfsize = fsize / 4
        sides, padlen = sqrint(qfsize)
        tupad = struct.unpack('BBBB', struct.pack('!L', fsize))
    
        # create data
        data = [tupad]
        for i in range(qfsize):
            data.append(struct.unpack('BBBB', srcfp.read(4)))
        nremain = fsize % 4
        data.append(struct.unpack('BBBB', srcfp.read(nremain) + '\x00' * (4 - nremain)))
        data.extend(((0, 0, 0, 0),) * (padlen / 4 - 1))
    
        # write out
        im = Image.new('RGBA', (sides, sides))
        im.putdata(data)
        im.save(dstfp, 'PNG')
    
    
    def decode(srcfp, dstfp):
        im = Image.open(srcfp)
        imgcore = im.getdata() # needs checking mode?
        fsize = struct.unpack("!L", struct.pack("BBBB", *imgcore[0]))[0]
        log.debug("decode size: %d" % fsize)
    
        data = list(imgcore)[1:]
        b = bytearray()
        [b.extend(d) for d in data]
        dstfp.write(b[:fsize])
    
    
    def usage():
        print >> sys.stderr, '''%s - convert file to png image
      -e | --encode          specify encoding file 
      -d | --decode          specify decoding file
      -o | --outfile         stdout if not specified
      -h | --help            show (this) usage message
      -v | --verbose         set logging level to DEBUG [default is INFO]
    ''' % sys.argv[0]
    
    def main():
        try:
            opts, args = getopt.getopt(sys.argv[1:], 'e:d:o:hv',
                                       ['encode', 'decode', 'outfile', 
                                        'help', 'verbose'])
        except getopt.GetoptError, err:
            log.error(err)
            usage()
            sys.exit(2)
    
        isencode = False
        isdecode = False
        srcfp = None
        # 3.0: dstfp = sys.stdout.buffer?
        dstfp = os.fdopen(sys.stdout.fileno(), 'wb')
    
        for o, a in opts:
            if o in ("-h", "--help"):
                usage()
                sys.exit(0)
            elif o in ("-v", "--verbose"):
                log.setLevel(logging.DEBUG)
            elif o in ("-e", "--encode"):
                isencode = True
                srcfp = file(a, 'rb')
            elif o in ("-d", "--decode"):
                isdecode = True
                srcfp = file(a, 'rb')
            elif o in ("-o", "--outfile"):
                dstfp = file(a, 'wb')
    
        if not (isencode ^ isdecode):
            log.error("invalid action")
            usage()
            sys.exit(1)
    
        isencode and encode(srcfp, dstfp)
        isdecode and decode(srcfp, dstfp)
    
    
    if __name__ == "__main__":
        logging.basicConfig(level=logging.INFO,
                            format='%(asctime)s %(levelname)s %(message)s')
        main()
    

    PIL で bin2png

    ちょっと驚き... こちら blogger 然りでバイナリデータをブログに載せたい時って
    どうすれば良いやら。長いテキストとかであれば a2ps | enscript で PostScript
    にした後 ps2pdf とか。で PDF がアップロードできるか知らないし、やっぱイメー
    ジデータでしょう。

    と探すもステガノグラフィ (outguess steghide snowdrop) まで凝った話でもなく、
    サイズも大きくなるし a2png だって? と試すもそのまま a2ps の png 版だったり。
    sourceforge にあるも Java だったり...

    むーん libpng とか使って自作? とか思い始めたところ # 長い前置き
    Python Imaging Library (PIL) のハンドブック眺めてみたところ、ソレらしきメソ
    ッドが。でお試し
    $ python
    Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> fname = "patch-2.6.38.2.gz"
    >>> import os
    >>> os.stat(fname).st_size
    52847
    >>> f = open(fname)
    >>> b = bytearray()
    >>> b.extend(f.read())
    >>> len(b)
    52847
    >>> import Image
    >>> im = Image.new('L', (52847, 1))
    >>> im.putdata(b)
    >>> im.save("2.6.38.2.png")
    >>> (Ctrl-D)
    $ ls -l 2.6.38.2.png 
    -rw-r--r-- 1 chamaken chamaken 52921 2011-04-12 23:35 2.6.38.2.png
    PNG フォーマットとか全く知らないので new() のモードわからないし、最大約数を
    探すのも面倒がってサイズもおかしいど、もちろん可逆で
    $ python
    Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import Image
    >>> im = Image.open("2.6.38.2.png")
    >>> f = open("write.back", 'wb')
    >>> f.write(bytearray(im.getdata()))
    >>> f.close()
    >>> (Ctrl-d)
    $ cmp patch-2.6.38.2.gz write.back 
    $ 
    おどろいた。この 2.6.38.2.png を貼ると大変なことになりそうなので超てきとー
    いいかげんにパディングしたものを貼ってみるテスト

    2011年4月7日木曜日

    obs600 で 再度 debian squeeze - その 3 - で一段落

    お待ちかね。OBS600 側
    • CF 積んで
    • ETHER-0 に UTP ケーブル接続して
    • INIT ボタンをボールペンで押さえて
    電源投入。ちなみに手元にあるのは 8G の CF。root でログインした後
    1. パーティション分割 & ファイルシステム作成
    2. 8G を 6G / 2G に分割。冗長だけど全部
      # fdisk /dev/sda
      
      Command (m for help): p
      
      Disk /dev/sda: 8019 MB, 8019099648 bytes
      247 heads, 62 sectors/track, 1022 cylinders
      Units = cylinders of 15314 * 512 = 7840768 bytes
      
         Device Boot      Start         End      Blocks   Id  System
      
      Command (m for help): n
      Command action
         e   extended
         p   primary partition (1-4)
      p
      Partition number (1-4): 1
      First cylinder (1-1022, default 1):
      Using default value 1
      Last cylinder or +size or +sizeM or +sizeK (1-1022, default 1022): +6144M
      
      
      Command (m for help): n
      Command action
         e   extended
         p   primary partition (1-4)
      p
      Partition number (1-4): 2
      First cylinder (786-1022, default 786):
      Using default value 786
      Last cylinder or +size or +sizeM or +sizeK (786-1022, default 1022):
      Using default value 1022
      
      Command (m for help): p
      
      Disk /dev/sda: 8019 MB, 8019099648 bytes
      247 heads, 62 sectors/track, 1022 cylinders
      Units = cylinders of 15314 * 512 = 7840768 bytes
      
         Device Boot      Start         End      Blocks   Id  System
      /dev/sda1               1         785     6010714   83  Linux
      /dev/sda2             786        1022     1814709   83  Linux
      
      Command (m for help): w
      The partition table has been altered!
      
      Calling ioctl() to re-read partition table.
      sd 0:0:0:0: [sda] 15662304 512-byte hardware sectors: (8.01 GB/7.46 GiB)
      sd 0:0:0:0: [sda] Write Protect is off
      sd 0:0:0:0: [sda] Assuming drive cache: write through
       sda: sda1 sda2
      sd 0:0:0:0: [sda] 15662304 512-byte hardware sectors: (8.01 GB/7.46 GiB)
      sd 0:0:0:0: [sda] Write Protect is off
      sd 0:0:0:0: [sda] Assuming drive cache: write through
       sda: sda1 sda2
      Syncing disks.
      # mke2fs -j -b 4096 -L / /dev/sda1
      mke2fs 1.39 (29-May-2006)
      Filesystem label=/
      OS type: Linux
      Block size=4096 (log=2)
      Fragment size=4096 (log=2)
      752192 inodes, 1502678 blocks
      75133 blocks (5.00%) reserved for the super user
      First data block=0
      46 block groups
      32768 blocks per group, 32768 fragments per group
      16352 inodes per group
      Superblock backups stored on blocks:
              32768, 98304, 163840, 229376, 294912, 819200, 884736
      
      Writing inode tables: done
      Creating journal (32768 blocks): done
      Writing superblocks and filesystem accounting information: done
      
      This filesystem will be automatically checked every 28 mounts or
      180 days, whichever comes first.  Use tune2fs -c or -i to override.
      
    3. マウント & ファイル取得準備
    4. # mount /dev/sda1 /mnt
      kjournald starting.  Commit interval 5 seconds
      EXT3 FS on sda1, internal journal
      EXT3-fs: mounted filesystem with ordered data mode.
      # ip link ls eth0
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
      state UP qlen 1000
          link/ether 00:1a:88:0c3:12:bb brd ff:ff:ff:ff:ff:ff
          inet 192.168.253.254/24 brd 192.168.253.255 scope global eth0
      
      # ping -c 4 192.168.253.1
      PING 192.168.253.1 (192.168.253.1): 56 octets data
      64 octets from 192.168.253.1: icmp_seq=0 ttl=64 time=2.2 ms
      64 octets from 192.168.253.1: icmp_seq=1 ttl=64 time=0.3 ms
      64 octets from 192.168.253.1: icmp_seq=2 ttl=64 time=0.3 ms
      64 octets from 192.168.253.1: icmp_seq=3 ttl=64 time=0.3 ms
      
      --- 192.168.253.1 ping statistics ---
      4 packets transmitted, 4 packets received, 0% packet loss
      round-trip min/avg/max = 0.3/0.7/2.2 ms
      
    5. 開発機側のファイルツリーをごっそり取得
    6. (長いコマンドライン)
      # ssh chamaken@192.168.253.1 \
      > "cd ~/obs600/rootfs && tar -cp --numeric-owner -f - *" \
      > | tar -xpv --numeric-owner -f - -C /mnt
      The authenticity of host '192.168.253.1 (192.168.253.1)' can't be established.
      RSA key fingerprint is d1:72:98:8b:42:11:e6:a6:7b:c8:6f:8b:95:ba:a3:a8.
      Are you sure you want to continue connecting (yes/no)? yes
      Warning: Permanently added '192.168.253.1' (RSA) to the list of known hosts.
      Password:
      ...
      var/cache/debconf/
      var/spool/
      
    7. チルっと
    8. # chroot /mnt
      I have no name!@ssd-linux:/# ls -1
      bin
      boot
      debootstrap
      dev
      etc
      home
      lib
      lib64
      lost+found
      mnt
      proc
      sbin
      selinux
      sys
      tmp
      usr
      var
      I have no name!@ssd-linux:/# cd /debootstrap
      I have no name!@ssd-linux:/debootstrap# ./debootstrap --second-stage
      I: Installing core packages...
      ...
      I: Base system installed successfully.
      I have no name!@ssd-linux:/debootstrap#
      
    9. /uImage.initrd-cfboot の作成
    10. I have no name!@ssd-linux:/debootstrap# cd
      I have no name!@ssd-linux:~# ls -1
      linux-image-2.6.32_0.91_powerpc.deb
      obs600.dtb
      vmlinux.bin.gz
      
      いろいろ叱られるし、長いけど
      I have no name!@ssd-linux:~# dpkg -i linux-image-2.6.32_0.91_powerpc.deb
      Selecting previously deselected package linux-image-2.6.32.
      (Reading database ... 9174 files and directories currently installed.)
      Unpacking linux-image-2.6.32 (from linux-image-2.6.32_0.91_powerpc.deb) ...
      Done.
      Setting up linux-image-2.6.32 (0.91) ...
      
       Hmm. There is a symbolic link /lib/modules/2.6.32/build
       However, I can not read it: No such file or directory
       Therefore, I am deleting /lib/modules/2.6.32/build
      
      
       Hmm. The package shipped with a symbolic link /lib/modules/2.6.32/source
       However, I can not read the target: No such file or directory
       Therefore, I am deleting /lib/modules/2.6.32/source
      
      Running depmod.
      Examining /etc/kernel/postinst.d.
      run-parts: executing /etc/kernel/postinst.d/initramfs-tools 2.6.32
      /boot/vmlinux-2.6.32
      update-initramfs: Generating /boot/initrd.img-2.6.32
      df: Warning: cannot read table of mounted file systems: No such file
      or directory
      warning: can't open /etc/mtab: No such file or directory
      warning: can't open /etc/mtab: No such file or directory
      I have no name!@ssd-linux:~#
      
      また長いコマンドライン。くどいけど参照
      • $SSDSRC/usr/src/contrib/debootstrap/post-debootstrap
      • $SSDSRC/usr/src/contrib/developers/kimura/lenny_based_firmware/uimage/create_uImage.sh
      I have no name!@ssd-linux:~# mkimage -n "original.$(date +'%FT%T')" \
      > -A ppc -O linux -T multi -C gzip \
      > -d vmlinux.bin.gz:/boot/initrd.img-2.6.32:obs600.dtb \
      > /uImage.initrd-cfboot
      Image Name:   original.2011-04-01T12:34:56
      Created:      Tue Apr  1 12:34:56 2011
      Image Type:   PowerPC Linux Multi-File Image (gzip compressed)
      Data Size:    3847277 Bytes = 3757.11 kB = 3.67 MB
      Load Address: 00000000
      Entry Point:  00000000
      Contents:
         Image 0: 1925764 Bytes = 1880.63 kB = 1.84 MB
         Image 1: 1913443 Bytes = 1868.60 kB = 1.82 MB
         Image 2: 8053 Bytes = 7.86 kB = 0.01 MB
      I have no name!@ssd-linux:~#
      
    11. 普通の? 必須修正
    12. I have no name!@ssd-linux:~# passwd
      Enter new UNIX password:
      Retype new UNIX password:
      passwd: password updated successfully
      I have no name!@ssd-linux:~# cd /etc
      I have no name!@ssd-linux:/etc# cp inittab inittab.dpkg-dist
      I have no name!@ssd-linux:/etc# vi inittab
      ...
      I have no name!@ssd-linux:/etc# diff -uw inittab.dpkg-dist inittab
      --- inittab.dpkg-dist   2011-03-31 12:34:56.000000000 +0000
      +++ inittab     2011-03-31 12:34:56.000000000 +0000
      @@ -51,16 +51,16 @@
       # Note that on most Debian systems tty7 is used by the X Window System,
       # so if you want to add more getty's go ahead but skip tty7 if you run X.
       #
      -1:2345:respawn:/sbin/getty 38400 tty1
      -2:23:respawn:/sbin/getty 38400 tty2
      -3:23:respawn:/sbin/getty 38400 tty3
      -4:23:respawn:/sbin/getty 38400 tty4
      -5:23:respawn:/sbin/getty 38400 tty5
      -6:23:respawn:/sbin/getty 38400 tty6
      +# 1:2345:respawn:/sbin/getty 38400 tty1
      +# 2:23:respawn:/sbin/getty 38400 tty2
      +# 3:23:respawn:/sbin/getty 38400 tty3
      +# 4:23:respawn:/sbin/getty 38400 tty4
      +# 5:23:respawn:/sbin/getty 38400 tty5
      +# 6:23:respawn:/sbin/getty 38400 tty6
      
       # Example how to put a getty on a serial line (for a terminal)
       #
      -#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
      +T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100
       #T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
      
       # Example how to put a getty on a modem line.
      I have no name!@ssd-linux:/etc#
      
      そのほか /etc/hostname/etc/network/interfaces など
      必要に応じて作成、変更 - in debian's way で

    13. オリジナルツールのコピー
    14. 後でやっつけパッケージ作るけど、とり急ぎ
      I have no name!@ssd-linux:/etc# exit
      # cd /usr/sbin
      # cp flashcfg runled pshd /mnt/usr/sbin/
      
    15. CF ブートとしてリブート
    16. # flashcfg -h
      usage: flashcfg                 Show this.
             flashcfg -b              Show current boot setting
             flashcfg -c rootdev      Change root file system [initrd|cf|sda-sdd[1-8]]
                                      initrd       - Boot from FlashROM, / on Ramdisk
                                      sda-sdd[1-8] - Boot from FlashROM, / on CF
                                      cf           - Boot from CF,       / on CF
             flashcfg -f boot_image   Load boot image to flash
             flashcfg -s list_file    Save files to Parameter area
             flashcfg -S list_file    Save files to User area
             flashcfg -x              Restore files from Parameter area
             flashcfg -X              Restore files from User area
             flashcfg -d              Delete saved files from Parameter area
             flashcfg -D              Delete saved files from User area
             flashcfg -E env_file     Save params to U-Boot Environment area
             flashcfg -L env_file     Load params from U-Boot Environment area
             flashcfg -h              Show this.
      # flashcfg -c cf
      # shutdown -r now
      
    でけた?

    2011年4月6日水曜日

    obs600 で 再度 debian squeeze - その 2

    また引用。
    OpenBlockS 600D - 開発環境の構築
    クロス開発 (VMware等のx86環境上での開発)
    1. ベースとなる環境の用意
    2. タイトル通り squeeze (amd64) で

    3. emdebian のリポジトリを追加します
    4. sources.list の準備
      /etc/apt/sources.list.d に以下 emdebian.list というファイルを追加
      # cat /etc/apt/sources.list.d/emdebian.list
      deb     http://www.emdebian.org/debian/ squeeze main
      deb-src http://www.emdebian.org/debian/ squeeze main
      
      アップデート
      $ sudo aptitude update
      
      キーリングを追加
      $ sudo aptitude install emdebian-archive-keyring
      
    5. 必要なパッケージを追加します
    6. $ sudo aptitude install \
      > build-essential u-boot libc6-powerpc-cross \
      > libc6-dev-powerpc-cross binutils-powerpc-linux-gnu gcc-4.4-powerpc-linux-gnu \
      > g++-4.4-powerpc-linux-gnu \
      > autoconf dpkg-cross linux-headers-2.6.32-5-common linux-source-2.6.32 \
      > kernel-package libncurses5-dev
      
      最後の二行は今後のモロモロのために

    7. カーネルのソースコードを展開します
    8. ありがたいことに SSDLinux のパッチもあるので上記通り linux-source-2.6.32 で。

    9. 開発用ディレクトリの作成と SSD/Linux のソース取得、展開
    10. テンポラリディレクトリ作成
      $ mkdir -p $HOME/obs600/tmp
      
      src.tgz の取得
      $ wget -nd -N -P $HOME/obs600/tmp \
      > http://ftp.plathome.co.jp/pub/ssdlinux/0.5-LATEST/source/src.tgz
      
      各種展開
      $ cd $HOME/obs600
      $ tar xzf tmp/src.tgz -C tmp
      $ tar xjf /usr/src/linux-source-2.6.32.tar.bz2 -C .
      
    11. カーネルパッケージ作成
    12. カーネルパッチあて
      SSD/Linux のソース usr/src/mkdist/kernel/2.6.32/patches/ に各種パッチあり
      $ cd linux-source-2.6.32
      $ for i in ../tmp/usr/src/mkdist/kernel/2.6.32/patches/*.patch; do
      > patch -p1 $i
      > done
      ...
      patching file Makefile
      Reversed (or previously applied) patch detected!  Assume -R? [n]
      Apply anyway? [n]
      (ここはエンター。デフォルトの n で OK)
      Skipping patch.
      4 out of 4 hunks ignored -- saving rejects to file Makefile.rej
      patching file scripts/Makefile.modinst
      
      ごめんなさい - scripts.patch
      +ifdef NOGZIP
             cmd_modules_install = mkdir -p $(2); cp $@ $(2) ;
      $(mod_strip_cmd) $(2)/$(notdir $@)
      +else
      +      cmd_modules_install = mkdir -p $(2); cp $@ $(2) ;
      $(mod_strip_cmd) $(2)/$(notdir $@) ;gzip -9 $(2)/$(notdir $@)
      +endif
      
      なので make 時に -D NOGZIP する

      .config などのコピー
      ワーキングディレクトリは $HOME/obs600/linux-source-2.6.32 のままで
      $ cp ../tmp/usr/src/mkdist/kernel/2.6.32/dot.config.powerpc-obs600 dot.config
      $ cp dot.config .config
      $ cp ../tmp/usr/src/mkdist/kernel/2.6.32/obs600.dts arch/powerpc/boot/dt
      $ cp ../tmp/usr/src/mkdist/kernel/2.6.32/obs600.dts arch/powerpc/boot/dts/
      
      menuconfig
      $ make-kpkg -j4 --arch powerpc --config menuconfig configure
      
      menuconfig はお好みで gconfig とか。DRBD 使ってみるので
      • Device Drivers ---> Connector を M に
      • Device Drivers ---> Block Devices ---> DRBD も M に
      その他お好みで。個人的には cgroup と namespace veth など。diff 取ると
      $ diff -uw dot.config .config
      +CONFIG_CONNECTOR=m
      +CONFIG_BLK_DEV_DRBD=m
      
      といったあたり。削除されてる
      -CONFIG_UNION_FS=y
      http://download.filesystems.org/unionfs/unionfs-2.x/
      あたりからパッチ持ってきてあてる必要あり。でも CF ブートなので割愛。

      kernel_image
      $ MAKEFLAGS="NOGZIP=1" make-kpkg -j4 --rootcmd=fakeroot --arch=powerpc \
      > --revision 0.91 --initrd kernel_image
      
    13. その他 uImage に必要なもの
    14. dtb
      参照:
      • $SSDSRC/usr/src/contrib/debootstrap/post-debootstrap
      • $SSDSRC/usr/src/contrib/developers/kimura/lenny_based_firmware/uimage/create_uImage.sh
      $ make ARCH=powerpc obs600.dtb
      /home/chamaken/obs600/linux-source-2.6.32/scripts/dtc/dtc -O dtb -o
      arch/powerpc/boot/obs600.dtb -b 0 -p 1024
      /home/chamaken/obs600/linux-source-2.6.32/arch/powerpc/boot/dts/obs600.dts
      DTC: dts->dtb  on file
      "/home/chamaken/obs600/linux-source-2.6.32/arch/powerpc/boot/dts/obs600.dts"
      $ cp arch/powerpc/boot/obs600.dtb ../
      
      vmlinux.bin.gz
      $ powerpc-linux-gnu-objcopy -O binary vmlinux ../vmlinux.bin
      $ cd ..
      $ gzip vmlinux.bin
      $ ls -1
      linux-image-2.6.32_0.91_powerpc.deb
      linux-source-2.6.32
      obs600.dtb
      tmp
      vmlinux.bin.gz
      
      すっごい長くなった上に番外。
      ここまでやっておくと次回 obs600 側になるので

    15. (何と言えばよいのか) 開発機側で OBS600 バイナリのファイルツリー準備
    16. include のパッケージは最低限。お好みで... drbb8-utils も
      $ su
      # debootstrap --foreign --arch=powerpc \
      > --include "ssh less u-boot initramfs-tools" \
      > squeeze rootfs http://ftp.jp.debian.org/debian
      I: Retrieving Release
      I: Retrieving Packages
      I: Validating Packages
      ...
      I: Extracting xz-utils...
      I: Extracting zlib1g...
      # ls -1
      linux-image-2.6.32_0.91_powerpc.deb
      linux-source-2.6.32
      obs600.dtb
      rootfs
      tmp
      vmlinux.bin.gz
      # cp linux-image-2.6.32_0.91_powerpc.deb obs600.dtb vmlinux.bin.gz rootfs/root/
      # chmod 0755 rootfs/root
      
      最後の chmod 忘れずに

    2011年4月5日火曜日

    obs600 で 再度 debian squeeze - その 1

    まずはおかしくなった時の準備。tftp サーバを適当な debian マシンにインストールしておく
    ファームウェアアップデートを実行したら起動しなくなりました。どうすれば復旧できますか。
    からの引用

    Q. ファームウェアアップデートを実行したら起動しなくなりました。どうすれば復旧できますか。
    A. TFTP サーバを利用したファームウェアのアップデートを行うことで復旧できます。
    1. パッケージのインストール
    2. $ sudo apt-get install tftpd-hpa (ディレクトリはデフォルトの /srv/tftp)
      
      Starting HPA's tftpd: in.tftpdinvoke-rc.d: initscript tftpd-hpa,
      action "start" failed.
      dpkg: error processing tftpd-hpa (--configure):
       subprocess installed post-installation script returned error exit status 71
      configured to not write apport reports
                                            Errors were encountered while processing:
       tftpd-hpa
      E: Sub-process /usr/bin/dpkg returned an error code (1)
      IPv6 無効にしていると上記エラー。/var/log/daemon.log を眺めると
      Apr  5 21:06:29 devobs600 in.tftpd[16485]: cannot open IPv6 socket,
      disable IPv6: Address family not supported by protocol
      Apr  5 21:06:29 devobs600 in.tftpd[16485]: Cannot set nonblock flag on
      socket: Bad file descriptor
      なんて出力があるので /etc/default/tftpd-hpa を変更
      # diff -uw tftpd-hpa.dpkg-dist tftpd-hpa
      --- tftpd-hpa.dpkg-dist        2011-04-05 08:09:46.000000000 +0900
      +++ tftpd-hpa                  2011-04-05 08:09:56.000000000 +0900
      @@ -3,4 +3,4 @@
       TFTP_USERNAME="tftp"
       TFTP_DIRECTORY="/srv/tftp"
       TFTP_ADDRESS="0.0.0.0:69"
      -TFTP_OPTIONS="--secure"
      +TFTP_OPTIONS="--secure -4"
    3. ファームウェアをダウンロードしておき TFTP サーバ側で指定した場所におきます。
    4. TFTP サーバのディレクトリに置く
      $ su
      # wget -nd -N -P /srv/tftp \
      > http://ftp.plathome.co.jp/pub/OBS600/0.5-LATEST/powerpc-obs600/installation/uImage.initrd
    5. ETHER-0 と PC を添付のクロス・ケーブル (緑色) で接続します。
    6. アドレス追加。ハブやスイッチ介しても同じ L2 ドメインであればクロスケーブルじゃなくてもOK
      # ip addr ls eth0
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
      state UP qlen 1000
          link/ether 00:ed:cb:a9:87:65 brd ff:ff:ff:ff:ff:ff
          inet 10.1.2.3/16 brd 10.1.255.255 scope global eth0
      # ip addr add 192.168.253.1/24 dev eth0
      # ip addr ls eth0
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
      state UP qlen 1000
          link/ether 00:ed:cb:a9:87:65 brd ff:ff:ff:ff:ff:ff
          inet 10.1.2.3/16 brd 10.1.255.255 scope global eth0
          inet 192.168.253.1/24 scope global eth0
      
    7. 本体の ディップ・スイッチ 2 を ON にします。

    8. 電源を入れます。
    9. 待つことしばし

    10. ファームウェアのアップデートが完了しますと本体の緑色の LED が点滅します。

    11. 電源を抜き、ディップ・スイッチ 2 を OFF にします。

    12. 追記 - INIT ボタンを押しながら電源を入れる
    13. いや、CF 起動でおかしな状態にして数日放置。で tftp ブートでイメージ読み込んだ後、度々忘れるので...

    2011年3月30日水曜日

    softdog / CONFIG_WATCHDOG_NOWAYOUT

    いつも唐突。
    Documentation/watchdog/src/watchdog-simple.c の抜粋
    int fd = open("/dev/watchdog", O_WRONLY);
    while (1) {
    ret = write(fd, "\0", 1);
    if (ret != 1) {
    ret = -1;
    break;
    }
    ret = fsync(fd);
    if (ret)
    break;
    sleep(10);
    }
    close(fd);
    定期的に書き込みがあればカーネルが大丈夫、問題ないよ。と判断。書き込みがないと...リブート。じゃクローズは? が次

    Documentation/watchdog/watchdog-api.txt の抜粋意訳

    モジュールパラメタ nowayout (CONFIG_WATCHDOG_NOWAYOUT)
    "Magic Close" がサポートされていなければデバイスを close すると watchdog も (何もせず) 終了。watchdog デーモンにバグがあってクラッシュした場合なんか考えるとちょっとマズい。この挙動のためいくつかのドライバでは "Disable watchdog shutdown on close", CONFIG_WATCHDOG_NOWAYOUT
    というオプション設定ができる。これを Y としてコンパイルすると一度 watchdog が開始した後に watchdog を無効にする方法がなくなる。つまりは watchdog デーモンがクラッシュするとシステムが指定のタイムアウト後にリブートする

    Magic Close
    ドライバが Magic Close をサポートしていると close 直前に特定の文字 'V' が /dev/watchdog に送られないと (書き込まれないと) watchdog が無効にならない。ユーザスペースのデーモンが、この特定の文字を送らずに close するとドライバはデーモンが watchdog を無効にする前に亡くなったと見なす。で、時間内に再度 open しないとリブート。softdog も
    if (c == 'V')
    expect_close = 42;
    ...
    static long softdog_ioctl(struct file *file, unsigned int cmd,
    unsigned long arg)
    ...
    static const struct watchdog_info ident = {
    .options = WDIOF_SETTIMEOUT |
    WDIOF_KEEPALIVEPING |
    WDIOF_MAGICCLOSE,
    ...
    なんてあったりする

    ha.cf のサンプルコメントから
    ソフトウェア watchdog を使っているならモジュールロードのパラメタに nowayout=0 あるいは CONFIG_WATCHDOG_NOWAYOUT を無効にしてコンパイルするんじゃないかな。さもないと heartbeat をマトモに終了させたとしてもリブートしてしまうって挙動はお望みじゃないと思う

    うーん... heartbeat の watchdog か、別立て watchdog デーモンか...

    2011年3月28日月曜日

    TIPS: squeeze on raw format KVM

    さっき作ったイメージ drbd1.img は最初に / 用の sda1 次が何も手を加えていない sda2。最後が swap の sda3。これをホスト側で見るには qcow2 の場合 nbd として扱えるらしけど -f raw でイメージを作成したので...要 root

    # file drbd1.img 
    drbd1.img: x86 boot sector; partition 1: ID=0x83, active, starthead 32, startsector 2048, 11716608 sectors; partition 2: ID=0x83, starthead 115, startsector 11718656, 3905536 sectors; partition 3: ID=0x82, starthead 143, startsector 15624192, 1150976 sectors, code offset 0x63
    # losetup -o $((512 * 2048)) /dev/loop1 drbd1.img
    # mkdir mnt_drbd1
    # mount /dev/loop1 mnt_drbd1/
    # ls mnt_drbd1/
    bin boot dev etc home initrd.img lib lib32 lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var vmlinuz
    # chroot mnt_drbd1/
    root@parent:/# ls
    bin boot dev etc home initrd.img lib lib32 lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var vmlinuz
    root@parent:/# cat /etc/hostname
    drbd1
    root@parent:/# exit
    exit
    # umount mnt_drbd1
    # losetup -d /dev/loop1
    とまぁ、ホスト側でも操作可能。なので /etc/inittab 書き換え忘れたとか、/etc/default/grub 書き換えたけど update-grub 忘れたとかも後になってでもできる

    他ネットワーク周りは...現況は tap 使うが良さげ。ホスト側で適当にブリッジ作っておいて...毎度手は面倒なので /etc/network/interface に

    auto br0
    iface br0 inet static
    address 192.168.1.254
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.1.255

    bridge_ports none
    bridge_fd 0
    bridge_stp off
    とか書いといて、KVM (に限らず、仮想ゲストマシン全て) 最初のブリッジに足のばすとすると /etc/kvm/kvm-ifup はこんな感じ
    #! /bin/sh
    BRCTL=/usr/sbin/brctl

    uplinks=$(ip link ls | awk -F: '/^[1-9].*UP> / { print $2; }')
    for switch in $uplinks; do
    if [ -d /sys/class/net/$switch/bridge/. ]; then
    $BRCTL addif $switch $1
    break
    fi
    done

    ip link set $1 up
    でホスト側で isc-dhcp-server を動かすとゆー... 面倒だね

    ターミナルで kvm, debian squeeze

    obs600 休憩。間違いもあるので、後日直すコト > 自分

    で、唐突めいているけど、あちこち調べながら X なしで squeeze を KVM にてインストールする方法。あちこち調べたのは良いけど、ポロポロ忘れるので...

    目的としては DRBD や heartbeat 試したく lxc 使おうとしたけど、今々は lxc 上で DRBD 動かず。ちょっと挑戦した けど、8.4 で connector 止めて genetlink 使う予定だそうなので、素直に? 挫折、待たせてもらうことに。d-i をイジる手もあるそうだけど、素の netinst.iso で何度か試してみて忘れがちなコト
    • 真っ黒画面でスペース & linux test
    • /etc/default/grub の編集 & update-grub
    • /etc/inittab の編集
    イメージの作成
    $ kvm-img create -f raw drbd1.img 8G
    Formatting 'drbd1.img', fmt=raw size=8589934592
    $ ls
    debian-6.0.0-amd64-netinst.iso drbd1.img

    -f qcow2 が正統? なのだろうけど、後々ホスト側からイジるにあたって
    kvm-nbd とか面倒なので...で起動
    $ kvm -cdrom debian-6.0.0-amd64-netinst.iso -hda drbd1.img -boot d -curses
    真っ黒画面の真ん中に
        640x480
    で、何も表示されないけどスペース一回押した後に (ここ何押下するかよく忘れる)
        linux text
    とすると...
                               Welcome to Debian GNU/Linux!                                F1


    This is a Debian 6.0 (squeeze) installation CD-ROM.
    It was built 20110205-14:31; d-i 20110106+b1.

    HELP INDEX

    KEY TOPIC

    <F1> This page, the help index.
    <F2> Prerequisites for installing Debian.
    <F3> Boot methods for special ways of using this CD-ROM
    <F4> Additional boot methods; rescue mode.
    <F5> Special boot parameters, overview.
    <F6> Special boot parameters for special machines.
    <F7> Special boot parameters for selected disk controllers.
    <F8> Special boot parameters for the install system.
    <F9> How to get help.
    <F10> Copyrights and warranties.



    Press F2 through F10 for details, or ENTER to boot:
    こんな画面。ここで F8
                SPECIAL BOOT PARAMETERS - INSTALLATION SYSTEM                                 F8


    You can use the following boot parameters at the boot: prompt,
    in combination with the boot method (see <F3>). These parameters
    control how the installer works.

    RESULT PARAMETER
    Disable framebuffer vga=normal fb=false
    Don't start PCMCIA hw-detect/start_pcmcia=false
    Force static network config netcfg/disable_dhcp=true
    Set keyboard map bootkbd=es
    Select the kde or xfce desktops desktop=kde

    Accessibility options (last 2 options not available for all images):
    Use high contrast theme theme=dark
    Use Braille tty brltty=driver,device,texttable
    Use Speakup speakup.synth=driver


    For example:
    boot: install vga=normal fb=false

    Press F1 for the help index, or ENTER to boot:
    For example そのまま
        install vga=normal fb=false
    で進む。イメージファイル名の通り DRBD を試したかったのでパーティションは 6G を / に 2G は何もせず残りを swap として。Software Selection では Standard と SSH。GRUB のインストールまで終ってリブートするから CD 外してね。になったところ
                   [!!] Finish the installation

    Installation complete
    Installation is complete, so it is time to boot into your new system.
    Make sure to remove the installation media (CD-ROM, floppies), so
    that you boot into the new system rather than restarting the
    installation.

    <Go Back> <Continue>
    で Go Back。Execute Shell を選択して、ちょっと面倒だけど
    BusyBox v1.17.1 (Debian 1:1.17.1-8) built-in shell (ash)
    Enter 'help' for a list of built-in commands.

    ~ # mount
    rootfs on / type rootfs (rw)
    none on /proc type proc (rw,relatime)
    none on /sys type sysfs (rw,relatime)
    tmpfs on /dev type tmpfs (rw,relatime,mode=755)
    none on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000)
    none on /sys/kernel/debug type debugfs (rw,relatime)
    /dev/sda1 on /target type ext3 (rw,relatime,errors=remount-ro,data=ordered)
    /dev/sda1 on /dev/.static/dev type ext3 (rw,relatime,errors=remount-ro,data=orde
    red)
    tmpfs on /target/dev type tmpfs (rw,relatime,mode=755)
    ~ # chroot /target
    # cd /etc/default
    # cp grub grub.dpkg-dist
    # vi grub
    ....
    # diff -uw grub.dpkg-dist grub
    --- grub.dpkg-dist 2011-03-28 11:49:36.000000000 +0900
    +++ grub 2011-03-28 11:45:39.000000000 +0900
    @@ -4,8 +4,8 @@
    GRUB_DEFAULT=0
    GRUB_TIMEOUT=5
    GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
    -GRUB_CMDLINE_LINUX_DEFAULT="quiet"
    -GRUB_CMDLINE_LINUX=""
    +GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8r"
    +GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop
    =1"

    # Uncomment to enable BadRAM filtering, modify to suit your needs
    # This works with Linux (no patch required) and with any kernel that obtains
    @@ -13,7 +13,7 @@
    #GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

    # Uncomment to disable graphical terminal (grub-pc only)
    -#GRUB_TERMINAL=console
    +GRUB_TERMINAL="serial console"

    # The resolution used on graphical terminal
    # note that you can use only modes which your graphic card supports via VBE
    # update-grub
    Generating grub.cfg ...
    Found linux image: /boot/vmlinuz-2.6.32-5-amd64
    Found initrd image: /boot/initrd.img-2.6.32-5-amd64
    done
    もう一つ /etc/inittab も

    # cd /etc
    # cp inittab inittab.dpkg-dist
    # vi inittab
    ...

    # diff -uw inittab.dpkg-dist inittab | head
    --- inittab.dpkg-dist 2011-03-28 11:52:02.000000000 +0900
    +++ inittab 2011-03-28 11:53:16.000000000 +0900
    @@ -52,15 +52,15 @@
    # so if you want to add more getty's go ahead but skip tty7 if you run X.
    #
    1:2345:respawn:/sbin/getty 38400 tty1
    -2:23:respawn:/sbin/getty 38400 tty2
    -3:23:respawn:/sbin/getty 38400 tty3
    -4:23:respawn:/sbin/getty 38400 tty4
    -5:23:respawn:/sbin/getty 38400 tty5
    -6:23:respawn:/sbin/getty 38400 tty6
    +#2:23:respawn:/sbin/getty 38400 tty2
    +#3:23:respawn:/sbin/getty 38400 tty3
    +#4:23:respawn:/sbin/getty 38400 tty4
    +#5:23:respawn:/sbin/getty 38400 tty5
    +#6:23:respawn:/sbin/getty 38400 tty6

    # Example how to put a getty on a serial line (for a terminal)
    #
    -#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
    +T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100
    #T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

    # Example how to put a getty on a modem line.
    # sync
    # exit
    ~ # sync
    ~ # exit
    でメニューの Finish the Inistallation & Continue... で再起動しないので、他コンソールから kill して再起動。今度は -curses じゃなくて -nographic で
    kvm -nographic drbd1.img
    でクライアントとして使う分にはソレナリ。