《開發板 — 備份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. 下載文件系統到另一個開發板

  略。

 

 

 

 

  

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM