为了快速复制克隆嵌入式设备,把当前已经调试好的设备的系统做成image系统镜像,无疑是最快捷的。对于树莓派系统来说,属于嵌入式设备,使用树莓派的imager去烧写出系统,然后安装必要的软件,当系统完全设置好之后就可以克隆了,下面讲述整个过程。
1、安装准备
安装操作系统,需要使用树莓派的烧写程序,将SD卡放入读卡器,查到电脑上,当U盘使用
imager下载地址:https://downloads.raspberrypi.org/imager/imager_latest.exe
如果是linux,可以用命令行安装:
sudo apt install rpi-imager
2、安装ubuntu
此次将安装ubuntu,对于这种嵌入式设备,选择ubuntu server no desktop的版本,因为图形桌面太耗费资源,虽然树莓派已经算是比较强的,但是desktop版的系统在树莓派上运行,还是会出现各种问题的。
3、系统设置
3.1、修改系统密码
该版本系统安装好之后,默认的账号密码是ubuntu/ubuntu,第一次登陆会强制修改密码。按照系统引导提示去修改默认密码就可以。
3.2、修改IP地址
树莓派默认的是dhcp配置,嵌入式设备一版都是设置静态IP,这就需要修改配置文件,按照下面的格式写这个配置文件,空格什么的最好都不要错:
sudo vim /etc/netplan/50-cloud-init.yaml
3.3、打开树莓派串口
树莓派默认已经打开uart1,其他的串口需要配置重启才能生效:
sudo vim /boot/firmware/config.txt
打开改文件最后增加如下配置:
dtoverlay=uart2
dtoverlay=uart3
dtoverlay=uart4
dtoverlay=uart5
重启之后你可以看到下面这些设备
3.4、关闭NTP
ntp是树莓派提供的一个从互联网自动同步时间的服务,我们如果想让树莓派设定自己想要的时间,那么就需要关闭这个服务即可:
- open:sudo timedatectl set-ntp true
- close:sudo timedatectl set-ntp false
3.5、安装必要软件
树莓派的ubuntu安装好之后很多基础的软件都不具备,因此需要手动安装
3.5.1、安装软件时总是报错,可以修改配置文件
系统安装好之后,每次安装软件总是会报一些错误,需要修改如下配置:
sudo vim /etc/needrestart/needrestart.conf
找到这样内容:#$nrconf{ucodehints} = 0;
删掉#,保存退出
3.5.2、安装python2.7
python3并不是完全向下兼容的,有些老项目调用的python函数到python3并不支持,那么就需要安装老版本
sudo apt-get install python2.7
做好符号链接
sudo ln -s /usr/bin/python2.7 /usr/bin/python
3.5.3、安装make
sudo apt install make
3.5.4、安装gcc
sudo apt-get install gcc
3.5.5、设置应用程序自动启动
sudo vim /lib/systemd/system/rc-local.service
在这个文件最后增加:
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
修改文件权限:
sudo chmod 777 /lib/systemd/system/rc-local.service
打开此文件增加启动脚本:
sudo vim /etc/rc.local
如果文件不存在,则新建文件,在文件最后增加:
#!/bin/sh
cd /home/ubuntu/app
sudo nohup ./myprogramme.bin &
echo "myprogramme start ok!"
exit 0
增加可执行权限
sudo chmod +x /etc/rc.local
做符号链接:
sudo ln -s /lib/systemd/system/rc-local.service /etc/systemd/system/
4、克隆SD卡
一个系统安装设置好之后,为了快速克隆到其他设备上,就需要将当前的系统做成image,这样就避免重复去做这些繁琐的安装和配置了。树莓派是一个嵌入式系统,和普通的PC上的系统不同,它的文件系统需要时busybox构建出来,和sd卡大小、分区、等因素相关,所以必须把文件系统也克隆过去,不能简单的只克隆操作系统文件,因此在PC上普通的那种制作依赖于文件目录的ISO的方式,IMAGE都不可行了,以下方法在此种情形下不可用:
sudo apt-get install genisoimage
sudo genisoimage -l -r -J -o /home/one/project/fs20/tool/simulator.iso /mnt/usb/
只能使用linux系统下的dd命令进行整个SD卡的克隆,而且如果克隆的不是整个SD卡,那么系统也将不可用。
4.1、挂在SD卡
先查看linux下挂在了哪些设备
sudo fdisk -lu
lsblk
创建挂在目录
sudo mkdir /mnt/usb
挂在设备:
sudo mount /dev/sdc2 /mnt/usb
卸载设备:
sudo umount /mnt usb
4.2、整盘克隆
如果是32G的sd卡,整盘复制下来还是挺大的,有32G,因此复制过程中,同时使用压缩算法,进行文件压缩,这样结果文件会小一些。
sudo dd if=/dev/sdd | bzip2 > /home/tool/raspberry_32G.img
这个img文件就可以随意拷贝其他目录下,往相同容量大小的sd卡进行恢复了
sudo bzip2 -dc /home/tool/raspberry_32G.img | sudo dd of=/dev/sde
5、总结
在嵌入式系统上做这些实验还是很耗费时间的,前后花了几天时间,某些操作也不能拿PC系统上的经验来做,经过不断摸索,还是有很多收获,对于嵌入式系统也有了更深入的了解。