2014年6月16日月曜日

xfs_fsr

xfsのデフラグのために、ls-qlにxfs_fsrが欲しいのでをビルドした。

■pre-requisite
sysroot=~/ls-ql/worktop/arm-built-from-src/sysroot
export PATH=$sysroot/../tools/bin:$PATH
ncurses
wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz
./configure --prefix=$sysroot/usr --host=arm-none-linux-gnueabi --with-shared
■libtool
wget http://ftpmirror.gnu.org/libtool/libtool-2.4.2.tar.gz
./configure --prefix=$sysroot/../tools --host=arm-none-linux-gnueabi --program-prefix=arm-none-linux-gnueabi-
make ; make install
e2fsprogs (libuuid)
wget http://buffalo.jp/php/los.php?to=gpl/storage/ls-chl/102/e2fsprogs-1.40.5.tar.gz -o e2fsprogs-1.40.5.tar.gz
./configure --prefix=$sysroot/usr/local --host=arm-none-linux-gnueabi --enable-elf-shlibs --with-cc=arm-none-linux-gnueabi-gcc --with-linker=arm-none-linux-gnueabi-ld
make ; make install ; make install-libs
xfsprogs

wget ftp://oss.sgi.com/projects/xfs/previous/cmd_tars/xfsprogs_2.9.4-1.tar.gz
./configure --prefix=$sysroot/usr/local --host=arm-none-linux-gnueabi LDFLAGS="-L$sysroot/usr/local/lib -L$sysroot/usr/lib -L$sysroot/lib" CPPFLAGS="-I$sysroot/usr/local/include -I$sysroot/usr/include" LIBTOOL='arm-none-linux-gnueabi-libtool'
make ; make install ; make install-devs
attr
wget http://download.savannah.gnu.org/releases/attr/attr-2.4.47.src.tar.gz
./configure --prefix=$sysroot/usr/local --host=arm-none-linux-gnueabi --enable-sharedmake ; make install ; make install-lib ; make install-dev
  ========================================
  ./configure --prefix=/usr/local --host=arm-none-linux-gnueabi --enable-shared
  make
  checkinstall --install=no make install-lib
  ========================================
@$sysroot/usr/include
ln -s ncurses/ncurses.h ncurses.h
xfsdump
wget ftp://oss.sgi.com/projects/xfs/previous/cmd_tars/xfsdump_2.2.48-1.tar.gz
./configure --prefix=$sysroot/usr/local --host=arm-none-linux-gnueabi LDFLAGS="-L$sysroot/usr/local/lib -L$sysroot/usr/lib -L$sysroot/lib" CPPFLAGS="-I$sysroot/usr/local/include -I$sysroot/usr/include" LIBTOOL='arm-none-linux-gnueabi-libtool'
make ; make install

隘路

libuuid

libuuidには、e2fsprogs付属のものとOSSPによるものとがある。xfsprogsで必要なのは、e2fsprogsの方である。
使用しなかったが、OSSPのlibuuidのクロスコンパイルは下記のようにした:
./configure --prefix=$sysroot/usr/local --host=arm-none-linux-gnueabi ac_cv_va_copy=yes
make ; make install
クロスコンパイルでconfigureを通すために、ac_cv_vacopy=yesを指定。
http://d.hatena.ne.jp/maminus/20100120/1264000663

libtool

クロスコンパイル用のlibtoolを使うことでxfsprogs, xfsdumpをクロスコンパイルできた。
http://www.metastatic.org/text/libtool.html

2014年4月12日土曜日

ARM Cross Compile環境作成

Emdebianのクロスコンパイル環境を使っていたが、ls-qlのlibcとバージョンが合っていない。ls-qlのlibcのバージョンの合ったクロスコンパイル環境を作成する。

前提

作成するクロスコンパイル環境

ls-qlのlibc, kernelのバージョンと合わせたクロスコンパイル環境を作成する。ls-qlのlibc, kernelをコンパイルしたgccのバージョンは分からないので、ビルドエラーが出にくそうなバージョンを選ぶことにする。
ls-qlのlibcは、eglibc 2.5 (/lib/libc-2.5.soから)、kernelは、linux-2.6.22_lsp.3.0.5 (buffaloのOpen Sourceのページにあるから)、と判断。

クロスコンパイル環境をビルドする環境

makeは、3.81
gccは、4.4.5 (gcc--version : gcc (Debian 4.4.5-8) 4.4.5)

手順

eglibcのEGLIBC.cross-building に従う。
参考2.に、シェルスクリプトがあり、活用する。変更は、eglibc, kenelへのパッチ当てとconstruct sysrootの追加、インストール先のディレクトリ構成(tools, sysroot)の変更。
install_gcc.sh

