LinkStation LS-S250L に NetBSD を入れてみる

突然ですが、LS-S250L を入手しました。もちろん普通の NAS として使うきはさらさらありませんので、違う OS を入れて遊んでみたいと思います。
なにぶん初めての経験なので、以下の操作には間違っている箇所があるかもしれません。また動作させるまでには色々な人に助けて頂きました。この場を借りてありがとう。

BUFFALO Link Station Mini 省エネモデル 250GB LS-S250L

BUFFALO Link Station Mini 省エネモデル 250GB LS-S250L

シリアルコンソール

当然ですが、シリアルコンソールがあるとないとでは作業の難易度が段違いです。基板上にはシリアルコンソール用のパターンがあり、玄人志向のシリアルコンソールキットが使えます。コネクタをハンダ付けしてしまいましょう。コネクタ位置には、シールで隠されていますがケースに穴が開けられています。そのためケースにドリルで穴を開けなくても、シリアルコンソールを繋ぐことが可能です。
例によって山下さんのページが参考になります。
また、コネクタを半田づけしただけではコンソール出力がされないので、パッチをあてる必要があります。具体的には C54 のパターンふたつを近所の穴に繋ぎます。私は半田づけする自身がなかったので、より線の中身を刺してから模型用マスキングテープで固定しています。

NetBSD のビルド

NetBSD カーネルをビルドするわけですが、下記ページにある清原さんパッチをソースに当てる必要があります。
ftp://ftp.jp.netbsd.org/pub/NetBSD/misc/kiyohara/orion_nas/
具体的には以下の二つのファイルを使用します。

  • marvell-20091017.tar.gz
  • marvell-20091017.diff

清原さん曰く、パッチの日付とソースの日付を合わせた方がいいかもとのことなので、日付を指定して current からソースを取ってきます。


$ cvs -d :pserver:anoncvs@sup.jp.netbsd.org:/cvs/cvsroot co -D "2009-10-17" src
ビルドには i386NetBSD 5.0.1 マシンを使用しました。ソースを取得したディレクトリにパッチのアーカイブを展開し、さらにパッチを当てます。

$ tar zxvpf marvell-20091017.tar.gz -C src
$ cd src
$ patch -p0 -d . < ../marvell-20091017.diff
パッチがあたったらビルドをするのですが、そのままビルドしてできるカーネルでは、カーネル起動後にルートファイルシステムの位置を尋ねてきたりします。つまりその時点でコンソールからのキー入力待ちになってしまい、あまりよろしくありません。これを自動でやらせるために、以下のソースに修正を入れました。当然ですが以下の場合は、ルートファイルシステムを wd0a に用意し、ファイルシステムを ffs にする必要があります。

--- sys/arch/evbarm/conf/MARVELL_NAS.org	2009-12-11 01:39:18.000000000 +0900
+++ sys/arch/evbarm/conf/MARVELL_NAS	2009-12-10 20:07:32.000000000 +0900
@@ -149,7 +149,7 @@
 #options 	SYSCTL_INCLUDE_DESCR	# Include sysctl descriptions in kernel
 
 
-config		netbsd		root on ? type ?
+config		netbsd		root on wd0a type ffs
 
 # The main bus device
 mainbus0 at root

まずツールをビルドして、それからカーネルをビルド。まとめてやっちゃってもいいのかもしれませんが、下記の用に二回に分けました。


$ ./build.sh -m evbarm -O obj -T tools tools
$ ./build.sh -m evbarm -O obj -T tools kernel=KUROBOX_PRO
ビルドが完了すると、obj/sys/arch/evbarm/compile/KUROBOX_PRO 以下にカーネルが出来上がっているはずです。正常にパッチが当たっていれば netbsd.img というファイルが存在するはずで、このファイルは u-boot に直接読み込ませることが可能です。

boot パーティションの作成

LS-S250L は /dev/sda1 に作成した ext[23] なパーティションに置いてある uImage.buffalo と initrd.buffalo を読み込んで起動します。起動に使われるカーネル名は u-boot の環境変数によって変更可能ですが、u-boot の設定を下手に壊してしまうと復旧が大変なことになってしまうため、デフォルトの設定をいじらない方向で起動させたいと思います。なおデフォルトのファームがインストールされている HDD は保管しておき、まっさらな別 HDD を使う方がよいでしょう。
まずまっさらな HDD にパーティションを作成します。パーティションテーブルは GPT と MBR が使用可能で、製品内蔵の HDD は GPT になっていました。なおこの作業のみ Ubuntu 9.10 マシンに USB で HDD を接続して作業を行っています。*1
まず fdisk なり GParted なりで先頭に 1GB のパーティションを作成しました。普通は 100MB もあれば十分なはずだと思います。


