Linux Kernelクロスコンパイル環境:Host(Debian9)/Target(Raspberry Pi3)の環境構築


前書き

GitBookを使用しなくなったため、GitBookに書いていた環境構築手順を転記しました。
この記事で説明する環境は、Raspberry Pi3を用いてLinux Kernel(Device Driver)を
勉強するために構築しています。

目次

  • Raspberry Pi 公式サイト・ツール
  • Raspberry Pi3 HARDWARE仕様
  • 開発環境
  • Device Driver動作検証用機器
  • HOST開発環境構築
  • Target開発環境構築(無線設定、周辺機器設定など)
  • Raspberry Piの環境構築関連の自作記事

Raspberry Pi 公式サイト・ツール

項目 URL
公式サイト https://www.raspberrypi.org
公式Linux OS https://www.raspberrypi.org/downloads/raspberry-pi-desktop/
公式Linux Kernel https://github.com/raspberrypi/linux
公式Toolchain https://github.com/raspberrypi/tools

Raspberry Pi3 HARDWARE仕様

詳細は、公式サイト「RASPBERRY PI HARDWARE」を参照。

項目 仕様
名称(モデル) Raspberry Pi3(Model B)
SoC Broadcom BCM2836
CPU(コア数、周波数) ARM Cortex A53(4コア、1.2GHz)
ARMアーキテクチャ ARMv8(64bit)
RAM 1GB
GPU Broadcom VideoCore Ⅳ
映像入力 15ピンMIPIカメラインターフェース(MIPI CSI-2)
映像出力 コンポジットRCA、HDMI1.3/1.4
音声入力 I2S
音声出力 3.5mmジャック、HDMI、I2S
Network Broadcom BCM43143、IEEE802.11 b/g/n2.4GHz、Bluetooth4.1、BLE
Peripheral Interface GPIO40ピン(SPI、I2S、UART)
ストレージ microSD

開発環境

Raspberry Pi3以外の機器は、以下の表に記載していない機器で代用可能です。

項目 機器/Version 用途・備考
ホストPC Intel NUC(BOXNUC613SYK、Cortex i3、メモリ32GB) Raspberry Pi3向けのLinux Kernelソースコード解析およびクロスコンパイルに使用
ホストOS Debian9.4(stretch) Raspberry Pi3と同じDebian系ディストリビューション(Ubuntu、Debian等)が望ましい
モニタ ASUS VZ249H
ターゲット環境 Raspberry Pi3 Model B 各種Deviceの検証に使用
ターゲット OS RASPBIAN STRETCH WITH DESKTOP(Ver September 2017) 2017年10月時点の最新版を選定
ターゲットOS Linux Kernel version 4.9 ホストOSと同様のVersion
ストレージ(ターゲット) MicroSDカード(Silicon Power、16GB) Class10、容量8GB以上を推奨
MicroSDカードリーダ マルチカードリーダ(ELECOM)
電源(ターゲット) microUSB - USBケーブル、iPad mini2用のUSB充電器
映像/音声 HDMIケーブル(PS4付属品)
入出力装置 キーボード、マウス ホスト環境、ターゲット環境向けに用意

Device Driver動作検証用機器

以下は、個人的な検証用の機器であり、本記事の環境構築に必要ではありません。

項目 機器名称 販売元 参考価格(送料別)
シリアル通信 Adafruit PiUART Pimoroni 約800円
カメラ Raspberry Pi Camera V2 Amazon 約3,500円
USBガジェット Cluster HAT v2 Pimoroni 約3,200円

HOST開発環境構築

HOST環境向けの手順は、/home/pi/以下で実施していると仮定します。

・Linux Kernel開発に必要な各種パッケージのインストール

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential libncurses5-dev device-tree-compiler trace-cmd git bc

・Raspberry Pi3向けLinux Kernelの取得

$ git clone --depth=1 https://github.com/raspberrypi/linux -b rpi-4.9.y

・Raspberry Pi3向けToolchainの取得

$ git clone https://github.com/raspberrypi/tools

・ToolchainへのPATHを設定

$ echo "export PATH=$PATH:/home/pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin" \
>> /home/pi/.bashrc

・ビルド速度を早めるため、ccacheをインストール・設定

$ sudo apt-get install ccache
$ echo "export USE_CCACHE=1"         >> ~/.bashrc   (注釈) ccacheの使用宣言
$ echo "export CCACHE_DIR=~/.ccache" >> ~/.bashrc   (注釈) キャッシュの格納先
$ ccache -M 10G                                     (注釈) キャッシュサイズの変更

・クロスコンパイル実施(任意)