ビルドするソース(クロスコンパイル環境のソース)

gmp=gmp-4.3.2
mpfr=mpfr-2.4.2
mpc=mpc-0.8.1
binutils=binutils-2.23.2
gcc=gcc-4.6.3
eglibc=eglibc-2.5
linux=linux-2.6.22_lsp.3.0.5

隘路

eglibc 2.5のビルドには、ソースの変更が必要だった。下記パッチを作成:
kernelも、ビルドエラー発生。有名なgetlineの関数定義重複。下記パッチを作成:



ソースの入手先

binutils,
eglibc, http://www.eglibc.org/home,

$ svn co svn://svn.eglibc.org/branches/eglibc-2_5 eglibc-2.5
$ tar jcvf eglibc-2.5.tar.bz2 eglibc-2.5 

kernel, http://opensource.buffalo.jp/ls-ql_r5-102.html

参考

隘路

  • binutils 2.17のビルドでは、makeでエラー発生(2.17aで試すも同じエラー)。binutils 2.32.2を使ったら成功。
  • linux のmake headers_installで、エラー発生:
     scripts/unifdef.c:209: error: conflicting types for ‘getline’
    getline → get_line に変更。
  • eglibc-headersのconfigureで、arm未サポートとなったので、--enable-add-onsに、portsのディレクトリ、nptlを指定。しかし、makeで、TLS supportのエラー発生。
    --enable-add-onsに、portsのソースディレクトリを指定するのではなく、eglibc2.5/libcに、eglibc2.5/portsへのリンクを作成し、--enable-add-onsの引数なしでconfigureしたところ、makeも成功。不思議。。。
  • EGLIBC, Completeで、_beginの定義がないとのエラー発生。
    リンカ周りで発生したエラーの様。最新のbinutils(2.32.2)に対して、gccのバージョンが古い(4.4.5)ためと推測。gccのバージョンを変えて試す:
    gcc 4.4.5 × → 4.8.1 × → 4.6.4 × → 4.6.3 ? →
    (ls-qlのローダ、libcと整合がとれるか不明だが試してみる。)
  • gcc 4.6.4 の gcc1 の configure では、--disable-libquadmath 
  • gcc 4.6 or 4.8のコンパイルで、gmp, mpfr, mpcが必要になる。ソース取得のため、contribで、download_prerequisiteすると、contribにソースが展開される。gcc-4.6.4に、contribに展開されたソースへのリンクを作成したが、×。

Install Transmission

Transmissionをls-qlにインストールする。
最初に、クロスコンパイル環境でビルド、インストールしてみて、上手くいったらls-ql用に再ビルド(--prefix=/usr/localにしてビルド)してパッケージを作成(checkinstall)、ls-qlにパッケージをコピーしてインストール(dpkg -i)する。

Transmissionのクロスコンパイル

バージョンと

transmission-2.82

クロスコンパイル環境でのインストール先

$sysroot/usr/local

準備(変数の設定)

sysroot=~/ls-ql/worktop/arm-built-from-src/sysroot
PATH=$sysroot/tools/bin:$PATH

前提パッケージ、バージョンとインストール先

libevent2 , libevent-2.0.21-stable , $sysroot/usr
zlib , zlib-1.2.8 , $sysroot/usr
openSSL , openssl-1.0.1e , $sysroot/usr/local
curl , curl-7.32.0 , $sysroot/usr/local

libevent2

$./configure --prefix=$sysroot/usr --host=arm-linux-gnueabi --target=arm-l
inux-gnueabi --build=i686-linux-gnueabi
$make
$make install

zlib

$CC=arm-none-linux-gnueabi-gcc LDSHARED="arm-none-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1" ./configure --prefix=$sysroot/usr --shared
$make -j4
$make prefix=$sysroot/usr install

openSSL

$./Configure --prefix=/usr/local --openssldir=/usr/local/openssl threads zlib shared no-asm linux-armv4
$make -j4
$make INSTALL_PREFIX=$sysroot install

curl

$./configure --host=arm-none-linux-gnueabi --prefix=$sysroot/usr/local OPENSSL_CFLAGS=-I$sysroot/usr/local/include/ OPENSSL_LIBS="-L$sysroot/usr/local/lib/ -lcrypto"
$make
$make install

transmission

