自己拥有一块Firefly-RK3399开发板,并在开发板上面安装了Ubuntu16.04系统,而且在开发板上面做了一些环境配置和软件开发工作,现在需要将这块开发板的环境及系统克隆到另外一块开发板上。所以需要将系统做备份,然后烧录到新的开发板上面。
cat /proc/cmdline
androidboot.baseband=N/A
androidboot.selinux=permissive
androidboot.hardware=rk30board
androidboot.console=ttyFIQ0
root=/dev/mmcblk1p6 rw rootfstype=ext4
mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),
0x00002000@0x00004000(trust),
0x00008000@0x00006000(resource),
0x00008000@0x0000e000(kernel),
0x00002000@0x00017000(backup),
-@0x00019000(boot)
storagemedia=emmc
uboot_logo=0x02000000@0x7dc00000
loader.timestamp=2017-02-24_16:13:37
SecureBootCheckOk=0
androidboot.mode=emmc
这里已kernel分区说明,0x00008000@0x0000e000(kernel),分区名字前面是其大小和起始位置
@前面是分区大小,@后面是分区起始位置
数值的单位是sector(扇区),1个sector 为512 Bytes,kernel 分区的起始位置是0xe000,大小是0x8000(16M),这两个数等会导出就直接用到。
-@0x00019000(boot)域就是开发板的文件系统,使用AndroidTool_Release工具不好导出,所以需要使用另外一种方式,其操作步骤如下:
在开发板的UBUNTU系统上面安装软件rsync :
sudo apt-get install rsync
在开发板的UBUNTU系统上面安装软件openssh的服务端openssh-server并修改root登录权限 :
sudo apt-get install openssh-server
sudo vi /etc/ssh/sshd_config
修改PermitRootLogin选项用以确保root登录权限足够
重启开发板或者重启ssh服务
# /etc/init.d/ssh restart
sudo apt-get install openssh-client
sudo apt-get install rsync
sudo vi /etc/onlyone.sh
内容为:
#!/bin/sh
read line < /proc/cmdline
for arg in $line; do
if [ "5" -le "$(expr length $arg)" ]; then
if [ "root=" = "$(expr substr $arg 1 5)" ]; then
{
debug_arg=$(expr $arg : 'root=\(.*\)')
resize2fs $debug_arg
}
fi
fi
done
修改文件权限
sudo chmod 777 /etc/onlyone.sh
#!/bin/bash
#ubuntu(ubuntu-core) build already annotation
#not Often compiled .......too slow and need root
MAKE_THEARD=`cat /proc/cpuinfo| grep "processor"| wc -l`
RESULT="Image-rk3288-ubuntu"
function creat_result_dir()
{
if [ ! -d $RESULT ];
then
{
mkdir Image-rk3288-ubuntu
}
fi
}
function ubuntu_core_build()
{
dd if=/dev/zero of=linux-rootfs-core.img bs=1M count=1000
sudo mkfs.ext4 -F -L linuxroot linux-rootfs-core.img
if [ ! -d mount ];
then
{
mkdir mount
}
fi
sudo mount linux-rootfs-core.img mount
sudo cp -a ubuntu_core/* mount
sudo umount mount
e2fsck -p -f linux-rootfs-core.img
resize2fs -M linux-rootfs-core.img
rm -rf mount
mv linux-rootfs-core.img $RESULT
}
function ubuntu_build()
{
dd if=/dev/zero of=linux-rootfs.img bs=1M count=5000
sudo mkfs.ext4 -F -L linuxroot linux-rootfs.img
if [ ! -d mount ];
then
{
mkdir mount
}
fi
sudo mount linux-rootfs.img mount
sudo cp -a ubuntu/* mount
sudo umount mount
e2fsck -p -f linux-rootfs.img
resize2fs -M linux-rootfs.img
rm -rf mount
mv linux-rootfs.img $RESULT
}
function ubuntu_clean()
{
rm $RESULT/linux-rootfs.img
}
function ubuntu_core_clean()
{
rm $RESULT/linux-rootfs-core.img
}
function result_clean()
{
rm -rf $RESULT
}
creat_result_dir
if [ $1 == "clean" ]
then
{
if [ ! -n $2 ]
then
{
ubuntu_core_clean
ubuntu_clean
result_clean
echo clean Img oK
}
elif [ $2 == "ubuntu" -o $2 == "ubuntu/" ]
then
{
ubuntu_clean
}
elif [ $2 == "ubuntu_core" -o $2 == "ubuntu_core/" -o $2 == "ubuntu-core" -o $2 == "ubuntu-core/" ]
then
{
ubuntu_core_clean
}
else
{
ubuntu_core_clean
ubuntu_clean
result_clean
echo clean Img oK
}
fi
}
elif [ $1 == "ubuntu_core" -o $1 == "ubuntu_core/" -o $1 == "ubuntu-core" -o $1 == "ubuntu-core/" ]
then
{
ubuntu_core_build
}
elif [ $1 == "ubuntu" -o $1 == "ubuntu/" ]
then
{
ubuntu_build
}
else
{
ubuntu_core_build
ubuntu_build
}
fi
将脚本拷贝到ubuntu_make目录并运行脚本
./make_ubuntu.sh ubuntu
最终在Image-rk3288-Ubuntu目录下生成rootfs文件
烧录的过程中使用到了上面导出的镜像、分区信息和AndroidTool烧写工具
在烧写前需要注意工具珊的地址和分区名字要根据上面导出来的分区信息要一致,否则会烧写失败