ジャンル不定の日記です。

linux 5.4.12でBuildrootし直した

Orange pi R1ルーター化計画でSPIフラッシュにのるサイズまでOSサイズを削減しようとしてSquashfsを使おうとしたがつまずいたので、まだできてない。
とりあえず5.4.12でBuildrootできた。

最初 Buildroot のmenuconfigで
Kernel Version ---> Latest version (5.4)
にしてやってみたが、これだと5.4.10になった。先日gitからkernelビルドやったときは5.4.11だったので下がってる。
だが、kernelバージョンが変わったときは、
Toolchain ---> Custom kernel headers series (5.3.x)
となってるところを5.4に変えないとmakeがかなり進んでからエラーになった。

で、やり直しの際に、Kernel Versionをgit URLにすることができることに気づいたので5.4.11にしようと思った。
その場合は Custom repository version がブランチ名になるみたい。わかりにくい・・・
でやってみたが、depth指定の方法がわからなく、大量に持ってこようとしてたので強制終了した。

次にtarballのURL指定ができることがわかったのでtarballで指定したが、最新stableが5.4.12に増えてたので5.4.12にした。
ビルドする際、squashfsとinitramfsを作成しようと思って、ext2/3/4のチェックは要らないと思ったので外した。
そしたらimageを作る最終段階でエラー。
squashfsのイメージはできあがったので、それをextで作ったパーティションイメージにコピーして起動しようとしたが起動できなかった。
それでinitramfs経由で起動を試みたりして時間食ったが、断念した。

再度のBuildrootし直しで、
Kernel version (Custom version)
(5.4.12) Kernel version
とすれば5.4.12でBuildrootできることがわかった。
のでmakeしたのだが、最初と同じくToolchain ---> Custom kernel headers series (5.3.x)のままやっちゃって止まった。
のでまたやり直しとなった。

時間かかったが、とりあえず5.4.12で起動するイメージは作成できた。
前回見つからなかったので入れなかったが sudo があったので入れた。
iptablesの後継のnftablesなるものがあったのでiptablesを置き換えてみた。
容量行けそうなんでlighttpd入れた。
のだが前回13MBだったが17MBに増えた。
lighttpdよりuhttpdのが小さそうな気がするが、Archにパッケージがないレベルでマイナーみたいなのでlighttpdにした。
あまり容量に余裕はないか?

Squashfsでどの程度サイズが減るのか確認してみた

Orange pi R1用OSをSPIフラッシュにのせるために16MB未満への容量削減を考えてるが、
一般的な圧縮ファイルシステムは読み込み専用な模様。
読み込み専用のファイルシステムを/に使うなら書き込み可能なファイルシステムを重ねる必要がある。
というわけで、いくつか選択肢はあるようだがカーネルにoverlayfsという重ねるFSはあり、圧縮の方はSquashfsというのがよく使われるぽい。

まず、Squashfsで圧縮した場合、目的が達成できそうか確認のために、Buildrootで作ったext4のrootfsをSquashfsにしてみた。

$ df
ファイルシス   1K-ブロック      使用     使用可 使用% マウント位置
.
.
.
/dev/sdg2            55397     13211      37886   26% /home/user/stock/sbc/opi-r1/mnt
ext4のSDカードをマウントしたが13MB強。
kernelとかは別なんでこれでは16MBをオーバーしちゃう。

$ sudo mksquashfs mnt squashfs.img
$ sudo umount mnt
$ sudo mount squashfs.img mnt
$ df
ファイルシス   1K-ブロック      使用     使用可 使用% マウント位置
.
.
.
/dev/loop0            4864      4864          0  100% /home/user/stock/sbc/opi-r1/mnt
4.8MBまで減った!
mksquashfs は ソースディレクトリと出力イメージファイルを引数にすればgz圧縮してくれるみたい。
他の圧縮タイプも選べる感じ。

Buildrootをやってみた

Orange pi R1のOSをSPIフラッシュに入る16MB未満で作りたいと考えてるが、
コマンド群をまとめる BusyBox は必要と思われる。BusyBoxならinitとかコンソールもまとめて置き換えられる。
BusyBoxのサイト見てたら、uClibcなるものを知った。glibcを置き換えるものでこれも必須ぽい。
さらに、BusyBoxとuClibcでrootfsを作るというBuildrootというものを知ったのでやってみた。

