zoukankan      html  css  js  c++  java
  • 《开发板 — 备份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. 下载文件系统到另一个开发板

      略。

      

      

      

  • 相关阅读:
    Git—分支管理
    Git—推送代码至Github
    Git入门—创建项目
    Mysql单表查询
    Mysql数据的增删改查
    Mysql完整约束性
    C++继承中同名成员变量处理方法
    C++继承和组合中的构造函数和析构函数调用原则
    C++继承中的类型兼容原则
    C++中的继承
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/12524489.html
Copyright © 2011-2022 走看看