1. 程式人生 > >WD My Cloud Ex2 Ultra下的SVN(Subversion)編譯&配置(附編譯好的SVN的鏈接)

WD My Cloud Ex2 Ultra下的SVN(Subversion)編譯&配置(附編譯好的SVN的鏈接)

ron header sql mit arm-linux _file__ 4.2 ... mut

前言

前些陣子買了個WD的My Cloud EX2 Ultra,主要就是為了存放重要資料啥的。買回來發現配套的軟件中竟然沒有svn,於是便有了這篇折騰隨筆了。

軟硬件環境

1,WD My Cloud EX2 Ultra

硬件:

  • Marvell? ARMADA? 385 1.3 GHz 雙核
  • 1 GB DDR3

軟件:

其系統是剪裁過的Debain

2,交叉編譯平臺

Ubuntu 16.04.2 LTS server(安裝在VMware中)

工具鏈:armv7-marvell-linux-gnueabi-softfp_i686_64K_Dev_20131002.tar.gz(這個WD官網可下載到https://support.wdc.com/downloads.aspx?p=270&lang=en)

相關庫:apr-1.6.2.tar.gz

    apr-util-1.6.0.tar.gz

    expat-2.2.4.tar.bz2

    sqlite-snapshot-201709211311.tar.gz

    subversion-1.9.7.tar.gz

    zlib-1.2.11.tar.gz

    (這些庫基本上都是寫這篇隨筆時能下到的最新版本了)

編譯環境配置

在編譯相關庫的源碼前需要配置下編譯環境,相當簡單,通過鏈接https://support.wdc.com/downloads.aspx?p=270&lang=en(下載最新的包)下載下來的WDMyCloud_Ex2Ultra_GPL_v2.30.165_20170321.tar.gz中包含了目錄toolchains,該目錄中包含工具鏈和source.me文件,只需要在編譯前做兩步工作即可。

1,在toolchains目錄下解壓工具鏈:

tar -zxvf armv7-marvell-linux-gnueabi-softfp_i686_64K_Dev_20131002.tar.gz

2,在toolchains目錄下執行命令:

source source.me

即可配置好工具鏈,這樣就不用修改/etc/profile了。

另外,我是通過SecureCRT連接VMware中的ubuntu,可以安裝一個lrzsz:

sudo apt-get install lrzsz

這樣方便windows和ubuntu之間的文件傳輸。

編譯相關庫

1,apr

解壓:

tar -zxvf apr-1.6.2.tar.gz

cd apr-1.6.2/

設置相關參數:

在configure前,需要修改下Makefile.in將如下內容的紅色部分進行修改:

tools/[email protected]@: $(OBJECTS_gen_test_char)
  $(LINK_PROG) $(OBJECTS_gen_test_char) $(ALL_LIBS)

修改後的內容為:

tools/[email protected]@: $(OBJECTS_gen_test_char)
#  $(LINK_PROG) $(OBJECTS_gen_test_char) $(ALL_LIBS)

  gcc -Wall -O2 tools/gen_test_char.c -s -o tools/gen_test_char

切記"gcc -Wall -O2...."這行前面要按Tab鍵添加制表符,接著開始configure:

./configure --prefix=/home/test/res/apr --host=arm-marvell-linux-gnueabi ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes apr_cv_tcp_nodelay_with_cork=yes apr_cv_process_shared_works=yes apr_cv_mutex_robust_shared=yes ac_cv_sizeof_ssize_t=4 ac_cv_sizeof_size_t=4 ac_cv_sizeof_off_t=4 ac_cv_sizeof_struct_iovec=8 --cache=arm-linux.cache

其中--prefix=/home/test/res/test是我所設置的編譯好的庫的安裝路徑,大家可以根據自己的實際情況進行修改。另外ac_cv_sizeof_ssize_t=4 ac_cv_sizeof_size_t=4 ac_cv_sizeof_off_t=4需要重點說下,該參數如果不加入並不影響編譯過程,但是會在commit的時候會報如下錯誤:

Corrupt node-revision “0.0.t0-0”

Malformed text rep offset line in node-rev

開始編譯&安裝:

make

make install

2,expat

解壓:

tar -jxvf expat-2.2.4.tar.bz2

cd expat-2.2.4/

設置參數:

./configure --prefix=/home/test/res/expat --host=arm-marvell-linux-gnueabi

編譯&安裝:

make

make install

在我make的時候好像報了個docbook2x什麽的錯誤(當時安裝時沒有記下來),這個可以通過apt-get 安裝與docbook*相關的庫即可,這裏記憶有些模糊了,可自行搜索下。

3,apr-util

解壓:

tar -zxvf apr-util-1.6.0.tar.gz

cd apr-util-1.6.0/

設置參數:

./configure --prefix=/home/test/res/apr-util --host=arm-marvell-linux-gnueabi --with-expat=/home/test/res/expat --with-apr=/home/test/res/apr

編譯&安裝:

make

make install

4,sqlite

解壓:

tar -zxvf sqlite-snapshot-201709211311.tar.gz

cd sqlite-snapshot-201709211311/

設置參數:

./configure --prefix=/home/test/res/sqlite --host=arm-marvell-linux-gnueabi --enable-threadsafe

其中--enable-threadsafe這個需要設置,不然在svnadmin create的時候會報錯

編譯&安裝:

make

make install

5,zlib

解壓:

tar -zxvf zlib-1.2.11.tar.gz

cd zlib-1.2.11/

設置參數:

由於zlib的configure沒有--host可以指定編譯器和鏈接器,因此需要設置臨時的環境變量:

export CC=arm-marvell-linux-gnueabi-gcc

export CXX=arm-marvell-linux-gnueabi-g++

export LD=arm-marvell-linux-gnueabi-ld

然後再configure:

./configure --prefix=/home/test/res/zlib

編譯&安裝:

make

make install

6,subversion

解壓:

tar -zxvf subversion-1.9.7.tar.gz

cd subversion-1.9.7/

設置參數:

這裏需要在configure前修改該文件,因為1.9.7版本在configure的時候會報如下錯誤:

checking for Mach-O dynamic module iteration functions... configure: error: in `/home/test/workplace/subversion-1.9.7‘:
configure: error: cannot run test program while cross compiling

我的方法比較暴力,直接刪除configure中的如下內容(紅色標識的內容):

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mach-O dynamic module iteration functions" >&5
$as_echo_n "checking for Mach-O dynamic module iteration functions... " >&6; }
if test "$cross_compiling" = yes; then :
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd‘:" >&5
$as_echo "$as_me: error: in \`$ac_pwd‘:" >&2;}
as_fn_error $? "cannot run test program while cross compiling
See \`config.log‘ for more details" "$LINENO" 5; }
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */

#include <mach-o/dyld.h>
#include <mach-o/loader.h>

int
main ()
{

const struct mach_header *header = _dyld_get_image_header(0);
const char *name = _dyld_get_image_name(0);
if (name && header) return 0;
return 1;

;
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :

$as_echo "#define SVN_HAVE_MACHO_ITERATE 1" >>confdefs.h

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

else

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \

conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

當然,這篇文章[1]給出了另一種解決方案,同樣修改configure,紅色替換為綠色(不要加號):

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mach-O dynamic module iteration functions" >&5

$as_echo_n "checking for Mach-O dynamic module iteration functions... " >&6; }

if test "$cross_compiling" = yes; then :

- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd‘:" >&5

-$as_echo "$as_me: error: in \`$ac_pwd‘:" >&2;}

-as_fn_error $? "cannot run test program while cross compiling

-See \`config.log‘ for more details" "$LINENO" 5; }

+ { { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5

+$as_echo "no" >&6; }

+ }

else

cat confdefs.h - conftest.$ac_ext

/* end confdefs.h. */

修改configure完畢後開始configure:

./configure --prefix=/home/test/res/subversion --host=arm-marvell-linux-gnueabi --with-apr=/home/test/res/apr --with-apr-util=/home/test/res/apr-util --with-sqlite=/home/test/res/sqlite --with-zlib=/home/test/res/zlib --enable-all-static

這裏為了編譯出standalone的可執行文件,需要指定--enable-all-static。

在configure完成後,需要修改Makefile文件,

對如下紅色部分進行修改:

LIBS =

修改後為:

LIBS = -lpthread

就是讓工程鏈接工具鏈中的pthread庫,最後進行編譯&安裝:

make

make install

至此,編譯工作就結束了,檢查一下看看:

技術分享

哈哈,可以看出,編譯出的版本為ARM版。

安裝配置

拷貝可執行文件(svnadmin和svnserve):

接下來需要在My Cloud中進行配置,首先通過ssh登陸My Cloud,這裏提一點,由於My Cloud自身的存儲空間有限(供安裝系統和相關應用的空間,不是指的/mnt下掛載的磁盤空間),因此,需要將subversion可執行文件放在/mnt下掛載的磁盤中,執行下列命令創建放置可執行文件的目錄:

cd /mnt/HD/HD_a2/Public/

mkdir subversion

這樣就在磁盤上創建了subversion目錄(這裏,/mnt/HD/HD_a2/Public目錄是我的Public共享目錄的路徑,或許每個人都不同),這時通過在windows資源管理器的地址欄中輸入\\192.168.1.102即可訪問到Public目錄下的subversion目錄,將編譯好的subversion可執行文件(主要是svnadmin和svnserve)拷貝到subversion目錄下。

建立軟連接:

ln -s /mnt/HD/HD_a2/Public/subversion/svnadmin /usr/bin/svnadmin

ln -s /mnt/HD/HD_a2/Public/subversion/svnserve /usr/bin/svnserve

建立倉庫&運行:

可以通過執行如下命令(示例命令)建立倉庫:

svnadmin create /home/test/svn/reps

以上命令會在/home/test/svn目錄下建立名為reps的倉庫,當然在千萬不要在My Cloud自身的存儲空間中創建倉庫,因為空間根本不夠,可以在掛載的磁盤中創建。

接下來需要分別修改倉庫的conf目錄下的相關文件,具體怎麽修改,直接搜即可,有很多教程。

最後運行svnserve:

sudo svnserve -d -r /home/test/svn

最後註意一點,-r後跟的目錄是到/home/test/svn而不是/home/test/svn/reps,切記!!

在電腦端運行小烏龜TortoisSVN試試,對應以上示例地址為:

svn://192.168.1.102/reps

不出意外應該就可以checkout和commit了。

寫在最後:

不想折騰的兄弟,我把編譯好的可執行文件給上傳了,直接下即可,以下為網盤地址。(切記!!型號不要搞錯了,該版本對應WD My Cloud EX2 Ultra

http://pan.baidu.com/s/1mhYEAuO

參考文獻:

[1] http://bbs.xiaomi.cn/t-13322484

WD My Cloud Ex2 Ultra下的SVN(Subversion)編譯&配置(附編譯好的SVN的鏈接)