d.sunnyone.org
sunnyone.org

ページ

2012-03-31

最近読んだ本

最近の興味の方向性ってなんだろうと思ってAmazonで技術書の購入履歴を抜き出してみた。
新しい順。
  • 要点解説 IPルーティング入門 / 久米原 栄
  • Cisco WAN 実践ケーススタディ  / 土屋 師子生, et al
  • RailsによるアジャイルWebアプリケーション開発 第4版 / Sam Ruby, et al
  • 作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 / 金 凡峻
  • レガシーコード改善ガイド (Object Oriented SELECTION)  / マイケル・C・フェザーズ, et al
  • Apacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)  / 小山 浩之
  • PostgreSQL徹底入門 第3版 / 笠原 辰仁, et al
  • 新版 プロとして恥ずかしくないWEBデザインの大原則 (インプレスムック エムディエヌ・ムック)  / MdN編集部
  • 継続的インテグレーション入門 開発プロセスを自動化する47の作法 / ポール・M・デュバル, et al
  • SpringによるWebアプリケーションスーパーサンプル 第2版  / 株式会社クロノス 阪田 浩一
  • 開発のプロが教える標準Django完全解説―Webアプリケーションフレームワーク (デベロッパー・ツール・シリーズ)  / 増田 泰, et al
PostgreSQLが出てきたあたりからおかしくなってきたことが読み取れる…。
一部読んでないものがあるけど(レガシーコード~読み忘れてた)、だいたいよかったので、読みたい方向性のものがあればおすすめ。

2012-03-12

SheevaPlug復旧の巻(debootstrapによる環境構築とSDカード向け設定)

前エントリの通り、SheevaPlugの/だったSDカードが壊れてしまったので、構築しなおすことにする(muninで監視情報を書き込み続けたらそれは壊れるよな、と思いつつ同じ環境を作る)

<準備>
・armelなDebianの入ったデバイス
・SDカードリーダ/ライタ
・SDカード(以下では16GBを利用)

1. パーティション作成
普通にパーティションを切る(以下では/dev/sdbにつながったと想定)
# fdisk /dev/sdb
 以下のように作った。
/dev/sdb1 100M  (/boot用)
/dev/sdb2 10G  (/用)
/dev/sdb3 1G  (swap用)
/dev/sdb4 残り (/home用)

2. ファイルシステム作成
# mkfs.ext3 /dev/sdb1
# mkfs.ext4 -O ^has_journal /dev/sdb2
# mkswap /dev/sdb3
# mkfs.ext4 -O ^has_journal /dev/sdb4
 どうやらSDカードではext4が速いらしいので、/boot以外に採用。
 そしてジャーナルなしが速いらしいので、ジャーナルは無効化する。
電源断に備えても、書き込みが増えて壊れては意味が無いしね。
 /bootはU-Bootが読めなかったら困るので、ext3のままにしておく。
# tune2fs -l /dev/sdb1 | grep features
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype sparse_super
# tune2fs -l /dev/sdb2 | grep features
Filesystem features:      ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
 has_journalがなくなっていることを確認。

3.  debootstrap
debootstrapで初期環境を作る。同一アーキテクチャなので、--foreign と--second-stageに分割する必要はない。
# mount /dev/sdb2 /mnt
# debootstrap --arch=armel --include=linux-image-2.6-kirkwood,module-init-tools,udev,netbase,net-tools,ifupdown,iproute,whiptail,vim-basic squeeze /mnt http://ftp.jp.debian.org/debian/
4. 諸設定
# cd /mnt 
(ファイルシステム設定)

# vi etc/fstab

~~~
#              
proc            /proc           proc    defaults        0       0
/dev/mmcblk0p2 /               ext4    errors=remount-ro,commit=21600,noatime 0       1
/dev/mmcblk0p1 /boot           ext3    defaults        0       2
/dev/mmcblk0p3  none           swap    sw              0       0
/dev/mmcblk0p4 /home           ext4    defaults        0       2
tmpfs          /tmp tmpfs defaults 0 0
~~~
(ホスト名設定)
# echo myhost > etc/hostname
(ネットワーク設定)
# vi etc/network/interfaces
~~~
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
  address 192.168.1.100
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255
  gateway 192.168.1.254
  dns-nameservers 192.168.1.254
  dns-search localdomain.local
~~~
 (コンソール設定)
# vi etc/inittab
一部編集
~~~
##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
T0:2345:respawn:/sbin/getty -L ttyS0 115200 linux
~~~

てな感じ。

5. おまじない
/etcにあまり書かないようにする。
# ln -s /dev/null etc/blkid.tab
# ln -s /proc/mounts etc/mtab

