2014年4月12日土曜日

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*が作成されるので、これを直前に追加した。

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

起動スクリプト

/etc/init.d/touro_mount.shを作成。/etc/hotplug.d/scsi_device/usb-buffalo.hotplugを参考にする。
ポイントは青字箇所、partprobeで、パーティションを認識させて、mount_usbdiskでマウントする。mount_usbdiskは、libbuffalo.touroで定義している。
#!/bin/sh
#echo "*** $0:$* pid=$$" >/dev/console
LOCK="/var/lock/touro_mount.lock"
. /usr/local/bin/libbuffalo.touro
. /usr/local/lib/libsys
cleanup_exit()
{
        rm -f ${LOCK}
        exit $1
}
mount_touro()
{
        local i
        for i in `seq 1 ${MAX_USBDISK_NUM}`
        do
    TOURO=`grep /dev/usbdisk${i} /var/tmp/usb_list | grep Touro`
    if [ ! -z "${TOURO}" ] ; then
      ##/usr/local/sbin/partprobe /dev/usbdisk${i}
      partprobe /dev/usbdisk${i}
      mount_usbdisk ${i}
    fi
        done
}
##echo "env=(`env`)"
if [ -f ${LOCK} ] ; then
        exit 1
fi
echo $$ > ${LOCK}
#spinlock_file /var/lock/usb-hotplug
        ### USB-Strage devices
        if [ "$1" = "stop" ]; then
                echo "umount USB disks"
                /usr/local/bin/service_control.sh media stop
                /usr/local/bin/service_control.sh share stop
                for i in `seq 1 ${MAX_USBDISK_NUM}`
                do
                        umount -f ${MPT_USBSHARE}${i}
                done
        fi
        #if [ $? -eq 1 -a "$1" != "create" ]; then
        #fi
  if [ "$1" = "start" ]; then
    mount_touro
    echo "*** [$0 $$] Restarting Daemons..." > /dev/console
    # if ${ACTION} is "remove" already servers are killed.
    # so no need to stop servers at here.
    if [ "${2}" != "test" ] ; then
      /usr/local/bin/service_control.sh media stop
      /usr/local/bin/service_control.sh share stop
      sleep 1
      /usr/local/bin/service_control.sh share start
      /usr/local/bin/service_control.sh media start
    fi
  fi
#echo "--- exit pid=$$" >/dev/console
cleanup_exit $?
libbuffalo.touroを読み込む。libbuffalo.touroは、libbuffaloのmount_usbdiskに下記朱記の変更をしたもの。gptパーティションの名前が、touro_xfsであれば、MountXFSを実行するにした。
mount_usbdisk()
{
...
                     xfs)
                             echo "xfs"
                             MountXFS /dev/${BASENAME}_$minor ${MPT}
                             if [ $? -eq 0 ]; then
                                     chmod 777 ${MPT}
                                     rm -rf "${MPT}/lost+found" > /dev/null >&1
                                     return 0
                             fi
                             ;;
     ### begin - Touro mount
                     *)
       PNM=`grep "^${minor}:" /tmp/fdisk_usb|awk -F ":" '{print $6}'`
                             if [ "${PNM}" = "touro_xfs" ] ; then
         echo "touro_xfs"
         MountXFS /dev/${BASENAME}_$minor ${MPT}
         if [ $? -eq 0 ]; then
           chmod 777 ${MPT}
           rm -rf "${MPT}/lost+found" > /dev/null 2>&1
           return 0
         fi
       fi
                             ;;
     ### end - Touro mount 
...
}

隘路

libbuffaloのmount_usbdiskを書き換えたが、再起動したら書き換え前に戻ってしまった。起動の度に、上書きするようなので、libbuffalo.touroを別に作成した。

つづく。

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

gpt作成

Touroに、gptでパーティションを作成。AFTなので、パーティション境界を8の倍数セクタ、2048sにする。
>parted /dev/usbdisk1
mklabel gpt
mkpart primary xfs 2048s 100%
name 1 touro_xfs
print

Model: HGST  (scsi)
Disk /dev/sde: 4001GB
Sector size (logical/physical): 4096B/4096B
Partition Table: gpt

Number  Start   End     Size    File system  Name       Flags
 1      8389kB  4001GB  4001GB               touro_xfs

quit

mkpartで、File systemとしてxfsを指定しても、指定されない。Nameに、touro_xfsを設定した(あとで使う)。

ls-ql:~# partprobe /dev/usbdisk1
Error: Partition(s) 1, 16 on /dev/sde have been written, but we have been unable
 to inform the kernel of the change, probably because it/they are in use.  As a
result, the old partition(s) will remain in use.  You should reboot now before m
aking further changes.

再起動しないとkernelが認識しないと言われるが、/dev/usbdisk1_1が認識されている。
再起動せずに続行。

隘路

partprobeのメッセージに従い再起動しても、/dev/usbdisk1_1は認識されない(なくなる)。partprobeを実行すると認識される。つまり、partprobe実行して、再起動せずに続行せざるを得ない。

xfs作成

Touroは、論理/物理のセクタサイズが、4096の模様。セクタサイズ4096で、mkfsする。
>mkfs.xfs -s size=4096 -f /dev/usbdisk1_1
>mount /dev/usbdisk1_1 /mnt/usbdisk1
>xfs_info /mnt/usbdisk1
meta-data=/dev/usbdisk1_1        isize=256    agcount=32, agsize=30523504 blks
         =                       sectsz=4096  attr=0
data     =                       bsize=4096   blocks=976752128, imaxpct=25
         =                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=4096
log      =internal               bsize=4096   blocks=32768, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=0
realtime =none                   extsz=4096   blocks=0, rtextents=0

あとは、起動スクリプトに、partprobeの実行とmountを組込む。つづく。