LTTng を構築して組み込み Linux システムにデプロイするにはどうすればよいですか?

http://lttng.org/download で入手可能なソース tarball 内の README ファイルは、トレースのターゲットとなる同じ Linux システム上に構築されていることを前提としているようです。これを行う方法を説明する他のリソースを見つけました (LTTng プロジェクトの YouTube チャンネルには非常に素晴らしいスクリーンキャストがあります)。しかし、LTTng をクロスコンパイルする方法の説明が見つかりません (具体的には、liburcu、LTTng-UST だと思います) 、LTTng-tools、および LTTng-modules)をすべて組み込み Linux システムにインストールします(カーネルを構築または再構築し、デバイス ツリー BLOB と、今のところは RAM ディスク ベースのファイル システムを使用できます)。

これを行う方法の詳細はどこで確認できますか?

更新: 以下の最初のコメントで Marko が指摘しているように、LTTng ツールは autoconf を使用して構築されています。理論的には、この回答と同様に、構成する「-host」オプションを理解できることを理解しています。そしておそらく、カーネルを構築するときに使用するようにするには、「ARCH=arm」のようなパラメータが必要です。しかし、LTTng コンポーネントを使用する同じマシン上でビルドするときに使用される make install に相当するクロスコンパイルは何でしょうか?


前回 LTT ユーザー空間ツールをビルドしたときは、特に簡単な作業ではありませんでしたが、autoconf 用にセットアップされていたため、手順はクロスコンパイラーを使用して他のソフトウェアをビルドするのと非常によく似ていました。gcc がターゲット ライブラリとヘッダー パスですでにセットアップされている、適切にセットアップされたクロス環境を使用している場合、これは autoconf を呼び出すときに sysroot と場合によってはコンパイラ名を指定するだけのケースです。そうでない場合は、さらに負荷を設定する必要があります。LTT 化されたカーネルはもう入手しましたか? これはさらに大きな課題となる可能性があります。
marko
2012年12月8日 19:56
ありがとう@Marko。autoconf のコメントに質問を更新してお答えします… –
Daryl Spitzer
2012 年 12 月 9 日 2:42
…LTTng 2.0の特徴は、パッチが不要になったことだと思います。lwn.net/Articles/491510 より: 「以前の LTTng 0.x とは異なり、パッチなしでバニラまたはディストリビューション カーネルにインストールできます。」カーネルを LTTng 2.0 用に特別に構成する必要がある場合、詳細は見つかりません。
ダリル・スピッツァー
2012年12月9日 2時55分


答え:

LTTng 2.x では、パッチを当てたカーネルは必要なくなりました。カーネル トレースを行うには、カーネル モジュール (lttng-modules) をロードする必要があります。サポートされている Linux カーネルの最小バージョンは 2.6.38 です。2.6.32 までは可能ですが、LTTng 2.1 リリース ノートと lttng-modules README に従ってカーネルに 3 つのパッチを適用する必要があります。

クロスコンパイルに関する質問に答えるために、LTTng ツールチェーン (ユーザー空間トレース用) をクロスコンパイルするために私が使用する通常の手順を次に示します。

export HOST=<your host triplet (e.g. arm-linux-gnueabi)>

# Make sure your cross-compiler can be found in your $PATH
export SYSROOT=<path to the target sysroot>

export CFLAGS="--sysroot=$SYSROOT"
export CPPFLAGS="-I$SYSROOT/include"
export CXXFLAGS=$CFLAGS
export LDFLAGS="--sysroot=$SYSROOT -L$SYSROOT/usr/lib -L$SYSROOT/lib"

# Fix RPL_MALLOC issue. See [Autoconf and RPL_MALLOC][3] for more details.
export ac_cv_func_malloc_0_nonnull=yes

# Cross compile userspace-rcu. You can also use a source tarball.
git clone git://git.lttng.org/userspace-rcu.git
cd userspace-rcu
./bootstrap
./configure --prefix=$SYSROOT --host=$HOST --with-sysroot=$SYSROOT
make
make install

# Cross compile lttng-ust. You can also use a source tarball.
git clone git://git.lttng.org/lttng-ust.git
cd lttng-ust
./bootstrap
./configure --prefix=$SYSROOT --host=$HOST --with-sysroot=$SYSROOT
make
make install

# Cross compile lttng-tools. You can also use a source tarball.
git clone git://git.lttng.org/lttng-tools.git
cd lttng-tools
./bootstrap
./configure --prefix=$SYSROOT --host=$HOST --with-sysroot=$SYSROOT
make
make install
You should be able to adapt this to your platform. If you want to do kernel tracing, you will also need to cross-compile lttng-modules in a similar fashion.

シェア
この回答を改善する
フォローする


更新: ARM の LTTng クロスコンパイルがより簡単になりました。

