linux MMC framework(6) - 分区MBR/GPT及Debug

  • 了解分区

1.概述

  分区信息被存放在分区表中。目前有两种主流的模式:传统的 Master Boot Record 和新的 GUID Partition Table。后者功能更强大,解决了许多MBR的限制。

1.1.MBR

  主引导记录(Master Boot Record),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。

  主引导扇区则是整个硬盘的第一扇区(主分区的第一个扇区)。MBR就保存在主引导扇区中。另外,这个扇区里还包含了硬盘分区表DPT(Disk Partition Table),和结束标志字(Magic number)。扇区总计512字节,MBR占446字节(0000H - 01BDH),DPT占据64个字节(01BEH - 01FDH),最后的magic number占2字节(01FEH – 01FFH)。
在这里插入图片描述

  MBR是由分区程序(如Fdisk,Parted)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而能够实现多系统引导。

  从主引导记录的结构可以知道,它仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘(其磁盘卷标类型为MS-DOS),最多只能识别4个主要分区。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。

  扩展分区也是主分区(Primary partition)的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区,每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR)。在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。

  在Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等)。在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。

  在MBR分区表中,一个分区最大的容量为2T,且每个分区的起始柱面必须在这个disk的前2T内。你有一个3T的硬盘,根据要求你至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬盘的前2T空间内。如果硬盘太大则必须改用GPT。

1.1.1.MBR分区方案特点:

  • 最多支持四个主分区
  • 在Linux上使用扩展分区和逻辑分区最多可以创建15个分区
  • 由于分区中的数据以32位存储,使用MBR分区是最大支持2T空间
  • fdisk管理工具只能创建MBR分区

1.2.GPT

  GPT分区:全称为Globally Unique Identifier Partition Table,也叫做GUID分区表,它是UEFI 规范的一部分。由于硬盘容量的急速增长,MBR的2.2T容量难以满足要求,而UEFI BIOS的推广也为GPT的实现打下了坚实的技术基础,GPT应运而生。

  全局唯一标识分区表(GUID Partition Table)是一个实体硬盘的分区结构。它是EFI(可扩展固件接口标准)的一部分,用来替代BIOS中的主引导记录分区表。但因为MBR分区表不支持容量大于2.2TB(2.2 × 1012字节)的分区,所以也有一些BIOS系统为了支持大容量硬盘而用GPT分区表取代MBR分区表。

  在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。

  在与支持最大卷为2 TB(Terabytes)并且每个磁盘最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱动器)的MBR磁盘分区的样式相比,GPT磁盘分区样式支持最大卷为18 EB(Exabytes)(1EB=1048576TB)并且每磁盘的分区数没有上限,只受到操作系统限制(由于分区表本身需要占用一定空间,最初规划硬盘分区时,留给分区表的空间决定了最多可以有多少个分区,IA-64版Windows限制最多有128个分区,这也是EFI标准规定的分区表的最小尺寸)。与MBR分区的磁盘不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区。另外,GPT分区磁盘有备份分区表来提高分区数据结构的完整性。

  在其中转换为GPT的时候可以创建两个隐藏分区,ESP和MSR。ESP是efi系统分区用于保存引导文件,MSR是微软的保留分区,用于安装操作系统。
在这里插入图片描述

  • PMBR:当不支持GPT的分区工具试图对硬盘进行操作时(例如MS-DOS和Linux的fdisk程序),它可以根据这份PMBR以传统方式启动,过程和MBR+BIOS完全一致,极大地提高了兼容性。而支持GPT的系统在检测PMBR后会直接跳到GPT表头读取分区表。和MBR类似,分区表中存储了某个分区的起始和结束位置及其文件系统属性信息,而分区才是实际存在的物理磁盘的一部分。

  • GPT HDR:GPT表头,主要定义了分区表中项目数及每项大小,还包含硬盘的容量信息。在64位的Windows Server 2003的机器上,最多可以创建128个分区,即分区表中保留了128个项,其中每个都是128字节。(也是EFI标准中的最低要求:分区表最小要有16,384字节)分区表头还记录了这块硬盘的GUID,分区表头位置(总是LBA1)和大小,也包含了备份分区表头和分区表的位置和大小信息(LBA-1~LBA-34)。同时还储存着它本身和分区表的CRC32校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错,可以使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT也校验错误,硬盘将不可使用。具体内容如下表:
    在这里插入图片描述

  • Partition Table:分区表,包含分区的类型GUID(如:EFI系统分区的GUID类型是{C12A7328-F81F-11D2-BA4B-00A0C93EC93B}),名称,起始终止位置,该分区的GUID以及分区属性。其内容如下:
    在这里插入图片描述

