春雨日記 about me tags

散らばっていたG-Clusterの情報を整理しました.

はじめに

G-Cluster改造は個人的に一区切り付き,放置に近くなっています.

しかし,今見ると情報が散らばり過ぎていてるので,カーネルをビルドしてAlpine LinuxをNANDにインストールするまでをおさらいし,まとめたいと思います.

この記事で行う事

かなり長い記事となっているため,章ごとに区切ってあります.欲しい情報までスキップして利用して下さい.

使用する環境

Ubuntu 22.04の仮想マシンを使用しています.

カーネルのビルド以外そんな重い処理は無いので,VMで十分だと思います.

1. カーネル

この手順は,ビルド済カーネルを使う際にスキップできます.

(↑2024/09/08リンク更新しました。開くのに時間がかかるので注意)

とりあえず動かしたい人はダウンロードして2章まで進んで下さい.

カーネルは,私が移植したLinux 5.15(linux-stable 5.15.y)を使用します(巨大なレポジトリなので開くまで時間がかかります).

作業ディレクトリは,~/gc/とします.

1
2
mkdir ~/gc
cd ~/gc

1.1 ソフトウェアのインストール

  • ビルドシステムなど

    1
    2
    
    apt update
    apt install build-essential bc flex bison libncurses5 libssl-dev git u-boot-tools
    
  • コンパイラ

    URLが変わる可能性があるので,最新版を参照して下さい.

    1
    2
    
    wget https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz
    tar xvf arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz
    

1.2 カーネルソースのダウンロード

1
2
3
git clone https://git.haru3.me/haru/linux-stable-dsm232.git --depth 1
cd linux-stable-dsm232
wget -O .config https://blog.haru3.me/posts/2023/20230128-dsm232-summary/config.txt

1.3 ビルド

1
2
3
4
5
6
7
export ARCH=arm
export CROSS_COMPILE=~/gc/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-
make oldconfig
make menuconfig # 設定を変更するなら,しないなら不要
make -j4
make INSTALL_MOD_PATH=kmods modules_install
make INSTALL_HDR_PATH=kheaders headers_install

1.4 後処理

1
2
3
cat arch/arm/boot/zImage arch/arm/boot/dts/celestial-cnc1800l.dtb > zImage_comb.bin
mkimage -a 0x8000 -A arm -O linux -T kernel -C none -e 0x8000 -n kernel -d zImage_comb.bin uImage
tar cvzf linux-dsm232.tar.gz uImage kmods/ kheaders/ arch/arm/boot/zImage arch/arm/boot/dts/celestial-cnc1800l.dtb .config

こうして,全部入ったlinux-dsm232.tar.gzが完成します.これで配布しているビルド済カーネル相当になります.

2. USBメモリからAlpine Linuxを起動

512MB以上のUSBメモリを用意します.

2.1 パーティショニング

個人の好みで大丈夫なのですが,

  • u-bootから参照するFAT32パーティション
  • Linuxのrootfs

の最低2つパーティションが必要となります.

ここでは,rootfsのフォーマットはとりあえずext4とします.ビルド時に有効にしてあればbtrfsとかも使えるはずです.

パーティショニングの方法は色々ありますが,例としてGPartedを使ってみます.

1
sudo apt install gparted dosfstools mtools

注意!:下記を行うことでディスクが初期化されます

  1. パーティションテーブルをMBRに

    まず,最近のディスクはGPTとなっている物が多いのでMBRにします.

    Create Partition Tableを選択し

    msdosでApply

  2. パーティションの作成

    左上のNew Partitionをクリックし,

    このような感じでfat32のプライマリパーティションを作成します.容量は512MBとしました.

    同様にrootfsも作成します.こちらはext4で,容量は残り全て(デフォルト値)となっています.

  3. ディスクに書き込み

    Apply All Operationsをクリックし,ディスクに変更を書き込みます.

以上で,パーティショニングは終了です.

2.2 カーネルのコピー

上記で作ったFAT32の方にuImageをコピーします.

2.3 Alpineのインストール

2.3.1 必要ソフトウェアのインストール

1
apt install qemu-user-static libarchive-tools

2.3.2 Alpine Linuxのコピー

Alpine Linuxのダウンロードページより,Mini root filesystemのarmhf版をダウンロードします.

とりあえず,今現在のリンクではこんな感じ

1
2
3
4
5
6
7
cd ~/gc
wget https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/armhf/alpine-minirootfs-3.17.1-armhf.tar.gz
mount /dev/sdb2 /mnt # 先ほど作ったext4の方,環境で異なります.
bsdtar -xpf alpine-minirootfs-3.17.1-armhf.tar.gz -C /mnt

cp -r linux-stable-dsm232/kmods/lib /mnt/
#カーネルモジュールのコピー,ビルド済カーネルの人はアーカイブからコピーして下さい.

2.3.3 セットアップ

Alpineにchrootします.

1
chroot /mnt ash

Alpineのシェルにて,以下のコマンドを実行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
echo 'nameserver 1.1.1.1' > /etc/resolv.conf
apk update
apk add alpine-base
apk add dhcpcd # DHCPクライアント
apk add nano curl # 必要なら他のパッケージも

setup-alpine
# 質問に答える,ネットワークやファイルシステムは設定しない方がいいかも
nano /etc/inittab
# /dev/ttyS0のコメントアウトを外す

exit # chroot終了

アンマウントなど

1
2
pkill -f binfmt
umount /mnt

