秋月で1,000円で販売されていた「無線モジュール付きSoC基板+白色プラスチックケース」でDebian "bullseye" を起動することができたのでメモとして残しておきます。
戦略としては以下の通りです。
- honeylabさん の設定を使い、BuildrootでLinuxが起動するSDカードイメージを作成する
- 作成されたSDカードイメージのrootfsをdebootstrapで作成したDebianのファイル群と置き換える
BuidrootでLinuxが起動するSDカードイメージを作成する
ほとんど honeylabさんの記事 で紹介されている通りです。
github.com/bakueikozo/buildroot_am3352_aki を利用します。
作業はamd64のUbuntu22.04で実施しています。
cd ~/
sudo apt -y install build-essential bc libssl-dev unzip ncurses-dev
git clone git@github.com:bakueikozo/buildroot_am3352_aki.git
cd buildroot_am3352_aki
make akiduki_am3352_defconfig
make menuconfig
menuconfig では、rootfsのファイルシステムサイズを大きくします。
Filesystem images -> exact size -> 1200M
これだけではSDカードのイメージサイズが小さいので、 board/akiduki_am3352/genimage.cfg
を編集し、sizeを 512MB から 1536MB ぐらいに変更しておきます。
vi board/akiduki_am3352/genimage.cfg
もし Debian を利用せずに、Buildroot でできたイメージを使い続けるなら元の記事の説明等を見つつパスワードを設定したりSSHサーバを起動したり、DHCPの設定をするなどしておくと便利です。
もしLinuxカーネルのオプションを変更したい場合は
make linux-menuconfig
を利用してください。
ここまでできたら make
を実行します。
make
完成すると output/images/sdcard.img
にSDカードイメージが作成されます。
Debian に置き換える
debootstrap で rootfs を作成する
debootstrapコマンドをqemuと一緒にインストールし、実行します。
cd ~/
sudo apt-get install debootstrap qemu-user-static
sudo qemu-debootstrap --verbose --arch=armhf --variant=buildd bullseye rootfs-debian-armhf http://ftp.jp.debian.org/debian/
できたディレクトリに chroot してさらにパッケージのインストールなどを進めます。
sudo chroot ./rootfs-debian-armhf /bin/bash
apt update
apt upgrade -y
apt install -y ifupdown iproute2 iputils-ping net-tools dnsutils sudo vim screen tcpdump ca-certificates locales locales-all avahi-daemon kmod fdisk e2fsprogs curl wget openssh-server udev
echo "Asia/Tokyo" > /etc/timezone
cp /usr/share/zoneinfo/Japan /etc/localtime
locale-gen en_US.UTF-8
locale-gen ja_JP.UTF-8
ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttyS0.service
apt clean
SSHでログインするためのユーザを作成します。
adduser debian
usermod -aG sudo debian
/etc/fstab
などを作成します。
# fstabの作成
cat - << EOS > /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/vda2 during curtin installation
/dev/mmcblk0p2 / ext4 defaults 0 1
EOS
# ネットワークインターフェースの設定
cat - << EOS > /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
EOS
# ホスト名の設定
echo "akiduki" > /etc/hostname
# hostsファイルの作成
cat - << EOS > /etc/hosts
127.0.0.1 localhost
127.0.1.1 akiduki
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
EOS
# aptのsourceを追加
cat - << EOS > /etc/apt/sources.list
deb http://ftp.jp.debian.org/debian bullseye main
deb http://security.debian.org/ bullseye-security main
deb-src http://security.debian.org/ bullseye-security main
EOS
# leds-gpio カーネルモジュールをロード
echo "leds-gpio" > /etc/modules-load.d/leds-gpio.conf
# Wi-SUNモジュールの安定動作対応
cat - << EOS > /etc/rc.local
#!/bin/sh
echo 0 > /sys/class/leds/wisun_reset/brightness
echo 7 > /sys/class/gpio/export
echo high > /sys/class/gpio/gpio7/direction
echo 1 > /sys/class/leds/wisun_reset/brightness
exit 0
EOS
chmod a+x /etc/rc.local
作業が終わったら chroot を抜けます。
exit
カーネルモジュールを Buildroot から持ってくる
/sys/class/leds/wisun_reset
を利用したいので、カーネルモジュール一式を持ってきます。
sudo rsync -av ~/buildroot_am3352_aki/output/target/lib/modules/ ~/rootfs-debian-armhf/lib/modules/
SDカードイメージのrootfsを差し替える
ここからの操作は chroot から抜けた状態で行います。
losetup
コマンドで作成されるループバックデバイスは /dev/loop0
とは限らないので、異なる場合は実際に作成されたループバックデバイスファイル名で読み替えてください。
cp ~/buildroot_am3352_aki/output/images/sdcard.img ~/debian.img
sudo losetup -f ~/debian.img -P --show
sudo mkfs.ext4 -L rootfs -F /dev/loop0p2
sudo mkdir /mnt/rootfs
sudo mount /dev/loop0p2 /mnt/rootfs
sudo rsync -av ~/rootfs-debian-armhf/ /mnt/rootfs/
sudo umount /mnt/rootfs
sync; sync; sync;
sudo losetup -d /dev/loop0
これで ~/debian.img
の rootfs がDebianに置き換えられました。
あとはSDに焼いて起動すればOKです。
DHCPでIPが取得されるのでSSHでログインできます。
avahi-daemonをインストールしてあるので、同一ネットワーク上からホスト名で名前解決可能です。
ssh debian@akiduki.local
SDカードのパーティションサイズ拡大
パーティションサイズを拡大します。
sudo fdisk /dev/mmcblk0 <<EOF
p
d
2
n
p
2
32769
p
w
EOF
ファイルシステムも拡大します。
sudo /sbin/resize2fs /dev/mmcblk0p2
Wi-SUN を使ってみる
まずWi-SUNモジュールをリセットします。
echo "0" | sudo tee /sys/class/leds/wisun_reset/brightness
sleep 1
echo "1" | sudo tee /sys/class/leds/wisun_reset/brightness
/dev/ttyS1
が Wi-SUN モジュールに接続されているシリアルポートなのでボーレート115200で接続します。
sudo screen /dev/ttyS1 115200
動作確認のために SKINFO
コマンドを実行してみると応答が返ってくるはずです。
SKINFO
EINFO FE80:0000:0000:0000:1207:XXXX:FEA8:XXXX 1007XXXXFEA8XXXX 21 FFFF 0
OK