1. 程式人生 > >製作樹莓派最小映象-img裁剪瘦身

製作樹莓派最小映象-img裁剪瘦身

修改記錄
2016年7月28日修改指令碼,動態支援樹莓派映象

最近剛做了一套opencv攝像頭監控的程式,想將這套程式做一個映象備份起來,但發現用Win32DiskImager或dd命令來製作映象,都是將sd卡整盤進行備份,造成了巨大的硬碟浪費,同時,會侷限sd卡本身,也就是說32g卡製作的映象無法恢復到16g或8g的卡上,即便軟體沒有佔用那麼大空間,所以希望將映象瘦身,做一套最小佔用空間的映象,且不損害映象本身。

前不久在csdn上看到 liuwei000000的博文與我所希望的結果差不多,所以試著進行一次img瘦身。
不過該博文也有缺點“該方法制作的映象不能用raspi-config擴充套件分割槽

”所以即便我們能夠將img瘦身也不能輕鬆的利用raspi-config擴充套件樹莓派了,所以我提煉了奮鬥部落格博文親身製作了一把img,並把遇到的問題記錄了下來

我使用的的是raspberry pi 2+32G高速tf卡,因為全程只在樹莓派中操作所以不需要額外的linux系統。

若樹莓派所佔空間小於sd卡空間的50%即可以使用第一種方法,在樹莓派內部直接生成映象。
若樹莓派所佔空間大於sd卡空間的50%,可以使用第二種方法,先生成sd卡映象,然後再其他linux系統中進行裁剪。

在文後,我會提供一鍵指令碼。

樹莓派內部生成映象

一、檢視當前系統所佔容量
用Win32DiskImager來製作映象時是將sd卡正卡全部做成映象,是因為無法讀取到linux分割槽的原因,所以我們在製作映象前,先要確定我們當前系統所佔用了多少系統空間,即備份映象的大小。

#檢視當前系統所佔用的空間
df -h

這裡寫圖片描述
可以看到,樹莓派是有兩個分割槽,所以boot 【size】+linux【Used】+分割槽損耗【因為格式轉換,所以會損耗5%~10%】=映象實際大小,所以若used使用百分比超過50%那麼就無法在sd中建立此映象。

二、安裝需要的軟體
dosfstools:fat32分割槽格式化工具
dump:dump & restore 備份工具
parted & kpartx:虛擬磁碟工具

sudo apt-get install dosfstools dump parted kpartx

三、生成空白img
根據一里面系統所佔用的空間,生成空白的img。

#df為磁碟佔用空間
sudo dd if=/dev/zero of=raspberrypi.img bs=1K count=$df

這也是錯誤比較多的地方,有人不理解原文中count=2500引數的意義,此引數是用dd命令建立一個大約2.5G的空白映象,若不使用第一步來算出實際映象大小的話,製作出來的映象就會出錯

此處注意
dd命令中【1k=1024b;1KB=1000b;1M=1024kb;1MB=1000kb】

四、分割虛擬磁碟
我們已將空白的img建立完畢,現在需要通過parted將磁碟分為boot與root區
通過sudo fdisk -l /dev/mmcblk0得知
這裡寫圖片描述
第一個分割槽為boot分割槽,採用FAT32格式,由sector 8192開始到sector 12879
第二個分割區採用EXT4,由sector 122880開始到空白img結尾。

sudo parted raspberrypi.img --script -- mklabel msdos
sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122879s
sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1

五、掛載虛擬磁碟並格式化

loopdevice:執行 losetup 連線 img 檔案的 loop device
device:執行完 kpartx 後,虛擬磁碟代號。
partBoot:由 device 加上 p1 組合而成的 FAT32 虛擬磁碟分割槽。
partRoot:由 device 加上 p2 組合而成的 EXT4 虛擬磁碟分割槽。

首先建立虛擬磁碟並分割槽

