2018年11月アーカイブ

RaspbianをSERVERでエミュレーションしてみる。ここを参考にした。

まずは、QEMUをビルドした。Versionは比較的あたらしい3.0.0を用いた。いつものように出来たパッケージはここに置いておく。

次に、QEMU用のカーネル、dtbとRaspbianのイメージを持ってきて起動する。

#!/bin/sh
qemu-system-arm \
-kernel kernel-qemu-4.14.50-stretch \
-cpu arm1176 \
-M versatilepb \
-dtb versatile-pb.dtb \
-m 256 \
-no-reboot \
-serial stdio \
-append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-hda 2018-06-27-raspbian-stretch-lite.img \
-net nic -net user,hostfwd=tcp::10022-:22

とりあえず、起動した。Machineの制限でメモリは256Mまでcpuも1coreまで、開発環境に使うにはいまいち遅い。

QEMUのシステムをaarch64にして-Mをraspi3としてみたが起動しなかった。ここはもう少し様子見。

クレッセントブーケ

| コメント(0) | トラックバック(0)

花材

  • デンファレ
  • ブプレリューム
  • ミスカンサス
  • ミリオン
  • ユーカリ

DSC_0721.JPG

クロスコンパイルでKernelをビルド。スクリプトを見直した。

#!/bin/sh
#Refer to :https://www.raspberrypi.org/documentation/linux/kernel/building.md

MACHINE=zero

PKG=/tmp/kernel

case $MACHINE in 
zero)
   ARCH=arm
   CONFIG_FILE=bcmrpi_defconfig
   LOCALVERSION='+'
   IMAGE_NO=
   TARGET=${TARGET:-'arm-unknown-linux-gnueabi'} 
   DTB=bcm27*rpi*.dtb
   KERNEL_IMAGE=zImage
   ;;
2)
   ARCH=arm
   CONFIG_FILE=bcm2709_defconfig
   LOCALVERSION='+'
   IMAGE_NO=7
   TARGET=${TARGET:-'arm-unknown-linux-gnueabi'}
   DTB=bcm27*rpi-.dtb
   KERNEL_IMAGE=zImage
   ;;
3B|3B+)
   ARCH=arm64
   CONFIG_FILE=bcmrpi3_defconfig
   LOCALVERSION=-${ARCH}
   IMAGE_NO=8
   TARGET=${TARGET:-'aarm64-unknown-linux-gnu'}
   DTB=broadcom/bcm*rpi-3-b*.dtb
   KERNEL_IMAGE=Image
   ;;
esac

PKG=${PKG}_${ARCH}${IMAGE_NO}

KERNEL_VERSION=${KERNEL_VERSION:-'4.19.y'}
#KERNEL_IMAGE=Image
PARALLEL_MAKE='-j8'

checkout() {
echo "Check out git file" 
cd linux
git checkout rpi-${KERNEL_VERSION} 
cd ..
}

clean() {
echo "Clean Linux directory"
cd linux
make -j4 ARCH=$ARCH clean
cd ..
}

config() {
echo "Config with $CONFIG_FILE"
cd linux
make $PARALLEL_MAKE ARCH=$ARCH CROSS_COMPILE=$TARGET- $CONFIG_FILE 
cd .. 
}

make_Image() {
echo "make kernel imege"
cd linux
make $PARALLEL_MAKE ARCH=$ARCH CROSS_COMPILE=${TARGET}- LOCALVERSION=$LOCALVERSION $KERNEL_IMAGE
if [ ! -d ${PKG}/kernel ] ; then
mkdir -p ${PKG}/kernel/boot
fi
cp arch/$ARCH/boot/$KERNEL_IMAGE $PKG/kernel/boot/kernel${IMAGE_NO}.img
cd ..
tar -C ${PKG}/kernel -Jcvf ${PKG}/kernel_${IMAGE_NO}${LOCALVERSION}.tar.xz boot
}

