Nexus 7 のカーネルをビルド、あとCIFSとか。

先週末、AdoramaからNexus 7が届いた。

Nexus 7

初めてまともに買ったNexusなので、とりあえず基礎から。
公式の方法でAOSPのSource treeからkernelをbuildしてみる。

以下、てきとーにVM上のUbuntuで。

mkdir ~/android
cd ~/android
git clone https://android.googlesource.com/platform/prebuilt
git clone https://android.googlesource.com/kernel/tegra.git kernel/grouper
cd kernel/grouper
git checkout android-tegra3-grouper-3.1-jb-fr2

で、実機からconfigファイルを取り出す。

adb pull /proc/config.gz
cat config.gz | gunzip > arch/arm/configs/grouper_defconfig

またはビルド済みのboot.imgから

scripts/extract-ikconfig boot.img > .config

で取り出せるらしい。

export PATH=~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
make grouper_defconfig
make -j4

で完成。最後の-jオプションは適当な値。
kernelはarch/arm/boot/zImageに出力される。

これでkernelはいいんだけど、
今回はとりあえずNAS用にmoduleが欲しいので、

make menuconfig

File systems –> Network File Systems –> CIFS support
File systems –> Native language support –> NLS UTF-8

を<M>にした。ちなみに<ESC><ESC>で前の画面に戻れる。で、

make modules

してやると

crypto/md4.ko
fs/cifs/cifs.ko
fs/nls/nls_utf8.ko

にそれぞれ出力されるが、adb pushしてsuしてinsmodすると、Exec format errorになった。
dmesgによると

dmesg | busybox grep cifs

cifs: version magic ‘3.1.10-g55edff4 SMP preempt mod_unload ARMv7 ‘ should be ‘3.1.10-g52027f9 SMP preempt mod_unload ARMv7 ‘

ということで、version magicが違うとダメらしい。
そういやOTAでアップデートあったな。
ググったらAndroidはmodprobeはダメなので、.configの数字を合わせろ、とのこと。
ここで徐にHex Editorで開いて「vermagic」で検索して「g52027f9」に書き換えたらokだった。
(CONFIG_LOCALVERSIONの値を指定したら+がついてinsmodできなくて諦めた)

で、本日の成果が以下

mkdir /sdcard/cifs
mount -r -t cifs //192.168.1.x/<ShareDir> /sdcard/cifs -o username=<username>,password=<password>,iocharset=utf8

でマウント

busybox umount -l /sdcard/cifs

でアンマウント。
(-lオプションを付けないとbusyでアンマウントできないのは何故??)

欲しい人はこちらからどうぞ
3.1.10-g52027f9専用で

「Nexus 7 のカーネルをビルド、あとCIFSとか。」への1件のフィードバック

  1. ピンバック: NEXUS 7 自分でモジュールをbuildするメモ » treffen @ memo

コメントは受け付けていません。