noobs安装debian系统的优点是简单,容易上手,但也发现了一个缺点,分区有点复杂,系统镜像备份是个问题。直接采用dd备份,因为是全卡数据备份,所以极其费时,例如,昨天用gz压缩镜像还原TF卡(16G),用了4710秒。事实上,实际系统不需要那么多数据,时间应该可以更短,因为解压拷贝noobs,安装系统也不需要那么久。
因此,我们尝试了解清楚noobs安装的系统的分区情况,采用按分区备份的方法,以下以16G TF卡SanDisk Ultra 60410RAV2244为例分析:
用winhex打开TF卡(RM1:Generic-SD/MMC 14.8GB, USB )
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TF卡0扇区:
FA B8 ....(可能引导代码)
................... 按MBR模板解读:3个分区项,第1个分区类型0E(FAT16),之前8192扇区,共1677355扇区,第2个分区类型85(Linux Extended),之前1687552扇区,共29363200扇区,第3个分区类型83(Linux),之前31050752扇区,共65536扇区
...............55 AA
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TF卡8192扇区(8198扇区为备份):
EB 00 90 4D 53 ..............(可见 MSWIN4.1、RECOVERY、FAT32等字样)
..............................................55 AA
尽管分区表分区类型标记为FAT16,但该分区实际文件系统应该是FAT32,用Boot Sector FAT32(BPB)模板解读:每扇区512字节,每磁道63扇区,磁头数255,每簇16扇区,保留扇区数90个,FAT表2个,隐藏扇区数8192,扇区总数1677355,每个FAT表819扇区,根目录第1簇簇号2,卷标RECOVERY,文件系统FAT32
这个分区在windows下可以被直接识别,共800+M,剩余空间很少,包含的目录有defaults、os,文件有bootcode.bin、BUILD-DATA、INSTRUCTIONS-README.txt、recovery7.img、recovery.cmdline、recovery.elf、RECOVERY_FILES_DO_NOT_EDIT、recovery.img、recovery.rfs、riscos-boot.bin
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TF卡1687552扇区:
00 00 ................
........................ 按MBR模板解读(因为这应该是Linux扩展分区起始):2个分区项,第1个分区类型0C(win95 FAT32),之前8192扇区,共122880扇区,第2个分区类型0F(win95 Extended),之前131072扇区,共29224960扇区
.....................55 AA
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
定位到TF卡1687552+8192=1695744扇区:
EB 3C 90 ...(可见mkfs.fat、boot、FAT16等字样)
............................................55 AA
尽管扩展分区表标记为FAT32,但该分区实际文件系统应该是FAT16,用Boot Sector FAT模板解读:每扇区512字节,每磁道16扇区,磁头数4,每簇4扇区,保留扇区1个,FAT表2个,每个FAT表120扇区,隐藏扇区数1695744,扇区总数122880,根入口数512,卷标boot,文件系统FAT16
这个分区在windows下不能被识别,因为它是Linux扩展分区中的逻辑盘,这个分区只有60M,应该只起引导和启动系统内核的作用。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
定位到TF卡1687552+131072=1818624扇区:
00 00 ...............................
..................................按MBR模板解读(因为这是Linux扩展内的win95扩展分区起始):1个分区项,第1个分区类型83(Linux),之前8192扇区,共29222912扇区
...............................................55 AA
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
定位到TF卡1818624+8192=1826816扇区,前2个扇区为空扇区,后面是超级块开始,所以这是root分区,容量13+G,放了绝大部分数据
定位到TF卡31050752扇区,同样前2个扇区为空扇区,后面是超级块开始,所以这是SETTINGS分区,容量32M,似乎只是文件系统日志记录和坏块列表
整个分区情况图示如下:
如果不使用noobs,直接使用img镜像,我们分析该镜像的分区特点:(以下以2016-05-27-raspbian-jessie-lite.img为例)
为img镜像创建loop设备:sudo losetup --find --show 2016-05-27-raspbian-jessie-lite.img,我们生成了/dev/loop1(如果之前没有创建过其它loop device,应该是/dev/loop0)
查看分区情况:sudo fdisk -l,我们看到
Disk /dev/loop1: 1.3 GiB, 1387266048 bytes, 2709504 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6fcf21f3
Device Boot Start End Sectors Size Id Type
/dev/loop1p1 8192 137215 129024 63M c W95 FAT32 (LBA)
/dev/loop1p2 137216 2709503 2572288 1.2G 83 Linux
我们可以发现,镜像内就2个分区:8192扇区~137215扇区为FAT32类型的分区,137216扇区~2709503扇区为Linux类型的分区(应该是Ext4)
经过测试,发现2016-05-27-raspbian-jessie.img镜像和lite版的分区情况是一样的,并且使用如下方法把16G上的系统还原到8G上:
1、刷写系统dd if=.....img of=/dev/sdb bs=4M 到16G卡上
注意参考:https://www.raspberrypi.org/documentation/installation/installing-images/linux.md
要点: df -h 查看sd卡挂载情况(我的是/media/x201/.....)和所属块设备(我的是/dev/sdb),用命令umount 或者 文件管理器中将已挂载的sd卡的分区卸载,同时确保sudo fdisk -l 能看到分区情况(如果之前有镜像,是/dev/sdb1 和 /dev/sdb2),然后用 sudo dd bs=4M if=....img of=/dev/sdb 将镜像写入sd卡(USB2.0需要耗费600s左右),sudo sync 确保将可能缓存的数据写入 ,之后就可以试验该镜像是否可以使用了
2、保存开始的8192个扇区 dd if=/dev/sdb of=sector8192.bin bs=512 count=8192
3、sudo cp -rfp /media/x201/boot/(对应boot分区) ./boot/
4、sudo apt-get install dump (默认deepin没有dump,装了dump,包含了restore)
sudo dump -0uaf rootpart.bak /media/x201/对应root分区
5、插上8G TF卡, sudo dd if=sector8192.bin of=/dev/sdb bs=512 count=8192 ,但这样分区表是错误的,因为卡大小不一样
6、用gparted打开,发现出错,忽略错误(后面也一样忽略错误),很可能因为分区表信息错误,我们删除root分区(boot分区没有问题,root分区会放不下数据),重新建立ext4分区并格式化,格式化可以用
sudo mkfs.vfat -n BOOT /dev/sdb1
sudo mkfs.ext4 -L root /dev/sdb2
也可以直接在gparted软件中进行
7、sudo cp -rfp ./bootpart/* /media/x201/boot对应分区
8、cd 到 /media/x201/root对应分区
sudo restore -rf ~/下载/rootpart.bak
实际上机加电试验,会出现错误
9、参考资料,插回卡修复root分区文件系统 sudo fsck.ext4 -v /dev/sdb2,仍提示有错??
但加电试验后已经可以启动系统了