linuxarmftp
① 請教過來人:我打算畢業找嵌入式的偏底層方面的工作,想報名參加軟考但不知道該考哪一類
國網路工程師技術水平認證考試(NCNE) 國家信息化工程師認證考試國家網路技術水平認證考試及培訓報名信息 中國信息產業部為推動和引導網路人才培訓,測評網路從業人員的專業技術水平,為信息化建設和信息產業發展提供更多的合格人才,信息產業部全國信息化工程師認證考試管理中心於2002年,通過與知名的國際信息技術與信息人才專業測評機構——美國國家通信系統工程師協會,聯合認證,共同推出國家網路技術水平考試(The National Certification of Network Engineer,簡稱NCNE)。 該認證考試及培訓實踐性強、內容新,與國際最新網路技術銜接緊密,實驗操作部分設計合理,注重理論與實踐的高度結合。 現2005年認證考試與培訓報名工作已開始,請踴躍報名,積極參加。考生通過考試,可同時獲得信息產業部全國信息化工程師認證考試管理中心頒發的相應級別證書和美國國家通信系統工程師協會的認證證書,成為國內外認可的網路技術專業人員,並被加入到國家信息化人才資料庫、國際通信系統工程師協會人才庫以及中國西安人才網IT人才庫。該證書可作為學員出國留學以及獎學金申請的有效證件。 該認證考試為目前我國公開推行的網路技術水平認證體系,創立了我國自主認證品牌。 一、報考及培訓類別: 1. NCNE一級認證; 2. NCNE二級認證。 二、報名及考試辦法: 根據05年度考試安排,採取常年報名、定期培訓、統一考試、集中頒證。單位集體和個人自願報名均可。 國家網路技術工程師水平認證考試內容及安排 級 認 證 使學員具備設計、實現、維護和管理各種常用小型區域網的技能,並了解相關的初步理論知識。•網路基礎知識 網路布線 OSI參考模型與網路協議 網路互連設備 區域網技術 IP地址的劃分與配置 •Windows98操作系統的安裝、配置與管理 linux操作系統的安裝、配置與管理 在不同操作系統平台(Win98/WinNT/Linux)上實現文件服務與列印服務 基於不同操作系統平台(Win98/WinNT/Linux)的網路接入方案 其它典型網路操作系統的介紹及其同Windows網路的互連 網路安全簡介•安裝和維護各種常用小型區域網的物理設備; 配置各種常用小型區域網的TCP/IP參數配置和維護各種常用小型區域網的文件伺服器和列印伺服器; 配置PC機和各種常用小型區域網連接到Internrt; 保證各種常用小型區域網正常運行。 二 級 認 證 使學員具備配置、管理和維護多種常用的、多平台的、包含廣域網連接的且功能完善的小型企業網的技能和相關理論知識•通信基礎知識 以太區域網的幀結構與工作原理 網橋、交換機的原理與使用 虛擬區域網(VLAN) 令牌環與FDDI ATM網路 TCP/IP協議與應用服務的實現 路由器原理與路由協議 廣域網技術 網路安全 網路監視、管理與排錯•安裝、配置和維護DHCP伺服器、DNS伺服器、ftp伺服器和WWW伺服器 按照網路管理的需求劃分IP子網 管理和維護多種常見的廣域網連接 安裝、配置和維護小型防火牆軟體 監視網路運行並能排除簡單故障 保證各種常用小型企業網的正常運行。 1、網路工程考試共分五個等級,即網路管理員、助理網路工程師、網路工程師、高級網路工程師和高級網路專家。 2、網路工程師課程有計算機與網路技術、windows系統管理、資料庫基礎管理、計算機病毒防治、Linux基礎、構造大型企業網路、Windows網路服務管理、Linux網路服務管理、企業郵件系統解決方案、資料庫管理、網路安全及解決方案等 不要忘了給我追加點積分哦,呵呵....
② 如何通過arm上傳數據到遠方的FTP伺服器
ftp移植(默認埠號21)
一、下載軟體包:vsftpd-2.1.2.tar.gz,解壓(tar –zxvf vsftpd-2.1.2.tar.gz)
二、交叉編譯:
1、 修改Makefile:修改CC=gcc為CC=arm-linux-gcc
2、 修改vsf_findlibs.sh文件,去掉#Look for libcap部分,因為源碼版本的不同,語句可能不同,2.1.2版本去掉的代碼如下:
# Look for libcap (capabilities)
#if locate_library /lib/libcap.so.1; then
# echo 「/lib/libcap.so.1」;
#elif locate_library /lib/libcap.so.2; then
# echo 「/lib/libcap.so.2」;
#else
# locate_library /usr/lib/libcap.so && echo 「-lcap」;
# locate_library /lib/libcap.so && echo 「-lcap」;
#fi
3、#make,之後會生成幾個可執行文件,其中vsftpd就是我們需要的,查看vsftpd的類型
#file vsftpd
#arm-linux-readelf –d vsftpd,查看vsftpd文件的依賴庫
拷貝相應庫到板子的/usr/lib目錄下(此步驟可省略不添加庫時運行也正常)
三、文件下載和配置:
1、將vsftpd拷貝到/usr/sbin目錄下
2、 拷貝vsftpd.conf到/etc目錄下,修改配置如下:
anonymous_enable=YES //允許匿名用戶
local_enable=YES //本地訪問
write_enable=YES //可修改
local_umask=077 //創建的文件許可權
anon_upload_enable=YES //允許匿名用戶上傳
anon_mkdir_write_enable=YES //可創建文件夾和修改文件夾內的文件
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
pam_service_name=vsftpd //服務名稱
ftp_username=ftp
no_anon_password=YES //匿名用戶登錄不需要密碼
anon_root=/home/ftp //匿名用戶根目錄
anon_world_readable_only=YES
tcp_wrappers=NO
3、創建用戶,可根據需要創建和設置用戶許可權
4、 創建文件夾:
i. mkdir /var/ftp
ii. mkdir /var/ftp/pub
iii. chmod 777 /var/ftp/pub
註:所有的都必須跟/etc/vsftpd.conf中的完全一致才行
5、與配置相關的:
/usr/sbin/vsftpd ---- VSFTPD的主程序(必需)
/etc/rc.d/init.d/vsftpd ---- 啟動腳本
/etc/vsftpd.conf ---- 主配置文件(必需)
/etc/pam.d/vsftpd ---- PAM認證文件
/etc/vsftpd.ftpusers ---- 禁止使用VSFTPD的用戶列表文件
/etc/vsftpd.user_list ---- 禁止或允許使用VSFTPD的用戶列表文件(如果在配置文 件中指定了,則不能用匿名用戶登錄)
/etc/userconf ------ 指定用戶個人配置文件所在的目錄
/var/ftp ---- 匿名用戶主目錄
/var/ftp/pub---- 匿名用戶的上傳目錄
/var/log/vsftpd.log ------- 日誌文件
除vsftpd、vsftpd.conf兩個文件外,其他文件的需要具體看主配置文件的配置
6、用戶設置:一般只要剛啟動root用戶是可以登錄的,而且許可權很高,如果向增加用戶,可以用如下命令:a
#dser –G ftp –h/根目錄 用戶名
#passwd 用戶名
#chown 用戶名。ftp /目錄 –R
#chmod 755 /目錄 –R
之後重啟vsftpd服務,就可以用新的用戶名登錄了
7、測試的時候一定要保證板子是能夠ping通的!
8、具體配置:Vsftpd.conf配置:
anonymous_enable=YES
#允許匿名訪問
local_enable=YES
#允許本地用戶訪問(/etc/passwd中的用戶)
write_enable=YES
#允許寫入許可權,包括修改,刪除
local_umask=022
#本地用戶文件上傳後的許可權是-rw-r-r
#anon_umask=077
#匿名用戶上傳後許可權是-rw----
anon_world_readable_only=YES
#允許匿名用戶瀏覽,下載文件
anon_upload_enable=YES
#允許匿名用戶上傳
#anon_mkdir_write_enable=YES
#允許匿名用戶建立目錄
anon_other_write_enable=YES
#允許匿名用戶具有建立目錄,上傳之外的許可權,如重命名,刪除
dirmessage_enable=YES
#當使用者轉換目錄,則會顯示該目錄下的。message信息
xferlog_enable=YES
#記錄s使用者所有上傳下載信息
xferlog_file=/var/log/vsftpd.log
#將上傳下載信息記錄到/var/log/vsftpd.log中
connect_from_port_20=YES
#確保ftp-datad 數據傳送使用port 20
idle_session_timeout=600
#如果使用者600秒沒有動作,則踢出
chroot_list_enable=YES
#限制使用者不能離開家目錄,例如blue登陸後位於/home/blue下,設置該選項後,他不可以轉到/home/blue的上層目錄,如/bin, /usr,/opt…etc。
chroot_list_file=/etc/vsftpd.chroot_list
#與上條同時使用,設置限制使用者的存放文件為/etc/vsftpd.chroot_list
#建立文本文件/etc/vsftpd.chroot_list,寫入要限制的用戶,一行一個。
#如果希望限制所有用戶,則可以設置chroot_local_user=YES 代替上面兩行
tcp_wrappers=YES
#支持tcp_wrappers,限制訪問(/etc/hosts.allow,/etc/hosts.deny)
listen=YES
#使用standalone啟動vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推薦使用standalone方式)
listen_port=21
#ftp監聽埠
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd.user_list
#以上三條設定不允許登陸的用戶,用戶列表存放在/etc/vsftpd.user_list中,一行一個帳號
pam_service_name=vsftpd
#PAM所 使用的名稱。同userlist_*一樣限制用戶登陸,不同的是userlist_*在進行密碼驗證之前拒絕用戶登陸,pam是在密碼驗證之後拒絕登陸。 (提示密碼錯誤) 用戶列表默認存放在/etc/ftpusers中,一行一個。 (可通過/etc/pam.d/vsftpd重定向用戶列表存放文件)
#獲得 /etc/pam.d/vsftpd:
#[root@LFS vsftpd-2.0.1]#cp RedHat/vsftpd.pam /etc/pam.d/vsftpd
max_clients=100
#最大用戶在線數量
max_per_ip=2
#每ip最大線程
anon_max_rate=30000
#匿名用戶最大傳輸速度 單位: bytes/秒
local_max_rate=50000
#本地用戶最大傳輸速度 單位:bytes/秒
user_config_dir=/etc/userconf
#個別用戶配置目錄(用來設定特殊帳號),例如我想讓blue這個用戶的傳輸速度是100KB
就可以在/etc/userconf/下創建文本文件blue(與用戶名相同),加入local_max_rate=100000即可
anon_root=/var/ftp
#設定匿名用戶登陸後所在的目錄
local_root=/var/local_user
#設定所有本地用戶登陸後的目錄,如不設置此項,則本地用戶登陸後位於各自家目錄下。
use_localtime=YES
#使用本地時間而不是GMT
nopriv_user=vsftpd
#設定服務執行者為vsftpd,默認使用的是nobody,vsftpd推薦使用一個許可權很低的用戶。這里用vsftpd代替nobody,創建 vsftpd用戶:
9、創建ftp虛擬用戶:
a) 安裝db_load:apt-get install db4.6-util
③ 如何建立Linux下的ARM交叉編譯環境
這個過程如下
1. 下載源文件、補丁和建立編譯的目錄
2. 建立內核頭文件
3. 建立二進制工具(binutils)
4. 建立初始編譯器(bootstrap gcc)
5. 建立c庫(glibc)
6. 建立全套編譯器(full gcc)
下載源文件、補丁和建立編譯的目錄
1. 選定軟體版本號
選擇軟體版本號時,先看看glibc源代碼中的INSTALL文件。那裡列舉了該版本的glibc編譯時所需的binutils 和gcc的版本號。例如在 glibc-2.2.3/INSTALL 文件中推薦 gcc 用 2.95以上,binutils 用 2.10.1 以上版本。
我選的各個軟體的版本是:
linux-2.4.21+rmk2
binutils-2.10.1
gcc-2.95.3
glibc-2.2.3
glibc-linuxthreads-2.2.3
如果你選的glibc的版本號低於2.2,你還要下載一個叫glibc-crypt的文件,例如glibc-crypt-2.1.tar.gz。 Linux 內核你可以從www.kernel.org 或它的鏡像下載。
Binutils、gcc和glibc你可以從FSF的FTP站點ftp://ftp.gun.org/gnu/ 或它的鏡像去下載。在編譯glibc時,要用到 Linux 內核中的 include 目錄的內核頭文件。如果你發現有變數沒有定義而導致編譯失敗,你就改變你的內核版本號。例如我開始用linux-2.4.25+vrs2,編譯glibc-2.2.3 時報 BUS_ISA 沒定義,後來發現在 2.4.23 開始它的名字被改為 CTL_BUS_ISA。如果你沒有完全的把握保證你改的內核改完全了,就不要動內核,而是把你的 Linux 內核的版本號降低或升高,來適應 glibc。
Gcc 的版本號,推薦用 gcc-2.95 以上的。太老的版本編譯可能會出問題。Gcc-2.95.3 是一個比較穩定的版本,也是內核開發人員推薦用的一個 gcc 版本。
如果你發現無法編譯過去,有可能是你選用的軟體中有的加入了一些新的特性而其他所選軟體不支持的原因,就相應降低該軟體的版本號。例如我開始用 gcc-3.3.2,發現編譯不過,報 as、ld 等版本太老,我就把 gcc 降為 2.95.3。太新的版本大多沒經過大量的測試,建議不要選用。
2. 建立工作目錄
首先,我們建立幾個用來工作的目錄:
在你的用戶目錄,我用的是用戶liang,因此用戶目錄為 /home/liang,先建立一個項目目錄embedded。
$pwd
/home/liang
$mkdir embedded
再在這個項目目錄 embedded 下建立三個目錄 build-tools、kernel 和 tools。
build-tools-用來存放你下載的 binutils、gcc 和 glibc 的源代碼和用來編譯這些源代碼的目錄。
kernel-用來存放你的內核源代碼和內核補丁。
tools-用來存放編譯好的交叉編譯工具和庫文件。
$cd embedded
$mkdir build-tools kernel tools
執行完後目錄結構如下:
$ls embedded
build-tools kernel tools
3. 輸出和環境變數
我們輸出如下的環境變數方便我們編譯。
$export PRJROOT=/home/liang/embedded
$export TARGET=arm-linux
$export PREFIX=$PRJROOT/tools
$export TARGET_PREFIX=$PREFIX/$TARGET
$export PATH=$PREFIX/bin:$PATH
如果你不慣用環境變數的,你可以直接用絕對或相對路徑。我如果不用環境變數,一般都用絕對路徑,相對路徑有時會失敗。環境變數也可以定義在.bashrc文件中,這樣當你logout或換了控制台時,就不用老是export這些變數了。
體系結構和你的TAEGET變數的對應如下表
你可以在通過glibc下的config.sub腳本來知道,你的TARGET變數是否被支持,例如:
$./config.sub arm-linux
arm-unknown-linux-gnu
在我的環境中,config.sub 在 glibc-2.2.3/scripts 目錄下。
網上還有一些 HOWTO 可以參考,ARM 體系結構的《The GNU Toolchain for ARM Target HOWTO》,PowerPC 體系結構的《Linux for PowerPC Embedded Systems HOWTO》等。對TARGET的選取可能有幫助。
4. 建立編譯目錄
為了把源碼和編譯時生成的文件分開,一般的編譯工作不在的源碼目錄中,要另建一個目錄來專門用於編譯。用以下的命令來建立編譯你下載的binutils、gcc和glibc的源代碼的目錄。
$cd $PRJROOT/build-tools
$mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch
build-binutils-編譯binutils的目錄
build-boot-gcc-編譯gcc 啟動部分的目錄
build-glibc-編譯glibc的目錄
build-gcc-編譯gcc 全部的目錄
gcc-patch-放gcc的補丁的目錄
gcc-2.95.3 的補丁有 gcc-2.95.3-2.patch、gcc-2.95.3-no-fixinc.patch 和gcc-2.95.3-returntype-fix.patch,可以從 http://www.linuxfromscratch.org/ 下載到這些補丁。
再將你下載的 binutils-2.10.1、gcc-2.95.3、glibc-2.2.3 和 glibc-linuxthreads-2.2.3 的源代碼放入 build-tools 目錄中
看一下你的 build-tools 目錄,有以下內容:
$ls
binutils-2.10.1.tar.bz2 build-gcc gcc-patch
build-binutls build-glibc glibc-2.2.3.tar.gz
build-boot-gcc gcc-2.95.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz
建立內核頭文件
把你從 www.kernel.org 下載的內核源代碼放入 $PRJROOT /kernel 目錄
進入你的 kernel 目錄:
$cd $PRJROOT /kernel
解開內核源代碼
$tar -xzvf linux-2.4.21.tar.gz
或
$tar -xjvf linux-2.4.21.tar.bz2
小於 2.4.19 的內核版本解開會生成一個 linux 目錄,沒帶版本號,就將其改名。
$mv linux linux-2.4.x
給 Linux 內核打上你的補丁
$cd linux-2.4.21
$patch -p1 < ../patch-2.4.21-rmk2
編譯內核生成頭文件
$make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
你也可以用 config 和 xconfig 來代替 menuconfig,但這樣用可能會沒有設置某些配置文件選項和沒有生成下面編譯所需的頭文件。推薦大家用 make menuconfig,這也是內核開發人員用的最多的配置方法。配置完退出並保存,檢查一下的內核目錄中的 include/linux/version.h 和 include/linux/autoconf.h 文件是不是生成了,這是編譯 glibc 是要用到的,version.h 和 autoconf.h 文件的存在,也說明了你生成了正確的頭文件。
還要建立幾個正確的鏈接
$cd include
$ln -s asm-arm asm
$cd asm
$ln -s arch-epxa arch
$ln -s proc-armv proc
接下來為你的交叉編譯環境建立你的內核頭文件的鏈接
$mkdir -p $TARGET_PREFIX/include
$ln -s $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include/linux
$in -s $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include/asm
也可以把 Linux 內核頭文件拷貝過來用
$mkdir -p $TARGET_PREFIX/include
$cp -r $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include
$cp -r $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include
建立二進制工具(binutils)
binutils是一些二進制工具的集合,其中包含了我們常用到的as和ld。
首先,我們解壓我們下載的binutils源文件。
$cd $PRJROOT/build-tools
$tar -xvjf binutils-2.10.1.tar.bz2
然後進入build-binutils目錄配置和編譯binutils。
$cd build-binutils
$../binutils-2.10.1/configure --target=$TARGET --prefix=$PREFIX
--target 選項是指出我們生成的是 arm-linux 的工具,--prefix 是指出我們可執行文件安裝的位置。
會出現很多 check,最後產生 Makefile 文件。
有了 Makefile 後,我們來編譯並安裝 binutils,命令很簡單。
$make
$make install
看一下我們 $PREFIX/bin 下的生成的文件
$ls $PREFIX/bin
arm-linux-addr2line arm-linux-gasp arm-linux-objmp arm-linux-strings
arm-linux-ar arm-linux-ld arm-linux-ranlib arm-linux-strip
arm-linux-as arm-linux-nm arm-linux-readelf
arm-linux-c++filt arm-linux-obj arm-linux-size
我們來解釋一下上面生成的可執行文件都是用來干什麼的
add2line - 將你要找的地址轉成文件和行號,它要使用 debug 信息。
Ar-產生、修改和解開一個存檔文件
As-gnu 的匯編器
C++filt-C++ 和 java 中有一種重載函數,所用的重載函數最後會被編譯轉化成匯編的標號,c++filt 就是實現這種反向的轉化,根據標號得到函數名。
Gasp-gnu 匯編器預編譯器。
Ld-gnu 的連接器
Nm-列出目標文件的符號和對應的地址
Obj-將某種格式的目標文件轉化成另外格式的目標文件
Objmp-顯示目標文件的信息
Ranlib-為一個存檔文件產生一個索引,並將這個索引存入存檔文件中
Readelf-顯示 elf 格式的目標文件的信息
Size-顯示目標文件各個節的大小和目標文件的大小
Strings-列印出目標文件中可以列印的字元串,有個默認的長度,為4
Strip-剝掉目標文件的所有的符號信息
建立初始編譯器(bootstrap gcc)
首先進入 build-tools 目錄,將下載 gcc 源代碼解壓
$cd $PRJROOT/build-tools
$tar -xvzf gcc-2.95.3.tar.gz
然後進入 gcc-2.95.3 目錄給 gcc 打上補丁
$cd gcc-2.95.3
$patch -p1< ../gcc-patch/gcc-2.95.3.-2.patch
$patch -p1< ../gcc-patch/gcc-2.95.3.-no-fixinc.patch
$patch -p1< ../gcc-patch/gcc-2.95.3-returntype-fix.patch
echo timestamp > gcc/cstamp-h.in
在我們編譯並安裝 gcc 前,我們先要改一個文件 $PRJROOT/gcc/config/arm/t-linux,把
TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC
這一行改為
TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h
你如果沒定義 -Dinhibit,編譯時將會報如下的錯誤
http://www.cnblogs.com/gcc-2.95.3/gcc/libgcc2.c:41: stdlib.h: No such file or directory
http://www.cnblogs.com/gcc-2.95.3/gcc/libgcc2.c:42: unistd.h: No such file or directory
make[3]: *** [libgcc2.a] Error 1
make[2]: *** [stmp-multilib-sub] Error 2
make[1]: *** [stmp-multilib] Error 1
make: *** [all-gcc] Error 2
④ 如何在Windows上建立arm-linux開發環境
在嵌入式產品大行其道的今天,Linux經過裁剪和優化而成的uClinux在嵌入式領域眾多的操作系統中佔有一席之地。從uClinux字面上就可以看出它的含義,即「微控制器領域中的Linux系統」。
uClinux從Linux 2.0/2.4內核派生而來,沿襲了Linux的絕大部分特性。它是專門針對沒有MMU(內存管理單元)的CPU,並且為嵌入式系統做了許多小型化的工作。它通常用於具有很少內存或Flash的嵌入式操作系統。在GNU通用許可證的保證下,運行uClinux操作系統的用戶可以使用幾乎所有的Linux API函數。由於經過了裁剪和優化,它形成了一個高度優化,代碼緊湊的嵌入式Linux。它具有體積小、穩定、良好的移植性、優秀的網路功能、完備的對各種文件系統的支持,以及豐富的API函數等優點。uClinux與Linux在兼容性方面表現出色,uClinux除了不能實現fork()外,其餘uClinux的API函數與標准Linux完全相同。
uClinux的基本架構
Boot Loader:負責Linux內核的啟動,用於初始化系統資源。這部分代碼用於建立Linux內核運行環境和從Flash中裝載初始化Ramdisk。
內核初始化:Linux內核的入口點是start kernel()函數。它初始化內核的其它部分,包括捕獲、IRQ通道、調度、設備驅動、標定延遲循環,最重要的是能夠fork「init」進程,以啟動整個多任務環境。
系統調用函數/捕獲函數:在執行完「init」程序後,內核對程序流不再有直接地控制權。此後,它的作用僅僅是處理非同步事件(例如硬體中斷)和為系統調用提供進程。
設備驅動:設備驅動占據了Linux內核很大部分。同其它操作系統一樣,設備驅動為它們所控制的硬體設備和操作系統提供介面。
文件系統:Linux最重要的特性之一就是對多種文件系統的支持。這種特性使得Linux很容易地同其它操作系統共存。文件系統的概念使得用戶能夠查看存儲設備上的文件和路徑而無須考慮實際物理設備的文件系統類型。
交叉編譯環境
uClinux是一個出色的開發平台,但是在我們能在電腦上編寫自己的嵌入式應用程序之前,還必須做的一件事,就是給uClinux建立完善的編譯環境。關於交叉編譯,簡單地講是指在一個平台(操作系統)上可以生成能在另一個平台上執行的代碼。
但是對於有些不是很懂Linux環境的人來講,用uClinux開發程序會感到諸多不便。這里提供了在裝有Windows系統的宿主機(開發時所用的機器)上建立交叉編譯環境的方法。
為了在Windows下開發嵌入式操作系統應用程序,可以在Windows環境下裝上Cygwin軟體。Cygwin是一個在Windows平台上運行的Unix模擬環境,是Cygnus Solutions公司開發的自由軟體。它對於學習掌握Unix/Linux操作環境,或者進行某些特殊的開發工作,尤其是使用GNU工具集在Windows上進行嵌入式系統開發,非常有用。
Cygnus首先把gcc、gdb等開發工具進行了改進,使它們能夠生成並解釋WIN32的目標文件。然後,把這些工具移植到Windows平台上去。一種方案是基於WIN32 APl對這些工具的源代碼進行大幅修改,這樣做顯然需要大量工作。因此,Cygnus採取了一種不同的方法——他們寫了一個共享庫(就是cygwinl.d11),把WIN32 API中沒有的Unix風格的調用(如fork、spawn、signals、select、sockets等)封裝在裡面。也就是說,他們基於WIN32 APl寫了一個Unix系統庫的模擬層。這樣,只要把這些工具的源代碼和這個共享庫連接到一起,就可以使用Unix主機上的交叉編譯器來生成可以在Windows平台上運行的工具集。以這些移植到Windows平台上的開發工具為基礎,Cygnus又逐步把其它的工具(幾乎不需要對源代碼進行修改,只需要修改他們的配置腳本)軟體移植到Windows上來。這樣,在Windows平台上運行bash和開發工具、用戶工具,感覺好像在Unix上工作。
生成交叉編譯器
Cygwin軟體目前最新版本是Cygwin DLL 1.5.9-1。它的網址是http:// Cygwin.com,上面就有該程序的壓縮包,下載後解壓安裝就ok了。
在自己生成交叉編譯器之前,首先對Cygwin進行一些設置。假設Cygwin安裝在e目錄下,在打開Cygwin窗口之前,進入到E:\Cygwin目錄。在這個目錄下,有一個文件名為Cygwin.bat的批處理文件,編輯該文件,在第一行後加入setCYGWIN--titlentea,這是因為Cygwin的啟動批處理文件需要啟動Unix文件系統模擬。修改完畢且保存後退出。雙擊桌面上的Cygwin圖標,打開後默認用戶為在Windows中登錄的用戶名(這里所使用的操作系統是Windows 2000 Professsional),在根目錄(即E:\cygwin)下輸入:
cd bin
mV Sh.exe Sh—original.exe
n —S bash.exe Sh.Exe
做上述幾步的原因是大多數Linux系統把sh符號鏈接到bash,而Cygwin上的sh.exe和bash.exe是不同的,因此必須用bash代替sh。
從網站上下載生成工具鏈的各種源碼,根據腳本文件build-ucLinux-tools.sh建立可在Windows下編譯用戶應用程序的交叉編譯器,生成的交叉編譯器最終被打包為arm-elf-tools-cygwin-yyyymmdd.tar.gz的文件,其中YYYY為生成交叉編譯器的年,mm為生成交叉編譯器的月份,dd為日期。
這里,需要注意的是在生成交叉編譯器的過程中,可能會遇到多次錯誤,讀者應該根據給出的出錯信息,進行相應文件的修改。由於習慣上的原因,Linux下的壓縮文件一般都是以.tar.gz或者.tgz結尾的。雖然用Windows下的解壓軟體,比如winzip或者winrar也可以解壓這些文件,但是不推薦使用這類解壓軟體,因為可能會造成某些信息的丟失。
⑤ 如何使linux內核2.6.31支持yaffs2文件系統
下面操作的前提是:內核支持nand flash
一. 下載yaffs2源碼,(我將源碼反正/opt目錄下),並解壓源碼,進入源碼目錄
# tar xzvf yaffs2.tar.gz
# cd yaffs2
二. 為內核添加yaffs2文件系統補丁,執行:
# ./patch-ker.sh c m /..../linux-2.6.31.1 <----c m後面接的是內核源碼所在的目錄
執行完後,在內核源碼fs目錄下就多了一個yaffs2目錄,同時Makefile和Kconfig文件也增加了對yaffs2的配置和編譯條件。
三. 配置內核對yaffs2的支持
這里的配置根據自己的需求,把不用的文件系統都去掉。
#make menuconfig
找到下面的配置:
File systems --->
DOS/FAT/NT Filesystems --->
<*> MSDOS fs support
<*> VFAT (Windows95) fs support
Miscellaneous filesystems --->
<*> YAFFS2 file system support
[*] Autoselect yaffs2 format
配置語言選項:
Native Language support --->
(iso8859-1) Default NLS Option
<*> Codepage 437(United States, Canada)
<*> Simplified Chinese charset(CP936, GB2312)
<*> NLS ISO8859-1 (Latin 1; Western European Language)
<*> NLS UTF-8
現在內核已經支持NandFlash和yaffs2文件系統,重新編譯內核:
#make zImage
將編譯好的內核燒入NandFlash後,再燒入yaffs2文件系統,就可以了。
四. 製作yaffs2根文件系統
1. 環境
(1) 交叉編譯器版本: arm-linux-gcc 4.3.3
(2) Linux環境:redhat enterprise 5.5 (2.6.18-194.el5)
(3) 開發板:TQ2440
2. 編譯busybox
(1) 獲取busybox源碼,放在/opt目錄下,解壓,進入busybox源碼目錄
#tar jxvf busybox-1.17.2.tar.bz2
#cd busybox-1.17.2
#vi Makefile
將164行改為CROSS_COMPILE = arm-linux-
將190行改為ARCH = arm
保存退出進入配置菜單
#make menuconfig 採用默認配置保存推出
#make
#make install
通過上面的步驟,在busybox-1.17.2的根目錄下出現了一個_install目錄,
在該目錄下又有三個目錄文件bin sbin usr和一個鏈接文件 linuxrc。
3. 創建根文件系統必要的目錄
(1)在/opt目錄下創建root_fs目錄
#mkdir root_fs
#cd root_fs
(2)將busybox-1.17.2的根目錄下_install中的bin sbin usr和linuxrc拷貝到root_fs
#cp -rf /opt/busybox-1.17.2/_install/* /opt/root_fs
(3)創建必要的目錄
#mkdir dev etc home lib mnt opt proc root sys tmp var
(4)創建必要的二級目錄
#mkdir usr/lib usr/share
#mkdir etc/rc.d
#mkdir var/lib var/lock var/run var/tmp
4. 創建必要的文件
(1) 獲取庫文件,(交叉編譯工具下的庫文件)到root_fs/lib目錄中
#cp -rf /opt/arm/4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -a
(2) 將主機etc目錄下的passwd、group、shadow文件拷貝到root_fs/etc目錄下
#cp -f /etc/passwd /etc/group /etc/shadow etc
將目錄/opt/busybox-1.17.2/examples/bootfloppy/etc下的所有文件拷貝到root_fs/etc下。
在這個目錄下有三個文件fstab, inittab, profile和一個目錄init.d,在目錄init.d中有一個文件rcS。
#cp -rf /opt/busybox-1.17.2/examples/bootfloppy/etc/* etc
在目錄etc下創建文件mdev.conf。mdev是?v的一個簡化版本,
我們可以通過文件mdev.conf自定義一些設備節點的名稱或鏈接來滿足特定的需要,但在此處讓它為空。
#touh etc/mdev.conf
(3)創建兩個設備文件dev/console dev/null。
在linux內核源碼文件init/main.c中有打開設備文件dev/console的操作如下:
static noinline int init_post(void)
__releases(kernel_lock)
{
………………………………
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");
………………………………
}
內核啟動執行到這里時mdev還沒有構建dev目錄,如果沒有創建設備文件dev/console就將會列印警告
Warning: unable to open an initial console。
在內核啟動的過程中要將產生的一些垃圾信息丟棄就需要空設備dev/null。
#mknod dev/console c 5 1
#mknod dev/null c 1 3
5. 修改文件
在啟動過程中bootloader會傳遞參數init=/linuxrc給內核的main()函數,所以在文件系統被掛載後,
運行的第一個程序是linuxrc,而linuxrc是一個指向/bin/busybox的鏈接文件,也就是說文件系統被掛在後運行的第一個程序是busybox。
Busybox首先會解析文件/etc/inittab,這個文件中存放的是系統的配置信息,這些配置信息指明了接下來將要啟動那些程序。
-------------------------------------------------------------------------------------------------------
(1)修改文件etc/inittab如下
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
說明:
/etc/inittab 文件中每個條目用來定義一個子進程,並確定它的啟動方法,格式如下
:::
:表示這個進程要使用的控制台(即標准輸入、標准輸出、標准錯誤設備)。如果省 略,則使用與init進程一樣的控制台。
:對於Busybox init程序,這個欄位滑意義,可以省略。
:表示init程序如何控制這個子進程,
: 要執行的程序,它可以是可執行程序,也可以是腳本
文件etc/inittab配置條目說明如下:
::sysinit:/etc/init.d/rcS
啟動系統初始化文件/etc/init.d/rcS。欄位sysinit表明文件/etc/init.d/rcS在系統啟動後最先執行,
並且只執行一次,init進程等待它結束才繼續執行其它動作。(腳本文件名一般為rc,後綴S代表單用戶運行級別腳本)
tq2440_serial0::askfirst:-/bin/sh
在串口s3c2410_serial0上啟動askfirst動作的shell。
S3C2410的串口名在/dev下是s3c2410_serialx。askfirst表明init進程先輸出 「Please press Enter to actvie this console」,
等用戶輸入回車鍵之後才啟動-/bin/sh。
::ctrlaltdel:/sbin/reboot
當按下Ctrl+Alt+Delete組合鍵時,init重啟執行程序。欄位ctrlaltdel表明當按下Ctrl+Alt+Delete組合鍵時,執行相應的進程。
::shutdown:/bin/umount -a -r
告訴init在關機時運行umount命令卸載所有的文件系統,如果卸載失敗,試圖以只讀方式重新掛載。
欄位shutdown表明在重啟關閉系統命令時執行相應進程。 ------------------------------------------------------------------------------------------------------------------------------
(2)當解析完文件etc/inittab後就將啟動這些進程,首先要執行的是啟動腳本etc/init.d/rcS。
修改文件etc/init.d/rcS如下:
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
/bin/hostname CPEmbed
/sbin/ifconfig lo 127.0.0.1 up
/sbin/ifconfig eth0 192.168.1.8 netmask 255.255.255.0
/sbin/route add default gw 192.168.1.1 eth0
echo "---------------mount all-----------------"
/bin/mount -a
mkdir /dev/pts
/bin/mknod /dev/pts/0 c 136 0
/bin/mknod /dev/pts/1 c 136 1
/bin/mknod /dev/pts/2 c 136 2
/bin/mknod /dev/pts/3 c 136 3
/bin/mknod /dev/pts/4 c 136 4
/bin/mknod /dev/pts/5 c 136 5
/bin/mount -t devpts devpts /dev/pts
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
/usr/sbin/telnetd &
/usr/sbin/vsftpd &
echo "******************************************"
echo "******************************************"
echo "** Kernel version: linux-2.6.31.1 **"
echo "** Date: 2012.04.12 **"
echo "******************************************"
說明如下:
#! /bin/sh 用busybox的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin //shell命令的搜索路徑
runlevel=S //運行在單用戶模式
prevlevel=N //前一個級別為n表示沒有前一個級別
umask 022 //許可權位掩碼
export PATH runlevel prevlevel //將設置的變數導出到環境中
/bin/hostname CPembed //主機名,CPembed將出現在shell提示符中[root@CPembed/]#
/sbin/ifconfig lo 127.0.0.1 up //啟動lo
/sbin/ifconfig eth0 192.168.1.8 netmask 255.255.255.0 up //配置ip地址
/sbin/route add default gw 192.168.1.1 eth0 //添加默認路由
/bin/mount -a //將文件etc/fstab中指明的文件系統掛載到對應掛載點上
後面的8行是對telnetd的配置
echo /sbin/mdev>/proc/sys/kernel/hotplug //用mdev來處理內核的熱插拔事件。
當有熱插拔事件產生時,內核就會調用位於/sbin目錄的mdev。這時mdev通過環境變數中的ACTION和DEVPATH,
(這兩個變數是系統自帶的)來確定此次熱插拔事件的動作以及影響了/sys 中的那個目錄。接著會看看這個目錄中是否有「dev」的屬性文件,
如果有就利用這些信息為 這個設備在/dev 下創建設備節點文件。
mdev -s //建立dev目錄。以『-s』為參數調用位於/sbin 目錄寫的 mdev(其實是個鏈接,作用是傳遞參數給/bin目錄下的busybox 程序並調用它),mdev掃描 /sys/class 和/sys /block中所有的類設備目錄,如果在目錄中含有名為「dev」的文件,且文件中包含的是設備號,則 mdev 就利用這些信息為這個設備在/dev下創建設備節點文件。一般只在啟動時才執行一次「mdev -s」
/usr/sbin/telnetd & //後台運行telnetd
/usr/sbin/vsftpd & //後台運行vsftpd
------------------------------------------------------------------------------------------------------------------------------
(3)修改文件etc/fstab如下:
#device mount-point type option mp fsck order
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
在系統啟動初始化文件/etc/init.d/rcS中有執行掛載命令/bin/mount -a ,這便是將文件etc/fstab中指定 的文件系統掛載到對應的掛載點上。這些文件系統的掛在是執行mdev -s命令建立dev目錄的前提------------------------------------------------------------------------------------------------------------------------------
(4)在啟動腳本etc/init.d/rcS執行完後將在串口s3c2410_serial0啟動一個shell。Shell啟動過程中會根據文件/etc/profile配置登陸環境。
文件/etc/profile修改如下:
USER=" 'id -un' "
LOGNAME=$USER
PS1='[\u@\h \W]# '
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
具體說明:
USER="id -un" //獲取用戶名id-un與whoami命令有相同的功能
PS1='[\u@\h \W]# ' //PS1指定sh提示符的格式在本環境下將是[root@cyembed /]#
export USER LOGNAME PS1 PATH 將這些變數導出到環境。
(5)在用戶登錄時將在/etc下尋找三個文件passwd ,shadow, group匹配相關信息。
這三個文件修改如下:
/etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
/etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
ftp:x:50:
nobody:x:99:
/etc/shadow root:$6$hnswPTgxzFaZHlLl$//:14819:0:99999:7:::
bin:*:14715:0:99999:7:::
daemon:*:14715:0:99999:7:::
ftp:*:14715:0:99999:7:::
nobody:*:14715:0:99999:7:::
------------------------------------------------------------------------------------------------------------
6. 製作yaffs2根文件系統鏡像
用天嵌科技提供的yaffs2文件系統鏡像製作工具mkyaffs2image,製作根文件系統鏡像。
#./mkyaffs2image root_fs root_fs.bin
7. 將根文件系統鏡像下載到nand flash並啟動
啟動信息如下:
⑥ 如何安裝arm-linux-gcc
1,下載並安裝arm-linux-gcc
arm-linux-gcc-4.2.1的版本在http://ftp.snapgear.org/pub/snapgear/tools/arm-linux/這里可以下載,最新版arm-linux-tools-20080623.tar.gz這個可能是4.2.4的版本,因為下面有編譯4.2.4的方法還有相應的代碼包,build-arm-linux-4.2.14,此版本由於過大,我沒有下載。
下面的這個是ARM官方給的下載鏈接http://www.codesourcery.com/gnu_toolchains/arm/download.html,然後將HOST選擇為IA32 GNU/Linux,點擊下載就可以了。不過前綴為arm-2010.09-51-arm-none-eabi-i686-pc-linux-gnu而不是arm-linux-。。。
在友善之臂官方網站http://www.arm9.net/download.asp下載arm-linux-gcc4.4.3。
2,刪除之前安裝有舊版本,執行
[root@localhost ~]# rm -rf /opt/arm
3,對新版本arm-linux-gcc-4.4.3進行解壓(注意,如果我們加上了-C,那麼就會自動解壓到/usr/local/arm/這個目錄下),但是友善之臂按照下列方式解壓,不會解壓到/usr/local/arm/目錄下的,這是因為友善之臂把/usr/local/arm/目錄修改成了 /opt/FriendlyARM/toolschain/,除非自己在把它修改過來
[root@localhost ~]# tar -ivxzf /smbroot/arm-linux-gcc-4.4.3.tar.gz -C /
4,修改配置文件,將arm-linux-gcc添加到環境變數中,因為arm-linux-gcc的命令是在/usr/local/arm/4.4.3/bin下,其目的通過對全局變數綁定使之能夠在任意一個目錄下能夠執行該命令。
打開設置文件
[root@localhost opt]# vi /etc/profile
在打開的文件的
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
pathmunge /usr/local/arm/4.4.3/bin
fi
或者在文件末尾添加
export PATH=$PATH:/usr/local/arm/4.4.3/bin
保存退出
5,立即使新的環境變數生效,不用重啟電腦
[root@localhost opt]# source /etc/profile
[root@localhost opt]#
6,檢查是否將路徑加入到PATH:
[root@localhost opt]# echo $PATH
顯示的內容中有/usr/local/arm/4.4.3/bin,說明已經將交叉編譯器的路徑加入PATH。至此,交叉編譯環境安裝完成。
7,測試是否安裝成功
首先,執行find命令查詢一下arm-linux-gcc的位置
[root@localhost ~]# find / -name arm-linux-gcc
/opt/arm/toolschain/4.4.3/bin/arm-linux-gcc
[root@localhost ~]#
可以看到arm-linux-gcc的位置與環境變數中設定的路徑一致
接下來查詢arm-linux-gcc的版本
[root@localhost bin]# arm-linux-gcc -v
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /opt/FriendlyARM/mini2440/build-toolschain/working/src/gcc-4.4.3/configure --build=i386-build_redhat-linux-gnu --host=i386-build_redhat-linux-gnu --target=arm-none-linux-gnueabi --prefix=/opt/FriendlyARM/toolschain/4.4.3 --with-sysroot=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --enable-languages=c,c++ --disable-multilib --with-arch=armv4t --with-cpu=arm920t --with-tune=arm920t --with-float=soft --with-pkgversion=ctng-1.6.1 --disable-sjlj-exceptions --enable-__cxa_atexit --with-gmp=/opt/FriendlyARM/toolschain/4.4.3 --with-mpfr=/opt/FriendlyARM/toolschain/4.4.3 --with-ppl=/opt/FriendlyARM/toolschain/4.4.3 --with-cloog=/opt/FriendlyARM/toolschain/4.4.3 --with-mpc=/opt/FriendlyARM/toolschain/4.4.3 --with-local-prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-c99 --enable-long-long --enable-target-optspace
Thread model: posix
gcc version 4.4.3 (ctng-1.6.1)
[root@localhost bin]#
可以看到arm-linux-gcc的版本號,至此,arm-linu-gcc已成功安裝。
⑦ arm linux 中設置gpio下面的幾個狀態分別是什麼意思
2,現在lcd比較熱門,特別2d/3d加速。
請參考
⑧ 什麼時候要重新製作Linux的根文件系統謝謝
首先要理解什麼是根文件系統,如果你不是做應用開發如嵌入式等等話,就不需要修改。
1. 根文件系統
文件系統是包括在一個磁碟(包括光碟、軟盤、閃盤及其它存儲設備)或分區的目錄結構;一個可應用的磁碟設備可以包含一個或多個文件系統;如果您想進入一個文件系統,首先您要做的是掛載(mount)文件系統;為了掛載(mount)文件系統,您必須指定一個掛載點。
註:對於我們應用開發來說,購買開發板的時候,廠家會提供好現成的根文件系統和BootLoader等,如果需要,我們可以改變其中的命令而無需從頭開始製作一個新的根文件系統。不過這兒的製作過程可以讓我們更深一點理解Linux的文件系統。
2.主要的根文件系統
* Linux 中,rootfs 是必不可少的。PC 上主要實現有 ramdisk 和直接掛載 HD(Harddisk,硬碟) 上的根文件系統;嵌入式中一般不從 HD 啟動,而是從 Flash 啟動,最簡單的方法是將 rootfs load 到 RAM 的 RAMDisk,稍復雜的就是 直接從Flash 讀取的 Cramfs,更復雜的是在 Flash 上分區,並構建 JFFS2 等文件系統。
* RAMDisk 將製作好的 rootfs 壓縮後寫入 Flash,啟動的時候由 Bootloader load 到RAM,解壓縮,然後掛載到 /。這種方法操作簡單,但是在 RAM 中的文件系統不是壓縮的,因此需要佔用許多嵌入式系統中稀有資源 RAM。
ramdisk 就是用內存空間來模擬出硬碟分區,ramdisk通常使用磁碟文件系統的壓縮存放在flash中,在系統初始化時,解壓縮到SDRAM並掛載根文件系統, 在linux系統中,ramdisk有二種,一種就是可以格式化並載入,在linux內核2.0/2.2就已經支持,其不足之處是大小固定;另一種是 2.4的內核才支持,通過,ramfs來實現,他不能被格式化,但用起來方便,其大小隨所需要的空間增加或減少,是目前linux常用的ramdisk技術.
* initrd 是 RAMDisk 的格式,kernel 2.4 之前都是 image-initrd,Kernel 2.5 引入了 cpio-initrd,大大簡化了 Linux 的啟動過程,附合 Linux 的基本哲學:Keep it simple, stupid(KISS). 不過cpio-initrd 作為新的格式,還沒有經過廣泛測試,嵌入式 Linux 中主要採用的還是 image-initrd。
* Cramfs 是 Linus 寫的很簡單的文件系統,有很好的壓縮綠,也可以直接從 Flash 上運行,不須 load 到 RAM 中,因此節約了 RAM。但是 Cramfs 是只讀的,對於需要運行時修改的目錄(如: /etc, /var, /tmp)多有不便,因此,一般將這些目錄做成ramfs 等可寫的 fs。
* SquashFS 是對 Cramfs 的增強。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使用量方面也具有優勢。不過,據開發者介紹,在性能上可能不如 Cramfs。這也是一種新方法,在嵌入式系統採用之前,需要經過更多的測試。
3.Ramdisk製作
RAMDisk的製作方法如下:
(1) 在PC機的Linux操作系統環境下,生成可以虛擬成塊設備的文件,假設文件名為init.img。
$ dd if=/dev/zero of=init.img bs=4096 count=1024
其中bs*count為塊設備大小(單位:位元組),生成init.img文件以後,還必須對該文件進行格式化。
$ mke2fs –m0 –F init.img
(2) 新建一個文件夾ram,並將init.img掛接到ram目錄。
$ mkdir ram
$ mount init.img ram/ -o loop
這時,讀寫ram目錄,等效於讀寫init.img文件。用戶可以將根文系統所需的文件寫入到ram目錄中。往ram目錄寫完文件以後,還需要使用umount ram命令卸載init.img,才能將已寫入的文件保存到init.img中。
(3)添加完畢,需要umount ram
4. Cramfs製作
CramFS(Compressed Rom File System)是Linux Torvalds在Transmeta任職時,所參與開發的文件系統。它是針對Linux內核2.4之後的版本所設計的一種新型只讀文件系統,採用了 zlib 壓縮,壓縮比一般可以達到1:2,但仍可以作到高效的隨機讀取,Linux系統中,通常把不需要經常修改的目錄壓縮存放,並在系統引導的時候再將壓縮文件解開。因為Cramfs不會影響系統的讀取文件的速度,而且是一個高度壓縮的文件系統。因此非常廣泛應用於嵌入式系統中。
在嵌入式的環境之下,內存和外存資源都需要節約使用。如果使用RAMDISK方式來使用文件系統,那麼在系統運行之後,首先要把Flash上的映像文件解壓縮到內存中,構造起RAMDISK環境,才可以開始運行程序。但是它也有很致命的弱點。在正常情況下,同樣的代碼不僅在Flash中占據了空間(以壓縮後的形式存在),而且還在內存中佔用了更大的空間(以解壓縮之後的形式存在),這違背了嵌入式環境下盡量節省資源的要求。
使用CramFS文件系統就是一種解決這個問題的方式。CramFS是一個壓縮格式的文件系統,它並不需要一次性地將文件系統中的所有內容都解壓縮到內存之中,而只是在系統需要訪問某個位置的數據的時候,馬上計算出該數據在CramFS中的位置,將它實時地解壓縮到內存之中,然後通過對內存的訪問來獲取文件系統中需要讀取的數據。CramFS中的解壓縮以及解壓縮之後的內存中數據存放位置都是由CramFS文件系統本身進行維護的,用戶並不需要了解具體的實現過程,因此這種方式增強了透明度,對開發人員來說,既方便,又節省了存儲空間。
但是Cramfs也有其缺點:延遲、小於16MB、不支持寫,只支持PAGE_CREATE_SIZE=4096的內核。
製作的命令:(root文件夾中存放著文件系統)
#mkcramfs root cramfs.img
5. 其他根文件系統的製作
製作yaffs文件系統: mkyaffsimage myroots myroots.img
製作squashfs: mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments –noI
6. BusyBox編譯以及移植(根文件系統內命令的製作移植)
建立目標板空根目錄文件夾及根目錄下的文件夾:
[root@190 friendly-arm]# mkdir myroots
[root@190 friendly-arm]#pwd
/friendly-arm/myroots
[root@190 friendly-arm]#cd myroots
[root@190 myroots]# mkdir bin sbin usr lib dev mnt opt root etc home proc tmp var
[root@190 myroots]# mkdir etc/init.d
進入etc/init.d目錄下,建立一個腳本文件,並命名為rcS,用gedit打開,添加如下內容:
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
創建 dev 中的節點
如果使用「linux 2.6.xx」的內核,應該事先創建節點「console」、「null」。否則在系統啟動時內容會提示以下錯誤:
Warning: unable to open an initial console.Kernel panic - not syncing: Attempted to kill init!
創建節點的命令如下:
# mknod dev/console c 5 1# mknod dev/null c 1 3
移植Busybox:
進入到壓縮文件存放的目錄下,並解壓。然後進入解壓後的busybox目錄文件夾,隨後配置busybox 。
[root@190 busybox-1.2.0]# make menuconfig
由於每個版本的配置選項組織有所不同。不管怎樣,我們注意以下選項就行了:
1) Support for devfs
2) Build BusyBox as a static binary ( no shared libs ) //將busybox編譯成靜態鏈接
3) Do you want to build busybox with a Cross Compile?
(/usr/local/arm/3.3.2/bin/arm-linux-) Cross Compile prefix //指定交叉編譯器
4) init
5) Support reading an inittab file //支持init讀取/etc/inittab 配置文件
6) (X) ash選中ash //建立的rcS腳本才能執行
7)ash
8)cp cat ls mkdir mv //可執行命令工具的選擇,自己看著辦吧,需要用到的就選上
9) mount
10) umount
11) Support loopback mounts
12) Support for the old /etc/mtab file
13) insmod
14) Support version 2.2.x to 2.4.x Linux kernels
15) Support version 2.6.x Linux kernels
16) vi
17)don』t use user
以上內容必須選上,其他可按默認值;如果要支持其他功能,如網路支持等,可按需選擇,英語不是很爛的話,這些都沒有問題。
配置好之後,保存退出。然後對其編譯和安裝到剛才建立的根文件系統目錄下:
[root@190 busybox-1.2.0] make TARGET_ARCH=arm CROSS=arm-linux- \ PREFIX=/friendly-arm/myroots/ all install
安裝好之後,將相應的二進制文件拷貝到根文件系統相應的目錄下:
* 拷貝一些管理員控製程序到/sbin目錄下,最重要的就是要包含一個init命令;
* 拷貝應用程序運行時所需要的庫到/lib,庫文件可以從PC機上的交叉編譯工具安裝目錄下拷貝,如libc-2.2.2.so、libcryt- 2.2.2.so、libm-2.2.2.so、libutil-2.2.2.so等,為部分相應庫建立快捷方式,提供一些應用程序按快捷方式名稱調用。
⑨ ftp putfile出現12003錯誤 IIS的FTP應該怎麼設置
用ffmpeg錄像。
(1)編譯x264
官網上下了個最新的x264,我下載的文件是last_x264.tar.bz2。
解壓命令為#tar -jxv -f last_x264.tar.bz2,解壓後的目錄為x264-snapshot-20130313-2245。
進入解壓後的目錄,執行命令./configure --disable-asm,則會生成config.mak。之後就需要修改這個config.mak文件了,改寫ARCH=ARM SYS=Linux CC=arm-linux-gcc,其中CC寫成你自己的交叉編譯環境位置,相應的AR、RANLIB也是,具體如下圖所示。
⑩ 在嵌入式linux中開啟ftp服務,如何加上用戶名和密碼呢
使用命令:useradd nobody
useradd -d /var/ftp ftp
然後,新增/user/share/empty目錄:mkdir /usr/share/empty
如果不行就設置匿名登錄許可權