LinkStation (LS-VL) に Linux を入れて遊ぶことにしました。
数本のツメを折りつつ開けると、中に入っていたのは MVLSV-BA という基板。
CPU アーキテクチャは armel (ARMv5)。RAM は 128MB が 2 枚。
サポートしている OS はやはり少なく、Debian 12 "Bookworm" を入れることにしました。
思ったより面倒だったので備忘録として書き残しておきます。
armel に対応している最後のバージョンである Debian 13 "Trixie" を当初は入れようとしていたのですが、Trixie のリポジトリからはすでに armel 用の Linux カーネルが削除されています。
Trixie から Bookworm のリポジトリを参照するも依存関係エラー。
.deb を直接入れようとしたら /usr/bin のシンボリックリンクが壊れました。
非常におすすめしません。面倒です。
当初は /dev/sda2 をスワップ、/dev/sda3 をデータ領域にしていましたが、LS-VL の U-Boot は /dev/sda2 を読み込むように強制されているようです。
回避策はありますが、何かいろいろスクリプトを書かなきゃいけないようだったのでやめました。
パーティションを区切る
LS-VL に使うディスクに以下のパーティションを区切ります。
/dev/sda2, /dev/sda3 はインストーラーで区切ってもいいかもしれないです。
ブート領域: /dev/sda1
ブート領域として /dev/sda1 を作成します。
サイズは 500 MiB。ファイルシステムは ext3。
カーネルを書き込む
ここに対して、以下のファイルをダウンロードして書き込みます:
https://ftp.debian.org/debian/dists/bookworm/main/installer-armel/current/images/kirkwood/network-console/buffalo/ls-vl/initrd.buffalo
https://ftp.debian.org/debian/dists/bookworm/main/installer-armel/current/images/kirkwood/network-console/buffalo/ls-vl/uImage.buffalo
LS-VL には U-Boot というブートローダーが最初から入っており、これらのファイルを読み込むようハードコードされているらしいです。
これらのファイルは、Debian のインストーラーを U-Boot 用に変換したカーネル (uImage) と初期 RAM ディスク (initrd) です。
データ領域: /dev/sda2
データ領域として /dev/sda2 を作成します。
サイズはお好み。ファイルシステムは ext4 にしましたが、別に何でもいいと思います。
ext4 を利用する場合、万が一インストーラーのシェルで何か操作をしたいとき、modprobe ext4 を実行しないとマウントできなかったりします。
スワップ領域: /dev/sda3
スワップとして /dev/sda3 を作成します。
サイズはお好み。私の場合は 2 GiB 割り当てました。
インストールする
起動すると SSH 経由でインストールを実行できます。ユーザーは installer、パスワードは install でログインできます。
思ったより立派ですね。
なお、再起動するごとに SSH のホスト鍵が再生成されるようです。
上級者モードでインストールを進めましょう。以下に注意してください。
- "Choose a mirror of the Debian archive" を進めている最中、Bookworm か Trixie か選択する画面が出たら、Bookworm を選択してください。
- ベースシステムのインストール時にカーネルを選択できる場合、
linux-image-marvellを選択してください。
あと何か initrd が「汎用か目的化か」と言われたので、私はとりあえず目的化にしておきました。とにかく最小限のインストールがしたかったので。
「システムを起動可能にする」のステップまで来たら実行せず、「ブートローダなしで進める」も実行せず「シェルの実行」に進んで、次の手順を行います。
Linux のカーネルを書き込む
Linux のカーネルを U-Boot 用に変換します。
/dev/sda2 に chroot する
まずはディスクをマウントします。
~ # mkdir /mnt/root /mnt/boot
~ # mount /dev/sda2 /mnt/root
~ # mount /dev/sda1 /mnt/boot
また、/dev/sda2 の中から /mnt/boot 経由で /dev/sda1 にアクセスできるようにもしておきます。
~ # mkdir /mnt/root/mnt/boot
~ # mount --bind /mnt/boot /mnt/root/mnt/boot
chroot 内で支障がないようにいろいろマウントします。
~ # mount --bind /dev /mnt/root/dev
~ # mount --bind /proc /mnt/root/proc
~ # mount --bind /sys /mnt/root/sys
~ # mount --bind /dev/pts /mnt/root/dev/pts
その後、/dev/sda3 の中に入ります。
~ # chroot /mnt/root /bin/bash
root@debian:/#
カーネルを /boot に書き込む
apt update をして、linux-image-marvell、u-boot-tools、initramfs-tools を入れます。もう入っていると嬉しいですね(適当)。
root@debian:/# apt update
root@debian:/# apt install linux-image-marvell u-boot-tools initramfs-tools
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
linux-image-marvell はすでに最新バージョン (6.1.176-1) です。
u-boot-tools はすでに最新バージョン (2023.01+dfsg-2+deb12u3) です。
u-boot-tools は手動でインストールしたと設定されました。
initramfs-tools はすでに最新バージョン (0.142+deb12u3) です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
カーネルのバージョンを見ます。
root@debian:/# ls /boot/
System.map-6.1.0-50-marvell
initrd.img
initrd.img.old
vmlinuz-6.1.0-50-marvell
config-6.1.0-50-marvell
root@debian:/# KVER=$(ls /boot/vmlinuz-* | sed 's#/boot/vmlinuz-##' | tail -n 1)
root@debian:/# echo $KVER
6.1.0-50-marvell
uImage.buffalo と initrd.buffalo を作って /dev/sda1 へ書き込みます。
しかしここで重要なこととして、DTB と呼ばれる、基盤上にあるチップの位置データのようなものをカーネルにくっつける必要があります。
vmlinuz という圧縮された Linux カーネルに DTB ファイルを cat でくっつけます。
root@debian:/# cd boot
root@debian:/boot# cat vmlinuz-${KVER} /usr/lib/linux-image-${KVER}/kirkwood-linkstation-lsvl.dtb > vmlinuz-dtb
完成した vmlinuz-dtb ファイルを uImage.buffalo に変換します。
root@debian:/# mkimage -A arm -O linux -T kernel -C none -a 0x01a00000 -e 0x01a00000 -n "Debian Kernel" -d vmlinuz-dtb /mnt/boot/uImage.buffalo
また、initrd.img も initrd.buffalo に変換します。
root@debian:/# mkimage -A arm -O linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n "Debian Initrd" -d /boot/initrd.img-6.1.0-50-marvell /mnt/boot/initrd.buffalo
しれっと Load Address (-a) と Entry Point (-e) を指定しています。これは、Debian のインストーラーのものと同一です。
これを指定しないと動作しないので気を付けてください(1敗)。
root@debian:/mnt/boot# mkimage -l uImage.buffalo
Image Name: Debian kernel
Created: Tue Jul 7 03:34:10 2026
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2656891 Bytes = 2594.62 KiB = 2.53 MiB
Load Address: 01a00000
Entry Point: 01a00000
root@debian:/mnt/boot# mkimage -l initrd.buffalo
Image Name: debian-installer ramdisk
Created: Tue Jul 7 03:34:10 2026
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 12324548 Bytes = 12035.69 KiB = 11.75 MiB
Load Address: 00000000
Entry Point: 00000000
PermitRootLogin yes にする(1敗)
設定手順はごく単純に、/dev/sda2 の /etc/ssh/sshd_config を操作するだけです。
これを忘れると起動してもログインできなくなります。
root のパスワードが設定されているか確認する(1敗)
インストーラーで root のパスワードを設定したような記憶があるのですが、ログインできず調査すると /etc/shadow にパスワードが存在しませんでした。
root@debian:/# openssl passwd -6
Password:
Verifying - Password:
$6$ULzJcMjugHQIf670$hGI5Zx7hD.3h7Dk...
OpenSSL コマンドを叩き、出てきたハッシュを /etc/shadow に手動で書き込んでおきます。
root:$6$ULzJcMjugHQIf670$hGI5Zx7hD.3h7Dk...:20667:0:99999:7:::
よくわからないけどとりあえず書き込んでおきます。
再起動
完成。chroot を抜け、再起動します。
root@debian:/# ls -l /mnt/boot/*.buffalo
-rw-r--r-- 1 root root 6146469 Aug 2 22:04 /mnt/boot/initrd.buffalo
-rw-r--r-- 1 root root 2643368 Aug 2 22:04 /mnt/boot/uImage.buffalo
root@debian:/# exit
exit
~ # umount /mnt/root/dev/pts
~ # umount /mnt/root/sys
~ # umount /mnt/root/proc
~ # umount /mnt/root/dev
~ # umount /mnt/root/mnt/boot
~ # umount /mnt/boot
~ # umount /mnt/root
~ # reboot
再起動もシャットダウンもいきなり HDD への電力供給が途切れるようで、「カキューーン……」みたいな高音がして心臓に悪いです。
M.2 変換アダプタを買って SATA SSD に変えようか悩み中。
完走した感想
無事 256 MB で armel の Linux マシンが出来上がりました! これ何に使うん?
