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