💻

Milk-V Duo 256M用のOSイメージの自作

2024/05/02に公開

前回公式OSイメージを焼いてインストール&起動まで試してみました。
公式イメージのOSだとパーティションが752MBしか認識してなかったのと、拡張するためにはOSを自分でビルドするしかなさそうだったので、今回は実際にOSビルドを試してみました。

Milk-V Duo 256M版のOSを作成する

まず、Dockerが動作するLinux PCが必要になります。

OSのビルド方法は、リポジトリをクローンして、build.shを実行すると、対応しているターゲットが一覧表示される。ここでターゲットを選んでビルドするだけで良さそう。気の利いた作りになっている。

> git clone https://github.com/milkv-duo/duo-buildroot-sdk.git --depth=1
> cd duo-buildroot-sdk

> ./build.sh
Usage:
./build.sh              - Show this menu
./build.sh lunch        - Select a board to build
./build.sh [board]      - Build [board] directly, supported boards as follows:
milkv-duo
milkv-duo-spinand
milkv-duo-spinor
milkv-duo256m
milkv-duo256m-spinand
milkv-duo256m-spinor
milkv-duos-emmc
milkv-duos-sd

今回はmilkv-duo256mをターゲットとするが、ビルド環境がDockerで用意されているのでそれを利用する。duo-buildroot-sdkディレクトリに移動して、カレントディレクトリをマウントして、Milk-Vのビルド用コンテナ?を起動する。

> docker run -itd --name duodocker -v $(pwd):/home/work milkvtech/milkv-duo:latest /bin/bash

Unable to find image 'milkvtech/milkv-duo:latest' locally
latest: Pulling from milkvtech/milkv-duo
43f89b94cd7d: Downloading [===========================================>       ]  26.22MB/30.44MB
0bbaee5473cd: Downloading [===>                                               ]  17.74MB/238.1MB
d1f312f4c88d: Download complete
:

> docker ps -a

CONTAINER ID   IMAGE                        COMMAND       CREATED         STATUS         PORTS     NAMES
712a8f1d9989   milkvtech/milkv-duo:latest   "/bin/bash"   5 seconds ago   Up 3 seconds             duodocker

コンテナの起動が完了したら、以下のコマンドでビルドを行う。40コアぐらいあるワークステーションでビルドしても最初は10-20分ぐらいかかった気がする。

成功すると、outディレクトリにイメージが出力される。

> docker exec -it duodocker /bin/bash -c "cd /home/work && ./build.sh milkv-duo256m"
:
INFO: hdimage(milkv-duo256m.img): adding partition 'boot' (in MBR) from 'boot.vfat' ...
INFO: hdimage(milkv-duo256m.img): adding partition 'rootfs' (in MBR) from 'rootfs.ext4' ...
INFO: hdimage(milkv-duo256m.img): writing MBR
gnimage for milkv-duo256m success!
/home/work/build
/home/work
Create SD image successful: out/milkv-duo256m-20240502-1503.img

パーティションサイズを指定して再ビルドする。

デフォルトの状態でビルドできることが確認できたので、SDカードに焼いて起動して、パーティションどうなっているか、今一度確認してみた。

> lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
mmcblk0     179:0    0 29.8G  0 disk
├─mmcblk0p1 179:1    0  128M  0 part
└─mmcblk0p2 179:2    0  768M  0 part /

当然、結果はリリースされているものと全く同じであった。

ここから本題で、ビルドツール内には、genimage.cfgというファイルがあって、この設定ファイルに上記のパーティションサイズが指定されている。このサイズを編集してOSを再作成すると希望するサイズのイメージになるはず。

ターゲット毎でフォルダが分かれているので注意。

> cd duo-buildroot-sdk
> vi ./device/milkv-duo256m/genimage.cfg

32GBにおいて、最適なサイズが分からが、とりあえず768M28672M(128の倍数かつ32GB未満)に変更

diff --git a/device/milkv-duo256m/genimage.cfg b/device/milkv-duo256m/genimage.cfg
index 027bde1eb..7b917edfc 100644
--- a/device/milkv-duo256m/genimage.cfg
+++ b/device/milkv-duo256m/genimage.cfg
@@ -13,7 +13,7 @@ image rootfs.ext4 {
        ext4 {
                label = "rootfs"
        }
-       size = 768M
+       size = 28672M
 }

これで再度ビルドする。

> docker exec -it duodocker /bin/bash -c "cd /home/work && ./build.sh milkv-duo256m"
:
Create SD image successful: out/milkv-duo256m-20240502-1555.img

29GBのOSができた。

> ls -lh out
total 839M
-rw-r--r-- 1 root root 897M  52 16:03 milkv-duo256m-20240502-1503.img
-rw-r--r-- 1 root root   29G  52 17:20 milkv-duo256m-20240502-1620.img

でかいのでzip化してからDLする。

自作OSで起動

今までと同じように、SDに焼いてMilk-Vを起動してみる。

ログインしてストレージのサイズを確認。ちゃんとパーティションのサイズが確保されている。

> lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
mmcblk0     179:0    0 29.8G  0 disk
├─mmcblk0p1 179:1    0  128M  0 part
└─mmcblk0p2 179:2    0   28G  0 part /

> df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        28G  799M   26G   3% /
devtmpfs         83M     0   83M   0% /dev
tmpfs            84M     0   84M   0% /dev/shm
tmpfs            84M   48K   83M   1% /tmp
tmpfs            84M   28K   83M   1% /run

ホントは、公式のイメージを焼いた後で、LinuxのPCでマウントした後で、パーティションサイズをコマンドで変更するのが正解じゃないかと思いましたが、一応やれましたということで。

Discussion