$ sudo fdisk -l
ディスク /dev/sdc: 60.0 GB, 60011642880 バイト
ヘッド 255, セクタ 63, シリンダ 7296
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
Disk identifier: 0x00079804

バイス ブート 始点 終点 ブロック Id システム
/dev/sdc1 1 132 1060258+ 83 Linux

次に ext2ファイルシステムを作成するのですが、ここで要注意。LS-S250L の u-boot の仕様として、boot パーティションの inode は 128 バイトである必要があります。最近の Linux で普通にフォーマットすると、inode が 256 バイト(?)になってしまうらしく、カーネルが読み込めません*2。そこで mke2fs に -I オプションを指定します。

$ sudo mke2fs -I 128 /dev/sdc1
あとは先ほどビルドした netbsd.img を uImage.buffalo にリネームして、このパーティションに置きましょう。initrd.buffalo も忘れずに製品の HDD から持ってくるように。NetBSD 的には使用しませんが、u-boot 的に要求されるので。

ルートファイルシステムユーザランドの用意

ビルドに使用した NetBSD マシンにて、パーティションを作成します。


# fdisk sd0
Partition table:
0: Linux native (sysid 131)
start 63, size 2120517 (1035 MB, Cyls 0-131)
PBR is not bootable: All bytes are identical (0x00)
1: NetBSD (sysid 169)
start 2120580, size 115089660 (56196 MB, Cyls 132-7295)
PBR is not bootable: All bytes are identical (0x00)
2:
3:

# disklabel sd0
6 partitions:
# size offset fstype [fsize bsize cpg/sgs]
a: 112992508 4217732 4.2BSD 0 0 0 # (Cyl. 16475*- 457852*)
b: 2097152 2120580 swap # (Cyl. 8283*- 16475*)
c: 115089660 2120580 unused 0 0 # (Cyl. 8283*- 457852*)
d: 117210240 0 unused 0 0 # (Cyl. 0 - 457852*)
e: 2120517 63 Linux Ext2 0 0 # (Cyl. 0*- 8283*)

先頭に 1GB の ext2 パーティション(0)があるので、次の領域に NetBSD パーティションを fdisk で確保しました。Linux 的には /dev/sda2 な部分になります。
次に disklabel を見ると、ext2 が sd0e となっているので、sd0b と sd0a を確保します。これらは LS-S250L 上では wd0a wd0b として見える部分になりますね。そしてフォーマットします。

# newfs sd0a
sd0a にユーザランドを展開します。ユーザランドは evbarm のものがそのまま使えるらしいので、ftp サイトからパクってきましょう。例えば NetBSD 5.0.1 のものは以下にあるようです。
ftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-5.0.1/evbarm/binary/sets/
以下のアーカイブを取ってきました。

  • base.tgz
  • comp.tgz
  • etc.tgz
  • games.tgz
  • man.tgz
  • misc.tgz
  • text.tgz

sd0a をマウントして展開します。


# mount /dev/sd0a
# for n in *.tgz; do tar zxpf $n -C /mnt; done
展開した /etc 以下を編集します。

# vi /mnt/etc/rc.conf
rc_configured=YES

# vi /mnt/etc/fstab
/dev/wd0a       /       ffs     rw      1 1
/dev/wd0b       none    swap    sw      0 0

バイスノードを作成します。


# cd /mnt/dev
# ./MAKEDEV all

起動

ここまで出来たら HDD を LS-S250L 本体に取り付けて電源を入れます。

Marvell>> Orion1   CPU =  Low 

Checking DATA BUS
Checking ADDRESS BUS

> Checking hardware info ...
=== CPU-ID       : 0x00005182 ===
=== Strap status : 0x00802030 ===
=== H/W boardId  :       0x33 ===
=== boardId      :       0x1a ===
=== micon_support:        off ===
> OK.
=== BUFFALO LS-SL U-Boot. ===
 ** LOADER **
 ** BUFFALO BOARD: BUFFALO_BOARD_LS_SL LE (CFG_ENV_ADDR=fffff000)


