制作SD卡启动盘
本来是想要试着制作SOC的,SD卡启动盘也制作好了,但是因为很多原因没有进行到最后
这一篇是我制作启动盘的笔记,有些是按我自己的理解实现的
不一定完全对,最终该SD卡启动盘也没有经过验证
所以下述内容不一定正确,仅以此记录
SD卡启动相关知识
启动过程是一个从SD卡逐步搬移到DDR内存,并且运行启动代码进行相关的硬件初始化和软件架构的建立,最终达到运行时稳定状态。u-boot自启动,引导内核启动。
接下来开始制作启动盘!
一、SD卡分区
1.查看设备及分区
插入SD卡,输入
sudo fdisk -l
我的系统上SD卡设备节点是 /dev/sdb
包含一个分区,分区名是sdb1
2.取消所有分区挂载
我只需要删掉一个
sudo umount /dev/sdb1
3.开始分区
sudo fdisk /dev/sdb
1.输入m查看命令,然后d删除分区
2.输入n添加新分区;接着输入p代表是主分区;然后输入1代表是第一分区;然后直接回车,代表内存从默认地方开始;然后输入+2G,代表分区大小2G。
3.输入n添加新分区;接着输入p代表是主分区;然后输入2代表是第二分区;然后直接回车,代表内存从默认地方开始;然后输入回车,代表分区大小为剩下的内存。
4.输入w保存
4.设置分区格式
先查看以下是否有两个文件
ls -l /dev/sdb*
有可能没有出现/dev/sdb2
则通过以下命令解决(其中b是block型设备文件,8是主设备号,2是辅助设备号)
mknod /dev/sdb2 b 8 2
确认两个都有之后,设置第一个分区为FAT32格式,第二个分区为EXT3格式,并分别起名为boot和rootfs。
sudo mkfs.vfat -F 32 -n boot /dev/sdb1
sudo mkfs.ext4 -L rootfs /dev/sdb2
二、安装交叉编译器
1.下载
到网址 https://download.friendlyarm.com/nanopineo
toolchain目录下载arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz
2.创建目录并解压
这里在根目录创建
mkdir -p ~/FriendlyARM/toolchain
tar xf arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz -C ~/FriendlyARM/toolchain/
3.将编译器的路径写入PATH
用vim编辑.bashrc
vi ~/.bashrc
在末尾添加
export PATH=~/FriendlyARM/toolchain/4.9.3/bin:$PATH
export GCC_COLORS=auto
4.让写入内容生效
. ~/.bashrc
关闭命令行重新打开
5.验证
arm-linux-gcc --version
显示版本号即安装成功
三、编译准备工作
开始编译U-boot和Kernel,我将他们都放在SOC文件夹下
mkdir -p ~/SOC
cd ~/SOC
更换shell中python版本
先查看shell的Python版本是不是Python2 不然后面编译会报错
可以在shell通过以下命令查看python当前版本
我的博客里有一篇change-python-version-in-linux-shell,有讲怎么改版本
python --version
如果不是,参考该链接更改:https://www.bonbonn.shop/2021/12/08/change-python-version-in-linux-shell/
四、编译U-boot
1.下载U-boot源码
git clone https://github.com/friendlyarm/u-boot.git -b sunxi-v2017.x --depth 1
2.编译
apt-get install swig python-dev python3-dev
cd u-boot
make nanopi_h3_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
make ARCH=arm CROSS_COMPILE=arm-linux-
编译成功后会生成文件u-boot-sunxi-with-spl.bin
3.更新到SD卡
确定自己sd卡路径,如上述分区则是/dev/sdb,将文件写入
dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
Tips:是写入了无名分区,所以是看不到的,不要惊慌。
五、编译kernel
1.下载Linux内核源码
git clone https://github.com/friendlyarm/linux.git -b sunxi-4.14.y --depth 1
2.编译
需要挺久的
apt-get install u-boot-tools
cd linux
touch .scmversion
make sunxi_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
make zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux-
编译完成后会在arch/arm/boot/目录下生成zImage,并且在arch/arm/boot/dts/目录下生成dtb文件。
3.创建文件夹作为挂载点
如上述分区则是/dev/sdb1
mkdir -p ./SD/boot
sudo mount /dev/sdb1 ./SD/boot
4.更新SD卡上的zImage和dtb文件
cp arch/arm/boot/zImage ./SD/boot
cp arch/arm/boot/dts/sun8i-*-nanopi-*.dtb ./SD/boot
5.取消挂载
sudo umount ./SD/boot
六、编译驱动模块
同上述Linux内核源码路径
1.编译
需要挺久的
cd linux
make modules ARCH=arm CROSS_COMPILE=arm-linux-
2.创建文件夹为挂载点
如上述分区则是/dev/sdb2
mkdir -p ./SD/rootfs
sudo mount /dev/sdb2 ./SD/rootfs
3.更新SD卡上rootfs的驱动模块
cd linux
make modules_install INSTALL_MOD_PATH=/media/SD/rootfs/ ARCH=arm CROSS_COMPILE=arm-linux-
有可能提示权限不够,加了sudo提示arm-linux-gcc不存在
原因是sudo超级用户的环境变量与正常的环境变量不同,而在sudo的环境变量下没有arm-linux-gcc
一种办法就是编辑sudoers文件,取消掉对PATH变量的重置
sudo vi /etc/sudoers
将其中Defaults env_reset 改成 Defaults !env_reset
然后编辑~/.bashrc
vi ~/.bashrc
添加
alias sudo="sudo env PATH=$PATH"
然后关掉命令行,重新进入对应目录执行对应操作
4.取消挂载
sudo umount ./SD/rootfs
参考:http://wiki.friendlyarm.com/wiki/index.php/Building_U-boot_and_Linux_for_H5/H3/H2%2B/zh