树莓派基础(raspberry zero)

树莓派入门

入门

由于买的是没有网络模块的版本,可以使用板子上的串口作为默认的数据显示,raspberry zero 的引脚图
请添加图片描述
修改sd卡boot中的config.txt文件,在最后添加enable_uart=1,连上usb-ttl 模块,使用putty,切换到串口连接状态
请添加图片描述

先连接usb-ttl,后上电,过一会有系统初始化的打印就可以,系统初始化成功后登录username:pi pwd:raspberry,获取rootsudo -i其他操作和ubuntu差不大,毕竟都叫debian爸爸

参考
树莓派raspberry pi zero w上手笔记

内核编译

参考官网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

How to list physical disks?

Using a Physical Hard Drive with a VirtualBox VM

Oracle® VM VirtualBox®

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值