本文章可通过微信公众平台观看:https://mp.weixin.qq.com/s/VH3Y0uIvfH-Mma1h56m6aQ
更多文章以及资源下载可前往微信公众平台。
由于树莓派本身编译较慢,所以选择在Ubuntu上面进行交叉编译。
新建一个build文件夹,我们在这个文件夹中完成我们的编译工作
mkdir ~/build
cd ~/build
配置安装环境
sudo apt install git lrzsz bison flex libssl-dev zip libncurses-dev make bc
首先准备交叉编译器
sudo wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
#解压
tar -xvf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
下载树莓派内核源码(https://github.com/raspberrypi/linux)
git clone --depth=1 --branch rpi-4.19.y https://github.com/raspberrypi/linux
下载树莓派BOOT文件
git clone --depth=1 https://github.com/raspberrypi/firmware/
配置交叉编译环境
配置环境变量(编译64位内核)
echo "export ARCH_HOME=$PATH/aarch64-linux-gnu" >> env.sh
echo "export PATH=$PATH:$ARCH_HOME/bin" >> env.sh
source env.sh
开始编译内核
cd linux
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig
make -j8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
其中-j8代表编译系统使用的线程数,可根据自己电脑进行配置,整个过程大概需要10分钟(与电脑配置有关)
安装内核
#使用root身份进行安装
su
#记得将[user]换成你自己的名字
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/home/[user]/build modules_install
#切换回自己的用户
exit
到这里,内核部分就结束了,接下来我们开始制作rootfs文件系统
以使用Debian9为例,本部分参考https://juejin.im/post/5d70b78b6fb9a06ad3474b26
sudo apt-get install debian-archive-keyring
我们还是在build文件夹中
cd ~/build
安装必要的依赖
sudo apt-get install qemu qemu-user-static binfmt-support debootstrap kpartx rsync
开始构建Debian文件系统
#使用root用户
su
#构建文件系统,--arch==arm64 指定系统构架 --foreign 指定与主机架构不同 stretch 为Debian9的代号,这里使用清华的镜像站,速度较快
debootstrap --arch=arm64 --foreign stretch linux-rootfs https://mirrors.tuna.tsinghua.edu.cn/debian/
#退回自己的用户
exit
#将qemu-aarch64-static拷贝进rootfs中
sudo cp -a /usr/bin/qemu-aarch64-static linux-rootfs/usr/bin/qemu-aarch64-static
#使用chroot命令进入rootfs文件系统中
sudo chroot linux-rootfs
#此时会显示
“I have no name!@ubuntu:”
#然后对系统进行初始化
debootstrap/debootstrap --second-stage
#初始化结束后退出文件系统
exit
然后可以重新进入文件系统对系统进行定制
sudo chroot linux-rootfs
#更换国内http源
cp /etc/apt/sources.list /etc/apt/sources.list_bak
vim.tiny /etc/apt/sources.list
#将这几句复制进去
deb http://mirrors.163.com/debian/ stretch main non-free contrib
deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib
#更新升级
apt update
#开启https源支持
apt install apt-transport-https
#设置root密码
passwd
#可以安装一些你所需要的软件
apt-get install alsa-utils libasound2-dev net-tools vim ssh udev sudo wget curl git
#配置网络
HOST=localhost
echo $HOST > /etc/hostname
echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts
echo "127.0.0.1 $HOST" >> /etc/hosts
echo "auto eth0" > /etc/network/interfaces.d/eth0
echo "iface eth0 inet dhcp" >> /etc/network/interfaces.d/eth0
exit
到这里,rootfs就结束了,下面开始制作树莓派的img镜像,还是在~/build文件夹中操作
cd ~/build
#创建一个空镜像,实际大小根据你的roofs文件系统大小设定,可使用 du -h ~/build/linux-rootfs 命令查看
fallocate -l 1024M rootfs.img
#对空白镜像进行分区
fdisk rootfs.img
1. 输入o,对分区进行初始化,
2. 输入n,然后默认p回车,起始扇区默认,终止扇区输入+150M,表示第一个扇区150M大小(BOOT分区),
3. 输入t,然后输入c,设置第一个分区格式为W95 FAT32 (LBA),
4. 输入n,然后全部默认敲击回车,将剩余空间全部设置为第二个分区,
5. 输入w,保存并退出。
#可使用命令查看新的分区
fdisk -l rootfs.img
#挂载分区
sudo kpartx -av rootfs.img
#格式化分区
sudo mkfs.vfat -n BOOT /dev/mapper/loop15p1
sudo mkfs.ext4 -F -L ROOTFS -O "^has_journal" /dev/mapper/loop15p2
#挂载到电脑上
sudo mkdir {/mnt/loopXp1,/mnt/loopXp2}
sudo mount /dev/mapper/loop15p1 /mnt/loopXp1
sudo mount /dev/mapper/loop15p2 /mnt/loopXp2
#复制至boot分区
sudo cp -r firmware/boot/* /mnt/loopXp1/
sudo cp linux/arch/arm64/boot/dts/broadcom/*.dtb /mnt/loopXp1
sudo cp linux/arch/arm64/boot/dts/overlays/*.dtb* /mnt/loopXp1/overlays/
sudo cp linux/arch/arm64/boot/dts/overlays/README /mnt/loopXp1/overlays/
sudo cp linux/arch/arm64/boot/Image /mnt/loopXp1/kernel8.img
写入cmdline.txt和config.txt
#cmdline.txt
sudo vim /mnt/loopXp1/cmdline.txt
console=serial0,115200 console=tty1 loglevel=2 root=/dev/mmcblk0p2 rootfstype=ext4 rw rootwait fsck.repair=yes
#config.txt
# 以64位读取内核
arm_64bit=1
# 想要以ARMV8的模式启动,设置此选项
arm_control=0x200
# 内核的名字
kernel=kernel8.img
# u-boot进行引导kernel时延迟几秒
boot_delay=1
gpu_mem=16
将rootfs文件系统写入
cd ~/build/linux-rootfs/
sudo rsync -HPavz -q ./ /mnt/loopXp2
如果需要显示/boot 目录,可写入挂载信息
sudo vi /mnt/loopXp2/etc/fstab
LABEL=BOOT /boot vfat defaults 0 1
将内核模块拷贝进来
cd ~/build
sudo cp -r lib/modules/ /mnt/loopXp2/lib/
取消挂载
sudo umount /mnt/loopXp*
sudo kpartx -dv rootfs.img
到这里镜像文件就制作完成了,加下来就能烧录点亮了,过几天我会更新一个镜像包供大家下载交流使用。
如果觉得有用也可以关注我的微信公众号: "微电脑",id: MRweidiannao
(原创不易,转发请标注出处)
如有问题,可留言讨论
+------------------------------------------------------------------+
更新一下,这里放一个我自己按照这个步骤编译出的镜像,有需要的可以下载。
链接:https://pan.baidu.com/s/1GxwP5GNcN9xlp2Vpqa893w 提取码:0qrb
默认的root密码是我的网站(ruiwencloud.xyz):ruiwencloud
我在root用户的home中放了一个rwset.sh的文件(自己手写,如果没有找到可以在我的网站下载http://ruiwencloud.xyz/functions/linset.sh),这个脚本是用来自动配置网卡、扩展硬盘空间、开启swap的,简单的介绍一下怎么使用。
- 设置网卡:第一次开机后,以root用户登录,密码是ruiwencloud。进行如下操作
#给脚本运行权限
chmod +x rwset.sh
#设置网卡
./rwset.sh -n
#重启树莓派后生效,使用reboot命令重启,也可等扩展完硬盘后再重启
#reboot
网卡就配置成功了
- 扩展硬盘:等待重启完成后,登录root用户。进行如下操作
#扩展硬盘空间
./rwset.sh -d
#直到显示 “Press ENTER to reboot”
敲击回车键,以重启树莓派,等到重启后继续登录root用户,在终端中输入以下命令完成扩充
resize2fs /dev/mmcblk0p2
硬盘就扩展完成了
- 设置swap分区
#扩展分区,此过程可能较慢,请耐心等待1-2分钟
./rwset.sh -s
swap分区就设置成功了