刘哲嵌入式系统课程设计.docx
- 文档编号:29727533
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:22
- 大小:854.03KB
刘哲嵌入式系统课程设计.docx
《刘哲嵌入式系统课程设计.docx》由会员分享,可在线阅读,更多相关《刘哲嵌入式系统课程设计.docx(22页珍藏版)》请在冰豆网上搜索。
刘哲嵌入式系统课程设计
华北水利水电大学
课程设计报告
课程名称:
嵌入式系统课程设计
设计题目:
基于U盘的linux操作系统的构建
学院:
信息工程学院
专业:
电子信息工程
姓名:
刘哲
学号:
201215510
指导教师:
张晓华
完成时间:
2015年7月8日
同组实验人:
陈昕昕
摘要
传统的PC电脑,大家都习惯于将操作系统安装到PC电脑的硬盘上,但是随着闪存技术的快速发展,把操作系统安装到移动设备上,已经成为一种需要,或者是一种潮流。
本次的课程设计,就做了基于U盘的linux系统的构建这一课题。
本报告详细阐述了怎样在U盘上构建Linux系统。
步骤很详细,是在这次课程报告实践中多次失败的情况下参考资料并总结下来的。
大家可以依照此步骤一步一步在自己的U盘上构建自己的Linux系统。
引言
Liunx操作系统对大家来说仿佛就是“最熟悉的陌生人”。
一方面,我们对它的真实面目所知甚少;另一方面,我们在生活中又无时无刻不与之紧密接触。
诸如:
大家熟知的Windows,XP操作系统就是基于Linux搭建起来的操作系统中的一员。
现在的计算机技术简直日新月异,U盘,固态硬盘等等存储介质做的可以越来越大,并越来越便宜。
电脑已经不是稀罕物了,办公室,家里都有。
但是电脑多了,给我们带来方便的同时,有时候也会带来一些不必要的麻烦。
比如开发工具,写的文档,编的程序,在家里,办公室的电脑上都要重新组装。
另外,很多实验室,生产线的在线控制,监测等等,这些设备的维护对一个技术人员来说工作量可谓很庞杂,但是这些问题都可以随着技术的发展变得不再是大问题。
比如若是把操作系统装在U盘里,在家里与办公室工作环境之间即将变得很便捷!
U盘Linux系统具有一个完整操作系统应该具备的诸多方面,用户可以根据需求定制自己的专业软件。
现实生活中,人们的实际需求往往是便携式、简单、专一的应用,这对于U盘Linux系统的开发和发展有着重要意义。
我们了解到系统的启动时指从计算机加电到显示用户登陆提示的整个过程,我们在这里对整个流程作一个讨论,对系统的流程先有一个大概的了解:
开电源==>BIOS自检==>启动设备U盘==>引导程序grub==>内核==>init程序(==>rc.sysinit)==>mingetty==>终端登录==>shell...
本课程设计共有分为三大部分,第一大部分是构建操作系统,详细阐述了基于U盘的linux操作系统时如何构建起来的,又分为六小部分,分别是1)前期准备,包括软硬件的准备及busybox工具;2)linux内核编译;3)构建linux根文件系统;4)在U盘上安装系统引导程序grub;5)添加开机背景图片;6)系统整合及测试。
第二大部分是经验总结,将本次课程设计中多次失败的经验教训写了出来,提醒大家避免犯同样的错误。
第三大部分是相关的参考资料,是我在做课程设计过程中查找筛选的资料,供大家参考学习。
1、构建基于U盘的linux操作系统
1.前期准备
1.1准备开发主机
准备一台计算机,安装linux操作系统(例如Redhat,Ubuntu等),也可以在虚拟机上(例如VMWare)安装linux操作系统。
安装时,为了以后方便,可以选择安装全部组件。
我们把这台装有linux操作系统的计算机(或虚拟机)作为开发主机使用。
由于目前Ubuntu比较流行,所以我采用的是在虚拟机VMware-workstation-full-10.0.6-2700073上安装ubuntu-12.04-desktop-i386
Ubuntu下载地址http:
//
大多数操作需要root权限,由于Ubuntu默认为普通用户权限登录,可以sudo来使用root权限操作。
1.2准备测试用计算机
测试U盘的linux的PC机必须支持USB硬盘启动方式,即把U盘作为硬盘来对待的启动方式(USB-HDD)。
由于资源限制,我选用上面所提到的装有虚拟机的PC机作为测试用计算机。
1.3准备linux的内核源代码
Linux的内核源代码可以从http:
//www.Linux.org上下载。
另外,如果开发安装linux系统时选择的是全部安装,在开发主机的/usr/src目录中也会有linux的源代码。
由于我安装时没有全部安装,所以是自己下载的源代码Linux-2.4.20-8.tar.bz2。
1.4准备BusyBox工具
1.4.1BusyBox简介
BusyBox工具中包含了七十多种Linux系统中常用的工具程序,利用BusyBox可以替代Linux系统中常用的一些工具和命令,例如ls,cp,rm,rmdir,mount,umount,init等。
BusyBox中命令不仅丰富,而且占据很小的空间,同时它还提供面向嵌入式系统的应用。
因此,在构建Linux系统时,使用BusyBox取代常用的Linux命令非常有效。
Busybox的实质是提供了一个很小的可执行程序Busybox,通过对其的链接,可以建立其他常用的linux系统命令。
本课程设计所用的busybox是busybox-1.2.2.tar.bz2。
可以从busybox的官方网站http:
//
1.4.2BusyBox的具体使用
1)将busybox-1.2.2.tar.bz2放到/tmp目录下并将其解压
cd/tmp//进入/tmp目录
tar–xvjfbusybox-1.2.2.tar.bz2//解压缩
生成busybox-1.2.2目录。
2)进入busybox-1.2.2目录修改BusyBox中的init.c源代码,操作如下:
cd/tmp/busybox-1.2.2
viinit/init.c//编辑init.c文件
找到init.c中#defineINIT_SRCIPT“/etc/init.d/rc.S”
将其修改为#defineINIT_SRCIPT“/etc/rc.d/rc.sysinit”
目的是把系统执行的第一个程序改为/etc/rc.d/rc.sysinit。
3)对busybox进行配置,操作如下:
makedefconfig//使用默认配置,让BusyBox含有常用的工具和命令
makemenuconfig//进入人工配制菜单修改以下配置:
BusyBoxSettings--->BuildOptions
[*]BuildBusyBoxasastaticbinary(nosharedlibs)
这个选项能把busybox编译成静态链接的可执行文件,运行时可以不需要其它函数库。
BusyBoxSettings--->InstallationOptions
[*]Don`tuse/usr
这个选项一定要选,否则makeinstall后busybox将安装在原系统的/usr下,这将覆盖系统原有的命令。
选择这个选项后,makeinstall后会生成一个叫-install的目录,里面有busybox和指向它的链接。
进入shell选项,选择ash作为默认的shell程序,如下:
Shells--->Chooseyourdefaultshell(ash)
[*]ash
[]hush
[]lash
[]msh
由于在手工配置(makemenuconfig)之前,使用了makedefconfig命令,因此,此时的busybox中已经包含了大部分的linux系统常用的命令。
4)编译busybox,命令如下:
make
5)安装busybox,命令如下:
makeinstall
随后会在/tmp/busybox-1.2.2目录下生成_install目录,里面会建立bin和sbin子目录,
其中包含busybox可执行文件和所有busybox支持的命令对其的链接。
通过查看bin和sbin可以清楚的看到busybox中究竟支持了那些命令和工具。
例如bin中的部分命令如下:
2.Linux内核编译
1)将Linux内核源代码Linux-2.4.20-8.tar.bz2放在/tmp下并将其解压,操作如下:
cd/tmp//进入/tmp目录
tar-xvjfLinux-2.4.20-8.tar.bz2//解压缩
生成Linux-2.4.20-8目录。
2)进入该目录:
cdlinux-2.4.20-8,
makemenuconfig
然后使用该命令配置Linux内核。
需要注意是由于要支持U盘启动,配置内核时必须选择以下内容:
有一些配置都是默认的,我们就不需要再选择了
1 选择DeviceDrivers--->Blockdevices-------〉下的Loopbackdevicesupport 、RAMblockdevicesupport等支持。
2 选择DeviceDrivers--->SCSIsupport下SCSIdevicesupport、SCSIdisksupport等支持。
(因为u盘被识别为scsi设备,所以要选中scsi的一些配置)
3 选择DeviceDrivers--->USBSupport下的SupportforHost-sideUSB,USBmassstoragesupport和所有含有“HCD”等支持。
(因为是用u盘来引导的,所以关于usb的一些配置要选上)
选择完后选择exit最后提示是否保存,选yes。
选择了几张配置时的图片,可以作为参考:
3)使用“makedep”命令寻找依存关系,由系统决定需要编译哪些内容。
4)使用“makeclean”命令清除以前构造内核时生成的所有目标文件、模块文件和一些临时文件,以避免出现一些错误。
5)使用“makebzImage”命令生成压缩的Linux内核文件,并以bzImage命名。
由于本次编译是在/tmp目录下进行,所以bzImage位于/tmp/linux-2.4.20-8/arch/i386/linux/boot/目录下。
3.构建linux根文件系统
3.1根文件系统简介:
linux将MTD设备划分为若干个分区,在不同的分区存放不同类别的文件。
根文件系统必须包含支持完整Linux系统运行所需要的每一个项目,为此它必须至少包括能让Linux系统运行的最起码需求:
1 最起码的目录:
/dev,/bin,/sbin,/etc,/usr;
2 最基本的命令文件:
ash(或bash等,shell是必不可少的),cp,rm,ls,mkdir,cd;
3 最起码的配置文件:
rc,inittab,etc.;
4 最起码的设备文件:
/dev/fd0,/dev/tty*,/dev/hd*,console,/dev/ram0,etc.;
上述文件大小远远小于4M,当用U盘启动时,文件自己先解压到内存中,形成一个虚拟启动盘(Ramdisk),通过Ramdisk来控制启动。
因此,为了能够创建以上的根文件系统,必须有一个空闲的能放下约4M文件的Ramdisk。
3.2在U盘上面建立linux分区和ext2文件格式
因为普通U盘是Windows系统下的文件系统,所以必须对U盘进行格式化和分区。
在对U盘进行分区前必须要知道U盘在系统中的设备文件,U盘在linux系统中被识别为scsi设备。
在root权限下,输入“fdisk-l”查看U盘的设备文件,可以看到U盘的设备文件是/dev/sdb1(有时是/dev/sdx1,是变化的)。
知道U盘设备文件之后,就可以对U盘进行分区和格式化,具体操作如下:
1)利用linux自带的fdisk工具格式化u盘为启动盘
fdisk-l//查看u盘的挂载点
fdisk/dev/sdb//进入fdisk,格式化u盘(注释,U盘在电脑上为第二块设备,故是sdb1,千万不要写成sda,会将电脑系统弄坏)
Command(mforhelp):
m//输命令m查看可用命令及说明
Command(mforhelp):
输入d,删除原来的分区
Command(mforhelp):
输入n,建立新的分区,出现:
eextended
pprimarypartition(1-4):
输入p,选择建立主分区
partitionnumber(1-4):
1//输入1,建立一个分区,分区号为1
Firstcylinder(1-1019,default1):
//回车,选择默认
Lastcylinder(2048-7884799,default2048):
输入+512M,在U盘上建立一个512M大小的分区。
Command(mforhelp):
输入p,查看是否分区成功。
Command(mforhelp):
输入w,保存并退出fdisk。
2)将u盘格式化为ext2格式
$mkfs.ext2/dev/sdb1//创建文件系统
3.3建立必需的目录
mkdir/mnt/usb
mount/dev/sdb1/mnt/usb将U盘挂载到/mnt/usb目录下
cd/mnt/usb
mkdirbootetcetc/rc.dproctmpvardevmntlibinitrd建立目录
chmod755bootetcetc/rc.dproctmpvardevmntlibinitrd将所创建目录属性改为可读写。
3.4建立必需的设备节点文件
cd/mnt/usb/dev
(1)建立一般终端机设备
mknodttyc50
mknodconsolec51
chmod666ttyconsole
(2)建立VGADisplay虚拟终端机设备
mknodtty0c40
chmod666tty0
(3)建立Ramdisk设备
mknodram0b10
chmod600ram0
(4)建立null设备
mknodnullc13
chmod666null
3.5生成一些常见的命令和工具
文件系统中要包含一些常见的命令和工具,而BusyBox工具不仅命令丰富而且占用空间小,所以,可以使用前面编译好的BusyBox工具。
把/tmp/busybox-1.2.2/_install/目录下的bin目录和sbin目录复制到U盘的根目录下。
cp–aRf/tmp/busybox-1.2.2/_install/*/mnt/usb/
【注】有可能在BusyBox工具中缺少sh命令,可以把Linux操作系统的sh命令复制过来。
cd/bin
ls–lsh通过ls–lsh命令查看sh命令,可以看出,sh命令就是dash命令的一个链接。
ldddash通过ldd命令查看dash的关联性。
看到dash需要/lib/i386-linux-gnu/lib.so.6和/lib/ld-linux.so.2库的支持。
将这些库和dash命令复制到U盘中。
cp/bin/dash/mnt/usb/bin/dash
cp/lib/i386-linux-gnu/lib.so.6/mnt/usb/lib
cp/lib/ld-linux.so.2/mnt/usb/lib
然后进入U盘的/mnt/usb/bin目录下建立dash命令的链接sh命令
cd/mnt/usb/bin
ln–sdashsh
3.6建立一些必需的配置文件
1 建立/mnt/usb/etc/rc.d/inittab配置文件
vi/mnt/usb/etc/rc.d/inittab
在vi编辑器中输入以下inittab的内容:
:
:
sysinit:
/etc/rc.d/rc.sysinit
:
:
askfirst:
/bin/sh
2 建立/mnt/usb/etc/rc.d/rc.sysinit配置文件
vi/mnt/usb/etc/rc.d/rc.sysinit
在vi编辑器中输入以下rc.sysinit的内容:
$!
/bin/sh
mount-a
3 建立/mnt/usb/etc/fstab配置文件
vi/mnt/usb/etc/fstab
在vi编辑器中输入以下fstab的内容:
proc/procprocdefaults00
4 修改inittab,rc.sysinit,fstab权限
chmod644/mnt/usb/etc/rc.d/inittab
chmod755/mnt/usb/etc/rc.d/rc.sysinit
chmod644/mnt/usb/etc/fstab
4.在U盘上安装系统引导程序grub
4.1开机引导程序的选择
一般来说,一个操作系统都有一个开机引导程序,当然Linux操作系统也不例外。
不过Linux操作系统的引导工具很多,比如LOADLIN、SYSLINUX、LILO、GRUB等,我们为什么要选择GRUB呢?
通过以下比较,就可以知道原因了。
我们可以用LOADLIN从MS-DOS引导Linux。
但不幸的是,它需要在MS-DOS分区中有一份Linux内核的拷贝(如果计算机有SCSI适配器,还需要一个初始的RAM盘)。
若一定要用LOADLIN,可以从http:
///redhat70处获得。
SYSLINUX是与LOADLIN非常类似的MS-DOS程序,也可以用它来引导Linux。
但是SYSLINUX不适合作为通用的BootLoader程序,它只能从FATfilesystem(而不是ext2filesystem等)启动Linux操作系统。
如果需要,也可以从网站处获得。
GRUB是GRandUnifiedBootloader的缩写,它可以在多个操作系统共存时选择引导哪个系统。
它可以引导的操作系统包括Linux,FreeBSD,Solaris,NetBSD,BeOSi,OS/2,Windows95/98,WindowsNT,Windows2000等。
它可以载入操作系统的内核和初始化操作系统(如Linux,FreeBSD),或者把引导权交给操作系统(如Windows98)来完成引导。
它最大的缺点就是在它不能正确引导的情况下对它的修复比较麻烦。
4.2grub介绍
GRUB是一个在Linux环境下编写的引导安装(BootLoader)程序(故其安装和配置都要在Linux下进行),其主要功能是引导LinuxOS的启动。
GRUB不仅可作为Linux分区的引导扇区内的启动程序,而且可放入MBR中完全控制BootLoader的全过程。
其引导系统的过程如下:
grub分为stage1(stage1.5)和stage2,stage1MBR(0头0道1扇区),前446字节是存放stage1,后面跟的是硬盘分区表信息,可以看成是initialprogramloader(IPL)该程序安装在磁盘主引导记录(MBR)中,IPL是MBR的一部分并应该存储于一个不大于446字节的磁盘空间中,因为MBR是一个不大于512字节的空间,IPL仅仅是GRUB的第一个部分(stage1),stage1(/stage1/start.S)的任务很单纯,就是将硬盘0头0道2扇区的读入内存.0头0道2扇区的内容是源代码中的/stage2/start.S,编译后512字节,是stage2或stage1.5的入口,而stage2则是起到了grub的关键作用,包括对特定文件系统的支持(ext2,ext3等),grub自己的shell,以及一些内部程序(如:
kernel,initrd,root)等.
4.3安装grub到U盘
在root权限下输入
grub-install--root-directory=/mnt/usb/dev/sdb(此处是sdb还是sdc根据具体情况而定)
grub版本号为0.97
这条指令在U盘的/boot目录下产生了/grub目录,进入/grub目录查看,发现并没有系统启动所需要的脚本文件menu.lst。
于是得自己编辑。
4.4menu.lst的内容及分析
default=0
timeout=10
splashimage=(hd0,0)/boot/grub/liuzhe.xpm.gz
titleChenxinxin_LiuZhe-USB-Linux
kernel/boot/bzImageroroot=/dev/sda1rwrootdelay=10
1,default=0
表示默认启动的第0号的操作系统,在GRUB中,title定义了启动的操作系统,从第1个开始,GRUB中是0,而第2个是1,依次类推...
2,timeout=10
表示的是出现GRUB界面后,无操作情况下进入default设定的操作系统的时间,如果上下移动选择,则该选项无效
3,splashimage=(hd0,0)/boot/grub/liuzhe.xpm.gz
表示的是允许出现的GRUB背景的path,显然(hd0,0)指定了分区,而后边的则是正常的path
4.kernel行,在这里以kernel 起始,指定Linux的内核的文件所处的绝对路径(通过在终端输入命令:
ls /boot/bzImage来看内核的全名);ro 表示只读;root=/dev/sda1来表示Linux的根所处的分区。
rootdelay=10表示在编译内核的时候延时10秒,因为U盘初始化速度比较慢。
5、添加开机背景图片
1)安装Grub。
(安装系统的时候就已经搞定了,如果没有可以上网搜搜,很多的资料)。
2)安装ImageMagick。
一个转换图片格式的工具。
Grub的背景好象只能用xpm格式的文件,大小640*480的,14色。
Shell#apt-getinstallimagemagick
3)将一图片(假设文件为liuzhe.jpg)转化成640*480,14色的XPM文件:
#convertliuzhe.jpg-colors14-geometry640x480!
liuzhe.xpm
4)压缩xpm文件生成gz文件:
#gzip-9liuzhe.xpm
5)将liuzhe.xpm.gz文件拷到/boo/grub下面:
#cpliuzhe.xpm.gz/boot/grub
6)修改/boot/grub/menu.lst文件,添加如下类似行:
splashimage=(hd0,0)/grub/liuzhe.xpm.gz
开机效果图:
说明:
1、在第3步中,640x480那儿有一个叹号(!
),这是很容易忽视的细节。
我第一次设置的时候在这儿出错了。
2、在第3步中,640x480中间这个是x而不是*。
(因为平常我们都认为乘号应该是*)
3、在第6步修改
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 刘哲 嵌入式系统课程设计 嵌入式 系统 课程设计