U-Boot 1.1.1 (May 28 2009 - 11:06:21) Marvell version: 1.12.1 - TINY
U-Boot code: 00600000 -> 00639A58  BSS: -> 00641B24
Buffalo Version: 1.23-1.00

DRAM CS[0] base 0x00000000   size 128MB 
DRAM Total size 128MB 
[256kB@fffc0000] Flash: 256 kB
Addresses 8M - 0M are saved for the U-Boot usage.
Mem malloc Initialization (8M - 7M): Done

Soc: 88F5182 A2
CPU: ARM926 (Rev 0) running @ 400Mhz 
Orion 1 streaming disabled 
SysClock = 200Mhz , TClock = 166Mhz 


USB 0: host mode
PCI 0: PCI Express Root Complex Interface
PCI 1: Conventional PCI, speed = 33000000
Net:   egiga0 [PRIME]
Using 88E1118 phy
buffalo_change_power_status > Read 0x3a
buffalo_IsStopAtUbootStatus > MagicKey=0x3a
buffalo_change_power_status > Read 0x3a
buffalo_change_power_status > Read 0x3a
buffalo_change_power_status > Writing 0x5c

Please Press HDD power button to continue ...
buffalo_change_power_status > Read 0x5c
buffalo_change_power_status > Writing 0x3a

Marvell Serial ATA Adapter
Integrated Sata device found
  Device 0: OK
Model: HTS541060G9SA00                          Firm: MB3OC60R Ser#:       MPBCRAXMGEJMMG
            Type: Hard Disk
            Supports 48-bit addressing
            Capacity: 57231.5 MB = 55.8 GB (117210240 x 512)


4256216 bytes read
   Image Name:   NetBSD 5.99.20 (KUROBOX_PRO)   
   Created:      2009-12-10  11:08:05 UTC
   Image Type:   ARM NetBSD Kernel Image (uncompressed)
   Data Size:    4256152 Bytes =  4.1 MB
   Load Address: 00008000
   Entry Point:  00800000

8937716 bytes read
   Image Name:   initrd
   Created:      2009-06-14  13:46:10 UTC
   Image Type:   ARM Linux RAMDisk Image (gzip compressed)
   Data Size:    8937652 Bytes =  8.5 MB
   Load Address: 00000000
   Entry Point:  00000000
** Bad partition 1 **
serch_boot_drv (194)>No kernel_file 1 
** Bad partition 1 **
serch_boot_drv (249)>No init_file 1 
Booting from Device 0 
hit any key to switch tftp boot.
Hit any key to stop autoboot:  0 
Hit any key to stop autoboot:  0 

4256216 bytes read
** Bad partition 1 **
## Booting image at 00100000 ...
   Image Name:   NetBSD 5.99.20 (KUROBOX_PRO)   
   Created:      2009-12-10  11:08:05 UTC
   Image Type:   ARM NetBSD Kernel Image (uncompressed)
   Data Size:    4256152 Bytes =  4.1 MB
   Load Address: 00008000
   Entry Point:  00800000
   Verifying Checksum ... OK
OK
## Transferring control to NetBSD stage-2 loader (at address 00008000) ...

NetBSD/evbarm (orion_nas) booting ...
Loaded initial symtab at 0xc03954d0, strtab at 0xc03c98d8, # entries 13294
pmap_postinit: Allocated 35 static L1 descriptor tables
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 5.99.20 (KUROBOX_PRO) #1: Thu Dec 10 20:07:53 JST 2009
	root@shiranui:/usr/src/obj/sys/arch/evbarm/compile/KUROBOX_PRO