make_dtbs() {
echo "make dtbs"
cd linux
make $PARALLEL_MAKE dtbs ARCH=$ARCH CROSS_COMPILE=${TARGET}- LOCALVERSION=$LOCALVERSION
if [ ! -d $PKG/dtb/boot/overlays ] ; then
mkdir -p $PKG/dtb/boot/overlays
fi 
cp arch/$ARCH/boot/dts/$DTB $PKG/dtb/boot
cp arch/$ARCH/boot/dts/overlays/*dtbo $PKG/dtb/boot/overlays
cd ..
tar -C ${PKG}/dtb -Jcvf ${PKG}/dtb_${IMAGE_NO}${LOCALVERSION}.tar.xz boot 
}

make_modules() {
echo "make modules"
cd linux
make $PARALLEL_MAKE modules ARCH=$ARCH CROSS_COMPILE=${TARGET}- LOCALVERSION=$LOCALVERSION
cd ..
}

modules_install() {
echo "modules install"
cd linux
INSTALL_MOD_PATH=$PKG/modules make $PARALLEL_MAKE modules_install ARCH=$ARCH CROSS_COMPILE=${TARGET}-
cd ..
tar -C $PKG/modules -Jcvf ${PKG}/modules_${IMAGE_NO}${LOCALVERSION}.tar.xz lib
}

case "$1" in
clean)
    clean
      ;;
checkout)
    checkout 
      ;;
config)
    config
      ;;
image)
    make_Image
      ;;
dtbs)
    make_dtbs
      ;;
modules)
    make_modules
      ;;
modules_install)
#    make_modules
    modules_install
      ;;
auto)
    config
    make_Image
    make_dtbs
    make_modules
    modules_install
      ;;
restart|reload)
    stop
    start
    ;;
*)
      echo $"Usage: $0 {clean|checkout|config|image|dtbs|modules|modules_install|auto}"
      exit 1
esac

arm64のクロスコンパイル環境が出来たので、Linuxのカーネルをコンパイルしてみる。

gitからソースをダウンロードする。

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

カーネルビルドのスクリプトlinux.shを作ってみた。

#!/bin/sh
#linux.sh
PKG=/tmp/kernel
ARCH='arm64'
TARGET=${TARGET:-'aarch64-unknown-linux-gnu'}
KERNEL_VERSION=${KERNEL_VERSION:-'4.14.y'}
CONFIG_FILE=bcmrpi3_defconfig
KERNEL_IMAGE='Image'
PARALLEL_MAKE='-j4'

checkout() {
echo "Check out git file" 
cd linux
git checkout rpi-${KERNEL_VERSION} 
cd ..
}

clean() {
echo "Clean Linux directory"
cd linux
make -j4 ARCH=$ARCH clean
cd ..
}

config() {
echo "Config with $CONFIG_FILE"
cd linux
make $PARALLEL_MAKE ARCH=$ARCH CROSS_COMPILE=$TARGET- $CONFIG_FILE 
cd .. 
}

make_Image() {
echo "make kernel imege"
cd linux
make $PARALLEL_MAKE ARCH=$ARCH CROSS_COMPILE=${TARGET}- LOCALVERSION="-arm64" $KERNEL_IMAGE
if [ ! -d ${PKG}/kernel ] ; then
mkdir -p ${PKG}/kernel/boot
fi
cp arch/$ARCH/boot/$KERNEL_IMAGE $PKG/kernel/boot/kernel8.img
cd ..
tar -C ${PKG}/kernel -Jcvf ${PKG}/kernel.tar.xz boot
}

make_dtbs() {
echo "make dtbs"
cd linux
make $PARALLEL_MAKE dtbs ARCH=$ARCH CROSS_COMPILE=${TARGET}- LOCALVERSION="-arm64"
if [ ! -d $PKG/dtb ] ; then
mkdir -p $PKG/dtb/boot
fi 
cp arch/$ARCH/boot/dts/broadcom/bcm*rpi-3-b*.dtb $PKG/dtb/boot
cd ..
tar -C ${PKG}/dtb -Jcvf ${PKG}/dtb.tar.xz boot 
}

make_modules() {
echo "make modules"
cd linux
make $PARALLEL_MAKE modules ARCH=$ARCH CROSS_COMPILE=${TARGET}- LOCALVERSION="-arm64"
cd ..
}

modules_install() {
echo "modules install"
cd linux
INSTALL_MOD_PATH=$PKG/modules make $PARALLEL_MAKE modules_install ARCH=$ARCH CROSS_COMPILE=${TARGET}-
cd ..
tar -C $PKG/modules -Jcvf ${PKG}/modules.tar.xz lib
}

case "$1" in
clean)
    clean
      ;;
checkout)
    checkout 
      ;;
config)
    config
      ;;
image)
    make_Image
      ;;
dtbs)
    make_dtbs
      ;;
modules)
    make_modules
      ;;
modules_install)
#    make_modules
    modules_install
      ;;
auto)
    config
    make_Image
    make_dtbs
    make_modules
    modules_install
      ;;
restart|reload)
    stop
    start
    ;;
*)
      echo $"Usage: $0 {clean|checkout|config|image|dtbs|modules|modules_install|auto}"
      exit 1
esac

コンフィグはarch/arm64/configsの中にあるものを使う。kernelはImageだがbzImageの方がサイズは小さくなるだろう。

モジュールはビルド(x86_64)環境にインストールしてもダメなので、/tmpにインストールしてPKGで取り出す感じにしてみた。

あとはマニアルで/bootにすべてを配置(コピー)する。既存のdtbは/bootの中に_32をつけて移動しておき、Imageはkernel8.imgとする。

リブートしてログインすると

Linux 4.14.78-v8-arm64.

と表示された。

Raspberry Pi 3 B+はV8のCPUで64bitのkernelで動作する。rpi-updateでは7と7+が配布されているがV8は配布されていないので、64bitのKernelとモジュールを作製してみた。

参考にしたURLは

このにしたがい、Pi3B+にクロスコンパイル環境を構築しようとしたが、gccのコンパイルでリンクエラーが発生していて解決しない。

とりあえず、x86_64環境にクロスコンパイルの環境を構築してみた。参照したURLは

最新の環境に合わせて少し変更。download.sh

#!/bin/bash
# download.sh
set -e
BINUTILS_VERSION=binutils-2.31.1
CLOOG_VERSION=cloog-0.18.1
GCC_VERSION=gcc-8.2.0
LINUX_KERNEL_VERSION=linux-4.14.79
GLIBC_VERSION=glibc-2.28
GMP_VERSION=gmp-6.1.2
ISL_VERSION=isl-0.18
MPFR_VERSION=mpfr-4.0.1
MPC_VERSION=mpc-1.1.0
wget -nc http://ftpmirror.gnu.org/binutils/${BINUTILS_VERSION}.tar.gz
wget -nc ftp://gcc.gnu.org/pub/gcc/infrastructure/${CLOOG_VERSION}.tar.gz
wget -nc https://ftp.gnu.org/gnu/gcc/${GCC_VERSION}/${GCC_VERSION}.tar.xz
#wget -nc https://www.kernel.org/pub/linux/kernel/v3.x/$LINUX_KERNEL_VERSION.tar.xz
#kernelはgitから持ってくるのでコメントアウト
wget -nc http://ftpmirror.gnu.org/glibc/$GLIBC_VERSION.tar.xz
wget -nc ftp://gcc.gnu.org/pub/gcc/infrastructure/${ISL_VERSION}.tar.bz2
wget -nc ftp://ftp.gnu.org/gnu/gmp/${GMP_VERSION}.tar.xz
wget -nc https://www.mpfr.org/mpfr-current/${MPFR_VERSION}.tar.xz
wget -nc https://ftp.gnu.org/gnu/mpc/${MPC_VERSION}.tar.gz

for f in *.tar*; do
 tar -xvf $f
done
cd ${GCC_VERSION}
ln -sf ../${CLOOG_VERSION} cloog
ln -sf ../${GMP_VERSION} gmp
ln -sf ../${ISL_VERSION} isl
ln -sf ../${MPFR_VERSION} mpfr
ln -sf ../${MPC_VERSION} mpc

ビルドのスクリプト、build.sh

#!/bin/bash
# build.sh

set -e

#PREFIX=/tmp/gcc-cross
CWD=$(pwd)
TMP=${TMP:-/tmp}
BUILD=${BUILD:-1}
TAG=${TAG:-_AY}
PREFIX=/usr/local
PARALLEL_MAKE=-j4
CONFIGURATION_OPTIONS="--disable-multilib --disable-nls"

BINUTILS_VERSION=binutils-2.31.1
GCC_VERSION=gcc-8.2.0
LINUX_KERNEL_VERSION=linux
GLIBC_VERSION=glibc-2.28
PKG=$TMP/package-$GCC_VERSION
OUTPUT=${OUTPUT:-/tmp}

if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) ARCH=i586 ;;
    arm*) ARCH=arm ;;
       *) ARCH=$( uname -m ) ;;
  esac
fi

if [ ! -d ${PREFIX}.tmp ]; then
mv $PREFIX ${PREFIX}.tmp
else
echo "Alredy exit ${PREFIX}.tmp"
exit 1
fi

rm -rf $PKG

rm -rf $PKG
mkdir -p $TMP $PKG/$PREFIX $OUTPUT

build() {
    local TARGET="$1"
    local LINUX_ARCH="$2"

    # Step 1. Binutils
    if [ -d build-binutils-$TARGET ] ; then
    rm -r build-binutils-$TARGET
    fi
    mkdir -p build-binutils-$TARGET
    cd build-binutils-$TARGET
#    CONFIGURATION_OPTIONS="--with--sysroot --disable-multilib"
    ../$BINUTILS_VERSION/configure --prefix=$PREFIX --target=$TARGET $CONFIGURATION_OPTIONS
    make $PARALLEL_MAKE
    make install
    cd ..

    # Step 2. Linux Kernel Headers
    cd $LINUX_KERNEL_VERSION
    make ARCH=$LINUX_ARCH INSTALL_HDR_PATH=$PREFIX/$TARGET headers_install
    cd ..

    # Step 3. C/C++ Compilers
    if [ -d build-gcc-$TARGET ] ; then
    rm -r build-gcc-$TARGET
    fi
    mkdir -p build-gcc-$TARGET
    cd build-gcc-$TARGET
#    CONFIGURATION_OPTIONS="--disable-multilib"
    ../$GCC_VERSION/configure --prefix=$PREFIX --target=$TARGET --enable-languages=c,c++ $CONFIGURATION_OPTIONS
    make $PARALLEL_MAKE gcc_cv_libc_provides_ssp=yes all-gcc
    make install-gcc
    cd ..

    # Step 4. Standard C Library Headers and Startup Files
    if [ -d build-glibc-$TARGET ] ; then
    rm -r build-glibc-$TARGET
    fi
    mkdir -p build-glibc-$TARGET
    cd build-glibc-$TARGET
    ../$GLIBC_VERSION/configure --prefix=$PREFIX/$TARGET --build=$MACHTYPE --host=$TARGET --target=$TARGET --with-headers=$PREFIX/$TA
RGET/include $CONFIGURATION_OPTIONS libc_cv_forced_unwind=yes
    make install-bootstrap-headers=yes install-headers
    make $PARALLEL_MAKE csu/subdir_lib
    install csu/crt1.o csu/crti.o csu/crtn.o $PREFIX/$TARGET/lib
    $TARGET-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $PREFIX/$TARGET/lib/libc.so
    touch $PREFIX/$TARGET/include/gnu/stubs.h
    cd ..

    # Step 5. Compiler Support Library
    cd build-gcc-$TARGET
    make $PARALLEL_MAKE all-target-libgcc
    make install-target-libgcc
    cd ..

    # Step 6. Standard C Library & the rest of Glibc
    cd build-glibc-$TARGET
    make $PARALLEL_MAKE
    make install
    cd ..

    # Step 7. Standard C++ Library & the rest of GCC
    cd build-gcc-$TARGET
    make $PARALLEL_MAKE all
    make install
    cd ..

    rm -rf build-binutils-$TARGET build-gcc-$TARGET build-glibc-$TARGET

    mv  $PREFIX/* $PKG/$PREFIX/
    cd $PKG
   /sbin/makepkg -l y -c n $OUTPUT/$GCC_VERSION-$TARGET-$ARCH-$BUILD$TAG.${PKGTYPE:-txz}

}

#build i686-linux-gnu x86
#build arm-linux-gnueabi arm
#build arm-linux-gnueabihf arm
build aarch64-linux-gnu arm64
#build powerpc-linux-gnu powerpc
#build powerpc64le-linux-gnu powerpc
#build mips-linux-gnu mips
#build mipsel-linux-gnu mips
#build mips64el-linux-gnuabi64 mips
#build alpha-linux-gnu alpha
#build s390x-linux-gnu s390
#build m68k-linux-gnu m68k

#build x86_64-linux-gnu x86
#build sparc-linux-gnu sparc
#build sparc64-linux-gnu sparc
#build cris-linux-gnu cris
#build sh4-linux-gnu sh

if [ -d $PREFIX.tmp ] ; then
  rm -rf $PREFIX
  mv $PREFIX.tmp $PREFIX
fi

echo "Build Success!!"

とりあえず、aarch64の環境のみ構築した。成果はx86_64のパッケージにしてここに置く。

このアーカイブについて

このページには、2018年11月に書かれた記事が新しい順に公開されています。

前のアーカイブは2018年10月です。

次のアーカイブは2018年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

2019年6月

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30