作っているホストのNIC情報でeth0が固定されてしまうっぽいので、消しておく。
# echo > /etc/udev/rules.d/70-persistent-net.rules
あまり書かないように設定。
# vi etc/sysctl.conf
~~~追記~~~
vm.dirty_background_ratio = 30
vm.dirty_ratio = 60
vm.dirty_expire_centisecs = 500000
vm.dirty_writeback_centisecs = 600000
~~~
6. パスワード設定
# chroot /mnt /bin/bash
# passwd root
7. ブートイメージの作成
chrootの流れで。
# apt-get update
# apt-get install uboot-mkimage
# cd /boot
# mkimage -A arm -O linux -T kernel  -C none -a 0x00008000 -e 0x00008000 \
  -n Linux-2.6.32-5 -d vmlinuz-2.6.32-5-kirkwood uImage
# mkimage -A arm -O linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 \
  -n initramfs -d initrd.img-2.6.32-5-kirkwood uInitrd
8. リブート
終わったらいよいよSDカードを差してリブート。U-Bootのカウントダウンで止める。

9. U-Boot環境変数設定
printenvして、期待する値になっていなかったら、以下のようにセットしてしまう。

Marvell>> setenv bootargs_mmc 'console=ttyS0,115200 root=/dev/mmcblk0p2 rw'
Marvell>> setenv bootcmd_mmc 'mmcinit; ext2load mmc 0:1 0x01100000 /uInitrd; ext2load mmc 0:1 0x00800000 /uImage'
Marvell>> setenv bootcmd 'setenv bootargs $(bootargs_mmc); run bootcmd_mmc; bootm 0x00800000 0x01100000'
Marvell>> printenv
Marvell>> saveenv

終わったらbootする。

10. 起動後設定
# date
Thu Nov  5 21:59:39 UTC 1908
さすがにおかしすぎる・・・いったん設定する
# date 031100592012
dateコマンドでセットするときはmmddHHMMyyyyなんだよね。

あとはいつもの感じで設定。
(ロケール設定)
# apt-get install locales
# vi /etc/locale.gen
~~~
ja_JP.UTF-8 UTF-8
~~~
# locale-gen
(スタンダードパッケージをインストール)
# tasksel install standard
(タイムゾーン設定)
# dpkg-reconfigure tzdata
→Tokyo
あとはお好みでsudoを入れたり、openssh-serverを入れたりすれば使えるようになる。

【参考】
http://blog.bofh.it/debian/id_265
http://www.cyrius.com/debian/kirkwood/sheevaplug/install.html
http://d.hatena.ne.jp/yamanetoshi/20090114

Linuxのddで処理状況を定期的に出力する

SheevaPlug につないでいたSDカード(16GB)が壊れてしまったっぽいので、まずはddの丸ごとコピーで復旧を試みる(べつに再インストールしても良いのだが)