すごく簡単にu-boot linux rootfsを全部作れちゃう。
アプリが何も入ってないディストリビュージョンみたいな感じ。

$ git clone git://git.buildroot.net/buildroot --depth=1
$ make orangepi_r1_defconfig
$ make menuconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi-
これでSD用のimageが出来上がるんでddで書き込むだけ。

menuconfigではとりあえず、
Toolchain --->
 Enable WCHAR support
System configuration --->
 (0000) Root password
 [*] Install timezone info
Target packages --->
 Networking applications --->
  [*] dnsmasq
  [*] dhcp support
  [*] hostapd
    [*] iptables
  [*] openssh
  [*] pppd
 Text editors and viewers --->
  [*] nano
ここだけいじった。
BusyBoxだけでviもどきが使えると思うが、viは使いこなせないのでnanoを選択したが、nanoにWCHAR supportが必要。
ルーター用なんで dnsmasq hostapd iptables pppd openssh を選択した。
RTL8152Bは標準で入るんでeth1は有効になるがwlan0は出てこないんで8189esは別途ビルドが必要そう。
kernelバージョンは標準で5.3.12だったが変更もできそうな感じ。

SDカード用のイメージは標準で60MBになるが、
/boot 10MB
/ 55MB
くらい?
/の使用済みは13MB強だった。

wlan0 出てきた!

かなり苦戦したが、Orange pi R1 の自ビルドカーネルでwlan0出てきた。
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 02:42:87:c2:e6:34 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.106/24 brd 192.168.2.255 scope global dynamic eth0
       valid_lft 22828sec preferred_lft 22828sec
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether c0:74:2b:ff:da:7b brd ff:ff:ff:ff:ff:ff
4: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 7c:a7:b0:81:a5:6f brd ff:ff:ff:ff:ff:ff

Orange pi R1 のwifiチップは RTL8189FTV なんで最初 https://linux-sunxi.org/Wifi#RTL8189FTV 参考に、
$ git clone https://github.com/jwrdegoede/rtl8189ES_linux.git
$ cd rtl8189ES_linux.git git checkout -B rtl8189fs origin/rtl8189fs
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- KSRC=../linux
とやって8189fs.koを作ったが、8189fsはロードできるのだがwlan0が出てこなかった。
これのビルドの際にはkernelのmenuconfigで作れるがcfg80211が必要。

RTL8189FTVはSDIOデバイスのようなので、SDIO関連のモジュール入れたり、他のRealtekドライバ入れたり試してみたが解決しなかった。
その際にR1の有線LANの片方はRTL8152Bなんでそれも有効にしたんでeth1は出るようになった。

wlan0が出てくるArmbian確認したらKernel 5.4.8でモジュールは8189fsではなく8189esだった。
kernelバージョン近いし手段はありそうだが・・・
5.4.8のカーネルを自ビルドしてArmbianのモジュールを流用しようか・・・

とか考えてたが、
モジュール作成の際にRTL8189FTVモジュールのビルド手順でブランチをmasterからrtl8189fsに切り替えて8189.fsができあがったが、
$ git checkout master
$ make clean
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- KSRC=../linux
としてmasterブランチに切り替えてやり直してみた。
そうすると8189es.koが出来上がる。
これいれたらwlan0でてきた。

8189fs.ko のビルドはできたのだが・・・

8189fs.ko のビルドはできた。
linuxのmenuconfigで無線を有効にしなきゃいけなかった。

↑こんな感じにしてカーネルのビルドをやり直した。
だが、まだ調整必要だから、ここは*にしてカーネルに組み込むんじゃなくてMにしてモジュールにするんだった。

そして、モジュールは1個もないが、
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- modules
する必要があった。
これするとモジュール以外に modules.order と modules.builtin ができる。
これを /lib/modules/5.4.11 に置かないと depmod ができない。

カーネルの再ビルドしたあとは 8189fs のビルドはすんなりいった。
8189fs.ko も/lib/modules/5.4.11 に置いた。

# depmod -a
# modprobe 8189fs
でモジュールのロードはできたぽい。

が、wlan0とかインターフェイス何も出てこない・・・
あと、eth0はあるけどeth1がないね。
これもなんかモジュールいるね。