《开发板 — 备份RK3399整个文件系统,进行批量烧录》
1.起因
因为在3399板子上搭建完环境,需要把整个文件系统导出备份。进行批量烧录生产。
2.环境配置
一台PC机(虚拟机),开发板,一根网线。开发板必须设置root的密码,后续导出文件需要用到密码。
2.1 网络配置
用PC机和开发板直连,让虚拟机和开发板可以ping通。
2.2 开发板安装环境
sudo apt-get install rsync
sudo apt-get install openssh-server
sudo vi /etc/ssh/sshd_config
修改PermitRootLogin选项用以确保root登录权限足够。
重启开发板或者重启ssh服务(/etc/init.d/ssh restart)。
经过这此修改后就可以远程登陆root帐户了,可以通过ssh工具验证。
要确保,外界可以通过ssh 登录root账户,只有这样才能将本地所有文件导出。(无法ssh登录,需进行ssh的安装和启动)。
2.3 虚拟机安装ssh和rsync
sudo apt-get install openssh-client
sudo apt-get install rsync
虚拟机环境下安装SSH服务、SSH远程登录以及SSH数据传输
2.4 在虚拟机中创建目录,用来同步保存开发板上的文件系统
mkdir ubuntu (随便一个地方都可以,文件夹名字要跟3.2中的49行对应)
到处开发板上的文件系统:
rsync -avx root@192.168.137.5:/ ubuntu
其中ip是开发板上的ip,根据实际情况修改。
输入root密码。这个时候就会导出文件系统,等待其完成。
3.将导出的文件系统打包成img文件(该步骤都在虚拟机中完成)
3.1 在ubuntu文件夹下面增加文件/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
3.2 使用打包文件系统脚本
1 #!/bin/bash 2 3 #ubuntu(ubuntu-core) build already annotation 4 #not Often compiled .......too slow and need root 5 MAKE_THEARD=`cat /proc/cpuinfo| grep "processor"| wc -l` 6 RESULT="Image-rk3288-ubuntu" 7 8 function creat_result_dir() 9 { 10 if [ ! -d $RESULT ]; 11 then 12 { 13 mkdir Image-rk3288-ubuntu 14 } 15 fi 16 } 17 18 function ubuntu_core_build() 19 { 20 dd if=/dev/zero of=linux-rootfs-core.img bs=1M count=1000 21 sudo mkfs.ext4 -F -L linuxroot linux-rootfs-core.img 22 23 if [ ! -d mount ]; 24 then 25 { 26 mkdir mount 27 } 28 fi 29 sudo mount linux-rootfs-core.img mount 30 sudo cp -a ubuntu_core/* mount 31 sudo umount mount 32 e2fsck -p -f linux-rootfs-core.img 33 resize2fs -M linux-rootfs-core.img 34 rm -rf mount 35 mv linux-rootfs-core.img $RESULT 36 } 37 function ubuntu_build() 38 { 39 dd if=/dev/zero of=linux-rootfs.img bs=1M count=5000 40 sudo mkfs.ext4 -F -L linuxroot linux-rootfs.img 41 42 if [ ! -d mount ]; 43 then 44 { 45 mkdir mount 46 } 47 fi 48 sudo mount linux-rootfs.img mount 49 sudo cp -a ubuntu/* mount 50 sudo umount mount 51 e2fsck -p -f linux-rootfs.img 52 resize2fs -M linux-rootfs.img 53 rm -rf mount 54 mv linux-rootfs.img $RESULT 55 } 56 57 function ubuntu_clean() 58 { 59 rm $RESULT/linux-rootfs.img 60 } 61 function ubuntu_core_clean() 62 { 63 rm $RESULT/linux-rootfs-core.img 64 } 65 function result_clean() 66 { 67 rm -rf $RESULT 68 } 69 70 creat_result_dir 71 if [ $1 == "clean" ] 72 then 73 { 74 if [ ! -n $2 ] 75 then 76 { 77 ubuntu_core_clean 78 ubuntu_clean 79 result_clean 80 echo clean Img oK 81 } 82 elif [ $2 == "ubuntu" -o $2 == "ubuntu/" ] 83 then 84 { 85 ubuntu_clean 86 } 87 elif [ $2 == "ubuntu_core" -o $2 == "ubuntu_core/" -o $2 == "ubuntu-core" -o $2 == "ubuntu-core/" ] 88 then 89 { 90 ubuntu_core_clean 91 } 92 else 93 { 94 ubuntu_core_clean 95 ubuntu_clean 96 result_clean 97 echo clean Img oK 98 } 99 fi 100 } 101 elif [ $1 == "ubuntu_core" -o $1 == "ubuntu_core/" -o $1 == "ubuntu-core" -o $1 == "ubuntu-core/" ] 102 then 103 { 104 ubuntu_core_build 105 } 106 elif [ $1 == "ubuntu" -o $1 == "ubuntu/" ] 107 then 108 { 109 ubuntu_build 110 } 111 else 112 { 113 ubuntu_core_build 114 ubuntu_build 115 } 116 fi
根据文件系统实际大小,可以修改39行的count参数。来调整大小。
将make_ubuntu.sh脚本放在虚拟机中创建ubuntu(下图中的ubuntusystem是错误的,应该修改成ubuntu)的目录中:
执行脚本
./make_ubuntu.sh ubuntu
提示无法获取ubuntu/* 的文件状态:没有那个文件或目录。
原因:我们创建的目录是ubuntusystem。
修改脚本49行:
sudo cp -a ubuntu/* mount
修改成:
sudo cp -a ubuntusystem/* mount
使用这种方法一直提示我:设备空间不足,但是我通过df -h,并没有发现100%被占用。
原因:
我使用的dd创建出来的初始化文件小于我要同步的文件系统大小,所以提示我设备空间不足。
解决方法:
du -h --max-depth=0 /ubuntu //查看ubuntu的大小
扩大初始化文件大小,修改行39中count的参数。
4.不直接使用脚本,分步打包img
4.1 制作镜像了,用dd工具创建镜像文件:
dd if=/dev/zero of=linuxroot.img bs=1M count=4094
count的大小根据实际文件系统大小,可以在开发板通过df -h查看。
4.2格式化镜像文件
sudo mkfs.ext4 linuxroot.img
4.3挂载镜像并往里面拷入修改后的文件系统
mkdir rootfs sudo mount linuxroot.img rootfs/ sudo cp -rfp ubuntusystem/* rootfs/
提示:设备上没有空间
查看一下发现是rootfs满了,应该是镜像创建小了。扩大镜像大小。
du -h --max-depth=1
发现导出的文件系统太大了。竟然有21个G,果断有问题,/mnt/data应该是硬盘,但是没挂载成功。导致重复导出文件。
重新导出文件系统,然后:
成功。
4.4 卸载镜像
sudo umount rootfs
4.5 裁剪镜像
这样linuxroot.img里就已经有刚才制作的根目录内容了,但linuxroot.img文件大小却是定义的分区大小,不是文件系统的实际大小,所以还要经过一些处理才能发布。
检查并修复linuxroot.img镜像的文件系统,不熟悉的朋友可以通过网络了解此工具。
e2fsck -p -f linuxroot.img
减小linuxroot.img镜像文件的大小:
resize2fs -M linuxroot.img
额!好像都一样。这样文件系统就制作好了
4. 下载文件系统到另一个开发板
略。