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. 下載文件系統到另一個開發板
略。