1.1本项目介绍
(1)开发环境
主机:Dell xps13 9360 , 操作系统Windows 10, 64-bit , USB3.0接口
虚拟机:ubuntu-18.04.2-desktop-amd64,运行在VMware® Workstation 15 Pro ,版本15.0.2 build-10952284
(2)项目内容
参考《嵌入式系统原理与设计》(浙大出版社 王勇编著)完成的本书后面一个“从0开始构建自己的U盘Linux”的实验,里面步骤中的linux内核比较老,和新的会有出入。即:
不使用U盘Linux工具,而是在Ubuntu中从0开始,自己一步步构建一个U盘存储的Linux操作系统,可以加深自己对Linux的基本开发过程的了解,这是学习嵌入式的很好的一个方法。
以下内容主要分为:Linux及其相关内容简介、构建Linux的详细过程、遇到的问题和解决方法(详见从0开始构建自己的U盘Linux(二))。
如果是第一次接触Linux系统,比如我,建议先了解Linux的以下内容,在网上搜索,都有很详细的内容,这里就不详细列出来了。
对于完全安装ubuntu的可以在/usr/src下找到linux源码,对于非完全安装(本人),需要手动下载源代码,有以下两种方式,我用过第二种和第三种:
A.在主机上从http://www.Linux.org官网下载,再拖到ubuntu中
B. ubuntu终端下载
apt-get install linux-source-4.18.0
C. 终端中访问服务端下载:
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.11.1.tar.xz
通过sudo -i 输入密码,进入root权限,再进行之后的操作。
首先看一下自己的内核版本,如果不想下载和自己正在使用的内核匹配的版本,可以忽略这一步
apt-cache search linux-source
下载内核代码,在做本次实验中,我下载过好几个版本的Linux内核,后来用的是4.11.1
apt-get install linux-source-4.18.0
或者wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.11.1.tar.xz
在哪个目录下执行上面操作的,就到该目录下查看你已经下载好的源码,我在/home/pumpkin中
解压源码,我选择解压到/home/pumpkin(用户名)下面:
1)后缀.bz2的解压(tar相关操作可自行搜索)
tar -jxv -f linux-source-4.18.0.tar.bz2 -c /home/pumpkin
2)后缀.xz的解压
xz -d linux-4.11.1.tar.xz
tar xvf linux-4.11.1.tar
等待其解压完成,现在可以到/home/pumpkin 目录下面进行查看:
apt-get install libncurses5-dev libncursesw5-dev
apt-get install ncurses-devel
apt-get install bison -y
apt-get install flex
make x86_64_defconfig //64位元电脑
configuration written to .config
这句话,就证明我们的操作是正确的。如果没有出现这句话,就有错误:make dep // 寻找依存关系,由系统决定要编译哪些内容
make clean // 清除以前编译内核时生成的中间文件(我以前没有编译过 所以不知道这一步的影响大小
make bzImage // 生成压缩的Linux内核文件,保存位置:你内核编译完成后 最后一行命令就是其位置
对于make dep命令的理解,如果你使用程序A(比如支持特殊设备),而A需用到B(比如B是A的一 个模块/子程序),而你在做make config的时候将一个设备的驱动 由内核支持改为module,或取消支持,这将可能影响到B的一个参数的设置,需重新编译B,重新编译或连接A…如果程序数量非常多, 你是很难手工完全做好此工作的。
慢慢等它完成编译即可
(1)从BusyBox的官方网站下载BusyBox的源代码:
进入你想要下载busybox 的目录下面,我在主文件夹,即用户目录pumpkin的"下载"文件夹进行的这一步:
wget https://busybox.net/downloads/busybox-1.26.2.tar.bz2
(2)将压缩文件放到/home/pumpkin/下载,注意/tmp是临时文件夹,在关机后里面的内容会丢失,所以尽量不要放到/tmp下面,此处选择放在用户目录下,可以再关机重启后继续使用。
(3)解压缩,可以在终端操作:
tar -jxvf busybox-1.26.2.tar.bz2
cd busybox-1.26.2/
也可以在这里直接在文件夹里面右键buzybox-1.30.0.tar.bz2解压到该目录下:
(4)配置Busybox,输入:
make defconfig //使用默认配置,让busybox包含常用命令和工具
make menuconfig //在上述基础上,自己更改配置
开始配置,需要和建议选择的有:
BusyBox Setting->Build Options->[ 选]Build Busybox as a static binary (no shared libs)
BusyBox Setting->Shells->chose your default shell(ash):
BusyBox Setting->Installation Options->[*]Don’t use /usr(否则busybox会安装到ubuntu的/usr下,会覆盖原系统原有的命令)
BusyBox Setting->Shells->chose your default shell(ash):
(5)编译和安装busybox:
make
make install
执行完后会产生_install/bin/ 和_install/sbin/后面会用到这些文件,ls一下会发现多了一个 _install 目录,里面是bin、sbin等,我们要用它来构建linux的根目录。bin下面是busybox支持的命令和工具,如果你希望的命令里面没有,就需要重新配置、编译Busybox让它支持
这里没有直接在U盘中构建根目录,而是在虚拟机中构建一个根文件系统的镜像压缩,之后复制到U盘中。如果直接在U盘中构建,之后有什么错误需要格式化U盘,就没必要重新构建根文件系统,把压缩文件复制过去即可。
(1)在用户目录下新建rootfs,把_install目录中的内容复制进去,现在rootfs下已经有了bin、sbin目录
(2)一个完整linux系统还需要添加其他必要文件夹,进入/rootfs,输入:
mkdir usr proc mnt var tmp dev sys etc
(下图 和我的描述有两个不同,一是文件夹名字 rootfs 无所谓吧这个名字… 而是下图没有usr 这个文件夹也不是必须的 可能要做用户登录系统需要涉及这个吧)
(3)同时在rootfs下还必须要有一个init文件,这个init文件可以是一个可执行的二进制文件,也可以是一个shell脚本,或者是指向前面两者的链接。init文件会在linux内核初始化就绪后被执行。方便起见,我们就把init做成一个指向bin/sh的软连接,在rootfs下输入:
ln -s bin/sh init
(4)dev目录下还必须有几个必要的设备console,null,ram,tty,tty1,tty2,这些tty就是和用户交互的终端:
cd 进入/rootfs/dev,建立必须的设备节点文件,并授权,输入:
mknod tty c 5 0
mknod console c 5 1
mknod null c 1 3
mknod ram b 1 0
mknod tty1 c 4 1
mknod tty2 c 4 2
chmod 666 tty console null
chmod 666 tty1 tty2
chmod 600 ram
(5)制作压缩镜像,输入:
cd .. // 回到rootfs目录下
find . | cpio -H newc -o > ../rootfs.img // 返回 块数目:5157 块
cd .. //回到用户目录
gzip rootfs.img -f //压缩镜像
前期准备——在U盘上建立Linux分区和ext3文件格式
分区表:
推荐使用DiskGenius软件,我是在win10系统下操作的。查看U盘的分区表格式,有些U盘是GUID格式的,如果不是MBR,建议转为MBR格式:
硬盘分区格式为MBR格式,启动模式应该为Legacy:
硬盘分区格式为GUID(GPT)格式,启动模式应该为UEFI:
Linux分区和文件系统:
对于建立Linux分区和ext2/ext3/ext4文件系统的更改都可以在DiskGenius中进行,比较直观,容易理解。
1)分区->删除当前分区(这个会把U盘清空 我U盘没东西 随便删)
2)分区->建立新分区->主磁盘分区->选择文件系统类型 ext3或者ext4均可,ext2/ext3/ext4有区别,可在网络上自行搜索了解。(图上是512MB 我设置了1G 看你内核大小? 1G可能也算大了 -0-)
我建立的是ext3文件系统:
成功:
把U盘挂载入文件系统,进行文件操作
(1)把U盘拔出再重新插入物理机,一般vmware会弹出下图“检测到新的USB设备”,让你选择连接到的位置,如果没有这个过程中,以及U盘连接不了,在博客(二)有一些解决办法。
如果没有弹出,可以在vmware右下角,点击U盘图标选择连接主机:
(2)检查是否分区成功和连接成功
fdisk -l
返回的最后一行出现和刚才自己分区结果一样的U盘(1G,类型Linux),设备为 /dev/sdb1
(3)U盘挂载
mkdir /mnt/usb2 //新建一个usb文件夹 名字自行取无所谓
mount /dev/sdb1 /mnt/usb2 //然后把sdb1挂到usb2文件夹
(4)安装grub,显示最后一句话说明安装成功。这条命令会把grub安装到/dev/sdb中,即把grub的第一阶段(短于512字节的部分)放入/dev/sdb的第一扇区,并且把第二阶段要用到的各种文件放到当前目录(即/dev/sdb1分区承载的ext3文件系统)(更准确的说,是放在了/dev/sdb1/boot/grub下)
(5)把过去做好的bzImage和rootfs.img.gz复制到U盘的boot目录下
(6)配置grub.cfg
输入:(下图结尾的s是不小心打错的 不需要)
保存,退出
(7)卸载U盘,之后拔出U盘,即制作完成
在虚拟机上测试。