手動(dòng)一步一步來制作備份Raspberry Pi樹莓派SD卡的img映像文件(不用dd命令)

之前復(fù)制或者備份樹莓派的SD卡蜂厅,都是用dd命令全盤復(fù)制采记,可以用胖烛,但是這樣有兩大缺點(diǎn):

  1. 一個(gè)大的SD卡眼姐,比如64G,即使只用了2G佩番,經(jīng)過dd命令生成的img文件也會(huì)生成一個(gè)和整個(gè)SD卡容量一樣大小的文件众旗,即64G

于是,需要有一個(gè)可以解決上述問題的制作樹莓派SD卡img映像文件的方法趟畏。

在網(wǎng)上搜索了一些贡歧,做了些研究,發(fā)現(xiàn)還是有辦法的赋秀。 如下列網(wǎng)址所述:(感謝作者)
http://www.cnblogs.com/haochuang/p/6066532.html

但是里面的腳本我用起來有問題利朵,也懶得研究為什么有問題,于是參照腳本里的方法沃琅,手動(dòng)一步一步命令來哗咆。

【準(zhǔn)備】
準(zhǔn)備一個(gè)樹莓派Raspberry Pi和另外的Raspbian系統(tǒng),并啟動(dòng)益眉,用來作為備份操作的環(huán)境晌柬。要保證這個(gè)系統(tǒng)所在的SD卡的空間夠大(我用了64G的卡,雖然沒有必要這么大)郭脂,足夠用來保存img備份文件年碘。

用PC上的其他Linux系統(tǒng)也可以,比如Debian 9.3展鸡。 而且用PC會(huì)快一些屿衅。

準(zhǔn)備好要備份的SD卡,和USB讀卡器莹弊。
將插好源SD卡的讀卡器插入樹莓派(或PC)涤久。

首先安裝必需的工具軟件:

pi@raspberrypi:~ $ sudo apt-get install dosfstools dump parted kpartx

建立工作目錄

pi@raspberrypi:~ $ mkdir ~/backupimg
pi@raspberrypi:~ $ cd ~/backupimg
pi@raspberrypi:~/backupimg $ 

【生成空白img文件】
插入裝有源SD卡的讀卡器到USB口后涡尘,確定源SD卡對應(yīng)的設(shè)備名

pi@raspberrypi:~/backupimg $ ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2

如上所示 /dev/sda 為源SD卡, /dev/sda1 為 /boot响迂, /dev/sda2 為 / (根)考抄。

不同的系統(tǒng)會(huì)有所不同,可能會(huì)是sdb… 或其他蔗彤,例如:

yang@debian:~/backupimg$ ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda5  /dev/sdb  /dev/sdb1  /dev/sdb2

掛載源SD卡

pi@raspberrypi:~/backupimg $ mkdir src_boot src_Root
pi@raspberrypi:~/backupimg $ sudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/sda1 ./src_boot/
pi@raspberrypi:~/backupimg $ sudo mount -t ext4 /dev/sda2 ./src_Root/

請注意川梅,我用的是另一個(gè)raspberry系統(tǒng)做備份操作的,如果是用其他linux系統(tǒng)然遏,例如PC上的Debian贫途,請注意uid和gid的設(shè)置,上述第2待侵,3條命令可能會(huì)是:

yang@debian:~/backupimg$ sudo mount -t vfat -o uid=yang,gid=yang,umask=0000 /dev/sdb1 ./src_boot/
yang@debian:~/backupimg$ sudo mount -t ext4 /dev/sdb2 ./src_Root/

查看源SD卡已用空間大小

pi@raspberrypi:~/backupimg $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        59G  6.1G   51G  11% /
devtmpfs        460M     0  460M   0% /dev
tmpfs           464M     0  464M   0% /dev/shm
tmpfs           464M   13M  452M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           464M     0  464M   0% /sys/fs/cgroup
/dev/mmcblk0p1   42M   21M   21M  51% /boot
tmpfs            93M     0   93M   0% /run/user/1000
/dev/sda1        56M   21M   36M  37% /home/pi/backupimg/src_boot
/dev/sda2        15G  4.0G  9.9G  29% /home/pi/backupimg/src_Root