まず、必要な依存関係をインストールします。たとえば、Emdebian ツールチェーンの場合:

xapt -a armel -m libc6-dev libpopt-dev uuid-dev liburcu-dev

それから:

export HOST=arm-linux-gnueabi
export SYSROOT=<path to the target sysroot>

git clone git://git.lttng.org/lttng-ust.git
cd lttng-ust
./bootstrap
./configure --host=$HOST --prefix=$SYSROOT/usr/local
make -j8
make install

git clone git://git.lttng.org/lttng-tools.git
cd lttng-tools
./bootstrap
./configure --host=$HOST --prefix=$SYSROOT/usr/local
make -j8
make install

注: 「tests」サブディレクトリのバイナリが原因で、make が失敗することがあります。この場合、Makefile から「tests」を削除するだけです (./configure を実行した直後)。


私が使用したビルド スクリプトを共有したいだけです。また、その他の不足している依存関係もコンパイルします。HTH

以下をコンパイルします。

libuuid - libxml2 - Popt - libiconv - zlib - userspace-rcu - lttng-ust - lttng-tools - lttng-modules

#!/bin/bash

# install this stuff before
# apt-get install  lib32z1 lib32ncurses5 lib32bz2-1.0 bison flex build-essential
# change your flags here

export PATH=/home/build/sam9/compiler/arm-2014.05/bin:$PATH
export ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes
export HOST=arm-none-linux-gnueabi
export SYSROOT=/home/build/sam9/sysroot

G_CC=arm-none-linux-gnueabi-gcc 
G_PREFIX=/usr/local

G_ARCH=arm
G_CROSS_COMPILE=arm-none-linux-gnueabi-
G_KERNELDIR=/home/build/sam9/linux-3.4.106


G_CFG_FILE="$PWD/${0%\.*}.conf" # tracking download/compile steps

G_TARBALL_DIR=$PWD/tarballs
G_SOURCES_DIR=$PWD/sources
G_BUILD_DIR=$PWD/builds

# steps for tracking progress in $G_CFG_FILE
step_start=0
step_download=1
step_compile=2

echo
echo "This script will compile and install lttng and some deps"
echo "Building for HOST=$HOST"
echo
echo "Builds are located in $G_BUILD_DIR"
echo "Sources are located in $G_SOURCES_DIR"
echo "Tarballs are located in $G_TARBALL_DIR"
echo "sysroot is located at $SYSROOT"
echo "prefix is set to $G_PREFIX"
echo
echo "press Enter to continue or CRTL-C to abort"
read

[ -e "$G_CFG_FILE" ] && . "$G_CFG_FILE" &> /dev/null

function get_src_dir()
{
    
    
    local filename="$1"
    tar -tf "$G_TARBALL_DIR/$filename"| sed -e 's@/.*@@' | uniq
}

function build()
{
    
    
    local filename="$1"
    local what="$2"
    local dir_name="$3"
    local state="$4"
    local do_bootstrap=$5

    if [ $state -eq $step_download ] ; then

        if $do_bootstrap ; then
            pushd $G_SOURCES_DIR/$dir_name
            ./bootstrap
            popd
        fi

        mkdir -p "$G_BUILD_DIR/$dir_name"       
        pushd "$G_BUILD_DIR/$dir_name"      
        if [ -n "$patch" ] ; then
            pushd "$G_SOURCES_DIR/$dir_name"        
            wget $patch -O- | patch -p1
            popd
        fi
        "$G_SOURCES_DIR/$dir_name"/configure --host=$HOST --prefix=$SYSROOT/${G_PREFIX} $EXTRA_CONF
        make -j3
        make install && echo "$what=$step_compile" >> $G_CFG_FILE
        popd
    fi
    if [ $state -eq $step_compile ] ; then
        echo ">> $what is already compiled"
    fi
}

function download()
{
    
    
    local url="$1"
    local what="$2"
    local filename="$3"
    local state="$4"

    if [ $state -lt $step_download ] ; then
        wget "$url" -O "$G_TARBALL_DIR/$filename"
        echo "$what=$step_download" >> $G_CFG_FILE
        tar -C $G_SOURCES_DIR -xf "$G_TARBALL_DIR/$filename"
        . "$G_CFG_FILE" &> /dev/null
    fi
}

function download_git()
{
    
    
    local url="$1"
    local what="$2"
    local filename="$3"
    local state="$4"

    if [ $state -lt $step_download ] ; then

        pushd $G_SOURCES_DIR
        git clone $url
        popd
        echo "$what=$step_download" >> $G_CFG_FILE
        . "$G_CFG_FILE" &> /dev/null
    fi
}

