linux fuse-exfat於嵌入式系統的設定
要讓linux支援exfat格式是頗麻煩的一件事
一開始先試用nofuse-exfat
但裡面所支援的readdir function在某些版本的linux kernel無法正常作業
導致其他程式要讀取隨身碟裡的檔案時無法顯示
因為我們也沒辦法隨便換kernel版本,所以就放棄使用nofuse-exfat
不能使用nofuse-exfat,那只好使用fuse-exfat
但是fuse-exfat比較複雜
需要至少兩包東西:
1.fuse-2.9.3
2.fuse-exfat-1.1.0
3.exfat-utils-1.1.1(這個應該不一定需要,但我還是放進去了)
於是乎就開始compile這三包東西了
1.fuse-2.9.3
這個算是比較簡單的了
只要將cross compile環境設定好應該就OK了
我自己寫了一個簡單的script來跑
./configure --prefix=$PWD/release --host=`/opt/toolchains/armv7-marvell-linux-gnueabi-softfp_i686/bin/arm-marvell-linux-gnueabi-gcc -dumpmachine` --enable-lib --enable-util --enable-example --exec-prefix=$PWD/release
make clean
make
mkdir release
mkdir release/lib
cp lib/.libs/libfuse* release/lib
因為我是在marvell 78460上跑,所以使用的gcc是marvell版本的
請自行代換
compile之後在fuse-2.9.3/lib/.libs裡會出現libfuse.so.2.9.3以及相關的link檔
這就表示成功啦~
到時fuse-exfat會需要reference這個lib以及include檔案夾內的東西
2.fuse-exfat-1.1.0
這個東西頗麻煩的
因為它是使用scons來compile的,而非一般常用的Makefile
所以請先下載scons
接下來要修改不少東西
(1)SConstruct
因為fuse-exfat會參考到fuse-2.9.3的lib跟include
請在SConstruct內加入粉紅色的兩行:
if platform.system() == 'Linux':
conf.env.Append(CPPDEFINES = '_GNU_SOURCE');
conf.env.Append(LIBPATH = ['../fuse-2.9.3/release/lib'])
conf.env.Append(CPPPATH = ['../fuse-2.9.3/include'])
這樣就OK了
(2)cross compile
看了一下SConstrct不太懂
後來搜尋一些網頁,在這邊得到很大的幫助
https://community.freescale.com/docs/DOC-94850
https://community.freescale.com/docs/DOC-94850
因此寫了一個簡單的script來幫助編譯
但比較重要的大概只有這一行:
scons SYSROOT=$PWD DESTDIR=$PWD/release CC=$GCC_PATH/bin/arm-marvell-linux-gnueabi-gcc AR=$GCC_PATH/bin/arm-marvell-linux-gnueabi-ar RANLIB=$GCC_PATH/bin/arm-marvell-linux-gnueabi-ranlib STRIP=$GCC_PATH/bin/arm-marvell-linux-gnueabi-strip install
簡單說就是要指向你cross compiler的環境
改完這邊應該就可以進行編譯了
但比較重要的大概只有這一行:
scons SYSROOT=$PWD DESTDIR=$PWD/release CC=$GCC_PATH/bin/arm-marvell-linux-gnueabi-gcc AR=$GCC_PATH/bin/arm-marvell-linux-gnueabi-ar RANLIB=$GCC_PATH/bin/arm-marvell-linux-gnueabi-ranlib STRIP=$GCC_PATH/bin/arm-marvell-linux-gnueabi-strip install
簡單說就是要指向你cross compiler的環境
改完這邊應該就可以進行編譯了
(3)libexfat/compiler.h
這時候執行scons,應該會出現下列error:
In file included from libexfat/exfat.h:33:0,
from fuse/main.c:30:
libexfat/compiler.h:28:2: error: #error C99-compliant compiler is required
scons: *** [fuse/main.o] Error 1
scons: building terminated because of errors.
解決方法就是將compiler.h內的某幾行給註解掉,原因應該很明顯
#if __STDC_VERSION__ < 199901L
#error C99-compliant compiler is required
#endif
compile完會出現mount.exfat執行檔
compile完會出現mount.exfat執行檔
3.exfat-utils-1.1.1
可參考第2項的(2)與(3)
可參考第2項的(2)與(3)
之後將編譯出來的libfuse.so.*與mount.exfat放到嵌入式平台上
應該就可以用來mount exfat格式的隨身碟了
P.S 之後我都是用buildroot來實現exfat,基本上就不需要上述這麼麻煩的步驟了
幾乎所有我需要的library通通都可以在buildroot上找到
而且rootfs丟上去就可以馬上用,完全不花費甚麼時間
目前只有遇過cpu suspend要另尋新的方法來實現
所以會建議大家嵌入式系統盡量使用這種tool去幫忙自己做library porting的動作
才不會被這些東西浪費掉太多寫code的時間
應該就可以用來mount exfat格式的隨身碟了
P.S 之後我都是用buildroot來實現exfat,基本上就不需要上述這麼麻煩的步驟了
幾乎所有我需要的library通通都可以在buildroot上找到
而且rootfs丟上去就可以馬上用,完全不花費甚麼時間
目前只有遇過cpu suspend要另尋新的方法來實現
所以會建議大家嵌入式系統盡量使用這種tool去幫忙自己做library porting的動作
才不會被這些東西浪費掉太多寫code的時間
留言
張貼留言