total memory = 128 MB
avail memory = 120 MB
mainbus0 (root)
cpu0 at mainbus0: ARM926EJ-S rev 0 (ARM9EJ-S core)
cpu0: DC enabled IC enabled WB enabled EABT branch prediction enabled
cpu0: 32KB/32B 1-way Instruction cache
cpu0: 32KB/32B 1-way write-back-locking-C Data cache
mvsoc0 at mainbus0: Marvell MV88F5182 SoC Rev. A0 Orion1
mvsoc0: CPU Clock 400.000 MHz  SysClock 200.000 MHz  TClock 166.664 MHz
oriontmr0 at mvsoc0 offset 0x20300-0x203ff: Marvell Orion Timer
oriongpp0 at mvsoc0 offset 0x10100-0x101ff: Marvell Orion General Purpose I/O Port Interface
oriongpp0:   Data Out:                 	0x00080002
oriongpp0:   Data Out Enable Control:  	0x03e6bffd
oriongpp0:   Data Blink Enable:        	0x00004000
oriongpp0:   Data In Polarity:         	0x0007c082
oriongpp0:   Data In:                  	0x008d277d
oriongpp0:   Data Interrupt Cause:     	0x00000000
oriongpp0:   Data Interrupt Mask:      	0x00000000
oriongpp0:   Data Interrupt Level Mask:	0x00000000
gpio0 at oriongpp0: 32 pins
com0 at mvsoc0 offset 0x12000 irq 3: ns16550a, working fifo
com0: console
com1 at mvsoc0 offset 0x12100-0x1211f irq 4: ns16550a, working fifo
mvsata0 at mvsoc0 offset 0x80000-0x87fff irq 29: Marvell Serial-ATA Host Controller (SATAHC)
mvsata0: GenIIe, 1hc, 2port/hc
atabus0 at mvsata0 channel 0
atabus1 at mvsata0 channel 1
ehci0 at mvsoc0 offset 0x50000-0x51fff irq 17: Marvell USB 2.0 Interface
usb0 at ehci0: USB revision 2.0
mvpex0 at mvsoc0 offset 0x40000-0x41fff irq 11: Marvell PCI Express Interface
pci0 at mvpex0
pchb0 at pci0 dev 0 function 0
mvgbe0 at mvsoc0 offset 0x70000-0x73fff irq 21: Marvell Gigabit Ethernet Controller
mvgbe0: Ethernet address 00:1d:73:f9:49:af
makphy0 at mvgbe0 phy 8: Marvell 88E1116 Gigabit PHY, rev. 1
makphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT, 1000baseT-FDX, auto
mvcesa0 at mvsoc0 offset 0x90000-0x9ffff irq 28: Marvell Cryptographic Engines and Security Accelerator
gttwsi0 at mvsoc0 offset 0x11000-0x1101f irq 5: Marvell TWSI controller
iic0 at gttwsi0: I2C bus
rs5c372rtc0 at iic0 addr 0x32: RICOH RS5C372[AB] Real-time Clock
gtidmac0 at mvsoc0 offset 0x60000-0x6ffff irq 24: Marvell IDMA Controller/XOR Engine
uhub0 at usb0: vendor 0x0000 EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
mvsata0 port 0: device present, speed: 1.5Gb/s
wd0 at atabus0 drive 0: <HTS541060G9SA00>
wd0: 57231 MB, 116280 cyl, 16 head, 63 sec, 512 bytes/sect x 117210240 sectors
Kernelized RAIDframe activated
boot device: <unknown>
root on wd0a dumps on wd0b
init: copying out path `/sbin/init' 11
Thu Feb  3 04:24:37 UTC 2022
swapctl: adding /dev/wd0b as swap device at priority 0
Starting file system checks:
/dev/rwd0a: file system is clean; not checking
Setting tty flags.
Setting sysctl variables:
kern.no_sa_support: 1 -> 1
ddb.onpanic: 1 -> 0
Starting network.
/etc/rc: WARNING: $hostname not set.
IPv6 mode: host
Configuring network interfaces:.
Adding interface aliases:.
Building databases: dev, utmp, utmpx, servicesWARNING: negative runtime; monotonic clock has gone backwards
 done
Starting syslogd.
Checking for core dump...
savecore: (null): kvm_openfiles: /netbsd: No such file or directory
Feb  3 04:24:53  savecore: (null): kvm_openfiles: /netbsd: No such file or directory
Mounting all filesystems...
Clearing temporary files.
Creating a.out runtime link editor directory cache.
Checking quotas: done.
Setting securelevel: kern.securelevel: 0 -> 1
Starting virecover.
Starting local daemons:.
Updating motd.
postfix: rebuilding /etc/mail/aliases (missing /etc/mail/aliases.db)
newaliases: warning: valid_hostname: empty hostname
newaliases: fatal: unable to use my own hostname
Feb  3 04:24:57  postfix/sendmail[242]: fatal: unable to use my own hostname
Starting inetd.
Starting cron.
Thu Feb  3 04:24:58 UTC 2022

NetBSD/evbarm (Amnesiac) (console)

login:

キター!!
いやまあ、ここがスタートラインなんですがね。

*1:新機能のディスクユーティリティを使ってみたかったのでwww

*2:これで二日ほど悩んだのは秘密だ