ジャンル不定の日記です。

SheevaPlug届いてからの作業をまとめる

SheevaPlug届いてからやった作業をまとめとく。

大目的はNFSサーバー。

まず、シリアルコンソールでつないで作業。
SSHは標準で入ってたと思うから、ブートローダの編集作業以外はシリアルじゃなくても出来るかもしれない。
SSHでrootログイン試してないけど。
シリアルコンソールは、メイン機のUbuntuにscreenが最初から入ってたので、それを利用。

scrennは、
screen /dev/ttyUSB0 115200
こんな感じで。
参考にした先人のページだと、/dev/ttyUSB0ではなかったんで、人によって違うぽい。
母艦にUSBつけて出てきたデバイスで接続する。

ブートローダは、3秒待ちでkernel起動するので、なにかキーを押してキャンセルすると、
Marvell>>
というU-Bootのプロンプトになる。
もしすでにkernelが起動しちゃってたら、ログインしてrebootする必要があるが、
rootの初期パスワードはnosoup4uになってる。

U-Bootのコマンドはたくさんあるが、とりあえず、
コマンド
説明
?
コマンド一覧の表示
boot標準設定でkernel起動
reset
再起動
printenv環境変数確認
setenv環境変数設定
saveenv環境変数保存
辺りを使う。

U-Bootの書き換えをしている先人たちも多いようだが、
万が一トラブったら修復困難と思われるので、やらなかった。
今後も必要がなければやらない。
環境変数の保存も、シリアル関連とかミスったら修復困難になるんじゃないかと思うんで、あまり触らないことにする。

とりあえず、
printenv
で環境変数を確認して、メモ。
Marvell>> printenv
baudrate=115200
loads_echo=0
rootpath=/mnt/ARM_FS/
console=console=ttyS0,115200 mtdparts=nand_mtd:0xc0000@0(uboot)ro,0x1ff00000@0x100000(root)
CASset=min
MALLOC_len=1
ethprime=egiga0
bootargs_root=root=/dev/nfs rw
bootargs_end=:::DB88FXX81:eth0:none
image_name=uImage
standalone=fsload 0x2000000 $(image_name);setenv bootargs $(console) root=/dev/mtdblock0 rw ip=$(ipaddr):$(serverip)$(bootargs_end) $(mvPhoneConfig); bootm 0x2000000;
ethmtu=1500
mvPhoneConfig=mv_phone_config=dev0:fxs,dev1:fxs
mvNetConfig=mv_net_config=(00:11:88:0f:62:81,0:1:2:3),mtu=1500
usb0Mode=host
yuk_ethaddr=00:00:00:EE:51:81
nandEcc=1bit
netretry=no
rcvrip=169.254.100.100
loadaddr=0x02000000
autoload=no
ethact=egiga0
filesize=202588
fileaddr=2000000
netmask=255.255.255.0
ipaddr=10.4.50.4
serverip=10.4.50.5
tun_diag=yes
run_diag=no
bootargs=console=ttyS0,115200 mtdparts=nand_mtd:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw root=/dev/mtdblock1 rw ip=10.4.50.4:10.4.50.5:10.4.50.5:255.255.255.0:DB88FXX81:eth0:none
bootcmd=nand read.e 0x800000 0x100000 0x400000; bootm 0x800000
ethaddr=F0:AD:4E:00:BB:59
stdin=serial
stdout=serial
stderr=serial
mainlineLinux=no
enaMonExt=no
enaCpuStream=no
enaWrAllo=no
pexMode=RC
disL2Cache=no
setL2CacheWT=yes
disL2Prefetch=yes
enaICPref=yes
enaDCPref=yes
sata_dma_mode=yes
netbsd_en=no
vxworks_en=no
bootdelay=3
disaMvPnp=no
enaAutoRecovery=yes

Environment size: 1374/131068 bytes
こんな感じ。

bootコマンドやresetでkernelを起動。
上にも書いたが、rootの初期パスワードはnosoup4uになってる。
起動時にはエラーや警告もいくつか出るはず。
ログイン画面のあとにメッセージが出てきて
login:
が流されちゃうが、Enterすればまた表示される。

うちはルーター使ってるから、ルーターがDHCP鯖になってるんで、
IPアドレスはDHCPで設定。
SheevaPlugも最初からDHCPクライアントとしてネットワーク起動するようになってるので、
ネットワークは最初から使える。
だが、DNSが固定されていてドメインが使えない。
/etc/dhcp3/dhclient.conf
の、
supersede domain-name-servers 127.0.0.1;
って行をコメントアウトしてreboot。
適当にドメイン宛にpingして確認。

インストールされているUbuntuは9.04だが、
9.04はすでにサポート切れで、リポジトリがold-releases.ubuntu.comに移動している。
/etc/apt/sources.list
を、
#deb http://ports.ubuntu.com jaunty main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ jaunty main restricted universe multiverse
に変更。
また、apt-getする際に、ディレクトリが存在しないって怒られるので、
mkdir /var/cache/apt/archives
mkdir /var/cache/apt/archives/partial
で作成。
apt-get update
とかで確認。
apt-get upgrade
もここでしちゃっていいかもしれない。

カーネルを、コミュニティーサイトのやつに更新する。
標準のカーネルはNFSに対応していないと思うので、
NFSするならカーネルの更新は必要と思う。