如上可以看出/dev/sda已用空間大約4G

建立一個(gè)空白的img文件丢早,因?yàn)樵碨D卡已用空間大約4G,那么建立一個(gè)4600M的空白img文件應(yīng)該夠了诫给。(安全起見香拉,設(shè)定5000會(huì)更好)

pi@raspberrypi:~/backupimg $ sudo dd if=/dev/zero of=raspberrypi.img bs=1M count=4600
4600+0 records in
4600+0 records out
4823449600 bytes (4.8 GB, 4.5 GiB) copied, 283.248 s, 17.0 MB/s

特別注意這里 bs=1M,千萬不要寫成1MB
1M是1024x1024 Bytes中狂, 而1MB是1000x1000 Bytes凫碌,會(huì)造成img文件的大小不是512 bytes的整數(shù)倍,后面會(huì)報(bào)錯(cuò)胃榕。

這個(gè)過程大約幾分鐘完成盛险。 如果比較著急,可以另開一個(gè)終端勋又,運(yùn)行如下命令苦掘,可以觀察到img文件大小的變化。

pi@raspberrypi:~ $ watch -d -n 5 ls -lh ~/backupimg

完成后楔壤,確認(rèn)一下img文件已經(jīng)生成鹤啡,且文件大小正確

pi@raspberrypi:~/backupimg $ ls -l raspberrypi.img
-rw-r--r-- 1 root root 4823449600 Dec 15 22:00 raspberrypi.img

然后給img文件分區(qū)

pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img --script -- mklabel msdos
pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122479s
pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1

分區(qū)的起始扇區(qū)數(shù)都是 8192 的倍數(shù)【20180716更新】,以保證4k對齊

檢查分區(qū)是否成功

pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img
GNU Parted 3.2
Using /home/pi/backupimg/raspberrypi.img
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print free                                                       
Model:  (file)
Disk /home/pi/backupimg/raspberrypi.img: 4823MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
        16.4kB  4194kB  4178kB           Free Space
 1      4194kB  62.7MB  58.5MB  primary               lba
        62.7MB  62.9MB  205kB            Free Space
 2      62.9MB  4822MB  4759MB  primary
        4822MB  4823MB  1049kB           Free Space

(parted) quit     

在parted程序中蹲嚣,輸入print free命令可以顯示分區(qū)內(nèi)容递瑰,輸入quit退出

【掛載img文件到系統(tǒng)】
img文件對應(yīng)的Loop device的設(shè)置

pi@raspberrypi:~/backupimg $ sudo losetup -f --show raspberrypi.img
/dev/loop0

下面的命令中相應(yīng)輸入/dev/loop0,如果不是 loop0 請做相應(yīng)調(diào)整(以及以后的各個(gè)步驟里的loop0都要改變)

pi@raspberrypi:~/backupimg $ sudo kpartx -va /dev/loop0
add map loop0p1 (254:0): 0 114288 linear 7:0 8192
add map loop0p2 (254:1): 0 9295872 linear 7:0 122880

pi@raspberrypi:~/backupimg $ ls /dev/mapper/loop0p*
/dev/mapper/loop0p1  /dev/mapper/loop0p2

此時(shí)loop device就設(shè)置好了隙畜,loop0p1對應(yīng)的是img文件分區(qū)上的 /boot邓嘹,loop0p2對應(yīng)的是 /(根)

接著給img文件中的兩個(gè)分區(qū)格式化

pi@raspberrypi:~/backupimg $ sudo mkfs.vfat -n boot /dev/mapper/loop0p1
mkfs.fat 4.1 (2017-01-24)
mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows
pi@raspberrypi:~/backupimg $ sudo mkfs.ext4 /dev/mapper/loop0p2
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done                            
Creating filesystem with 1161984 4k blocks and 290880 inodes
Filesystem UUID: d3e5d272-7752-48b2-a10e-e0e6d217ca7e
Superblock backups stored on blocks: 
32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 

