1、课程设计报告课程名称: 嵌入式系统原理与设计 姓 名: 学 号: 班 级: 专 业: 电子信息科学与技术 从零开始构建自己的U盘Linux一 摘要:介绍本报告的主要内容。本报告是关于在Ubuntu系统下,通过一些基础操作,来构建一个U盘Linux,方法虽然比直接用现成的工具软件方便,但是可以让我们了解Linux的基本开发过程,是学习嵌入式的很好的一个方法。主要内容是构建过程中的基本方法,在这个过程中遇到的一些问题,以及查询资料,解决问题的过程。二 引言:说明本课程报告所选知识点相关技术的意义。目前的主板BIOS都支持USB和硬盘的启动方式,这样对于Windows的系统维护与安装工作越来越方便,
2、在优盘上建立Linux启动盘,对于系统维护人员具有更加实用的意义。 USB闪存存储装置(优盘)由于具有轻巧精致、经常用来在PC之间交换文件。目前新出的主板BIOS都支持USB和硬盘的启动方式,这样对于Windows的系统维护与安装工作越来越方便。三U盘的构建步骤。1准备工作1.1 准备开发主机首先在电脑上安装虚拟机VMWare,然后将下载的Ubuntu镜像安装在该虚拟机上,安装后如图:1.2准备测试用计算机本次过程中测试用计算机即是本机,当U盘做好后,将本机BIOS设置为从USB启动,然后在插着U盘时开机既可测试。1.3准备Linux的内核源代码现在有很多可以下载源代码的网站,从网站上现在即可
3、,1.4.准备BusyBox工具1.4.1从BusyBox的官方网站下载BusyBox的源代码在这里将他放到/home/luck/busybox下,因为/tmp是临时文件夹,在关机后里面的内容会丢失,所以此处选择放在用户目录下,可以再关机重启后继续使用。1.4.2解压缩:直接使用右键将BusyBox解压1.4.3进入busybox-1.21.0目录,修改BusyBox中的init.c源代码,具体操作如下:# cd /home/luck/busybox/ busybox-1.21.0#vi init/init.c将init.c中的#define INIT_SCRIPT /etc/init.d/r
4、cS改为#define INIT_SCRIPT /etc/rc.d/rc.sysinit1.44对BusyBox进行配置#make defconfig#make menuconfig当执行第二条时即进入人工配置菜单时,出现了一个错误:curses.h:No such file or directory然后就百度了一下出现这个问题的原因,原来是缺少了这个库函数,于是就对着新东西进行了升级和安装具体操作如下:sudo apt-get update sudo apt-get upgrade sudo apt-get install libncurses5-dev libncursesw5-dev然后
5、就开始配置将一些必要的选项打*或 :BusyBox SettingBuild Options*Build Busybox as a static binary (no shared libs)Shellschose your default shell(ash):*ash hush msh1.45编译BusyBox,命令如下:# make在执行make时出现了一个错误经过查找资料发现可以这样解决:只要把make menuconfig 去掉如下选项Linux System Utilities Support mounting NFS file systems 网络文件系统Networking U
6、tilities inetd(Internet 超级服务器 )【注】实际上只是暂时解决了这个报错的问题,由于去掉了一些支持带来了更大的问题。(此处只要将超级服务器的选项去掉即可,后面会详述出现的问题)。1.46安装BusyBox,命令如下:#make install执行完后会产生_install/bin/ 和_install/sbin/后面会用到这些文件。2.编译Linux内核从网上http:/www.kernel.org下载Linux内核压缩之后就可以配置的,编译内核了,具体操作如下我下载的是linux-3.15.1.tar.xz文件解压如下tarJlinux-3.15.1.tar.xzcd
7、/home/sudotarJlinux-3.15.1.tar.xzmakemenuconfig/进行内核编译需要注意是由于支持U盘启动,配置内核时必须选择以下内容: 选择DeviceDevices(设备驱动)-Blockdevices下的loopbackdevicesupport,RAMblockdevicesupport选择DeviceDevices-SCSISupport,SCSIdiskSupport,SCSIlow-drivers-BuslogicSCSIsupport等支持;(3) 选择DeviceDevices-USBSupport下的SupportforHost-sideUSB,
8、PreliminaryUSBdevicefilesystem,USBMassStoragesupport支持;另外,还需要选UHCIHCDsupport或OHCIHCDsupport选择后选择保存使用“makedep”命令寻找依赖关系,由系统决定需要编译那些内容使用“makeclean”命令清除以前编译内核时生成中间文件等。使用“makebzImage”命令生成压缩的Linux文件 3.在优盘上建立根文件系统3.1在优盘上建立Linux分区和ext2文件格式使用fdisk l查看设别文件进行分区,操作如下:fdisk/dev/sdb出现以下提示:Command(mforhelp):d输入d删除
9、原来的分区,原来有几个分区就输入几次d。Nopartitionisdefinedyet!Command(mforhelp):n输入n建立新的分区,出现:Partitiontype:pprimary(0primary,0extended,4free)eextendedSelect(defaultp):pPartitionnumber(1-4,default1):1Firstsector(2048-16179199,default2048):Usingdefaultvalue2048Lastsector,+sectorsor+sizeK,M,G(2048-16179199,default16179
10、199):+512M输入+512M,在U盘上建立一个512M大小的分区。Command(mforhelp):p输入p查看是否分区成功。Disk/dev/sdb:8283MB,8283750400bytes2heads,63sectors/track,128406cylinders,total16179200sectorsUnits=sectorsof1*512=512bytesSectorsize(logical/physical):512bytes/512bytesI/Osize(minimum/optimal):512bytes/512bytesDiskidentifier:0x00372
11、dfaDeviceBootStartEndBlocksIdSystem/dev/sdb12048105062352428883LinuxCommand(mforhelp):w输入w保存并退出fdisk。Thepartitiontablehasbeenaltered!Callingioctl()tore-readpartitiontable.WARNING:Re-readingthepartitiontablefailedwitherror16:Deviceorresourcebusy.Thekernelstillusestheoldtable.Thenewtablewillbeusedatth
12、enextrebootorafteryourunpartprobe(8)orkpartx(8)Syncingdisks. 卸载优盘:umount /dev/sdb1创建文件系统:mkfs.ext2 /dev/sdb1执行过程截图如下:3.2建立必须的目录操作如下:rootubuntu:/home/luck# mkdir /mnt/usbrootubuntu:/home/luck# mount /dev/sdb1 /mnt/usbrootubuntu:/home/luck# cd /mnt/usbmkdir boot etc etc/rc.d proc tmp var dev mnt lib i
13、nitrdchmod 755 boot etc etc/rc.d proc tmp var dev mnt lib initrd3.3建立必须的设备节点文件操作如下:rootubuntu:/mnt/usb# cd devrootubuntu:/mnt/usb/dev# mknod tty c 5 0rootubuntu:/mnt/usb/dev# mknod console c 5 1rootubuntu:/mnt/usb/dev# chmod 666 tty consolerootubuntu:/mnt/usb/dev# mknod tty0 c 4 0rootubuntu:/mnt/usb
14、/dev# chmod 666 tty0rootubuntu:/mnt/usb/dev# mknod ram0 b 1 0rootubuntu:/mnt/usb/dev# chmod 600 ram0rootubuntu:/mnt/usb/dev# mknod null c 1 3rootubuntu:/mnt/usb/dev# chmod 666 null3.4生成一些常见的命令和工具rootubuntu:/mnt/usb/dev# cp -a -R -f /home/luck/busybox/busybox-1.21.0/_install/* /mnt/usb/rootubuntu:/mn
15、t/usb/dev#cd /binrootubuntu:/mnt/usb/dev#ln l shrootubuntu:/mnt/usb/dev#ldd bash 从此处可以看出需要哪些库的支持,需要把这些库复制到U盘中。rootubuntu:/bin# cp /bin/bash /mnt/usb/binrootubuntu:/bin# cp /lib/i386-linux-gnu/libtinfo.so.5 /mnt/usb/librootubuntu:/bin# cp /lib/i386-linux-gnu/libdl.so.2 /mnt/usb/librootubuntu:/bin# cp
16、 /lib/i386-linux-gnu/libc.so.6 /mnt/usb/librootubuntu:/bin# cp /lib/ld-linux.so.2 /mnt/usb/librootubuntu:/bin# cd /mnt/usb/binrootubuntu:/mnt/usb/bin#rm sh 此处需将原来的sh文件删除rootubuntu:/mnt/usb/bin# ln -s bash sh3.5建立一些必须的配置文件rootubuntu:/mnt/usb# gedit /mnt/usb/etc/inittab在编辑器中输入以下inittab的内容::sysinit:/et
17、c/rc.d/rc.sysinit:askfirst:/bin/sh建立/mnt/usb/etc/rc.d/rc.sysinit配置文件rootubuntu:/mnt/usb# gedit /mnt/usb/etc/rc.d/rc.sysinit在编辑器中输入以下rc.sysinit的内容:$!/bin/shmount-arootubuntu:/mnt/usb# gedit /mnt/usb/etc/fstab在编辑器中输入以下rc.sysinit的内容:proc /proc proc defaults 0 0然后修改这三个文件的权限:rootubuntu:/mnt/usb# chmod 64
18、4 /mnt/usb/etc/inittab rootubuntu:/mnt/usb# chmod 755 /mnt/usb/etc/rc.d/rc.sysinit rootubuntu:/mnt/usb# chmod 644 /mnt/usb/etc/fstab3.6复制Linux文件到U盘中复制编译好的内核到U盘cp /home/luck/linux/linux-3.15.1/arch/x86/boot/bzImage /mnt/usb/boot4.安装grub到U盘中4.1挂载/dev/sdb2mkdir /mnt/usbmount /dev/sdb1 /mnt/usb4.2现在先查看/
19、mnt/usb下是否有文件(做这步是为了和安装好grub做比较),可以看到还没有# ls /mnt/usblost+found4.3安装grub到u盘上grub-install -root-directory=/media/test/ -no-floppy /dev/sdb4.4再查看/mnt/usb下是否有文件,可以看到多了很多文件,都是grub启动所需的必要文件。4.5安装完grub后,还要对其进行配置。这一步是很关键的一步,也是很容易出错,起初用的是grub2版本,出现了这些错误:一个是grub.cfg编写过程中的UUID漏改一个,还有一个文件忘记复制。更改后grub.cfg的内容如下:
20、# BEGIN /etc/grub.d/00_header #set default=0insmod ext2search -no-floppy -fs-uuid -set=root 3b1d9c1f-ec57-49fa-a08f-69efad575e75 insmod gfxterm insmod ext2 set timeout=10# END /etc/grub.d/00_header # BEGIN /etc/grub.d/05_debian_theme #set menu_color_normal=white/blackset menu_color_highlight=black/l
21、ight-gray# END /etc/grub.d/05_debian_theme # BEGIN /etc/grub.d/10_linux #menuentry lucky1insmod ext2search -no-floppy -fs-uuid -set=root 3b1d9c1f-ec57-49fa-a08f-69efad575e75linux/boot/vmlinuz-3.2.0-64-generic-pae root=UUID=3b1d9c1f-ec57-49fa-a08f-69efad575e75 ro quiet splashinitrd/boot/initrd.img-3.
22、2.0-64-generic-pae# END /etc/grub.d/10_linux #然后错误就变成了:搜索资料发现一个论坛里这样说:Cant tell much without a photo; the swapper/0 not tainted is not the error, swapper denotes the process (it is often a false positive) and the not tainted just means you dont run proprietary drivers. So, you could try to compile t
23、he hard disk controller (IDE / ATA / PATA / SATA / AHCI / .) into the kernel (=Y) as well as the file system; also make sure you have CONFIG_TMPFS=Y, CONFIG_DEVTMPFS=Y and CONFIG_DEVTMPFS_MOUNT=Y.原来是配置BusyBox时把支持网络文件系统去掉啦Linux System Utilities Support mounting NFS file systems 网络文件系统后来又重新编译了一下busybo
24、x,解决了这个问题,然后就又出现了下面的画面: 最后又搜了一些资料,发现关于这个问题的描述都不是很清楚,尝试了几种方法还是没能成功,就有决定换用低版本的grub,安装方法同上,只是引导文件由grub.cfg变成了menu.list,经过简单配置后,便成功进入了引导界面和命令模式。四总结及展望:给出本课程报告的总结、收获,并列出本研究报告未进行的工作及未来拟继续开展的工作。 本次课程设计给我最大的感触是态度决定一切,只要你自己踏踏实实,一步一个脚印的去做,就一定会有所收获。实践过程最重要的是耐心,要有锲而不舍的精神,只有自己亲自去做了,才会将问题理解得更深刻,才能对知识掌握得更牢固。课设的前一半
25、时间我都在做最基础的工作,安装虚拟机,创建Ubuntu系统,反反复复了大概四五遍,一遍又一遍让自己都觉得烦了,可是我想一定要自己做出来,一定不能在困难面前退缩,所以经过细心的检查和一次次的反复,终于最后成功了,我想这种成功之后的快感是其他人无法体会到的,U盘中那十几个压缩的根文件系统正是我一步步成长进步的见证。本次课程设计是对这一学期所学大部分知识的一个综合运用,通过此次课程设计使我们巩固了基础知识,也加强了自己的动手能力,对嵌入式系统有了更深入地了解。本次课程设计给了我很大的启发,让我懂得了该如何去学习一项新的东西,当学习的过程中遇到了问题该如何去解决,当遇到问题时,首先还是去百度搜索一下,
26、百度作为最大的搜索平台,是学习过程中重要的工具,在哪里可以找到自己遇到的大部分问题,因为这些东西一些前辈们都已经遇到过了,并且把自己的解决方法,以及经验教训都写了出来,我们可以很好地从哪里获得我们想要的知识。我感觉学到多少知识并不是最重要的,学到一种如何去学习的能力才是最终目的,因为我们将来的学习工作中总是会遇到各种各样的新问题,关键是懂得如何去解决它。另外,还要感谢老师和同学们在本次课程设计中给我的极大帮助和悉心指导。本报告未做的工作,可以在引导文件里加一些,图形界面之类的更加易于交互的界面,由于能力有限,未能实现这个功能。五参考文献: 【1】嵌入式系统原理与设计 浙大出版社 王勇编著【2】百度文库【3】【4】【5】