function init()
{
    
    
    local what="$1"
    eval state=\$$what

    if [ ! -n "$state" ] ; then
        echo "$what=$step_start" >> $G_CFG_FILE
        . "$G_CFG_FILE" &> /dev/null
    fi

    eval state=\$$what
}

function get_em()
{
    
    
    local url="$1"
    local what="$2"
    local filename=$(basename $url) 

    init "$what"
    download "$url" "$what" $filename $state
    eval state=\$$what
    local dir_name=$(get_src_dir $filename)
    build $filename "$what" $dir_name $state false
}

function get_em_git()
{
    
    
    local url="$1"
    local what="$2"
    local do_bootstrap="$3"
    local filename=$(basename $url) 
    filename=${filename/.git}

    init "$what"
    download_git "$url" "$what" $filename $state
    eval state=\$$what

    build $filename "$what" $filename $state $do_bootstrap
}

echo "create directories"
mkdir -p "$G_TARBALL_DIR" "$G_SOURCES_DIR" "$G_BUILD_DIR" &>/dev/null


########################
# define the packages we want to compile
########################

# this are the dependencies that are missing for our sysroot
# we will compile them and install the to the $SYSROOT
#
# --- BEGIN --- dependencies
what=libuuid
url=http://downloads.sourceforge.net/project/libuuid/libuuid-1.0.3.tar.gz
get_em $url "$what"

what=libxml2
url=ftp://gd.tuwien.ac.at/pub/libxml/libxml2-sources-2.9.2.tar.gz
EXTRA_CONF=--without-python
get_em $url "$what"
unset EXTRA_CONF

what=popt
url=ftp://anduin.linuxfromscratch.org/BLFS/svn/p/popt-1.16.tar.gz
get_em $url "$what"

what=libiconv
url=http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
patch=http://data.gpo.zugaina.org/gentoo/dev-libs/libiconv/files/libiconv-1.14-no-gets.patch
get_em $url "$what"
unset patch

what=zlib
url=http://zlib.net/zlib-1.2.8.tar.gz
init "$what"
filename=$(basename $url)   
download "$url" "$what" $filename $state
if [ $state -eq $step_compile ] ; then
    echo ">> $what is already compiled"
else
    dir_name=$(get_src_dir $filename)
    pushd $G_SOURCES_DIR/$dir_name
    CC=$G_CC \
    LDSHARED="$G_CC -shared -Wl,-soname,libz.so.1" \
    ./configure --shared --prefix=$SYSROOT/${G_PREFIX}
    make
    make install prefix=$SYSROOT/${G_PREFIX} && echo "$what=$step_compile" >> $G_CFG_FILE
    popd
fi

# --- END --- dependencies


#######################
# compile lttng related packages and install into $SYSROOT
what=userspace_rcu
url=git://git.lttng.org/userspace-rcu.git
get_em_git $url "$what" true

what=lttng_ust
url=git://git.lttng.org/lttng-ust.git
export CPPFLAGS="-I$SYSROOT/${G_PREFIX}/include"
export LDFLAGS="-L$SYSROOT/${G_PREFIX}/lib -Wl,-rpath-link=$SYSROOT/${G_PREFIX}/lib"
get_em_git $url "$what" true
unset CPPFLAGS
unset LDFLAGS

what=lttng_tools
url=git://git.lttng.org/lttng-tools.git
export CPPFLAGS="-I$SYSROOT/${G_PREFIX}/include"
export LDFLAGS="-L$SYSROOT/${G_PREFIX}/lib -Wl,-rpath-link=$SYSROOT/${G_PREFIX}/lib"
get_em_git $url "$what" true
unset CPPFLAGS
unset LDFLAGS

what=lttng_modules
url=git://git.lttng.org/lttng-modules.git
init "$what"
filename=$(basename $url)   
filename=${filename/.git}
download_git "$url" "$what" $filename $state
if [ $state -eq $step_compile ] ; then
    echo ">> $what is already compiled"
else
    #dir_name=$(get_src_dir $filename)
    pushd $G_SOURCES_DIR/$filename
    make ARCH=$G_ARCH CROSS_COMPILE=$G_CROSS_COMPILE KERNELDIR=$G_KERNELDIR -j4
    make ARCH=$G_ARCH CROSS_COMPILE=$G_CROSS_COMPILE KERNELDIR=$G_KERNELDIR INSTALL_MOD_PATH=$SYSROOT modules_install \
        && echo "$what=$step_compile" >> $G_CFG_FILE
    popd
fi

echo
echo "INFO: the build progress for all packages is tracked in $G_CFG_FILE"

次のエラーが表示されます: Git リポジトリからビルドする場合は Bison >= 2.4 が必要です。YACC 変数を設定して自動検出を無効にすることができます。

おすすめ

転載: blog.csdn.net/kuno_y/article/details/127559005