掛載目標(biāo)img文件loop device

pi@raspberrypi:~/backupimg $ mkdir tgt_boot tgt_Root
pi@raspberrypi:~/backupimg $ sudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/mapper/loop0p1 ./tgt_boot/
pi@raspberrypi:~/backupimg $ sudo mount -t ext4 /dev/mapper/loop0p2 ./tgt_Root/

請注意镜盯,我用的是另一個(gè)raspberry系統(tǒng)做備份操作的,如果是用其他linux系統(tǒng)愧口,請注意uid和gid的設(shè)置铸史,上述第2,3條命令可能會(huì)是:

yang@debian:~/backupimg$ sudo mount -t vfat -o uid=yang,gid=yang,umask=0000 /dev/mapper/loop0p1 ./tgt_boot/
yang@debian:~/backupimg$ sudo mount -t ext4 /dev/mapper/loop0p2 ./tgt_Root/

【備份/boot】
首先備份/boot,直接拷貝即可

pi@raspberrypi:~/backupimg $ sudo cp -rfp ./src_boot/* ./tgt_boot/

【備份“/”】
備份根文件系統(tǒng)稍微復(fù)雜些,可以用兩種方法

(方法一)傲宜,dump/restore方法

首先對目標(biāo)掛載點(diǎn)設(shè)置合適的權(quán)限,并清空

pi@raspberrypi:~/backupimg $ sudo chmod 777 tgt_Root
pi@raspberrypi:~/backupimg $ sudo chown pi.pi tgt_Root
pi@raspberrypi:~/backupimg $ sudo rm -rf ./tgt_Root/*
pi@raspberrypi:~/backupimg $ cd tgt_Root/

請注意讯屈,我用的是另一個(gè)raspberry系統(tǒng)做備份操作的蛋哭,如果是用其他linux系統(tǒng)县习,請注意uid和gid的設(shè)置涮母,上述第2條命令可能會(huì)是:

yang@debian:~/backupimg$ sudo chown yang.yang tgt_Root

然后開始備份

pi@raspberrypi:~/backupimg/tgt_Root $ sudo dump -0uaf - ../src_Root/ | sudo restore -rf -
  DUMP: Date of this level 0 dump: Fri Dec 15 22:22:34 2017
  DUMP: Dumping /dev/sda2 (/home/pi/backupimg/src_Root) to standard output
  DUMP: Label: none
  DUMP: Writing 10 Kilobyte records
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 4241064 blocks.
  DUMP: Volume 1 started with block 1 at: Fri Dec 15 22:22:35 2017
  DUMP: dumping (Pass III) [directories]
  DUMP: dumping (Pass IV) [regular files]
  DUMP: 62.53% done at 8780 kB/s, finished in 0:03
  DUMP: Volume 1 completed at: Fri Dec 15 22:30:36 2017
  DUMP: Volume 1 4242680 blocks (4143.24MB)
  DUMP: Volume 1 took 0:08:01
  DUMP: Volume 1 transfer rate: 8820 kB/s
  DUMP: 4242680 blocks (4143.24MB)
  DUMP: finished in 481 seconds, throughput 8820 kBytes/sec
  DUMP: Date of this level 0 dump: Fri Dec 15 22:22:34 2017
  DUMP: Date this dump completed:  Fri Dec 15 22:30:36 2017
  DUMP: Average transfer rate: 8820 kB/s
  DUMP: DUMP IS DONE

整個(gè)dump/restore過程需要幾分鐘時(shí)間,看到 DUMP IS DONE 就說明備份成功了

然后返回上層目錄

pi@raspberrypi:~/backupimg/tgt_Root $ cd ..
pi@raspberrypi:~/backupimg $ 

(方法二)躁愿,tar方法
如果上述方法一的 sudo dump … 那一步出現(xiàn) Broken pipe叛本、 Illegal instruction等錯(cuò)誤而失敗的話,可以使用方法二彤钟。
這個(gè)方法會(huì)使用tar把源SD卡的根文件系統(tǒng)打包来候,所以在本機(jī)系統(tǒng)空間里需要額外的和源SD卡的根文件系統(tǒng)已用空間大小一樣的可用空間。

首先逸雹,和方法一里面一樣营搅,對目標(biāo)掛載點(diǎn)設(shè)置合適的權(quán)限,并清空

pi@raspberrypi:~/backupimg $ sudo chmod 777 tgt_Root
pi@raspberrypi:~/backupimg $ sudo chown pi.pi tgt_Root
pi@raspberrypi:~/backupimg $ sudo rm -rf ./tgt_Root/*

請注意梆砸,我用的是另一個(gè)raspberry系統(tǒng)做備份操作的转质,如果是用其他linux系統(tǒng),請注意uid和gid的設(shè)置帖世,上述第2條命令可能會(huì)是:

yang@debian:~/backupimg$ sudo chown yang.yang tgt_Root

然后用tar把源SD卡的根文件系統(tǒng)打包

pi@raspberrypi:~/backupimg $ cd src_Root/
pi@raspberrypi:~/backupimg/src_Root $ sudo tar pcf ../backup.tar .

tar的過程中可能會(huì)出現(xiàn)一些 socket ignored 錯(cuò)誤休蟹,可以忽略。

此過程可能需要比較長的時(shí)間日矫,可另外開一個(gè)終端赂弓,運(yùn)行如下命令,用來觀察backup.tar文件大小的變化哪轿。

pi@raspberrypi:~ $ watch -d -n 5 ls -lh ~/backupimg

上述打包過程結(jié)束后盈魁,接著將tar包解開到目標(biāo)img文件的根文件系統(tǒng)

pi@raspberrypi:~/backupimg $ cd ../tgt_Root/
pi@raspberrypi:~/backupimg/tgt_Root $ sudo tar pxf ../backup.tar

此過程可能需要比較長的時(shí)間,可另外開一個(gè)終端窃诉,運(yùn)行如下命令杨耙,用來觀察目標(biāo)img文件的根文件系統(tǒng)的已用空間大小變化

pi@raspberrypi:~ $ watch -d -n 5 df -h

解包過程結(jié)束后,回到上層目錄褐奴,并刪除backup.tar文件

pi@raspberrypi:~/backupimg/tgt_Root $ cd ..
pi@raspberrypi:~/backupimg $ sudo rm backup.tar 
pi@raspberrypi:~/backupimg $ 

【相應(yīng)修改PARTUUID設(shè)定】
這時(shí)候整個(gè)備份就已經(jīng)完成了按脚。不過此時(shí)的img文件即使寫入到空白SD卡里面也是無法啟動(dòng)的,因?yàn)镽aspbian啟動(dòng)要對應(yīng)分區(qū)的PARTUUID敦冬,所以我們還要修改目標(biāo)img文件里的如下兩個(gè)文件:

./tgt_boot/cmdline.txt 
./tgt_Root/etc/fstab 

首先查看img文件對應(yīng)的loop device的兩個(gè)分區(qū)的PARTUUID

pi@raspberrypi:~/backupimg $ sudo blkid
/dev/mmcblk0p1: LABEL="boot" UUID="E5B7-FEA1" TYPE="vfat" PARTUUID="ddffe93a-01"
/dev/mmcblk0p2: UUID="b4ea8e46-fe87-4ddd-9e94-506c37005ac5" TYPE="ext4" PARTUUID="ddffe93a-02"
/dev/sda2: UUID="9a7608bd-5bff-4dfc-ac1d-63a956744162" TYPE="ext4" PARTUUID="ec04fe79-02"
/dev/loop0: PTUUID="af2f8761" PTTYPE="dos"
/dev/mmcblk0: PTUUID="ddffe93a" PTTYPE="dos"
/dev/sda1: LABEL="boot" UUID="B60A-B262" TYPE="vfat" PARTUUID="ec04fe79-01"
/dev/mapper/loop0p1: SEC_TYPE="msdos" LABEL="boot" UUID="755C-C29C" TYPE="vfat" PARTUUID="af2f8761-01"
/dev/mapper/loop0p2: UUID="a174c97e-049f-4fbd-abb7-0b9098dae24a" TYPE="ext4" PARTUUID="af2f8761-02"

這里可以看到/boot對應(yīng)的是af2f8761-01 辅搬, / 對應(yīng)的是af2f8761-02

修改 cmdline.txt 文件

pi@raspberrypi:~/backupimg $ sudo vi ./tgt_boot/cmdline.txt 
pi@raspberrypi:~/backupimg $ cat ./tgt_boot/cmdline.txt 
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=af2f8761-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

修改 fstab 文件

pi@raspberrypi:~/backupimg $ sudo vi ./tgt_Root/etc/fstab 
pi@raspberrypi:~/backupimg $ cat ./tgt_Root/etc/fstab 
proc            /proc           proc    defaults          0       0
PARTUUID=af2f8761-01  /boot           vfat    defaults          0       2
PARTUUID=af2f8761-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

卸載各個(gè)掛載的分區(qū)

pi@raspberrypi:~/backupimg $ sudo umount src_boot src_Root tgt_boot tgt_Root

刪除loop device

pi@raspberrypi:~/backupimg $ sudo kpartx -d /dev/loop0
pi@raspberrypi:~/backupimg $ sudo losetup -d /dev/loop0

刪除掛載點(diǎn)目錄

pi@raspberrypi:~/backupimg $ rmdir src_boot src_Root tgt_boot tgt_Root

最后剩下img文件

pi@raspberrypi:~/backupimg $ ls -l
total 4469676
-rw-r--r-- 1 root root 4823449600 Dec 15 23:10 raspberrypi.img

【大功告成】
完成之后可以用dd或者Etcher燒寫img文件到其他SD卡中,注意燒寫到新卡中在樹莓派中運(yùn)行后,要先用raspi-config先把分區(qū)空間expand一下堪遂,否則可用空間會(huì)很小介蛉。

雖然步驟比較多,但是赤手空拳的一步一步命令來的更清晰明了溶褪,也能了解其中的技術(shù)細(xì)節(jié)币旧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市猿妈,隨后出現(xiàn)的幾起案子吹菱,更是在濱河造成了極大的恐慌,老刑警劉巖彭则,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳍刷,死亡現(xiàn)場離奇詭異,居然都是意外死亡俯抖,警方通過查閱死者的電腦和手機(jī)输瓜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芬萍,“玉大人尤揣,你說我怎么就攤上這事〖盱簦” “怎么了北戏?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓶盛。 經(jīng)常有香客問我最欠,道長,這世上最難降的妖魔是什么惩猫? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任芝硬,我火速辦了婚禮,結(jié)果婚禮上轧房,老公的妹妹穿的比我還像新娘拌阴。我一直安慰自己奶镶,他們只是感情好迟赃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厂镇,像睡著了一般捺信。 火紅的嫁衣襯著肌膚如雪喇辽。 梳的紋絲不亂的頭發(fā)上菩咨,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音缨硝,去河邊找鬼网持。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辟汰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼翩蘸,長吁一口氣:“原來是場噩夢啊……” “哼泄鹏!你這毒婦竟也來了舶治?” 一聲冷哼從身側(cè)響起歼疮,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤杭朱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后刃唐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體画饥,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衔彻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悴晰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖纬纪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情靶庙,我是刑警寧澤护姆,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布灯变,位于F島的核電站篓跛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鲤遥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绘趋。 院中可真熱鬧垦江,春花似錦疫粥、人聲如沸娄蔼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焰望。三九已至的妖,卻和暖如春星虹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赖歌,地道東北人肄扎。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓弃榨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子万搔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容