$./configure --prefix=$sysroot/usr/local --host=arm-none-linux-gnueabi OPENSSL_CFLAGS=-I$sysroot/usr/local/include/ OPENSSL_LIBS=-lcrypto LIBCURL_CFLAGS=-I$sysroot/usr/loca/include/ LIBCURL_LIBS="-L$sysroot/usr/local/lib/ -lcurl" LIBEVENT_CFLAGS="-I$sysroot/usr/include/" LIBEVENT_LIBS="-L$sysroot/usr/lib/ -levent" --disable-nls --enable-daemon --enable-cli --enable-lightweight
$make
$make install

パッケージ作成

ls-qlへのインストールのために、checkinstall でパッケージを作成する。
transmissionだけでなく、前提パッケージについても、インストール先を、/usr or /usr/local にして、configure ; make ; checkinstall --install=no にて、パッケージを作成する。
sudo checkinstall --install=no
checkinstall の実行時には、 Architectureを、armに変更する:
このパッケージは以下の内容で構成されます:
0 -  Maintainer: [ root@debian ]
1 -  Summary: [ Package created with checkinstall 1.6.2 ]
2 -  Name:    [ transmission ]
3 -  Version: [ 2.82 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ arm ]
8 -  Source location: [ transmission-2.82 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ transmission ]
12 - Conflicts: [  ]
13 - Replaces: [  ]
結果の確認は、後日。


以上

2014年3月21日金曜日

FlexGetのインストール

FlexGetには、Pythonが必要。Pythonをビルド、インストールする。
Pythonをインストール後、PIPをインストールし、PIPからFlexGetをインストールする。

Pythonのビルド、インストール

クロスコンパイルするが、ホスト環境のpython, Parser/pgenをクロスコンパイルの中で使うので、最初にこれをビルドして、名前を変更しておく。
./configure
make python Parser/pgen
mv python hostpython
mv Parser/pgen Parser/hostpgen
make distclean
クロスコンパイルする。

CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ AR=arm-none-linux-gnueabi-ar RANLIB=arm-none-linux-gnueabi-ranlib ./configure --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --build=i686-none-linux-gnu

configure
CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ AR=arm-none-linux-gnueabi-ar RANLIB=arm-none-linux-gnueabi-ranlib CPPFLAGS="-I$sysroot/usr/local/include/ -I$sysroot/usr/include/" LDFLAGS="-L$sysroot/usr/local/lib/ -L$sysroot/usr/lib/ -L$sysroot/lib/" ./configure --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --build=i686-none-linux-gnu
make
make EXTRA_FLAGS="$CFLAGS" HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen CROSS_COMPILE=arm-none-linux-gnueabi- CROSS_COMPILE_TARGET=yes BLDSHARED='arm-none-linux-gnueabi-gcc -shared'
chekcinstallで、パッケージ作成しようとしたがエラー。make installして、tarで固めて、ls-qlに持っていくことにする。
 checkinstall --install=no -A arm make install EXTRA_CFLAGS="$CFLAGS" HOSTPYTHON=./hostpython CROSS_COMPILE=arm-none-linxu-gnueabi- CROSS_COMPILE_TARGET=yes BLDSHARED='arm-none-linux-gnueabi-gcc -shared'
make install EXTRA_CFLAGS="$CFLAGS" HOSTPYTHON=./hostpython CROSS_COMPILE=arm-none-linxu-gnueabi- CROSS_COMPILE_TARGET=yes BLDSHARED='arm-none-linux-gnueabi-gcc -shared' prefix=~/ls-ql/Python-2.6.8/install
cd ~/ls-ql
tar zcvf Python-2.6.8.tar.gz Python-2.6.8
ls-qlにて、
tar zxvf Python-2.6.8.tar.gz
ln -s ${where tar extracted}/Python-2.6.8/instal/bin/python /usr/local/bin/python
ln -s ${where tar extracted}/Python-2.6.8/instal/lib/python2.6 /usr/local/lib/python2.6
Python-2.6.8/install/bin/python -V
Python-2.6.8/install/bin/python Python-2.6.8/install/lib/python2.6/test/test___all__.py

PIPのインストール

$ python ez_setup.py
$ python get-pip.py
pipが、Python-2.6.8/install/bin にインストールされるので、/usr/local/binにシンボリックリンクを作成する。
cd /usr/local/bin
ln -s {path to Python}/Python-2.6.8/install/bin/pip

Flexgetのインストール