$ source ~/.bashrc        (注釈) 前手順で追加した設定を反映します。通常、.bashrcはターミナル起動時に読み込まれます。
$ cd /home/pi/linux
$ KERNEL=kernel7
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
$ make -j2 ARCH=arm CROSS_COMPILE="ccache arm-linux-gnueabihf-" zImage modules dtbs

Target開発環境構築

ホスト環境およびターゲット環境における手順は、/home/pi/以下で実施していると仮定します。

Raspberry Pi公式サイトより、RASPBIAN(OS)をZIP形式で取得

・MicroSDカードをカードリーダに挿入し、カードリーダとホストPCを接続

$ sudo dmesg   (注釈) dmesgのmicroSDのデバイスファイル名を確認(通常、mmcblk[0-9]か/dev/sd[a-z])
(省略)
[ 2282.788314] mmc0: new ultra high speed SDR104 SDHC card at address 59b4
[ 2282.792324] mmcblk0: mmc0:59b4 SPCC  14.7 GiB

・ホストPC上で、microSDをフォーマットし、VFATファイルシステムを作成

$ sudo fdisk /dev/mmcblk0

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/mmcblk0: 14.8 GiB, 15836643328 bytes, 30930944 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device         Boot Start      End  Sectors  Size Id Type
/dev/mmcblk0p1       8192 30930943 30922752 14.8G  c W95 FAT32 (LBA)

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-30930943, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-30930943, default 30930943): 

Created a new partition 1 of type 'Linux' and of size 14.8 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

$ sudo mkfs.vfat /dev/mmcblk0p1

・ホストPC上で、RASPBIAN(OS)をmicroSDにコピー(注:前述の画像とOS Versionが異なります)

$ ls
2017-09-07-raspbian-stretch.zip  Documents  Music     Public                       Templates  linux
Desktop                          Downloads  Pictures  SetupDevelopmentEnvironment  Videos     tools

$ unzip 2017-09-07-raspbian-stretch.zip 
$ sudo dd bs=4M if=2017-09-07-raspbian-stretch.img of=/dev/mmcblk0
$ sync

・Raspberry Pi3にmicroSDカードを挿入し、電源を投入(電源 <-------microUSB-------> Rapberry Pi3)
・Raspberry Pi3のPasswordを変更(初期設定:user=pi、password=raspberry)

$ sudo passwd pi
Enter new UNIX passwd:
Retype new UNIX passwd:
passwd: password updated successfully

$ sudo passwd root
Enter new UNIX passwd:
Retype new UNIX passwd:
passwd: password updated successfully

・Raspberry Pi3の無線環境を設定

$ su
Password:

# vi /etc/dhcpcd.conf    (注釈) 以下の内容を追記
interface wlan0
static ip_address=<設定したい固定IPアドレス(例:192.168.1.100)>/24
static routers=<デフォルトゲートウェイ(例:ルータ)のIPアドレス(例:192.168.1.1)>
static domain_name_servers=<DNSサーバ(例:ルータ)のIPアドレス(例:192.168.1.1)>


# wpa_passphrase <SSID> <PASSWORD> >> /etc/wpa_supplicant/wpa_supplicant.conf
  (注釈) <SSID>、<PASSWORD>は、無線ルータの設定値に変更する事

・Raspberry Pi3の言語設定、タイムゾーン、Wi-Fi Countryを変更

# raspi-config
  [言語設定]
   4 Localisation Options Set up language and regional settings to match your location
   --> I1 Change Locale        Set up language and regional settings to match your location
      --> ja_JP.UTF-8 UTF-8 を選択

  [タイムゾーン]   
  4 Localisation Options Set up language and regional settings to match your location
   --> I2 Change Timezone      Set up timezone to match your location
       --> Asia
           --> Tokyo を選択

  [Wi-Fi Country]
  4 Localisation Options Set up language and regional settings to match your location
   --> I4 Change Wi-fi Country Set the legal channels used in your country 
       --> JP Japan を選択

・Raspberry Pi3の周辺機器設定を変更

# raspi-config
  [周辺機器]
   5 Interfacing Options  Configure connections to peripherals
   --> Camera、SSH、SPI、I2C、Serial、Remote GPIOを有効化

・Raspberry Pi3のmicroSDの使用可能領域を拡大

# raspi-config
  [ファイルシステム]
  7 Advanced Options     Configure advanced settings
  --> A1 Expand Filesystem Ensures that all of the SD card storage is available to the OS

・Raspberry Pi3のパッケージを最新版に更新し、設定変更を反映するために再起動

# apt-get update
# apt-get upgrade
# rpi-update
# reboot

Raspberry Piの環境構築関連の自作記事