Edited at

Raspberry PiカーネルをSainsmart1.8"TFT用にクロスコンパイル

More than 5 years have passed since last update.

Raspberry Piで携帯パトランプを作る (障害アラート通知)を実現する為に

Raspberry PiのカーネルをSainsmart1.8"TFTが認識できるモノに再構築する必要があり、

Raspberry Pi上でリビルドすると死ぬほど遅いし、ローカルVM上にubuntu環境作るのも手間だったので、

EC2上に、vagrantでササっとubuntu環境を構築して、そこでクロスコンパイルする事にした。

※結局、コンパイル済みのカーネルがWeb上に転がっていたので、

 同じ作業をする事はないとは思うのだけれども、せっかくなのでコマンドログとして

 残しておく事に。


EC2に作業用仮想マシン(ubuntu)の作成

Vagrantファイルの記述は、下記の通り。

そのままではないので適宜、読み替えてください。

※ubuntuの場合は、ssh.usernameを"ubuntu"にすることを知らず、若干ハマりました…

※ちなみに、CentOSの時は ssh.username="root" となる模様

ie4@local_pc:ubuntu$

ie4@local_pc:ubuntu$ vagrant box list
awsbox (aws)
ie4@local_pc:ubuntu$
ie4@local_pc:ubuntu$
ie4@local_pc:ubuntu$ cat Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.vm.box = "awsbox"

config.vm.provider :aws do |aws, override|
aws.access_key_id = 'アクセスキーID'
aws.secret_access_key = 'シークレットアクセスキー'
aws.region = 'ap-northeast-1'
aws.instance_type = 'm3.large'
aws.ami = 'ami-97fab396'
aws.security_groups = ['work_server']
aws.keypair_name = 'local_pc'
aws.tags = {
'Name' => 'ubuntu'
}
override.ssh.username = "ubuntu"
override.ssh.private_key_path = '~/.ssh/id_rsa.aws'
end

end
ie4@local_pc:ubuntu$
ie4@local_pc:ubuntu$ vagrant up --provider=aws

インスタンスの生成が完了したら、

AWS マネジメントコンソールで、該当インスタンスのグローバルIPアドレスをチェックしておきます。


作業用仮想マシン(ubuntu)で、作業

インスタンスが起動したら、ログインします。

ie4@local_pc:ubuntu$ vagrant ssh

以下、EC2上のプロンプト表記を

簡略化するためにubuntu@ec2:~$のように記載していきますが、

実際はubuntu@ip-123-123-123-123:~$のような表記になっています。

Raspberry Piから、scpでファイルをやり取りできるように

パスワードログインを許可します。

※本来はkey_pairの方が良いのかもしれませんが、すぐ破棄する予定なのでPW認証で良しとします

Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-29-generic x86_64)

-- snip --

ubuntu@ec2:~$ sudo -i
root@ec2:~#
root@ec2:~# passwd ubuntu
root@ec2:~# vi /etc/ssh/sshd_config

# PasswordAuthentication no
PasswordAuthentication yes

root@ec2:~# apt-get update
root@ec2:~# apt-get install gcc-arm-linux-gnueabi make git-core ncurses-dev
root@ec2:~# reboot


ラズパイで作業

pi@raspberrypi ~ $ sudo -i

root@raspberrypi ~ # wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update
root@raspberrypi ~ # chmod +x /usr/bin/rpi-update
root@raspberrypi ~ # rpi-update
root@raspberrypi ~ # zcat /proc/config.gz > config
root@raspberrypi ~ # scp config ubuntu@(EC2のグローバルIPアドレス):~/


作業用仮想マシン(ubuntu)で、作業



ubuntu@ec2:~$ sudo -i
root@ec2:~# git clone git://github.com/kamalmostafa/raspberrypi-linux.git
root@ec2:~# cd raspberrypi-linux
root@ec2:~# mv /home/ubuntu/config .config
root@ec2:~# make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig

※すべてデフォルトを選択

root@ec2:~# egrep "CONFIG_SPI_BCM2708[ =]|CONFIG_FRAMEBUFFER_CONSOLE[ =]|CONFIG_FRAMEBUFFER_CONSOLE_ROTATION[ =]|CONFIG_FONTS[ =]|CONFIG_FONT_8x8[ =]|CONFIG_FONT_8x16[ =]|CONFIG_LOGO[ =]" .config

CONFIG_SPI_BCM2708=m
CONFIG_FRAMEBUFFER_CONSOLE=y
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_LOGO=y

root@ec2:~# sed -i "s/^\(CONFIG_SPI_BCM2708=\)\w/\1y/g" .config
root@ec2:~# vi .config
root@ec2:~#
root@ec2:~# egrep "CONFIG_SPI_BCM2708[ =]|CONFIG_FRAMEBUFFER_CONSOLE[ =]|CONFIG_FRAMEBUFFER_CONSOLE_ROTATION[ =]|CONFIG_FONTS[ =]|CONFIG_FONT_8x8[ =]|CONFIG_FONT_8x16[ =]|CONFIG_LOGO[ =]" .config

CONFIG_SPI_BCM2708=y
CONFIG_FRAMEBUFFER_CONSOLE=y
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
# CONFIG_FONTS is not set
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
CONFIG_FONTS=y
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_LOGO=y

root@ec2:~#
root@ec2:~# diff .config{,.bkup}

1538c1538
< CONFIG_SPI_BCM2708=y
---
> CONFIG_SPI_BCM2708=m
2294,2295d2293
< CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
< CONFIG_FONTS=y

root@ec2:~#
root@ec2:~# make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k

※すべてデフォルトを選択 (所要時間:m3largeで約15分)

root@ec2:~#
root@ec2:~# mkdir ../modules
root@ec2:~# make modules_install ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- INSTALL_MOD_PATH=../modules/
root@ec2:~# rm -f -r ../modules/lib/modules/3.6.11+/build
root@ec2:~# rm -f -r ../modules/lib/modules/3.6.11+/source
root@ec2:~#
root@ec2:~# cp arch/arm/boot/Image /home/ubuntu/Image
root@ec2:~# chown ubuntu:ubuntu /home/ubuntu/Image
root@ec2:~# cp -r ../modules /home/ubuntu/
root@ec2:~# chown -R ubuntu:ubuntu /home/ubuntu/modules
root@ec2:~#


ラズパイで作業

pi@raspberrypi ~ $ sudo -i

root@raspberrypi ~ # cp /boot/kernel.img{,.bkup}
root@raspberrypi ~ # scp ubuntu@(EC2のグローバルIPアドレス):~/Image /boot/kernel.img
root@raspberrypi ~ # rm -f -r /lib/modules
root@raspberrypi ~ # rm -f -r /lib/firmware
root@raspberrypi ~ # scp -r ubuntu@(EC2のグローバルIPアドレス):~/modules/lib /
root@raspberrypi ~ # reboot


作業用仮想マシン(ubuntu)の破棄

貧乏人なので、使わなくなったインスタンスは、さっさと削除します。(急げ急げ…)

root@ec2:~# logout

ubuntu@ec2:~$ logout
Connection to 123.123.123.123 closed.

ie4@local_pc:ubuntu$

ie4@local_pc:ubuntu$ vagrant destroy
Are you sure you want to destroy the 'default' VM? [y/N] y
[default] Terminating the instance...
ie4@local_pc:ubuntu$

以上。