树莓派入门
入门
由于买的是没有网络模块的版本,可以使用板子上的串口作为默认的数据显示,raspberry zero 的引脚图
修改sd卡boot中的config.txt文件,在最后添加enable_uart=1
,连上usb-ttl 模块,使用putty,切换到串口连接状态
先连接usb-ttl,后上电,过一会有系统初始化的打印就可以,系统初始化成功后登录username:pi pwd:raspberry
,获取rootsudo -i
其他操作和ubuntu差不大,毕竟都叫debian爸爸
内核编译
参考官网raspberry
按照官网提供的交叉编译的方式即可,本地编译是在板子上编译的(速度巨慢),其中下载git资源,用了death,直接clone可能会由于网络导致下载失败,可以参考以下修改利用国内镜像下载。git clone --depth=1 https://github.com/raspberrypi/linux
修改为git clone --depth=1 https://hub.fastgit.org/raspberrypi/linux
,如果读者在阅读时该方法已经失效,则要自己去找找国内源或者试着翻墙。
官网的指南最好先看一遍再实践,自己板子(我的是raspberry zero)需要的toolchain可能不一样,下面以raspberry zero(最便宜的树莓派)作为示例
raspberry zero 内核编译实践
抓code
git clone --depth=1 https://github.com/raspberrypi/linux
编译烧写
下载编译工具链,如果下载慢,建议网上找个好点的镜像下载
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
sudo apt install crossbuild-essential-armhf (Install the 32-bit toolchain for a 32-bit kernel)
创建.config文件,应该也可以用旧系统导出的,不过先按官网的(For Pi 1, Pi Zero, Pi Zero W, or Compute Module:)
cd linux
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig
然后使用命令直接编译,下面的指令后面加上-jx,其中x为处理器的数量乘以1.5,如果是4核,在指令后面加上-j6
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
编译结束会生成./arch/arm/boot/zImage等的文件,我是在电脑上用wsl2 编译的镜像(可以跑满电脑全部性能),所以要先把需要替换到树莓派的文件整理出来,打包通过win传到虚拟机,再用虚拟机对SD卡读写进行文件替换。
在上面的步骤后,使用sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=[location] modules_install
其中location是要存放文件的位置,这些文件是需要替换的库文件,结构如下
modules/
└── 5.10.50+
├── build -> /home/chen/linux
├── kernel
│ ├── arch
│ ├── crypto
│ ├── drivers
│ ├── fs
│ ├── kernel
│ ├── lib
│ ├── mm
│ ├── net
│ └── sound
├── modules.alias
├── modules.alias.bin
├── modules.builtin
├── modules.builtin.alias.bin
├── modules.builtin.bin
├── modules.builtin.modinfo
├── modules.dep
├── modules.dep.bin
├── modules.devname
├── modules.order
├── modules.softdep
├── modules.symbols
├── modules.symbols.bin
└── source -> /home/chen/linux
其他还需要替换到内存卡的文件包括
zImage ->/boot/kernel.img
arch/arm/boot/dts/*.dtb ->/boot/
arch/arm/boot/dts/overlays/*.dtb* ->/boot/overlay/
arch/arm/boot/dts/overlays/README ->/boot/overlay/
以上文件遇到重复的直接替换就好了。
之前生成的modules文件是需要使用虚拟机的,其他的文件可以直接在win里面替换,打开boot盘,替换到对应的位置即可。
回到虚拟机上来,module文件准备好之后就开始替换,我使用的是SD卡槽的方式,如果有读卡器的,可以直接让虚拟机访问读卡器来进行文件替换,如果也使用SD卡槽,则后面烧写的操作进行配置,正常情况下dev文件结构为
sdb 8:16 0 59.5G 0 disk
├─sdb1 8:17 0 256M 0 part
└─sdb2 8:18 0 59.2G 0 part
sd卡里面主要是boot(sdb1),root(sdb2)。root文件结构就像在根目录下一样,挂载后,root路径下找到/root/lib/
将之前准备好的module文件复制到里面就可以。
之后记得umount后拔出sd卡,插入树莓派,输入账号后会显示当前的系统版本为5.10.50+或者使用cat /etc/os-release;uname -a
,表明更新成功,如果一直无法启动,串口也没有输出,则内核编译失败,建议重新编一版。
打包系统
可以使用之前烧写的软件Win32DiskImager或者linux下使用dd指令复制SD卡的内容,但这样都是全卡复制,你的内存卡多大镜像就多大,所以要做分区备份(最小化镜像)
在成功点亮自己编译的系统后,保存该系统的方式参考如下
在虚拟机中下载apt install gparted
,然后启动gparted(命令行直接输入就可以),然后按如下操作(记得umount该硬盘,如果有mount的话)
右上角先且切换到sdb分区(sdb开始指第二块硬盘,字母增大以此类推)
可以看到相关的使用,主要裁剪root分区的空间
如上图,在root上右键,选择resize
填写newsize(该值参考上面的最小值加2,300),再点击下其他的空框框,之后就能点击resize
点击勾勾选择apply即可。
在win上,使用新版本Win32DiskImager软件,或者界面带有仅读取已用分区的版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H6hiyleU-1628365683716)(…/…/pic\win\software\Win32DiskImager\read_sys.png)],在本地创建一个.img文件,选择后点击读取,等待进度条走完,之后就能看到自己编译升级后读取的系统镜像文件了。
参考
教你树莓派4B的系统备份方法教程大全
sda, sdb, sdc, sda1, sda2在Linux中都代表什么
烧写
这一步相当废时,和入门直接烧写镜像不同,build后的升级方式是采用替换文件的方式实现的,具体就是要访问tf卡,然后将文件替换到上面,使用读卡器可以直接当U盘使用tf卡,然后在visual box或者其他设备中访问,但如果你使用的是电脑的SD卡槽,那么就继续往下看。
Visual BOX
由于是免费的,就用这个了
U盘
读写U盘只要稍微设置下就可以
然后就可以在系统里直接访问到了
默认是挂在media下。
SD卡槽
使用vm player/workstation的可以参考
使用vm box的按以下步骤。
电脑的SD slot和U盘不一样,走的是PCIE的总线,所以对于电脑相当于一个硬盘,可以储存控制台看到相关信息
同时在命令使用Get-WmiObject Win32_DiskDrive
可以获得详细信息
Partitions : 2
DeviceID : \\.\PHYSICALDRIVE2
Model : SDXC Card
Size : 63861073920
Caption : SDXC Card
这个输出要记住
由于sd走pcie,需要在本地创建一个.vdmk文件,该文件的作用是指向本地的一块硬盘区域,以前我们生成的虚拟硬盘也是一类硬盘区域,只不过是从本地物理硬盘中划分的而已。
使用指令VBoxManage.exe internalcommands createrawvmdk -filename "D:mytest.vmdk" -rawdisk \\.\PHYSICALDRIVE2
注意,win下该指令要在vm的安装目录下才有效果,或者将vm的路径加入环境变量,总之要让系统能够找到VBoxManage.exe这个文件才可以,后面的路径可以是自己要的路径,这里我放在D盘,后面的是自己的DeviceID,也就是之前生成的信息,输出RAW host disk access VMDK file D:mytest.vmdk created successfully.
则创建成功。
有.vmdk文件后,VM BOX参照以下设置添加即可。
注意 在点击Controller:SATA时,右框Attributes下的checkbox(Use Host I/O Cache)要勾选,不然在之后mount的时候会导致crash,报I/O cache encountered an error while updating data in medium “ahci-0-1” (rc=VERR_ACCESS_DENIED)
问题。
然后启动虚拟机,可以在/dev
下找到sdb1/2,两个分区,创建两个文件夹,将这两个分区挂载上去。
root@chen-VirtualBox:/dev# find . -name 'sdb*'
./sdb2
./sdb1
./sdb
root@chen-VirtualBox:/dev# cd /mnt
root@chen-VirtualBox:/mnt# ls
root@chen-VirtualBox:/mnt# mkdir boot
root@chen-VirtualBox:/mnt# mkdir root
root@chen-VirtualBox:/mnt# mount /dev/sdb1 boot/
root@chen-VirtualBox:/mnt# mount /dev/sdb2 root/
root@chen-VirtualBox:/mnt# ls ./root/
bin dev home lost+found mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
在关闭虚拟机前要记得umount /mnt/boot
,root文件夹ditto
参考
VirtualBox direct access to SD Card in Windows
Accessing SD Card from Linux VirtualBox Guest on Windows Host