目次

Java 領域を(大幅に)縮小して root filesystem 領域を広げる

ファームウェアの構造 にあるとおり、Java(JRE) の領域がかなりの割合を占めています。
Java を使用しない場合、この領域を root filesystem に割り当てて、より多くのパッケージや自作のアプリケーションを入れたいということもあると思います。

カスタム bootloader に入れ替えることで、256MiB NAND Flash を搭載した標準品でも、root filesystem のサイズを 80MiB → 95MiB に拡大することができます。


更新の手順

ファームウェアを入れた SDcard の準備

NAND Flash のパーティション構造を変更する途中で全消去するため、bootloader からファームウェアを書き込む必要があります。
そのため、SDcard にファームウェアを書き込んで実機に挿入しておきます。

※ ファームウェアに含まれている barebox.bin.img は除去しておきます。


bootloader の更新

bootloader のみ更新するファームウェアを適用します。

File Stat SHA1SUM Note
java-less-bootloader.img2019/07/05 17:31 245.5 KB134e350fdb66425c576eef12fc7a4c438163b9a6


root@plum:~# firmup /tmp/java-less-bootloader.img 
### MA-E3xx series firmware update utility (for 2-area firmware).
Updating Area: 1 ...
* Bootloader file found.
  writing "barebox.bin" image to /dev/mtd13 ... succeeded.
  erasing bootloader environments (/dev/mtd14)... done.
Succeeded.


再起動

bootloader で作業する必要があるので、コンソールを接続した上で再起動します。

root@plum:~# reboot

Session terminated, terminating shell... ...terminated.


bootloader で止める

bootloader でキー入力待ちの間にキーを押して自動起動を停止させます。

...
registering /dev/ubi0
registering kernel.0 as /dev/ubi0.kernel.0
registering kernel.1 as /dev/ubi0.kernel.1
registering initramfs.0 as /dev/ubi0.initramfs.0
registering initramfs.1 as /dev/ubi0.initramfs.1
registering kmod.0 as /dev/ubi0.kmod.0
registering kmod.1 as /dev/ubi0.kmod.1
registering rootfs.0 as /dev/ubi0.rootfs.0
registering rootfs.1 as /dev/ubi0.rootfs.1
registering opt as /dev/ubi0.opt
registering overlay as /dev/ubi0.overlay
UBI: attached mtd0 (name "nand0.UBI", size 255 MiB) to ubi0
UBI: PEB size: 131072 bytes (128 KiB), LEB size: 129024 bytes
UBI: min./max. I/O unit sizes: 2048/2048, sub-page size 512
UBI: VID header offset: 512 (aligned 512), data offset: 2048
UBI: good PEBs: 2040, bad PEBs: 0, corrupted PEBs: 0
UBI: user volume: 10, internal volumes: 1, max. volumes count: 128
UBI: max/mean erase counter: 2/0, WL threshold: 4096, image sequence number: 9489
UBI: available PEBs: 0, total reserved PEBs: 2040, PEBs reserved for bad PEB handling: 40

Hit m for menu or any other key to stop autoboot:  1

type exit to get to the menu
barebox@plum-ma[1GiB]:/


bootloader での作業

UBI のデタッチ

barebox@plum-ma[1GiB]:/ ubidetach ubi0
UBI: detaching mtd0 from ubi0
removing ubi0
UBI: mtd0 is detached from ubi0


NAND 消去

barebox@plum-ma[1GiB]:/ erase /dev/nand0


UBI フォーマット

barebox@plum-ma[1GiB]:/ ubivol_init 2
ubiformat: /dev/nand0.UBI (nand), size 267386880 bytes (255 MiB), 2040 eraseblocks of 131072 bytes (128 
KiB), min. I/O size 2048 bytes
libscan: scanning eraseblock 2039 -- 100 % complete  
ubiformat: 2040 eraseblocks are supposedly empty
ubiformat: formatting eraseblock 2039 -- 100 % complete  
UBI: attaching mtd0 to ubi0
UBI: scanning is finished
registering /dev/ubi0
UBI: attached mtd0 (name "nand0.UBI", size 255 MiB) to ubi0
UBI: PEB size: 131072 bytes (128 KiB), LEB size: 129024 bytes
UBI: min./max. I/O unit sizes: 2048/2048, sub-page size 512
UBI: VID header offset: 512 (aligned 512), data offset: 2048
UBI: good PEBs: 2040, bad PEBs: 0, corrupted PEBs: 0
UBI: user volume: 0, internal volumes: 1, max. volumes count: 128
UBI: max/mean erase counter: 0/0, WL threshold: 4096, image sequence number: 3639
UBI: available PEBs: 1996, total reserved PEBs: 44, PEBs reserved for bad PEB handling: 40
registering kernel.0 as /dev/ubi0.kernel.0
registering kernel.1 as /dev/ubi0.kernel.1
registering initramfs.0 as /dev/ubi0.initramfs.0
registering initramfs.1 as /dev/ubi0.initramfs.1
registering kmod.0 as /dev/ubi0.kmod.0
registering kmod.1 as /dev/ubi0.kmod.1
registering rootfs.0 as /dev/ubi0.rootfs.0
registering rootfs.1 as /dev/ubi0.rootfs.1
registering opt as /dev/ubi0.opt
registering overlay as /dev/ubi0.overlay


