资源描述
课程设计报告
课程名称: 嵌入式系统原理与设计
姓 名:
学 号:
班 级:
专 业: 电子信息科学与技术
从零开始构建自己的U盘Linux
一. 摘要:介绍本报告的主要内容。
本报告是关于在Ubuntu系统下,通过一些基础操作,来构建一个U盘Linux,方法虽然比直接用现成的工具软件方便,但是可以让我们了解Linux的基本开发过程,是学习嵌入式的很好的一个方法。
主要内容是构建过程中的基本方法,在这个过程中遇到的一些问题,以及查询资料,解决问题的过程。
二. 引言:说明本课程报告所选知识点相关技术的意义。
目前的主板BIOS都支持USB和硬盘的启动方式,这样对于Windows的系统维护与安装工作越来越方便,在优盘上建立Linux启动盘,对于系统维护人员具有更加实用的意义。
USB闪存存储装置(优盘)由于具有轻巧精致、经常用来在PC之间交换文件。目前新出的主板BIOS都支持USB和硬盘的启动方式,这样对于Windows的系统维护与安装工作越来越方便。
三. U盘的构建步骤。
1.准备工作
1.1 准备开发主机
首先在电脑上安装虚拟机VMWare,然后将下载的Ubuntu镜像安装在该虚拟机上,安装后如图:
1.2准备测试用计算机
本次过程中测试用计算机即是本机,当U盘做好后,将本机BIOS设置为从USB启动,然后在插着U盘时开机既可测试。
1.3准备Linux的内核源代码
现在有很多可以下载源代码的网站,从网站上现在即可,
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/rcS"
改为
#define INIT_SCRIPT "/etc/rc.d/rc.sysinit"
1.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
然后就开始配置将一些必要的选项打[*]或[ ]:
BusyBox SettingàBuild Options
[*]Build Busybox as a static binary (no shared libs)
Shellsàchose your default shell(ash):
[*]ash
[ ]hush
[ ]msh
1.45编译BusyBox,命令如下:
# make
在执行make时出现了一个错误经过查找资料发现可以这样解决:
只要把make menuconfig 去掉如下选项
Linux System Utilities —> [ ] Support mounting NFS file systems 网络文件系统
Networking Utilities —> [ ] inetd (Internet 超级服务器 )
【注】实际上只是暂时解决了这个报错的问题,由于去掉了一些支持带来了更大的问题。(此处只要将超级服务器的选项去掉即可,后面会详述出现的问题)。
1.46安装BusyBox,命令如下:
#make install
执行完后会产生_install/bin/ 和_install/sbin/后面会用到这些文件。
2.编译Linux内核
从网上http://www.kernel.org 下载Linux内核压缩之后就可以配置的,编译内核了,具体操作如下
我下载的是linux-3.15.1.tar.xz 文件解压如下tar –J linux-3.15.1.tar.xz
cd /home/
sudo tar –J linux-3.15.1.tar.xz
make menuconfig //进行内核编译
需要注意是由于支持U盘启动,配置内核时必须选择以下内容:
选择Device Devices(设备驱动) ->Block devices 下的loopback device support, RAMblock device support
选择Device Devices->SCSI Support, SCSI disk Support, SCSI low-dri
vers-Buslogic SCSI support 等支持;
(3) 选择Device Devices->USB Support 下的Support for Host-side U
SB,Preliminary USB device filesystem ,USB Mass Storage support 支持;另外,还需要选UHCI HCD support 或OHCI HCD support
选择后选择保存
使用“make dep”命令寻找依赖关系,由系统决定需要编译那些内容
使用“make clean”命令清除以前编译内核时生成中
间文件等。
使用“make bzImage”命令生成压缩的Linux文件
3.在优盘上建立根文件系统
3.1在优盘上建立Linux分区和ext2文件格式
使用fdisk –l查看设别文件
进行分区,操作如下:
fdisk /dev/sdb 出现以下提示:
Command (m for help): d输入d删除原来的分区,原来有几个分区就输入几次d。
No partition is defined yet!
Command (m for help): n输入n建立新的分区,出现:
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-16179199, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-16179199, default 16179199): +512M输入+512M,在U盘上建立一个512M大小的分区。
Command (m for help): p输入p查看是否分区成功。
Disk /dev/sdb: 8283 MB, 8283750400 bytes
2 heads, 63 sectors/track, 128406 cylinders, total 16179200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00372dfa
Device Boot Start End Blocks Id System
/dev/sdb1 2048 1050623 524288 83 Linux
Command (m for help): w输入w保存并退出fdisk。
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
卸载优盘:
umount /dev/sdb1
创建文件系统:
mkfs.ext2 /dev/sdb1
执行过程截图如下:
3.2建立必须的目录
操作如下:
root@ubuntu:/home/luck# mkdir /mnt/usb
root@ubuntu:/home/luck# mount /dev/sdb1 /mnt/usb
root@ubuntu:/home/luck# cd /mnt/usb
mkdir boot etc etc/rc.d proc tmp var dev mnt lib initrd
chmod 755 boot etc etc/rc.d proc tmp var dev mnt lib initrd
3.3建立必须的设备节点文件
操作如下:
root@ubuntu:/mnt/usb# cd dev
root@ubuntu:/mnt/usb/dev# mknod tty c 5 0
root@ubuntu:/mnt/usb/dev# mknod console c 5 1
root@ubuntu:/mnt/usb/dev# chmod 666 tty console
root@ubuntu:/mnt/usb/dev# mknod tty0 c 4 0
root@ubuntu:/mnt/usb/dev# chmod 666 tty0
root@ubuntu:/mnt/usb/dev# mknod ram0 b 1 0
root@ubuntu:/mnt/usb/dev# chmod 600 ram0
root@ubuntu:/mnt/usb/dev# mknod null c 1 3
root@ubuntu:/mnt/usb/dev# chmod 666 null
3.4生成一些常见的命令和工具
root@ubuntu:/mnt/usb/dev# cp -a -R -f /home/luck/busybox/busybox-1.21.0/_install/* /mnt/usb/
root@ubuntu:/mnt/usb/dev#cd /bin
root@ubuntu:/mnt/usb/dev#ln –l sh
root@ubuntu:/mnt/usb/dev#ldd bash 从此处可以看出需要哪些库的支持,需要把这些库复制到U盘中。
root@ubuntu:/bin# cp /bin/bash /mnt/usb/bin
root@ubuntu:/bin# cp /lib/i386-linux-gnu/libtinfo.so.5 /mnt/usb/lib
root@ubuntu:/bin# cp /lib/i386-linux-gnu/libdl.so.2 /mnt/usb/lib
root@ubuntu:/bin# cp /lib/i386-linux-gnu/libc.so.6 /mnt/usb/lib
root@ubuntu:/bin# cp /lib/ld-linux.so.2 /mnt/usb/lib
root@ubuntu:/bin# cd /mnt/usb/bin
root@ubuntu:/mnt/usb/bin#rm sh 此处需将原来的sh文件删除
root@ubuntu:/mnt/usb/bin# ln -s bash sh
3.5建立一些必须的配置文件
root@ubuntu:/mnt/usb# gedit /mnt/usb/etc/inittab
在编辑器中输入以下inittab的内容:
::sysinit:/ etc/rc.d/rc.sysinit
::askfirst:/bin/sh
建立/mnt/usb /etc/rc.d/rc.sysinit配置文件
root@ubuntu:/mnt/usb# gedit /mnt/usb/etc/rc.d/rc.sysinit
在编辑器中输入以下rc.sysinit的内容:
$!/bin/sh
mount-a
root@ubuntu:/mnt/usb# gedit /mnt/usb/etc/fstab
在编辑器中输入以下rc.sysinit的内容:
proc /proc proc defaults 0 0
然后修改这三个文件的权限:
root@ubuntu:/mnt/usb# chmod 644 /mnt/usb/etc/inittab
root@ubuntu:/mnt/usb# chmod 755 /mnt/usb/etc/rc.d/rc.sysinit
root@ubuntu:/mnt/usb# chmod 644 /mnt/usb/etc/fstab
3.6复制Linux文件到U盘中
复制编译好的内核到U盘
cp /home/luck/linux/linux-3.15.1/arch/x86/boot/bzImage /mnt/usb/boot
4.安装grub到U盘中
4.1挂载/dev/sdb2
mkdir /mnt/usb
mount /dev/sdb1 /mnt/usb
4.2现在先查看/mnt/usb下是否有文件(做这步是为了和安装好grub做比较),可以看到还没有
# ls /mnt/usb
lost+found
4.3安装grub到u盘上
grub-install --root-directory=/media/test/ --no-floppy /dev/sdb
4.4再查看/mnt/usb下是否有文件,可以看到多了很多文件,都是grub启动所需的必要文件。
4.5安装完grub后,还要对其进行配置。
这一步是很关键的一步,也是很容易出错,起初用的是grub2版本,
出现了这些错误:
一个是grub.cfg编写过程中的UUID漏改一个,还有一个文件忘记复制。
更改后grub.cfg的内容如下:
### BEGIN /etc/grub.d/00_header ###
set default="0"
insmod ext2
search --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/black
set menu_color_highlight=black/light-gray
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
menuentry 'lucky1'{
insmod ext2
search --no-floppy --fs-uuid --set=root 3b1d9c1f-ec57-49fa-a08f-69efad575e75
linux /boot/vmlinuz-3.2.0-64-generic-pae root=UUID=3b1d9c1f-ec57-49fa-a08f-69efad575e75 ro quiet splash
initrd /boot/initrd.img-3.2.0-64-generic-pae
}
### END /etc/grub.d/10_linux ###
然后错误就变成了:
搜索资料发现一个论坛里这样说:
Can't 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 don't run proprietary drivers. So, you could try to compile the 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 网络文件系统
后来又重新编译了一下busybox,解决了这个问题,然后就又出现了下面的画面:
最后又搜了一些资料,发现关于这个问题的描述都不是很清楚,尝试了几种方法还是没能成功,就有决定换用低版本的grub,安装方法同上,只是引导文件由grub.cfg变成了menu.list,经过简单配置后,便成功进入了引导界面和命令模式。
四. 总结及展望:给出本课程报告的总结、收获,并列出本研究报告未进行的工作及未来拟继续开展的工作。
本次课程设计给我最大的感触是态度决定一切,只要你自己踏踏实实,一步一个脚印的去做,就一定会有所收获。实践过程最重要的是耐心,要有锲而不舍的精神,只有自己亲自去做了,才会将问题理解得更深刻,才能对知识掌握得更牢固。课设的前一半时间我都在做最基础的工作,安装虚拟机,创建Ubuntu系统,反反复复了大概四五遍,一遍又一遍让自己都觉得烦了,可是我想一定要自己做出来,一定不能在困难面前退缩,所以经过细心的检查和一次次的反复,终于最后成功了,我想这种成功之后的快感是其他人无法体会到的,U盘中那十几个压缩的根文件系统正是我一步步成长进步的见证。 本次课程设计是对这一学期所学大部分知识的一个综合运用,通过此次课程设计使我们巩固了基础知识,也加强了自己的动手能力,对嵌入式系统有了更深入地了解。
本次课程设计给了我很大的启发,让我懂得了该如何去学习一项新的东西,当学习的过程中遇到了问题该如何去解决,当遇到问题时,首先还是去百度搜索一下,百度作为最大的搜索平台,是学习过程中重要的工具,在哪里可以找到自己遇到的大部分问题,因为这些东西一些前辈们都已经遇到过了,并且把自己的解决方法,以及经验教训都写了出来,我们可以很好地从哪里获得我们想要的知识。我感觉学到多少知识并不是最重要的,学到一种如何去学习的能力才是最终目的,因为我们将来的学习工作中总是会遇到各种各样的新问题,关键是懂得如何去解决它。
另外,还要感谢老师和同学们在本次课程设计中给我的极大帮助和悉心指导。
本报告未做的工作,可以在引导文件里加一些,图形界面之类的更加易于交互的界面,由于能力有限,未能实现这个功能。
五. 参考文献:
【1】嵌入式系统原理与设计 浙大出版社 王勇编著
【2】百度文库
【3】
【4】
【5】
展开阅读全文