2.4 実機で起動

2.4.1 UART結線

DSM-232のUARTは

のように出ているので,クロス(TX->RX,RX->TX)でUSB-シリアル変換等に接続します.

2.4.2 u-bootから起動

  1. USBメモリとネットワークインタフェース(携帯のテザリングでも可)を接続し,電源は入れないでおきます.

    ネットワークインタフェースは後述のNANDインストール時に使用します.起動するだけなら不要です.

  2. ターミナル(Tera Term等)を開き,シリアルポートに接続した上でボーレートを115200に設定します.

  3. DSM232の電源を入れた瞬間,ターミナル上で何かボタンを押しっぱなしにして起動プロセスを中断します.

うまくいくと写真の通りU-Bootコンソールに入れます.

ここで,以下のようにコマンドを打ちます.

1
2
3
4
usb start
fatload usb 0 ${RAM} uImage
env set bootargs "root=/dev/sda2 rw rootwait"
bootm ${RAM}

しばらくするとログイン画面が出ます.

2.5 ネットワーク設定

1
ip a

を実行すると,使用しているネットワークインタフェースの名前がわかります.

ここではeth0だったので,

1
dhcpcd eth0

とするとDHCPからIPアドレスが設定されます. ちなみにテザリングだとusb0等になります.

これで,USBメモリからの起動は終了です.

3. NANDにインストール

いよいよ本体にインストールしていきます.

3.1 ソフトウェアのインストール

1
2
/etc/init.d/chronyd restart # まず時刻を合わせます.
apk add mtd-utils

3.2 MTDの操作

1
2
3
4
5
flash_erase /dev/mtd12 0 0 # 消去
ubiformat /dev/mtd12 # ubifsでフォーマット
ubiattach -p /dev/mtd12 # ubi0を作る
ubimkvol /dev/ubi0 -Nrootfs -m # rootfsボリュームを作る
mount -t ubifs ubi0:rootfs /mnt # /mntにマウント

3.3 Alpineインストール

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
cd /root
wget https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/armhf/alpine-minirootfs-3.17.1-armhf.tar.gz
cd /mnt
tar xvf /root/alpine-minirootfs-3.17.1-armhf.tar.gz

chroot /mnt #ここからUSBとほぼ同じ
echo 'nameserver 1.1.1.1' > /etc/resolv.conf
apk update
apk add alpine-base
apk add dhcpcd nano # 必要なら追加
setup-alpine
# 質問に答える
nano /etc/inittab
# /dev/ttyS0のコメントアウトを外す
exit

cp -r /lib/modules /mnt/lib/ #モジュールのコピー

3.4 カーネルインストール

まず,

1
reboot

で再起動します.次にU-Bootコンソールに入るため,再起動する瞬間キーを押すことを忘れないで下さい.

U-Bootコンソールにて,以下のようにコマンドを打ちます.

1
2
usb start
fatload usb 0 ${RAM} uImage

ここで,出力される

1
2
3
reading uImage
................................................................................................................................................................................................
5973075 bytes read

の読み込みバイト数を16進に変換して下さい.

この場合0x5b2453となります.

続けて,NANDを消去します.

1
nand erase 0x400000 0x800000

そして,書き込む際に上記のバイト数を使用します.

1
nand write ${RAM} 0x400000 0x5b2453

あとは,起動時の設定を変更します.

1
2
3
4
env set bootargs "root=ubi0:rootfs ubi.mtd=12 rw rootfstype=ubifs"
env set bootcmd "nand read ${RAM} 0x400000 0x800000;bootm ${RAM}"
env save
reset

再起動がかかり,USBメモリを抜いても正常に起動するはずです.

なお,カーネルの更新時にはnand writeまでを実行すればよく,envの変更は必要無いです.

alpineは軽量なため,インストール後で80MB程度空いています.

関連リンク

https://blog.haru3.me/posts/20220708-gcluster-archlinux/

https://blog.haru3.me/posts/20220718-gcluster-alpine/

https://blog.haru3.me/posts/20220719-gcluster-nand-boot/

https://blog.haru3.me/posts/20220720-gcluster-linux-stable/

開発中に書いているので,詳細な説明があったりします. 一方,追記だらけで文構成がめちゃめちゃなので実行する際は使いにくかったりします…

そのため,とりあえず実行する手順を並べたのが本記事です.

付録

付録1: カーネルバージョンの更新

カーネルバージョンの更新というか,upstreamに追従する方法です.

なお,コミットログを全て取得する必要があるため5GBぐらいディスクを開けておく必要があります.

1
2
3
4
5
git clone https://git.haru3.me/haru/linux-stable-dsm232.git # 時間かかります
cd linux-stable-dsm232
git remote add upstream https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
git fetch upstream linux-5.15.y
git merge upstream/linux-5.15.y

付録2: Raspbianを使う

昔のメモなので正しく使えるかは不明

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#予め/mntにUSBメモリをマウントしておいて下さい
sudo apt-get install -y qemu-user-static debootstrap git
sudo debootstrap --include=ca-certificates,apt,wget,nano --foreign --arch=armhf bullseye /mnt/ http://archive.raspbian.org/raspbian
sudo chroot /mnt debootstrap/debootstrap --second-stage --verbose
sudo chroot /mnt bash #raspbianにchroot
passwd #rootパスワード設定
echo 'hostname' > /etc/hostname
#aptで好きなパッケージをインストール・設定
exit #chrootを抜ける
umount /mnt