領域のサイズを確認してみます。

barebox@plum-ma[1GiB]:/ ls -l /dev/ubi0*
c---------          0 /dev/ubi0
crw-------    2193408 /dev/ubi0.initramfs.0
crw-------    2193408 /dev/ubi0.initramfs.1
crw-------    4257792 /dev/ubi0.kernel.0
crw-------    4257792 /dev/ubi0.kernel.1
crw-------    2193408 /dev/ubi0.kmod.0
crw-------    2193408 /dev/ubi0.kmod.1
crw-------     387072 /dev/ubi0.opt
crw-------   40384512 /dev/ubi0.overlay
crw-------   99735552 /dev/ubi0.rootfs.0
crw-------   99735552 /dev/ubi0.rootfs.1
barebox@plum-ma[1GiB]:/ 

rootfs.* のサイズが 99735552bytes (95.1MiB) になっていることが確認できました。


ファームウェアの書込

SDcard に入れておいたファームウェアを書き込みます。

barebox@plum-ma[1GiB]:/ firmup /boot/mae3xx_bionic_v4_2_1rc1.img 0
### MA-E3xx series firmware updater
firm area to write: 0
firm_dual:          1
* image file for "kernel" found.
  copying kernel image to /dev/ubi0.kernel.0 ...
* image file for "kmod" found.
  copying kmod image to /dev/ubi0.kmod.0 ...
* image file for "initramfs" found.
  copying initramfs image to /dev/ubi0.initramfs.0 ...
* image file for "rootfs" found.
  copying rootfs image to /dev/ubi0.rootfs.0 ...
* image file for "dtb" found.
  erasing /dev/spi.dtb.0 ...
  copying dtb(DeviceTree) image to /dev/spi.dtb.0 ...
update finished.
barebox@plum-ma[1GiB]:/ 

opt のファイルが入っていてもスキップするようになっています。


起動

新しいファームウェアで起動するためにリセットします。

barebox@plum-ma[1GiB]:/ reset


barebox 2013.12.0-gc51c3f4 #3 Tue Mar 11 18:24:49 JST 2014


Board: plum-ma[1GiB]
m25p80 m25p800: m25p16 (2048 Kbytes)
booting from SPI


barebox 2013.12.0-00438-gb5233a419 #882 Fri Jun 28 14:28:42 JST 2019


Board: plum-ma[1GiB]
nand: ONFI param page 0 valid
...


Linux から UBI のサイズを確認すると、root filesystem 領域が大きくなっていることが確認できます。

user1@plum:~$ cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 0ff00000 00020000 "UBI"
mtd1: 00100000 00020000 "OOPS"
mtd2: 0040f800 0001f800 "kernel.0"
mtd3: 0040f800 0001f800 "kernel.1"
mtd4: 00217800 0001f800 "initramfs.0"
mtd5: 00217800 0001f800 "initramfs.1"
mtd6: 00217800 0001f800 "kmod.0"
mtd7: 00217800 0001f800 "kmod.1"
mtd8: 05f1d800 0001f800 "rootfs.0"  <---
mtd9: 05f1d800 0001f800 "rootfs.1"  <---
mtd10: 0005e800 0001f800 "opt"
mtd11: 02683800 0001f800 "overlay"
mtd12: 00020000 00010000 "MLO"
mtd13: 00080000 00010000 "barebox.bin"
mtd14: 00020000 00010000 "barebox.env"
mtd15: 00020000 00010000 "dtb.0"
mtd16: 00020000 00010000 "dtb.1"
mtd17: 00020000 00010000 "hist_firmup"
mtd18: 000e0000 00010000 "hist_boot"