1.2.1.GPT分区方案特点

  • 是UEFI标准的一部分,主板必须要支持UEFI标准
  • GPT分区列表支持最大128PB(1PB=1024TB)
  • 可以定义128个分区
  • 没有主分区,扩展分区和逻辑分区的概念,所有分区都能格式化
  • gdisk管理工具可以创建GPT分区

1.3.两种硬盘分区模式分别对应的BIOS启动方式:

  • 硬盘分区格式为MBR格式,启动模式为Legacy;
  • 硬盘分区格式为GUID(GPT)格式,启动模式为UEFI。

2.fdisk tool [使用参考]

  It does not understand GPTs (GUID partition tables) and it is not designed for large partitions. In these cases, use the more advanced GNU parted.

fdisk命令参数介绍
p、打印分区表。
n、新建一个新分区。
d、删除一个分区。
q、退出不保存。
w、把分区写进分区表,保存并退出。

3.挂载分区

   /etc/fstab 文件负责配置Linux开机时自动挂载的分区。系统启动时会自动从其中读取信息,并将此文件中指定的文件系统挂载到指定的目录。格式如下:
在这里插入图片描述
  <file system> <dir> <type> <options> <dump> <pass>,字段通过空格或 Tab 分隔。

  • <file systems>:要挂载的分区或存储设备

  • <dir>:<file systems>的挂载位置。

  • <type>:要挂载的设备或分区的文件系统类型 (ext2 / ext3 / ext4 / reiserfs / xfs / jfs / smbfs / iso9660 / vfat / ntfs / swap / auto)。如果是auto,mount 命令会猜测使用的文件系统类型,对 CDROM 和 DVD 等移动设备是非常有用的。

  • <options>:挂载所带参数。有些mount参数专属于特定的文件系统:

auto:在启动时或键入了 mount,-a 命令时自动挂载。
noauto:只在你的命令下被挂载。
exec:允许执行此分区的二进制文件。
noexec:不允许执行此文件系统上的二进制文件。
ro/rw:以(只读/读写)模式挂载文件系统。
umask:设置目录和文件的权限过滤。
 fmask/dmask:设置(文件/目录)的权限过滤。它们是mount的选项,针对fat/ntfs文件系统,适用于fstab配置(linux的/etc/fstab 文件,Android中没有)。其值为掩码,即二进制屏蔽。想得到权限5,必须设置掩码为2(7&(!(1<<1)))。
user:允许任意用户挂载此文件系统。若无显示定义,隐含启用 noexec, nosuid, nodev 参数。
users:允许所有 users 组中的用户挂载文件系统.
nouser:只能被 root 挂载。
owner:允许设备所有者挂载.
sync/async:I/O (同步/异步)进行。
dev/nodev:(解析/ 不解析)文件系统上的块特殊设备。
suid/nosuid:(允许/禁止) suid 操作和设定 sgid 位。使一般用户运行程序时临时提升权限。
noatime:不更新文件系统上文件的inode 访问记录,可以提升性能(参见 atime 参数)。
nodiratime:不更新文件系统上目录的inode 访问记录,可以提升性能(参见 atime 参数)。
relatime:实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见 atime 参数)。
flush:vfat 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。
defaults:使用文件系统的默认挂载参数,例如 ext4 的默认参数为:rw, suid, dev, exec, auto, nouser, async.
  • <dump>:dump 工具通过它决定何时作备份。dump 会检查其内容,用数字决定是否对这个文件系统备份。0 忽略, 1 则备份。大部分用户没有安装 dump , 应设为 0。
  • <pass>:fsck 通过 的值决定需要检查的文件系统的检查顺序。0 表示设备不会被 fsck 检查。 根目录应当获得最高的优先权 1。其它所有需要被检查的设备设置为 2。

3.1.mount [设备名称] [挂载目录]

  • 创建目录:mkdir /home/newdisk
  • 临时挂载:mount /dev/sdb1 /newdisk

Note:永久挂载 /etc/fstab

4.分区测试

dd if=<Input File> of=<Output File> bs=<Bytes> count=<Count>

参数注释:

  • if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
  • of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
  • ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
  • obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
  • bs=bytes:同时设置读入/输出的块大小为bytes个字节。
  • cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
  • skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
  • seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
    • 注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
  • count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
  • conv=conversion:用指定的参数转换文件。

注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512;c=1;k=1024;w=2

4.1.Example

4.1.1.dd if=/dev/zero of=/tmp/1G.txt bs=1K count=1024000

  • 输入源为 /dev/zero,每次写入1K个字节,执行1024000次,相当于写了1G的内容到 /tmp/1G.txt.

4.1.2.dd if=/dev/fd0 of=disk.img count=1 bs=1440k (即块大小为1.44M)

4.1.3.创建硬盘的映像

  为硬盘创建一个图像文件并将其保存在其他存储设备。这种备份方式有很多好处:一是易于使用,二是这种备份方法的速度快于其他方法的备份,也能让你更快速的恢复数据。