http://sheeva.with-linux.com/sheeva/
にSheevaPlug用のカーネルが用意されているが、
インストーラまで用意されてる。
README-PLUG-UPDATE.sh
がインストーラになってる。
これを用意して、
USBメモリに保存。
USBメモリは通常FATでフォーマットされていると思うが、
FATだと難しいと思うのでext3でフォーマットした。
USBメモリをSheevaPlugにつないで、
/dev/sda1
になると思うので、
mkdir /mnt/usb
mount -t ext3 /dev/sda1 /mnt/usb
でマウント。
cd /mnt/usb
chmod 0755 README-PLUG-UPDATE.sh
README-PLUG-UPDATE.sh
を実行できるようにパーミッション変更。

README-PLUG-UPDATE.sh
でカーネル更新だが、
必要なwgetがインストールされてない。
apt-get install wget
でwgetインストール。

README-PLUG-UPDATE.sh
は、引数二つで、
1個目がカーネルバージョン。
2個目が--nandkernelか--rootkernel。
内蔵フラッシュを書き換える場合は--nandkernel。
カーネルバージョンは、
http://sheeva.with-linux.com/sheeva/
で公開されているものを選べる。
2.6.39.4
を入れたんで、
./README-PLUG-UPDATE.sh 2.6.39.4 --nandkernel
でカーネル更新。
万が一更新中にエラーが出たら、
カーネルが起動できなくなってめんどいと思うので、
成功するまでがんばる。
停電にも注意。

README-PLUG-UPDATE.sh
に記載されているが、
新しいカーネルにした場合は、U-Bootの環境変数を変更する必要がある。
rebootしてU-Boot画面にして、
setenv mainlineLinux yes
setenv arcNumber 2097
setenv bootargs rootfstype=jffs2 console=ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw root=/dev/mtdblock1
saveenv
reset
で新カーネル起動。

Linux側も、
/etc/sysctl.d/10-process-security.conf
を、数字部分を32768にしないとリモートからroot以外のユーザーログインできない様なので変更。
変更したら、
adduser ユーザー名
で一般ユーザを作って、一般ユーザのログインを確認。

SSHは最初からインストールされているが、
シリアルコンソールよりも、一般ユーザーでSSHログインしてsudoのが操作しやすいと思うので、
visudo
で、
ユーザー名 ALL=(ALL) NOPASSWD: ALL
で、sudo出来るように設定。(パスワード不要設定)
/etc/hosts

127.0.1.1
にホスト名が設定されてないとsudoできないようなので、
127.0.1.1 debian
とする。

起動時に /etc/rc.localが余計なことをしているようなので修正。
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
#insmod /boot/fat.ko
#insmod /boot/vfat.ko
mkdir -p /var/cache/apt/archives/partial
#/root/discoverd
#cd /
#./demo.sh
#date 012618002009
#hwclock -w

exit 0
こんな感じに。
普通のUbuntuだと、
最後のexit 0しかないが、
/var/cache/apt/archives/partial
が起動時に作成しないと消えてaptが使えないようなので、
mkdir -p /var/cache/apt/archives/partial
は必要ぽい。

時計が日本のローカル時間になってないので、
locale-gen ja_JP.UTF-8
echo 'LANG="ja_JP.UTF-8"' > /etc/default/locale
dpkg-reconfigure tzdata
で、Asia→Tokyoってすると日本時間になる。

SDカードをNFSの共有ストレージにするが、
SDカードの1番目のパーティションは/dev/mmcblk0p1になると思うので、
sudo mkdir /mnt/sd
sudo mount -t ext3 /dev/mmcblk0p1 /mnt/sd
で、マウントポイント作ってマウント確認。
確認できたら、
/etc/fstab
を、
/dev/mmcblk0p1 /mnt/sd ext3 defaults 0 0
な感じで、起動時自動マウント。

NFSサーバーは、
apt-get install nfs-kernel-server
でインストールできるが、
コミュニティーサイトのカーネルはNFSはモジュールでサポートなので、
起動スクリプトのカーネルチェックで失敗するんで、
/etc/init.d/nfs-kernel-server
の70行目付近の、
        if [ -f /proc/kallsyms ] && ! grep -qE 'init_nf(sd|    )' /proc/kallsyms; then
            log_warning_msg "Not starting $DESC: no support in current kernel."
            exit 0
        fi
の部分4行をコメントアウトする。

/etc/exports
でNFSサーバーの設定。
/mnt/sdを192.168.1.0/255.255.255.0で共有するので、
/mnt/sd 192.168.1.0/255.255.255.0(rw,no_subtree_check)
な感じにした。
IP(ホスト名)の後ろに()で囲んでオプションを付けるが、
()の前に不要なスペースをつけるとオプションが無効になるので注意。
no_subtree_check(又はsubtree_check)
は、付けないと警告が出る。

で、再起動でエラーがでなければNFS鯖は成功。

NFSクライアントの方もUbuntuだが、
初期状態でNFSクライアントが入ってなかったんで、
nfs-commonをインストールした。
sudo mkdir /mnt/nfs
sudo mount -t nfs 192.168.1.23:/mnt/sd /mnt/nfs
マウントポイントを作ってマウント。
IPはうちの。

fstabの自動マウントは、
192.168.1.23:/mnt/sd /mnt/nfs  nfs defaults 0 0
とりあえずこんな感じにした。
192.168.1.23:/mnt/sd /mnt/nfs  nfs rsize=8192,wsize=8192,hard,intr 0 0
こんな感じに修正した。
rsizeとwsizeは読み込みと書き込みのバッファ。
カーネル依存で標準は1024ぽいが、大きいサイズが設定できるなら速度が向上するらしい。
hardは、書き込みが成功しない場合、クライアントは停止するので、書き込み失敗がない。
intrは、hardでの書き込み失敗時にアプリケーションにシグナルを送って永久停止を回避する。