全部博文(25)
分类: LINUX
2010-04-11 18:07:16
建立根文件系统
首先需要下面2个源文件
busybox-
arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linuxgnu.tar.bz2
解压busybox工具:
# ls
busybox-
# tar -xjvf busybox-
# ls
busybox-
解压交叉编译工具:
# ls
arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
# tar -xjvf arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
# ls
arm-2008q1
arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
完成以上的步骤后就可以进行根文件系统的制作了.
第一:设置交叉编译工具的路径:
查看交叉编译工具的具体路径.
root@emboard:/workdir/at91sam9261/crosstool/arm-2008q1/bin# ls
arm-none-linux-gnueabi-addr2line arm-none-linux-gnueabi-g++ arm-none-linux-gnueabi-gprof arm-none-linux-gnueabi-readelf
arm-none-linux-gnueabi-ar arm-none-linux-gnueabi-gcc arm-none-linux-gnueabi-ld arm-none-linux-gnueabi-size
arm-none-linux-gnueabi-as arm-none-linux-gnueabi-gcc-
arm-none-linux-gnueabi-c++ arm-none-linux-gnueabi-gcov arm-none-linux-gnueabi-objcopy arm-none-linux-gnueabi-strings
arm-none-linux-gnueabi-c++filt arm-none-linux-gnueabi-gdb arm-none-linux-gnueabi-objdump arm-none-linux-gnueabi-strip
arm-none-linux-gnueabi-cpp arm-none-linux-gnueabi-gdbtui arm-none-linux-gnueabi-ranlib
root@emboard:/workdir/at91sam9261/crosstool/arm-2008q1/bin# pwd
/workdir/at91sam9261/crosstool/arm-2008q1/bin
直接在终端配置交叉编译工具的环境.
root@emboard:/workdir/at91sam9261/crosstool/arm-2008q1/bin#
export PATH=$PATH:/workdir/at91sam9261/crosstool/arm-2008q1/bin/
root@emboard:/workdir/at91sam9261/crosstool/arm-2008q1/bin# arm-none-linux-gnueabi-gcc -v
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /scratch/sandra/lite/src/gcc-4.2/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libgomp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion=Sourcery G++ Lite 2008q1-126 --with-bugurl= --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/sandra/lite/linux/install/arm-none-linux-gnueabi/libc --enable-poison-system-directories --with-build-time-tools=/scratch/sandra/lite/linux/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/sandra/lite/linux/install/arm-none-linux-gnueabi/bin
Thread model: posix
gcc version
以上可以知道交叉编译工具的环境变量配置成功.
进入busybox目录进行编译配置:
root@emboard:/workdir/at91sam9261/filesyetem/busybox-
首先进入主界面:
选中上面的那个选项进入,
选中上面的那个选项进入
按照上面的配置,然后退到上个目录如下所示,进入那个目录
所示配置如下:
然后退回上个目录:
进入目录做如下配置:
上图中的下面的2个选项中:
这2个项要选上,不然文件系统是不是别PS1这个环境变量的参数的。
退回住目录如下:
然后进入下面的目录进行配置:
选择进入上图中选中的目录,进入后界面如下:
选中后退到上个目录,进入如下
选中上面的选项,然后退到主界面:
进入上面选中目录,界面如下:
这样基本配置完成:
root@emboard:/workdir/at91sam9261/filesyetem/busybox-
root@emboard:/workdir/at91sam9261/filesyetem/busybox-
# ls _install/
bin linuxrc sbin usr
这样就生成我们所需要的文件了.
为了方便,我把步骤都写成一个脚本了,如果对脚本不熟悉的话,可以按照脚本里面的步骤一步一步来.
进入你所要建立文件目录树的目录,下面是我的目录:
# ls
busybox-
# vim mk_roofs
#!/bin/bash
mkdir rootfs
cd rootfs
mkdir boot etc home proc tmp var dev mnt root sys
cd etc
mkdir init.d
cd ..
cd dev
mknod console c 5 1
mknod null c 1 3
cd ../..
ls
上面的基本的文件夹,还需要对etc下面进行修改!
# . mk_rootfs
运行这个脚本
# ls
busybox-
建立lib文件,然后将交叉编译工具的lib文件复制过来
# mkdir lib
# cp -a ../../crosstool/arm-2008q1/arm-none-linux-gnueabi/libc/armv4t/lib/* lib/
# cd lib/
# ls
ld-2.5.so libcrypt-2.5.so libm.so.6 libnss_hesiod-2.5.so libresolv-2.5.so
ld-linux.so.3 libcrypt.so.1 libnsl-2.5.so libnss_hesiod.so.2 libresolv.so.2
libanl-2.5.so libc.so.6 libnsl.so.1 libnss_nis-2.5.so librt-2.5.so
libanl.so.1 libdl-2.5.so libnss_compat-2.5.so libnss_nisplus-2.5.so librt.so.1
libBrokenLocale-2.5.so libdl.so.2 libnss_compat.so.2 libnss_nisplus.so.2 libSegFault.so
libBrokenLocale.so.1 libgcc_s.so libnss_dns-2.5.so libnss_nis.so.2 libthread_db-1.0.so
libc-2.5.so libgcc_s.so.1 libnss_dns.so.2 libpcprofile.so libthread_db.so.1
libcidn-2.5.so libm-2.5.so libnss_files-2.5.so libpthread-2.5.so libutil-2.5.so
libcidn.so.1 libmemusage.so libnss_files.so.2 libpthread.so.0 libutil.so.1
然后将busybox制作的文件复制过来.
# cd ..
# ls
boot dev etc home lib mnt proc root sys sysconfig tmp var
# cp -a ../busybox-
# ls
bin boot dev etc home lib linuxrc mnt proc root sbin sys tmp usr var
# cd usr/
# ls
bin sbin
可见文件已经复制过来了!
然后进入etc目录
# vim inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
# vim profile
#!/bin/sh
echo "***************Start /etc/profile************************"
# Set search library path
export LD_LIBRARY_PATH=/lib:/usr/lib
# set user path
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
#Set PS1
LOGNAME=$USER
PS1="[$USER@\h \W]\$"
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
echo "***************/etc/profile is done**********************"
echo –n
系统启动后的显示设置等信息:
[root@microcreat /]$ls
dev home mnt sbin usr
bin lib proc sys var
boot etc linuxrc root tmp
# vim fstab
#device mount-point type option dump fsck order
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
none /var ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
这个文件是用来开机挂载的文件
# eouch mdev.conf
为空.
# mkdir sysconfig
# cd sysconfig
# vim HOSTNAME
microcreat
上面的名字可以换成你自己的名字,登陆后会出现这样的显示:
[root@microcreat /]$
保存退出.
最后etc的目录如下:
root@emboard:/workdir/at91sam9261/filesyetem/rootfs/etc# ls
fstab init.d inittab mdev.conf profile sysconfig
然后进入init.d目录建立rcS文件:
root@emboard:/workdir/at91sam9261/filesyetem/rootfs/etc/init.d# vim rcS
#!/bin/sh
echo "#-----Start /etc/init.d/rcS "
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
echo "#-----mount all......."
mount -a
echo "#-----starting mdev...."
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
/bin/hostname -F /etc/sysconfig/HOSTNAME
echo "***********************************************"
echo " Start ARM..... "
echo " 2010 04 11 "
echo " microcreat "
echo "***********************************************"
保存退出,这样一个简单的根文件系统已经建立完成了,现在可以制作成为cramfs文件系统烧人扳子运行了:
以下是挂载后的启动信息:
at91sam9_wdt: invalid timeout (must be between 1 and 16)
TCP cubic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
rtc-at91sam9 at91_rtt.0: hctosys: unable to read the hardware clock
VFS: Mounted root (cramfs filesystem) readonly.
Freeing init memory: 108K
-----------------------------------------------------------------------------------------------------------
如果停在这里说明文件系统没有挂载成功,busybox没有启动起来.
-----------------------------------------------------------------------------------------------------------
init started: BusyBox v
starting pid 735, tty '': '/etc/init.d/rcS'
#-----Start /etc/init.d/rcS
#-----mount all.......
#-----starting mdev....
***********************************************
Start ARM.....
2010 04 11
microcreat
***********************************************
starting pid 739, tty '': '-/bin/sh'
***************Start /etc/profile************************
***************/etc/profile is done**********************
[root@microcreat /]$
以上就是制作根文件系统的详细步骤:
microcreat
下面的是摘抄网上的资料:
我们经常用busybox生成根文件系统,可是根文件系统起来以后命令行提示符只有一个“#”号,没有像linux发行版那样是[user@hostname currentpath] #,那么我们这里就说说如何让我们的根文件系统按这个方式显示。
要修改命令行提示符,首先我们需要知道一个环境变量PS1,我们可以查看bash的帮助文档查看关于PS1的说明:
bash有两级命令提示符,我们这里说的是第一级,这一级缺省的提示符是字符“$”(超级用户是“#”),我们可以通过修改PS1修改这个提示符,格式为:
PS1=”command list”
命令列表有很多参数如下:
\! 显示该命令的历史记录编号。
\# 显示当前命令的命令编号。
\$ 显示$符作为提示符,如果用户是root的话,则显示#号。
\\ 显示反斜杠。
\d 显示当前日期。
\h 显示主机名。
\n 打印新行。
\nnn 显示nnn的八进制值。
\s 显示当前运行的shell的名字。
\t 显示当前时间。
\u 显示当前用户的用户名。
\W 显示当前工作目录的名字。
\w 显示当前工作目录的路径
我们查看我们发行版linux中的PS1.
$echo echo $PS1
[\u@\h \W] \$
看了发行版是如何显示命令行提示符,那么我们再看一下为什么我们做的根文件系统只显示一个#,用busybox生成的根文件系统使用的是ash,我们看下busybox中关于ash的文件。
在busybox-
/*
* PS1 depends on uid
*/
#if ENABLE_FEATURE_EDITING && ENABLE_FEATURE_EDITING_FANCY_PROMPT
vps1.text = 'PS1=\\w ';
#else
if (!geteuid())
vps1.text = 'PS1=# ';
#endif
结合上面PS1参数我们可以看出在busybox生成的根文件系统中可能出现两种显示方式,一种是“currentpath $”另一种是 “#”这两种显示在较老的版本中都有。
按照上面的方法修改我们的根文件系统中的命令行提示符。首先我们需要修改buxybox中配置,添加如下两个选项:
Busybox Settings --->
Busybox Library Tuning --->
[*] Username completion
[*] Fancy shell prompts
如果不选择上面两项,文件系统是不是别PS1这个环境变量的参数的。
创建/etc/hostname添加如下内容(我们的主机名):
farsight
修改/etc/init.d/rcS添加如下内容(导入主机名配置文件):
/bin/hostname –F /etc/hostname
修改根文件系统中/etc/profile文件添加如下内容:
HOSTNAM=`/bin/hostname`
PS1=`[\u@\h \W]\# `
export PS1 HOSTNAME
创建/etc/passwd添加如下内容:
root:x:0:0:root:/root:/bin/sh
这个时候我们重新启动我们的开发板会发现命令行提示符已经是我们想要的那种现实了:
[root@farsight]# /etc