《开发板 — 备份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. 下载文件系统到另一个开发板

  略。

 

 

 

 

  

  

  

posted @ 2020-03-19 15:15  一个不知道干嘛的小萌新  阅读(4642)  评论(2编辑  收藏  举报