loopdevice=`sudo losetup -f --show raspberrypi.img`
device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1`
device="/dev/mapper/${device}"
partBoot="${device}p1"
partRoot="${device}p2"

然後格式化虛擬磁碟分割槽

#boot分割槽用fat32進行格式化
sudo mkfs.vfat $partBoot
sudo mkfs.ext4 $partRoot

六、開始備份
boot分割槽為fat32格式,可以直接利用cp命令直接拷貝

sudo mount -t vfat $partBoot /media
sudo cp -rfp /boot/* /media/
sudo umount /media

linux分割槽為ext4格式,需要利用dump & restore備份

#跳過raspberrypi.img不備份
sudo chattr +d raspberrypi.img
sudo mount -t ext4 $partRoot /media/
cd /media
sudo dump -h 0 -0uaf - / | sudo restore -rf -
cd
sudo umount /media

這裡原文中也有一點bug,用dump進行磁碟備份時,會將之前建立的空白img一併備份進去,通過chattr跳過raspberrypi.img

七、備份完畢,解除安裝虛擬磁碟
此時,已將所有資料備份至空白img,此時就可以解除安裝虛擬磁碟,將img拷貝出儲存了。
然後利用Win32DiskImager或者df命令即可將該raspberrypi.img恢復至sd卡上。

sudo kpartx -d $loopdevice
sudo losetup -d $loopdevice

這裡是整理後的指令碼,編輯sudo vi backup.sh,複製以下內容,sudo chmod 777 backup.sh,然後sudo ./backup.sh就可以在當前指令碼目錄中生成樹莓派的SD卡映象了。

指令碼經過以下韌體版本測試:

2015-02-16-raspbian-wheezy

#!/bin/sh
sudo apt-get install -y dosfstools dump parted kpartx
df=`df -P | grep /dev/root | awk '{print $3}'`
df=`echo $df |awk '{print int($1*1.1+57344)}'`
sudo dd if=/dev/zero of=raspberrypi.img bs=1K count=$df
sudo parted raspberrypi.img --script -- mklabel msdos
sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122879s
sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1
loopdevice=`sudo losetup -f --show raspberrypi.img`
device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1`
device="/dev/mapper/${device}"
partBoot="${device}p1"
partRoot="${device}p2"
sudo mkfs.vfat $partBoot
sudo mkfs.ext4 $partRoot
sudo mount -t vfat $partBoot /media
sudo cp -rfp /boot/* /media/
sudo umount /media
sudo chattr +d raspberrypi.img
sudo mount -t ext4 $partRoot /media/
cd /media
sudo dump -h 0 -0uaf - / | sudo restore -rf -
cd
sudo umount /media
sudo kpartx -d $loopdevice
sudo losetup -d $loopdevice

指令碼經過以下韌體版本測試:

2016-05-27-raspbian-jessie

#!/bin/sh
sudo apt-get install -y dosfstools parted kpartx rsync
df=`df -P | grep /dev/root | awk '{print $3}'`
dr=`df -P | grep /dev/mmcblk0p1 | awk '{print $2}'`
df=`echo $df $dr |awk '{print int(($1+$2)*1.2)}'`
sudo dd if=/dev/zero of=raspberrypi.img bs=1K count=$df
sudo parted raspberrypi.img --script -- mklabel msdos
start=`sudo fdisk -l /dev/mmcblk0| awk 'NR==10 {print $2}'`
start=`echo $start's'`
end=`sudo fdisk -l /dev/mmcblk0| awk 'NR==10 {print $3}'`
end2=$[end+1]
end=`echo $end's'`
end2=`echo $end2's'`

sudo parted raspberrypi.img --script -- mkpart primary fat32 $start $end
sudo parted raspberrypi.img --script -- mkpart primary ext4 $end2 -1

loopdevice=`sudo losetup -f --show raspberrypi.img`
device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1`
device="/dev/mapper/${device}"
partBoot="${device}p1"
partRoot="${device}p2"
sudo mkfs.vfat $partBoot
sudo mkfs.ext4 $partRoot
sudo mount -t vfat $partBoot /media
sudo cp -rfp /boot/* /media/
sudo umount /media
sudo mount -t ext4 $partRoot /media/
cd /media
sudo rsync -aP --exclude="raspberrypi.img" --exclude=/media/* --exclude=/sys/* --exclude=/proc/*  --exclude=/tmp/* / ./
cd
sudo umount /media
sudo kpartx -d $loopdevice
sudo losetup -d $loopdevice

相關推薦

製作樹莓映象-img裁剪

修改記錄 2016年7月28日修改指令碼,動態支援樹莓派映象 最近剛做了一套opencv攝像頭監控的程式,想將這套程式做一個映象備份起來,但發現用Win32DiskImager或dd命令來製作映象,都是將sd卡整盤進行備份,造成了巨大的硬碟浪費,

製作樹莓映象img,並在其他新板上使用,實現批量克隆樹莓

1.      將現有的系統製作成映象img 2.      配置網路 1. 將現有的系統製作成映象img 1.1    先將新買的sd卡用SDFormatter工具格式化,以作備用 1.2    將帶有系統的sd卡用Win32DiskImager.exe工具Read成

製作ubuntu16.04docker映象

背景: 最近在建設linux統一開發伺服器,用的是ubuntu16.04系統. 由於開發人員需要使用docker,因此,需要做一個docker image給大家用. 由於國家的網路限制問題,很難從dockerhub中下載到docker映象,因此,委託同事下載了一個u

手動一步一步來製作備份Raspberry Pi樹莓SD卡的img映像檔案(不用dd命令)

之前複製或者備份樹莓派的SD卡,都是用dd命令全盤複製,可以用,但是這樣有兩大缺點: 1. 慢 2. 一個大的SD卡,比如64G,即使只用了2G,經過dd命令生成的img檔案也會生成一個和整個SD卡容量一樣大小的檔案,即64G   於是,需要有一個可以解決上述問題的製作樹莓

樹莓3b上啟動官方樹莓2的映象方法

更改引導載入程式   官方Ubuntu映象使用u-boot作為 bootloader。為樹莓派2構建的u-boot二進位制檔案在樹莓派3b上不起作用,這就是為什麼樹莓派2和樹莓派3b有單獨的映象。但是,Raspberry Pi有自己的內建 bootloader。這可以在對系統啟動分割槽上

用Buildroot製作樹莓64位精簡嵌入式系統

使用Buildroot 2018.08.1 1、make raspberrypi3_64_defconfig 2、make menuconfig toolchain中修改選項,將c library改為glibc,以適應更多的第三方開發 System configura

Android Things 樹莓燒錄映象指南

樹莓派燒錄映象指南 首先硬體方面你要有一個8g以上的sd卡、樹莓派、讀卡器,軟體下載一個.img映象、disk imager。 然後將sd卡放入讀卡器,將sd卡格式化為fat32格式,開啟disk imager軟體,將img映象載入進來,然後如下圖: 點選write

樹莓國內可用映象

1、檢視樹莓派的映象列表http://www.raspbian.org/RaspbianMirrors 2、選擇中國的,選擇浙江大學的http://mirrors.zju.edu.cn/#image-list,選擇raspbian映象源。可以用配置生成器生成配置檔案 de

樹莓 SD卡映象備份

一、準備工作 1、已經配置啟動的樹莓派SD卡 2、Linux系統的pc 3、讀卡器 二、修改SD卡檔案 剛開始我先再win7下把SD卡接到pc上,發現無法讀取。用DISKGENIUS檢視pc的磁碟狀態,發現SD卡被格式化為兩個分割槽,一個56M的Fat32分割槽

PCB製作(微控制器系統為例)

參考連結: 第一步:安裝Altium Designer Summer 09並破解(詳情見軟體安裝) 第二步:建立工程,建立PCB工程,建立原理圖並儲存在同一目錄下 右擊工程名,儲存所有檔案在同一目錄下 第三步:放置元器件,繪製原理圖 開啟右下角system-&g

【.NET 與樹莓風扇模組

小風扇,其實就是一個電機(馬達),然後軸子上套一個扇葉。扇葉有兩葉的,也有三葉的。這種我們小時候沒少玩,太陽能帽子上就有一個小風扇,騎著自行車上學,路上只要有太陽光照射到,小風扇就會轉。當然還有裝乾電池的,天氣熱的時候,買一把放在課桌上,聲音很小,所以老師也不會管。 現在的小風扇在供電方式上多了兩種:一種是U

樹莓映象製作

還沒做好的指令碼: #!/bin/bash #create image echo "Creating Image ..." BOOT_DEV='/dev/sdb1' ROOT_DEV='/dev/sdb2' TIME=`date "+%Y%m%d%H%M%S"` FILE=backup_201812

img檔案掛載成一個檔案系統,修改樹莓映象檔案,寫入映象———後續

昨天寫了一篇文章。但是當時對於這個的理解還不夠,以至於我後面又遇到了一些問題。這裡再重新整理一下,供大家參考。 我先重述一下我要做的事情。 我電腦系統是windows,裡面安裝了一個Ubuntu虛擬機器。我從官網上下載了一個樹莓派img映象。但是因為工作的需要,我得修改這個i

把一個img檔案掛載成一個檔案系統,修改樹莓映象檔案

這裡不僅僅是針對樹莓派,還有其他的系統也可以使用。 前言: 因為工作需要,現在需要對樹莓派的映象做一個修改。 這裡有一個難點就是我這個映象修改之後,是可以拷貝給其他人直接使用的。所以,第一步我不能直接把映象直接拷貝到u盤/cf卡之類的儲存空間上。因為一旦啟動,系統本身會做一些分割槽,

樹莓安裝系統和製作映象

安裝raspbian 官網下載映象,dd到sd卡,dd完後掛載sd卡,修改/etc/network/interfaces設定無線網和靜態ip使樹莓派開機能自動連上自己的wifi,方便ssh。 iface wlan0 inet static addr

樹莓映象裁剪

樹莓派裁製作映象 檢視使用的記憶體大小 df -h 安裝必須的軟體 sudo apt-get install dosfstools dump parte

建立的Go docker 映象

雖然曾有一些文章介紹瞭如何建立一個最小的Go Docker映象,我也曾寫過一篇文章,但是隨著Go的新的版本的釋出, 以及docker本身的進化,有些技巧已經發生了變化, 本文介紹了最新的建立超小的Go映象的方法。 一個簡單Go程式的映象 首先讓我們建立一個很簡單的Go程式: 1package

樹莓 python3 安裝 opencv 容易的方法(非編譯方式)

所需環境 通過pip3安裝的。 sudo pip3 install opencv-python imutils numpy scipy pillow 通過系統自帶環境apt-get安裝的。 sudo apt-get install libatlas-base-dev li

動手寫一個的作業系統(vmvare+img版)

文中提到要用軟盤,天哪嚕,這個年代我在哪去找軟盤。本來準備用u盤替代,但是搜了一下,說是很複雜。於是找到了以下替代方法: 在win10系統上,使用vmvare,從映象檔案啟動。   操作步驟如下: 1. 將書中的編譯程式碼儲存成檔案boot.asm org 07c00

樹莓Python3 簡單方式安裝OpenCv3.4.0

因為最近在開發使用樹莓派+usb攝像頭識別模組,打算用OpenCv,發現網上的樹莓派OpenCv安裝教程都過於繁瑣佔用記憶體大,我經過自己的實驗,發現出了一種非常簡易快捷的方式,網速OK的話,十分鐘能安裝完成。 我用的環境: 樹莓派3b+ Python3.5.4