# dd if=/dev/sdb of=siva1.bin bs=4096 conv=sync,noerror
これだと進行状況が見えないが、LinuxのddはSIGUSR1をぶつければ終了時に出てくるアレが表示される。なので、whileで送り続ければ、一定間隔で状態を表示できる。
# while true; do sudo kill -USR1 [PID] ; sleep 10; done
しばらくの間10秒間ごとに進行状況を表示していたが・・・
dd: reading `/dev/sdb': Input/output error
1714494+126135 records in
1840629+0 records out
7539216384 bytes (7.5 GB) copied, 674.537 s, 11.2 MB/s
dd: reading `/dev/sdb': Input/output error
1714494+126136 records in
1840630+0 records out
7539220480 bytes (7.5 GB) copied, 674.537 s, 11.2 MB/s
dd: reading `/dev/sdb': Input/output error
1714494+126137 records in
1840631+0 records out
7539224576 bytes (7.5 GB) copied, 674.537 s, 11.2 MB/s

 ・・・(以下最後まで)
だめだー。



よく知らないARMデバイスのU-Boot環境変数を読む

U-Bootはブートローダ。x86では似たようなことを違うUIでBIOSが担うのであまりピンとこないが、SPARCを使ったことある人なら、OpenBootのプロンプトを思い浮かべてもらえばピンとくると思う。

U-Bootの設定情報を維持している、U-Bootの環境変数を見るには、U-Bootを実行している間にprintenvすれば表示できるのだが、シリアルにアクセスできないデバイスを持っている人もいるはず。そこで、ここではOS(Linux)上から見る方法を取り上げる。

【正攻法】
fw_printenvというコマンドがあるので、これを使う。
1. インストール
  # apt-get install uboot-envtools

2. 設定
どこからか機器依存なデバイス情報を拾ってきて、/etc/fw_env.configに書く。
以下、SheevaPlugの場合
 /dev/mtd0 0xa0000 0x20000 0x20000
ちなみに0xa0000でない場合もあるらしい。

3. 実行 
$ sudo fw_printenv
CASset=min
MALLOC_len=1
autoload=no
baudrate=115200

~~~
 簡単。

【邪道な方法】
アドレス情報がわからなかったり、ソフトをインストールできないデバイスを持っている人もいると思う。そういう場合でも、読むだけならできる。
 
1. mtdデバイスを探し出す
$ ls  /dev/mtd*
/dev/mtd0    /dev/mtd1    /dev/mtd2    /dev/mtdblock0  /dev/mtdblock2
/dev/mtd0ro  /dev/mtd1ro  /dev/mtd2ro  /dev/mtdblock1
 mtd0~mtd2があるようなので、mtd0でチャレンジ。

2. mtdデバイスの中身を吸い出す
$ dd if=/dev/mtd0 of=~/mtd0.bin

3. odで開始アドレスと終了アドレスを探し出す
$ od -Ax -c mtd0.bin | less
これで、「c   o   n   s」など、環境変数に設定されていそうな値を適当に入力して、値が入っている場所を探し出す。


終わりは\0が続いているだけなので簡単。

4. \0区切りで分割する
見ての通り、\0で区切られてASCII文字が格納されているだけなので、開始アドレス~終了アドレスのデータを取り出して、\0で分割して出力してあげれば終わり。
$ ruby -e 'ARGF.seek(0xa0004); buf=ARGF.read(0xc0000-0xa0004); puts buf.split(/\0/)' mtd0.bin
CASset=min
MALLOC_len=1
autoload=no
baudrate=115200
bootargs=console=ttyS

 ~~~

CRCがあるようなので、間違っても書こうとはしないこと。

2012-03-11

LinuxでAdvanced Format Technology (AFT) な3TB HDDのパーティションを切る

切ってしまったあとに、こういうことを気にしないといけないと気づいたが、partedがどうもよろしくやってくれたらしい。

<切り方>
# parted /dev/sdb mklabel gpt
# parted /dev/sdb mkpart primary 1 1026 ←partedのデフォルトは単位MB
# parted /dev/sdb mkpart primary 1026 17410
# parted /dev/sdb mkpart primary 17410 17411
# parted /dev/sdb mkpart primary 17411 17412
# parted /dev/sdb mkpart primary linux-swap 17412 18436
# parted /dev/sdb mkpart primary 18436 274436
# parted /dev/sdb mkpart primary 274436 -1s
Warning: You requested a partition from 274GB to 3001GB.                
The closest location we can manage is 274GB to 3001GB.
Is this still acceptable to you?
Yes/No? yes
 <確認>
# parted /dev/sdb "unit s" print
Model: WDC WD30 EZRX-00MMMB0 (scsi)
Disk /dev/sdb: 5860533168s
Sector size (logical/physical): 512B/512B  ←4096に見えているわけではなさそうだが・・・
Partition Table: gpt

Number  Start       End          Size         File system     Name     Flags
 1      2048s       2002943s     2000896s     ext3            primary      ←2048
スタートなのでOK(2048 % 8 = 0)
 2      2002944s    34002943s    32000000s    ext4            primary  ←2002944 % 8 = 0
 3      34002944s   34004991s    2048s                        primary       ←以下同様
 4      34004992s   34007039s    2048s                        primary
 5      34007040s   36007935s    2000896s     linux-swap(v1)  primary
 6      36007936s   536008703s   500000768s   ext4            primary
 7      536008704s  5860533134s  5324524431s  ext4            primary
 ちなみにpartedのバージョン(Debian/squeeze/armel):
$ dpkg -l parted | grep "^ii"
ii  parted                           2.3-5                        The GNU Parted disk partition resizing program

2012-02-26

Dynabook AZにUbuntu 11.10をインストール

だいぶ前になるが、Dynabook AZを買ってきてUbuntu 11.10をインストールしたので、手順を記しておく。

<準備するもの>
  • Dynabook AZ
  • USB メモリ
  • mini-USBケーブル
  • フラッシュ書き込みを行うためのUbuntu (x86) (Windowsでもいいらしい)

<手順>
1.  ダウンロード
イメージファイルを落とす
$ wget http://cdimage.ubuntu.com/releases/11.10/release/ubuntu-11.10-preinstalled-desktop-armel+ac100.bootimg
$ wget http://cdimage.ubuntu.com/releases/11.10/release/ubuntu-11.10-preinstalled-desktop-armel+ac100.tar.gz
http://cdimage.ubuntu.com/releases/11.10/release/MD5SUMS とmd5sumコマンドを実行して比較する。

 2. nvflashインストール
flashを読み書きするためのプログラム、nvflashをインストールする。

http://share.grandou.net/debian/nvflash/nvflash_20110628-2_all.deb をダウンロード(なぜかwgetできない)して、以下のコマンドを実行する。
# sudo dpkg -i nvflash_20110628-2_all.deb
udevの設定をうまいことやってくれるから、nvflashコマンドは一般ユーザでも実行できるようになるんだって。


3. 電源停止

電源が入っていたら止める。

4. メンテナンスモード起動
USBケーブルをホストPCとつなぎ、CtrlとESCボタンを押しながら電源を入れる。
これでLEDはつくがモニタには表示されない状態となる。

5. ブートローダをインストールする
以下のコマンドを実行する。
$ nvflash --bl /usr/lib/nvflash/fastboot.bin --sync
Nvflash started
rcm version 0X20001
System Information:
   chip name: t20
   chip id: 0x20 major: 1 minor: 2
   chip sku: 0x8
   chip uid: 0x123410c9415f1234
   macrovision: disabled
   hdcp: enabled
   sbk burned: false
   dk burned: false
   boot device: emmc
   operating mode: 3
   device config strap: 1
   device config fuse: 0
   sdram config strap: 1

downloading bootloader -- load address: 0x108000 entry point: 0x108000
sending file: /usr/lib/nvflash/fastboot.bin
| 940112/940112 bytes sent
/usr/lib/nvflash/fastboot.bin sent successfully
waiting for bootloader to initialize
bootloader downloaded successfully
6. パーティションテーブルと中身をバックアップ
$ nvflash -r --getpartitiontable part.txt
2,3,4,5,6,7,8,9,10,11,12,13,14があることを確認する。
$ nvflash -r --read 2 02_bootconfig.img
$ nvflash -r --read 3 03_partitiontable.img
$ nvflash -r --read 4 04_bootloader.img
$ nvflash -r --read 5 05_recorvery.img
$ nvflash -r --read 6 06_kernel.img
$ nvflash -r --read 7 07_mbr.img
$ nvflash -r --read 8 08_system.img
$ nvflash -r --read 9 09_cache.img
$ nvflash -r --read 10 10_misc.img
$ nvflash -r --read 12 12_data.img
$ nvflash -r --read 13 13.img
$ nvflash -r --read 14 14.img
13, 14が何かわからなかったがとりあえず存在しているのでバックアップする。

7. ブートイメージ書き込み
再度Ctrl+ESCを押しながら立ち上げなおして、以下を実行する。
$nvflash --bl /usr/lib/nvflash/fastboot.bin --sync
$nvflash -r --download 6 ubuntu-11.10-preinstalled-desktop-armel+ac100.bootimg
Nvflash started
[resume mode]
sending file: ubuntu-11.10-preinstalled-desktop-armel+ac100.bootimg
/ 8388608/8388608 bytes sent
ubuntu-11.10-preinstalled-desktop-armel+ac100.bootimg sent successfully
その後、一度電源を落とす。

8. tar.gz入りUSBメモリを挿入してブート
先ほどダウンロードしたtar.gzを何らかのUSBメモリのルートにコピーして、接続後、ブートする。

9. 書き込み
/dev/mmcblk0p7をdestroyしていいか聞かれるので、yを答える。

10. 初回起動
無事起動したら、言語だとか、セットアップ時に聞かれるようなことを答えてあげる。

11. Lubuntuの導入
標準だと重いので、Lubuntuにすることにする。
# apt-get install lubuntu-desktop
ports.ubuntu.comの回線のせいか通信がやたら遅く時間がかかった。

12. 日本語入力
試行錯誤したが、日本語入力は日本語localeにしても最初はできないので、
 # apt-get install ibus-anthy
とする。Ubuntuの日本語入力に詳しい某氏に助けていただいた。thx.


これで一通り使えるようになるはず。Flash pluginを入れられるらしいが、まだ入れていない。

参考:
https://wiki.ubuntu.com/ARM/TEGRA/AC100
http://d.hatena.ne.jp/S0R5/20111024/1319461443
http://blog.livedoor.jp/dupondroid/archives/6196989.html
http://www45.atwiki.jp/dynabookaz/pages/24.html
http://shanghai.at.webry.info/201112/article_1.html



Crossbowクイックスタート

OpenSolarisのCrossbowにおけるetherstubはbridgeだと思っていたが、どちらかというとインタフェースのようだと昨日知った。Linuxにおけるdummy と近いものだと理解した。

というわけで頭の中の絵を更新するとともに、図に表してみた。

dladm create-bridgeは「bridge0」を渡すと「dladm: invalid bridge name 'bridge0'」と言われる(OpenIndiana 151a)。数字はダメなのか。