创建一个硬盘/dev/sda的image命令:

[root@linuxprobe ~]# dd if=/dev/sda of=~/sdadisk.img

恢复硬盘映像文件恢复数据:

[root@linuxprobe ~]# dd if=sdadisk.img of=/dev/sdb
sdadisk.img文件是/dev/sda的映像,将恢复/dev/sda的映像到/dev/sdb

5.Debug

5.1.加载驱动成功后,查看log:

root@colibri-imx6ull:~# dmesg | egrep "(sdhci|mmc)"
[    1.880782] sdhci: Secure Digital Host Controller Interface driver
[    1.890679] sdhci: Copyright(c) Pierre Ossman
[    1.898540] sdhci-pltfm: SDHCI platform and OF driver helper
[    1.909980] sdhci-esdhc-imx 2190000.usdhc: Got CD GPIO
[    1.984346] mmc0: SDHCI controller on 2190000.usdhc [2190000.usdhc] using ADMA

5.2.cat /proc/devcies

Block devices:
179 mmc

5.3./dev目录

brw-rw----    1 0        0         179,   0 Jan  1 00:00 mmcblk0
brw-rw----    1 0        0         179,   1 Jan  1 00:00 mmcblk0p1
brw-rw----    1 0        0         179,  10 Jan  1 00:00 mmcblk0p10
brw-rw----    1 0        0         179,  11 Jan  1 00:00 mmcblk0p11
brw-rw----    1 0        0         179,  12 Jan  1 00:00 mmcblk0p12
brw-rw----    1 0        0         179,  13 Jan  1 00:00 mmcblk0p13
brw-rw----    1 0        0         179,  14 Jan  1 00:00 mmcblk0p14
brw-rw----    1 0        0         179,  15 Jan  1 00:00 mmcblk0p15
brw-rw----    1 0        0         179,  16 Jan  1 00:00 mmcblk0p16
brw-rw----    1 0        0         179,  17 Jan  1 00:00 mmcblk0p17
brw-rw----    1 0        0         179,   2 Jan  1 00:00 mmcblk0p2
brw-rw----    1 0        0         179,   3 Jan  1 00:00 mmcblk0p3
brw-rw----    1 0        0         179,   4 Jan  1 00:00 mmcblk0p4
brw-rw----    1 0        0         179,   5 Jan  1 00:00 mmcblk0p5
brw-rw----    1 0        0         179,   6 Jan  1 00:00 mmcblk0p6
brw-rw----    1 0        0         179,   7 Jan  1 00:00 mmcblk0p7
brw-rw----    1 0        0         179,   8 Jan  1 00:00 mmcblk0p8
brw-rw----    1 0        0         179,   9 Jan  1 00:00 mmcblk0p9

  如上所示:mmcblk0 代表当前的sdcard,mmcblk0p1- mmcblk0p17代表sdcard的分区。

5.4./sys/block/

[root@xxx mmcblk0]# ls -l
total 0
-r--r--r--    1 0        0             4096 Jan  1 00:03 alignment_offset
lrwxrwxrwx    1 0        0                0 Jan  1 00:03 bdi -> ../../../../../../../virtual/bdi/179:0
-r--r--r--    1 0        0             4096 Jan  1 00:03 capability
-r--r--r--    1 0        0             4096 Jan  1 00:00 dev
lrwxrwxrwx    1 0        0                0 Jan  1 00:03 device -> ../../../mmc0:59b4
-r--r--r--    1 0        0             4096 Jan  1 00:03 discard_alignment
-r--r--r--    1 0        0             4096 Jan  1 00:03 ext_range
-rw-r--r--    1 0        0             4096 Jan  1 00:03 force_ro
drwxr-xr-x    2 0        0                0 Jan  1 00:03 holders
-r--r--r--    1 0        0             4096 Jan  1 00:03 inflight
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p1
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p10
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p11
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p12
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p13
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p14
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p15
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p16
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p17
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p2
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p3
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p4
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p5
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p6
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p7
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p8
drwxr-xr-x    4 0        0                0 Jan  1 00:00 mmcblk0p9
drwxr-xr-x    2 0        0                0 Jan  1 00:03 power
drwxr-xr-x    3 0        0                0 Jan  1 00:03 queue
-r--r--r--    1 0        0             4096 Jan  1 00:03 range
-r--r--r--    1 0        0             4096 Jan  1 00:03 removable
-r--r--r--    1 0        0             4096 Jan  1 00:03 ro
-r--r--r--    1 0        0             4096 Jan  1 00:03 size
drwxr-xr-x    2 0        0                0 Jan  1 00:03 slaves
-r--r--r--    1 0        0             4096 Jan  1 00:03 stat
lrwxrwxrwx    1 0        0                0 Jan  1 00:03 subsystem -> ../../../../../../../../class/block
-rw-r--r--    1 0        0             4096 Jan  1 00:03 uevent