$pip install flexget
スペース不足エラー。。。環境変数TEMPを設定して再実行。(http://flexget.com/wiki/InstallWizard/BuffaloLinkstation


隘路

  • ez_setup.pyを実行すると、curl でエラー。.curlrcを作る。
$ echo insecure >> ~/.curlrc
  • get-pip.pyを実行すると、bz2モジュールがないとのエラー。
    bz2は、configureがないので、Makefileを編集してクロスコンパイルする。

# To assist in cross-compiling
CC=arm-none-linux-gnueabi-gcc
AR=arm-none-linux-gnueabi-ar
RANLIB=arm-none-linux-gnueabi-ranlib
LDFLAGS=-L$sysroot/usr/local/lib/ -L$sysroot/usr/lib/ -L$sysroot/lib/
make -f Makefile-libbz2_so
make clean

non-sharedを作成
make

クロスコンパイル環境用にインストール
make PREFIX=$sysroot/usr/local install

sharedをクロスコンパイル環境にコピー
cp -v bzip2-shared $sysroot/usr/local/bin/bzip2
cp -av libbz2.so* $sysroot/usr/local/lib
ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
rm -v $sysroot/usr/local/bin/{bunzip2,bzcat}
ln -sv bzip2 $sysroot/usr/local/bin/bunzip2
ln -sv bzip2 $sysroot/usr/local/bin/bzcat
http://cross-lfs.org/view/svn/alpha/final-system/bzip2.html

ls-ql用にパッケージを作成
sudo checkinstall --install=no make PREFIX=/usr/local install

  • flexgetを実行すると、sqliteがないとエラー。
    ./configure --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi --prefix=$sysroot/usr/local
    make
    make install

    ls-ql用パッケージ作成。
    make clean ; ./configure --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi --prefix=$sysroot/usr/local ; make
    su
    PATH=$worktop/tools/bin:$PATH
    checkinstall --install=no -A arm make install



2013年9月23日月曜日

このメールに返信しても、確認できません

ネットで買い物をすると、注文確認メールが来る。
この注文確認メールに、このアドレスは発信専用アドレスのため、返信しても回答できないと書いてあり、問合せ先のメールアドレスが書かれている。
さらに、ヘッダをよく見ると、発信専用のアドレスを、In-reply-toに指定していたりする。

”このメールに返信しても、確認できません” は、どうかと思う。受信者(顧客)の利便性を考えない、発信者の都合にしか思えない。そんなことを書くくらいなら:

  • In-reply-toに、問合せ先のメールアドレスを指定して、返信で問い合せできるようにする。
  • In-reply-toが正しく処理されないことを(クレームする人を)気にするなら、本文に、”返信は foo@bar へお願いします。本メールへの返信は、foo@bar となるようにしておりますが、ご使用のメーラによっては正しく設定されない場合があります。返信先が、foo@bar であることをご確認ください。” くらい書いておけばいい。
以上



2013年7月28日日曜日

unknown disk partitionの調査

先日、Touro 4TBを、partprobeでパーティションを認識させて、マウントするようにしたが、そもそも、unknown disk partitionとなる原因を調査。

推定1
HDDではないが、USBメモリで、unknown disk partitionの対策をしたページを見つけた。
http://blog.kmckk.com/archives/2846188.html
セクタ0をHDDからDMAで読み込み、キャッシュをinvalidateするが、キャッシュのラインサイズのアライメントが合っていないため、CPUがライト・バックして、DMA転送いたデータ(マジックナンバー)を上書き、このデータを参照したmsdos_partionが、マジックナンバー不正と判定し、check_partionに1を返し、unknown disk partitionとなっている様。

良くわからなかったので、[1]を読んでみた。

kernel sourceを読んでみようと調べた。
このとき、クロスコンパイルを簡潔にまとめたページがあったので貼っておく。[2]
ソースコードを読むのに、バージョン間比較、識別子へのハイパーリンクが貼られていて、便利なページがあった。[3] LXRというソフトを使っている様。

参考

[1]キャシュは諸刃の剣、DMA対応と言われたら、
http://www.uquest.co.jp/embedded/learning/lecture.html

[2]
http://senta.s112.xrea.com/senta/Tips/000/8a/index.html

[3]
http://lxr.free-electrons.com/source/

2013年7月26日金曜日

ls-qlに4TB USB Touro接続 (4)

起動スクリプト仕上げ

hotplug.shとtouro_mount.shの実行をrcSに追加。

/usr/local/bin/share_delete.sh & 
/etc/init.d/hotplug.sh start
/etc/init.d/touro_mount.sh start test
/usr/sbin/telnetd
再起動して、確認。おつかれさまでした。

隘路 

touro_mount.shだけを追加したところ、/dev/usbdisk1*が消えている状態となり、/dev/usbdisk1_1がマウントされなかった。hotplug.sh startしたら、/dev/usbdisk1*が作成されるので、これを直前に追加した。