//cd mmcblk0p3
[root@xxx mmcblk0p3]# ls -l
total 0
-r--r--r--    1 0        0             4096 Jan  1 00:05 alignment_offset
-r--r--r--    1 0        0             4096 Jan  1 00:00 dev
-r--r--r--    1 0        0             4096 Jan  1 00:05 discard_alignment
drwxr-xr-x    2 0        0                0 Jan  1 00:05 holders
...

5.5./sys/bus/mmc/devices/mmc:59b4

[root@xxx mmc0:59b4]# ls -l
total 0
drwxr-xr-x    3 0        0                0 Jan  1 00:00 block
-r--r--r--    1 0        0             4096 Jan  1 00:06 cid
-r--r--r--    1 0        0             4096 Jan  1 00:06 csd
-r--r--r--    1 0        0             4096 Jan  1 00:06 date
lrwxrwxrwx    1 0        0                0 Jan  1 00:06 driver -> ../../../../../../bus/mmc/drivers/mmcblk
...

5.6./sys/kernel/debug/mmc0/

[root@xxx mmc0]# ls -l
total 0
-rw-------    1 0        0                0 Jan  1 00:00 clock
-r--------    1 0        0                0 Jan  1 00:00 ios
drwxr-xr-x    2 0        0                0 Jan  1 00:00 mmc0:59b4

[root@xxx mmc0]# cat ios 
clock:          400000 Hz
vdd:            21 (3.3 ~ 3.4 V)
bus mode:       2 (push-pull)
chip select:    0 (don't care)
power mode:     2 (on)
bus width:      0 (1 bits)
timing spec:    0 (legacy)
signal voltage: 0 (3.30 V)
driver type:    0 (driver type B)

5.7.分区cat /proc/partitions

[root@iTOP-4412]# cat /proc/partitions 
major minor  #blocks  name

   1        0       8192 ram0
   1        1       8192 ram1
   1        2       8192 ram2
   1        3       8192 ram3
 179        0   15267840 mmcblk1
 179        1   12836864 mmcblk1p1
 179        2    1048576 mmcblk1p2
 179        3    1048576 mmcblk1p3
 179        4     307200 mmcblk1p4
 179       48       4096 mmcblk1rpmb
 179       32       4096 mmcblk1boot1
 179       16       4096 mmcblk1boot0
 179       64    3872256 mmcblk0
 179       65    2167086 mmcblk0p1
 179       66    1051396 mmcblk0p2
 179       67     310124 mmcblk0p3
 179       68     310124 mmcblk0p4

5.8.gpio65 cd(card-detection) irq

[root@xxx]#  cat /proc/interrupts | egrep "(mmc|cd)"
103:          0  megahunt_pio_edge  65 Edge      d4280000.sdhci cd
166:         39     GICv3  92 Level     mmc0

[root@xxx ]# cat /d/gpio | grep cd
 gpio-65  (                    |cd                  ) in  lo   

6.遇到问题

6.1.格式化sdcard 分区失败

#mkfs.ext4 /dev/mmcblk0p13
read-only file system while setting up superblock

#mount -t ext4 /dev/mmcblk0p13 /mnt/text

解决:在dtsi添加disable-wp;解除写保护即可。

drivers/mmc/core/host.c:
if(device_property_read_bool(dev, "disable-wp"))
	host->cap2 |= MMC_CAP2_NO_WRITE_PROTECT;

6.2.挂载ext4文件系统

CONFIG_LBDAF: Support for large (2TB+) block devices and files

  • This option also enables support for single files larger than 2TB.The ext4 filesystem requires that this feature be enabled in order to support filesystems that have the huge_file feature enabled. Otherwise, it will refuse to mount in the read-write mode any filesystems that use the huge_file feature, which is enabled by default by mke2fs.ext4.The GFS2 filesystem also requires this feature.

查看文件系统

  • cat /proc/filesystems

6.3.在加载sdcard驱动时,内核如何知道当前有几个分区?

  检测分区流程:
在这里插入图片描述
重点分析Check_partition:
在这里插入图片描述
核心部分是check_part,该结构体保存对应的解析分区的算法:
在这里插入图片描述
  项目中使用的是efi_partition,最后通过add_partition()将这些part信息添加到disk里去。从开机Log看到有多少分区(如下log是在add_partition打印出来的):
在这里插入图片描述
  通过平台上定义的partition.xml]文件中进行验证。

refer to

  • https://blog.csdn.net/kris_fei/article/details/77368338
发布了161 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41028621/article/details/103870102
今日推荐